[
  {
    "path": ".browserslistrc",
    "content": "last 2 versions\nFirefox ESR\nnot dead\nnot IE 11\nnot ios 10\n"
  },
  {
    "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.0.1/schema.json\",\n  \"changelog\": [\"@changesets/changelog-github\", { \"repo\": \"graphql/graphiql\" }],\n  \"commit\": false,\n  \"linked\": [],\n  \"access\": \"public\",\n  \"baseBranch\": \"main\",\n  \"ignore\": [\n    \"example-graphiql-vite\",\n    \"example-graphiql-vite-react-router\",\n    \"example-graphiql-webpack\",\n    \"example-monaco-graphql-nextjs\",\n    \"example-monaco-graphql-react-vite\",\n    \"example-monaco-graphql-webpack\"\n  ],\n  \"updateInternalDependencies\": \"patch\",\n  \"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH\": {\n    \"onlyUpdatePeerDependentsWhenOutOfRange\": true\n  }\n}\n"
  },
  {
    "path": ".codecov.yml",
    "content": "codecov:\n  notify:\n    require_ci_to_pass: yes\n\ncoverage:\n  precision: 2\n  round: down\n  range: '30...100'\n\n  status:\n    project:\n      default:\n        target: 50% # the minimum required coverage value\n        threshold: .1% # the leniency in hitting the target, allows 1% drop\n    patch:\n      default:\n        informational: true\n\ncomment: # this is a top-level key\n  layout: 'reach, diff, flags, files'\n  behavior: default\n  require_changes: true # if true: only post the comment if coverage changes\n"
  },
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with a newline ending every file\n[*]\nend_of_line = lf\ninsert_final_newline = true\n"
  },
  {
    "path": ".eslintignore",
    "content": ".changeset/*.md\n\n# ignore working-group dir markdown so it's easier for people to edit from the UI\nworking-group/\npackages/codemirror-graphql/src/__tests__/schema-kitchen-sink.graphql\nCHANGELOG.md\n**/CHANGELOG.md\npackages/vscode-graphql-syntax/tests/__fixtures__/\npackages/graphql-language-service-server/src/__tests__/parseDocument.test.ts\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "/**\n *  Copyright (c) Facebook, Inc.\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nconst RESTRICTED_IMPORTS = [\n  { name: 'graphql/type', message: 'use `graphql`' },\n  { name: 'graphql/language', message: 'use `graphql`' },\n  { name: 'graphql/type/introspection', message: 'use `graphql`' },\n  { name: 'graphql/type/definition', message: 'use `graphql`' },\n  { name: 'graphql/type/directives', message: 'use `graphql`' },\n  { name: 'graphql/version', message: 'use `graphql`' },\n  {\n    name: 'monaco-editor',\n    message:\n      '`monaco-editor` imports all languages; use `monaco-graphql/esm/monaco-editor` instead to import only `json` and `graphql` languages',\n    allowTypeImports: true,\n  },\n];\n\nmodule.exports = {\n  root: true,\n  reportUnusedDisableDirectives: true,\n  ignorePatterns: [\n    'react-app-env.d.ts',\n    'next-env.d.ts',\n    'changesets/**/*.md',\n    '**/CHANGELOG.md',\n    'functions/*',\n    'packages/vscode-graphql-syntax/tests/__fixtures__/*',\n    // symlinks\n    'packages/graphiql-react/__mocks__/monaco-editor.ts',\n    'packages/graphiql-plugin-doc-explorer/__mocks__/zustand.ts',\n    'packages/graphiql-plugin-doc-explorer/__mocks__/monaco-editor.ts',\n    'packages/graphiql-plugin-history/__mocks__/zustand.ts',\n    'packages/graphiql-plugin-history/__mocks__/monaco-editor.ts',\n  ],\n  overrides: [\n    {\n      // Rules for all code files\n      files: ['**/*.{js,jsx,ts,tsx,mts,cts}'],\n      parserOptions: {\n        ecmaVersion: 6,\n      },\n      settings: {\n        react: {\n          version: 'detect',\n        },\n      },\n      // https://github.com/sindresorhus/globals/blob/master/globals.json\n      env: {\n        atomtest: true,\n        es6: true,\n        node: true,\n        browser: true,\n      },\n      extends: [\n        'eslint:recommended',\n        'plugin:@typescript-eslint/recommended',\n        'plugin:import-x/recommended',\n        'plugin:import-x/typescript',\n        'plugin:react/recommended',\n        'plugin:react-hooks/recommended-legacy',\n        'plugin:react/jsx-runtime',\n        'prettier',\n      ],\n      plugins: ['promise', 'sonarjs', 'unicorn', '@shopify'],\n      globals: {\n        atom: false,\n        document: false,\n        window: false,\n        monaco: true,\n        Map: true,\n        Set: true,\n      },\n      rules: {\n        '@shopify/prefer-early-return': ['error', { maximumStatements: 2 }],\n        '@shopify/prefer-class-properties': 'off', // enable after https://github.com/Shopify/web-configs/issues/387 will be fixed\n        'sonarjs/no-inverted-boolean-check': 'error',\n        // Possible Errors (http://eslint.org/docs/rules/#possible-errors)\n        'no-console': 'error',\n        'no-constant-binary-expression': 'error',\n        'no-empty': ['error', { allowEmptyCatch: true }],\n        'no-extra-parens': 'off',\n        'no-template-curly-in-string': 'off',\n        'valid-jsdoc': 'off',\n\n        // Best Practices (http://eslint.org/docs/rules/#best-practices)\n        'accessor-pairs': 'error',\n        'array-callback-return': 'off',\n        'block-scoped-var': 'off',\n        'class-methods-use-this': 'off',\n        complexity: 'off',\n        'consistent-return': 'off',\n        curly: 'error',\n        'default-case': 'off',\n        'dot-notation': 'error',\n        eqeqeq: ['error', 'allow-null'],\n        'guard-for-in': 'off',\n        'no-alert': 'error',\n        'no-await-in-loop': 'error',\n        'no-caller': 'error',\n        'no-case-declarations': 'off',\n        'no-div-regex': 'error',\n        'no-else-return': ['error', { allowElseIf: false }],\n        'no-eq-null': 'off',\n        'no-eval': 'error',\n        'no-extend-native': 'error',\n        'no-extra-bind': 'error',\n        'no-extra-label': 'error',\n        'no-floating-decimal': 'off', // prettier --list-different\n        'no-implicit-coercion': 'error',\n        'no-implicit-globals': 'off',\n        'no-implied-eval': 'error',\n        'no-invalid-this': 'off',\n        'no-iterator': 'error',\n        'no-labels': 'error',\n        'no-lone-blocks': 'error',\n        'no-loop-func': 'off',\n        'no-magic-numbers': 'off',\n        'no-multi-str': 'off',\n        'no-new-func': 'error',\n        'no-new-wrappers': 'error',\n        'no-new': 'error',\n        'no-octal-escape': 'error',\n        'no-param-reassign': 'error',\n        'no-proto': 'error',\n        'no-restricted-properties': [\n          'error',\n          {\n            object: 'window',\n            property: 'localStorage',\n            message: 'Use `localStorage` instead',\n          },\n          {\n            object: 'window',\n            property: 'location',\n            message: 'Use `location` instead',\n          },\n          {\n            object: 'window',\n            property: 'navigator',\n            message: 'Use `navigator` instead',\n          },\n          {\n            object: 'window',\n            property: 'getComputedStyle',\n            message: 'Use `getComputedStyle` instead',\n          },\n          {\n            object: 'self',\n            message: 'Use `globalThis` instead',\n          },\n        ],\n        'no-return-assign': 'error',\n        'no-return-await': 'error',\n        'no-script-url': 'error',\n        'no-self-compare': 'error',\n        'no-sequences': 'error',\n        'no-throw-literal': 'error',\n        'no-unmodified-loop-condition': 'off',\n        'no-useless-call': 'error',\n        'no-useless-concat': 'error',\n        'no-useless-return': 'off',\n        'no-warning-comments': 'off',\n        radix: 'error',\n        'require-await': 'off',\n        'vars-on-top': 'off',\n        yoda: 'error',\n        'unicorn/prefer-string-slice': 'error',\n        'sonarjs/no-identical-functions': 'error',\n        'sonarjs/no-unused-collection': 'error',\n        'sonarjs/no-extra-arguments': 'error',\n        'unicorn/no-useless-undefined': 'error',\n        'no-var': 'error',\n        // Strict Mode (http://eslint.org/docs/rules/#strict-mode)\n        strict: 'off',\n\n        // Variables (http://eslint.org/docs/rules/#variables)\n        'init-declarations': 'off',\n        'no-catch-shadow': 'error',\n        'no-label-var': 'error',\n        'no-restricted-globals': ['error', 'stop'],\n        'no-shadow': 'off',\n        '@typescript-eslint/no-shadow': 'error',\n        'no-undef-init': 'off',\n        'no-undefined': 'off',\n\n        '@typescript-eslint/no-unused-vars': [\n          'error',\n          {\n            varsIgnorePattern: '^(React|_)', // allow underscores in destructuring\n            argsIgnorePattern: '^_',\n          },\n        ],\n\n        'no-use-before-define': 'off',\n\n        'unicorn/no-useless-switch-case': 'error',\n        // Node.js and CommonJS (http://eslint.org/docs/rules/#nodejs-and-commonjs)\n        'callback-return': 'off',\n        'global-require': 'off',\n        'handle-callback-err': 'error',\n        'no-mixed-requires': 'error',\n        'no-new-require': 'error',\n        'no-path-concat': 'error',\n        'no-process-env': 'off',\n        'no-process-exit': 'off',\n        'no-restricted-modules': 'off',\n        'no-sync': 'off',\n\n        // Stylistic Issues (http://eslint.org/docs/rules/#stylistic-issues)\n        camelcase: 'off',\n        'capitalized-comments': 'off',\n        'consistent-this': 'off',\n        'func-name-matching': 'off',\n        'func-names': 'off',\n        'func-style': 'off',\n        'id-blacklist': 'off',\n        'id-length': 'off',\n        'id-match': 'off',\n        indent: 'off',\n        'line-comment-position': 'off',\n        'linebreak-style': 'off', // prettier --list-different\n        'lines-around-comment': 'off',\n        'lines-around-directive': 'off',\n        'max-depth': 'off',\n        'max-lines': 'off',\n        'max-nested-callbacks': 'off',\n        'max-params': 'off',\n        'max-statements-per-line': 'off',\n        'max-statements': 'off',\n        'multiline-ternary': 'off',\n        'new-cap': 'off',\n        'newline-after-var': 'off',\n        'newline-before-return': 'off',\n        'newline-per-chained-call': 'off',\n        'no-bitwise': 'error',\n        'no-continue': 'off',\n        'no-inline-comments': 'off',\n        'no-mixed-operators': 'off',\n        'no-negated-condition': 'off',\n        'unicorn/no-negated-condition': 'error',\n        'no-nested-ternary': 'off',\n        'no-new-object': 'error',\n        'no-plusplus': 'off',\n        'no-restricted-syntax': [\n          'error',\n          {\n            // ❌ useMemo(…, [])\n            selector:\n              'CallExpression[callee.name=useMemo][arguments.1.type=ArrayExpression][arguments.1.elements.length=0]',\n            message:\n              \"`useMemo` with an empty dependency array can't provide a stable reference, use `useRef` instead.\",\n          },\n          {\n            // ❌ event.keyCode\n            selector:\n              'MemberExpression > .property[type=Identifier][name=keyCode]',\n            message: 'Use `.key` instead of `.keyCode`',\n          },\n        ],\n        'no-ternary': 'off',\n        'no-underscore-dangle': 'off',\n        'no-unneeded-ternary': 'off',\n        'object-curly-newline': 'off',\n        'object-property-newline': 'off',\n        'one-var-declaration-per-line': 'off',\n        'one-var': ['error', 'never'],\n        'operator-assignment': 'error',\n        'operator-linebreak': 'off',\n        'require-jsdoc': 'off',\n        'sort-keys': 'off',\n        'sort-vars': 'off',\n        'spaced-comment': ['error', 'always', { markers: ['/'] }],\n        'wrap-regex': 'off',\n        'unicorn/prefer-dom-node-remove': 'error',\n        // ECMAScript 6 (http://eslint.org/docs/rules/#ecmascript-6)\n        'arrow-body-style': 'off',\n        '@typescript-eslint/no-restricted-imports': [\n          'error',\n          ...RESTRICTED_IMPORTS,\n        ],\n        'no-useless-computed-key': 'error',\n        'no-useless-constructor': 'off',\n        'no-useless-rename': 'error',\n        'prefer-arrow-callback': ['error', { allowNamedFunctions: true }],\n        'object-shorthand': [\n          'error',\n          'always',\n          { avoidExplicitReturnArrows: true },\n        ],\n        'prefer-numeric-literals': 'off',\n        'prefer-template': 'off',\n        'sort-imports': 'off',\n        'symbol-description': 'error',\n\n        'sonarjs/no-ignored-return': 'error',\n        'unicorn/no-array-push-push': 'error',\n        'import-x/no-extraneous-dependencies': 'error',\n        'import-x/no-duplicates': 'error',\n        'import-x/no-named-as-default': 'error',\n        'prefer-object-spread': 'error',\n        // React rules\n        'react/no-unused-state': 'error',\n        'react/jsx-curly-brace-presence': 'error',\n        'react/jsx-boolean-value': 'error',\n        'react/jsx-handler-names': 'error',\n        'react/jsx-pascal-case': 'error',\n        'react/no-did-mount-set-state': 'error',\n        'react/no-did-update-set-state': 'error',\n        'react/prop-types': 'off',\n        'react/prefer-es6-class': 'error',\n        'react/prefer-stateless-function': 'error',\n        'react/self-closing-comp': 'error',\n        'react/jsx-no-useless-fragment': 'error',\n        'react/jsx-filename-extension': [\n          'error',\n          { extensions: ['.tsx', '.jsx'], allow: 'as-needed' },\n        ],\n\n        'unicorn/no-typeof-undefined': 'error',\n        'unicorn/prefer-at': 'error',\n        'unicorn/consistent-destructuring': 'error',\n        'prefer-destructuring': [\n          'error',\n          { VariableDeclarator: { object: true } },\n        ],\n        'promise/no-multiple-resolved': 'error',\n        'unicorn/no-zero-fractions': 'error',\n        'sonarjs/no-redundant-jump': 'error',\n        'unicorn/prefer-logical-operator-over-ternary': 'error',\n        'logical-assignment-operators': [\n          'error',\n          'always',\n          { enforceForIfStatements: true },\n        ],\n        'unicorn/prefer-regexp-test': 'error',\n        'unicorn/prefer-export-from': ['error', { ignoreUsedVariables: true }],\n        'unicorn/throw-new-error': 'error',\n        'unicorn/prefer-includes': 'error',\n        'unicorn/no-array-for-each': 'error',\n        'unicorn/prefer-dom-node-append': 'error',\n        'no-lonely-if': 'error',\n        'unicorn/no-lonely-if': 'error',\n        'unicorn/prefer-optional-catch-binding': 'error',\n        'unicorn/prefer-array-flat-map': 'error',\n        'no-unused-expressions': 'off',\n        '@typescript-eslint/no-unused-expressions': 'error',\n        'sonarjs/no-small-switch': 'error',\n        'sonarjs/no-duplicated-branches': 'error',\n        'sonarjs/prefer-promise-shorthand': 'error',\n        'sonarjs/no-dead-store': 'error',\n        'sonarjs/void-use': 'error',\n        'unicorn/prefer-node-protocol': 'error',\n        'import-x/no-unresolved': [\n          'error',\n          {\n            ignore: [\n              '^node:',\n              '\\\\.svg\\\\?react$',\n              'vitest/config',\n              './vite.config.mjs',\n            ],\n          },\n        ],\n        'no-extra-boolean-cast': [\n          'error',\n          { enforceForInnerExpressions: true },\n        ],\n        'unicorn/no-length-as-slice-end': 'error',\n        'unicorn/prefer-string-replace-all': 'error',\n        'unicorn/prefer-array-some': 'error',\n        // '@typescript-eslint/prefer-for-of': 'error', TODO\n        'unicorn/no-hex-escape': 'off', // TODO: enable\n        // doesn't catch a lot of cases; we use ESLint builtin `no-restricted-syntax` to forbid `.keyCode`\n        'unicorn/prefer-keyboard-event-key': 'off',\n\n        'unicorn/prefer-switch': 'error',\n        'unicorn/prefer-dom-node-text-content': 'error',\n        quotes: ['error', 'single', { avoidEscape: true }], // Matches Prettier, but also replaces backticks with single quotes\n        // TODO: Fix all errors for the following rules included in recommended config\n        '@typescript-eslint/no-require-imports': 'off',\n        'import-x/no-named-as-default-member': 'off',\n      },\n    },\n    {\n      files: ['packages/{monaco-graphql,graphiql*}/**/*.{ts,tsx,mts,cts}'],\n      excludedFiles: ['packages/graphiql-toolkit/**/*.{ts,tsx}'],\n      rules: {\n        '@typescript-eslint/no-unnecessary-condition': 'error',\n      },\n    },\n    {\n      // Rules that requires type information\n      files: ['**/*.{ts,tsx,mts,cts}'],\n      excludedFiles: ['**/*.{md,mdx}/*.{ts,tsx}'],\n      // extends: ['plugin:@typescript-eslint/recommended-type-checked'],\n      rules: {\n        // '@typescript-eslint/no-redundant-type-constituents': 'error',\n        '@typescript-eslint/prefer-optional-chain': 'error',\n        '@typescript-eslint/no-unnecessary-type-assertion': 'error',\n        '@typescript-eslint/no-floating-promises': 'error',\n        '@typescript-eslint/non-nullable-type-assertion-style': 'error',\n        '@typescript-eslint/consistent-type-assertions': 'error',\n        '@typescript-eslint/no-duplicate-type-constituents': 'error',\n        '@typescript-eslint/no-unnecessary-type-conversion': 'error',\n        // '@typescript-eslint/await-thenable': 'error', // TODO\n        // TODO: Fix all errors for the following rules included in recommended config\n        '@typescript-eslint/no-deprecated': 'off',\n        '@typescript-eslint/no-unsafe-function-type': 'off',\n\n        '@typescript-eslint/no-explicit-any': 'off',\n        '@typescript-eslint/no-non-null-assertion': 'off',\n        '@typescript-eslint/ban-ts-comment': 'off',\n        '@typescript-eslint/ban-types': 'off',\n        '@typescript-eslint/no-empty-function': 'off',\n        '@typescript-eslint/triple-slash-reference': 'off',\n        '@typescript-eslint/no-namespace': 'off',\n      },\n      parserOptions: {\n        projectService: {\n          allowDefaultProject: [\n            'examples/monaco-graphql-react-vite/vite.config.ts',\n            'packages/{codemirror-graphql,graphiql-toolkit,graphql-language-service-cli,graphql-language-service,monaco-graphql,vscode-graphql-syntax}/vitest.config.mts',\n\n            'packages/cm6-graphql/__tests__/test.spec.ts',\n            'packages/graphiql/cypress.config.ts',\n            'packages/vscode-graphql-syntax/tests/*.spec.ts',\n            'packages/graphql-language-service-cli/src/__tests__/*.test.ts',\n            'packages/monaco-graphql/test/monaco-editor.test.ts',\n\n            'packages/codemirror-graphql/setup-files.ts',\n            'packages/codemirror-graphql/src/__tests__/testSchema.ts',\n            'packages/codemirror-graphql/src/__tests__/*.test.ts',\n            'packages/codemirror-graphql/src/{variables,utils,results}/__tests__/*.test.ts',\n\n            'packages/graphql-language-service/benchmark/index.ts',\n            'packages/graphql-language-service/src/{utils,parser,interface}/__tests__/*.test.ts',\n            'packages/graphql-language-service/src/parser/__tests__/OnlineParserUtils.ts',\n\n            'packages/graphql-language-service-server/src/__tests__/*.{spec,test}.ts',\n            'packages/graphql-language-service-server/src/__tests__/__utils__/utils.ts',\n            'packages/graphql-language-service-server/src/__tests__/__utils__/MockProject.ts',\n\n            'packages/vscode-graphql-syntax/tests/__utilities__/serializer.ts',\n            'packages/vscode-graphql-syntax/tests/__utilities__/utilities.ts',\n          ],\n          maximumDefaultProjectFileMatchCount_THIS_WILL_SLOW_DOWN_LINTING: 100,\n        },\n      },\n    },\n    // Cypress plugin, global, etc., only for cypress directory\n    // https://github.com/cypress-io/eslint-plugin-cypress\n    // cypress clashes with jest expect()\n    {\n      files: ['**/cypress/**'],\n      extends: 'plugin:cypress/recommended',\n      rules: {\n        // Because innerText doesn't return hidden elements and returns new line (\\n) characters\n        'unicorn/prefer-dom-node-text-content': 'off',\n      },\n    },\n    {\n      // Rules for unit tests\n      files: [\n        '**/__{tests,mocks}__/*.{js,jsx,ts,tsx}',\n        '**/*.spec.{ts,js.jsx.tsx}',\n      ],\n      extends: ['plugin:jest/recommended'],\n      rules: {\n        'jest/no-conditional-expect': 'off',\n        'jest/expect-expect': ['error', { assertFunctionNames: ['expect*'] }],\n      },\n    },\n    {\n      // Resources are typically our helper scripts; make life easier there\n      files: ['resources/**', '**/resources/**', 'scripts/**'],\n      rules: {\n        'no-console': 'off',\n      },\n    },\n    {\n      // Disable rules for examples folder\n      files: ['examples/**'],\n      rules: {\n        'no-console': 'off',\n        'no-new': 'off',\n        'no-alert': 'off',\n        'import-x/no-unresolved': 'off',\n      },\n    },\n    {\n      // Rule for ignoring imported dependencies from tests files\n      files: [\n        '**/__tests__/**',\n        'webpack.config.js',\n        '**/tests/**',\n        'test.config.js',\n        'vitest.config.mts',\n        'setup-files.ts',\n      ],\n      rules: {\n        'import-x/no-extraneous-dependencies': 'off',\n      },\n    },\n    {\n      // Rule for allowing import `vscode` package\n      files: [\n        'packages/vscode-graphql/**',\n        'packages/vscode-graphql-execution/**',\n      ],\n      rules: {\n        'import-x/no-unresolved': ['error', { ignore: ['^node:', 'vscode'] }],\n      },\n    },\n    {\n      // Rule to prefer await to then without React packages because it's ugly to have `async IIFE` inside `useEffect`\n      files: ['packages/**'],\n      excludedFiles: ['packages/graphiql/**', 'packages/graphiql-react/**'],\n      rules: {\n        'promise/prefer-await-to-then': 'error',\n      },\n    },\n    {\n      files: ['packages/{graphiql-react,graphiql}/**/*.{ts,tsx}'],\n      rules: {\n        '@typescript-eslint/no-restricted-imports': [\n          'error',\n          ...RESTRICTED_IMPORTS,\n          {\n            name: 'react',\n            importNames: ['memo', 'useCallback', 'useMemo'],\n          },\n        ],\n        'react-hooks/react-compiler': 'error',\n        '@typescript-eslint/no-deprecated': 'error',\n      },\n    },\n    {\n      // Monaco-GraphQL rules\n      files: ['packages/monaco-graphql/**'],\n      rules: {\n        '@typescript-eslint/no-restricted-imports': [\n          'error',\n          ...RESTRICTED_IMPORTS.filter(({ name }) => name !== 'monaco-editor'),\n          {\n            name: 'monaco-editor',\n            message:\n              '`monaco-editor` imports all languages; use locale `monaco-editor.ts` instead to import only `json` and `graphql` languages',\n          },\n        ],\n      },\n    },\n    {\n      // Parsing Markdown/MDX\n      files: ['**/*.{md,mdx}'],\n      parser: 'eslint-mdx',\n      plugins: ['mdx'],\n      processor: 'mdx/remark',\n      settings: {\n        'mdx/code-blocks': true,\n      },\n    },\n    {\n      files: ['**/*.d.ts'],\n      rules: {\n        'no-var': 'off',\n      },\n    },\n    {\n      // ❗ALWAYS LAST\n      // Rules for codeblocks inside Markdown/MDX\n      files: ['**/*.{md,mdx}/*.{js,jsx,ts,tsx}'],\n      rules: {\n        'import-x/no-extraneous-dependencies': 'off',\n        '@typescript-eslint/no-unused-vars': 'off',\n        'import-x/no-unresolved': 'off',\n        'no-console': 'off',\n        'no-undef': 'off',\n        'react/jsx-no-undef': 'off',\n        'react-hooks/rules-of-hooks': 'off',\n        'sonarjs/no-dead-store': 'off',\n        '@typescript-eslint/no-restricted-imports': 'off',\n        '@typescript-eslint/no-unnecessary-condition': 'off',\n        '@typescript-eslint/no-deprecated': 'off',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n*.js text eol=lf\n*.jsx text eol=lf\n*.ts text eol=lf\n*.tsx text eol=lf\n*.json text eol=lf\n*.md text eol=lf\n*.html text eol=lf\n*.css text eol=lf\n*.sh text eol=lf\n*.yml text eol=lf\n\n.yarn/releases/*.cjs export-ignore binary linguist-generated\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\ncontact_links:\n  - name: '📚 Support/Q&A'\n    url: https://github.com/graphql/graphiql/discussions/categories/q-a-support\n    about: >-\n      Some questions are already answered in our github discussions Q&A section If you don't find an answer, [create a support ticket](ttps://github.com/graphql/graphiql/discussions/new?category=q-a-support)\n\n\n  - name: '💬 `graphiql` Discord Support'\n    url: https://discord.gg/NP5vbPeUFp\n    about: '`graphiql` Discord Support Channel'\n\n  - name: '💬 `vscode-graphql` Discord Support'\n    url: https://discord.gg/bHrQtxGNzQ\n    about: '`vscode-graphql` Discord Support Channel'\n\n  - name: '💬 GraphQL LSP & CLI Discord Support'\n    url: https://discord.gg/wkQCKwazxj\n    about: >-\n      GraphQL LSP (Language Server Protocol) Server Discord Support Channel  For `graphql-language-service-server` and/or `graphql-language-service-cli`\n\n\n  - name: '💬 `monaco-graphql` Discord Support'\n    url: https://discord.gg/r4BxrAG6fN\n    about: '`monaco-graphql` Discord Support Channel'\n\n  - name: '💬 `codedemirror-graphql` Discord Support'\n    url: https://discord.gg/cffZwk8NJW\n    about: '`codemirror-graphql` Discord Support Channel'\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/graphiql-bug.yml",
    "content": "name: GraphiQL 🐞 Bug\ndescription: File a bug with the graphiql web editor\ntitle: '[graphiql] <title>'\nlabels: [bug, needs triage, graphiql]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Is there an existing issue for this?\n      description: Please search to see if an issue already exists for the bug you encountered.\n      options:\n        - label: I have searched the existing issues\n          required: true\n  - type: textarea\n    attributes:\n      label: Current Behavior\n      description: A concise description of what you're experiencing.\n    validations:\n      required: false\n  - type: textarea\n    attributes:\n      label: Expected Behavior\n      description: A concise description of what you expected to happen.\n    validations:\n      required: false\n  - type: textarea\n    attributes:\n      label: Steps To Reproduce\n      description: Steps to reproduce the behavior.\n      placeholder: |\n        1. In this environment...\n        2. With this config...\n        3. Do '...' in [repro codesandbox/stackblitz]()\n        4. See error...\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Environment\n      description: |\n        examples:\n          * **GraphiQL Version**: latest\n          * **OS**: Ubuntu 20.04\n          * **Browser**: Chrome 106\n          * **Bundler**: vite x.y\n          * **`react` Version**: 18\n          * **`graphql` Version**: 16\n      value: |\n        * GraphiQL Version:\n        * OS:\n        * Browser:\n        * Bundler:\n        * `react` Version:\n        * `graphql` Version:\n    validations:\n      required: false\n  - type: textarea\n    attributes:\n      label: Anything else?\n      description: |\n        Links? References? Anything that will give us more context about the issue you are encountering!\n\n        Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/graphiql-feature.md",
    "content": "---\nname: GraphiQL Feature Request\nabout: Request a feature for the graphiql web editor\ntitle: '[graphiql] <title>'\nlabels: [graphiql, enhancement]\n---\n\n<!--\n\n- Some features can be built with the new sidebar plugins\n\n  We encourage exploring the plugin API prior to opening a feature request:\n\n    SDK hooks\n\n    https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html\n\n    Sidebar Plugins\n\n    api:\n    https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html#graphiqlplugin-2\n\n    examples:\n\n    https://github.com/graphql/graphiql/tree/main/packages/graphiql-plugin-explorer\n\n\n  In the event that the plugin API doesn't allow you to build a feature, it\n  may be that expanding the plugin API *itself* is the best place for the\n  feature to be introduced!\n\n  Consider this flexible solution when opening a  new feature request\n  since it also unlocks new opportunities.\n\n- Prior to opening a feature request, please search for existing requests.\n\n  If you find an existing feature that matches your needs, use the 👍 emote\n  to show your support for it. If the specifics of your use case are not\n  covered in the existing feature request but the idea seems similar enough,\n  please take the time to *add new conversation* which helps the feature's\n  design evolve.\n\n- If you do not find any other existing requests for the feature you desire,\n  you should open a new feature request. Please take the time to help us\n  understand your use-case as precisely as possible. Be sure to demonstrate\n  that you've evaluated existing features and found them unsuitable and were\n  unable to implement the functionality with the plugin API.\n\n  Be flexible in your design and consider slight variations which might\n  necessitate a specific API design.  We also hope you'll be willing to engage\n  in the on-going design discussion prior to opening a pull-request.\nborrowed from the apollo server template\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/language-server-bug.yml",
    "content": "name: Generic IDE (LSP Server) Bug 🐞\ndescription: File any non syntax highlighting related bugs in vscode or any IDE lsp runtime (vim, intellij, emacs, sublime, etc), with the `graphql-language-service-server` / `graphql-lsp` CLI\ntitle: '[lsp-server] 🐞 <title>'\nlabels: [bug, lsp-server]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Is there an existing issue for this?\n      description: Please search to see if an issue already exists for the bug you encountered.\n      options:\n        - label: I have searched the existing issues\n          required: true\n\n  - type: textarea\n    attributes:\n      label: Current Behavior\n      description: A concise description of the issue you're experiencing.\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Expected Behavior\n      description: A concise description of what you expected to happen.\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Steps To Reproduce\n      description: Steps to reproduce the behavior.\n      placeholder: |\n        1. In this environment...\n        2. With this (redacted) graphql config with [filename]...\n        3. Do '...' with [lsp client] \n        4. See errors in output channel, etc...\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Environment\n      description: |\n        examples:\n          * **LSP Server Version**: latest\n          * **OS**: Ubuntu 20.04\n          * **LSP Client**: vscode (`vscode-graphql`, etc), intellij-lsp, nvim coc, etc\n      value: |\n        * LSP Server Version:\n        * OS:\n        * LSP Client:\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Anything else?\n      description: |\n        Links? References? Anything that will give us more context about the issue you are encountering\n\n        Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/language-server-feature.md",
    "content": "---\nname: LSP/CLI Feature Request\nabout: Request a feature for the `graphql-language-service-server` and/or cli\ntitle: '[lsp-server] <title>'\nlabels: [lsp-server, enhancement]\n---\n\n<!--\n\n## Current Behavior (if applicable)\n\n\n## Desired Behavior\n\n\nHelpful things to include:\n\n-  screenshots & videos where applicable\n\n-  graphql config sample if related to the problem you are hoping to solve\n\n-  examples of other graphql language tools that support this, if applicable\n\n-  if the feature involves adding support for a feature already in the current spec or proposed working group spec, please include a link to the applicable section of the spec\n\n## PRs welcome!\n\nIf you find a way to solve this problem by modifying the code in either the source or the distributed code, we are more than happy to accept enhancement requests as PRs!\n\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!--\n1. Have you tried searching issues and discussions to see if your question was already answered?\n\n2. If you want to fix a bug or request a feature, PRs are always welcome!\n\n-->\n"
  },
  {
    "path": ".github/workflows/main-test.yml",
    "content": "name: Main Tests\n# report coverage on main for codecov baseline\non:\n  push:\n    branches: [main]\njobs:\n  install:\n    name: Install\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Cancel Previous Runs\n        uses: styfle/cancel-workflow-action@0.12.1\n        with:\n          access_token: ${{ github.token }}\n      - name: Checkout Code\n        uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          cache: yarn\n      - name: Cache node modules\n        id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cache/Cypress\n          key: cypress-${{ runner.os }}-${{ hashFiles('yarn.lock') }}\n      - run: yarn install --frozen-lockfile --immutable\n\n  jest:\n    name: Jest Unit Tests\n    runs-on: ubuntu-latest\n    needs: [install]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - run: yarn test --coverage\n      - uses: codecov/codecov-action@v4\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          files: coverage/lcov.info\n          fail_ci_if_error: true\n          verbose: true\n"
  },
  {
    "path": ".github/workflows/pr-graphql-compat-check.yml",
    "content": "name: Build & Test PR w/ GraphQL Regressions\non:\n  push:\n    # only on merge to main.\n    # it's rare that this workflow would\n    # show us an error, but when it does it's important!\n    branches: [main]\n    # don't run this regression suite if we don't need to\n    paths-ignore:\n      - '**.md'\n      - 'examples'\n      - '!examples/monaco-graphql-webpack'\n\n# TODO: test matrix?\n\npermissions:\n  contents: read # to fetch code (actions/checkout)\n\njobs:\n  build:\n    name: Build & Test\n    runs-on: ubuntu-20.04\n    strategy:\n      matrix:\n        release:\n          # test against the latest 16.x version, which might be newer than what we have\n          - '^16'\n          # test against the oldest version we support\n          - '^16.0.0'\n          # test against the latest alpha\n          - '^17.0.0-alpha'\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          cache: yarn\n      - name: Cache node modules\n        uses: actions/cache@v4\n        with:\n          path: node_modules\n          key: node_modules-${{hashFiles('yarn.lock')}}\n          restore-keys: node_modules-\n      - name: Force GraphQL ${{ matrix.release }} solution\n        run: yarn repo:resolve graphql@${{ matrix.release }}\n\n      - run: yarn install --frozen-lockfile --immutable\n\n      - name: Unit Tests\n        run: yarn test:ci\n\n      - name: Cypress\n        run: yarn e2e\n"
  },
  {
    "path": ".github/workflows/pr.yml",
    "content": "name: PR\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  install:\n    name: Install\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Cancel Previous Runs\n        uses: styfle/cancel-workflow-action@0.12.1\n        with:\n          access_token: ${{ github.token }}\n      - name: Checkout Code\n        uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          cache: yarn\n      - name: Cache node modules\n        id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cache/Cypress\n          key: cypress-${{ runner.os }}-${{ hashFiles('yarn.lock') }}\n      - run: yarn install --frozen-lockfile --immutable\n\n  build:\n    name: Build\n    runs-on: ubuntu-latest\n    needs: [install]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n\n      - run: yarn build\n      - uses: actions/cache@v4\n        with:\n          key: build-${{ github.sha }}\n          path: ${{ env.BUILD-CACHE-LIST }}\n\n  cspell:\n    name: CSpell\n    runs-on: ubuntu-latest\n    needs: [install]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - run: yarn lint-cspell\n\n  prettier:\n    name: Prettier\n    runs-on: ubuntu-latest\n    needs: [install]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - run: yarn pretty-check\n\n  jest:\n    name: Jest Unit & Integration Tests\n    runs-on: ubuntu-latest\n    needs: [install]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - run: yarn test --coverage\n      - uses: codecov/codecov-action@v4\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          files: coverage/lcov.info\n          fail_ci_if_error: true\n          verbose: true\n\n  vitest:\n    name: Vitest Unit Tests\n    runs-on: ubuntu-latest\n    needs: [build]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          key: build-${{ github.sha }}\n          path: ${{ env.BUILD-CACHE-LIST }}\n      - run: yarn vitest\n\n  eslint:\n    name: ESLint\n    runs-on: ubuntu-latest\n    needs: [build]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          key: build-${{ github.sha }}\n          path: ${{ env.BUILD-CACHE-LIST }}\n      - run: yarn eslint\n\n  types-check:\n    name: Types Check\n    runs-on: ubuntu-latest\n    needs: [build]\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          key: build-${{ github.sha }}\n          path: ${{ env.BUILD-CACHE-LIST }}\n      - run: yarn types:check\n\n  e2e:\n    name: Cypress\n    runs-on: ubuntu-latest\n    needs: [build]\n    steps:\n      - uses: actions/checkout@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          key: build-${{ github.sha }}\n          path: ${{ env.BUILD-CACHE-LIST }}\n      - uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cache/Cypress\n          key: cypress-${{ runner.os }}-${{ hashFiles('yarn.lock') }}\n      - name: Cypress run\n        uses: cypress-io/github-action@v6\n        with:\n          install: false\n          command: yarn e2e\n      - uses: actions/upload-artifact@v4\n        if: failure()\n        with:\n          name: cypress-screenshots\n          path: packages/graphiql/cypress/screenshots\n          if-no-files-found: ignore\n      - uses: actions/upload-artifact@v4\n        if: failure()\n        with:\n          name: cypress-videos\n          path: packages/graphiql/cypress/videos\n          if-no-files-found: ignore\n\n  canary:\n    name: Canary\n    runs-on: ubuntu-latest\n    # ensure the basic checks pass before running the canary\n    needs: [build, jest, eslint, vitest, e2e]\n    if: github.event.pull_request.head.repo.full_name == github.repository\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - uses: actions/cache@v4\n        with:\n          key: build-${{ github.sha }}\n          path: ${{ env.BUILD-CACHE-LIST }}\n      - name: Setup NPM credentials\n        run: echo \"//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN\" >> ~/.npmrc\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n      - name: Release Canary\n        id: canary\n        uses: 'kamilkisiela/release-canary@master'\n        with:\n          npm-token: ${{ secrets.NPM_TOKEN }}\n          npm-script: 'yarn release:canary'\n          changesets: true\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      - name: Publish a message\n        if: steps.canary.outputs.released == 'true'\n        uses: 'dotansimha/pr-comment@master'\n        with:\n          commentKey: canary\n          message: |\n            The latest changes of this PR are available as canary in npm (based on the declared `changesets`):\n\n            ```\n            ${{ steps.canary.outputs.changesetsPublishedPackages}}\n            ```\n          bot-token: ${{ secrets.GITHUB_TOKEN }}\n          bot: 'github-actions[bot]'\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Publish an empty message\n        if: steps.canary.outputs.released == 'false'\n        uses: 'dotansimha/pr-comment@master'\n        with:\n          commentKey: canary\n          message: |\n            The latest changes of this PR are not available as canary, since there are no linked `changesets` for this PR.\n          bot-token: ${{ secrets.GITHUB_TOKEN }}\n          bot: 'github-actions[bot]'\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n\n  license-check:\n    name: Check Licenses\n    runs-on: ubuntu-latest\n    needs: [install]\n\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - id: cache-modules\n        uses: actions/cache@v4\n        with:\n          path: |\n            **/node_modules\n          key: modules-${{ github.sha }}\n      - run: yarn install --frozen-lockfile --immutable\n      - name: License Check\n        run: yarn license-check\n\nenv:\n  BUILD-CACHE-LIST: |\n    packages/**/dist/**/*\n    packages/**/cjs/**/*\n    packages/**/esm/**/*\n    packages/**/types/**/*\n    packages/codemirror-graphql/*.js*\n    packages/codemirror-graphql/*.d.ts\n    packages/codemirror-graphql/cm6-legacy/**/*\n    packages/codemirror-graphql/results/**/*\n    packages/codemirror-graphql/variables/**/*\n    packages/codemirror-graphql/utils/**/*\n    !**/node_modules\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    branches: [main, graphiql-5]\npermissions: {}\njobs:\n  release:\n    permissions:\n      contents: write # for changesets/action to git push\n    environment: deploy\n    name: Release\n    runs-on: ubuntu-latest\n    steps:\n      - name: Cancel Previous Runs\n        uses: styfle/cancel-workflow-action@0.12.1\n        with:\n          access_token: ${{ github.token }}\n      - name: Checkout Code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: actions/setup-node@v4\n        with:\n          cache: yarn\n      - name: Cache node modules\n        uses: actions/cache@v4\n        id: cache-modules\n        with:\n          path: node_modules\n          key: node_modules-${{hashFiles('yarn.lock')}}\n          restore-keys: node_modules-\n      - run: yarn install --frozen-lockfile --immutable\n      - name: Create Release Pull Request or Publish to npm\n        id: changesets\n        uses: changesets/action@v1\n        with:\n          version: yarn ci:version\n          # This expects you to have a script called release which does a build for your packages and calls changeset publish\n          publish: yarn release\n        env:\n          # only use GH token here, because GITHUB_TOKEN is no longer allowed to create PRs\n          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n          # for vscode marketplace, see https://github.com/microsoft/vscode-vsce/blob/194d59b975523696362ead891dc0f3ddd277b3bd/README.md#linux\n          VSCE_PAT: ${{ secrets.VSCE_PAT }}\n          # for ovsx, see https://github.com/eclipse/openvsx/blob/master/cli/README.md#publish-extensions\n          OVSX_PAT: ${{ secrets.OPEN_VSX_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*.swp\n*~\n.*.haste_cache.*\n.DS_Store\n.secrets\n*.log\n\n.yarn/*\n!.yarn/releases/*\n!.yarn/plugins/*\n\nnode_modules/\ncoverage/\n.nyc_output\ndist/\nesm/\nout/\n*.vsix\n*.tsbuildinfo\n\nyarn-1.18.0.js\n*.orig\n.idea/\n\n# Local Netlify folder\n.netlify/\n\nexamples/*/yarn.lock\npackage-lock.json\n.eslintcache\n.cspellcache\n\nvite.config.d.ts\nvite.config.js\ntsconfig.vitest-temp.json\n\n.next/\n.turbo/\ntypes/\npackages/codemirror-graphql/cm6-legacy/\npackages/codemirror-graphql/results/\npackages/codemirror-graphql/utils/\npackages/codemirror-graphql/variables/\npackages/codemirror-graphql/*.js\npackages/codemirror-graphql/*.d.ts\npackages/codemirror-graphql/*.map\n!packages/codemirror-graphql/*.config.js\n\npackages/graphiql/cypress/screenshots/\npackages/graphiql/cypress/downloads/\npackages/graphiql/cypress/videos/\npackages/graphiql/typedoc/\npackages/graphiql/webpack/\n\n.react-router/\n"
  },
  {
    "path": ".mailmap",
    "content": "Angel Gomez Salazar <agomezs@fb.com>\nAngel Gomez Salazar <agomezs@fb.com> Angel Gomez <AGS-@users.noreply.github.com>\nAngel Gomez Salazar <agomezs@fb.com> angel.gomez <angelegomezsd@gmail.com>\nHyohyeon Jeong <asiandrummer@fb.com> Hyo Jeong <asiandrummer@users.noreply.github.com>\n"
  },
  {
    "path": ".npmignore",
    "content": ".*\n*.swp\n*~\n*.iml\n.*.haste_cache.*\n.DS_Store\n.idea\nnpm-debug.log\n\n.babelrc\nCONTRIBUTING.md\nnode_modules\ncoverage\nresources\nsrc\npackages\npackages/graphiql/*.html\ncypress.json\nbabel.config.js\n**/*.tsbuildinfo\n"
  },
  {
    "path": ".npmrc",
    "content": "engine-strict=true\naccess=public\n"
  },
  {
    "path": ".nvmrc",
    "content": "20\n"
  },
  {
    "path": ".prettierignore",
    "content": "# removing this will break tests b/c of whitespace changes + format on save/commit, etc\npackages/graphql-language-service-server/src/__tests__/parseDocument.test.ts\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"all\",\n  \"arrowParens\": \"avoid\",\n  \"proseWrap\": \"never\",\n  \"overrides\": [\n    {\n      \"files\": [\"*.md\", \"*.mdx\"],\n      \"options\": {\n        \"printWidth\": 80,\n        \"proseWrap\": \"preserve\"\n      }\n    },\n    {\n      \"files\": \"*.svg\",\n      \"options\": {\n        \"parser\": \"html\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\"dbaeumer.vscode-eslint\", \"esbenp.prettier-vscode\"]\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "// A launch configuration that compiles the extension and then opens it inside a new window\n// Use IntelliSense to learn about possible attributes.\n// Hover to view descriptions of existing attributes.\n// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"VS Code LSP Extension: Run\",\n      \"type\": \"extensionHost\",\n      \"request\": \"launch\",\n      \"runtimeExecutable\": \"${execPath}\",\n      \"args\": [\n        \"--extensionDevelopmentPath=${workspaceFolder}/packages/vscode-graphql\"\n      ],\n      \"outFiles\": [\n        \"${workspaceFolder}/packages/vscode-graphql/out/extension.js\"\n      ],\n      \"sourceMaps\": true,\n      \"preLaunchTask\": \"watch-vscode\"\n    },\n    {\n      \"type\": \"node\",\n      \"name\": \"jest watch\",\n      \"request\": \"launch\",\n      \"program\": \"${workspaceFolder}/node_modules/jest/bin/jest\",\n      \"args\": [\n        \"--config\",\n        \"jest.config.js\",\n        \"--color\",\n        \"--runInBand\",\n        \"--watch\",\n        \"${relativeFile}\"\n      ],\n      \"cwd\": \"${workspaceFolder}\",\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\"\n    },\n    {\n      \"name\": \"VS Code Exec Extension: Run\",\n      \"type\": \"extensionHost\",\n      \"request\": \"launch\",\n      \"runtimeExecutable\": \"${execPath}\",\n      \"args\": [\n        \"--extensionDevelopmentPath=${workspaceFolder}/packages/vscode-graphql-execution\"\n      ],\n      \"outFiles\": [\n        \"${workspaceFolder}/packages/vscode-graphql-execution/out/extension.js\"\n      ],\n      \"sourceMaps\": true,\n      \"preLaunchTask\": \"watch-vscode-exec\"\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"npm.packageManager\": \"yarn\",\n  \"editor.formatOnSave\": true,\n  \"files.insertFinalNewline\": true,\n  \"editor.trimAutoWhitespace\": false,\n  \"coverage-gutters.showLineCoverage\": true,\n  \"coverage-gutters.coverageBaseDir\": \"coverage\",\n  \"coverage-gutters.coverageFileNames\": [\n    \"lcov.info\",\n    \"cov.xml\",\n    \"coverage.xml\",\n    \"jacoco.xml\",\n    \"coverage.cobertura.xml\"\n  ],\n  \"typescript.tsdk\": \"node_modules/typescript/lib\"\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"watch-vscode\",\n      \"type\": \"npm\",\n      \"script\": \"watch-vscode\",\n      \"problemMatcher\": [\"$tsc-watch\"],\n      \"isBackground\": true,\n      \"presentation\": {\n        \"reveal\": \"always\"\n      },\n      \"group\": {\n        \"kind\": \"build\",\n        \"isDefault\": true\n      }\n    },\n    {\n      \"label\": \"watch-vscode-exec\",\n      \"type\": \"npm\",\n      \"script\": \"watch-vscode-exec\",\n      \"problemMatcher\": [\"$tsc-watch\"],\n      \"isBackground\": true,\n      \"presentation\": {\n        \"reveal\": \"always\"\n      },\n      \"group\": {\n        \"kind\": \"build\",\n        \"isDefault\": true\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".yarnrc.yml",
    "content": "compressionLevel: 0\n\nenableGlobalCache: false\n\nnodeLinker: node-modules\n\nyarnPath: .yarn/releases/yarn-4.9.1.cjs\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "> **Archived** For up to date changelogs that are automatically generated by [changesets](https://github.com/atlassian/changesets), see CHANGELOG.md files in respective workspaces. For example, the `graphiql` changelog is located at [packages/graphiql/CHANGELOG.md](./packages/graphiql/CHANGELOG.md), and the language server changelog is located at [packages/graphql-language-service-server/CHANGELOG.md](./packages/graphql-language-service-server/CHANGELOG.md)\n\n## GraphiQL 0.14.2 - 11 Aug, 2019\n\n### Fixes\n\n- Fix SSR & use of window when introducing new `extraKeys` capability (#942)\n\n## GraphiQL 0.14.0 - 11 Aug, 2019\n\n### Features\n\n- Add defaultVariableEditorOpen prop (#744) - @acao\n\n### Fixes\n\n- Fix formatting of subscription errors - #636, #722 - @benjie\n- preserve ctrl-f key for macOS - #759 - @pd4d10\n- Fix earlier 'Mode graphql failed to advance stream' on Linux by eating an exotic whitespace character - #735 closed by #932 - @benjie\n- Fix: check `this.editor` exists before `this.editor.off` in QueryEditor\n\n## Codemirror GraphQL - 0.9 - 11 Aug, 2019\n\n### Chores\n\n- BREAKING: Update to gls-interface and gls-parser ^2.1\n- BREAKING: Deprecate support for GraphQL 0.11 and below\n- BREAKING: introduce MIT license\n- BREAKING: Support GraphQL 14\n\n## GraphQL Language Service Server 2.1.0 - 11 Aug, 2019\n\n### Features\n\n- Replace babylon with @babel/parser (#879) @ganemone\n- Add support for gql template tags (#883) @ganemone @Neitsch\n\n### Chores\n\n- BREAKING: remove incompatible dependencies on graphql 0.11 and below\n- BREAKING: add peer support for graphql 14.x\n- BREAKING: change copyright to MIT\n- update formatting for monorepo eslint/prettier rules\n- update readme, badges\n\n## GraphQL Language Service Parser 2.1.0 - 11 Aug, 2019\n\n### Fixes\n\n- Fix 'mode graphql failed to advance stream' error from shift-alt-space, etc - #932 - @benjie\n\n## GraphQL Language Service Interface 2.1.0 - 11 Aug, 2019\n\n### Features\n\n- add \\_\\_typename field suggestion against object type - (#903) @yoshiakis\n- Update sortText logic, so that field sort is schema driven rather than alphabetically sorted - (#884) @ganemone\n\n### Chores\n\n- BREAKING: add peer support for graphql 14.x\n- MINOR BREAKING: Use MIT license\n- add test case for language service hover - @divyenduz @AGS-\n\n## GraphQL Language Service 2.1.0\n\n- BREAKING: add peer support for graphql 14.x\n- BREAKING: remove incompatible dependencies on graphql 0.11 and below (b/c of gls-utils 2.x)\n\n## GraphQL Language Service Utils 2.1.0 - 11 Aug, 2019\n\n### Chores\n\n- BREAKING: change copyright to MIT\n- update formatting for monorepo eslint/prettier rules\n- update readme, badges\n\n## GraphQL Language Service Types 1.3.0 - 11 Aug, 2019\n\n### Chores\n\n- BREAKING: change copyright to MIT\n- BREAKING: add peer support for graphql 14.x\n- update formatting for monorepo eslint/prettier rules\n- update readme, badges\n\n## GraphiQL 0.13.2 - 21 June, 2019\n\n### Features\n\n- Hint/popup/etc DOM nodes use container rather than creating children of\n  <body> - #791 - @codestryke\n- Add readOnly prop and pass to `QueryEditor` and `VariableEditor` - #718 - @TheSharpieOne\n- Add operationName to introspection query - #664 - @jbblanchet\n- Image Preview Functionality - #789 - @dunnbobcat @asiandrummer\n\n### Fixes\n\n- Destroy image hover tooltip when it isn't needed - #874 - @acao\n- Copy non-formatted query to avoid stripping out comments - #832 - @jaebradley\n- Normalizes no-break spaces - #781 - @zouxuoz\n- Prevents crashing on Shift-Alt-Space - #781 - @zouxuoz\n- Fix UI state change after favorite a query - #747 - @benjie\n\n### Chores\n\n- BREAKING: Upgrade to `codemirror-graphql` 0.8.3 - #773 - @jonaskello\n- BREAKING: Change copyright to GraphQL Contributors, License to MIT\n- Netlify deployments per PR - @orta\n- Add unit test coverage\n- Switch to Jest\n\n## Codemirror Graphql Mode 0.8.4 - 11 Aug, 2018\n\nYou will now be importing async methods from gls-interface 2.0.0, thus your bundler will require regenerator runtime\n\n## Chores\n\n- BREAKING - Use GLS interface/parser 2.1.0 for graphql 14\n- BREAKING - This introduces async/await\n\n## GraphQL Language Service Interface 2.0.0 - 11 Sep, 2018\n\n### Chores\n\n- BREAKING: upgrade internal dependencies - gls-parser, gls-types, and gls-utils to 2.0.0 - @lostplan\n- BREAKING: remove incompatible dependencies on graphql 0.11 and below - @lostplan\n\n## GraphQL Language Service Utils 2.0.0 - 11 Sep, 2018\n\n### Chores\n\n- BREAKING: deprecate support for graphql-js 0.11.x and below - @lostplan [graphql/graphql-language-service#256](https://github.com/graphql/graphql-language-service/pull/256) [new ref](https://github.com/graphql/graphiql/commit/895e68537fd802b8b6ddf2578a1f76f85982c773) because of [this change](https://github.com/graphql/graphiql/commit/068c57fdb4a147be3c2fc38167e2def74d217a82#diff-696ceb17e38e4a274d4a149d24513b78)\n- BREAKING: GraphQL 14.x support, peer dependency resolutions - #244 - @AGS-\n\n## GraphQL Language Service Utils 1.2.2 - 11 Sep, 2018\n\n### Chores\n\n- add graphql-js 0.13 to peer deps of types package (graphql/graphql-language-service#241)\n\n## GraphQL Language Service Server 2.0.0 - 11 Sep, 2019\n\n### Chores\n\n- add graphql-js 0.13 to peer dependencies (graphql/graphql-language-service#241)\n- BREAKING: upgrade internal dependencies - gls-interface, gls-server and gls-utils to 2.0.0 @lostplan\n\n## GraphQL Language Service 2.0.0 - 11 Sep, 2018\n\n### Chores\n\n- BREAKING: upgrade internal dependencies - gls-interface, gls-server and gls-utils to 2.0.0 @Sol\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nWe welcome contributions and assistance! If you want to know where to start,\ncheck out our\n[Github Projects sorted by name](https://github.com/graphql/graphiql/projects?query=is%3Aopen+sort%3Aname-asc).\n\nIf you want to add a new feature, note that GraphiQL is eventually going to\nsupport its own extension system, and we are rarely adding new features, so make\nsure you submit feature requests with that in mind.\n\n## Development\n\nTo get setup for development, refer to [DEVELOPMENT.md](./DEVELOPMENT.md)\n\n## Issues\n\nWe use GitHub issues to track public bugs and requests. Please ensure your bug\ndescription is clear and has sufficient instructions to be able to reproduce the\nissue. The best way is to provide a reduced test case on jsFiddle or jsBin.\n\n## Pull Requests\n\nAll active development of this project happens on GitHub. We actively welcome\nyour [pull requests](https://help.github.com/articles/creating-a-pull-request).\n\n### Type Prefixes\n\n[a list of type prefixes](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional#type-enum)\nis available:\n\n```json\n[\n  \"build\",\n  \"ci\",\n  \"chore\",\n  \"docs\",\n  \"feat\",\n  \"fix\",\n  \"perf\",\n  \"refactor\",\n  \"revert\",\n  \"style\",\n  \"test\"\n]\n```\n\nof these, `fix` and `feat` can trigger patch and minor version releases,\nreflexively. the rest are useful to help track activity.\n\nanother commit message that can trigger a major version bump is this:\n\n```\nfeat: introduce new `fooBar()` API, break `foo()` api\n\n- list changes\n\nBREAKING CHANGE: break `foo()` api\n```\n\nnotice the non breaking spaces between header and footer.\n\n## Releasing\n\nPlease see [the RELEASING.md document](./RELEASING.md).\n\n## License\n\nBy contributing to GraphiQL, you agree that your contributions will be licensed\nunder the LICENSE file in the project root directory.\n"
  },
  {
    "path": "DEVELOPMENT.md",
    "content": "# Getting Started\n\nPlease note that we require a signed GraphQL Specification Membership agreement\nbefore landing a contribution. This is checked automatically when you open a PR.\nIf you have not signed the membership agreement (it's free), you will be\nprompted by the EasyCLA bot. For more details, please see the\n[GraphQL WG repo](https://github.com/graphql/graphql-wg/tree/main/membership).\n\n0. First, you will need the latest `git`, `yarn` 4, & `node` 18 or greater.\n   macOS, Windows and Linux should all be supported as build environments.\n\n> [!WARNING]\n>\n> None of the commands below will work with `npm`. Please use `yarn` in this repo.\n\n1. Fork this repo by using the \"Fork\" button in the upper-right\n\n2. Check out your fork\n\n   ```sh\n   git clone git@github.com:your-name-here/graphiql.git\n   ```\n\n3. Install or Update all dependencies\n\n   ```sh\n   yarn\n   ```\n\n4. Build all interdependencies so the project you are working on can resolve\n   other packages\n\n   First, you'll need:\n\n   ```sh\n   yarn build\n   ```\n\n   or\n\n   ```sh\n   yarn build:watch\n   ```\n\n   If you are focused on GraphiQL development, you can run:\n\n   ```sh\n   yarn dev:graphiql\n   ```\n\n5. Get coding! If you've added code, add tests. If you've changed APIs, update\n   any relevant documentation or tests. Ensure your work is committed within a\n   feature branch.\n\n6. Ensure all tests pass and build everything\n\n   ```sh\n   yarn test\n   ```\n\n## Fix CI issues with linting\n\nIf you have `prettier` or `eslint --fix`-able issues you see in CI, use —\n\n`yarn format`\n\nIf you see `typescript` build issues, do a `yarn build` locally, and make sure\nthe whole project references tree builds. Changing interfaces can end up\nbreaking their implementations.\n\n## Run tests for GraphiQL:\n\n- `yarn test graphiql` will run all tests for graphiql. You can also run tests\n  from a workspace, but most tooling is at the root.\n- `yarn test --watch` will run `jest` with `--watch`\n- `yarn e2e` at the root will run the end-to-end suite\n- `yarn start-monaco` will launch `webpack` dev server for the `monaco` editor\n  example with GitHub API from the root. This is the fastest way to test changes\n  to `graphql-language-service-interface`, parser, etc.\n\nIf you want these commands to watch for changes to dependent packages in the\nrepo, then run `yarn build --watch` alongside either of these.\n\n## Developing for GraphiQL\n\nIf you want to develop just for graphiql, you won't need to execute commands\nfrom the package subdirectory at `packages/graphiql`.\n\nFirst, you'll need to `yarn build` all the packages from the root.\n\nThen, you can run `yarn dev:graphiql` command, which will launch `vite` dev server for GraphiQL.\n\n```text\nVITE v6.3.4  ready in 1015 ms\n\n➜  Local:   http://localhost:5173/\n➜  Network: use --host to expose\n```\n\n## Developing Monaco GraphQL\n\n1. First run `yarn`.\n2. Run `yarn tsc --watch` to watch `monaco-graphql` and\n   `graphql-language-service` in one screen session/terminal tab/etc\n3. In another session, run `yarn start-monaco` from anywhere in the repository\n   aside from an individual workspace.\n4. Alternatively to the webpack example, or in addition, you can run monaco or\n   next.js examples, though these examples are simpler. They also require their\n   own `yarn` or `npm install` as they are excluded from the `workspaces`\n   resolved on global `yarn install`\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) GraphQL Contributors\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.\n"
  },
  {
    "path": "README.md",
    "content": "<!-- @format -->\n\n# GraphQL IDE Monorepo\n\n> **Security Notice:** All versions of `graphiql` < `1.4.7` are vulnerable to an\n> XSS attack in cases where the GraphQL server to which the GraphiQL web app\n> connects is not trusted. Learn more\n> [in the graphiql `security` docs directory](docs/security)\n\n> **Looking for the [GraphiQL Docs?](packages/graphiql/README.md)**: This is the\n> root of the monorepo! The full GraphiQL docs are located at\n> [`packages/graphiql`](packages/graphiql)\n\n[![Build Status](https://github.com/graphql/graphiql/workflows/Node.JS%20CI/badge.svg)](https://github.com/graphql/graphiql/actions?query=workflow%3A%22Node.JS+CI%22)\n[![Discord](https://img.shields.io/discord/625400653321076807.svg)](https://discord.gg/NP5vbPeUFp)\n[![Code Coverage](https://img.shields.io/codecov/c/github/graphql/graphiql)](https://codecov.io/gh/graphql/graphiql)\n![GitHub top language](https://img.shields.io/github/languages/top/graphql/graphiql)\n![GitHub language count](https://img.shields.io/github/languages/count/graphql/graphiql)\n[![Snyk Vulnerabilities for GitHub Repo](https://img.shields.io/snyk/vulnerabilities/github/graphql/graphiql)](https://snyk.io/test/github/graphql/graphiql)\n[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/3887/badge)](https://bestpractices.coreinfrastructure.org/projects/3887)\n\n## Overview\n\nGraphiQL is the reference implementation of this monorepo, GraphQL IDE, an\nofficial project under the GraphQL Foundation. The code uses the permissive MIT\nlicense.\n\nWhether you want a simple GraphiQL IDE instance for your server, or a more\nadvanced web or desktop GraphQL IDE experience for your framework or plugin, or\nyou want to build an IDE extension or plugin, you've come to the right place!\n\nThe purpose of this monorepo is to give the GraphQL Community:\n\n- a to-specification official language service (see:\n  [API Docs](https://graphiql-test.netlify.app/typedoc))\n- a comprehensive LSP server and CLI service for use with IDEs\n- a codemirror mode\n- a monaco mode (in the works)\n- an example of how to use this ecosystem with GraphiQL.\n- examples of how to implement or extend GraphiQL.\n\n## [`graphiql`](packages/graphiql#readme)\n\n<!-- prettier-ignore -->\n> [![NPM](https://img.shields.io/npm/v/graphiql.svg)](https://npmjs.com/graphiql)\n> ![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/graphiql)\n> ![npm downloads](https://img.shields.io/npm/dm/graphiql?label=npm%20downloads)\n> ![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/graphiql)\n> ![npm bundle size (version)](https://img.shields.io/bundlephobia/min/graphiql/latest)\n> ![npm bundle size (version)](https://img.shields.io/bundlephobia/minzip/graphiql/latest)\n\n![Screenshot of GraphiQL with Doc Explorer Open](packages/graphiql/resources/graphiql.png)\n\n_/ˈɡrafək(ə)l/_ A graphical interactive in-browser GraphQL IDE.\n[Try the live demo](https://graphql.org/swapi-graphql). We also have\n[a demo using our latest netlify build](http://graphiql-test.netlify.app) for\nthe `main` branch.\n\nThe GraphiQL IDE, implemented in React, currently using\n[GraphQL mode for CodeMirror](packages/codemirror-graphql#readme) &\n[GraphQL Language Service](packages/graphql-language-service#readme).\n\n**Learn more about\n[GraphiQL in `packages/graphiql/README.md`](packages/graphiql#readme)**\n\n## [`monaco-graphql`](packages/monaco-graphql#readme)\n\n[![NPM](https://img.shields.io/npm/v/monaco-graphql.svg)](https://npmjs.com/monaco-graphql)\n![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/monaco-graphql)\n![npm downloads](https://img.shields.io/npm/dm/monaco-graphql?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/monaco-graphql)\n\nProvides monaco editor with a powerful, schema-driven graphql language mode.\nUses the `graphql-language-service`directly.\n\nSee the [webpack example](examples/monaco-graphql-webpack#readme) for a plain\njavascript demo using GitHub API\n\n## [`codemirror-graphql`](packages/codemirror-graphql#readme)\n\n[![NPM](https://img.shields.io/npm/v/codemirror-graphql.svg)](https://npmjs.com/codemirror-graphql)\n![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/codemirror-graphql)\n![npm downloads](https://img.shields.io/npm/dm/codemirror-graphql?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/codemirror-graphql)\n\n![Animated Codemirror GraphQL Completion Example](https://raw.githubusercontent.com/graphql/graphiql/main/packages/codemirror-graphql/resources/example.gif)\n\nProvides CodeMirror 5 with a parser mode for GraphQL along with a live linter and\ntypeahead hinter powered by your GraphQL Schema. Uses the\n`graphql-language-service`.\n\n## [`cm6-graphql`](packages/cm6-graphql#readme)\n\n[![NPM](https://img.shields.io/npm/v/codemirror-graphql.svg)](https://npmjs.com/cm6-graphql)\n![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/cm6-graphql)\n![npm downloads](https://img.shields.io/npm/dm/cm6-graphql?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/cm6-graphql)\n\nProvides CodeMirror 6 with a full-featured language mode for GraphQL. Uses the `graphql-language-service`.\n\n## [`graphql-language-service`](packages/graphql-language-service#readme)\n\n[![NPM](https://img.shields.io/npm/v/graphql-language-service.svg)](https://npmjs.com/graphql-language-service)\n![npm downloads](https://img.shields.io/npm/dm/graphql-language-service?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/graphql-language-service)\n\nProvides language services for\n[`graphql-language-service-server`](packages/graphql-language-service-server#readme)\n[`codemirror-graphql`](packages/codemirror-graphql) and\n[`monaco-graphql`](packages/monaco-graphql). Previously published separately as\nthe now-retired `graphql-language-service-interface`,\n`graphql-language-service-parser`, `graphql-language-service-utils` and\n`graphql-language-service-types`.\n\n## [`graphql-language-service-server`](packages/graphql-language-service-server#readme)\n\n[![NPM](https://img.shields.io/npm/v/graphql-language-service-server.svg)](https://npmjs.com/graphql-language-service-server)\n![npm downloads](https://img.shields.io/npm/dm/graphql-language-service-server?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/graphql-language-service-server)\n\nProvides language services for LSP-based IDE extensions using the\n`graphql-language-service`\n\n## [`graphql.vscode-graphql`](packages/vscode-graphql#readme)\n\nAn example implementation of `graphql-language-service-server` for Visual Studio\nCode. Available\n[on the marketplace](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql).\nOVSX fix is pending.\n\n## [`graphql.vscode-graphql-syntax`](packages/vscode-graphql-syntax#readme)\n\nA new syntax highlighting-only extension for vscode to be used by other vscode\nextensions.\n\n## [`graphql.vscode-graphql-execution`](packages/vscode-graphql-execution#readme)\n\nAn extension for vscode-graphql that allows inline query execution.\n\n## [`graphql-language-service-cli`](packages/graphql-language-service-cli#readme)\n\n[![NPM](https://img.shields.io/npm/v/graphql-language-service-cli.svg)](https://npmjs.com/graphql-language-service-cli)\n![npm downloads](https://img.shields.io/npm/dm/graphql-language-service-cli?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/graphql-language-service-cli)\n\nProvides a CLI for the language service server.\n\n## Browser & Runtime Support\n\nMany of these packages need to work in multiple environments.\n\nBy default, all typescript packages target `es6`.\n\n`graphql-language-service-server` and `graphql-language-service-cli` are made\nfor the node runtime, so they target `es2017`\n\n`codemirror-graphql` and the `graphiql` browser bundle use the\n[`.browserslistrc`](./.browserslistrc), which targets modern browsers to keep\nbundle size small and keep the language services performant where async/await is\nused, and especially to avoid the requirement of `regenerator-runtime` or\nspecial babel configuration.\n\n### [`.browserslistrc`](./.browserslistrc):\n\n```\nlast 2 versions\nFirefox ESR\nnot dead\nnot IE 11\nnot ios 10\nmaintained node versions\n```\n\nTo be clear, we do _not_ support Internet Explorer or older versions of\nevergreen browsers.\n\n## Development\n\nTo get setup for local development of this monorepo, refer to\n[DEVELOPMENT.md](./DEVELOPMENT.md)\n\n# Contributing to this repo\n\nThis is an open source project, and we welcome contributions. Please see\n[CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute.\n\nThis repository is managed by EasyCLA. Project participants must sign the free\n[GraphQL Specification Membership agreement](https://preview-spec-membership.graphql.org)\nbefore making a contribution. You only need to do this one time, and it can be\nsigned by\n[individual contributors](http://individual-spec-membership.graphql.org) or\ntheir [employers](http://corporate-spec-membership.graphql.org).\n\nTo initiate the signature process please open a PR against this repo. The\nEasyCLA bot will block the merge if we still need a membership agreement from\nyou.\n\nPlease note that EasyCLA is configured to accept commits from certain GitHub\nbots. These are approved on an exception basis once we are confident that any\ncontent they create is either unlikely to consist of copyrightable content or\nelse was written by someone who has already signed the CLA (e.g., a project\nmaintainer). The bots that have currently been approved as exceptions are:\n\n- github-actions (exclusively for the `changesets` Action)\n\nYou can find\n[detailed information here](https://github.com/graphql/graphql-wg/tree/main/membership).\nIf you have issues, please email\n[operations@graphql.org](mailto:operations@graphql.org).\n\n## Maintainers\n\nMaintainers of this repository regularly review PRs and issues and help advance\nthe GraphiQL roadmap\n\n### Alumni\n\nWithout these amazing past maintainers, where would we be?!\n\n- [@leebyron](https://github.com/leebyron) - original author of all libraries\n- [@asiandrummer](https://github.com/asiandrummer) - original creator of\n  GraphiQL\n- [@wincent](https://github.com/wincent) - early co-author and maintainer\n- [@lostplan](https://github.com/lostplan) - maintained the language service\n  ecosystem until about 2017\n- [@IvanGoncharov](https://github.com/ivangoncharov) - maintainer and\n  transitional mentor to @acao and others\n- [@orta](https://github.com/orta) - has helped with so many parts of the\n  project over the years, and provided the original redesign!\n- [@divyenduz](https://github.com/divyenduz) - the original creator of\n  `vscode-graphql`, and contributor to much of the ecosystem. Thanks Divy!\n\n### Active\n\nMaintainers who are currently active (to varying degrees, please contact us via\nour discord channels!):\n\n- [@imolorhe](https://github.com/imolorhe)\n- [@yoshiakis](https://github.com/yoshiakis)\n- [@urigo](https://github.com/urigo)\n- [@timsuchanek](https://github.com/timsuchanek)\n- [@thomasheyenbrock](https://github.com/thomasheyenbrock)\n- [@n1ru4l](https://github.com/n1ru4l)\n- [@acao](https://github.com/acao)\n- [@stonexer](https://github.com/stonexer)\n- [@dimaMachina](https://github.com/dimaMachina)\n- [@dotansimha](https://github.com/dotansimha)\n- [@saihaj](https://github.com/saihaj)\n- [@jonathanawesome](https://github.com/jonathanawesome)\n- [@cshaver](https://github.com/cshaver)\n\n> Thank you graphql community for all the help & support! I did it all for you,\n> and I couldn't have done it without you ❤️ - @acao\n\n### Fielding Proposals!\n\nThe door is open for proposals for the new GraphiQL Plugin API, and other ideas\non how to make the rest of the IDE ecosystem more performant, scalable,\ninteroperable and extensible. Feel free to open a PR to create a document in the\n`/proposals/` directory. Eventually we hope to move these to a repo that serves\nthis purpose.\n\n## Community\n\n- **Discord**\n  [![Discord](https://img.shields.io/discord/625400653321076807.svg)](https://discord.gg/NP5vbPeUFp) -\n  Most discussion outside of GitHub happens on the GraphQL\n  [Discord Server](https://discord.gg/NP5vbPeUFp)\n- **Twitter** - [@GraphiQL](https://twitter.com/@GraphiQL) and\n  [#GraphiQL](https://twitter.com/hashtag/GraphiQL)\n- **GitHub** - Create feature requests, discussions issues and bugs above\n- **Working Group** - Yes, you're invited! Monthly planning/decision making\n  meetings, and working sessions every two weeks on zoom!\n  [Learn more.](working-group#readme)\n"
  },
  {
    "path": "RELEASING.md",
    "content": "# Cutting New Releases\n\nTODO: Redo for `changesets`. See [`Changesets Readme`](./.changeset/README.md)\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# GraphiQL Ecosystem Security Advisories\n\nSecurity Advisories for packages in this repository will be listed here\n\n## GraphiQL\n\n### 2021\n\n- [Introspection Schema XSS Attack](./docs/security/2021-introspection-schema-xss.md)\n"
  },
  {
    "path": "babel.config.js",
    "content": "// for ESM don't transpile modules\n\nconst envConfig = {\n  modules: 'commonjs',\n};\n\nif (process.env.ESM) {\n  envConfig.modules = false;\n  envConfig.targets = { node: 'current' };\n  envConfig.bugfixes = true;\n}\n\nif (process.env.CDN) {\n  envConfig.modules = 'umd';\n  envConfig.targets = null;\n}\n\nmodule.exports = {\n  presets: [\n    [require.resolve('@babel/preset-env'), envConfig],\n    require.resolve('@babel/preset-react'),\n    require.resolve('@babel/preset-typescript'),\n  ],\n  env: {\n    test: {\n      presets: [\n        [require.resolve('@babel/preset-env'), envConfig],\n        [require.resolve('@babel/preset-react'), { runtime: 'automatic' }],\n        require.resolve('@babel/preset-typescript'),\n      ],\n      plugins: [require.resolve('babel-plugin-macros')],\n    },\n    development: {\n      compact: false,\n    },\n  },\n  plugins: [\n    require.resolve('@babel/plugin-proposal-class-properties'),\n\n    require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'),\n    require.resolve('@babel/plugin-proposal-optional-chaining'),\n    require.resolve('@babel/plugin-transform-private-methods'),\n    ['babel-plugin-transform-import-meta', { module: 'ES6' }],\n  ],\n};\n"
  },
  {
    "path": "cspell.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json\",\n  \"language\": \"en\",\n  \"useGitignore\": true,\n  \"cache\": {\n    \"useCache\": true\n  },\n  \"dictionaries\": [\"custom-words\"],\n  \"dictionaryDefinitions\": [\n    {\n      \"name\": \"custom-words\",\n      \"path\": \"./resources/custom-words.txt\",\n      \"addWords\": true\n    }\n  ],\n  \"ignorePaths\": [\n    \"**/CHANGELOG.md\",\n    \"**/package.json\",\n    \"**/esbuild.js\",\n    \".eslintrc.js\",\n    \".vscode/extensions.json\",\n    \"packages/monaco-graphql/test/monaco-editor.test.ts\",\n    \"working-group\"\n  ],\n  \"files\": [\"**/*.{js,cjs,mjs,ts,jsx,tsx,md,mdx,html,json,css,toml,yaml,yml}\"]\n}\n"
  },
  {
    "path": "docs/migration/graphiql-2.0.0.md",
    "content": "# Upgrading `graphiql` from `1.x` to `2.0.0`\n\nHello GraphiQL user and thanks for upgrading!\n\nThis migration guide walks you through all changes that come with\n`graphiql@2.0.0`, in particular the breaking ones, and will show you how to\nupgrade your `1.x` implementation.\n\n> If you encounter any issues while upgrading that are not covered in here,\n> please open an issue or PR on this repo and we will extend this guide.\n\n## Design refresh including dark theme\n\nArguably the biggest change in `graphiql@2` is the new design of the UI. It has\nbeen reworked from scratch to look more modern while keeping its simplistic look\nand feel. We also finally added a built-in dark theme. Theme selection is based\non system defaults and can be changed in the new settings dialog (available by\nclicking on the gear icon at the bottom of the sidebar on the left of the\nscreen).\n\nStarting with `graphiql@2`, the only officially supported way of customizing the\nCSS that make up the looks of GraphiQL is by overriding the design tokens\ndefined using CSS variables. In particular, changes to class names are no longer\nconsidered breaking changes. If you use class-name based selectors to change\nstyles your overrides might break with minor or patch version bumps.\n\nA list of all CSS variables that can be customized can be found in the\n[`root.css`](../../packages/graphiql-react/src/style/root.css) file of the\n`@graphiql/react` package. The variables for colors use a list of values that\ncan be passed into the\n[`hsl`](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl)\nfunction in CSS that defines colors by hue, saturation and lightness.\n\n## Changes to `GraphiQL` component props\n\nA couple of props of the `GraphiQL` have undergone breaking changes:\n\n- The props `defaultVariableEditorOpen` and `defaultSecondaryEditorOpen` have\n  been merged into one prop `defaultEditorToolsVisibility`. The default behavior\n  if this prop is not passed is that the editor tools are shown if at least one\n  of the secondary editors has contents. You can pass the following values to\n  the prop:\n  - Passing `false` hides the editor tools.\n  - Passing `true` shows the editor tools.\n  - Passing `\"variables\"` explicitly shows the variables editor.\n  - Passing `\"headers\"` explicitly shows the headers editor.\n- The props `docExplorerOpen`, `onToggleDocs` and `onToggleHistory` have been\n  removed. They are replaced by the more generic props `visiblePlugin` (for\n  controlling which plugin is visible) and `onTogglePluginVisibility` (which is\n  called each time the visibility of any plugin changes).\n- The `headerEditorEnabled` prop has been renamed to `isHeadersEditorEnabled`.\n- The `ResultsTooltip` prop has been renamed to `responseTooltip`.\n\n### Tabs enabled by default\n\nTabs were supported opt-in starting with `@graphiql@1.8`. With `graphiql@2` tabs\nare now always enabled. The `tabs` prop (which previously toggled if tabs were\nenabled or not) has therefore been replaced with a prop `onTabChange`. If you\nused the `tabs` prop before to pass this function you can change your\nimplementation like so:\n\n```diff\n<GraphiQL\n-  tabs={{ onTabChange: (tabState) => {/* do something */} }}\n+  onTabChange={(tabState) => {/* do something */}}\n/>\n```\n\nAs long as only one session is open, the tab bar above the editors is hidden. A\nplus icon next to the logo on the top right allows the user to open more tabs.\nWith at least two tabs opened, the tab bar appears above the editors.\n\n## Removed package exports\n\nAll React components apart from the `GraphiQL` component have been moved to the\n`@graphiql/react` package. That's why we removed most of the exports with\n`graphiql@2`. Here is a list of all exported components and functions that have\nbeen removed and where you can find them now:\n\n- `QueryEditor`, `VariableEditor` and `DocExplorer`: Now exported from\n  `@graphiql/react` under the same names\n  - Note that the `schema` prop of the `DocExplorer` no longer exists, the\n    component now uses the schema provided by the `ExplorerContext`.\n- `ToolbarMenu`: Now exported from `@graphiql/react` as `ToolbarMenu`\n- `ToolbarMenuItem`: Now exported from `@graphiql/react` as `ToolbarMenu.Item`\n- `ToolbarSelect`: Now exported from `@graphiql/react` as `ToolbarListbox`\n- `ToolbarSelectOption`: Now exported from `@graphiql/react` as\n  `ToolbarListbox.Option`\n- `onHasCompletion`: This function is only meant to be used internally, it is no\n  longer being exported\n- `fillLeafs`, `getSelectedOperationName` and `mergeAst`: Now exported from\n  `@graphiql/toolkit` under the same names\n- types `Fetcher`, `FetcherOpts`, `FetcherParams`, `FetcherResult`,\n  `FetcherReturnType`, `Observable`, `Storage` and `SyncFetcherResult`: Exported\n  from `@graphiql/toolkit` under the same names (previously just re-exported by\n  `graphiql`)\n\n## `GraphiQL` is now a function component\n\nThe `GraphiQL` component in `graphiql@1.x` was a class component. That allowed\neasy access to its props, state and methods by attaching a ref to it like so:\n\n```tsx\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { GraphiQL } from 'graphiql';\nimport { Component } from 'react';\n\nconst fetcher = createGraphiQLFetcher({ url: 'https://my.endpoint' });\n\nclass MyComponent extends Component {\n  _graphiql: GraphiQL;\n\n  componentDidMount() {\n    const query = this._graphiql.getQueryEditor().getValue();\n  }\n\n  render() {\n    return <GraphiQL ref={r => (this._graphiql = r)} fetcher={fetcher} />;\n  }\n}\n```\n\nWith `graphiql@2` we refactored the codebase to more \"modern\" React. This also\nmeant replacing all class components with function components. The code above no\nlonger works in `graphiql@2` as attaching refs to function components is not\npossible in React.\n\nAll logic and state management now lives in multiple React contexts, provided by\nthe `@graphiql/react` package. The `GraphiQL` component is now basically\ncombining two other components, both of which are also exported by the package.\n\n- `GraphiQLProvider` (originally coming from `@graphiql/react`) will render all\n  context providers and takes care of state management\n- `GraphiQLInterface` is defined in the `graphiql` package and renders the UI\n\nIf you want to read or modify GraphiQL state from your custom implementation you\nneed to render both the above components separately as the hooks for consuming\nthe context values only work in components that are rendered inside the provider\ncomponent.\n\nWith all that, the example above can be refactored a such:\n\n```jsx\nimport { useEditorContext } from '@graphiql/react';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { GraphiQLInterface, GraphiQLProvider } from 'graphiql';\nimport { useEffect } from 'react';\n\nconst fetcher = createGraphiQLFetcher({ url: 'https://my.endpoint' });\n\nfunction MyComponent() {\n  return (\n    <GraphiQLProvider fetcher={fetcher}>\n      <InsideContext />\n    </GraphiQLProvider>\n  );\n}\n\nfunction InsideContext() {\n  // Calling this hook would not work in `MyComponent` (it would return `null`)\n  const { queryEditor } = useEditorContext();\n\n  useEffect(() => {\n    const query = queryEditor.getValue();\n  }, [queryEditor]);\n\n  return <GraphiQLInterface />;\n}\n```\n\nHere is a list of all public class methods that existed in `graphiql@1` and its\nreplacement in `graphiql@2`. All the contexts mentioned below can be accessed\nusing a hook exported by `@graphiql/react`.\n\n- `getQueryEditor`: Use the `queryEditor` property from the `EditorContext`.\n- `getVariableEditor`: Use the `variableEditor` property from the\n  `EditorContext`.\n- `getHeaderEditor`: Use the `headerEditor` property from the `EditorContext`.\n- `refresh`: Calling this method should no longer be necessary, all editors will\n  refresh automatically after resizing. If you really need to refresh manually\n  you have to call the `refresh` method on all editor instances individually.\n- `autoCompleteLeafs`: Use the `useAutoCompleteLeafs` hook provided by\n  `@graphiql/react` that returns this function.\n\nThere are a couple more class methods that were intended to be private and were\nalready removed starting in `graphiql@1.9.0`. Since they were not actually\nmarked with `private`, here's an extension to the above list for these methods:\n\n- `handleClickReference`: This was a callback method triggered when clicking on\n  a type or field. It would open the doc explorer for the clicked reference. If\n  you want to manually mimic this behavior you can use the `push` method from\n  the `ExplorerContext` to add an item to the navigation stack of the doc\n  explorer, and you can use the `setVisiblePlugin` method of the `PluginContext`\n  (use the `usePluginContext()` hook to access this) to show the doc explorer\n  plugin (by passing the `DOC_EXPLORER_PLUGIN` object provided by\n  `@graphiql/react`).\n- `handleRunQuery`: To execute a query, use the `run` method of the\n  `ExecutionContext`. If you want to explicitly set an operation name, call the\n  `setOperationName` method of the `EditorContext` provider before that (passing\n  in the operation name string as argument).\n- `handleEditorRunQuery`: Use the `run` method of the `ExecutionContext`.\n- `handleStopQuery`: Use the `stop` method from the `ExecutionContext`.\n- `handlePrettifyQuery`: Use the `usePrettifyEditors` hook provided by\n  `@graphiql/react` that returns this function.\n- `handleMergeQuery`: Use the `useMergeQuery` hook provided by `@graphiql/react`\n  that returns this function.\n- `handleCopyQuery`: Use the `useCopyQuery` hook provided by `@graphiql/react`\n  that returns this function.\n- `handleToggleDocs` and `handleToggleHistory`: Use the `setVisiblePlugin`\n  method of the `PluginContext`.\n\nSome class methods were callbacks to modify state which are not intended to be\ncalled manually. All these methods don't have a successor: `handleEditQuery`,\n`handleEditVariables`, `handleEditHeaders`, `handleEditOperationName`,\n`handleSelectHistoryQuery`, `handleResetResize` and\n`handleHintInformationRender`\n\n### Static properties have been removed\n\nIn `graphiql@1.x` the `GraphiQL` component included a bunch of static properties\nthat exposed utility functions and other components. Most of these have been\nremoved in `graphiql@2` since the components and functions have been moved to\nthe `@graphiql/react` and `@graphiql/toolkit` packages.\n\nThe properties that remain on the `GraphiQL` function component are\n`GraphiQL.Logo`, `GraphiQL.Toolbar` and `GraphiQL.Footer`. All three are React\ncomponents that can be passed as children to the `GraphiQL` components and\noverride certain parts of the UI:\n\n- `GraphiQL.Logo`: Overrides the \"logo\" at the top right of the screen. By\n  default, it contains the text \"Graph*i*QL\".\n- `GraphiQL.Toolbar`: Overrides the toolbar next to the operation editor. By\n  default, if contains buttons for prettifying the current editor contents,\n  merging fragment definitions into the operation definition and copying the\n  contents of the operation editor to the clipboard. Note that the default buttons\n  will not be shown when passing this component as child to `GraphiQL`, instead\n  it will show the children you pass to `GraphiQL.Toolbar`. The execute button\n  will always be shown. If you want to keep the default buttons and add\n  additional buttons you can use the `toolbar` prop.\n- `GraphiQL.Footer`: Adds a section below the response editor. By default, this\n  won't show up in the UI.\n\nHere is a list of all the static properties that have been removed and their\nreplacements:\n\n- `GraphiQL.formatResult` and `GraphiQL.formatError`: Replaced by equally named\n  functions from `@graphiql/toolkit`\n- `GraphiQL.QueryEditor`, `GraphiQL.VariableEditor` and `GraphiQL.HeaderEditor`:\n  Replaced by equally named components from `@graphiql/react`\n- `GraphiQL.ResultViewer`: Replaced by the `ResponseEditor` component from\n  `@graphiql/react`\n- `GraphiQL.Button`: Replaced by the `ToolbarButton` component from\n  `@graphiql/react`\n- `GraphiQL.ToolbarButton`: This exposed the same component as\n  `GraphiQL.Button`.\n- `GraphiQL.Menu`: Replaced by the `ToolbarMenu` component from\n  `@graphiql/react`\n- `GraphiQL.MenuItem`: Replaced by the `ToolbarMenu.Item` component from\n  `@graphiql/react`\n- `GraphiQL.Group`: Grouping multiple buttons side-by-side is not provided\n  out-of-the box anymore in the new GraphiQL UI. If you want to implement a\n  similar feature in the new vertical toolbar you can do so by adding your own\n  styles for your custom toolbar elements. Example:\n\n  ```jsx\n  import { createGraphiQLFetcher } from '@graphiql/toolkit';\n  import { GraphiQL } from 'graphiql';\n\n  const fetcher = createGraphiQLFetcher({ url: 'https://my.endpoint' });\n\n  function MyComponent() {\n    return (\n      <GraphiQL fetcher={fetcher}>\n        <GraphiQL.Toolbar>\n          {/* Add custom styles for your buttons using the given class */}\n          <div className=\"button-group\">\n            <button>1</button>\n            <button>2</button>\n            <button>3</button>\n          </div>\n        </GraphiQL.Toolbar>\n      </GraphiQL>\n    );\n  }\n  ```\n\n### `window.g` has been removed\n\nIn `graphiql@1.x` the `GraphiQL` class component stored a reference to itself on\na global property named `g`. This property has been removed as refs don't exist\nfor function components. (Also, the property was only intended for internal use\nlike testing in the first place.)\n"
  },
  {
    "path": "docs/migration/graphiql-4.0.0.md",
    "content": "# Upgrading `graphiql` from `3.x` to `4.0.0`\n\n---\n\n## `graphiql`\n\n- Dropped support for **React 16/17**, added support for **React 19**\n- Dropped **CommonJS** build output – now **ESM only**\n- Improved UI of tabs\n  - Changed tabs behavior – tabs are always visible (even if only one)\n  - Updated tabs tooltip usage – now use HTML `title` attribute\n- Removed **default export**\n- Removed `disableTabs` option\n- Improved Markdown handling – single newlines are ignored\n- Added `onPrettifyQuery` callback for custom formatting\n- ⚠️ Deprecate **UMD CDN build `index.umd.js`**\n- Changed **CDN paths** and **style import**\n\n> [!WARNING]\n>\n> ⚠️ **`index.umd.js` is deprecated**. Switch to the [ESM CDN example](../../examples/graphiql-cdn/index.html).\n\n### UMD CDN path changes\n\n```diff\n-https://unpkg.com/graphiql/graphiql.js\n-https://unpkg.com/graphiql/graphiql.min.js\n+https://unpkg.com/graphiql/dist/index.umd.js  // ⚠️ deprecated\n\n-https://unpkg.com/graphiql/graphiql.css\n-https://unpkg.com/graphiql/graphiql.min.css\n+https://unpkg.com/graphiql/dist/style.css\n```\n\n### Default export removed\n\n```diff\n-import GraphiQL from 'graphiql'\n+import { GraphiQL } from 'graphiql'\n```\n\n### Style import changed\n\n```diff\n-import 'graphiql/graphiql.css'\n+import 'graphiql/style.css'\n```\n\n### Toolbar API migration\n\n#### `toolbar.additionalContent` → `<GraphiQL.Toolbar>`\n\n**Before:**\n\n```tsx\n<GraphiQL toolbar={{ additionalContent: <button>My button</button> }} />\n```\n\n**After:**\n\n```jsx\n<GraphiQL>\n  <GraphiQL.Toolbar>\n    {({ merge, prettify, copy }) => (\n      <>\n        {prettify}\n        {merge}\n        {copy}\n        <button>My button</button>\n      </>\n    )}\n  </GraphiQL.Toolbar>\n</GraphiQL>\n```\n\n---\n\n#### `toolbar.additionalComponent` → `<GraphiQL.Toolbar>`\n\n**Before:**\n\n```jsx\n<GraphiQL\n  toolbar={{\n    additionalComponent: function MyComponentWithAccessToContext() {\n      return <button>My button</button>;\n    },\n  }}\n/>\n```\n\n**After:**\n\n```jsx\n<GraphiQL>\n  <GraphiQL.Toolbar>\n    {({ merge, prettify, copy }) => (\n      <>\n        {prettify}\n        {merge}\n        {copy}\n        <MyComponentWithAccessToContext />\n      </>\n    )}\n  </GraphiQL.Toolbar>\n</GraphiQL>\n```\n\n---\n\n#### Customizing default toolbar buttons\n\nYou can reorder or remove default toolbar buttons:\n\n```tsx\n<GraphiQL>\n  <GraphiQL.Toolbar>\n    {({ prettify, copy }) => (\n      <>\n        {copy} {/* Move copy button to the top */}\n        {prettify} {/* Omit merge button */}\n      </>\n    )}\n  </GraphiQL.Toolbar>\n</GraphiQL>\n```\n\n---\n\n## `@graphiql/react`\n\n- Dropped support for **React 16/17**, added support for **React 19**\n- Dropped **CommonJS** build output\n- Improved UI of tabs\n- Updated dependencies: `@radix-ui` and `@headlessui/react`\n- Added `onPrettifyQuery` callback for custom formatting\n- Improved Markdown handling (ignores single newlines)\n- Style import changed:\n  ```diff\n  -import '@graphiql/react/dist/style.css'\n  +import '@graphiql/react/style.css'\n  ```\n\n---\n\n## `@graphiql/plugin-code-exporter`\n\n- Dropped support for **React 16/17**, added support for **React 19**\n- Dropped **CommonJS** build output\n- Updated ESM-based CDN example:\n  [code-exporter ESM CDN example](../../packages/graphiql-plugin-code-exporter/example/index.html)\n- ⚠️ UMD build deprecated – migrate to ESM-based CDN\n- Style import changed:\n  ```diff\n  -import '@graphiql/plugin-code-exporter/dist/style.css'\n  +import '@graphiql/plugin-code-exporter/style.css'\n  ```\n\n---\n\n## `@graphiql/plugin-explorer`\n\n- Dropped support for **React 16/17**, added support for **React 19**\n- Dropped **CommonJS** build output\n- Improved styles for the explorer UI\n- Updated ESM-based CDN example:\n  [explorer ESM CDN example](../../examples/graphiql-cdn/index.html)\n- ⚠️ UMD build deprecated – migrate to ESM-based CDN\n- Style import changed:\n  ```diff\n  -import '@graphiql/plugin-explorer/dist/style.css'\n  +import '@graphiql/plugin-explorer/style.css'\n  ```\n"
  },
  {
    "path": "docs/migration/graphiql-5.0.0.md",
    "content": "# Upgrading `graphiql` from `4.x` to `5.0.0`\n\nStarting from GraphiQL 5, you need to set up Monaco workers in your project:\n\n- For **Vite** projects you must:\n\n  1. Install `vite-plugin-monaco-editor` package:\n\n  ```sh\n  npm install vite-plugin-monaco-editor --save-dev\n  ```\n\n  2. Import and configure the plugin in your `vite.config.mjs` file:\n\n  ```diff\n  // vite.config.mjs\n  import { defineConfig } from 'vite'\n  import react from '@vitejs/plugin-react'\n  +import $monacoEditorPlugin from 'vite-plugin-monaco-editor'\n\n  +const monacoEditorPlugin = $monacoEditorPlugin.default ?? $monacoEditorPlugin\n\n  export default defineConfig({\n    plugins: [\n      react(),\n  +   monacoEditorPlugin({\n  +     languageWorkers: ['editorWorkerService', 'json'],\n  +     customWorkers: [\n  +       {\n  +         label: 'graphql',\n  +         entry: 'monaco-graphql/esm/graphql.worker.js'\n  +       }\n  +     ]\n  +   })\n    ]\n  })\n  ```\n\n> [!NOTE]\n>\n> See [Vite example](../../examples/graphiql-vite/src/App.jsx).\n\n- For Webpack projects such as **Next.js** you must import:\n\n  ```js\n  import 'graphiql/setup-workers/webpack';\n  ```\n\n> [!NOTE]\n>\n> See [Next.js example](../../examples/graphiql-nextjs/src/app/page.tsx).\n\n- For ESM-based CDN usages, you must use\n  [`?worker` query](https://esm.sh/#web-worker) to load the module as a web\n  worker:\n\n  ```js\n  import createJSONWorker from 'https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker';\n  import createGraphQLWorker from 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker';\n  import createEditorWorker from 'https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker';\n\n  globalThis.MonacoEnvironment = {\n    getWorker(_workerId, label) {\n      switch (label) {\n        case 'json':\n          return createJSONWorker();\n        case 'graphql':\n          return createGraphQLWorker();\n      }\n      return createEditorWorker();\n    },\n  };\n  ```\n\n> [!NOTE]\n>\n> See [CDN example](../../examples/graphiql-cdn/index.html).\n\n## Allow to Override All Default GraphiQL Plugins\n\nStarting from GraphiQL 5, you can override all default plugins.\n\n### Removing All Default Plugins\n\nTo remove all default plugins (currently **Doc Explorer** and **History**), set\n`referencePlugin={null}` and pass an empty array to the `plugins` prop:\n\n```jsx\nimport { GraphiQL } from 'graphiql';\n\nconst myPlugins = [];\n\nfunction App() {\n  return (\n    <GraphiQL\n      referencePlugin={null} // Removes Doc Explorer plugin\n      plugins={myPlugins} // Removes History plugin\n    />\n  );\n}\n```\n\n> [!NOTE]\n>\n> If you're using a custom Doc Explorer, pass it to the `referencePlugin` prop —\n> **not** the `plugins` array. It will be automatically included and always\n> rendered first.\n\n### Adding Plugins While Keeping Defaults\n\nIf you're adding custom plugins (e.g., the **Explorer** plugin) and want to keep\nthe **History** plugin, you must explicitly include it in the `plugins` array:\n\n```jsx\nimport { GraphiQL, HISTORY_PLUGIN } from 'graphiql';\nimport { explorerPlugin } from '@graphiql/plugin-explorer';\n\nconst myPlugins = [HISTORY_PLUGIN, explorerPlugin()];\n\nfunction App() {\n  return <GraphiQL plugins={myPlugins} />;\n}\n```\n\n---\n\n## `graphiql`\n\n> [!WARNING]\n>\n> ⚠️ UMD build is removed. Switch to the [ESM CDN example](../../examples/graphiql-cdn/index.html).\n\n- Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n  - Replacing `codemirror-graphql` with [`monaco-graphql`](../../packages/monaco-graphql)\n  - Clicking on a reference in the operation editor now works by holding `Cmd` on macOS or `Ctrl` on Windows/Linux\n- Support for comments in **Variables** and **Headers** editors\n- Added new examples: [**GraphiQL x Vite**](../../examples/graphiql-vite) and [**GraphiQL x Next.js**](../../examples/graphiql-nextjs)\n- Removed examples: **GraphiQL x Parcel** and **GraphiQL x Create React App**\n- Removed props\n  - `query`\n  - `variables`\n  - `headers`\n  - `response`\n  - `readOnly`\n  - `keyMap`. To use Vim or Emacs keybindings in Monaco, you can use community plugins. Monaco Vim: https://github.com/brijeshb42/monaco-vim. Monaco Emacs: https://github.com/aioutecism/monaco-emacs\n  - `validationRules`. Use custom GraphQL worker, see https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql#custom-webworker-for-passing-non-static-config-to-worker.'\n\n> [!NOTE]\n>\n> If you used `query`, `variables` and `headers` in integration tests, you can use the new `initialQuery`,\n> `initialVariables` and `initialHeaders` props instead. These props will only be used for the first tab.\n> When opening more tabs, the operation editor will start out empty.\n\n- Added new props\n  - `initialQuery`\n  - `initialVariables`\n  - `initialHeaders`\n- feat: allow `children: ReactNode` for `<GraphiQL.Toolbar />` component\n\n---\n\n## `@graphiql/react`\n\n> [!IMPORTANT]\n>\n> Clicking on a reference in the operation editor now works by holding `Cmd` on macOS or `Ctrl` on Windows/Linux.\n\n- `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks are deprecated.\n- Add new `useGraphiQL` and `useGraphiQLActions` hooks instead. See updated [README](../../packages/graphiql-react/README.md#available-stores) for more details about them.\n- remove `useSynchronizeValue` hook\n- fix `defaultQuery` with empty string does not result in an empty default query\n- fix `defaultQuery`, when is set will only be used for the first tab. When opening more tabs, the operation editor will start out empty\n- fix execute query shortcut in operation editor, run it even there are no operations in the operation editor\n- fix plugin store, save last opened plugin in storage\n- remove `onClickReference` from variable editor\n- fix shortcut text per OS for default query and in run query in execute query button's tooltip\n\nThe `ToolbarMenu` component has changed.\n\n- The `label` and `className` props were removed\n- The `button` prop should now be a button element\n\n  ```jsx\n  <ToolbarMenu\n    label=\"Options\"\n    button={\n      <ToolbarButton label=\"Options\">\n        <SettingsIcon className=\"graphiql-toolbar-icon\" aria-hidden=\"true\" />\n      </ToolbarButton>\n    }\n  >\n    <ToolbarMenu.Item onSelect={() => console.log('Clicked!')}>\n      Test\n    </ToolbarMenu.Item>\n  </ToolbarMenu>\n  ```\n\n## `@graphiql/plugin-code-exporter`\n\n> [!WARNING]\n>\n> ⚠️ UMD build is removed. Switch to the [ESM CDN example](../../packages/graphiql-plugin-code-exporter/example/index.html).\n\n---\n\n## `@graphiql/plugin-explorer`\n\n> [!WARNING]\n>\n> ⚠️ UMD build is removed. Switch to the [ESM CDN example](../../examples/graphiql-cdn/index.html).\n\n---\n\n## @graphiql/plugin-doc-explorer\n\n- `useExplorerContext` hook is deprecated. Use new `useDocExplorer` and `useDocExplorerActions` hooks instead.\n- The shortcut to focus on the Doc Explorer search input is now `Cmd/Ctrl+Alt+K`\n  instead of the previous `Cmd/Ctrl+K`. This was changed because monaco-editor has\n  a built-in `Cmd/Ctrl+K` command.\n- push a field type on stack too before field\n- fix: show spinner in doc explorer based on `isIntrospecting` value, and not based on `isFetching`\n\n---\n\n## @graphiql/plugin-history\n\n- `useHistoryContext` hook is deprecated. Use new `useHistory` and `useHistoryActions` hooks instead.\n"
  },
  {
    "path": "docs/security/2021-introspection-schema-xss.md",
    "content": "- [1. GraphiQL introspection schema template injection attack: Advisory Statement](#1-graphiql-introspection-schema-template-injection-attack-advisory-statement)\n  - [1.1. Impact](#11-impact)\n  - [1.2. Scope](#12-scope)\n  - [1.3. Patches](#13-patches)\n  - [1.3.1 CDN bundle implementations may be automatically patched](#131-cdn-bundle-implementations-may-be-automatically-patched)\n  - [1.4. Workarounds for Older Versions](#14-workarounds-for-older-versions)\n  - [1.5. How to Re-create the Exploit](#15-how-to-re-create-the-exploit)\n  - [1.6. Credit](#16-credit)\n  - [1.7. References](#17-references)\n  - [1.8. For more information](#18-for-more-information)\n- [2. More Details on the Vulnerability](#2-more-details-on-the-vulnerability)\n- [3. Compromised introspection Schema Example](#3-compromised-introspection-schema-example)\n\n## 1. GraphiQL introspection schema template injection attack: Advisory Statement\n\nThis is a security advisory for an XSS vulnerability in `graphiql`.\n\nA similar vulnerability affects `graphql-playground`, a fork of `graphiql`.\nThere is a corresponding `graphql-playground`\n[advisory](https://github.com/graphql/graphql-playground/security/advisories/GHSA-59r9-6jp6-jcm7)\nand\n[Apollo Server advisory](https://github.com/apollographql/apollo-server/security/advisories/GHSA-qm7x-rc44-rrqw).\n\n### 1.1. Impact\n\nAll versions of `graphiql` older than\n[`graphiql@1.4.7`](https://github.com/graphql/graphiql/releases/tag/v1.4.7) are\nvulnerable to compromised HTTP schema introspection responses or `schema` prop\nvalues with malicious GraphQL type names, exposing a dynamic XSS attack surface\nthat can allow code injection on operation autocomplete.\n\nIn order for the attack to take place, the user must load a vulnerable schema in\n`graphiql`. There are a number of ways that can occur.\n\nBy default, the schema URL is _not_ attacker-controllable in `graphiql` or in\nits suggested implementations or examples, leaving only very complex attack\nvectors.\n\nIf a custom implementation of `graphiql`'s `fetcher` allows the schema URL to be\nset dynamically, such as a URL query parameter like `?endpoint=` in\n`graphql-playground`, or a database provided value, then this custom `graphiql`\nimplementation is _vulnerable to phishing attacks_, and thus much more readily\navailable, low or no privilege level xss attacks. The URLs could look like any\ngeneric looking graphql schema URL.\n\nBecause this exposes an XSS attack surface, it would be possible for a threat\nactor to exfiltrate user credentials, data, etc. using arbitrary malicious\nscripts, without it being known to the user.\n\n### 1.2. Scope\n\nThis advisory describes the impact on the `graphiql` package. The vulnerability\nalso affects other projects forked from `graphiql` such as\n[`graphql-playground`](https://github.com/graphql/graphql-playground/security/advisories/GHSA-59r9-6jp6-jcm7)\nand the `graphql-playground` fork distributed by Apollo Server. The impact is\nmore severe in the `graphql-playground` implementations; see the\n[`graphql-playground` advisory](https://github.com/graphql/graphql-playground/security/advisories/GHSA-59r9-6jp6-jcm7)\nand\n[Apollo Server advisory](https://github.com/apollographql/apollo-server/security/advisories/GHSA-qm7x-rc44-rrqw)\nfor details.\n\nThis vulnerability does not impact `codemirror-graphql`, `monaco-graphql` or\nother dependents, as it exists in `onHasCompletion.ts` in `graphiql`. It does\nimpact all forks of `graphiql`, and every released version of `graphiql`.\n\nIt should be noted that desktop clients such as Altair, Insomnia, Postwoman, do\nnot appear to be impacted by this.\n\n### 1.3. Patches\n\n`graphiql@1.4.7` addresses this issue via defense in depth.\n\n- **HTML-escaping text** that should be treated as text rather than HTML. In\n  most of the app, this happens automatically because React escapes all\n  interpolated text by default. However, one vulnerable component uses the\n  unsafe `innerHTML` API and interpolated type names directly into HTML. We now\n  properly escape that type name, which fixes the known vulnerability.\n\n- **Validates the schema** upon receiving the introspection response or schema\n  changes. Schemas with names that violate the GraphQL spec will no longer be\n  loaded. (This includes preventing the Doc Explorer from loading.) This change\n  is also sufficient to fix the known vulnerability. You can disable this\n  validation by setting `dangerouslyAssumeSchemaIsValid={true}`, which means you\n  are relying only on escaping values to protect you from this attack.\n\n- **Ensuring that user-generated HTML is safe**. Schemas can contain Markdown in\n  `description` and `deprecationReason` fields, and the web app renders them to\n  HTML using the `markdown-it` library. As part of the development of\n  `graphiql@1.4.7`, we verified that our use of `markdown-it` prevents the\n  inclusion of arbitrary HTML. We use `markdown-it` without setting\n  `html: true`, so we are comfortable relying on\n  [`markdown-it`'s HTML escaping](https://github.com/markdown-it/markdown-it/blob/master/docs/security.md)\n  here. We considered running a second level of sanitization over all rendered\n  Markdown using a library such as `dompurify` but believe that is unnecessary\n  as `markdown-it`'s sanitization appears to be adequate. `graphiql@1.4.7` does\n  update to the latest version of `markdown-it` (v12, from v10) so that any\n  security fixes in v11 and v12 will take effect.\n\n### 1.3.1 CDN bundle implementations may be automatically patched\n\nNote that if your implementation is depending on a CDN version of `graphiql`,\nand is pointed to the `latest` tag (usually the default for most cdns if no\nversion is specified) then this issue is already mitigated, in case you were\nvulnerable to it before.\n\n### 1.4. Workarounds for Older Versions\n\nIf you cannot use `graphiql@1.4.7` or later\n\n- Always use a static URL to a trusted server that is serving a trusted GraphQL\n  schema.\n\n- If you have a custom implementation that allows using user-provided schema\n  URLs via a query parameter, database value, etc, you must either disable this\n  customization, or only allow trusted URLs.\n\n### 1.5. How to Re-create the Exploit\n\nYou can see an example on\n[codesandbox](https://codesandbox.io/s/graphiql-xss-exploit-gr22f?file=/src/App.js).\nThese are both fixed to the last `graphiql` release `1.4.6` which is the last\nvulnerable release; however it would work with any previous release of\n`graphiql`.\n\nBoth of these examples are meant to demonstrate the phishing attack surface, so\nthey are customized to accept a `url` parameter. To demonstrate the phishing\nattack, add `?url=https://graphql-xss-schema.netlify.app/graphql` to the\nin-codesandbox browser.\n\nErase the contents of the given query and type `{u`. You will see an alert\nwindow open, showing that attacker-controlled code was executed.\n\nNote that when React is in development mode, a validation exception is thrown\nvisibly; however that exception is usually buried in the browser console in a\nproduction build of `graphiql`. This validation exception comes from\n`getDiagnostics`, which invokes `graphql` `validate()` which in turn will\n`assertValidSchema()`, as `apollo-server-core` does on executing each operation.\nThis validation does not prevent the exploit from being successful.\n\nNote that something like the `url` parameter is not required for the attack to\nhappen if `graphiql`'s `fetcher` is configured in a different way to communicate\nwith a compromised GraphQL server.\n\n### 1.6. Credit\n\nThis vulnerability was discovered by [@Ry0taK](https://github.com/Ry0taK), thank\nyou! :1st_place_medal:\n\nOthers who contributed:\n\n- [@imolorhe](https://github.com/imolorhe)\n- [@glasser](https://github.com/glasser)\n- [@divyenduz](https://github.com/divyenduz)\n- [@dotansimha](https://github.com/dotansimha)\n- [@acao](https://github.com/acao)\n- [@benjie](https://github.com/benjie) and many others who provided morale\n  support\n\n### 1.7. References\n\n**The vulnerability has always been present**\n\n[In the first commit](https://github.com/graphql/graphiql/commit/b9dec272d89d9c590727fd10d62e4a47e0317fc7#diff-855b77f6310b7e4fb1bcac779cd945092ed49fd759f4684ea391b45101166437R87)\n\n[And later moved to onHasCompletion.js in 2016](https://github.com/graphql/graphiql/commit/6701b0b626e43800e32413590a295e5c1e3d5419#diff-d45eb76aebcffd27d3a123214487116fa95e0b5a11d70a94a0ce3033ce09f879R110)\n(now `.ts` after the typescript migration)\n\n### 1.8. For more information\n\nIf you have any questions or comments about this advisory:\n\n- Open an issue in\n  [graphiql repo](https://github.com/graphql/graphiql/new/issues)\n\n## 2. More Details on the Vulnerability\n\nThis section provides more details in addition to the advisory.\n\nAn installation of the GraphiQL web app is vulnerable if two conditions are met:\n\n- The web app trusts information from its corresponding GraphQL server by\n  interpolating information such as GraphQL type names directly into HTML\n  instead of appropriately escaping or sanitizing the information.\n- The victim can load the web app in a way where it speaks to a GraphQL server\n  controlled by the attacker.\n\nAll versions of `graphiql` prior to 1.4.7 inappropriately trust type names\nprovided by the GraphQL server. They additionally rely on XSS filtering in the\n`markdown-it` package to try to protect themselves from XSS attacks in GraphQL\ndescriptions and deprecation reasons.\n\nBy default, `graphiql` does _not_ allow the attacker to control what GraphQL\nserver it speaks to. Therefore, many installations of `graphiql` are not\naffected by this advisory. Installations are only affected if the `fetcher`\nargument provided to GraphiQL allows arbitrary customization of the GraphQL\nendpoint (eg, reading a GraphQL URL from an URL parameter), or if the attacker\nhas another way of affecting the introspection schema returned by the GraphQL\nserver. (Note that `graphql-playground`, a project which started as a fork of\n`graphiql`, does this sort of URL parsing by default, so `graphql-playground`\ninstallations _are_ affected by a corresponding vulnerability in their default\nconfiguration.)\n\nOne example of \"another way of affecting the introspection schema\" would be if\nyou served `graphiql` as part of a PAAS platform that allows users to define\ntheir own GraphQL schemas. In this case, even though the `graphiql` installation\nmight be hard-wired to a single GraphQL endpoint, the attacker has control over\nthat GraphQL endpoint and could use it to inject scripts into `graphiql`. In\nthis case, your `graphiql` installation could be vulnerable if it responds to\nintrospection requests without first validating its schema. GraphQL servers can\nprevent this by refusing to execute operations (including introspection\noperations) on invalid schemas; any server built with `graphql-js` properly\nvalidates its schema prior to execution.\n\n## 3. Compromised introspection Schema Example\n\nYou can view the code for the exploited schema\n[on codesandbox](https://codesandbox.io/s/graphql-xss-compromised-schema-3wdq7?file=/src/bad-schema.js)\nor [in the repository](../../packages/graphiql/test/bad-schema.js)\n\nAs you can see, the introspection schema must contain items with a compromised\n`name` value. this could be fields, input object names, enum names, variable\nnames, etc any graphql\n[NamedType](https://github.com/graphql/graphql-spec/blob/main/spec/Section%202%20--%20Language.md#type-references)\nin the schema with it's name rendered in the autocomplete list.\n\n```json\n{\n  \"kind\": \"OBJECT\",\n  \"name\": \"<img src=x onerror=alert(document.domain)>\",\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  \"inputFields\": null,\n  \"interfaces\": [],\n  \"enumValues\": null,\n  \"possibleTypes\": null\n}\n```\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/.gitignore",
    "content": ".cache/\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/README.md",
    "content": "## Codemirror 6 Parcel Example\n\nThis example demonstrates how to transpile your own custom ES6 Codemirror 6\nGraphQL implementation with parcel bundler.\n\n### Setup\n\n1. `yarn` and `yarn start` from this folder to start parcel dev mode.\n1. `yarn build` to find production ready files.\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/package.json",
    "content": "{\n  \"name\": \"example-cm6-graphql-legacy-parcel\",\n  \"version\": \"0.0.0\",\n  \"license\": \"MIT\",\n  \"description\": \"GraphiQL Parcel Example\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"start\": \"parcel src/index.html -p 8080\",\n    \"build\": \"parcel build src/index.html --public-url /\"\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  \"dependencies\": {\n    \"@codemirror/basic-setup\": \"^0.20.0\",\n    \"@codemirror/language\": \"^0.20.0\",\n    \"codemirror-graphql\": \"^2.0.2\",\n    \"graphql\": \"^16.9.0\"\n  },\n  \"devDependencies\": {\n    \"parcel-bundler\": \"^1.12.4\",\n    \"worker-loader\": \"^2.0.0\",\n    \"typescript\": \"^4.6.3\"\n  }\n}\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/src/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <style>\n      body {\n        padding: 0;\n        margin: 0;\n        min-height: 100vh;\n      }\n      #root {\n        height: 100vh;\n      }\n    </style>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\" />\n    <title>CM6 GraphQL Editor Example</title>\n  </head>\n\n  <body>\n    <div id=\"editor\"></div>\n    <script src=\"./index.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/src/index.ts",
    "content": "import { EditorState, EditorView, basicSetup } from '@codemirror/basic-setup';\nimport { StreamLanguage } from '@codemirror/language';\nimport { graphql } from 'codemirror-graphql/cm6-legacy/mode';\nimport query from './sample-query';\n\nconst state = EditorState.create({\n  doc: query,\n  extensions: [basicSetup, StreamLanguage.define(graphql)],\n});\n\nnew EditorView({\n  state,\n  parent: document.querySelector('#editor')!,\n});\n\n// Hot Module Replacement\nif (module.hot) {\n  module.hot.accept();\n}\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/src/sample-query.ts",
    "content": "const query = /* GraphQL */ `\n  # Copyright (c) 2021 GraphQL Contributors\n  # All rights reserved.\n  #\n  # This source code is licensed under the BSD-style license found in the\n  # LICENSE file in the root directory of this source tree. An additional grant\n  # of patent rights can be found in the PATENTS file in the same directory.\n\n  query queryName($foo: TestInput, $site: TestEnum = RED) {\n    testAlias: hasArgs(string: \"testString\")\n    ... on Test {\n      hasArgs(\n        listEnum: [RED, GREEN, BLUE]\n        int: 1\n        listFloat: [1.23, 1.3e-1, -1.35384e+3]\n        boolean: true\n        id: 123\n        object: $foo\n        enum: $site\n      )\n    }\n    test @include(if: true) {\n      union {\n        __typename\n      }\n    }\n    ...frag\n    ... @skip(if: false) {\n      id\n    }\n    ... {\n      id\n    }\n  }\n\n  mutation mutationName {\n    setString(value: \"newString\")\n  }\n\n  subscription subscriptionName {\n    subscribeToTest(id: \"anId\") {\n      ... on Test {\n        id\n      }\n    }\n  }\n\n  fragment frag on Test {\n    test @include(if: true) {\n      union {\n        __typename\n      }\n    }\n  }\n`;\n\nexport default query;\n"
  },
  {
    "path": "examples/cm6-graphql-legacy-parcel/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"esnext\",\n    \"sourceMap\": true,\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react\"\n  },\n  \"include\": [\"src\"]\n}\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/.gitignore",
    "content": ".cache/\n.parcel-cache/\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/README.md",
    "content": "## Codemirror 6 Parcel Example\n\nThis example demonstrates how to transpile your own custom ES6 Codemirror 6\nGraphQL implementation with parcel bundler.\n\n### Setup\n\n1. `yarn` and `yarn start` from this folder to start parcel dev mode.\n1. `yarn build` to find production ready files.\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/package.json",
    "content": "{\n  \"name\": \"example-cm6-graphql-parcel\",\n  \"version\": \"0.0.0\",\n  \"license\": \"MIT\",\n  \"description\": \"GraphiQL Parcel Example\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"start\": \"parcel src/index.html -p 8080\",\n    \"build\": \"parcel build src/index.html --public-url /\",\n    \"build-demo\": \"yarn build && mkdirp ../../packages/graphiql/cm6 && cp -r dist ../../packages/graphiql/cm6/\"\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  \"dependencies\": {\n    \"@codemirror/autocomplete\": \"6.0.0\",\n    \"@codemirror/commands\": \"6.0.0\",\n    \"@codemirror/language\": \"6.0.0\",\n    \"@codemirror/state\": \"6.1.0\",\n    \"@codemirror/theme-one-dark\": \"6.0.0\",\n    \"@codemirror/view\": \"6.1.2\",\n    \"cm6-graphql\": \"0.0.1\",\n    \"graphql\": \"^16.9.0\"\n  },\n  \"devDependencies\": {\n    \"parcel\": \"^2.6.2\",\n    \"worker-loader\": \"^2.0.0\",\n    \"typescript\": \"^4.6.3\"\n  },\n  \"resolutions\": {\n    \"**/@codemirror/autocomplete\": \"6.0.0\",\n    \"**/@codemirror/commands\": \"6.0.0\",\n    \"**/@codemirror/view\": \"6.1.2\",\n    \"**/@codemirror/state\": \"6.1.0\",\n    \"**/@codemirror/language\": \"6.0.0\"\n  }\n}\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/src/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <style>\n      body {\n        padding: 0;\n        margin: 0;\n        min-height: 100vh;\n      }\n      #root {\n        height: 100vh;\n      }\n    </style>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\" />\n    <title>Code Mirror 6 GraphQL Editor Example</title>\n  </head>\n\n  <body>\n    <div id=\"editor\"></div>\n    <script type=\"module\" src=\"./index.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/src/index.ts",
    "content": "import { EditorState } from '@codemirror/state';\nimport { EditorView, lineNumbers } from '@codemirror/view';\nimport { history } from '@codemirror/commands';\nimport { autocompletion, closeBrackets } from '@codemirror/autocomplete';\nimport { bracketMatching, syntaxHighlighting } from '@codemirror/language';\nimport { oneDarkHighlightStyle, oneDark } from '@codemirror/theme-one-dark';\nimport { graphql } from 'cm6-graphql';\nimport query from './sample-query';\nimport { TestSchema } from './testSchema';\n\nconst state = EditorState.create({\n  doc: query,\n  extensions: [\n    bracketMatching(),\n    closeBrackets(),\n    history(),\n    autocompletion(),\n    lineNumbers(),\n    oneDark,\n    syntaxHighlighting(oneDarkHighlightStyle),\n    graphql(TestSchema, {\n      onShowInDocs(field, type, parentType) {\n        alert(\n          `Showing in docs.: Field: ${field}, Type: ${type}, ParentType: ${parentType}`,\n        );\n      },\n      onFillAllFields(view, schema, _query, cursor, token) {\n        alert(`Filling all fields. Token: ${token}`);\n      },\n    }),\n  ],\n});\n\nnew EditorView({\n  state,\n  parent: document.querySelector('#editor')!,\n});\n\n// Hot Module Replacement\nif (module.hot) {\n  module.hot.accept();\n}\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/src/sample-query.ts",
    "content": "const query = /* GraphQL */ `\n  # Copyright (c) 2021 GraphQL Contributors\n  # All rights reserved.\n  #\n  # This source code is licensed under the BSD-style license found in the\n  # LICENSE file in the root directory of this source tree. An additional grant\n  # of patent rights can be found in the PATENTS file in the same directory.\n\n  query queryName($foo: TestInput, $site: TestEnum = RED) {\n    testAlias: hasArgs(string: \"testString\")\n    ... on Test {\n      hasArgs(\n        listEnum: [RED, GREEN, BLUE]\n        int: 1\n        listFloat: [1.23, 1.3e-1, -1.35384e+3]\n        boolean: true\n        id: 123\n        object: $foo\n        enum: $site\n      )\n    }\n    test @include(if: true) {\n      union {\n        __typename\n      }\n    }\n    ...frag\n    ... @skip(if: false) {\n      id\n    }\n    ... {\n      id\n    }\n  }\n\n  mutation mutationName {\n    setString(value: \"newString\")\n  }\n\n  subscription subscriptionName {\n    subscribeToTest(id: \"anId\") {\n      ... on Test {\n        id\n      }\n    }\n  }\n\n  fragment frag on Test {\n    test @include(if: true) {\n      union {\n        __typename\n      }\n    }\n  }\n`;\n\nexport default query;\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/src/testSchema.ts",
    "content": "/* istanbul ignore file */\n/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport {\n  DirectiveLocation,\n  GraphQLBoolean,\n  GraphQLDeprecatedDirective,\n  GraphQLDirective,\n  GraphQLEnumType,\n  GraphQLFloat,\n  GraphQLID,\n  GraphQLIncludeDirective,\n  GraphQLInputObjectType,\n  GraphQLInt,\n  GraphQLInterfaceType,\n  GraphQLList,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQLSkipDirective,\n  GraphQLString,\n  GraphQLUnionType,\n} from 'graphql';\n\n// Test Schema\n\nexport const TestEnum = new GraphQLEnumType({\n  name: 'TestEnum',\n  values: {\n    RED: {},\n    GREEN: {},\n    BLUE: {},\n  },\n});\n\nexport const TestInputObject: GraphQLInputObjectType =\n  new GraphQLInputObjectType({\n    name: 'TestInput',\n    fields: () => ({\n      string: { type: GraphQLString },\n      int: { type: GraphQLInt },\n      float: { type: GraphQLFloat },\n      boolean: { type: GraphQLBoolean },\n      id: { type: GraphQLID },\n      enum: { type: TestEnum },\n      object: { type: TestInputObject },\n      // List\n      listString: { type: new GraphQLList(GraphQLString) },\n      listInt: { type: new GraphQLList(GraphQLInt) },\n      listFloat: { type: new GraphQLList(GraphQLFloat) },\n      listBoolean: { type: new GraphQLList(GraphQLBoolean) },\n      listID: { type: new GraphQLList(GraphQLID) },\n      listEnum: { type: new GraphQLList(TestEnum) },\n      listObject: { type: new GraphQLList(TestInputObject) },\n    }),\n  });\n\nconst TestInterface: GraphQLInterfaceType = new GraphQLInterfaceType({\n  name: 'TestInterface',\n  resolveType: () => UnionFirst,\n  fields: {\n    scalar: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n  },\n});\n\nconst AnotherTestInterface: GraphQLInterfaceType = new GraphQLInterfaceType({\n  name: 'AnotherTestInterface',\n  resolveType: () => UnionFirst,\n  fields: {\n    example: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n  },\n});\n\nexport const UnionFirst = new GraphQLObjectType({\n  name: 'First',\n  interfaces: [TestInterface, AnotherTestInterface],\n  fields: () => ({\n    scalar: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n    first: {\n      type: TestType,\n      resolve: () => ({}),\n    },\n    example: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n  }),\n});\n\nexport const UnionSecond = new GraphQLObjectType({\n  name: 'Second',\n  fields: () => ({\n    second: {\n      type: TestType,\n      resolve: () => ({}),\n    },\n  }),\n});\n\nexport const TestUnion = new GraphQLUnionType({\n  name: 'TestUnion',\n  types: [UnionFirst, UnionSecond],\n  resolveType() {\n    return UnionFirst;\n  },\n});\n\nexport const TestType: GraphQLObjectType = new GraphQLObjectType({\n  name: 'Test',\n  fields: () => ({\n    test: {\n      type: TestType,\n      resolve: () => ({}),\n    },\n    deprecatedTest: {\n      type: TestType,\n      deprecationReason: 'Use test instead.',\n      resolve: () => ({}),\n    },\n    union: {\n      type: TestUnion,\n      resolve: () => ({}),\n    },\n    first: {\n      type: UnionFirst,\n      resolve: () => ({}),\n    },\n    id: {\n      type: GraphQLInt,\n      resolve: () => ({}),\n    },\n    isTest: {\n      type: GraphQLBoolean,\n      resolve() {\n        return true;\n      },\n    },\n    hasArgs: {\n      type: GraphQLString,\n      resolve(_value, args) {\n        return JSON.stringify(args);\n      },\n      args: {\n        string: { type: GraphQLString },\n        int: { type: GraphQLInt },\n        float: { type: GraphQLFloat },\n        boolean: { type: GraphQLBoolean },\n        id: { type: GraphQLID },\n        enum: { type: TestEnum },\n        object: { type: TestInputObject },\n        // List\n        listString: { type: new GraphQLList(GraphQLString) },\n        listInt: { type: new GraphQLList(GraphQLInt) },\n        listFloat: { type: new GraphQLList(GraphQLFloat) },\n        listBoolean: { type: new GraphQLList(GraphQLBoolean) },\n        listID: { type: new GraphQLList(GraphQLID) },\n        listEnum: { type: new GraphQLList(TestEnum) },\n        listObject: { type: new GraphQLList(TestInputObject) },\n      },\n    },\n  }),\n});\n\nconst TestMutationType = new GraphQLObjectType({\n  name: 'MutationType',\n  description: 'This is a simple mutation type',\n  fields: {\n    setString: {\n      type: GraphQLString,\n      description: 'Set the string field',\n      args: {\n        value: { type: GraphQLString },\n      },\n    },\n  },\n});\n\nconst TestSubscriptionType = new GraphQLObjectType({\n  name: 'SubscriptionType',\n  description: 'This is a simple subscription type',\n  fields: {\n    subscribeToTest: {\n      type: TestType,\n      description: 'Subscribe to the test type',\n      args: {\n        id: { type: GraphQLString },\n      },\n    },\n  },\n});\n\nconst OnArgDirective = new GraphQLDirective({\n  name: 'onArg',\n  locations: [DirectiveLocation.ARGUMENT_DEFINITION],\n});\n\nconst OnAllDefsDirective = new GraphQLDirective({\n  name: 'onAllDefs',\n  locations: [\n    DirectiveLocation.SCHEMA,\n    DirectiveLocation.SCALAR,\n    DirectiveLocation.OBJECT,\n    DirectiveLocation.FIELD_DEFINITION,\n    DirectiveLocation.INTERFACE,\n    DirectiveLocation.UNION,\n    DirectiveLocation.ENUM,\n    DirectiveLocation.ENUM_VALUE,\n    DirectiveLocation.INPUT_OBJECT,\n    DirectiveLocation.ARGUMENT_DEFINITION,\n    DirectiveLocation.INPUT_FIELD_DEFINITION,\n  ],\n});\n\nexport const TestSchema = new GraphQLSchema({\n  query: TestType,\n  mutation: TestMutationType,\n  subscription: TestSubscriptionType,\n  directives: [\n    GraphQLIncludeDirective,\n    GraphQLSkipDirective,\n    GraphQLDeprecatedDirective,\n    OnArgDirective,\n    OnAllDefsDirective,\n  ],\n});\n"
  },
  {
    "path": "examples/cm6-graphql-parcel/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"esnext\",\n    \"sourceMap\": true,\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react\"\n  },\n  \"include\": [\"src\"]\n}\n"
  },
  {
    "path": "examples/graphiql-cdn/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [0.0.8](https://github.com/graphql/graphiql/compare/example-graphiql-cdn@0.0.8-alpha.6...example-graphiql-cdn@0.0.8) (2020-06-11)\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n## [0.0.8-alpha.6](https://github.com/graphql/graphiql/compare/example-graphiql-cdn@0.0.8-alpha.5...example-graphiql-cdn@0.0.8-alpha.6) (2020-06-04)\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n## [0.0.8-alpha.5](https://github.com/graphql/graphiql/compare/example-graphiql-cdn@0.0.8-alpha.4...example-graphiql-cdn@0.0.8-alpha.5) (2020-04-10)\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n## [0.0.8-alpha.4](https://github.com/graphql/graphiql/compare/example-graphiql-cdn@0.0.8-alpha.3...example-graphiql-cdn@0.0.8-alpha.4) (2020-04-10)\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n## [0.0.8-alpha.3](https://github.com/graphql/graphiql/compare/example-graphiql-cdn@0.0.8-alpha.2...example-graphiql-cdn@0.0.8-alpha.3) (2020-03-20)\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n## [0.0.8-alpha.2](https://github.com/graphql/graphiql/compare/example-graphiql-cdn@0.0.8-alpha.0...example-graphiql-cdn@0.0.8-alpha.2) (2020-03-20)\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n**Note:** Version bump only for package example-graphiql-cdn\n\n## 0.0.8-alpha.1 (2020-01-18)\n\n## [0.0.7](https://github.com/graphql/graphiql/compare/graphiql-example-cdn@0.0.6...graphiql-example-cdn@0.0.7) (2019-12-03)\n\n**Note:** Version bump only for package graphiql-example-cdn\n\n## [0.0.6](https://github.com/graphql/graphiql/compare/graphiql-example-cdn@0.0.5...graphiql-example-cdn@0.0.6) (2019-11-26)\n\n**Note:** Version bump only for package graphiql-example-cdn\n\n## [0.0.5](https://github.com/graphql/graphiql/compare/graphiql-example-cdn@0.0.4...graphiql-example-cdn@0.0.5) (2019-10-19)\n\n**Note:** Version bump only for package graphiql-example-cdn\n"
  },
  {
    "path": "examples/graphiql-cdn/README.md",
    "content": "# GraphiQL CDN Example\n\nThis is a simple example of using **GraphiQL** directly from a CDN, including the [GraphiQL Explorer plugin](../../packages/graphiql-plugin-explorer/README.md).\n\nIt loads the latest GraphiQL version from [esm.sh](https://esm.sh), an ESM-based CDN that serves npm packages as ES modules.\n\n## Setup\n\nNo installation or build step is required — just open the `index.html` file in your browser:\n\n- macOS:\n\n  ```sh\n  open index.html\n  ```\n\n- Linux:\n\n  ```sh\n  firefox index.html\n  # or\n  chromium index.html\n  ```\n"
  },
  {
    "path": "examples/graphiql-cdn/index.html",
    "content": "<!--\n *  Copyright (c) 2025 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n-->\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>GraphiQL 5 with React 19 and GraphiQL Explorer</title>\n    <style>\n      body {\n        margin: 0;\n      }\n\n      #graphiql {\n        height: 100dvh;\n      }\n\n      .loading {\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 4rem;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"https://esm.sh/graphiql/dist/style.css\" />\n    <link\n      rel=\"stylesheet\"\n      href=\"https://esm.sh/@graphiql/plugin-explorer/dist/style.css\"\n    />\n    <!--\n     * Note:\n     * The ?standalone flag bundles the module along with all of its `dependencies`, excluding `peerDependencies`, into a single JavaScript file.\n     * `@emotion/is-prop-valid` is a shim to remove the console error ` module \"@emotion /is-prop-valid\" not found`. Upstream issue: https://github.com/motiondivision/motion/issues/3126\n    -->\n    <script type=\"importmap\">\n      {\n        \"imports\": {\n          \"react\": \"https://esm.sh/react@19.1.0\",\n          \"react/\": \"https://esm.sh/react@19.1.0/\",\n\n          \"react-dom\": \"https://esm.sh/react-dom@19.1.0\",\n          \"react-dom/\": \"https://esm.sh/react-dom@19.1.0/\",\n\n          \"graphiql\": \"https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql\",\n          \"graphiql/\": \"https://esm.sh/graphiql/\",\n          \"@graphiql/plugin-explorer\": \"https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql\",\n          \"@graphiql/react\": \"https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql,@graphiql/toolkit,@emotion/is-prop-valid\",\n\n          \"@graphiql/toolkit\": \"https://esm.sh/@graphiql/toolkit?standalone&external=graphql\",\n          \"graphql\": \"https://esm.sh/graphql@16.11.0\",\n          \"@emotion/is-prop-valid\": \"data:text/javascript,\"\n        }\n      }\n    </script>\n    <script type=\"module\">\n      import React from 'react';\n      import ReactDOM from 'react-dom/client';\n      import { GraphiQL, HISTORY_PLUGIN } from 'graphiql';\n      import { createGraphiQLFetcher } from '@graphiql/toolkit';\n      import { explorerPlugin } from '@graphiql/plugin-explorer';\n      import 'graphiql/setup-workers/esm.sh';\n\n      const fetcher = createGraphiQLFetcher({\n        url: 'https://countries.trevorblades.com',\n      });\n      const plugins = [HISTORY_PLUGIN, explorerPlugin()];\n\n      function App() {\n        return React.createElement(GraphiQL, {\n          fetcher,\n          plugins,\n          defaultEditorToolsVisibility: true,\n        });\n      }\n\n      const container = document.getElementById('graphiql');\n      const root = ReactDOM.createRoot(container);\n      root.render(React.createElement(App));\n    </script>\n  </head>\n  <body>\n    <div id=\"graphiql\">\n      <div class=\"loading\">Loading…</div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/graphiql-cdn/package.json",
    "content": "{\n  \"name\": \"example-graphiql-cdn\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"description\": \"An example using GraphiQL\",\n  \"scripts\": {\n    \"build-demo\": \"copy index.html ../../packages/graphiql/cdn/\"\n  }\n}\n"
  },
  {
    "path": "examples/graphiql-create-react-app/README.md",
    "content": "# GraphiQL `create-react-app` Example\n\n> [!WARNING]\n>\n> This example has been removed. You can find its last version [here](https://github.com/graphql/graphiql/tree/3b93d27f7568d93db5cd146157220b127eeea737/examples/graphiql-create-react-app).\n> We recommend using the [GraphiQL Vite](../graphiql-vite) or [GraphiQL Next.js](../graphiql-nextjs) examples instead.\n"
  },
  {
    "path": "examples/graphiql-nextjs/README.md",
    "content": "This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n# or\nbun dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.\n"
  },
  {
    "path": "examples/graphiql-nextjs/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/app/api-reference/config/typescript for more information.\n"
  },
  {
    "path": "examples/graphiql-nextjs/next.config.ts",
    "content": "import type { NextConfig } from 'next';\n\nconst nextConfig: NextConfig = {\n  /* config options here */\n};\n\nexport default nextConfig;\n"
  },
  {
    "path": "examples/graphiql-nextjs/package.json",
    "content": "{\n  \"name\": \"example-graphiql-nextjs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"next\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"graphiql\": \"^5.0.0-rc.0\",\n    \"next\": \"15.4.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^20\",\n    \"@types/react\": \"^19\",\n    \"@types/react-dom\": \"^19\",\n    \"typescript\": \"^5\"\n  }\n}\n"
  },
  {
    "path": "examples/graphiql-nextjs/src/app/globals.css",
    "content": "body {\n  margin: 0;\n}\n\n.graphiql-container {\n  height: 100dvh !important;\n}\n"
  },
  {
    "path": "examples/graphiql-nextjs/src/app/graphiql.tsx",
    "content": "'use client';\n\nimport type { FC } from 'react';\nimport { GraphiQL } from 'graphiql';\nimport 'graphiql/setup-workers/webpack';\nimport 'graphiql/style.css';\n\nasync function fetcher(graphQLParams: Record<string, unknown>) {\n  const response = await fetch('https://graphql.earthdata.nasa.gov/api', {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(graphQLParams),\n  });\n  return response.json();\n}\n\nexport const GraphiQLPage: FC = () => {\n  return <GraphiQL fetcher={fetcher} />;\n};\n"
  },
  {
    "path": "examples/graphiql-nextjs/src/app/layout.tsx",
    "content": "import type { FC, ReactNode } from 'react';\nimport type { Metadata } from 'next';\nimport './globals.css';\n\nexport const metadata: Metadata = {\n  description: 'Example of using GraphiQL with the Next.js App Router',\n  // Empty object adds open graph and twitter meta-tags\n  openGraph: {},\n};\n\nconst RootLayout: FC<Readonly<{ children: ReactNode }>> = ({ children }) => {\n  return (\n    <html lang=\"en\">\n      <body>{children}</body>\n    </html>\n  );\n};\n\nexport default RootLayout;\n"
  },
  {
    "path": "examples/graphiql-nextjs/src/app/page.ts",
    "content": "import type { Metadata } from 'next';\n\nexport { GraphiQLPage as default } from './graphiql';\n\nexport const metadata: Metadata = {\n  title: 'GraphiQL Next.js Example',\n};\n"
  },
  {
    "path": "examples/graphiql-nextjs/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2017\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": 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    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ]\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "examples/graphiql-parcel/README.md",
    "content": "# GraphiQL Parcel Example\n\n> [!WARNING]\n>\n> This example has been removed. You can find its last version [here](https://github.com/graphql/graphiql/tree/3b93d27f7568d93db5cd146157220b127eeea737/examples/graphiql-parcel).\n> We recommend using the [GraphiQL Vite](../graphiql-vite) or [GraphiQL Next.js](../graphiql-nextjs) examples instead.\n"
  },
  {
    "path": "examples/graphiql-vite/README.md",
    "content": "# GraphiQL Vite Example\n\nThis example demonstrates how to use GraphiQL with Vite.\n\n## Setup\n\n1. `yarn dev` to start Vite dev server.\n1. `yarn build` to build production ready transpiled files. Find the output in `dist` folder.\n"
  },
  {
    "path": "examples/graphiql-vite/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=\"/favicon.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>GraphiQL Vite Example</title>\n    <style>\n      body {\n        margin: 0;\n      }\n\n      #graphiql {\n        height: 100dvh;\n      }\n\n      .loading {\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 4rem;\n      }\n    </style>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"graphiql\">\n      <div class=\"loading\">Loading…</div>\n    </div>\n    <script type=\"module\" src=\"/src/index.jsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/graphiql-vite/package.json",
    "content": "{\n  \"name\": \"example-graphiql-vite\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"graphiql\": \"^5.2.2\",\n    \"graphql\": \"^16.11.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\"\n  },\n  \"devDependencies\": {\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-monaco-editor\": \"^1.1.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start\": \"vite preview\"\n  }\n}\n"
  },
  {
    "path": "examples/graphiql-vite/src/App.jsx",
    "content": "import { GraphiQL } from 'graphiql';\nimport 'graphiql/style.css';\n\nasync function fetcher(graphQLParams) {\n  const response = await fetch('https://graphql.earthdata.nasa.gov/api', {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(graphQLParams),\n  });\n  return response.json();\n}\n\nfunction App() {\n  return <GraphiQL fetcher={fetcher} />;\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/graphiql-vite/src/index.jsx",
    "content": "import { createRoot } from 'react-dom/client';\nimport App from './App';\n\nconst root = createRoot(document.getElementById('graphiql'));\nroot.render(<App />);\n"
  },
  {
    "path": "examples/graphiql-vite/vite.config.mjs",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport $monacoEditorPlugin from 'vite-plugin-monaco-editor';\n\nconst monacoEditorPlugin = $monacoEditorPlugin.default ?? $monacoEditorPlugin;\n\nexport default defineConfig({\n  plugins: [\n    react(),\n    monacoEditorPlugin({\n      languageWorkers: ['editorWorkerService', 'json'],\n      customWorkers: [\n        {\n          label: 'graphql',\n          entry: 'monaco-graphql/esm/graphql.worker.js',\n        },\n      ],\n    }),\n  ],\n});\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/README.md",
    "content": "# Usage GraphiQL with Vite, React Router and `ssr: true`\n\nWhen using GraphiQL with [React Router’s SSR mode](https://reactrouter.com/api/framework-conventions/react-router.config.ts#ssr),\nyou need to mark the GraphiQL component as a [client module](https://reactrouter.com/api/framework-conventions/client-modules)\nby adding `.client` to the file name.\n\n```tsx\n// graphiql.client.tsx\nimport { GraphiQL } from 'graphiql';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst fetcher = createGraphiQLFetcher({ url: 'https://my.backend/graphql' });\n\nexport const graphiql = <GraphiQL fetcher={fetcher} />;\n```\n\n```ts\n// route.ts\nimport type { FC } from 'react';\nimport type { LinksFunction, MetaFunction } from 'react-router';\nimport graphiqlStyles from 'graphiql/style.css?url';\nimport { graphiql } from './graphiql.client';\n\nexport const meta: MetaFunction = () => {\n  return [{ title: 'API Explorer' }];\n};\n\nexport const links: LinksFunction = () => {\n  return [{ rel: 'stylesheet', href: graphiqlStyles }];\n};\n\nconst Route: FC = () => {\n  return graphiql;\n};\n\nexport default Route;\n```\n\n## Setup\n\n1. `yarn dev` to start Vite dev server.\n1. `yarn build` to build production ready transpiled files. Find the output in `dist` folder.\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/app/root.tsx",
    "content": "import type { FC } from 'react';\nimport { Links, Meta, Outlet, Scripts, ScrollRestoration } from 'react-router';\n\nconst Root: FC = () => {\n  return (\n    <html lang=\"en\">\n      <head>\n        <meta charSet=\"utf-8\" />\n        <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n        <Meta />\n        <Links />\n      </head>\n      <body>\n        <noscript>You need to enable JavaScript to run this app.</noscript>\n        <Outlet />\n        <ScrollRestoration />\n        <Scripts />\n      </body>\n    </html>\n  );\n};\n\nexport default Root;\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/app/routes/_index/create-fetcher.ts",
    "content": "import type { GraphiQLProps } from 'graphiql';\n\nexport function createFetcher(apiUrl: string): GraphiQLProps['fetcher'] {\n  return async function (graphQLParams, opts) {\n    const response = await fetch(apiUrl, {\n      method: 'POST',\n      headers: {\n        ...opts?.headers,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(graphQLParams),\n    });\n\n    return response.json();\n  };\n}\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/app/routes/_index/globals.css",
    "content": "body {\n  margin: 0;\n}\n\n.graphiql-container {\n  height: 100dvh;\n}\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/app/routes/_index/graphiql.client.tsx",
    "content": "import type { FC } from 'react';\nimport { GraphiQL } from 'graphiql';\nimport { ToolbarButton, useGraphiQL } from '@graphiql/react';\nimport { createFetcher } from './create-fetcher';\nimport 'graphiql/setup-workers/esm.sh';\n\nexport const graphiql = (\n  <GraphiQL\n    dangerouslyAssumeSchemaIsValid\n    defaultEditorToolsVisibility=\"variables\"\n    fetcher={createFetcher('https://graphql.earthdata.nasa.gov/api')}\n    isHeadersEditorEnabled={false}\n  >\n    <GraphiQL.Logo>API Explorer</GraphiQL.Logo>\n    <GraphiQL.Toolbar>\n      {({ prettify, copy, merge }) => (\n        <>\n          {prettify}\n          {copy}\n          {merge}\n          <Button />\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n);\n\nconst Button: FC = () => {\n  const { queryEditor, variableEditor } = useGraphiQL(state => ({\n    queryEditor: state.queryEditor,\n    variableEditor: state.variableEditor,\n  }));\n\n  async function onShareExplorer(): Promise<void> {\n    const shareableURL = new URL('/explorer', location.origin);\n    const operations = queryEditor!.getValue();\n    const variables = variableEditor!.getValue();\n    if (operations) {\n      shareableURL.searchParams.set('query', encodeURIComponent(operations));\n    }\n    if (variables) {\n      shareableURL.searchParams.set('variables', encodeURIComponent(variables));\n    }\n    const url = shareableURL.toString();\n    await navigator.clipboard.writeText(url);\n  }\n\n  return (\n    <ToolbarButton\n      label=\"Share your Explorer query\"\n      onClick={onShareExplorer}\n      style={{ textAlign: 'center' }}\n      title=\"Share your Explorer query\"\n    >\n      S\n    </ToolbarButton>\n  );\n};\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/app/routes/_index/route.ts",
    "content": "import type { FC } from 'react';\nimport type { LinksFunction, MetaFunction } from 'react-router';\nimport { graphiql } from './graphiql.client';\nimport graphiqlCss from 'graphiql/style.css?url';\nimport globalsCss from './globals.css?url';\n\nexport const meta: MetaFunction = () => {\n  return [{ title: 'API Explorer' }];\n};\n\nexport const links: LinksFunction = () => {\n  return [\n    { rel: 'stylesheet', href: graphiqlCss },\n    { rel: 'stylesheet', href: globalsCss },\n  ];\n};\n\nconst Route: FC = () => graphiql;\n\nexport default Route;\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/app/routes.ts",
    "content": "import { flatRoutes } from '@react-router/fs-routes';\n\nexport default flatRoutes();\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/package.json",
    "content": "{\n  \"name\": \"example-graphiql-vite-react-router\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"react-router build\",\n    \"dev\": \"react-router dev --port 4000\",\n    \"start\": \"react-router-serve dist/server/index.js\"\n  },\n  \"dependencies\": {\n    \"@graphiql/react\": \"0.37.3\",\n    \"@react-router/fs-routes\": \"7.6.3\",\n    \"@react-router/node\": \"7.6.3\",\n    \"@react-router/serve\": \"7.6.3\",\n    \"graphiql\": \"5.2.2\",\n    \"isbot\": \"^5\",\n    \"react\": \"19.1.0\",\n    \"react-dom\": \"19.1.0\",\n    \"react-router\": \"7.6.3\"\n  },\n  \"devDependencies\": {\n    \"@react-router/dev\": \"7.6.3\",\n    \"@types/node\": \"22.15.34\",\n    \"@types/react\": \"19.1.8\",\n    \"typescript\": \"5.8.3\",\n    \"vite\": \"7.0.4\"\n  }\n}\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/public/robots.txt",
    "content": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow: /\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/react-router.config.ts",
    "content": "import type { Config } from '@react-router/dev/config';\n\nconst config: Config = {\n  ssr: true,\n  buildDirectory: 'dist',\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"jsx\": \"react-jsx\",\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"baseUrl\": \"./\",\n    \"rootDirs\": [\"./\", \"./.react-router/types\"],\n    \"types\": [\"@react-router/node\", \"node\", \"vite/client\"],\n    \"resolveJsonModule\": true,\n    \"allowJs\": true,\n    \"inlineSourceMap\": true,\n    \"noEmit\": true,\n    \"inlineSources\": true,\n    \"isolatedModules\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noImplicitReturns\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noImplicitOverride\": true,\n    \"noPropertyAccessFromIndexSignature\": true,\n    \"allowUnusedLabels\": false,\n    \"allowUnreachableCode\": false,\n    \"skipDefaultLibCheck\": true,\n    \"skipLibCheck\": true\n  },\n  \"include\": [\".react-router/types/**/*\", \"**/*.ts\", \"**/*.tsx\"]\n}\n"
  },
  {
    "path": "examples/graphiql-vite-react-router/vite.config.ts",
    "content": "import { reactRouter } from '@react-router/dev/vite';\n\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n  plugins: [reactRouter()],\n});\n"
  },
  {
    "path": "examples/graphiql-webpack/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.1.1-alpha.8](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.7...example-graphiql-webpack@1.1.1-alpha.8) (2021-01-07)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.7](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.6...example-graphiql-webpack@1.1.1-alpha.7) (2021-01-07)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.6](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.5...example-graphiql-webpack@1.1.1-alpha.6) (2021-01-07)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.5](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.4...example-graphiql-webpack@1.1.1-alpha.5) (2021-01-03)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.4](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.3...example-graphiql-webpack@1.1.1-alpha.4) (2020-12-28)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.3](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.2...example-graphiql-webpack@1.1.1-alpha.3) (2020-08-26)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.2](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.1...example-graphiql-webpack@1.1.1-alpha.2) (2020-08-22)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.1](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.1-alpha.0...example-graphiql-webpack@1.1.1-alpha.1) (2020-08-12)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n## [1.1.1-alpha.0](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.1.0...example-graphiql-webpack@1.1.1-alpha.0) (2020-08-10)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.1.0](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0...example-graphiql-webpack@1.1.0) (2020-08-06)\n\n### Features\n\n- [RFC] GraphiQL rewrite for monaco editor, react context and redesign, i18n ([#1523](https://github.com/graphql/graphiql/issues/1523)) ([ad730cd](https://github.com/graphql/graphiql/commit/ad730cdc2e3cb7216d821a01725c60475989ee20))\n\n# [1.0.0](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.13...example-graphiql-webpack@1.0.0) (2020-06-11)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.13](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.12...example-graphiql-webpack@1.0.0-alpha.13) (2020-06-04)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.12](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.11...example-graphiql-webpack@1.0.0-alpha.12) (2020-06-04)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.11](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.10...example-graphiql-webpack@1.0.0-alpha.11) (2020-05-28)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.10](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.9...example-graphiql-webpack@1.0.0-alpha.10) (2020-05-19)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.9](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.8...example-graphiql-webpack@1.0.0-alpha.9) (2020-05-17)\n\n### Features\n\n- introduce proper vscode completion kinds ([#1488](https://github.com/graphql/graphiql/issues/1488)) ([f19aa0d](https://github.com/graphql/graphiql/commit/f19aa0ddde6109526c101c8a487f43bbb8238394))\n\n# [1.0.0-alpha.8](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.7...example-graphiql-webpack@1.0.0-alpha.8) (2020-04-10)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.7](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.6...example-graphiql-webpack@1.0.0-alpha.7) (2020-04-10)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.6](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.5...example-graphiql-webpack@1.0.0-alpha.6) (2020-04-10)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.5](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.4...example-graphiql-webpack@1.0.0-alpha.5) (2020-04-06)\n\n### Features\n\n- upgrade to graphql@15.0.0 for [#1191](https://github.com/graphql/graphiql/issues/1191) ([#1204](https://github.com/graphql/graphiql/issues/1204)) ([f13c8e9](https://github.com/graphql/graphiql/commit/f13c8e9d0e66df4b051b332c7d02f4bb83e07ffd))\n\n# [1.0.0-alpha.4](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.3...example-graphiql-webpack@1.0.0-alpha.4) (2020-04-03)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.3](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.2...example-graphiql-webpack@1.0.0-alpha.3) (2020-03-20)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# [1.0.0-alpha.2](https://github.com/graphql/graphiql/compare/example-graphiql-webpack@1.0.0-alpha.0...example-graphiql-webpack@1.0.0-alpha.2) (2020-03-20)\n\n**Note:** Version bump only for package example-graphiql-webpack\n\n# 1.0.0-alpha.1 (2020-01-18)\n\n### Features\n\n- deprecate support for 15, support react 16 features ([#1107](https://github.com/graphql/graphiql/issues/1107)) ([bc4b6fc](https://github.com/graphql/graphiql/commit/bc4b6fc))\n\n### BREAKING CHANGES\n\n- Deprecate support for React 15. Please use React 16.8 or greater for hooks support. Co-authored-by: @ryan-m-walker, @acao Reviewed-by: @benjie\n\n## [0.0.10](https://github.com/graphql/graphiql/compare/graphiql-example-webpack@0.0.9...graphiql-example-webpack@0.0.10) (2019-12-09)\n\n**Note:** Version bump only for package graphiql-example-webpack\n\n## [0.0.9](https://github.com/graphql/graphiql/compare/graphiql-example-webpack@0.0.8...graphiql-example-webpack@0.0.9) (2019-12-09)\n\n**Note:** Version bump only for package graphiql-example-webpack\n\n## [0.0.8](https://github.com/graphql/graphiql/compare/graphiql-example-webpack@0.0.7...graphiql-example-webpack@0.0.8) (2019-12-09)\n\n**Note:** Version bump only for package graphiql-example-webpack\n\n## [0.0.7](https://github.com/graphql/graphiql/compare/graphiql-example-webpack@0.0.6...graphiql-example-webpack@0.0.7) (2019-12-03)\n\n### Bug Fixes\n\n- ensure css files move with babel dist ([ca95547](https://github.com/graphql/graphiql/commit/ca95547))\n\n## [0.0.6](https://github.com/graphql/graphiql/compare/graphiql-example-webpack@0.0.5...graphiql-example-webpack@0.0.6) (2019-12-03)\n\n### Bug Fixes\n\n- convert browserify build to webpack, fixes [#976](https://github.com/graphql/graphiql/issues/976) ([#1001](https://github.com/graphql/graphiql/issues/1001)) ([3caf041](https://github.com/graphql/graphiql/commit/3caf041))\n\n## 0.0.5 (2019-11-26)\n\n### Bug Fixes\n\n- webpack resolutions for [#882](https://github.com/graphql/graphiql/issues/882), add webpack example ([ea9df3e](https://github.com/graphql/graphiql/commit/ea9df3e))\n"
  },
  {
    "path": "examples/graphiql-webpack/README.md",
    "content": "## GraphiQL Webpack Example\n\nThis example demonstrates how to transpile your own custom ES6 GraphiQL\nimplementation with webpack and babel configuration.\n\nIt shows how to add plugins and even how to create a custom plugin.\n\nThere is also a no-config example with `create-react-app`:\n\n[![Edit graphiql-example](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/graphiql-example-nhzvc)\n\nIt appears `create-react-app` supports all the language features we require.\n\n### Setup\n\n1. `yarn` and `yarn start` from this folder to start webpack dev server\n"
  },
  {
    "path": "examples/graphiql-webpack/babel.config.js",
    "content": "module.exports = require('../../resources/babel.config');\n"
  },
  {
    "path": "examples/graphiql-webpack/index.html.ejs",
    "content": "<!doctype html>\n<html lang=\"en\" dir=\"ltr\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"\n    />\n    <meta name=\"theme-color\" content=\"#ffffff\" />\n\n    <link rel=\"manifest\" href=\"manifest.json\" />\n    <link rel=\"icon\" href=\"logo.svg\" />\n    <title>GraphiQL Webpack Example!</title>\n  </head>\n\n  <body>\n    <div id=\"root\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/graphiql-webpack/package.json",
    "content": "{\n  \"name\": \"example-graphiql-webpack\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"description\": \"A GraphiQL example with Webpack\",\n  \"scripts\": {\n    \"build-demo\": \"webpack-cli && mkdirp ../../packages/graphiql/webpack && cp -r dist/** ../../packages/graphiql/webpack\",\n    \"start\": \"NODE_ENV=development webpack-cli serve\"\n  },\n  \"dependencies\": {\n    \"@graphiql/plugin-code-exporter\": \"^5.1.1\",\n    \"@graphiql/plugin-explorer\": \"^5.1.1\",\n    \"@graphiql/react\": \"^0.37.3\",\n    \"@graphiql/toolkit\": \"^0.11.3\",\n    \"graphiql\": \"^5.2.2\",\n    \"graphql\": \"^16.9.0\",\n    \"graphql-ws\": \"^5.5.5\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"regenerator-runtime\": \"^0.13.9\"\n  },\n  \"devDependencies\": {\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-syntax-dynamic-import\": \"^7.8.3\",\n    \"@babel/preset-env\": \"^7.20.2\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"ajv-formats\": \"^3.0.1\",\n    \"babel-loader\": \"^9.1.2\",\n    \"copy-webpack-plugin\": \"11.0.0\",\n    \"cross-env\": \"^7.0.2\",\n    \"css-loader\": \"^6.7.3\",\n    \"file-loader\": \"^6.2.0\",\n    \"html-webpack-plugin\": \"^5.5.0\",\n    \"react-hot-loader\": \"^4.13.1\",\n    \"style-loader\": \"^3.3.1\",\n    \"webpack\": \"5.94.0\",\n    \"webpack-cli\": \"^6.0.1\",\n    \"webpack-dev-server\": \"^5.2.1\",\n    \"webpack-manifest-plugin\": \"^5.0.0\",\n    \"workbox-webpack-plugin\": \"^7.0.0\",\n    \"worker-loader\": \"^2.0.0\"\n  }\n}\n"
  },
  {
    "path": "examples/graphiql-webpack/src/index.css",
    "content": "@import 'graphiql/style.css';\n@import '@graphiql/plugin-explorer/style.css';\n@import '@graphiql/plugin-code-exporter/style.css';\n@import './select-server-plugin.css';\n\nbody {\n  padding: 0;\n  margin: 0;\n  min-height: 100vh;\n  background-color: hsl(var(--color-base));\n}\n#root {\n  height: 100vh;\n}\n\n.plugin-title {\n  font-size: var(--font-size-h2);\n  font-weight: var(--font-weight-medium);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding-bottom: 1rem;\n}\n\n.select-server--button {\n  background-color: hsl(var(--color-primary));\n  border: 0 none;\n  display: block;\n  width: 100%;\n  color: hsl(var(--color-base));\n  padding: 0.5rem;\n  font-size: 1rem;\n  margin-bottom: 1rem;\n}\n\n.select-server--button.disabled {\n  background-color: hsl(var(--color-base));\n  color: hsl(var(--color-primary));\n}\n\n.select-server--schema-error {\n  color: hsl(var(--color-error));\n  margin-top: 0.5rem;\n  display: block;\n}\n\n.select-server--schema-error code {\n  padding: 0.5rem;\n  background-color: hsla(var(--color-base), var(--alpha-secondary));\n}\n\n.select-server--schema-success {\n  color: hsl(var(--color-success));\n  margin-top: 0.5rem;\n  display: block;\n}\n\n.select-server--schema-loading {\n  color: hsl(var(--color-warning));\n  margin-top: 0.5rem;\n  display: block;\n}\n\ninput.select-server--input {\n  display: block;\n  width: 100%;\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  padding: 0.5rem;\n  background-color: hsla(var(--color-primary), var(--alpha-background-medium));\n  border: 0 none;\n  font-size: 1.05rem;\n}\n\n.select-server--input-error {\n  color: hsl(var(--color-error));\n  margin-top: 0.5rem;\n  display: block;\n}\n\nli.select-server--previous-entry {\n  display: flex;\n  flex-direction: row;\n  flex-grow: inherit;\n  width: 100%;\n}\n\nli.select-server--previous-entry span {\n  display: flex;\n  cursor: pointer;\n  padding: 0.5rem;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  flex-grow: 1;\n}\n\nli.select-server--previous-entry span:hover,\nli.select-server--previous-entry button:hover {\n  background-color: hsl(var(--color-primary));\n  color: hsl(var(--color-base));\n}\n\nli.select-server--previous-entry button {\n  background-color: transparent;\n  border: hsl(var(--color-neutral));\n  display: flex;\n  color: hsl(var(--color-neutral));\n  font-size: 1rem;\n  cursor: pointer;\n  padding: 0.5rem;\n}\n"
  },
  {
    "path": "examples/graphiql-webpack/src/index.jsx",
    "content": "import 'regenerator-runtime/runtime.js';\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { GraphiQL } from 'graphiql';\nimport { explorerPlugin } from '@graphiql/plugin-explorer';\nimport { getSnippets } from './snippets';\nimport { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { useGraphiQL } from '@graphiql/react';\nimport { serverSelectPlugin, LAST_URL_KEY } from './select-server-plugin';\nimport 'graphiql/setup-workers/webpack';\nimport './index.css';\n\nexport const STARTING_URL = 'https://countries.trevorblades.com';\n\nif ('serviceWorker' in navigator) {\n  window.addEventListener('load', () => {\n    navigator.serviceWorker\n      .register('/service-worker.js')\n      .then(registration => {\n        console.log('SW registered:', registration);\n      })\n      .catch(registrationError => {\n        console.error('SW registration failed:', registrationError);\n      });\n  });\n}\n\n/**\n * A manual fetcher implementation example\n * @returns\n */\n// const fetcher = async (graphQLParams, options) => {\n//   const data = await fetch(\n//    STARTING_URL,\n//     {\n//       method: 'POST',\n//       headers: {\n//         Accept: 'application/json',\n//         'Content-Type': 'application/json',\n//         ...options.headers,\n//       },\n//       body: JSON.stringify(graphQLParams),\n//       credentials: 'same-origin',\n//     },\n//   );\n//   return data.json().catch(() => data.text());\n// };\n\nconst style = { height: '100vh' };\n/**\n * instantiate outside of the component lifecycle\n * unless you need to pass it dynamic values from your React app,\n * then use the `useMemo` hook\n */\nconst explorer = explorerPlugin();\n\nfunction App() {\n  const [currentUrl, setUrl] = useState('');\n  // TODO: a breaking change where we make URL an internal state concern, and then expose hooks\n  // so that you can handle/set URL state internally from a plugin\n  // fetcher could then pass a dynamic URL config object to the fetcher internally\n  const exporter = useMemo(\n    () =>\n      codeExporterPlugin({ snippets: getSnippets({ serverUrl: currentUrl }) }),\n    [currentUrl],\n  );\n  const fetcher = useMemo(\n    () => createGraphiQLFetcher({ url: currentUrl }),\n    [currentUrl],\n  );\n  const serverSelect = useMemo(\n    () => serverSelectPlugin({ url: currentUrl, setUrl }),\n    [currentUrl],\n  );\n\n  return (\n    <GraphiQL\n      style={style}\n      plugins={[serverSelect, explorer, exporter]}\n      fetcher={fetcher}\n      shouldPersistHeaders\n    >\n      <GraphiQLContextBound setUrl={setUrl} />\n    </GraphiQL>\n  );\n}\n\n/**\n * `useGraphiQL` is a context hook that's only available within the `<GraphiQL>`\n * provider tree. `<GraphiQLContextBound>` must be rendered as a child of `<GraphiQL>`.\n */\nfunction GraphiQLContextBound({ setUrl }) {\n  const storage = useGraphiQL(state => state.storage);\n  const lastUrl = storage.get(LAST_URL_KEY) ?? STARTING_URL;\n\n  useEffect(() => {\n    setUrl(lastUrl);\n  }, [lastUrl, setUrl]);\n\n  return null;\n}\n\nconst root = createRoot(document.getElementById('root'));\nroot.render(<App />);\n"
  },
  {
    "path": "examples/graphiql-webpack/src/select-server-plugin.css",
    "content": ".plugin-title {\n  font-size: var(--font-size-h2);\n  font-weight: var(--font-weight-medium);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding-bottom: 1rem;\n}\n\n.plugin-subheading {\n  font-size: var(--font-size-h3);\n  font-weight: var(--font-weight-medium);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin: 1rem 0;\n}\n\n.select-server--button {\n  background-color: hsl(var(--color-primary));\n  border: 0 none;\n  display: block;\n  width: 100%;\n  color: hsl(var(--color-base));\n  padding: 0.5rem;\n  font-size: 1rem;\n  margin-bottom: 1rem;\n}\n\n.select-server--button.disabled {\n  background-color: hsl(var(--color-base));\n  color: hsl(var(--color-primary));\n}\n\n.select-server--schema-error {\n  color: hsl(var(--color-error));\n  margin-top: 0.5rem;\n  display: block;\n}\n\n.select-server--schema-error code {\n  padding: 0.5rem;\n  background-color: hsla(var(--color-base), var(--alpha-secondary));\n}\n\n.select-server--schema-success {\n  color: hsl(var(--color-success));\n  margin-top: 0.5rem;\n  display: block;\n}\n\n.select-server--schema-loading {\n  color: hsl(var(--color-warning));\n  margin-top: 0.5rem;\n  display: block;\n}\n\ninput.select-server--input {\n  display: block;\n  width: 100%;\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  padding: 0.5rem;\n  background-color: hsla(var(--color-primary), var(--alpha-background-medium));\n  border: 0 none;\n  font-size: 1.05rem;\n}\n\n.select-server--input-error {\n  color: hsl(var(--color-error));\n  margin-top: 0.5rem;\n  display: block;\n}\n\nli.select-server--previous-entry {\n  display: flex;\n  flex-direction: row;\n  flex-grow: inherit;\n  width: 100%;\n}\n\nli.select-server--previous-entry span {\n  display: flex;\n  cursor: pointer;\n  padding: 0.5rem;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  flex-grow: 1;\n}\n\nli.select-server--previous-entry span:hover,\nli.select-server--previous-entry button:hover {\n  background-color: hsl(var(--color-primary));\n  color: hsl(var(--color-base));\n}\n\nli.select-server--previous-entry button {\n  background-color: transparent;\n  border: hsl(var(--color-neutral));\n  display: flex;\n  color: hsl(var(--color-neutral));\n  font-size: 1rem;\n  cursor: pointer;\n  padding: 0.5rem;\n}\n"
  },
  {
    "path": "examples/graphiql-webpack/src/select-server-plugin.jsx",
    "content": "import * as React from 'react';\nimport { useGraphiQL } from '@graphiql/react';\n\nexport const LAST_URL_KEY = 'lastURL';\n\nexport const PREV_URLS_KEY = 'previousURLs';\n\nconst SelectServer = ({ url, setUrl }) => {\n  const inputRef = React.useRef(null);\n  const { storage, schema, isIntrospecting, fetchError } = useGraphiQL(\n    state => ({\n      storage: state.storage,\n      schema: state.schema,\n      isIntrospecting: state.isIntrospecting,\n      fetchError: state.fetchError,\n    }),\n  );\n  const lastUrl = storage.get(LAST_URL_KEY);\n  const currentUrl = lastUrl ?? url;\n  const [inputValue, setInputValue] = React.useState(currentUrl);\n  const [previousUrls, setPreviousUrls] = React.useState(\n    JSON.parse(storage.get(PREV_URLS_KEY)) ?? [currentUrl],\n  );\n  const [error, setError] = React.useState(null);\n\n  const sameValue = inputValue.trim() === url;\n\n  return (\n    <div>\n      <div className=\"plugin-title\">Select Server</div>\n      <div>\n        <input\n          className=\"select-server--input\"\n          ref={inputRef}\n          defaultValue={currentUrl}\n          onChange={e => setInputValue(e.target.value)}\n          spellCheck={false}\n          pattern=\"https?://.+\"\n        />\n        {error && <div className=\"select-server--input-error\">{error}</div>}\n      </div>\n      <div>\n        <button\n          className={`select-server--button ${sameValue ? 'disabled' : ''}`}\n          onClick={() => {\n            const value = inputRef?.current?.value.trim();\n            if (!value?.startsWith('http')) {\n              setError('invalid url');\n              return;\n            }\n            setError(null);\n            setUrl(value);\n            storage.set(LAST_URL_KEY, value);\n            setInputValue(value);\n            if (!previousUrls.includes(value)) {\n              previousUrls.push(value);\n              storage.set(PREV_URLS_KEY, JSON.stringify(previousUrls));\n\n              setPreviousUrls(previousUrls);\n            }\n          }}\n          disabled={sameValue}\n          aria-disabled={sameValue}\n        >\n          Change Schema URL\n        </button>\n        {fetchError && (\n          <div>\n            <div className=\"select-server--schema-error\">\n              There was an error fetching your schema:\n            </div>\n            <div className=\"select-server--schema-error\">\n              <code>\n                {JSON.parse(fetchError).errors.map(({ message }) => message)}\n              </code>\n            </div>\n          </div>\n        )}\n        {isIntrospecting ? (\n          <div className=\"select-server--schema-loading\">Schema loading...</div>\n        ) : (\n          schema &&\n          !fetchError && (\n            <div className=\"select-server--schema-success\">\n              Schema retrieved successfully\n            </div>\n          )\n        )}\n      </div>\n      <div>\n        <div className=\"plugin-subheading\">Previous Severs</div>\n        <ul style={{ padding: 0 }}>\n          {previousUrls.map(prev => {\n            return (\n              <li className=\"select-server--previous-entry\" key={prev}>\n                <span\n                  onClick={() => {\n                    storage.set(LAST_URL_KEY, prev);\n                    inputRef.current.value = prev;\n                    setError(null);\n                    setUrl(prev);\n                    setInputValue(prev);\n                  }}\n                  title={`Switch to ${prev}`}\n                >\n                  {prev}\n                </span>\n                <button\n                  title=\"Delete server URL from history\"\n                  onClick={() => {\n                    if (!previousUrls.includes(prev)) {\n                      return;\n                    }\n                    const filteredPreviousUrls = previousUrls.filter(\n                      prevUrl => prevUrl !== prev,\n                    );\n                    storage.set(\n                      PREV_URLS_KEY,\n                      JSON.stringify(filteredPreviousUrls),\n                    );\n                    setPreviousUrls(filteredPreviousUrls);\n                  }}\n                >\n                  <svg\n                    width=\"1em\"\n                    height=\"5em\"\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    fillRule=\"evenodd\"\n                    aria-hidden=\"true\"\n                    viewBox=\"0 0 23 23\"\n                    clipRule=\"evenodd\"\n                    style={{ height: '1em', width: '1em' }}\n                  >\n                    <title>trash icon</title>\n                    <path\n                      d=\"M19 24h-14c-1.104 0-2-.896-2-2v-17h-1v-2h6v-1.5c0-.827.673-1.5 1.5-1.5h5c.825 0 1.5.671 1.5 1.5v1.5h6v2h-1v17c0 1.104-.896 2-2 2zm0-19h-14v16.5c0 .276.224.5.5.5h13c.276 0 .5-.224.5-.5v-16.5zm-7 7.586l3.293-3.293 1.414 1.414-3.293 3.293 3.293 3.293-1.414 1.414-3.293-3.293-3.293 3.293-1.414-1.414 3.293-3.293-3.293-3.293 1.414-1.414 3.293 3.293zm2-10.586h-4v1h4v-1z\"\n                      fill=\"currentColor\"\n                      strokeWidth=\"0.25\"\n                      stroke=\"currentColor\"\n                    />\n                  </svg>\n                </button>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    </div>\n  );\n};\n\nexport function serverSelectPlugin({ url, setUrl }) {\n  return {\n    title: 'Select Server',\n    icon: () => (\n      <svg\n        height=\"1em\"\n        viewBox=\"-1.5 0 24 24\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        strokeWidth=\"1.5\"\n      >\n        <path\n          stroke=\"currentColor\"\n          d=\"m12.731 2.751 4.935 2.849c.39-.41.94-.664 1.549-.664 1.181 0 2.138.957 2.138 2.138 0 1.001-.688 1.842-1.617 2.074l-.015.003v5.7c.949.233 1.642 1.076 1.642 2.081 0 1.182-.958 2.14-2.14 2.14-.637 0-1.208-.278-1.6-.719l-.002-.002-4.905 2.832c.069.202.109.434.109.675 0 1.182-.958 2.14-2.14 2.14s-2.14-.958-2.14-2.14c0-.216.032-.425.092-.621l-.004.015-4.941-2.844c-.39.407-.939.66-1.546.66-1.182 0-2.14-.958-2.14-2.14 0-1.002.689-1.844 1.619-2.076l.015-.003v-5.699c-.951-.231-1.646-1.076-1.646-2.082 0-1.182.958-2.14 2.14-2.14.396 0 .768.108 1.086.296l-.01-.005c.184.106.342.231.479.376l.001.001 4.938-2.85c-.056-.182-.088-.391-.088-.608 0-1.181.958-2.139 2.139-2.139s2.139.958 2.139 2.139c0 .219-.033.43-.094.629l.004-.015zm-.515.877c-.019.021-.037.039-.057.057l-.001.001 6.461 11.19c.026-.009.056-.016.082-.023v-5.707c-.938-.238-1.621-1.076-1.621-2.072 0-.183.023-.361.066-.531l-.003.015c.006-.024.012-.049.019-.072zm-3.015.059-.06-.06-4.946 2.852c.053.177.084.381.084.592 0 .969-.645 1.787-1.53 2.049l-.015.004-.076.021v5.708l.084.023 6.461-11.19zm2.076.507c-.179.053-.384.084-.596.084s-.417-.031-.611-.088l.015.004-6.46 11.189c.286.276.496.629.597 1.026l.003.015h12.911c.102-.413.313-.768.599-1.043l.001-.001-6.456-11.186zm.986 16.227 4.917-2.838c-.015-.047-.027-.094-.038-.142h-12.92l-.021.083 4.939 2.852c.39-.403.936-.653 1.54-.653.626 0 1.189.268 1.581.696l.001.002z\"\n        />\n      </svg>\n    ),\n    content() {\n      return <SelectServer url={url} setUrl={setUrl} />;\n    },\n  };\n}\n"
  },
  {
    "path": "examples/graphiql-webpack/src/snippets.js",
    "content": "const removeQueryName = query =>\n  query.replace(\n    /^[^{(]+([{(])/,\n    (_match, openingCurlyBracketsOrParenthesis) =>\n      `query ${openingCurlyBracketsOrParenthesis}`,\n  );\n\nconst getQuery = (arg, spaceCount) => {\n  const { operationDataList } = arg;\n  console.log(arg);\n  const { query } = operationDataList[0];\n  const anonymousQuery = removeQueryName(query);\n  return (\n    ' '.repeat(spaceCount) +\n    anonymousQuery.replaceAll('\\n', '\\n' + ' '.repeat(spaceCount))\n  );\n};\n\nexport const getSnippets = ({ serverUrl }) => {\n  const exampleSnippetZero = {\n    name: 'cURL',\n    language: 'shell',\n    codeMirrorMode: 'shell',\n    options: [],\n    generate: arg => `curl -g \\\n    -X POST \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\"query\": \"${arg.operationDataList[0].query.replaceAll('\\n', ' ')}\"}' \\\n    ${serverUrl}`,\n  };\n\n  const exampleSnippetOne = {\n    name: 'Example One',\n    language: 'JavaScript',\n    codeMirrorMode: 'jsx',\n    options: [],\n    generate: arg => `export const query = graphql\\`\n    ${getQuery(arg, 2)}\n    \\`\n    `,\n  };\n\n  const exampleSnippetTwo = {\n    name: 'Example Two',\n    language: 'JavaScript',\n    codeMirrorMode: 'jsx',\n    options: [],\n    generate: arg => `import { graphql } from 'graphql'\n    export const query = graphql\\`\n    ${getQuery(arg, 2)}\n    \\`\n    `,\n  };\n  return [exampleSnippetZero, exampleSnippetOne, exampleSnippetTwo];\n};\n"
  },
  {
    "path": "examples/graphiql-webpack/webpack.config.js",
    "content": "const { GenerateSW } = require('workbox-webpack-plugin');\nconst { WebpackManifestPlugin } = require('webpack-manifest-plugin');\nconst CopyPlugin = require('copy-webpack-plugin');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst path = require('node:path');\nconst isDev = process.env.NODE_ENV === 'development';\nconst isHMR = process.env.WEBPACK_SERVE;\n\nconst prodPlugins = [];\n\nif (!isHMR) {\n  prodPlugins.push(\n    new GenerateSW({\n      maximumFileSizeToCacheInBytes: 1024 * 1024 * 20,\n    }),\n  );\n}\n\n/**\n * @type {import('webpack').Configuration}\n */\nmodule.exports = {\n  entry: isDev\n    ? [\n        'react-hot-loader/patch', // activate HMR for React\n        'webpack-dev-server/client?http://localhost:8080', // bundle the client for webpack-dev-server and connect to the provided endpoint\n        'webpack/hot/only-dev-server', // bundle the client for hot reloading, `only-` means to only hot reload for successful updates\n        './src/index.jsx', // the entry point of our app\n      ]\n    : './src/index.jsx',\n  mode: process.env.NODE_ENV ?? 'development',\n  devtool: 'inline-source-map',\n  performance: {\n    hints: false,\n  },\n  output: {\n    filename: '[name].[contenthash].js',\n    clean: true,\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.html$/,\n        use: ['file?name=[name].[ext]'],\n      },\n      // for graphql module, which uses mjs still\n      {\n        type: 'javascript/auto',\n        test: /\\.mjs$/,\n        use: [],\n        include: /node_modules/,\n      },\n      {\n        test: /\\.(js|jsx)$/,\n        use: [\n          {\n            loader: 'babel-loader',\n            options: {\n              presets: [\n                ['@babel/preset-env', { modules: false }],\n                '@babel/preset-react',\n              ],\n            },\n          },\n        ],\n      },\n      {\n        test: /\\.css$/,\n        use: ['style-loader', 'css-loader'],\n      },\n      {\n        test: /\\.svg$/,\n        use: [{ loader: 'svg-inline-loader' }],\n      },\n      {\n        test: /\\.(woff|woff2|eot|ttf|otf)$/,\n        use: ['file-loader'],\n      },\n    ],\n  },\n  resolve: {\n    extensions: ['.js', '.json', '.jsx', '.css', '.mjs'],\n  },\n  plugins: [\n    ...prodPlugins,\n    new CopyPlugin({\n      patterns: [{ from: 'public' }],\n    }),\n    new HtmlWebpackPlugin({\n      template: path.join(__dirname, '/index.html.ejs'),\n    }),\n    new WebpackManifestPlugin({\n      seed: {\n        name: 'GraphiQL PWA',\n        icons: [\n          {\n            src: 'logo.svg',\n            sizes: '48x48 72x72 96x96 128x128 256x256 512x512',\n            type: 'image/svg+xml',\n            purpose: 'any',\n          },\n        ],\n        background_color: '#ffffff',\n        theme_color: '#D60590',\n        start_url: './index.html',\n        display: 'standalone',\n        display_override: ['fullscreen', 'minimal-ui'],\n        'logo.svg': 'auto/logo.svg',\n      },\n    }),\n  ],\n  devServer: {\n    hot: true,\n    // bypass simple localhost CORS restrictions by setting\n    // these to 127.0.0.1 in /etc/hosts\n    allowedHosts: ['local.test.com', 'graphiql.com'],\n  },\n};\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/README.md",
    "content": "# Monaco GraphQL Next.js Example\n\n## Getting Started\n\nThis is a working example of `monaco-editor` and `monaco-graphql` using\nNext.js 15 with Turbopack.\n\nIt shows how to use the latest monaco-editor with next.js and a custom\nwebworker, without using `@monaco/react` or `monaco-editor-react`'s approach of\ncdn (AMD) bundles. These approaches avoid using ESM `monaco-editor` or web\nworkers, which prevents introducing custom web workers like with\n`monaco-graphql`.\n\nFor lazy loading, we use `next/dynamic` with `{ssr: false}`, but any\nsimilar client-side-only loading (with or without dynamic import) should be\nfine. For more information on loading `monaco-editor` in esm contexts, you can\n[read their docs](https://github.com/microsoft/monaco-editor/blob/main/docs/integrate-esm.md)\n\nThis work was sponsored by [Grafbase](https://grafbase.com)!\n\n## Setup\n\n1. In monorepo root directory run `yarn` and `yarn build`.\n1. In this directory run `yarn dev`.\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/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/app/api-reference/config/typescript for more information.\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/next.config.ts",
    "content": "import type { NextConfig } from 'next';\n\nconst nextConfig: NextConfig = {};\n\nexport default nextConfig;\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/package.json",
    "content": "{\n  \"name\": \"example-monaco-graphql-nextjs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"next\",\n    \"build\": \"next build\",\n    \"start\": \"next start\"\n  },\n  \"dependencies\": {\n    \"@graphiql/toolkit\": \"^0.11.3\",\n    \"graphql\": \"^16.9.0\",\n    \"jsonc-parser\": \"^3.2.0\",\n    \"monaco-editor\": \"^0.52.2\",\n    \"monaco-graphql\": \"^1.7.3\",\n    \"next\": \"15.4.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^16.18.4\",\n    \"@types/react\": \"^19.1.2\",\n    \"typescript\": \"^4.6.3\"\n  }\n}\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/src/app/env.d.ts",
    "content": "declare namespace globalThis {\n  import type { Environment } from 'monaco-editor/esm/monaco-editor';\n  var MonacoEnvironment: Environment;\n}\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/src/app/globals.css",
    "content": "body {\n  margin: 0;\n  height: 100vh;\n}\n\n#root {\n  display: flex;\n  height: inherit;\n}\n\n.pane {\n  width: 50%;\n}\n\n.left-editor {\n  height: 50%;\n}\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/src/app/layout.tsx",
    "content": "import type { FC, ReactNode } from 'react';\nimport type { Metadata } from 'next';\nimport './globals.css';\n\nexport const metadata: Metadata = {\n  title: 'Monaco Next.js Example',\n};\n\nconst RootLayout: FC<Readonly<{ children: ReactNode }>> = ({ children }) => {\n  return (\n    <html lang=\"en\">\n      <body>{children}</body>\n    </html>\n  );\n};\n\nexport default RootLayout;\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/src/app/page.tsx",
    "content": "'use client';\n\nimport type { FC } from 'react';\nimport dynamic from 'next/dynamic';\n\n// dynamically import our GraphiQL component\nconst DynamicEditor = dynamic(() => import('../editor'), { ssr: false });\n\n/**\n * Setup Monaco Editor workers for Webpack/Turbopack projects like Next.js.\n */\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    console.info('setup-workers/webpack', { label });\n    switch (label) {\n      case 'json':\n        return new Worker(\n          new URL(\n            'monaco-editor/esm/vs/language/json/json.worker.js',\n            import.meta.url,\n          ),\n        );\n      case 'graphql':\n        return new Worker(\n          new URL('monaco-graphql/esm/graphql.worker.js', import.meta.url),\n        );\n      case 'typescript':\n        return new Worker(\n          new URL(\n            'monaco-editor/esm/vs/language/typescript/ts.worker.js',\n            import.meta.url,\n          ),\n        );\n    }\n    return new Worker(\n      new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url),\n    );\n  },\n};\n\nconst Page: FC = () => {\n  return (\n    <div id=\"root\">\n      <DynamicEditor />\n    </div>\n  );\n};\n\nexport default Page;\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/src/constants.ts",
    "content": "import { editor, Uri, languages } from 'monaco-graphql/esm/monaco-editor';\nimport { initializeMode } from 'monaco-graphql/esm/initializeMode';\nimport { parse, print } from 'graphql';\n\ntype ModelType = 'operations' | 'variables' | 'response' | 'ts';\n\nexport const GRAPHQL_URL = 'https://countries.trevorblades.com';\n\nexport const DEFAULT_EDITOR_OPTIONS: editor.IStandaloneEditorConstructionOptions =\n  {\n    theme: 'vs-dark',\n    minimap: {\n      enabled: false,\n    },\n  };\n\nexport const STORAGE_KEY = {\n  operations: 'operations',\n  variables: 'variables',\n};\n\n// allow a typo to test validation on schema load\n/* cSpell:disable */\nconst operations =\n  localStorage.getItem(STORAGE_KEY.operations) ??\n  `# CMD/CTRL + Return/Enter will execute the operation,\n# same in the variables editor below\n# also available via context menu & F1 command palette\n\nquery Example($code: ID!, $filter: LanguageFilterInput!) {\n  country(code: $code) {\n    awsRegion\n    native\n    phone\n    emoj\n  }\n  languages(filter: $filter) {\n    name\n  }\n}`;\n/* cSpell:enable */\n\nlet prettyOp = '';\nexport const makeOpTemplate = (op: string) => {\n  try {\n    prettyOp = print(parse(op));\n    return `const graphql = (arg: TemplateStringsArray): string => arg[0]\n    \nconst op = graphql\\`\\n${prettyOp}\\n\\``;\n  } catch {\n    return prettyOp;\n  }\n};\n\nexport const DEFAULT_VALUE: Record<ModelType, string> = {\n  operations,\n  variables:\n    localStorage.getItem(STORAGE_KEY.variables) ??\n    `{\n  \"code\": \"UA\"\n}`,\n  response: '',\n  ts: makeOpTemplate(operations),\n};\n\nexport const OPERATIONS_URI = Uri.file('operations.graphql');\nexport const VARIABLES_URI = Uri.file('variables.json');\nexport const RESPONSE_URI = Uri.file('response.json');\nexport const TS_URI = Uri.file('typescript.ts');\n\n// set these early on so that initial variables with comments don't flash an error\nlanguages.json.jsonDefaults.setDiagnosticsOptions({\n  allowComments: true,\n  trailingCommas: 'ignore',\n});\n\nexport const MONACO_GRAPHQL_API = initializeMode({\n  diagnosticSettings: {\n    validateVariablesJSON: {\n      [OPERATIONS_URI.toString()]: [VARIABLES_URI.toString()],\n    },\n    jsonDiagnosticSettings: {\n      validate: true,\n      schemaValidation: 'error',\n      // set these again, because we are entirely re-setting them here\n      allowComments: true,\n      trailingCommas: 'ignore',\n    },\n  },\n});\n\nexport function getOrCreateModel({ uri, value }: { uri: Uri; value: string }) {\n  const { path } = uri;\n  let language = path.split('.').at(-1)!;\n  if (language === 'ts') {\n    language = 'typescript';\n  }\n  return editor.getModel(uri) ?? editor.createModel(value, language, uri);\n}\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/src/editor.tsx",
    "content": "import { ReactElement, useEffect, useRef, useState } from 'react';\nimport { getIntrospectionQuery, IntrospectionQuery } from 'graphql';\nimport { editor, KeyMod, KeyCode } from 'monaco-graphql/esm/monaco-editor';\n\n// to get typescript mode working\nimport 'monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution';\nimport 'monaco-editor/esm/vs/editor/contrib/peekView/browser/peekView';\nimport 'monaco-editor/esm/vs/editor/contrib/parameterHints/browser/parameterHints';\nimport 'monaco-editor/esm/vs/language/typescript/monaco.contribution';\n\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport * as JSONC from 'jsonc-parser';\nimport {\n  DEFAULT_EDITOR_OPTIONS,\n  MONACO_GRAPHQL_API,\n  STORAGE_KEY,\n  GRAPHQL_URL,\n  OPERATIONS_URI,\n  VARIABLES_URI,\n  RESPONSE_URI,\n  TS_URI,\n  DEFAULT_VALUE,\n  makeOpTemplate,\n  getOrCreateModel,\n} from './constants';\n\nconst fetcher = createGraphiQLFetcher({ url: GRAPHQL_URL });\n\nasync function getSchema(): Promise<IntrospectionQuery> {\n  const data = await fetcher({\n    query: getIntrospectionQuery(),\n    operationName: 'IntrospectionQuery',\n  });\n  const introspectionJSON =\n    'data' in data && (data.data as unknown as IntrospectionQuery);\n\n  if (!introspectionJSON) {\n    throw new Error(\n      'this demo does not support subscriptions or http multipart yet',\n    );\n  }\n  return introspectionJSON;\n}\n\nfunction debounce<F extends (...args: any[]) => any>(duration: number, fn: F) {\n  let timeout = 0;\n  return (...args: Parameters<F>) => {\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = window.setTimeout(() => {\n      timeout = 0;\n      fn(args);\n    }, duration);\n  };\n}\n\nexport default function Editor(): ReactElement {\n  const operationsRef = useRef<HTMLDivElement>(null!);\n  const variablesRef = useRef<HTMLDivElement>(null!);\n  const responseRef = useRef<HTMLDivElement>(null!);\n  const tsRef = useRef<HTMLDivElement>(null!);\n\n  const [schema, setSchema] = useState<IntrospectionQuery>();\n  const [loading, setLoading] = useState(false);\n  /**\n   * Create the models & editors\n   */\n  useEffect(() => {\n    const MODEL = {\n      operations: getOrCreateModel({\n        uri: OPERATIONS_URI,\n        value: DEFAULT_VALUE.operations,\n      }),\n      variables: getOrCreateModel({\n        uri: VARIABLES_URI,\n        value: DEFAULT_VALUE.variables,\n      }),\n      response: getOrCreateModel({\n        uri: RESPONSE_URI,\n        value: DEFAULT_VALUE.response,\n      }),\n      ts: getOrCreateModel({\n        uri: TS_URI,\n        value: DEFAULT_VALUE.ts,\n      }),\n    };\n    const EDITOR = {\n      operations: editor.create(operationsRef.current, {\n        model: MODEL.operations,\n        ...DEFAULT_EDITOR_OPTIONS,\n      }),\n      variables: editor.create(variablesRef.current, {\n        model: MODEL.variables,\n        ...DEFAULT_EDITOR_OPTIONS,\n      }),\n      response: editor.create(responseRef.current, {\n        model: MODEL.response,\n        ...DEFAULT_EDITOR_OPTIONS,\n        readOnly: true,\n        smoothScrolling: true,\n      }),\n      ts: editor.create(tsRef.current, {\n        model: MODEL.ts,\n        ...DEFAULT_EDITOR_OPTIONS,\n        smoothScrolling: true,\n        'semanticHighlighting.enabled': true,\n        language: 'typescript',\n      }),\n    };\n    const queryAction: editor.IActionDescriptor = {\n      id: 'graphql-run',\n      label: 'Run Operation',\n      contextMenuOrder: 0,\n      contextMenuGroupId: 'graphql',\n      // eslint-disable-next-line no-bitwise\n      keybindings: [KeyMod.CtrlCmd | KeyCode.Enter],\n      async run() {\n        const result = await fetcher({\n          query: MODEL.operations.getValue(),\n          variables: JSONC.parse(MODEL.variables.getValue()),\n        });\n        // TODO: this demo only supports a single iteration for http GET/POST,\n        // no multipart or subscriptions yet.\n        // @ts-expect-error\n        const data = await result.next();\n        MODEL.response.setValue(JSON.stringify(data.value, null, 2));\n      },\n    };\n\n    const disposables = [\n      EDITOR.operations.addAction(queryAction),\n      MODEL.operations.onDidChangeContent(\n        debounce(300, () => {\n          localStorage.setItem(\n            STORAGE_KEY.operations,\n            MODEL.operations.getValue(),\n          );\n        }),\n      ),\n      MODEL.operations.onDidChangeContent(() => {\n        const value = MODEL.operations.getValue();\n        MODEL.ts.setValue(makeOpTemplate(value));\n      }),\n      EDITOR.variables.addAction(queryAction),\n      MODEL.variables.onDidChangeContent(\n        debounce(300, () => {\n          localStorage.setItem(\n            STORAGE_KEY.variables,\n            MODEL.variables.getValue(),\n          );\n        }),\n      ),\n      ...Object.values(EDITOR),\n      ...Object.values(MODEL),\n    ];\n    // Clean‑up on unmount\n    return () => {\n      for (const disposable of disposables) {\n        disposable.dispose(); // remove the listener\n      }\n    };\n  }, []);\n  /**\n   * Handle the initial schema load\n   */\n  useEffect(() => {\n    if (schema || loading) {\n      return;\n    }\n    setLoading(true);\n    void getSchema().then(async introspectionJSON => {\n      MONACO_GRAPHQL_API.setSchemaConfig([\n        { introspectionJSON, uri: 'my-schema.graphql' },\n      ]);\n      setSchema(introspectionJSON);\n      setLoading(false);\n    });\n  }, [schema, loading]);\n\n  return (\n    <>\n      <div className=\"pane\">\n        <div ref={operationsRef} className=\"left-editor\" />\n        <div ref={variablesRef} className=\"left-editor\" />\n      </div>\n      <div className=\"pane\">\n        <div ref={responseRef} className=\"left-editor\" />\n        <div ref={tsRef} className=\"left-editor\" />\n      </div>\n    </>\n  );\n}\n"
  },
  {
    "path": "examples/monaco-graphql-nextjs/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\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    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/*\": [\"./src/*\"]\n    },\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ]\n  },\n  \"include\": [\"**/*.ts\", \"**/*.tsx\", \"next-env.d.ts\", \".next/types/**/*.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/README.md",
    "content": "# Monaco-GraphQL React Vite Example\n\n## Getting Started\n\nThis is an extremely naive & minimalist implementation of `monaco-graphql` with\n`react` using `vite` as a bundler.\n\nThis workspace could be used to help us prototype components & hooks for\n`@graphiql/react`\n\n[Here is a StackBlitz demo of this example](https://stackblitz.com/edit/monaco-graphql-react-vite?file=src/App.tsx)\n\n## Setup\n\n1. In monorepo root directory run `yarn` and `yarn build`.\n1. In this directory run `yarn dev`.\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <link rel=\"stylesheet\" href=\"/src/style.css\" />\n    <title>Monaco React Vite Example</title>\n    <style>\n      .loading {\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 4rem;\n        width: 100%;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"root\">\n      <div class=\"loading\">Loading…</div>\n    </div>\n    <script type=\"module\" src=\"/src/index.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/package.json",
    "content": "{\n  \"name\": \"example-monaco-graphql-react-vite\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"dependencies\": {\n    \"@graphiql/toolkit\": \"^0.11.3\",\n    \"graphql\": \"^16.11.0\",\n    \"graphql-language-service\": \"^5.5.0\",\n    \"jsonc-parser\": \"^3.2.0\",\n    \"monaco-editor\": \"^0.52.2\",\n    \"monaco-graphql\": \"^1.7.3\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\"\n  },\n  \"devDependencies\": {\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"vite\": \"^6.3.4\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start\": \"vite preview\"\n  }\n}\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/src/env.d.ts",
    "content": "declare namespace globalThis {\n  import type { Environment } from 'monaco-editor/esm/monaco-editor';\n  var MonacoEnvironment: Environment;\n}\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/src/index.tsx",
    "content": "/* eslint-disable import-x/default */\nimport { createRoot } from 'react-dom/client';\nimport JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker.js?worker';\nimport EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker';\nimport TSWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker.js?worker';\nimport GraphQLWorker from 'monaco-graphql/esm/graphql.worker.js?worker';\nimport Editor from './editor';\nimport './globals.css';\n\n/**\n * Setup Monaco Editor workers for Vite.\n *\n * Vite doesn’t support instantiating web workers directly from bare module imports like this:\n * ```\n * new Worker(new URL('monaco-editor/esm/vs/language/json/json.worker.js', import.meta.url))\n * ```\n * Vite needs to know ahead of time that you are loading a web worker.\n */\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    console.info('setup-workers/vite', { label });\n    switch (label) {\n      case 'json':\n        return new JsonWorker();\n      case 'graphql':\n        return new GraphQLWorker();\n      case 'typescript':\n        return new TSWorker();\n    }\n    return new EditorWorker();\n  },\n};\n\nconst root = createRoot(document.getElementById('root')!);\nroot.render(<Editor />);\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"allowJs\": false,\n    \"skipLibCheck\": false,\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}\n"
  },
  {
    "path": "examples/monaco-graphql-react-vite/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n  build: {\n    minify: false,\n    rollupOptions: {\n      output: {\n        entryFileNames: '[name].js',\n        chunkFileNames: 'assets/[name].js',\n        assetFileNames: 'assets/[name].[ext]',\n      },\n    },\n  },\n  plugins: [\n    react(),\n    watchPackages(['monaco-graphql', 'graphql-language-service']),\n  ],\n  worker: {\n    format: 'es',\n    rollupOptions: {\n      output: {\n        entryFileNames: 'workers/[name].js',\n        chunkFileNames: 'workers/[name].js',\n      },\n    },\n  },\n});\n\nfunction watchPackages(packageNames: string[]) {\n  let isWatching = false;\n\n  return {\n    name: 'vite-plugin-watch-packages',\n    buildStart() {\n      if (!isWatching) {\n        for (const packageName of packageNames) {\n          this.addWatchFile(require.resolve(packageName));\n        }\n\n        isWatching = true;\n      }\n    },\n  };\n}\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/CHANGELOG.md",
    "content": "# Change Log\n\n## 1.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n  - monaco-graphql@1.1.8\n\nAll notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.1.1-alpha.7](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.6...example-monaco-graphql-webpack@1.1.1-alpha.7) (2021-01-07)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n## [1.1.1-alpha.6](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.5...example-monaco-graphql-webpack@1.1.1-alpha.6) (2021-01-07)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n## [1.1.1-alpha.5](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.4...example-monaco-graphql-webpack@1.1.1-alpha.5) (2021-01-07)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n## [1.1.1-alpha.4](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.3...example-monaco-graphql-webpack@1.1.1-alpha.4) (2021-01-03)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n## [1.1.1-alpha.3](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.2...example-monaco-graphql-webpack@1.1.1-alpha.3) (2020-12-28)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n## [1.1.1-alpha.2](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.1...example-monaco-graphql-webpack@1.1.1-alpha.2) (2020-08-22)\n\n### Bug Fixes\n\n- improve setSchema & schema loading, allow primitive schema ([#1648](https://github.com/graphql/graphiql/issues/1648)) ([975f29e](https://github.com/graphql/graphiql/commit/975f29ed6e21c7354c42ed778dfd1b52287f70c6))\n\n## [1.1.1-alpha.1](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.1-alpha.0...example-monaco-graphql-webpack@1.1.1-alpha.1) (2020-08-12)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n## [1.1.1-alpha.0](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.1.0...example-monaco-graphql-webpack@1.1.1-alpha.0) (2020-08-10)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n# [1.1.0](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.0.0...example-monaco-graphql-webpack@1.1.0) (2020-08-06)\n\n### Features\n\n- [RFC] GraphiQL rewrite for monaco editor, react context and redesign, i18n ([#1523](https://github.com/graphql/graphiql/issues/1523)) ([ad730cd](https://github.com/graphql/graphiql/commit/ad730cdc2e3cb7216d821a01725c60475989ee20))\n\n# [1.0.0](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.0.0-alpha.8...example-monaco-graphql-webpack@1.0.0) (2020-06-11)\n\n### Features\n\n- standalone monaco API ([#1575](https://github.com/graphql/graphiql/issues/1575)) ([954aa3d](https://github.com/graphql/graphiql/commit/954aa3d7159fd26bba9650824e0f668e417ca64f))\n\n# [1.0.0-alpha.8](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.0.0-alpha.7...example-monaco-graphql-webpack@1.0.0-alpha.8) (2020-06-04)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n# [1.0.0-alpha.7](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.0.0-alpha.6...example-monaco-graphql-webpack@1.0.0-alpha.7) (2020-06-04)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n# [1.0.0-alpha.6](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.0.0-alpha.5...example-monaco-graphql-webpack@1.0.0-alpha.6) (2020-05-28)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n# [1.0.0-alpha.5](https://github.com/graphql/graphiql/compare/example-monaco-graphql-webpack@1.0.0-alpha.4...example-monaco-graphql-webpack@1.0.0-alpha.5) (2020-05-19)\n\n**Note:** Version bump only for package example-monaco-graphql-webpack\n\n# 1.0.0-alpha.4 (2020-05-17)\n\n### Features\n\n- Monaco Mode - Phase 2 - Mode & Worker ([#1459](https://github.com/graphql/graphiql/issues/1459)) ([bc95fb4](https://github.com/graphql/graphiql/commit/bc95fb46459a4437ff9471ff43c98e1c5c50f51e))\n- monaco-graphql docs, api, improvements ([#1521](https://github.com/graphql/graphiql/issues/1521)) ([c79158c](https://github.com/graphql/graphiql/commit/c79158c72e976ab286e7ec3fded7f3e2d24e50d0))\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/README.md",
    "content": "A simple example of `monaco-graphql` using webpack 4\n\n[live demo](https://monaco-graphql.netlify.com) of the monaco webpack example\n\n### Setup\n\n`yarn` and `yarn start` from this folder to start webpack dev server\n\n### JS only\n\nIf you want to learn how to bundle `monaco-graphql` using webpack without\ntypescript, these steps will help:\n\n1. rename .ts files to .js\n1. rename .ts to .js in webpack.config.js\n1. remove fork ts checker plugin from webpack.config.js\n1. remove typescript annotations from the renamed files\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    require.resolve('@babel/preset-env'),\n    require.resolve('@babel/preset-typescript'),\n    require.resolve('@babel/preset-react'),\n  ],\n  plugins: [\n    require.resolve('@babel/plugin-proposal-class-properties'),\n    require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'),\n    require.resolve('@babel/plugin-transform-class-static-block'),\n  ],\n};\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/package.json",
    "content": "{\n  \"name\": \"example-monaco-graphql-webpack\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"description\": \"A simple monaco example with webpack and typescript\",\n  \"scripts\": {\n    \"build\": \"cross-env NODE_ENV=production webpack-cli\",\n    \"start\": \"cross-env NODE_ENV=development webpack-cli serve\",\n    \"build-demo\": \"yarn build && mkdirp ../../packages/graphiql/monaco && cp -r dist/* ../../packages/graphiql/monaco/\"\n  },\n  \"dependencies\": {\n    \"graphql\": \"^16.9.0\",\n    \"graphql-language-service\": \"^5.5.0\",\n    \"json-schema\": \"^0.4.0\",\n    \"jsonc-parser\": \"^3.2.0\",\n    \"monaco-editor\": \"^0.52.2\",\n    \"monaco-graphql\": \"^1.7.3\",\n    \"prettier\": \"3.3.2\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.21.0\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-syntax-dynamic-import\": \"^7.8.3\",\n    \"@babel/plugin-transform-class-static-block\": \"^7.27.1\",\n    \"@babel/preset-env\": \"^7.20.2\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@babel/preset-typescript\": \"^7.21.0\",\n    \"@webpack-cli/serve\": \"^2.0.1\",\n    \"babel-loader\": \"^9.1.2\",\n    \"cross-env\": \"^7.0.2\",\n    \"css-loader\": \"^6.7.3\",\n    \"file-loader\": \"6.2.0\",\n    \"fork-ts-checker-webpack-plugin\": \"7.3.0\",\n    \"html-webpack-plugin\": \"^5.5.0\",\n    \"monaco-editor-webpack-plugin\": \"^7.0.1\",\n    \"style-loader\": \"^3.3.1\",\n    \"typescript\": \"^4.6.3\",\n    \"webpack\": \"5.76.0\",\n    \"webpack-bundle-analyzer\": \"^3.6.1\",\n    \"webpack-cli\": \"^5.0.1\",\n    \"webpack-dev-server\": \"^5.2.1\"\n  }\n}\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/src/editors.ts",
    "content": "import { editor, Uri } from 'monaco-graphql/esm/monaco-editor';\n\nconst GRAPHQL_LANGUAGE_ID = 'graphql';\n\nconst operationString =\n  localStorage.getItem('operations') ??\n  `\n# right click to view context menu\n# F1 for command palette\n# enjoy prettier formatting, autocompletion,\n# validation, hinting and more for GraphQL SDL and operations!\nquery Example(\n  $owner: String!\n  $name: String!\n  $reviewEvent: PullRequestReviewEvent!\n  $user: FollowUserInput!\n) {\n  repository(owner: $owner, name: $name) {\n    stargazerCount\n  }\n}\n`;\n\nconst variablesString =\n  localStorage.getItem('variables') ??\n  `{\n  \"reviewEvent\": \"graphql\",\n  \"name\": true\n}`;\n\nconst resultsString = '{}';\n\nconst schemaSdlString = localStorage.getItem('schema-sdl') ?? '';\n\nconst THEME = 'vs-dark';\n\nexport function createEditors() {\n  const variablesModel = editor.createModel(\n    variablesString,\n    'json',\n    Uri.file('/1/variables.json'),\n  );\n\n  const variablesEditor = editor.create(document.getElementById('variables'), {\n    model: variablesModel,\n    language: 'json',\n    formatOnPaste: true,\n    formatOnType: true,\n    theme: THEME,\n    comments: {\n      insertSpace: true,\n      ignoreEmptyLines: true,\n    },\n  });\n\n  const operationModel = editor.createModel(\n    operationString,\n    GRAPHQL_LANGUAGE_ID,\n    Uri.file('/1/operation.graphql'),\n  );\n\n  const operationEditor = editor.create(document.getElementById('operation'), {\n    model: operationModel,\n    formatOnPaste: true,\n    formatOnType: true,\n    folding: true,\n    theme: THEME,\n    language: GRAPHQL_LANGUAGE_ID,\n  });\n\n  const schemaModel = editor.createModel(\n    schemaSdlString,\n    GRAPHQL_LANGUAGE_ID,\n    Uri.file('/1/schema.graphqls'),\n  );\n\n  const schemaEditor = editor.create(document.getElementById('schema-sdl'), {\n    model: schemaModel,\n    formatOnPaste: true,\n    formatOnType: true,\n    folding: true,\n    theme: THEME,\n    language: GRAPHQL_LANGUAGE_ID,\n  });\n\n  const resultsModel = editor.createModel(\n    resultsString,\n    'json',\n    Uri.file('/1/results.json'),\n  );\n\n  const resultsEditor = editor.create(document.getElementById('results'), {\n    model: resultsModel,\n    language: 'json',\n    theme: THEME,\n    wordWrap: 'on',\n    readOnly: true,\n    showFoldingControls: 'always',\n  });\n\n  return {\n    operationEditor,\n    variablesEditor,\n    resultsEditor,\n    schemaEditor,\n    operationModel,\n    variablesModel,\n    schemaModel,\n  };\n}\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/src/index.html.ejs",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" dir=\"ltr\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"\n    />\n    <title>Monaco Example!</title>\n  </head>\n  <body>\n    <div id=\"flex-wrapper\" class=\"column\">\n      <div id=\"toolbar\" class=\"row\"></div>\n      <div id=\"session-editor\" class=\"row\">\n        <div class=\"full-height column half-width\">\n          <div id=\"operation\"></div>\n          <div id=\"variables\"></div>\n        </div>\n        <div class=\"full-height column half-width\">\n          <div\n            aria-label=\"Result Window\"\n            aria-live=\"polite\"\n            aria-atomic=\"true\"\n            id=\"results\"\n          ></div>\n          <div id=\"schema-sdl\"></div>\n        </div>\n      </div>\n    </div>\n    <!-- for github auth -->\n    <script src=\"https://unpkg.com/netlify-auth-providers\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/src/index.ts",
    "content": "/* global netlify */\n\nimport { editor, KeyMod, KeyCode } from 'monaco-graphql/esm/monaco-editor';\nimport * as JSONC from 'jsonc-parser';\nimport { initializeMode } from 'monaco-graphql/esm/initializeMode';\n\nimport { createEditors } from './editors';\nimport { schemaFetcher, schemaOptions } from './schema';\nimport './style.css';\nimport type { MonacoGraphQLAPI } from 'monaco-graphql';\n\nconst SITE_ID = '46a6b3c8-992f-4623-9a76-f1bd5d40505c';\n\nlet monacoGraphQLAPI: MonacoGraphQLAPI | null = null;\n\nvoid render();\n\nasync function render() {\n  if (!schemaFetcher.token) {\n    renderGithubLoginButton();\n\n    return;\n  }\n  monacoGraphQLAPI ||= initializeMode({\n    formattingOptions: {\n      prettierConfig: {\n        printWidth: 120,\n      },\n    },\n  });\n\n  document.getElementById('github-login-wrapper')?.remove();\n  document\n    .getElementById('session-editor')\n    ?.setAttribute('style', 'display: flex');\n  document\n    .getElementById('toolbar')\n    ?.setAttribute('style', 'display: inline-flex');\n\n  const toolbar = document.getElementById('toolbar');\n  const editors = createEditors();\n  const {\n    operationModel,\n    operationEditor,\n    variablesEditor,\n    schemaEditor,\n    resultsEditor,\n    variablesModel,\n    schemaModel,\n  } = editors;\n  const { schemaReloadButton, executeOpButton, schemaPicker } =\n    renderToolbar(toolbar);\n\n  renderGithubLoginButton();\n\n  const operationUri = operationModel.uri.toString();\n\n  const schema = await schemaFetcher.loadSchema();\n  if (schema) {\n    console.log('loaded schema', schema);\n    monacoGraphQLAPI.setSchemaConfig([\n      { ...schema, fileMatch: [operationUri, schemaModel.uri.toString()] },\n    ]);\n\n    schemaEditor.setValue(schema.documentString || '');\n  }\n\n  monacoGraphQLAPI.setDiagnosticSettings({\n    validateVariablesJSON: {\n      [operationUri]: [variablesModel.uri.toString()],\n    },\n    jsonDiagnosticSettings: {\n      // jsonc tip!\n      allowComments: true,\n      schemaValidation: 'error',\n      // this is nice too\n      trailingCommas: 'warning',\n    },\n  });\n  operationModel.onDidChangeContent(() => {\n    setTimeout(() => {\n      localStorage.setItem('operations', operationModel.getValue());\n    }, 200);\n  });\n  variablesModel.onDidChangeContent(() => {\n    setTimeout(() => {\n      localStorage.setItem('variables', variablesModel.getValue());\n    }, 200);\n  });\n  schemaModel.onDidChangeContent(() => {\n    setTimeout(async () => {\n      const value = schemaModel.getValue();\n      localStorage.setItem('schema-sdl', value);\n\n      const nextSchema = await schemaFetcher.overrideSchema(value);\n\n      if (nextSchema) {\n        monacoGraphQLAPI?.setSchemaConfig([\n          {\n            ...nextSchema,\n            fileMatch: [operationUri, schemaModel.uri.toString()],\n          },\n        ]);\n      }\n    }, 200);\n  });\n\n  /**\n   * Choosing a new schema\n   */\n  schemaPicker.addEventListener(\n    'input',\n    async function SchemaSelectionHandler(_ev: Event) {\n      if (schemaPicker.value === schemaFetcher.currentSchema.value) {\n        return;\n      }\n\n      const schemaResult = await schemaFetcher.changeSchema(schemaPicker.value);\n      if (schemaResult && monacoGraphQLAPI) {\n        monacoGraphQLAPI.setSchemaConfig([\n          {\n            ...schemaResult,\n            fileMatch: [operationModel.uri.toString()],\n          },\n        ]);\n        schemaEditor.setValue(schemaResult.documentString || '');\n      }\n    },\n  );\n\n  /**\n   * Reloading your schema\n   */\n  schemaReloadButton.addEventListener('click', async () => {\n    const schemaResult = await schemaFetcher.loadSchema();\n    if (schemaResult) {\n      schemaEditor.setValue(schemaResult.documentString || '');\n    }\n  });\n\n  /**\n   * Execute GraphQL operations, for reference!\n   * monaco-graphql itself doesn't do anything with handling operations yet, but it may soon!\n   */\n\n  const getOperationHandler = () => async () => {\n    try {\n      const operation = operationEditor.getValue();\n      const variables = variablesEditor.getValue();\n      const body: { variables?: string; query: string } = {\n        query: operation,\n      };\n      // parse the variables with JSONC, so we can have comments!\n      const parsedVariables = JSONC.parse(variables);\n      if (parsedVariables && Object.keys(parsedVariables).length) {\n        body.variables = JSON.stringify(parsedVariables, null, 2);\n      }\n      const result = await fetch(schemaFetcher.currentSchema.value, {\n        method: 'POST',\n        headers: {\n          'content-type': 'application/json',\n          ...schemaFetcher.currentSchema?.headers,\n        },\n        body: JSON.stringify(body, null, 2),\n      });\n\n      const resultText = await result.text();\n      resultsEditor.setValue(JSON.stringify(JSON.parse(resultText), null, 2));\n    } catch (err) {\n      if (err instanceof Error) {\n        resultsEditor.setValue(err.toString());\n      }\n    }\n  };\n\n  const operationHandler = getOperationHandler();\n\n  executeOpButton.addEventListener('click', operationHandler);\n  executeOpButton.addEventListener('touchend', operationHandler);\n\n  /**\n   * Add an editor operation to the command palette & keyboard shortcuts\n   */\n  const opAction: editor.IActionDescriptor = {\n    id: 'graphql-run',\n    label: 'Run Operation',\n    contextMenuOrder: 0,\n    contextMenuGroupId: 'graphql',\n    keybindings: [\n      // eslint-disable-next-line no-bitwise\n      KeyMod.CtrlCmd | KeyCode.Enter,\n    ],\n    run: operationHandler,\n  };\n\n  /**\n   * Add a reload operation to the command palette & keyboard shortcuts\n   */\n  const reloadAction: editor.IActionDescriptor = {\n    id: 'graphql-reload',\n    label: 'Reload Schema',\n    contextMenuOrder: 0,\n    contextMenuGroupId: 'graphql',\n    keybindings: [\n      KeyMod.CtrlCmd | KeyCode?.KeyR, // eslint-disable-line no-bitwise\n    ],\n    async run() {\n      await schemaFetcher.loadSchema();\n    },\n  };\n\n  operationEditor.addAction(opAction);\n  variablesEditor.addAction(opAction);\n  resultsEditor.addAction(opAction);\n  operationEditor.addAction(reloadAction);\n}\n\nfunction renderToolbar(toolbar: HTMLElement) {\n  toolbar.innerHTML = '';\n\n  const schemaStatus = document.createElement('div');\n  const schemaReloadButton = document.createElement('button');\n  const executeOpButton = document.createElement('button');\n  const schemaPicker = getSchemaPicker();\n  const executionTray = document.createElement('div');\n\n  executionTray.id = 'execution-tray';\n  executionTray.append(executeOpButton);\n  executionTray.classList.add('align-right');\n\n  executeOpButton.id = 'execute-op';\n  executeOpButton.textContent = 'Run Operation ➤';\n  executeOpButton.title = 'Execute the active GraphQL Operation';\n\n  schemaReloadButton.classList.add('reload-button');\n  schemaReloadButton.innerHTML = '🔄';\n  schemaReloadButton.title = 'Reload the graphql schema';\n\n  schemaStatus.id = 'schema-status';\n  schemaStatus.innerHTML = 'Schema Empty';\n\n  toolbar.append(\n    schemaPicker,\n    schemaReloadButton,\n    schemaStatus,\n    executeOpButton,\n  );\n  return { schemaReloadButton, executeOpButton, schemaStatus, schemaPicker };\n}\n\nfunction getSchemaPicker(): HTMLSelectElement {\n  const schemaPicker = document.createElement('select');\n  schemaPicker.id = 'schema-picker';\n\n  for (const option of schemaOptions) {\n    const optEl = document.createElement('option');\n    optEl.value = option.value;\n    optEl.label = option.label;\n    if (option.default) {\n      optEl.selected = true;\n    }\n    schemaPicker.append(optEl);\n  }\n\n  return schemaPicker;\n}\n\n/**\n * login using the provided netlify API for oauth\n */\nexport function renderGithubLoginButton() {\n  const githubLoginWrapper = document.createElement('div');\n  githubLoginWrapper.id = 'github-login-wrapper';\n  githubLoginWrapper.innerHTML =\n    \"<p>Using Netlify's OAuth client to retrieve your token, you'll see a simple GitHub graphql <code>monaco-graphql</code> Demo.</p>\";\n  const githubButton = document.createElement('button');\n\n  const logoutButton = document.createElement('button');\n\n  logoutButton.innerHTML = 'Logout';\n\n  logoutButton.onclick = async e => {\n    e.preventDefault();\n    schemaFetcher.logout();\n    await render();\n    document\n      .getElementById('session-editor')\n      ?.setAttribute('style', 'display: none');\n    document.getElementById('toolbar')?.setAttribute('style', 'display: none');\n  };\n\n  if (schemaFetcher.token) {\n    document.getElementById('github-login-wrapper')?.remove();\n    const toolbar = document.getElementById('toolbar');\n    toolbar?.append(logoutButton);\n  } else {\n    githubLoginWrapper.append(githubButton);\n    document.getElementById('flex-wrapper')?.prepend(githubLoginWrapper);\n  }\n\n  githubButton.id = 'login';\n  githubButton.innerHTML = 'GitHub Login';\n\n  githubButton.onclick = e => {\n    e.preventDefault();\n    // @ts-expect-error\n    const authenticator = new netlify.default({ site_id: SITE_ID });\n    authenticator.authenticate(\n      { provider: 'github', scope: ['user'] },\n      async (err: Error, data: { token: string }) => {\n        if (err) {\n          console.error('Error authenticating with GitHub:', err);\n        } else {\n          await schemaFetcher.setApiToken(data.token);\n          await render();\n        }\n      },\n    );\n  };\n}\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/src/schema.ts",
    "content": "import {\n  buildClientSchema,\n  getIntrospectionQuery,\n  printSchema,\n  parse,\n  buildASTSchema,\n} from 'graphql';\nimport type { SchemaConfig } from 'monaco-graphql';\nimport { Uri } from 'monaco-graphql/esm/monaco-editor';\n\nconst SCHEMA_URL = 'https://api.github.com/graphql';\nconst API_TOKEN = localStorage.getItem('ghapi') || null;\n\nconst localStorageKey = 'ghapi';\n\nexport const schemaOptions = [\n  {\n    value: SCHEMA_URL,\n    label: 'Github API',\n    default: true,\n    headers: Object.create(null),\n  },\n  {\n    value: 'https://api.spacex.land/graphql',\n    label: 'SpaceX GraphQL API',\n    headers: Object.create(null),\n  },\n];\n\nconst setSchemaStatus = (message: string) => {\n  const schemaStatus = document.getElementById('schema-status');\n  if (schemaStatus) {\n    const html = message;\n    schemaStatus.innerHTML = html;\n  }\n};\n\nclass MySchemaFetcher {\n  private _options: typeof schemaOptions;\n  private _currentSchema: (typeof schemaOptions)[0];\n  private _schemaCache = new Map<string, SchemaConfig>();\n  private _schemaOverride = new Map<string, string>();\n\n  constructor(options = schemaOptions) {\n    this._options = options;\n    this._currentSchema = schemaOptions[0];\n    if (API_TOKEN) {\n      this._currentSchema.headers.authorization = `Bearer ${API_TOKEN}`;\n    }\n  }\n  public get currentSchema() {\n    return this._currentSchema;\n  }\n  public get token() {\n    return this._currentSchema.headers.authorization;\n  }\n  async getSchema() {\n    const cacheItem = this._schemaCache.get(this._currentSchema.value);\n    if (cacheItem) {\n      return {\n        ...cacheItem,\n        documentString: this.getOverride() || cacheItem.documentString,\n      };\n    }\n    return this.loadSchema();\n  }\n  async setApiToken(token: string) {\n    this._currentSchema.headers.authorization = `Bearer ${token}`;\n    localStorage.setItem(localStorageKey, token);\n  }\n  logout() {\n    this._currentSchema.headers.authorization = undefined;\n    localStorage.removeItem(localStorageKey);\n  }\n  async loadSchema() {\n    try {\n      setSchemaStatus('Schema Loading...');\n      const url = this._currentSchema.value;\n\n      const headers = {\n        'content-type': 'application/json',\n      };\n      const result = await fetch(url, {\n        method: 'POST',\n        headers: {\n          ...headers,\n          ...this._currentSchema.headers,\n        },\n        body: JSON.stringify(\n          {\n            query: getIntrospectionQuery(),\n            operationName: 'IntrospectionQuery',\n          },\n          null,\n          2,\n        ),\n      });\n      const introspectionJSON = (await result.json()).data;\n      const documentString = printSchema(buildClientSchema(introspectionJSON));\n      this._schemaCache.set(url, {\n        introspectionJSON,\n        documentString,\n        uri: Uri.parse(url).toString(),\n      });\n\n      this.clearOverride();\n\n      setSchemaStatus('Schema Loaded');\n    } catch {\n      setSchemaStatus('Schema error');\n    }\n\n    return this._schemaCache.get(this._currentSchema.value);\n  }\n  async changeSchema(uri: string) {\n    this._currentSchema = this._options.find(opt => opt.value === uri)!;\n    this.clearOverride();\n    return this.getSchema();\n  }\n\n  getOverride() {\n    return this._schemaOverride.get(this._currentSchema.value);\n  }\n\n  clearOverride() {\n    this._schemaOverride.delete(this._currentSchema.value);\n  }\n\n  async overrideSchema(sdl: string) {\n    if (isValid(sdl)) {\n      this._schemaOverride.set(this._currentSchema.value, sdl);\n      return this.getSchema();\n    }\n  }\n}\n\nfunction isValid(sdl: string) {\n  try {\n    const ast = parse(sdl);\n    buildASTSchema(ast);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport const schemaFetcher = new MySchemaFetcher(schemaOptions);\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/src/style.css",
    "content": "body {\n  background-color: #1e1e1e;\n  margin: 0;\n  padding: 0;\n  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n.div {\n  margin: 0;\n  padding: 0;\n}\n\n.full-height {\n  height: 100vh;\n}\n\n.half-width {\n  width: 50%;\n}\n.column {\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n}\n.row {\n  display: flex;\n  flex-direction: row;\n}\n\n.align-right {\n  /* align-self: stretch; */\n  margin-left: auto;\n  align-self: stretch;\n}\n\n/* Editors */\n\n#flex-wrapper {\n  display: flex;\n  align-items: stretch;\n}\n#operation {\n  height: 60vh;\n  min-height: 260px;\n}\n#variables {\n  height: 30vh;\n  align-items: stretch;\n}\n#results {\n  align-items: stretch;\n  height: 45vh;\n}\n#schema-sdl {\n  align-items: stretch;\n  height: 45vh;\n}\n\n/* Toolbar */\n\n#toolbar {\n  min-height: 40px;\n  background-color: #1e1e1e;\n  display: inline-flex;\n  align-items: stretch;\n}\n\n#toolbar > button,\n#toolbar > select,\n#toolbar > div,\nbutton#execute-op {\n  margin: 0px 4px;\n  padding: 4px;\n}\n\n#toolbar button,\n#toolbar select {\n  background-color: #1e1e1e;\n  color: #eee;\n  border: 1px solid #eee;\n  border-radius: 4px;\n}\n\n#toolbar button:hover,\nselect:hover,\nbutton:focus,\nselect:focus {\n  background-color: darkslategrey;\n}\n\n#execution-tray {\n  align-items: flex-end;\n}\n\n#toolbar #schema-status {\n  color: #eee;\n  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n  padding: 11px 4px;\n  font-size: small;\n}\n\n#toolbar button.reload-button {\n  border: 0 none;\n  padding: 4px;\n  width: 30px;\n  text-align: center;\n}\n\n#github-login-wrapper {\n  text-align: center;\n  color: white;\n  flex-direction: row;\n  width: 100%;\n  height: 200px;\n}\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\",\n    \"composite\": true,\n    \"baseUrl\": \".\",\n    \"strictPropertyInitialization\": false,\n    \"types\": [\"node\", \"jest\"],\n    \"typeRoots\": [\"../../node_modules/@types\", \"node_modules/@types\"],\n    \"lib\": [\"dom\", \"ESNext\"],\n    \"moduleResolution\": \"node\"\n  },\n  \"references\": [{ \"path\": \"../../packages/monaco-graphql\" }],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/build/**.*\", \"../../node_modules\"]\n}\n"
  },
  {
    "path": "examples/monaco-graphql-webpack/webpack.config.js",
    "content": "const path = require('node:path');\n\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');\nconst ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');\nconst MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');\nconst isDev = process.env.NODE_ENV === 'development';\n\nconst relPath = (...args) => path.resolve(__dirname, ...args);\nconst rootPath = (...args) => relPath(...args);\n\nconst resultConfig = {\n  mode: process.env.NODE_ENV,\n  entry: './index.ts',\n  context: rootPath('src'),\n  output: {\n    path: rootPath('dist'),\n    filename: '[name].js',\n  },\n  module: {\n    rules: [\n      // you can also use ts-loader of course\n      // i prefer to use babel-loader & @babel/plugin-typescript\n      // so we can experiment with how changing browserslistrc targets impacts\n      // monaco-graphql bundling\n      {\n        test: /\\.(js|jsx|ts|tsx)$/,\n        use: [{ loader: 'babel-loader' }],\n      },\n      {\n        test: /\\.css$/,\n        use: ['style-loader', 'css-loader'],\n      },\n      {\n        test: /\\.svg$/,\n        use: [{ loader: 'svg-inline-loader' }],\n      },\n      {\n        test: /\\.(woff|woff2|eot|ttf|otf)$/,\n        type: 'asset/resource',\n      },\n    ],\n  },\n  resolve: {\n    extensions: ['.ts', '.js'],\n  },\n  plugins: [\n    // in order to prevent async modules for CDN builds\n    // until we can guarantee it will work with the CDN properly\n    // and so that `index.umd.js` can retain parity\n    new HtmlWebpackPlugin({\n      template: relPath('src/index.html.ejs'),\n      filename: 'index.html',\n    }),\n    // critical! make sure that webpack can consume the exported modules and types\n    new ForkTsCheckerWebpackPlugin({\n      async: isDev,\n      typescript: { configFile: rootPath('tsconfig.json') },\n    }),\n\n    new MonacoWebpackPlugin({\n      languages: ['json', 'graphql'],\n      publicPath: '/',\n      customLanguages: [\n        {\n          label: 'graphql',\n          worker: {\n            id: 'graphql',\n            entry: require.resolve('monaco-graphql/esm/graphql.worker.js'),\n          },\n        },\n      ],\n    }),\n  ],\n};\n\nif (process.env.ANALYZE) {\n  resultConfig.plugins.push(\n    new BundleAnalyzerPlugin({\n      analyzerMode: 'static',\n      openAnalyzer: false,\n      reportFilename: rootPath('build/analyzer.html'),\n    }),\n  );\n}\n\nmodule.exports = resultConfig;\n"
  },
  {
    "path": "functions/graphql.ts",
    "content": "import {\n  createHandler as createRawHandler,\n  HandlerOptions as RawHandlerOptions,\n  OperationContext,\n} from 'graphql-http';\nimport type {\n  Handler as NetlifyHandler,\n  HandlerEvent as NetlifyHandlerEvent,\n  HandlerContext as NetlifyHandlerContext,\n} from '@netlify/functions';\nimport * as graphql from 'graphql';\nimport { createSchema } from '../packages/graphiql/test/schema.js';\nimport { createExecute } from '../packages/graphiql/test/execute.js';\n\n/**\n * Handler options when using the netlify adapter\n *\n * @category Server/@netlify/functions\n */\ntype HandlerOptions<Context extends OperationContext = undefined> =\n  RawHandlerOptions<NetlifyHandlerEvent, NetlifyHandlerContext, Context>;\n\n/**\n * Create a GraphQL over HTTP spec compliant request handler for netlify functions\n *\n * @category Server/@netlify/functions\n */\nexport function createHandler<Context extends OperationContext = undefined>(\n  options: HandlerOptions<Context>,\n): NetlifyHandler {\n  const handler = createRawHandler(options);\n  return async function handleRequest(req, ctx) {\n    try {\n      const [body, init] = await handler({\n        method: req.httpMethod,\n        url: req.rawUrl,\n        headers: req.headers,\n        body: req.body,\n        raw: req,\n        context: ctx,\n      });\n      return {\n        // if body is null, return undefined\n        body: body ?? undefined,\n        statusCode: init.status,\n      };\n    } catch (err) {\n      // The handler shouldn't throw errors.\n      // If you wish to handle them differently, consider implementing your own request handler.\n      console.error(\n        'Internal error occurred during request handling. Please check your implementation.',\n        err,\n      );\n      return {\n        statusCode: 500,\n        body: JSON.stringify({ errors: [{ message: err.message }] }),\n      };\n    }\n  };\n}\n\nexport const handler = createHandler({\n  schema: createSchema(graphql),\n  execute: createExecute(graphql),\n});\n"
  },
  {
    "path": "functions/package.json",
    "content": "{\n  \"name\": \"netlify-function\",\n  \"private\": true,\n  \"dependencies\": {\n    \"graphql\": \"^16.11.0\",\n    \"graphql-http\": \"^1.22.4\"\n  }\n}\n"
  },
  {
    "path": "jest.config.base.js",
    "content": "module.exports = dir => {\n  const package = require(`${dir}/package.json`);\n  return {\n    globals: {\n      'ts-jest': {\n        tsConfig: `${__dirname}/resources/tsconfig.base.esm.json`,\n      },\n    },\n    clearMocks: true,\n    collectCoverage: true,\n    coverageDirectory: `${__dirname}/coverage/jest`,\n    moduleNameMapper: {\n      '^graphql-language-service-([^/]+)': `${__dirname}/packages/graphql-language-service/src/$1`,\n      '^graphql-language-([^/]+)': `${__dirname}/packages/graphql-language-$1/src`,\n      // because of the svelte compiler's export patterns i guess?\n      'svelte/compiler': `${__dirname}/node_modules/svelte/compiler.cjs`,\n    },\n    testMatch: ['**/*[-.](spec|test).[jt]s?(x)', '!**/cypress/**'],\n    testEnvironment: 'node',\n    testPathIgnorePatterns: ['node_modules', 'dist', 'cypress'],\n    collectCoverageFrom: ['**/src/**/*.{js,jsx,ts,tsx}'],\n    transformIgnorePatterns: ['node_modules/(!@astrojs/compiler)'],\n    coveragePathIgnorePatterns: [\n      'dist',\n      'esm',\n      'node_modules',\n      '__tests__',\n      'resources',\n\n      'examples',\n      '.d.ts',\n      'types.ts',\n    ],\n\n    roots: ['<rootDir>'],\n\n    rootDir: dir,\n    name: package.name,\n    displayName: package.name,\n  };\n};\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  projects: ['<rootDir>/packages/*/jest.config.js'],\n};\n"
  },
  {
    "path": "js-green-licenses.json",
    "content": "{\n  \"packageAllowlist\": [\n    // MIT, just lacking SPDX in manifest\n    \"valid-url\",\n    \"argparse\"\n  ],\n  \"dev\": false\n}\n"
  },
  {
    "path": "netlify.toml",
    "content": "# Settings in the [build] context are global and are applied to\n# all contexts unless otherwise overridden by more specific contexts.\n[build]\n  publish = \"packages/graphiql\"\n\n  # Default build command.\n  command = \"yarn build && yarn build-bundles && yarn build-docs && yarn build-demo\"\n  environment = { YARN_FLAGS = \"--frozen-lockfile --immutable\"}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"graphiql-monorepo\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"workspaces\": {\n    \"packages\": [\n      \"packages/*\",\n      \"functions\",\n      \"packages/graphiql/test\",\n      \"examples/monaco-graphql-webpack\",\n      \"examples/monaco-graphql-nextjs\",\n      \"examples/monaco-graphql-react-vite\",\n      \"examples/graphiql-vite\",\n      \"examples/graphiql-vite-react-router\",\n      \"examples/graphiql-webpack\"\n    ]\n  },\n  \"packageManager\": \"yarn@4.9.1\",\n  \"scripts\": {\n    \"types:check\": \"turbo run types:check\",\n    \"dev:graphiql\": \"turbo run dev --filter=graphiql...\",\n    \"dev:example-nextjs\": \"turbo run dev --filter=example-graphiql-nextjs...\",\n    \"dev:example-vite\": \"turbo run dev --filter=example-graphiql-vite...\",\n    \"build:graphiql\": \"turbo run build --filter=graphiql...\",\n    \"build\": \"yarn build-clean && yarn tsc && yarn build:nontsc\",\n    \"build-bundles\": \"yarn prebuild-bundles && yarn wsrun:noexamples --stages build-bundles\",\n    \"build-bundles-clean\": \"rimraf '{packages,examples}/**/{bundle,cdn,webpack}'\",\n    \"build-clean\": \"yarn tsc --clean\",\n    \"build-docs\": \"rimraf packages/graphiql/typedoc && typedoc packages\",\n    \"build:nontsc\": \"yarn wsrun:noexamples --exclude-missing --serial build\",\n    \"build:clean\": \"yarn tsc --clean\",\n    \"build:watch\": \"yarn tsc --watch\",\n    \"build-demo\": \"wsrun -m build-demo\",\n    \"watch\": \"yarn build:watch\",\n    \"watch-vscode\": \"yarn tsc && yarn workspace vscode-graphql compile\",\n    \"watch-vscode-exec\": \"yarn workspace vscode-graphql-execution compile\",\n    \"check\": \"yarn tsc --noEmit\",\n    \"cypress-open\": \"concurrently 'yarn dev:graphiql' 'yarn workspace graphiql cypress-open'\",\n    \"e2e\": \"yarn workspace graphiql e2e\",\n    \"eslint\": \"NODE_OPTIONS=--max-old-space-size=4096 ESLINT_USE_FLAT_CONFIG=false eslint --max-warnings=0 --ignore-path .gitignore --cache .\",\n    \"format\": \"yarn eslint --fix && yarn pretty\",\n    \"jest\": \"jest\",\n    \"license-check\": \"jsgl --local packages/*\",\n    \"lint\": \"yarn eslint && yarn pretty-check && yarn lint-cspell\",\n    \"lint-cspell\": \"cspell --unique --no-progress --no-must-find-files\",\n    \"lint-fix\": \"yarn eslint --fix\",\n    \"postinstall\": \"patch-package --patch-dir resources/patches\",\n    \"prebuild-bundles\": \"yarn build-bundles-clean\",\n    \"prepublishOnly\": \"./scripts/prepublish.sh\",\n    \"postbuild\": \"wsrun --exclude-missing postbuild\",\n    \"pretty\": \"yarn pretty-check --write\",\n    \"pretty-check\": \"prettier --cache --check --ignore-path .gitignore --ignore-path resources/prettierignore --ignore-path .eslintignore .\",\n    \"ci:version\": \"yarn changeset version && yarn build && yarn format\",\n    \"release\": \"yarn build && yarn build-bundles && (wsrun release --exclude-missing --serial --recursive --changedSince main -- || true) && yarn changeset publish\",\n    \"release:canary\": \"(node scripts/canary-release.js && yarn build-bundles && yarn changeset publish --tag canary) || echo Skipping Canary...\",\n    \"repo:lint\": \"manypkg check\",\n    \"repo:fix\": \"manypkg fix\",\n    \"repo:resolve\": \"node scripts/set-resolution.js\",\n    \"t\": \"yarn test\",\n    \"test\": \"yarn jest\",\n    \"test:ci\": \"yarn build && jest --coverage && yarn vitest\",\n    \"test:coverage\": \"yarn jest --coverage\",\n    \"test:watch\": \"yarn jest --watch\",\n    \"tsc\": \"tsc --build && node resources/patch-monaco-editor-type.mjs\",\n    \"vitest\": \"turbo run test\",\n    \"wsrun:noexamples\": \"wsrun --exclude-missing --exclude example-monaco-graphql-react-vite --exclude example-monaco-graphql-nextjs --exclude example-monaco-graphql-webpack --exclude example-graphiql-webpack\",\n    \"gen-agenda\": \"wgutils agenda gen\"\n  },\n  \"dependencies\": {\n    \"@babel/cli\": \"^7.21.0\",\n    \"@babel/core\": \"^7.21.0\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-nullish-coalescing-operator\": \"^7.18.6\",\n    \"@babel/plugin-proposal-optional-chaining\": \"^7.21.0\",\n    \"@babel/plugin-syntax-dynamic-import\": \"^7.8.3\",\n    \"@babel/plugin-transform-private-methods\": \"^7.24.7\",\n    \"@babel/polyfill\": \"^7.12.1\",\n    \"@babel/preset-env\": \"^7.20.2\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@babel/preset-typescript\": \"^7.21.0\",\n    \"@babel/register\": \"^7.21.0\",\n    \"@changesets/changelog-github\": \"0.5.0\",\n    \"@changesets/cli\": \"2.27.7\",\n    \"@manypkg/get-packages\": \"^1.1.3\",\n    \"@shopify/eslint-plugin\": \"^48.0.2\",\n    \"@strictsoftware/typedoc-plugin-monorepo\": \"^0.3.1\",\n    \"@types/codemirror\": \"^0.0.90\",\n    \"@types/express\": \"^4.17.11\",\n    \"@types/fetch-mock\": \"^7.3.2\",\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/node\": \"^16.18.4\",\n    \"@types/ws\": \"8.2.2\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.32.0\",\n    \"@typescript-eslint/parser\": \"^8.32.0\",\n    \"babel-plugin-macros\": \"^3.1.0\",\n    \"babel-plugin-transform-import-meta\": \"^2.2.1\",\n    \"concurrently\": \"^7.0.0\",\n    \"copy\": \"^0.3.2\",\n    \"cspell\": \"^5.15.2\",\n    \"eslint\": \"9.25.1\",\n    \"eslint-config-prettier\": \"^10.1.2\",\n    \"eslint-import-resolver-typescript\": \"^4.3.4\",\n    \"eslint-plugin-cypress\": \"^4.3.0\",\n    \"eslint-plugin-import-x\": \"^4.11.0\",\n    \"eslint-plugin-jest\": \"^28.11.0\",\n    \"eslint-plugin-mdx\": \"^3.4.1\",\n    \"eslint-plugin-promise\": \"^7.2.1\",\n    \"eslint-plugin-react\": \"^7.37.5\",\n    \"eslint-plugin-react-hooks\": \"^6.0.0-rc.1\",\n    \"eslint-plugin-sonarjs\": \"^3.0.2\",\n    \"eslint-plugin-unicorn\": \"^56.0.0\",\n    \"execa\": \"^7.1.1\",\n    \"fetch-mock\": \"6.5.2\",\n    \"jest\": \"^27.5.1\",\n    \"js-green-licenses\": \"4.0.0\",\n    \"mkdirp\": \"^1.0.4\",\n    \"patch-package\": \"^7.0.2\",\n    \"postinstall-postinstall\": \"^2.1.0\",\n    \"prettier\": \"3.3.2\",\n    \"rimraf\": \"^3.0.2\",\n    \"ts-jest\": \"^27.1.5\",\n    \"turbo\": \"^2.5.2\",\n    \"typedoc\": \"^0.19.2\",\n    \"typescript\": \"^4.6.3\",\n    \"vitest\": \"^2.1.9\",\n    \"wgutils\": \"^1.2.5\",\n    \"wsrun\": \"^5.2.4\"\n  },\n  \"resolutions\": {\n    \"@babel/traverse\": \"^7.23.2\",\n    \"vscode-languageserver-types\": \"3.17.3\",\n    \"markdown-it\": \"14.1.0\",\n    \"react\": \"18.3.1\",\n    \"react-dom\": \"18.3.1\",\n    \"vite\": \"6.3.4\"\n  }\n}\n"
  },
  {
    "path": "packages/cm6-graphql/.gitignore",
    "content": "/node_modules\npackage-lock.json\n/dist\n/src/*.js\n/src/*.d.ts\n!syntax.grammar.d.ts\n"
  },
  {
    "path": "packages/cm6-graphql/.npmignore",
    "content": "/src\n/test\n/node_modules\nrollup.config.js\ntsconfig.json\n"
  },
  {
    "path": "packages/cm6-graphql/CHANGELOG.md",
    "content": "# cm6-graphql\n\n## 0.2.1\n\n### Patch Changes\n\n- [#3920](https://github.com/graphql/graphiql/pull/3920) [`c6fddac`](https://github.com/graphql/graphiql/commit/c6fddac4b0e639be846dd8a23ebfd3e334410178) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove unneeded rollup/esbuild dev dependencies\n\n## 0.2.0\n\n### Minor Changes\n\n- [#3762](https://github.com/graphql/graphiql/pull/3762) [`76b3cc8`](https://github.com/graphql/graphiql/commit/76b3cc872dedd667504f58c9313a86bada7688d6) Thanks [@mavenskylab](https://github.com/mavenskylab)! - The cm6-graphql package currently specifies exact versions for its peer dependencies on @codemirror packages. This is causing conflicts when projects use newer versions of these packages, leading to multiple instances being installed.\n\n## 0.1.1\n\n### Patch Changes\n\n- [#3751](https://github.com/graphql/graphiql/pull/3751) [`b8538d8`](https://github.com/graphql/graphiql/commit/b8538d87421edb086b32d4eb2e30a3f7d9d9e893) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace deprecated `navigator.platform` with `navigator.userAgent`\n\n  fix placeholder `⌘ K` in doc explorer search input for non mac devices, replace by `Ctrl K`\n\n## 0.1.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service@5.3.0\n\n## 0.0.15\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service@5.2.1\n\n## 0.0.14\n\n### Patch Changes\n\n- [#3534](https://github.com/graphql/graphiql/pull/3534) [`f4c98c1f`](https://github.com/graphql/graphiql/commit/f4c98c1f7c6df5a918479e641631e8fbc5b5a92e) Thanks [@johndcollett](https://github.com/johndcollett)! - fix: multiple argument syntax highlighting\n\n## 0.0.13\n\n### Patch Changes\n\n- [#3505](https://github.com/graphql/graphiql/pull/3505) [`a562c96f`](https://github.com/graphql/graphiql/commit/a562c96fa3953d0301ad7b610028fa6c4a779bf6) Thanks [@Gasser-Aly](https://github.com/Gasser-Aly)! - fix: block strings syntax highlighting\n\n## 0.0.12\n\n### Patch Changes\n\n- [#3463](https://github.com/graphql/graphiql/pull/3463) [`e45ba17c`](https://github.com/graphql/graphiql/commit/e45ba17cb2f13e5a79d3e87b0f30ef92ec55d861) Thanks [@imolorhe](https://github.com/imolorhe)! - Create a lint diagnostic from invalid schema\n\n## 0.0.11\n\n### Patch Changes\n\n- [#3461](https://github.com/graphql/graphiql/pull/3461) [`129666a9`](https://github.com/graphql/graphiql/commit/129666a9a86690bb72226674d40215f24dc5f7ea) Thanks [@imolorhe](https://github.com/imolorhe)! - Wrap cm6-graphql lint logic in try..catch\n\n## 0.0.10\n\n### Patch Changes\n\n- [#3405](https://github.com/graphql/graphiql/pull/3405) [`3d4b9b75`](https://github.com/graphql/graphiql/commit/3d4b9b7551fd9bb38ef9f4a7c6c330366d43bbfa) Thanks [@imolorhe](https://github.com/imolorhe)! - relint when schema changes\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n\n## 0.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7\n\n## 0.0.9-alpha.0\n\n### Patch Changes\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7-alpha.0\n\n## 0.0.8\n\n### Patch Changes\n\n- [#3118](https://github.com/graphql/graphiql/pull/3118) [`431b7fe1`](https://github.com/graphql/graphiql/commit/431b7fe1efefa4867f0ea617adc436b1117052e8) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer `.textContent` over `.innerText`\n\n## 0.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939)]:\n  - graphql-language-service@5.1.6\n\n## 0.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service@5.1.5\n\n## 0.0.5\n\n### Patch Changes\n\n- [#3127](https://github.com/graphql/graphiql/pull/3127) [`0d2bb2bc`](https://github.com/graphql/graphiql/commit/0d2bb2bcc6522e156e2d70f3be553bd4b60c8ee1) Thanks [@imolorhe](https://github.com/imolorhe)! - Updated cm6-graphql package README\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9)]:\n  - graphql-language-service@5.1.4\n\n## 0.0.4\n\n### Patch Changes\n\n- [#3075](https://github.com/graphql/graphiql/pull/3075) [`9c1a02db`](https://github.com/graphql/graphiql/commit/9c1a02dbff4a39fe999873912daec7dcd1d39b5c) Thanks [@acao](https://github.com/acao)! - another manual release attempt to trigger versioning\n\n- [#3074](https://github.com/graphql/graphiql/pull/3074) [`7cb2a2f1`](https://github.com/graphql/graphiql/commit/7cb2a2f156d918fd57b7d3757ee1ecc0f4dab4ce) Thanks [@acao](https://github.com/acao)! - Fix release bug, trigger changeset release action\n\n- [#3069](https://github.com/graphql/graphiql/pull/3069) [`d922e930`](https://github.com/graphql/graphiql/commit/d922e930f77dff879212ad39191ad6a1b8f7dd8a) Thanks [@sergeichestakov](https://github.com/sergeichestakov)! - Added graphql-language-service as a direct dep of cm6-graphql and update peer dependencies\n\n- Updated dependencies [[`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0)]:\n  - graphql-language-service@5.1.3\n\n## 0.0.3\n\n### Patch Changes\n\n- [#2995](https://github.com/graphql/graphiql/pull/2995) [`5f276c41`](https://github.com/graphql/graphiql/commit/5f276c415ad93350382fec873025ffecc9a29d9d) Thanks [@imolorhe](https://github.com/imolorhe)! - fix(cm6-graphql): Fix query token used as field name\n\n- [#2962](https://github.com/graphql/graphiql/pull/2962) [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d) Thanks [@B2o5T](https://github.com/B2o5T)! - clean all ESLint warnings, add `--max-warnings=0` and `--cache` flags\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n## 0.0.2\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2992](https://github.com/graphql/graphiql/pull/2992) [`cc245246`](https://github.com/graphql/graphiql/commit/cc2452467688f3cdcd7a196dddf47e3b81367d62) Thanks [@acao](https://github.com/acao)! - fix tsconfig reference, new netlify deploy\n\n## 0.0.1\n\n### Patch Changes\n\n- [#2867](https://github.com/graphql/graphiql/pull/2867) [`9fd12838`](https://github.com/graphql/graphiql/commit/9fd128381a86220a7c658f21d72baa8eea45a8af) Thanks [@imolorhe](https://github.com/imolorhe)! - fix: fixed \"Mark decorations may not be empty\" error\n\n## 0.0.0\n\n### Patch Changes\n\n- [#2852](https://github.com/graphql/graphiql/pull/2852) [`20869583`](https://github.com/graphql/graphiql/commit/20869583eff563f5d6494e93302a835f0e034f4b) Thanks [@acao](https://github.com/acao)! - First release of a modern codemirror 6 mode for graphql by @imolorhe!\n"
  },
  {
    "path": "packages/cm6-graphql/LICENSE",
    "content": "MIT License\n\nCopyright (C) 2021 by GraphQL Contributors\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\nall copies 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "packages/cm6-graphql/README.md",
    "content": "# CodeMirror 6 GraphQL Language extension\n\n[![NPM](https://img.shields.io/npm/v/cm6-graphql.svg?style=flat-square)](https://npmjs.com/cm6-graphql)\n![npm downloads](https://img.shields.io/npm/dm/cm6-graphql?label=npm%20downloads)\n[![License](https://img.shields.io/npm/l/cm6-graphql.svg?style=flat-square)](LICENSE)\n[Discord Channel](https://discord.gg/cffZwk8NJW)\n\nProvides CodeMirror 6 extension with a parser mode for GraphQL along with\nautocomplete and linting powered by your GraphQL Schema.\n\n### Getting Started\n\n```sh\nnpm install cm6-graphql\n```\n\n[CodeMirror 6](https://codemirror.net/) customization is done through\n[extensions](https://codemirror.net/docs/guide/#extension). This package is\nan extension that customizes CodeMirror 6 for GraphQL.\n\n```js\nimport { basicSetup, EditorView } from 'codemirror';\nimport { graphql } from 'cm6-graphql';\n\nconst view = new EditorView({\n  doc: `mutation mutationName {\n    setString(value: \"newString\")\n  }`,\n  extensions: [basicSetup, graphql(myGraphQLSchema)],\n  parent: document.body,\n});\n```\n\n_**Note:** You have to provide a theme to CodeMirror 6 for the styling you want. You\ncan take a look at\n[this example](https://github.com/graphql/graphiql/blob/main/examples/cm6-graphql-parcel/src/index.ts)\nor see the CodeMirror 6\n[documentation examples](https://codemirror.net/examples/styling/) for more\ndetails._\n\n### Updating schema\n\nIf you need to dynamically update the GraphQL schema used in the editor, you can\ncall `updateSchema` with the CodeMirror `EditorView` instance and the new schema\n\n```js\nimport { updateSchema } from 'cm6-graphql';\n\nconst onNewSchema = schema => {\n  updateSchema(view, schema);\n};\n```\n"
  },
  {
    "path": "packages/cm6-graphql/__tests__/cases.txt",
    "content": "# Simple query\n\n{ hello }\n\n==>\n\nDocument(OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName)),\"}\")))\n\n# Named query\n\nquery a { hello }\n\n==>\n\nDocument(OperationDefinition(OperationType,Name,SelectionSet(\"{\",Selection(Field(FieldName)),\"}\")))\n\n# Nested query\n\nquery {\n  node {\n    id\n  }\n}\n\n==>\n\nDocument(OperationDefinition(OperationType,SelectionSet(\"{\",Selection(Field(FieldName,SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),\"}\")))\n\n# Query with argument\n\n{\n  node(id: 4) {\n    id,\n    name\n  }\n}\n\n==>\n\nDocument(\n  OperationDefinition(\n    SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,IntValue),\")\"),SelectionSet(\"{\",Selection(Field(FieldName)),Selection(Field(FieldName)),\"}\"))),\"}\")\n  )\n)\n\n# Multiple query nesting\n\n{\n  categories(id: \"1\") {\n    name\n    products {\n      name\n      vendor {\n        products {\n          name\n        }\n      }\n    }\n  }\n}\n\n==>\n\nDocument(OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,StringValue),\")\"),SelectionSet(\"{\",Selection(Field(FieldName)),Selection(Field(FieldName,SelectionSet(\"{\",Selection(Field(FieldName)),Selection(Field(FieldName,SelectionSet(\"{\",Selection(Field(FieldName,SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),\"}\"))),\"}\"))),\"}\"))),\"}\")))\n\n# Query of fields with arguments\n\n{\n  vendors(productname: \"Coconut\") {\n    name\n  }\n  products(price:9.99) {\n    id\n  }\n  categories(id: ALL) {\n    parent\n  }\n}\n\n==>\n\nDocument(OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,StringValue),\")\"),SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,FloatValue),\")\"),SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,EnumValue),\")\"),SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),\"}\")))\n\n# Multiple named queries\n\nquery a { hello }\nquery b { bye }\nmutation c($val: String!) {\n  addAnother(value: $val) {\n    name\n  }\n}\n\n==>\n\nDocument(\n  OperationDefinition(OperationType,Name,SelectionSet(\"{\",Selection(Field(FieldName)),\"}\")),\n  OperationDefinition(OperationType,Name,SelectionSet(\"{\",Selection(Field(FieldName)),\"}\")),\n  OperationDefinition(OperationType,Name,VariableDefinitions(\"(\",VariableDefinition(Variable,NonNullType(NamedType(Name))),\")\"),SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,Variable),\")\"),SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),\"}\"))\n)\n\n# Query with a `query` field\n\n{\n  other\n  query {\n    inner\n  }\n}\n\n==>\n\nDocument(\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName)),Selection(Field(FieldName,SelectionSet(\"{\",Selection(Field(FieldName)),\"}\"))),\"}\"))\n)\n\n\n\n# Test case for blockStringCharacter in a Description\n\n\"\"\"\nThis is a block string description\nwith multiple lines.\nIt can contain any character except for \\\"\"\".\n\"\"\"\ntype Example {\n  id: ID\n}\n\n==>\n\nDocument(\n  TypeSystemDefinition(\n    TypeDefinition(\n      ObjectTypeDefinition(\n        Description(StringValue),\n        TypeKeyword(type),\n        Name,\n        FieldsDefinition(\n          \"{\",\n          FieldDefinition(Name, NamedType(Name)),\n          \"}\"\n        )\n      )\n    )\n  )\n)\n\n# multiple arguments separated by a commas\n\n{\n  picture(width: 200, height: 100)\n}\n\n==>\n\nDocument(OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,IntValue),Argument(ArgumentAttributeName,IntValue),\")\"))),\"}\")))\n"
  },
  {
    "path": "packages/cm6-graphql/__tests__/test.spec.ts",
    "content": "import { describe, it } from 'vitest';\nimport { graphqlLanguage } from '../dist/index.js';\nimport { fileTests } from '@lezer/generator/dist/test';\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n// because of the babel transformations, __dirname is the package root (cm6-graphql)\nconst caseDir = path.resolve(path.dirname(__dirname), '__tests__');\n\ndescribe('codemirror 6 language', () => {\n  for (const file of fs.readdirSync(caseDir)) {\n    if (!/\\.txt$/.test(file)) {\n      continue;\n    }\n\n    const describeName = /^[^.]*/.exec(file)![0];\n    describe(`${describeName}`, () => {\n      for (const { name, run } of fileTests(\n        fs.readFileSync(path.join(caseDir, file), 'utf8'),\n        file,\n      )) {\n        it(`${name}`, () => {\n          try {\n            run(graphqlLanguage.parser);\n          } catch (err) {\n            require('node:console').log(name, err);\n            throw err;\n          }\n        });\n      }\n    });\n  }\n});\n"
  },
  {
    "path": "packages/cm6-graphql/__tests__/types.txt",
    "content": "# String\n\n{ test(v1: \"abc\") }\n\n==>\n\nDocument(OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,StringValue),\")\"))),\"}\")))\n\n# Enum\n\n{ test(v1: ABC) }\n\n==>\n\nDocument(OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,EnumValue),\")\"))),\"}\")))\n\n# Numbers\n\n{ test(v1: 123) }\n{ test(v1: 123.01) }\n{ test(v1: -1.35384e+3) }\n\n==>\n\nDocument(\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,IntValue),\")\"))),\"}\")),\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,FloatValue),\")\"))),\"}\")),\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,FloatValue),\")\"))),\"}\"))\n)\n\n# List\n\n{ test(v1: []) }\n{ test(v1: [\"abc\", \"def\"]) }\n{ test(v1: [\"abc\", ABC, 123, 213.01, true, null]) }\n\n==>\n\nDocument(\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,ListValue(\"[\",\"]\")),\")\"))),\"}\")),\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,ListValue(\"[\",StringValue,StringValue,\"]\")),\")\"))),\"}\")),\n  OperationDefinition(SelectionSet(\"{\",Selection(Field(FieldName,Arguments(\"(\",Argument(ArgumentAttributeName,ListValue(\"[\",StringValue,EnumValue,IntValue,FloatValue,BooleanValue,NullValue,\"]\")),\")\"))),\"}\"))\n)\n"
  },
  {
    "path": "packages/cm6-graphql/package.json",
    "content": "{\n  \"name\": \"cm6-graphql\",\n  \"version\": \"0.2.1\",\n  \"description\": \"GraphQL language support for CodeMirror 6\",\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"build\": \"cm-buildhelper src/index.ts\",\n    \"prepare\": \"yarn build\",\n    \"test\": \"vitest run\"\n  },\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.js\",\n  \"exports\": {\n    \"import\": \"./dist/index.js\",\n    \"require\": \"./dist/index.cjs\"\n  },\n  \"types\": \"dist/index.d.ts\",\n  \"sideEffects\": false,\n  \"dependencies\": {\n    \"graphql-language-service\": \"^5.3.0\"\n  },\n  \"devDependencies\": {\n    \"@codemirror/autocomplete\": \"^6.0.0\",\n    \"@codemirror/buildhelper\": \"^0.1.16\",\n    \"@codemirror/language\": \"^6.0.0\",\n    \"@codemirror/lint\": \"^6.0.0\",\n    \"@codemirror/state\": \"^6.0.0\",\n    \"@codemirror/view\": \"^6.0.0\",\n    \"@lezer/common\": \"^1.0.0\",\n    \"@lezer/generator\": \"^1.1.0\",\n    \"@lezer/highlight\": \"^1.0.0\",\n    \"@lezer/lr\": \"^1.0.0\",\n    \"graphql\": \"^16.9.0\",\n    \"typescript\": \"^4.6.3\"\n  },\n  \"peerDependencies\": {\n    \"@codemirror/autocomplete\": \"^6.0.0\",\n    \"@codemirror/language\": \"^6.0.0\",\n    \"@codemirror/lint\": \"^6.0.0\",\n    \"@codemirror/state\": \"^6.0.0\",\n    \"@codemirror/view\": \"^6.0.0\",\n    \"@lezer/highlight\": \"^1.0.0\",\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/cm6-graphql/src/commands.ts",
    "content": "import { EditorView } from '@codemirror/view';\nimport { getTokenAtPosition, getTypeInfo } from 'graphql-language-service';\nimport { offsetToPos } from './helpers';\nimport { getOpts, getSchema } from './state';\n\nexport const fillAllFieldsCommands = (view: EditorView) => {\n  const schema = getSchema(view.state);\n  if (!schema) {\n    return true;\n  }\n  const opts = getOpts(view.state);\n  const currentPosition = view.state.selection.main.head;\n  const pos = offsetToPos(view.state.doc, currentPosition);\n  const token = getTokenAtPosition(view.state.doc.toString(), pos);\n\n  if (schema && opts?.onFillAllFields) {\n    opts.onFillAllFields(view, schema, view.state.doc.toString(), pos, token);\n  }\n\n  return true;\n};\nexport const showInDocsCommand = (view: EditorView) => {\n  const schema = getSchema(view.state);\n  if (!schema) {\n    return true;\n  }\n  const opts = getOpts(view.state);\n  const currentPosition = view.state.selection.main.head;\n  const pos = offsetToPos(view.state.doc, currentPosition);\n  const token = getTokenAtPosition(view.state.doc.toString(), pos);\n  if (schema && opts?.onShowInDocs) {\n    const tInfo = getTypeInfo(schema, token.state);\n    opts.onShowInDocs(\n      tInfo.fieldDef?.name,\n      tInfo.type?.toString(),\n      tInfo.parentType?.toString(),\n    );\n  }\n  return true;\n};\n"
  },
  {
    "path": "packages/cm6-graphql/src/completions.ts",
    "content": "import { Completion, CompletionContext } from '@codemirror/autocomplete';\nimport { getAutocompleteSuggestions } from 'graphql-language-service';\nimport { getOpts, getSchema } from './state';\nimport { offsetToPos } from './helpers';\nimport { graphqlLanguage } from './language';\n\nconst AUTOCOMPLETE_CHARS = /^[a-zA-Z0-9_@(]$/;\n\nexport const completion = graphqlLanguage.data.of({\n  autocomplete(ctx: CompletionContext) {\n    const schema = getSchema(ctx.state);\n    const opts = getOpts(ctx.state);\n    if (!schema) {\n      return null;\n    }\n\n    const word = ctx.matchBefore(/\\w*/);\n\n    if (!word) {\n      return null;\n    }\n\n    const lastWordChar = word.text.split('').pop()!;\n    if (!AUTOCOMPLETE_CHARS.test(lastWordChar) && !ctx.explicit) {\n      return null;\n    }\n    const val = ctx.state.doc.toString();\n    const pos = offsetToPos(ctx.state.doc, ctx.pos);\n    const results = getAutocompleteSuggestions(\n      schema,\n      val,\n      pos,\n      undefined,\n      undefined,\n      opts?.autocompleteOptions,\n    );\n\n    if (results.length === 0) {\n      return null;\n    }\n\n    return {\n      from: word.from,\n      options: results.map(item => {\n        return {\n          label: item.label,\n          detail: item.detail || '',\n          info(completionData: Completion) {\n            if (opts?.onCompletionInfoRender) {\n              return opts.onCompletionInfoRender(item, ctx, completionData);\n            }\n            if (\n              item.documentation ||\n              (item.isDeprecated && item.deprecationReason)\n            ) {\n              const el = document.createElement('div');\n              el.textContent =\n                item.documentation || item.deprecationReason || '';\n              return el;\n            }\n          },\n        };\n      }),\n    };\n  },\n});\n"
  },
  {
    "path": "packages/cm6-graphql/src/graphql.ts",
    "content": "import { Extension } from '@codemirror/state';\nimport { GraphQLSchema } from 'graphql';\nimport { completion } from './completions';\nimport { GqlExtensionsOptions } from './interfaces';\nimport { jump } from './jump';\nimport { graphqlLanguageSupport } from './language';\nimport { lint } from './lint';\nimport { stateExtensions } from './state';\n\nexport function graphql(\n  schema?: GraphQLSchema,\n  opts?: GqlExtensionsOptions,\n): Extension[] {\n  return [\n    graphqlLanguageSupport(),\n    completion,\n    lint,\n    jump,\n    stateExtensions(schema, opts),\n  ];\n}\n"
  },
  {
    "path": "packages/cm6-graphql/src/helpers.ts",
    "content": "import { Text } from '@codemirror/state';\n\nexport function posToOffset(doc: Text, pos: IPosition) {\n  return doc.line(pos.line + 1).from + pos.character;\n}\nexport function offsetToPos(doc: Text, offset: number): Position {\n  const line = doc.lineAt(offset);\n  return new Position(line.number - 1, offset - line.from);\n}\n\nexport interface IPosition {\n  line: number;\n  character: number;\n  setLine(line: number): void;\n  setCharacter(character: number): void;\n  lessThanOrEqualTo(position: IPosition): boolean;\n}\n\nexport class Position implements IPosition {\n  constructor(\n    public line: number,\n    public character: number,\n  ) {}\n\n  setLine(line: number) {\n    this.line = line;\n  }\n\n  setCharacter(character: number) {\n    this.character = character;\n  }\n\n  lessThanOrEqualTo(position: IPosition) {\n    return (\n      this.line < position.line ||\n      (this.line === position.line && this.character <= position.character)\n    );\n  }\n}\n\nconst isMac = () => navigator.userAgent.includes('Mac');\nexport const isMetaKeyPressed = (e: MouseEvent) =>\n  isMac() ? e.metaKey : e.ctrlKey;\n"
  },
  {
    "path": "packages/cm6-graphql/src/index.ts",
    "content": "export * from './commands';\nexport * from './completions';\nexport * from './graphql';\nexport * from './helpers';\nexport * from './jump';\nexport * from './language';\nexport * from './lint';\nexport * from './state';\n"
  },
  {
    "path": "packages/cm6-graphql/src/interfaces.ts",
    "content": "import { Completion, CompletionContext } from '@codemirror/autocomplete';\nimport { EditorView } from '@codemirror/view';\nimport { GraphQLSchema } from 'graphql';\nimport {\n  ContextToken,\n  CompletionItem,\n  AutocompleteSuggestionOptions,\n} from 'graphql-language-service';\nimport { Position } from './helpers';\nexport interface GqlExtensionsOptions {\n  showErrorOnInvalidSchema?: boolean;\n  onShowInDocs?: (field?: string, type?: string, parentType?: string) => void;\n  onFillAllFields?: (\n    view: EditorView,\n    schema: GraphQLSchema,\n    query: string,\n    cursor: Position,\n    token: ContextToken,\n  ) => void;\n  onCompletionInfoRender?: (\n    gqlCompletionItem: CompletionItem,\n    ctx: CompletionContext,\n    item: Completion,\n  ) => Node | Promise<Node | null> | null;\n  autocompleteOptions?: AutocompleteSuggestionOptions;\n}\n"
  },
  {
    "path": "packages/cm6-graphql/src/jump.ts",
    "content": "import { EditorView } from '@codemirror/view';\nimport { getTokenAtPosition, getTypeInfo } from 'graphql-language-service';\nimport { isMetaKeyPressed, offsetToPos } from './helpers';\nimport { getOpts, getSchema } from './state';\n\nexport const jump = EditorView.domEventHandlers({\n  click(evt, view) {\n    const schema = getSchema(view.state);\n    if (!schema) {\n      return;\n    }\n    // TODO: Set class on cm-editor when mod key is pressed, to style cursor and tokens\n    const currentPosition = view.state.selection.main.head;\n    const pos = offsetToPos(view.state.doc, currentPosition);\n    const token = getTokenAtPosition(view.state.doc.toString(), pos);\n    const tInfo = getTypeInfo(schema, token.state);\n\n    const opts = getOpts(view.state);\n\n    if (opts?.onShowInDocs && isMetaKeyPressed(evt)) {\n      opts.onShowInDocs(\n        tInfo.fieldDef?.name,\n        tInfo.type?.toString(),\n        tInfo.parentType?.toString(),\n      );\n    }\n  },\n});\n"
  },
  {
    "path": "packages/cm6-graphql/src/language.ts",
    "content": "import { parser } from './syntax.grammar';\nimport {\n  LRLanguage,\n  LanguageSupport,\n  indentNodeProp,\n  foldNodeProp,\n  foldInside,\n  delimitedIndent,\n} from '@codemirror/language';\nimport { styleTags, tags as t } from '@lezer/highlight';\n\nconst nodesWithBraces =\n  'RootTypeDefinition InputFieldsDefinition EnumValuesDefinition FieldsDefinition SelectionSet { }';\nconst keywords =\n  'scalar type interface union enum input implements fragment extend schema directive on repeatable';\nconst punctuations = '( ) { } : [ ]';\nexport const graphqlLanguage = LRLanguage.define({\n  parser: parser.configure({\n    props: [\n      styleTags({\n        Variable: t.variableName,\n        BooleanValue: t.bool,\n        Description: t.string,\n        StringValue: t.string,\n        Comment: t.lineComment,\n        IntValue: t.integer,\n        FloatValue: t.float,\n        EnumValue: t.special(t.name),\n        NullValue: t.null,\n        DirectiveName: t.modifier,\n        [keywords]: t.keyword,\n        OperationType: t.definitionKeyword,\n        FieldName: t.propertyName,\n        Field: t.propertyName,\n        ArgumentAttributeName: t.attributeName,\n        Name: t.atom,\n        '( )': t.paren,\n        '{ }': t.brace,\n        ',': t.separator,\n        [punctuations]: t.punctuation,\n      }),\n      // https://codemirror.net/docs/ref/#language.indentNodeProp\n      indentNodeProp.add({\n        [nodesWithBraces]: delimitedIndent({ closing: '}', align: true }),\n      }),\n      foldNodeProp.add({\n        [nodesWithBraces]: foldInside,\n      }),\n    ],\n  }),\n  languageData: {\n    commentTokens: { line: '#' },\n    indentOnInput: /^\\s*(\\{|\\})$/,\n  },\n});\n\nexport function graphqlLanguageSupport() {\n  return new LanguageSupport(graphqlLanguage);\n}\n"
  },
  {
    "path": "packages/cm6-graphql/src/lint.ts",
    "content": "import { Diagnostic, linter } from '@codemirror/lint';\nimport { getDiagnostics } from 'graphql-language-service';\nimport { Position, posToOffset } from './helpers';\nimport {\n  getOpts,\n  getSchema,\n  optionsStateField,\n  schemaStateField,\n} from './state';\nimport { Extension } from '@codemirror/state';\nimport { validateSchema } from 'graphql';\n\nconst SEVERITY = ['error', 'warning', 'info'] as const;\n\nexport const lint: Extension = linter(\n  view => {\n    const schema = getSchema(view.state);\n    const options = getOpts(view.state);\n    if (!schema) {\n      return [];\n    }\n    const validationErrors = validateSchema(schema);\n    if (validationErrors.length) {\n      if (!options?.showErrorOnInvalidSchema) {\n        return [];\n      }\n\n      const combinedError = validationErrors.map(error => {\n        return error.message;\n      });\n\n      return [\n        {\n          from: 0,\n          to: view.state.doc.length,\n          severity: 'error',\n          message: combinedError.join('\\n'),\n          actions: [], // TODO:\n        },\n      ];\n    }\n    const results = getDiagnostics(view.state.doc.toString(), schema);\n\n    return results\n      .map((item): Diagnostic | null => {\n        if (!item.severity || !item.source) {\n          return null;\n        }\n\n        const calculatedFrom = posToOffset(\n          view.state.doc,\n          new Position(item.range.start.line, item.range.start.character),\n        );\n        const from = Math.max(\n          0,\n          Math.min(calculatedFrom, view.state.doc.length),\n        );\n        const calculatedRo = posToOffset(\n          view.state.doc,\n          new Position(item.range.end.line, item.range.end.character - 1),\n        );\n        const to = Math.min(\n          Math.max(from + 1, calculatedRo),\n          view.state.doc.length,\n        );\n        return {\n          from,\n          to: from === to ? to + 1 : to,\n          severity: SEVERITY[item.severity - 1],\n          // source: item.source, // TODO:\n          message: item.message,\n          actions: [], // TODO:\n        };\n      })\n      .filter((_): _ is Diagnostic => Boolean(_));\n  },\n  {\n    needsRefresh(vu) {\n      return (\n        vu.startState.field(schemaStateField) !==\n          vu.state.field(schemaStateField) ||\n        vu.startState.field(optionsStateField) !==\n          vu.state.field(optionsStateField)\n      );\n    },\n  },\n);\n"
  },
  {
    "path": "packages/cm6-graphql/src/state.ts",
    "content": "import { EditorState, StateField, StateEffect } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { GraphQLSchema } from 'graphql';\nimport { GqlExtensionsOptions } from './interfaces';\n\nconst schemaEffect = StateEffect.define<GraphQLSchema | undefined>();\nexport const schemaStateField = StateField.define<GraphQLSchema | void>({\n  create() {},\n  update(schema, tr) {\n    for (const e of tr.effects) {\n      if (e.is(schemaEffect)) {\n        return e.value;\n      }\n    }\n\n    return schema;\n  },\n});\n\nconst optionsEffect = StateEffect.define<GqlExtensionsOptions | undefined>();\nexport const optionsStateField = StateField.define<GqlExtensionsOptions | void>(\n  {\n    create() {},\n    update(opts, tr) {\n      for (const e of tr.effects) {\n        if (e.is(optionsEffect)) {\n          return e.value;\n        }\n      }\n\n      return opts;\n    },\n  },\n);\nexport const updateSchema = (view: EditorView, schema?: GraphQLSchema) => {\n  view.dispatch({\n    effects: schemaEffect.of(schema),\n  });\n};\nexport const updateOpts = (view: EditorView, opts?: GqlExtensionsOptions) => {\n  view.dispatch({\n    effects: optionsEffect.of(opts),\n  });\n};\nexport const getSchema = (state: EditorState) => {\n  return state.field(schemaStateField);\n};\nexport const getOpts = (state: EditorState) => {\n  return state.field(optionsStateField);\n};\n\nconst defaultOpts: GqlExtensionsOptions = {\n  showErrorOnInvalidSchema: true,\n};\n\nexport const stateExtensions = (\n  schema?: GraphQLSchema,\n  opts?: GqlExtensionsOptions,\n) => [\n  schemaStateField.init(() => schema),\n  optionsStateField.init(() => ({ ...defaultOpts, ...opts })),\n];\n"
  },
  {
    "path": "packages/cm6-graphql/src/syntax.grammar",
    "content": "\n// https://spec.graphql.org/October2021/#sec-Document-Syntax\n\n// https://github.com/antlr/grammars-v4/blob/49469cb6906f4514be3c04ac0c61c78bc5a6e35a/graphql/GraphQL.g4\n\n@precedence {\n  vDef\n}\n\n@skip { whitespace | Comment }\n\n// https://spec.graphql.org/October2021/#Document\n@top Document { definition+ }\n\n// https://spec.graphql.org/October2021/#Definition\ndefinition { executableDefinition | typeSystemDefinitionOrExtension }\n\n// https://spec.graphql.org/October2021/#TypeSystemDefinitionOrExtension\ntypeSystemDefinitionOrExtension { TypeSystemDefinition | TypeSystemExtension }\n\n// https://spec.graphql.org/October2021/#TypeSystemExtension\nTypeSystemExtension {\n  SchemaExtension | TypeExtension\n}\n\n// https://spec.graphql.org/October2021/#SchemaExtension\nSchemaExtension {\n  ExtendKeyword SchemaKeyword Directives? RootTypeDefinition |\n  ExtendKeyword SchemaKeyword Directives\n}\n\n// https://spec.graphql.org/October2021/#TypeExtension\nTypeExtension {\n  ScalarTypeExtension |\n  ObjectTypeExtension |\n  InterfaceTypeExtension |\n  UnionTypeExtension |\n  EnumTypeExtension |\n  InputObjectTypeExtension\n}\n\n// https://spec.graphql.org/October2021/#ScalarTypeExtension\nScalarTypeExtension {\n  ExtendKeyword ScalarKeyword Name Directives\n}\n\n// https://spec.graphql.org/October2021/#ObjectTypeExtension\nObjectTypeExtension {\n  ExtendKeyword TypeKeyword Name ImplementsInterfaces? Directives? FieldsDefinition |\n  ExtendKeyword TypeKeyword Name ImplementsInterfaces? Directives |\n  ExtendKeyword TypeKeyword Name ImplementsInterfaces\n}\n\n// https://spec.graphql.org/October2021/#InterfaceTypeExtension\nInterfaceTypeExtension {\n  ExtendKeyword InterfaceKeyword Name ImplementsInterfaces? Directives? FieldsDefinition |\n  ExtendKeyword InterfaceKeyword Name ImplementsInterfaces? Directives |\n  ExtendKeyword InterfaceKeyword Name ImplementsInterfaces\n}\n\n// https://spec.graphql.org/October2021/#UnionTypeExtension\nUnionTypeExtension {\n  ExtendKeyword UnionKeyword Name Directives? UnionMemberTypes |\n  ExtendKeyword UnionKeyword Name Directives\n}\n\n// https://spec.graphql.org/October2021/#EnumTypeExtension\nEnumTypeExtension {\n  ExtendKeyword EnumKeyword Name Directives? EnumValuesDefinition |\n  ExtendKeyword EnumKeyword Name Directives\n}\n\n// https://spec.graphql.org/October2021/#InputObjectTypeExtension\nInputObjectTypeExtension {\n  ExtendKeyword InputKeyword Name Directives? InputFieldsDefinition |\n  ExtendKeyword InputKeyword Name Directives\n}\n\n// https://spec.graphql.org/October2021/#ExecutableDefinition\nexecutableDefinition { OperationDefinition | FragmentDefinition }\n\n// https://spec.graphql.org/October2021/#OperationDefinition\nOperationDefinition {\n  OperationType Name? VariableDefinitions? Directives? SelectionSet |\n  SelectionSet\n}\n\n// https://spec.graphql.org/October2021/#TypeSystemDefinition\nTypeSystemDefinition {\n  SchemaDefinition |\n  TypeDefinition |\n  DirectiveDefinition\n}\n\n// https://spec.graphql.org/October2021/#SchemaDefinition\nSchemaDefinition {\n  Description? SchemaKeyword Directives? RootTypeDefinition\n}\n\nRootTypeDefinition { scopedBraces<RootOperationTypeDefinition> }\n\n// https://spec.graphql.org/October2021/#Description\nDescription { StringValue }\n\n// https://spec.graphql.org/October2021/#RootOperationTypeDefinition\nRootOperationTypeDefinition { OperationType \":\" NamedType }\n\n// https://spec.graphql.org/October2021/#TypeDefinition\nTypeDefinition {\n  ScalarTypeDefinition |\n  ObjectTypeDefinition |\n  InterfaceTypeDefinition |\n  UnionTypeDefinition |\n  EnumTypeDefinition |\n  InputObjectTypeDefinition\n}\n\n// https://spec.graphql.org/October2021/#DirectiveDefinition\nDirectiveDefinition {\n  Description? DirectiveKeyword DirectiveName ArgumentsDefinition? RepeatableKeyword? OnKeyword DirectiveLocations\n}\n\n// https://spec.graphql.org/October2021/#DirectiveLocations\nDirectiveLocations {\n  DirectiveLocations \"|\" DirectiveLocation |\n  \"|\"? DirectiveLocation\n}\n\n// https://spec.graphql.org/October2021/#DirectiveLocation\nDirectiveLocation {\n  ExecutableDirectiveLocation |\n  TypeSystemDirectiveLocation\n}\n\nExecutableDirectiveLocation {\n  \"QUERY\" |\n  \"MUTATION\" |\n  \"SUBSCRIPTION\" |\n  \"FIELD\" |\n  \"FRAGMENT_DEFINITION\" |\n  \"FRAGMENT_SPREAD\" |\n  \"INLINE_FRAGMENT\" |\n  \"VARIABLE_DEFINITION\"\n}\n\nTypeSystemDirectiveLocation {\n  \"SCHEMA\" |\n  \"SCALAR\" |\n  \"OBJECT\" |\n  \"FIELD_DEFINITION\" |\n  \"ARGUMENT_DEFINITION\" |\n  \"INTERFACE\" |\n  \"UNION\" |\n  \"ENUM\" |\n  \"ENUM_VALUE\" |\n  \"INPUT_OBJECT\" |\n  \"INPUT_FIELD_DEFINITION\"\n\n}\n\n// https://spec.graphql.org/October2021/#ScalarTypeDefinition\nScalarTypeDefinition {\n  Description ScalarKeyword Name Directives?\n}\n\n// https://spec.graphql.org/October2021/#ObjectTypeDefinition\nObjectTypeDefinition {\n  Description? TypeKeyword Name ImplementsInterfaces? Directives? FieldsDefinition?\n}\n\n// https://spec.graphql.org/October2021/#InterfaceTypeDefinition\nInterfaceTypeDefinition {\n  Description? InterfaceKeyword Name ImplementsInterfaces? Directives? FieldsDefinition?\n}\n\n// https://spec.graphql.org/October2021/#UnionTypeDefinition\nUnionTypeDefinition {\n  Description? UnionKeyword Name Directives? UnionMemberTypes?\n}\n\n// https://spec.graphql.org/October2021/#EnumTypeDefinition\nEnumTypeDefinition {\n  Description? EnumKeyword Name Directives? EnumValuesDefinition?\n}\n\n// https://spec.graphql.org/October2021/#InputObjectTypeDefinition\nInputObjectTypeDefinition {\n  Description? InputKeyword Name Directives? InputFieldsDefinition?\n}\n\n// https://spec.graphql.org/October2021/#InputFieldsDefinition\nInputFieldsDefinition {\n  scopedBraces<InputValueDefinition+>\n}\n\n// https://spec.graphql.org/October2021/#EnumValuesDefinition\nEnumValuesDefinition {\n  scopedBraces<EnumValueDefinition+>\n}\n\n// https://spec.graphql.org/October2021/#EnumValueDefinition\nEnumValueDefinition {\n  Description? EnumValue Directives?\n}\n\n// https://spec.graphql.org/October2021/#UnionMemberTypes\nUnionMemberTypes {\n  UnionMemberTypes \"|\" NamedType |\n  \"=\" \"|\"? NamedType\n}\n\n// https://spec.graphql.org/October2021/#ImplementsInterfaces\nImplementsInterfaces {\n  ImplementsInterfaces \"&\" NamedType |\n  ImplementsKeyword \"&\"? NamedType\n}\n\n// https://spec.graphql.org/October2021/#FieldsDefinition\nFieldsDefinition { scopedBraces<FieldDefinition+> }\n\n// https://spec.graphql.org/October2021/#FieldDefinition\nFieldDefinition {\n  Description? Name ArgumentsDefinition? \":\" type Directives?\n}\n\n// https://spec.graphql.org/October2021/#ArgumentsDefinition\nArgumentsDefinition { InputValueDefinition+ }\n\n// https://spec.graphql.org/October2021/#InputValueDefinition\nInputValueDefinition {\n  Description? Name \":\" type DefaultValue? Directives?\n}\n\n// https://spec.graphql.org/October2021/#FragmentDefinition\nFragmentDefinition {\n  FragmentKeyword FragmentName TypeCondition Directives? SelectionSet\n}\n\n// https://spec.graphql.org/October2021/#FragmentSpread\nFragmentSpread {\n  \"...\" FragmentName Directives?\n}\n\n// https://spec.graphql.org/October2021/#FragmentName\nFragmentName {\n  Name // TODO: not `on`\n}\n\n// https://spec.graphql.org/October2021/#InlineFragment\nInlineFragment {\n  \"...\" TypeCondition? Directives? SelectionSet\n}\n\n// https://spec.graphql.org/October2021/#TypeCondition\nTypeCondition { OnKeyword NamedType }\n\n// https://spec.graphql.org/October2021/#OperationType\nOperationType { operation<\"query\"> | operation<\"mutation\"> | operation<\"subscription\"> }\n\n// https://spec.graphql.org/October2021/#VariableDefinitions\nVariableDefinitions { \"(\" VariableDefinition+ \")\" }\n\n// TODO: Directives[Const]\n// https://spec.graphql.org/October2021/#VariableDefinition\nVariableDefinition {\n  Variable \":\" type DefaultValue? Directives? comma?\n}\n\n// https://spec.graphql.org/October2021/#Type\ntype { NamedType | ListType | NonNullType }\n\n// https://spec.graphql.org/October2021/#NamedType\nNamedType { Name }\n\n// https://spec.graphql.org/October2021/#ListType\nListType { \"[\" type \"]\" }\n\n// https://spec.graphql.org/October2021/#NonNullType\nNonNullType {\n  NamedType \"!\" |\n  ListType \"!\"\n}\n\n// https://spec.graphql.org/October2021/#Directives\nDirectives { Directive+ }\n\n// https://spec.graphql.org/October2021/#Directive\nDirective { DirectiveName Arguments? }\n\n// https://spec.graphql.org/October2021/#Arguments\nArguments { \"(\" Argument+ \")\"}\n\n// https://spec.graphql.org/October2021/#Argument\nArgument { ArgumentAttributeName \":\" value comma? }\n\nArgumentAttributeName { name }\n\n// https://spec.graphql.org/October2021/#SelectionSet\nSelectionSet { \"{\" Selection+ \"}\" }\n\n// https://spec.graphql.org/October2021/#Selection\nSelection {\n  (Field | FragmentSpread | InlineFragment) comma?\n}\n\n// https://spec.graphql.org/October2021/#Field\nField {\n  Alias? FieldName Arguments? Directives? SelectionSet?\n}\n\nFieldName { name }\n\n// https://spec.graphql.org/October2021/#Alias\nAlias { Name \":\" }\n\n// TODO: Value[Const]\n// https://spec.graphql.org/October2021/#DefaultValue\nDefaultValue { \"=\" value }\n\n// https://spec.graphql.org/October2021/#Value\nvalue {\n  Variable | // TODO: [if not Const]\n  IntValue |\n  FloatValue |\n  StringValue |\n  BooleanValue |\n  NullValue |\n  EnumValue |\n  ListValue | // TODO: [?Const]\n  ObjectValue // TODO: [?Const]\n}\n\n// https://spec.graphql.org/October2021/#ListValue\nListValue { \"[\" (value comma?)* \"]\" }\n\n// TODO: ObjectField[Const]\n// https://spec.graphql.org/October2021/#ObjectValue\nObjectValue {\n  \"{\" objectField* \"}\"\n}\n\n// https://spec.graphql.org/October2021/#ObjectField\nobjectField {\n  Name \":\" value comma?\n}\n\nName { name }\n\n@tokens {\n\n  @precedence { FloatValue, IntValue }\n  @precedence { NullValue, EnumValue }\n  @precedence { BooleanValue, EnumValue }\n\n  DirectiveName { \"@\" name }\n\n  // https://spec.graphql.org/October2021/#Variable\n  Variable { \"$\" name }\n\n  // https://spec.graphql.org/October2021/#IntValue\n  IntValue {\n    \"-\"? @digit+\n  }\n  \n  // https://spec.graphql.org/October2021/#FloatValue\n  FloatValue {\n    IntValue fractionalPart exponentPart |\n    IntValue fractionalPart |\n    IntValue exponentPart\n  }\n  \n  fractionalPart {\n    \".\" @digit+\n  }\n  \n  exponentPart {\n    $[eE] $[+\\-]? @digit+\n  }\n  \n  // https://spec.graphql.org/October2021/#StringValue\n  StringValue {\n    '\"' stringCharacter* '\"' |\n    '\"\"\"' blockStringCharacter* '\"\"\"'\n  }\n  \n  // https://spec.graphql.org/October2021/#StringCharacter\n  stringCharacter {\n    ![\"\\\\\\r\\n] |\n    \"\\\\u\" escapedUnicode |\n    \"\\\\\" escapedCharacter\n  }\n  \n  // https://spec.graphql.org/October2021/#BlockStringCharacter\n  blockStringCharacter {\n    '\\\\\"\"\"' |\n    '\"' '\"'? ![\"] |\n    stringCharacter |\n    '\\n' |\n    '\\r\\n'\n  }\n  \n  // https://spec.graphql.org/October2021/#EscapedUnicode\n  escapedUnicode {\n    $[0-9A-Fa-f] $[0-9A-Fa-f] $[0-9A-Fa-f] $[0-9A-Fa-f]\n  }\n  \n  // https://spec.graphql.org/October2021/#EscapedCharacter\n  escapedCharacter { \"\\\"\" | \"\\\\\" | \"/\" | \"b\" | \"f\" | \"n\" | \"r\" | \"t\"}\n  \n  // https://spec.graphql.org/October2021/#BooleanValue\n  BooleanValue { \"true\" | \"false\" }\n  \n  // https://spec.graphql.org/October2021/#NullValue\n  NullValue { \"null\" }\n  \n  // TODO: Value but not true or false or null\n  // https://spec.graphql.org/October2021/#EnumValue\n  EnumValue { name }\n  \n  // https://spec.graphql.org/October2021/#Name\n  name { $[_A-Za-z] $[_0-9A-Za-z]* }\n\n  // Name { name }\n\n  Comment { \"#\" ![\\n]* }\n\n  \"{\" \"}\" \"(\" \")\" \"[\" \"]\"\n\n  comma { \",\" }\n\n  whitespace { @whitespace+ }\n}\n\nscopedBraces<expr> { !vDef \"{\" expr \"}\" }\n\n// keywords\nkw<term> { @specialize[@name={term}]<name, term> }\n\noperation<term> { @extend<name, term> }\n\nScalarKeyword { kw<\"scalar\"> }\nTypeKeyword { kw<\"type\"> }\nInterfaceKeyword { kw<\"interface\"> }\nUnionKeyword { kw<\"union\"> }\nEnumKeyword { kw<\"enum\"> }\nInputKeyword { kw<\"input\"> }\nImplementsKeyword { kw<\"implements\"> }\nFragmentKeyword { kw<\"fragment\"> }\nExtendKeyword { kw<\"extend\"> }\nSchemaKeyword { kw<\"schema\"> }\nDirectiveKeyword { kw<\"directive\"> }\nOnKeyword { kw<\"on\"> }\nRepeatableKeyword { kw<\"repeatable\"> }\n\n@detectDelim\n"
  },
  {
    "path": "packages/cm6-graphql/src/syntax.grammar.d.ts",
    "content": "import { LRParser } from '@lezer/lr';\n\nexport declare const parser: LRParser;\n"
  },
  {
    "path": "packages/cm6-graphql/tsconfig.esm.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"newLine\": \"lf\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src/*.ts\"],\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/cm6-graphql/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"target\": \"es6\",\n    \"module\": \"es2020\",\n    \"newLine\": \"lf\",\n    \"declaration\": true,\n    \"moduleResolution\": \"node\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src\", \"__tests__\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/dist/**.*\"],\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/.npmignore",
    "content": "babel.config.js\n.gitignore\nresources\nsrc\n"
  },
  {
    "path": "packages/codemirror-graphql/CHANGELOG.md",
    "content": "# Change Log\n\n## 2.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd)]:\n  - graphql-language-service@5.5.0\n\n## 2.2.3\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `getComputedStyle` over `window.getComputedStyle`\n\n## 2.2.3-rc.0\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `getComputedStyle` over `window.getComputedStyle`\n\n## 2.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`9498dee`](https://github.com/graphql/graphiql/commit/9498deea7636fd82602f230b6b21c743ca5705a7)]:\n  - graphql-language-service@5.4.0\n\n## 2.2.1\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n- Updated dependencies [[`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - graphql-language-service@5.3.1\n\n## 2.2.0\n\n### Minor Changes\n\n- [#3825](https://github.com/graphql/graphiql/pull/3825) [`7cdcabf`](https://github.com/graphql/graphiql/commit/7cdcabf9d401683e90c995476b187c6f8ea70f63) Thanks [@dimaMachina](https://github.com/dimaMachina)! - migrate `graphiql` from `jest` to `vitest`\n\n## 2.1.1\n\n### Patch Changes\n\n- [#3751](https://github.com/graphql/graphiql/pull/3751) [`b8538d8`](https://github.com/graphql/graphiql/commit/b8538d87421edb086b32d4eb2e30a3f7d9d9e893) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace deprecated `navigator.platform` with `navigator.userAgent`\n\n  fix placeholder `⌘ K` in doc explorer search input for non mac devices, replace by `Ctrl K`\n\n## 2.1.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service@5.3.0\n\n## 2.0.13\n\n### Patch Changes\n\n- [#3637](https://github.com/graphql/graphiql/pull/3637) [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update eslint plugins and fix errors\n\n- Updated dependencies [[`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d)]:\n  - graphql-language-service@5.2.2\n\n## 2.0.12\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service@5.2.1\n\n## 2.0.11\n\n### Patch Changes\n\n- [#3567](https://github.com/graphql/graphiql/pull/3567) [`fc7de5a7`](https://github.com/graphql/graphiql/commit/fc7de5a75f4b23dd62dd630b705895b5fa5d0a03) Thanks [@retrodaredevil](https://github.com/retrodaredevil)! - tooltip a tag's click listener calls event.preventDefault() to stop navigating away from page\n\n## 2.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n\n## 2.0.9\n\n### Patch Changes\n\n- [#3203](https://github.com/graphql/graphiql/pull/3203) [`61986469`](https://github.com/graphql/graphiql/commit/619864691941c46cc0b0848e8713028e20212c36) Thanks [@lesleydreyer](https://github.com/lesleydreyer)! - fix info tooltips to work when Graphiql is not used as full page\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7\n\n## 2.0.9-alpha.1\n\n### Patch Changes\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7-alpha.0\n\n## 2.0.9-alpha.0\n\n### Patch Changes\n\n- [#3203](https://github.com/graphql/graphiql/pull/3203) [`61986469`](https://github.com/graphql/graphiql/commit/619864691941c46cc0b0848e8713028e20212c36) Thanks [@lesleydreyer](https://github.com/lesleydreyer)! - fix info tooltips to work when Graphiql is not used as full page\n\n## 2.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939)]:\n  - graphql-language-service@5.1.6\n\n## 2.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service@5.1.5\n\n## 2.0.6\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- [#3109](https://github.com/graphql/graphiql/pull/3109) [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-floating-promises` eslint rule\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9)]:\n  - graphql-language-service@5.1.4\n\n## 2.0.5\n\n### Patch Changes\n\n- [#3046](https://github.com/graphql/graphiql/pull/3046) [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer .at() method for index access\n\n- Updated dependencies [[`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0)]:\n  - graphql-language-service@5.1.3\n\n## 2.0.4\n\n### Patch Changes\n\n- [#2993](https://github.com/graphql/graphiql/pull/2993) [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4) Thanks [@B2o5T](https://github.com/B2o5T)! - add `unicorn/consistent-destructuring` rule\n\n- [#2962](https://github.com/graphql/graphiql/pull/2962) [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d) Thanks [@B2o5T](https://github.com/B2o5T)! - clean all ESLint warnings, add `--max-warnings=0` and `--cache` flags\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n\n## 2.0.3\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2941](https://github.com/graphql/graphiql/pull/2941) [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-logical-operator-over-ternary` rule\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- [#2936](https://github.com/graphql/graphiql/pull/2936) [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `lonely-if`/`unicorn/lonely-if` rules\n\n- [#2963](https://github.com/graphql/graphiql/pull/2963) [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `prefer-destructuring` rule\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171)]:\n  - graphql-language-service@5.1.1\n\n## 2.0.2\n\n### Patch Changes\n\n- [#2852](https://github.com/graphql/graphiql/pull/2852) [`20869583`](https://github.com/graphql/graphiql/commit/20869583eff563f5d6494e93302a835f0e034f4b) Thanks [@acao](https://github.com/acao)! - increment @codemirror/language peer dependency to 6.0.0\n\n## 2.0.1\n\n### Patch Changes\n\n- [#2847](https://github.com/graphql/graphiql/pull/2847) [`353f434e`](https://github.com/graphql/graphiql/commit/353f434e5f6bfd1bf6f8ee97d4ae8ce4f897085f) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Don't show error in variable editor linting for missing input objects that have a default value\n\n## 2.0.0\n\n### Major Changes\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: Change the implementation of the info popup when hovering items in the code editor:\n  - For fields the type prefix was removed, i.e. `MyType.myField` -> `myField`\n  - For args, the type and field was removed, i.e. `MyType.myField(myArg: MyArgType)` -> `myArg: MyArgType`\n  - The DOM structure of the info tooltip changed to enable more flexible styling:\n    - The first section (i.e. the clickable parts like type and field name) are wrapped in an additional div\n    - The markdown content for deprecation reasons is wrapped in an additional div\n\n## 1.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782)]:\n  - graphql-language-service@5.1.0\n\n## 1.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - graphql-language-service@5.0.6\n\n## 1.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service@5.0.5\n\n## 1.3.0\n\n### Minor Changes\n\n- [#2369](https://github.com/graphql/graphiql/pull/2369) [`2dec55f2`](https://github.com/graphql/graphiql/commit/2dec55f2c5e979cc7bb1adadff4fb063775b088c) Thanks [@sergeichestakov](https://github.com/sergeichestakov)! - Moved @codemirror/language to peer dependencies and upgraded to 0.20.0\n\n### Patch Changes\n\n- Updated dependencies [[`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2)]:\n  - graphql-language-service@5.0.4\n\n## 1.2.17\n\n### Patch Changes\n\n- Updated dependencies [[`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902)]:\n  - graphql-language-service@5.0.3\n\n## 1.2.16\n\n### Patch Changes\n\n- Updated dependencies [[`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f)]:\n  - graphql-language-service@5.0.2\n\n## 1.2.15\n\n### Patch Changes\n\n- [#2261](https://github.com/graphql/graphiql/pull/2261) [`261f2044`](https://github.com/graphql/graphiql/commit/261f2044066412e40f9962bef55295f7c9c35aec) Thanks [@acao](https://github.com/acao)! - Fix typescript path resolution bug in codemirror-graphql\n\n## 1.2.14\n\n### Patch Changes\n\n- Updated dependencies [[`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa), [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa)]:\n  - graphql-language-service@5.0.1\n\n## 1.2.13\n\n### Patch Changes\n\n- Updated dependencies [[`2502a364`](https://github.com/graphql/graphiql/commit/2502a364b74dc754d92baa1579b536cf42139958)]:\n  - graphql-language-service@5.0.0\n\n## 1.2.12\n\n### Patch Changes\n\n- Updated dependencies [[`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f), [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c), [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5)]:\n  - graphql-language-service@4.1.5\n\n## 1.2.11\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service@4.1.4\n\n## 1.2.10\n\n### Patch Changes\n\n- Updated dependencies [[`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8)]:\n  - graphql-language-service@4.1.3\n\n## 1.2.9\n\n### Patch Changes\n\n- Updated dependencies [[`e20760fb`](https://github.com/graphql/graphiql/commit/e20760fbd95c13d6d549cba3faa15a59aee9a2c0)]:\n  - graphql-language-service@4.1.2\n\n## 1.2.8\n\n### Patch Changes\n\n- [#2091](https://github.com/graphql/graphiql/pull/2091) [`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63) Thanks [@acao](https://github.com/acao)! - Fix graphql 15 related issues. Should now build & test interchangeably.\n\n- Updated dependencies []:\n  - graphql-language-service@4.1.1\n\n## 1.2.7\n\n### Patch Changes\n\n- Updated dependencies [[`0f1f90ce`](https://github.com/graphql/graphiql/commit/0f1f90ce8f4a25ddebdaf7a9ddbe136214aa64a3)]:\n  - graphql-language-service@4.1.0\n\n## 1.2.6\n\n### Patch Changes\n\n- Updated dependencies [[`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3)]:\n  - graphql-language-service@4.0.0\n\n## 1.2.5\n\n### Patch Changes\n\n- Updated dependencies [[`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1)]:\n  - graphql-language-service@3.2.5\n\n## 1.2.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service@3.2.4\n\n## 1.2.3\n\n### Patch Changes\n\n- [`c42b145f`](https://github.com/graphql/graphiql/commit/c42b145fffeaefbd1103bc7addee1873e939bc83) [#2052](https://github.com/graphql/graphiql/pull/2052) Thanks [@imolorhe](https://github.com/imolorhe)! - Added cm6-legacy to published files list\n\n## 1.2.2\n\n### Patch Changes\n\n- [`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf) [#2047](https://github.com/graphql/graphiql/pull/2047) Thanks [@willstott101](https://github.com/willstott101)! - Source code included in all packages to fix source maps. codemirror-graphql includes esm build in package.\n\n* [`8b486555`](https://github.com/graphql/graphiql/commit/8b486555e2aa4d90891070a1bbc52b59d9c670c4) [#2046](https://github.com/graphql/graphiql/pull/2046) Thanks [@willstott101](https://github.com/willstott101)! - Further resolves #1944, replaces graphql-language-service-parser with graphql-language-service in codemirror-graphql\n\n* Updated dependencies [[`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf)]:\n  - graphql-language-service@3.2.3\n\n## 1.2.1\n\n### Patch Changes\n\n- [`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf) [#2045](https://github.com/graphql/graphiql/pull/2045) Thanks [@acao](https://github.com/acao)! - fix graphql-js peer dependencies - [#2044](https://github.com/graphql/graphiql/pull/2044)\n\n- Updated dependencies [[`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf)]:\n  - graphql-language-service@3.2.2\n\n## 1.2.0\n\n### Minor Changes\n\n- [`d0c22c4f`](https://github.com/graphql/graphiql/commit/d0c22c4fce5ea39611c7ecee553943fdf27fd03e) [#2035](https://github.com/graphql/graphiql/pull/2035) Thanks [@imolorhe](https://github.com/imolorhe)! - Added Codemirror 6 legacy support\n\n### Patch Changes\n\n- [`b79bf304`](https://github.com/graphql/graphiql/commit/b79bf304045add4b5c3b2539dd6b551a64e6ed87) [#2037](https://github.com/graphql/graphiql/pull/2037) Thanks [@acao](https://github.com/acao)! - Resolves #1944, replaces graphql-language-service-utils with graphql-language-service in codemirror-graphql\n\n## 1.1.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n### Patch Changes\n\n- Updated dependencies [[`8869c4b1`](https://github.com/graphql/graphiql/commit/8869c4b18c900b9b35556255587ef5130a96a4d5), [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a)]:\n  - graphql-language-service-interface@2.9.0\n  - graphql-language-service-parser@1.10.0\n\n## 1.0.3\n\n### Patch Changes\n\n- [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8) [#1777](https://github.com/graphql/graphiql/pull/1777) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - adopt block string parsing for variables in language parser\n\n- Updated dependencies [[`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8)]:\n  - graphql-language-service-parser@1.9.3\n\n## 1.0.2\n\n### Patch Changes\n\n- [`5b8a057d`](https://github.com/graphql/graphiql/commit/5b8a057dd64ebecc391be32176a2403bb9d9ff92) [#1838](https://github.com/graphql/graphiql/pull/1838) Thanks [@acao](https://github.com/acao)! - Set all cross-runtime build targets to es6\n\n## 1.0.1\n\n### Patch Changes\n\n- [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n## 1.0.0\n\n### Major Changes\n\n- [`b4fc16c0`](https://github.com/graphql/graphiql/commit/b4fc16c025da6f466727dc17cab6026d14c6e7fe) Thanks [@imolorhe](https://github.com/imolorhe)! - BREAKING CHANGE Migrate to Typescript - [@imolorhe](https://github.com/imolorhe)\n\nAll notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [0.15.2](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.15.1...codemirror-graphql@0.15.2) (2021-01-07)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.15.1](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.15.0...codemirror-graphql@0.15.1) (2021-01-07)\n\n### Bug Fixes\n\n- bug with externalFragments in codemirror ([#1751](https://github.com/graphql/graphiql/issues/1751)) ([f423e61](https://github.com/graphql/graphiql/commit/f423e615330bf8529f4068889d6760501b732527))\n\n## [0.15.0](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.14.0...codemirror-graphql@0.15.0) (2021-01-07)\n\n### Features\n\n- implied or external fragments, for [#612](https://github.com/graphql/graphiql/issues/612) ([#1750](https://github.com/graphql/graphiql/issues/1750)) ([cfed265](https://github.com/graphql/graphiql/commit/cfed265e3cf31875b39ea517781a217fcdfcadc2))\n\n## [0.14.0](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.13.1...codemirror-graphql@0.14.0) (2021-01-03)\n\n### Features\n\n- merge completion logic (for implements &, variables) ([#1747](https://github.com/graphql/graphiql/issues/1747)) ([0ac0a85](https://github.com/graphql/graphiql/commit/0ac0a856cfc715d7885a9965a9a9114ef2ca4b1a))\n\n## [0.13.1](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.13.0...codemirror-graphql@0.13.1) (2020-12-28)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.13.0](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.4...codemirror-graphql@0.13.0) (2020-12-08)\n\n### Features\n\n- provide validation rules via props ([#1716](https://github.com/graphql/graphiql/issues/1716)) ([0c5785c](https://github.com/graphql/graphiql/commit/0c5785c82adbd4affb25300ae2d128b42c9b81fe))\n\n## [0.12.4](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.3...codemirror-graphql@0.12.4) (2020-11-28)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.3](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.2...codemirror-graphql@0.12.3) (2020-10-20)\n\n### Bug Fixes\n\n- **codemirror-graphql:** give interface field name suggestions ([#1695](https://github.com/graphql/graphiql/issues/1695)) ([669b301](https://github.com/graphql/graphiql/commit/669b3013fc679eca7c4e5c8ed6b0cd2fb2dbf2dc))\n\n## [0.12.2](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.2-alpha.2...codemirror-graphql@0.12.2) (2020-09-18)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.2-alpha.2](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.2-alpha.1...codemirror-graphql@0.12.2-alpha.2) (2020-09-11)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.2-alpha.1](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.2-alpha.0...codemirror-graphql@0.12.2-alpha.1) (2020-08-12)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.2-alpha.0](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.1...codemirror-graphql@0.12.2-alpha.0) (2020-08-10)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.1](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0...codemirror-graphql@0.12.1) (2020-08-06)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.11...codemirror-graphql@0.12.0) (2020-06-11)\n\n### Bug Fixes\n\n- value of documentation in completion list ([#1567](https://github.com/graphql/graphiql/issues/1567)) ([39c00a5](https://github.com/graphql/graphiql/commit/39c00a55d7af43ce4e57ad9b1d5cd55393beb0d0))\n\n## [0.12.0-alpha.11](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.10...codemirror-graphql@0.12.0-alpha.11) (2020-06-04)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.10](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.9...codemirror-graphql@0.12.0-alpha.10) (2020-06-04)\n\n### Bug Fixes\n\n- cleanup cache entry from lerna publish ([4a26218](https://github.com/graphql/graphiql/commit/4a2621808a1aea8b30d5d27b8d86a60bf2b44b01))\n- make list type and non-nullable type available ([#902](https://github.com/graphql/graphiql/issues/902)) ([cea837f](https://github.com/graphql/graphiql/commit/cea837ff77c36dadb01b4302282821b00d7f5f2f))\n\n## [0.12.0-alpha.9](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.8...codemirror-graphql@0.12.0-alpha.9) (2020-05-28)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.8](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.7...codemirror-graphql@0.12.0-alpha.8) (2020-05-17)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.7](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.6...codemirror-graphql@0.12.0-alpha.7) (2020-04-10)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.6](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.5...codemirror-graphql@0.12.0-alpha.6) (2020-04-10)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.5](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.4...codemirror-graphql@0.12.0-alpha.5) (2020-04-06)\n\n### Features\n\n- upgrade to graphql@15.0.0 for [#1191](https://github.com/graphql/graphiql/issues/1191) ([#1204](https://github.com/graphql/graphiql/issues/1204)) ([f13c8e9](https://github.com/graphql/graphiql/commit/f13c8e9d0e66df4b051b332c7d02f4bb83e07ffd))\n\n## [0.12.0-alpha.4](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.3...codemirror-graphql@0.12.0-alpha.4) (2020-04-03)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.3](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.2...codemirror-graphql@0.12.0-alpha.3) (2020-03-20)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.2](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.12.0-alpha.0...codemirror-graphql@0.12.0-alpha.2) (2020-03-20)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.12.0-alpha.1](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.6...codemirror-graphql@0.12.0-alpha.1) (2020-01-18)\n\n### Bug Fixes\n\n- linting issues, trailingCommas: all ([#1099](https://github.com/graphql/graphiql/issues/1099)) ([de4005b](https://github.com/graphql/graphiql/commit/de4005b))\n- screenshot/gif urls ([e3ea2fc](https://github.com/graphql/graphiql/commit/e3ea2fc))\n\n### Features\n\n- convert LSP Server to Typescript, remove watchman ([#1138](https://github.com/graphql/graphiql/issues/1138)) ([8e33dbb](https://github.com/graphql/graphiql/commit/8e33dbb))\n\n## [0.11.6](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.5...codemirror-graphql@0.11.6) (2019-12-09)\n\n### Bug Fixes\n\n- codemirror results bundle ([dd06eb5](https://github.com/graphql/graphiql/commit/dd06eb5))\n\n## [0.11.5](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.4...codemirror-graphql@0.11.5) (2019-12-09)\n\n### Bug Fixes\n\n- a few more tweaks to babel ignore ([e0ad2c6](https://github.com/graphql/graphiql/commit/e0ad2c6))\n\n## [0.11.4](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.3...codemirror-graphql@0.11.4) (2019-12-03)\n\n### Bug Fixes\n\n- convert browserify build to webpack, fixes [#976](https://github.com/graphql/graphiql/issues/976) ([#1001](https://github.com/graphql/graphiql/issues/1001)) ([3caf041](https://github.com/graphql/graphiql/commit/3caf041))\n- csp headers violation [@gracenoah](https://github.com/gracenoah) graphql/codemirror-graphql[#246](https://github.com/graphql/graphiql/issues/246) ([#1044](https://github.com/graphql/graphiql/issues/1044)) ([3c9dfa5](https://github.com/graphql/graphiql/commit/3c9dfa5))\n\n## [0.11.3](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.2...codemirror-graphql@0.11.3) (2019-11-26)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.11.2](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.1...codemirror-graphql@0.11.2) (2019-10-19)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## [0.11.1](https://github.com/graphql/graphiql/compare/codemirror-graphql@0.11.0...codemirror-graphql@0.11.1) (2019-10-04)\n\n### Bug Fixes\n\n- build tweaks ([0bc6a7c](https://github.com/graphql/graphiql/commit/0bc6a7c))\n\n# 0.11.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n# 0.10.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 0.9.1-alpha.1 (2019-09-01)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## 0.9.1-alpha.0 (2019-09-01)\n\n**Note:** Version bump only for package codemirror-graphql\n\n## 0.9.1 (2019-09-01)\n\n**Note:** Version bump only for package codemirror-graphql\n"
  },
  {
    "path": "packages/codemirror-graphql/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/codemirror-graphql/README.md",
    "content": "# GraphQL mode for CodeMirror\n\n[![NPM](https://img.shields.io/npm/v/codemirror-graphql.svg?style=flat-square)](https://npmjs.com/codemirror-graphql)\n![npm downloads](https://img.shields.io/npm/dm/codemirror-graphql?label=npm%20downloads)\n[![License](https://img.shields.io/npm/l/codemirror-graphql.svg?style=flat-square)](LICENSE)\n[Discord Channel](https://discord.gg/cffZwk8NJW)\n\n**NOTE: For CodeMirror 6, use [cm6-graphql](/packages/cm6-graphql/) instead**\n\nProvides CodeMirror with a parser mode for GraphQL along with a live linter and\ntypeahead hinter powered by your GraphQL Schema.\n\n![Demo .gif of GraphQL Codemirror Mode](https://raw.githubusercontent.com/graphql/graphiql/main/packages/codemirror-graphql/resources/example.gif)\n\n### Getting Started\n\n```sh\nnpm install codemirror-graphql\n```\n\nCodeMirror helpers install themselves to the global CodeMirror when they are\nimported.\n\n```ts\nimport type { ValidationContext, SDLValidationContext } from 'graphql';\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/hint/show-hint';\nimport 'codemirror/addon/lint/lint';\nimport 'codemirror-graphql/hint';\nimport 'codemirror-graphql/lint';\nimport 'codemirror-graphql/mode';\n\nCodeMirror.fromTextArea(myTextarea, {\n  mode: 'graphql',\n  lint: {\n    schema: myGraphQLSchema,\n    validationRules: [ExampleRule],\n  },\n  hintOptions: {\n    schema: myGraphQLSchema,\n  },\n});\n```\n\n## External Fragments Example\n\nIf you want to have autocompletion for external fragment definitions, there's a\nnew configuration setting available\n\n```ts\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/hint/show-hint';\nimport 'codemirror/addon/lint/lint';\nimport 'codemirror-graphql/hint';\nimport 'codemirror-graphql/lint';\nimport 'codemirror-graphql/mode';\n\nconst externalFragments = /* GraphQL */ `\n  fragment MyFragment on Example {\n    id: ID!\n    name: String!\n  }\n   fragment AnotherFragment on Example {\n    id: ID!\n    title: String!\n  }\n`;\n\nCodeMirror.fromTextArea(myTextarea, {\n  mode: 'graphql',\n  lint: {\n    schema: myGraphQLSchema,\n  },\n  hintOptions: {\n    schema: myGraphQLSchema,\n    // here we use a string, but\n    // you can also provide an array of FragmentDefinitionNodes\n    externalFragments,\n  },\n});\n```\n\n### Custom Validation Rules\n\nIf you want to show custom validation, you can do that too! It uses the\n`ValidationRule` interface.\n\n```ts\nimport type { ValidationRule } from 'graphql';\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/hint/show-hint';\nimport 'codemirror/addon/lint/lint';\nimport 'codemirror-graphql/hint';\nimport 'codemirror-graphql/lint';\nimport 'codemirror-graphql/mode';\n\nconst ExampleRule: ValidationRule = context => {\n  // your custom rules here\n  const schema = context.getSchema();\n  const document = context.getDocument();\n  return {\n    NamedType(node) {\n      if (node.name.value !== node.name.value.toLowercase()) {\n        context.reportError('only lowercase type names allowed!');\n      }\n    },\n  };\n};\n\nCodeMirror.fromTextArea(myTextarea, {\n  mode: 'graphql',\n  lint: {\n    schema: myGraphQLSchema,\n    validationRules: [ExampleRule],\n  },\n  hintOptions: {\n    schema: myGraphQLSchema,\n  },\n});\n```\n\nBuild for the web with [webpack](http://webpack.github.io) or\n[browserify](http://browserify.org).\n"
  },
  {
    "path": "packages/codemirror-graphql/babel.config.js",
    "content": "module.exports = require('../../babel.config');\n"
  },
  {
    "path": "packages/codemirror-graphql/package.json",
    "content": "{\n  \"name\": \"codemirror-graphql\",\n  \"version\": \"2.2.4\",\n  \"description\": \"GraphQL mode and helpers for CodeMirror.\",\n  \"contributors\": [\n    \"Hyohyeon Jeong <asiandrummer@fb.com>\",\n    \"Lee Byron <lee@leebyron.com> (https://leebyron.com)\",\n    \"Angel Gomez Salazar <agomezs@fb.com>\"\n  ],\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/main/packages/codemirror-graphql#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/codemirror-graphql\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:codemirror-graphql\"\n  },\n  \"license\": \"MIT\",\n  \"main\": \"index.js\",\n  \"module\": \"esm/index.js\",\n  \"files\": [\n    \"src\",\n    \"cm6-legacy\",\n    \"esm\",\n    \"utils\",\n    \"variables\",\n    \"results\",\n    \"/*.js\",\n    \"/*.js.flow\",\n    \"/*.js.map\",\n    \"/*.d.ts\",\n    \"/*.d.ts.map\",\n    \"!babel.config.js\",\n    \"!jest.config.js\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"build\": \"node ../../scripts/renameFileExtensions.js './esm/{**,!**/__tests__/}/*.js' . .esm.js\",\n    \"test\": \"vitest\"\n  },\n  \"peerDependencies\": {\n    \"@codemirror/language\": \"6.0.0\",\n    \"codemirror\": \"^5.65.3\",\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\"\n  },\n  \"// TEMPORARILY PINNED until we fix graphql 15 support\": \"\",\n  \"dependencies\": {\n    \"@types/codemirror\": \"^0.0.90\",\n    \"graphql-language-service\": \"5.5.0\"\n  },\n  \"devDependencies\": {\n    \"@codemirror/language\": \"^6.0.0\",\n    \"codemirror\": \"^5.65.3\",\n    \"cross-env\": \"^7.0.2\",\n    \"graphql\": \"^16.9.0\",\n    \"rimraf\": \"^3.0.2\",\n    \"sane\": \"2.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/resources/checkgit.sh",
    "content": "#\n# This script determines if current git state is the up to date main. If so\n# it exits normally. If not it prompts for an explicit continue. This script\n# intends to protect from versioning for NPM without first pushing changes\n# and including any changes on main.\n#\n\n# First fetch to ensure git is up to date. Fail-fast if this fails.\ngit fetch;\nif [[ $? -ne 0 ]]; then exit 1; fi;\n\n# Extract useful information.\nGITBRANCH=$(git branch -v 2> /dev/null | sed '/^[^*]/d');\nGITBRANCHNAME=$(echo \"$GITBRANCH\" | sed 's/* \\([A-Za-z0-9_\\-]*\\).*/\\1/');\nGITBRANCHSYNC=$(echo \"$GITBRANCH\" | sed 's/* [^[]*.\\([^]]*\\).*/\\1/');\n\n# Check if main is checked out\nif [ \"$GITBRANCHNAME\" != \"main\" ]; then\n  read -p \"Git not on main but $GITBRANCHNAME. Continue? (y|N) \" yn;\n  if [ \"$yn\" != \"y\" ]; then exit 1; fi;\nfi;\n\n# Check if branch is synced with remote\nif [ \"$GITBRANCHSYNC\" != \"\" ]; then\n  read -p \"Git not up to date but $GITBRANCHSYNC. Continue? (y|N) \" yn;\n  if [ \"$yn\" != \"y\" ]; then exit 1; fi;\nfi;\n"
  },
  {
    "path": "packages/codemirror-graphql/setup-files.ts",
    "content": "// @ts-expect-error\ndocument.createRange = function () {\n  return {\n    setEnd() {},\n    setStart() {},\n    getClientRects() {\n      return { top: 0, bottom: 0, left: 0, right: 0 };\n    },\n    getBoundingClientRect() {\n      return { right: 0 };\n    },\n  };\n};\n"
  },
  {
    "path": "packages/codemirror-graphql/src/__tests__/hint.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/hint/show-hint';\nimport {\n  GraphQLBoolean,\n  GraphQLFloat,\n  GraphQLID,\n  GraphQLInt,\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLString,\n  __Schema,\n  __Type,\n} from 'graphql';\nimport '../hint';\nimport type { GraphQLHintOptions, IHint, IHints } from '../hint';\nimport '../mode';\nimport {\n  TestEnum,\n  TestInputObject,\n  TestSchema,\n  TestType,\n  TestUnion,\n  UnionFirst,\n  UnionSecond,\n} from './testSchema';\nimport { GraphQLDocumentMode } from 'graphql-language-service';\n\nfunction createEditorWithHint() {\n  return CodeMirror(document.createElement('div'), {\n    mode: 'graphql',\n    hintOptions: {\n      schema: TestSchema,\n      closeOnUnfocus: false,\n      completeSingle: false,\n      externalFragments: 'fragment Example on Test { id }',\n    },\n  });\n}\n\nfunction getHintSuggestions(\n  queryString: string,\n  cursor: CodeMirror.Position,\n  opts?: GraphQLHintOptions,\n) {\n  const editor = createEditorWithHint();\n\n  return new Promise<IHints | undefined>(resolve => {\n    const graphqlHint = CodeMirror.hint.graphql;\n    CodeMirror.hint.graphql = (\n      cm: CodeMirror.Editor,\n      options: GraphQLHintOptions,\n    ) => {\n      const result = graphqlHint(cm, { ...opts, ...options });\n      resolve(result);\n      CodeMirror.hint.graphql = graphqlHint;\n      return result;\n    };\n\n    editor.doc.setValue(queryString);\n    editor.doc.setCursor(cursor);\n    editor.execCommand('autocomplete');\n  });\n}\n\nfunction getExpectedSuggestions(list: IHint[]) {\n  return list.map(item => ({\n    text: item.text,\n    type: item.type,\n    description: item.description,\n    isDeprecated: item.isDeprecated,\n    deprecationReason: item.deprecationReason,\n  }));\n}\n\ndescribe('graphql-hint', () => {\n  it('attaches a GraphQL hint function with correct mode/hint options', () => {\n    const editor = createEditorWithHint();\n    expect(editor.getHelpers(editor.getCursor(), 'hint')).not.toHaveLength(0);\n  });\n\n  it('provides correct initial keywords for executable definitions', async () => {\n    const suggestions = await getHintSuggestions(\n      '',\n      { line: 0, ch: 0 },\n      { autocompleteOptions: { mode: GraphQLDocumentMode.EXECUTABLE } },\n    );\n    const list = [\n      { text: 'query' },\n      { text: 'mutation' },\n      { text: 'subscription' },\n      { text: 'fragment' },\n      { text: '{' },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct initial keywords for unknown definitions', async () => {\n    const suggestions = await getHintSuggestions('', { line: 0, ch: 0 });\n    const list = [\n      { text: 'extend' },\n      { text: 'query' },\n      { text: 'mutation' },\n      { text: 'subscription' },\n      { text: 'fragment' },\n      { text: '{' },\n      { text: 'type' },\n      { text: 'interface' },\n      { text: 'union' },\n      { text: 'input' },\n      { text: 'scalar' },\n      { text: 'schema' },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct initial keywords after filtered', async () => {\n    const suggestions = await getHintSuggestions('q', { line: 0, ch: 1 });\n    const list = [{ text: '{' }, { text: 'query' }];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct field name suggestions', async () => {\n    const suggestions = await getHintSuggestions('{ ', { line: 0, ch: 2 });\n    const list = [\n      {\n        text: 'test',\n        type: TestType,\n        isDeprecated: false,\n      },\n      {\n        text: 'union',\n        type: TestUnion,\n        isDeprecated: false,\n      },\n      {\n        text: 'first',\n        type: UnionFirst,\n        isDeprecated: false,\n      },\n      {\n        text: 'id',\n        type: GraphQLInt,\n        isDeprecated: false,\n      },\n      {\n        text: 'isTest',\n        type: GraphQLBoolean,\n        isDeprecated: false,\n      },\n      {\n        text: 'hasArgs',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: '__typename',\n        type: new GraphQLNonNull(GraphQLString),\n        description: 'The name of the current Object type at runtime.',\n        isDeprecated: false,\n      },\n      {\n        text: '__schema',\n        type: new GraphQLNonNull(__Schema),\n        description: 'Access the current type schema of this server.',\n        isDeprecated: false,\n      },\n      {\n        text: '__type',\n        type: __Type,\n        description: 'Request the type information of a single type.',\n        isDeprecated: false,\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct field name suggestions after filtered', async () => {\n    const suggestions = await getHintSuggestions('{ i', { line: 0, ch: 3 });\n    const list = [\n      {\n        text: 'id',\n        type: GraphQLInt,\n        isDeprecated: false,\n      },\n      {\n        text: 'isTest',\n        type: GraphQLBoolean,\n        isDeprecated: false,\n      },\n      {\n        text: 'union',\n        type: TestUnion,\n        isDeprecated: false,\n      },\n      {\n        text: 'first',\n        type: UnionFirst,\n        isDeprecated: false,\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct field name suggestions when using aliases', async () => {\n    const suggestions = await getHintSuggestions('{ aliasTest: first { ', {\n      line: 0,\n      ch: 21,\n    });\n    const list = [\n      {\n        text: 'scalar',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: 'first',\n        type: TestType,\n        isDeprecated: false,\n      },\n      {\n        text: 'example',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: '__typename',\n        type: new GraphQLNonNull(GraphQLString),\n        description: 'The name of the current Object type at runtime.',\n        isDeprecated: false,\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct field name suggestion indentation', async () => {\n    const suggestions = await getHintSuggestions('{\\n  ', { line: 1, ch: 2 });\n    expect(suggestions?.from).toEqual({ line: 1, ch: 2, sticky: null });\n    expect(suggestions?.to).toEqual({ line: 1, ch: 2, sticky: null });\n  });\n\n  it('provides correct argument suggestions', async () => {\n    const suggestions = await getHintSuggestions('{ hasArgs ( ', {\n      line: 0,\n      ch: 12,\n    });\n    const list = [\n      {\n        text: 'string',\n        type: GraphQLString,\n      },\n      {\n        text: 'int',\n        type: GraphQLInt,\n      },\n      {\n        text: 'float',\n        type: GraphQLFloat,\n      },\n      {\n        text: 'boolean',\n        type: GraphQLBoolean,\n      },\n      {\n        text: 'id',\n        type: GraphQLID,\n      },\n      {\n        text: 'enum',\n        type: TestEnum,\n      },\n      {\n        text: 'object',\n        type: TestInputObject,\n      },\n      {\n        text: 'listString',\n        type: new GraphQLList(GraphQLString),\n      },\n      {\n        text: 'listInt',\n        type: new GraphQLList(GraphQLInt),\n      },\n      {\n        text: 'listFloat',\n        type: new GraphQLList(GraphQLFloat),\n      },\n      {\n        text: 'listBoolean',\n        type: new GraphQLList(GraphQLBoolean),\n      },\n      {\n        text: 'listID',\n        type: new GraphQLList(GraphQLID),\n      },\n      {\n        text: 'listEnum',\n        type: new GraphQLList(TestEnum),\n      },\n      {\n        text: 'listObject',\n        type: new GraphQLList(TestInputObject),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct argument suggestions after filtered', async () => {\n    const suggestions = await getHintSuggestions('{ hasArgs ( f', {\n      line: 0,\n      ch: 13,\n    });\n    const list = [\n      {\n        text: 'float',\n        type: GraphQLFloat,\n      },\n      {\n        text: 'listFloat',\n        type: new GraphQLList(GraphQLFloat),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct argument suggestions when using aliases', async () => {\n    const suggestions = await getHintSuggestions('{ aliasTest: hasArgs ( ', {\n      line: 0,\n      ch: 23,\n    });\n    const list = [\n      {\n        text: 'string',\n        type: GraphQLString,\n      },\n      {\n        text: 'int',\n        type: GraphQLInt,\n      },\n      {\n        text: 'float',\n        type: GraphQLFloat,\n      },\n      {\n        text: 'boolean',\n        type: GraphQLBoolean,\n      },\n      {\n        text: 'id',\n        type: GraphQLID,\n      },\n      {\n        text: 'enum',\n        type: TestEnum,\n      },\n      {\n        text: 'object',\n        type: TestInputObject,\n      },\n      {\n        text: 'listString',\n        type: new GraphQLList(GraphQLString),\n      },\n      {\n        text: 'listInt',\n        type: new GraphQLList(GraphQLInt),\n      },\n      {\n        text: 'listFloat',\n        type: new GraphQLList(GraphQLFloat),\n      },\n      {\n        text: 'listBoolean',\n        type: new GraphQLList(GraphQLBoolean),\n      },\n      {\n        text: 'listID',\n        type: new GraphQLList(GraphQLID),\n      },\n      {\n        text: 'listEnum',\n        type: new GraphQLList(TestEnum),\n      },\n      {\n        text: 'listObject',\n        type: new GraphQLList(TestInputObject),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct directive suggestions', async () => {\n    const suggestions = await getHintSuggestions('{ test (@', {\n      line: 0,\n      ch: 9,\n    });\n    const list = [\n      {\n        text: 'include',\n        description:\n          'Directs the executor to include this field or fragment only when the `if` argument is true.',\n      },\n      {\n        text: 'skip',\n        description:\n          'Directs the executor to skip this field or fragment when the `if` argument is true.',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct directive suggestion after filtered', async () => {\n    const suggestions = await getHintSuggestions('{ test (@s', {\n      line: 0,\n      ch: 10,\n    });\n    const list = [\n      {\n        text: 'skip',\n        description:\n          'Directs the executor to skip this field or fragment when the `if` argument is true.',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct directive suggestions when using aliases', async () => {\n    const suggestions = await getHintSuggestions('{ aliasTest: test (@', {\n      line: 0,\n      ch: 20,\n    });\n    const list = [\n      {\n        text: 'include',\n        description:\n          'Directs the executor to include this field or fragment only when the `if` argument is true.',\n      },\n      {\n        text: 'skip',\n        description:\n          'Directs the executor to skip this field or fragment when the `if` argument is true.',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct directive suggestions on definitions', async () => {\n    const suggestions = await getHintSuggestions('type Type @', {\n      line: 0,\n      ch: 11,\n    });\n    const list = [\n      {\n        text: 'onAllDefs',\n        description: '',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct directive suggestions on args definitions', async () => {\n    const suggestions = await getHintSuggestions(\n      'type Type { field(arg: String @',\n      { line: 0, ch: 31 },\n    );\n    const list = [\n      {\n        text: 'deprecated',\n        description:\n          'Marks an element of a GraphQL schema as no longer supported.',\n      },\n      {\n        text: 'onArg',\n        description: '',\n      },\n      {\n        text: 'onAllDefs',\n        description: '',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides interface suggestions for type when using implements keyword', async () => {\n    const suggestions = await getHintSuggestions('type Type implements ', {\n      line: 0,\n      ch: 21,\n    });\n    const list = [\n      {\n        text: 'TestInterface',\n        type: TestSchema.getType('TestInterface'),\n      },\n      {\n        text: 'AnotherTestInterface',\n        type: TestSchema.getType('AnotherTestInterface'),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides interface suggestions for interface when using implements keyword', async () => {\n    const suggestions = await getHintSuggestions(\n      'interface MyInt implements An',\n      { line: 0, ch: 29 },\n    );\n    const list = [\n      {\n        text: 'AnotherTestInterface',\n        type: TestSchema.getType('AnotherTestInterface'),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides interface suggestions for interface when using implements keyword and multiple interfaces', async () => {\n    const suggestions = await getHintSuggestions(\n      'interface MyInt implements AnotherTestInterface & T',\n      { line: 0, ch: 51 },\n    );\n    const list = [\n      {\n        text: 'TestInterface',\n        type: TestSchema.getType('TestInterface'),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct typeCondition suggestions', async () => {\n    const suggestions = await getHintSuggestions('{ union { ... on ', {\n      line: 0,\n      ch: 17,\n    });\n    const list = [\n      {\n        text: 'First',\n        description: '',\n      },\n      {\n        text: 'Second',\n        description: '',\n      },\n      {\n        text: 'TestInterface',\n        description: '',\n      },\n      {\n        text: 'AnotherTestInterface',\n        description: '',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct typeCondition suggestions after filtered', async () => {\n    const suggestions = await getHintSuggestions('{ union { ... on F', {\n      line: 0,\n      ch: 18,\n    });\n    const list = [\n      {\n        text: 'First',\n        description: '',\n      },\n      {\n        text: 'TestInterface',\n        description: '',\n      },\n      {\n        text: 'AnotherTestInterface',\n        description: '',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct typeCondition suggestions on fragment', async () => {\n    const suggestions = await getHintSuggestions('fragment Foo on ', {\n      line: 0,\n      ch: 16,\n    });\n    const list = [\n      {\n        text: 'Test',\n        description: '',\n      },\n      {\n        text: 'TestUnion',\n        description: '',\n      },\n      {\n        text: 'First',\n        description: '',\n      },\n      {\n        text: 'TestInterface',\n        description: '',\n      },\n      {\n        text: 'AnotherTestInterface',\n        description: '',\n      },\n      {\n        text: 'Second',\n        description: '',\n      },\n      {\n        text: 'MutationType',\n        description: 'This is a simple mutation type',\n      },\n      {\n        text: 'SubscriptionType',\n        description: 'This is a simple subscription type',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct ENUM suggestions', async () => {\n    const suggestions = await getHintSuggestions('{ hasArgs (enum: ', {\n      line: 0,\n      ch: 17,\n    });\n    const list = [\n      {\n        text: 'RED',\n        type: TestEnum,\n        isDeprecated: false,\n      },\n      {\n        text: 'GREEN',\n        type: TestEnum,\n        isDeprecated: false,\n      },\n      {\n        text: 'BLUE',\n        type: TestEnum,\n        isDeprecated: false,\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct testInput suggestions', async () => {\n    const suggestions = await getHintSuggestions('{ hasArgs (object: { ', {\n      line: 0,\n      ch: 21,\n    });\n    const list = [\n      {\n        text: 'string',\n        type: GraphQLString,\n      },\n      {\n        text: 'int',\n        type: GraphQLInt,\n      },\n      {\n        text: 'float',\n        type: GraphQLFloat,\n      },\n      {\n        text: 'boolean',\n        type: GraphQLBoolean,\n      },\n      {\n        text: 'id',\n        type: GraphQLID,\n      },\n      {\n        text: 'enum',\n        type: TestEnum,\n      },\n      {\n        text: 'object',\n        type: TestInputObject,\n      },\n      {\n        text: 'listString',\n        type: new GraphQLList(GraphQLString),\n      },\n      {\n        text: 'listInt',\n        type: new GraphQLList(GraphQLInt),\n      },\n      {\n        text: 'listFloat',\n        type: new GraphQLList(GraphQLFloat),\n      },\n      {\n        text: 'listBoolean',\n        type: new GraphQLList(GraphQLBoolean),\n      },\n      {\n        text: 'listID',\n        type: new GraphQLList(GraphQLID),\n      },\n      {\n        text: 'listEnum',\n        type: new GraphQLList(TestEnum),\n      },\n      {\n        text: 'listObject',\n        type: new GraphQLList(TestInputObject),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct object field suggestions after filtered', async () => {\n    const suggestions = await getHintSuggestions('{ hasArgs (object: { f', {\n      line: 0,\n      ch: 22,\n    });\n    const list = [\n      {\n        text: 'float',\n        type: GraphQLFloat,\n      },\n      {\n        text: 'listFloat',\n        type: new GraphQLList(GraphQLFloat),\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides fragment name suggestion', async () => {\n    const suggestions = await getHintSuggestions(\n      'fragment Foo on Test { id }  query { ...',\n      { line: 0, ch: 40 },\n    );\n    const list = [\n      {\n        text: 'Foo',\n        type: TestType,\n        description: 'fragment Foo on Test',\n      },\n      {\n        text: 'Example',\n        type: TestType,\n        description: 'fragment Example on Test',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides fragment names for fragments defined lower', async () => {\n    const suggestions = await getHintSuggestions(\n      'query { ... }\\nfragment Foo on Test { id }',\n      { line: 0, ch: 11 },\n    );\n    const list = [\n      {\n        text: 'Foo',\n        type: TestType,\n        description: 'fragment Foo on Test',\n      },\n      {\n        text: 'Example',\n        type: TestType,\n        description: 'fragment Example on Test',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides only appropriate fragment names', async () => {\n    const suggestions = await getHintSuggestions(\n      'fragment Foo on TestUnion { ... } ' +\n        'fragment Bar on First { name } ' +\n        'fragment Baz on Second { name } ' +\n        'fragment Qux on TestUnion { name } ' +\n        'fragment Nrf on Test { id } ' +\n        'fragment Quux on TestInputObject { string } ' +\n        'fragment Abc on Xyz { abcdef }',\n      { line: 0, ch: 31 },\n    );\n    const list = [\n      {\n        text: 'Bar',\n        type: UnionFirst,\n        description: 'fragment Bar on First',\n      },\n      {\n        text: 'Baz',\n        type: UnionSecond,\n        description: 'fragment Baz on Second',\n      },\n      {\n        text: 'Qux',\n        type: TestUnion,\n        description: 'fragment Qux on TestUnion',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct field name suggestion inside inline fragment', async () => {\n    const suggestions = await getHintSuggestions(\n      'fragment Foo on TestUnion { ... on First { ',\n      { line: 0, ch: 43 },\n    );\n    const list = [\n      {\n        text: 'scalar',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: 'first',\n        type: TestType,\n        isDeprecated: false,\n      },\n      {\n        text: 'example',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: '__typename',\n        type: new GraphQLNonNull(GraphQLString),\n        description: 'The name of the current Object type at runtime.',\n        isDeprecated: false,\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct field name suggestion inside type-less inline fragment', async () => {\n    const suggestions = await getHintSuggestions(\n      'fragment Foo on First { ... { ',\n      { line: 0, ch: 30 },\n    );\n    const list = [\n      {\n        text: 'scalar',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: 'first',\n        type: TestType,\n        isDeprecated: false,\n      },\n      {\n        text: 'example',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        text: '__typename',\n        type: new GraphQLNonNull(GraphQLString),\n        description: 'The name of the current Object type at runtime.',\n        isDeprecated: false,\n      },\n    ];\n\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct boolean suggestions', async () => {\n    const suggestions1 = await getHintSuggestions('{ hasArgs(listBoolean: [ ', {\n      line: 0,\n      ch: 27,\n    });\n    const list1 = [\n      {\n        text: 'true',\n        type: GraphQLBoolean,\n        description: 'Not false.',\n      },\n      {\n        text: 'false',\n        type: GraphQLBoolean,\n        description: 'Not true.',\n      },\n    ];\n    const expectedSuggestions1 = getExpectedSuggestions(list1);\n    expect(suggestions1?.list).toEqual(expectedSuggestions1);\n\n    const suggestions2 = await getHintSuggestions(\n      '{ hasArgs(object: { boolean: t',\n      { line: 0, ch: 30 },\n    );\n    const list2 = [\n      {\n        text: 'true',\n        type: GraphQLBoolean,\n        description: 'Not false.',\n      },\n    ];\n    const expectedSuggestions2 = getExpectedSuggestions(list2);\n    expect(suggestions2?.list).toEqual(expectedSuggestions2);\n\n    const suggestions3 = await getHintSuggestions('{ hasArgs(boolean: f', {\n      line: 0,\n      ch: 20,\n    });\n    const list3 = [\n      {\n        text: 'false',\n        type: GraphQLBoolean,\n        description: 'Not true.',\n      },\n    ];\n    const expectedSuggestions3 = getExpectedSuggestions(list3);\n    expect(suggestions3?.list).toEqual(expectedSuggestions3);\n  });\n\n  it('provides correct variable type suggestions', async () => {\n    const suggestions = await getHintSuggestions('query($foo: ', {\n      line: 0,\n      ch: 12,\n    });\n    const list = [\n      {\n        text: 'String',\n        description:\n          '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      },\n      {\n        text: 'Int',\n        description:\n          'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.',\n      },\n      {\n        text: 'Boolean',\n        description: 'The `Boolean` scalar type represents `true` or `false`.',\n      },\n      {\n        text: 'Float',\n        description:\n          'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).',\n      },\n      {\n        text: 'ID',\n        description:\n          '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      },\n      { text: 'TestEnum', description: '' },\n      { text: 'TestInput', description: '' },\n      {\n        text: '__TypeKind',\n        description:\n          'An enum describing what kind of type a given `__Type` is.',\n      },\n      {\n        text: '__DirectiveLocation',\n        description:\n          'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n\n  it('provides correct variable type suggestions inside list type', async () => {\n    const suggestions = await getHintSuggestions('query($foo: [ ', {\n      line: 0,\n      ch: 14,\n    });\n    const list = [\n      {\n        text: 'String',\n        description:\n          '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      },\n      {\n        text: 'Int',\n        description:\n          'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.',\n      },\n      {\n        text: 'Boolean',\n        description: 'The `Boolean` scalar type represents `true` or `false`.',\n      },\n      {\n        text: 'Float',\n        description:\n          'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).',\n      },\n      {\n        text: 'ID',\n        description:\n          '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      },\n      { text: 'TestEnum', description: '' },\n      { text: 'TestInput', description: '' },\n      {\n        text: '__TypeKind',\n        description:\n          'An enum describing what kind of type a given `__Type` is.',\n      },\n      {\n        text: '__DirectiveLocation',\n        description:\n          'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.',\n      },\n    ];\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n  it('provides no suggestions', async () => {\n    const list: IHint[] = [];\n    const expectedSuggestions = getExpectedSuggestions(list);\n\n    // kind is FragmentSpread, step is 2\n    const suggestions1 = await getHintSuggestions(\n      'fragment Foo on Test { id }  query { ...Foo ',\n      { line: 0, ch: 45 },\n    );\n    expect(suggestions1?.list).toEqual(expectedSuggestions);\n\n    // kind is ListType, step is 3\n    const suggestions2 = await getHintSuggestions('query($foo: [string] ', {\n      line: 0,\n      ch: 21,\n    });\n    expect(suggestions2?.list).toEqual(expectedSuggestions);\n\n    // kind is ListValue, step is 1\n    const suggestions3 = await getHintSuggestions(\n      '{ hasArgs(listString: [\"foo\" ',\n      {\n        line: 0,\n        ch: 29,\n      },\n    );\n    expect(suggestions3?.list).toEqual(expectedSuggestions);\n\n    // kind is VariableDefinition, step is 1\n    const suggestions4 = await getHintSuggestions('query($foo ', {\n      line: 0,\n      ch: 11,\n    });\n    expect(suggestions4?.list).toEqual(expectedSuggestions);\n\n    // kind is Argument, step is 1\n    const suggestions5 = await getHintSuggestions('{ hasArgs(string ', {\n      line: 0,\n      ch: 17,\n    });\n    expect(suggestions5?.list).toEqual(expectedSuggestions);\n\n    // kind is Argument, step is 2, and input type isn't GraphQLEnumType or GraphQLBoolean\n    const suggestions6 = await getHintSuggestions('{ hasArgs(string: ', {\n      line: 0,\n      ch: 18,\n    });\n    expect(suggestions6?.list).toEqual(expectedSuggestions);\n\n    const suggestions7 = await getHintSuggestions(\n      '{ hasArgs(object: { string ',\n      { line: 0, ch: 27 },\n    );\n    expect(suggestions7?.list).toEqual(expectedSuggestions);\n  });\n  it('provides variable completion for arguments', async () => {\n    const expectedSuggestions = getExpectedSuggestions([\n      { text: 'string', type: GraphQLString },\n      { text: 'listString', type: new GraphQLList(GraphQLString) },\n    ]);\n    // kind is Argument, step is 2, and input type isn't GraphQLEnumType or GraphQLBoolean\n    const suggestions9 = await getHintSuggestions(\n      'query myQuery($arg: String){ hasArgs(string: ',\n      {\n        line: 0,\n        ch: 42,\n      },\n    );\n    expect(suggestions9?.list).toEqual(expectedSuggestions);\n  });\n  it('provides variable completion for arguments with $', async () => {\n    const expectedSuggestions = getExpectedSuggestions([\n      { text: 'string', type: GraphQLString },\n      { text: 'listString', type: new GraphQLList(GraphQLString) },\n    ]);\n    // kind is Argument, step is 2, and input type isn't GraphQLEnumType or GraphQLBoolean\n    const suggestions9 = await getHintSuggestions(\n      'query myQuery($arg: String){ hasArgs(string: $',\n      {\n        line: 0,\n        ch: 42,\n      },\n    );\n    expect(suggestions9?.list).toEqual(expectedSuggestions);\n  });\n  it('provides correct field name suggestions for an interface type', async () => {\n    const suggestions = await getHintSuggestions(\n      '{ first { ... on TestInterface { ',\n      {\n        line: 0,\n        ch: 33,\n      },\n    );\n    const list = [\n      {\n        text: 'scalar',\n        type: GraphQLString,\n        isDeprecated: false,\n      },\n      {\n        description: 'The name of the current Object type at runtime.',\n        isDeprecated: false,\n        text: '__typename',\n        type: new GraphQLNonNull(GraphQLString),\n        deprecationReason: undefined,\n      },\n    ];\n\n    const expectedSuggestions = getExpectedSuggestions(list);\n    expect(suggestions?.list).toEqual(expectedSuggestions);\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/__tests__/kitchen-sink.graphql",
    "content": "# Copyright (c) 2021 GraphQL Contributors\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n\nquery queryName($foo: TestInput, $site: TestEnum = RED) {\n  testAlias: hasArgs(string: \"testString\")\n  ... on Test {\n    hasArgs(\n      listEnum: [RED, GREEN, BLUE]\n      int: 1\n      listFloat: [1.23, 1.3e-1, -1.35384e+3]\n      boolean: true\n      id: 123\n      object: $foo\n      enum: $site\n    )\n  }\n  test @include(if: true) {\n    union {\n      __typename\n    }\n  }\n  ...frag\n  ... @skip(if: false) {\n    id\n  }\n  ... {\n    id\n  }\n}\n\nmutation mutationName {\n  setString(value: \"newString\")\n}\n\nsubscription subscriptionName {\n  subscribeToTest(id: \"anId\") {\n    ... on Test {\n      id\n    }\n  }\n}\n\nfragment frag on Test {\n  test @include(if: true) {\n    union {\n      __typename\n    }\n  }\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/__tests__/lint.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/lint/lint';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { GraphQLError, OperationDefinitionNode, version } from 'graphql';\nimport '../lint';\nimport '../mode';\nimport { TestSchema } from './testSchema';\n\nfunction createEditorWithLint(lintConfig?: any) {\n  return CodeMirror(document.createElement('div'), {\n    mode: 'graphql',\n    lint: lintConfig || true,\n  });\n}\n\nfunction printLintErrors(queryString: string, configOverrides = {}) {\n  const editor = createEditorWithLint({\n    schema: TestSchema,\n    ...configOverrides,\n  });\n\n  return new Promise<any[]>(resolve => {\n    editor.state.lint.options.onUpdateLinting = (errors: any[]) => {\n      if (errors?.[0] && !errors[0].message.match('Unexpected EOF')) {\n        resolve(errors);\n        return;\n      }\n      resolve([]);\n    };\n    editor.doc.setValue(queryString);\n  });\n}\n\ndescribe('graphql-lint', () => {\n  it('attaches a GraphQL lint function with correct mode/lint options', () => {\n    const editor = createEditorWithLint();\n    expect(editor.getHelpers(editor.getCursor(), 'lint')).not.toHaveLength(0);\n  });\n\n  const kitchenSink = readFileSync(\n    join(__dirname, '/kitchen-sink.graphql'),\n    'utf8',\n  );\n\n  it('returns no syntactic/validation errors after parsing kitchen-sink query', async () => {\n    const errors = await printLintErrors(kitchenSink);\n    expect(errors).toHaveLength(0);\n  });\n\n  it('returns a validation error for a invalid query', async () => {\n    const noMutationOperationRule = (context: any) => ({\n      OperationDefinition(node: OperationDefinitionNode) {\n        if (node.operation === 'mutation') {\n          context.reportError(\n            new GraphQLError(\n              'I like turtles.',\n              // @ts-expect-error\n              parseInt(version, 10) > 16 ? { nodes: node } : node,\n            ),\n          );\n        }\n        return false;\n      },\n    });\n    const errors = await printLintErrors(kitchenSink, {\n      validationRules: [noMutationOperationRule],\n    });\n    expect(errors.length).toBe(1);\n    expect(errors[0].message).toBe('I like turtles.');\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/__tests__/mode.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/runmode/runmode';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport '../mode';\n\ndescribe('graphql-mode', () => {\n  it('provides correct tokens and styles after parsing', () => {\n    const queryStr = 'query name { }';\n    const tokens: string[] = [];\n    const styles: string[] = [];\n\n    CodeMirror.runMode(queryStr, 'graphql', (token, style) => {\n      if (style && style !== 'ws') {\n        tokens.push(token);\n        styles.push(style);\n      }\n    });\n\n    expect(tokens).toEqual(['query', 'name', '{', '}']);\n    expect(styles).toEqual(['keyword', 'def', 'punctuation', 'punctuation']);\n  });\n\n  it('parses Relay-style anonymous FragmentDefinitions', () => {\n    CodeMirror.runMode('fragment on Test { id }', 'graphql', (_token, style) =>\n      expect(style).not.toBe('invalidchar'),\n    );\n  });\n\n  it('parses inline fragments with optional syntax correctly', () => {\n    CodeMirror.runMode(\n      '{ ... on OptionalType { name } }',\n      'graphql',\n      (_token, style) => expect(style).not.toBe('invalidchar'),\n    );\n\n    CodeMirror.runMode('{ ... { name } }', 'graphql', (_token, style) =>\n      expect(style).not.toBe('invalidchar'),\n    );\n\n    CodeMirror.runMode(\n      '{ ... @optionalDirective { name } }',\n      'graphql',\n      (_token, style) => expect(style).not.toBe('invalidchar'),\n    );\n  });\n\n  it('returns \"invalidchar\" message when there is no matching token', () => {\n    CodeMirror.runMode('invalidKeyword name', 'graphql', (token, style) => {\n      if (token.trim()) {\n        expect(style).toBe('invalidchar');\n      }\n    });\n\n    CodeMirror.runMode('query %', 'graphql', (token, style) => {\n      if (token === '%') {\n        expect(style).toBe('invalidchar');\n      }\n    });\n  });\n\n  it('parses kitchen-sink query without invalidchar', () => {\n    const kitchenSink = readFileSync(\n      join(__dirname, '/kitchen-sink.graphql'),\n      'utf8',\n    );\n\n    CodeMirror.runMode(kitchenSink, 'graphql', (_token, style) => {\n      expect(style).not.toBe('invalidchar');\n    });\n  });\n\n  it('parses schema-kitchen-sink query without invalidchar', () => {\n    const schemaKitchenSink = readFileSync(\n      join(__dirname, '/schema-kitchen-sink.graphql'),\n      'utf8',\n    );\n\n    CodeMirror.runMode(schemaKitchenSink, 'graphql', (_token, style) => {\n      expect(style).not.toBe('invalidchar');\n    });\n  });\n\n  it('parses anonymous operations without invalidchar', () => {\n    CodeMirror.runMode('{ id }', 'graphql', (_token, style) => {\n      expect(style).not.toBe('invalidchar');\n    });\n\n    CodeMirror.runMode(\n      `\n      mutation {\n        setString(value: \"newString\")\n      }\n    `,\n      'graphql',\n      (_token, style) => {\n        expect(style).not.toBe('invalidchar');\n      },\n    );\n\n    CodeMirror.runMode(\n      `\n      subscription {\n        subscribeToTest(id: \"anId\") {\n          id\n        }\n      }\n    `,\n      'graphql',\n      (_token, style) => {\n        expect(style).not.toBe('invalidchar');\n      },\n    );\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/__tests__/schema-kitchen-sink.graphql",
    "content": "# Copyright (c) 2021 GraphQL Contributors\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n\nschema {\n  query: QueryType\n  mutation: MutationType\n}\n\ntype Foo implements Bar {\n  one: Type\n  two(argument: InputType!): Type\n  three(argument: InputType, other: String): Int\n  four(argument: String = \"string\"): String\n  five(argument: [String] = [\"string\", \"string\"]): String\n  six(argument: InputType = {key: \"value\"}): Type\n}\n\ntype AnnotatedObject @onObject(arg: \"value\") {\n  annotatedField(arg: Type = \"default\" @onArg): Type @onField\n}\n\ninterface Bar {\n  one: Type\n  four(argument: String = \"string\"): String\n}\n\ninterface AnnotatedInterface @onInterface {\n  annotatedField(arg: Type @onArg): Type @onField\n}\n\nunion Feed = Story | Article | Advert\n\nunion AnnotatedUnion @onUnion = A | B\n\nscalar CustomScalar\n\nscalar AnnotatedScalar @onScalar\n\nenum Site {\n  DESKTOP\n  MOBILE\n}\n\nenum AnnotatedEnum @onEnum {\n  ANNOTATED_VALUE @onEnumValue\n  OTHER_VALUE\n}\n\ninput InputType {\n  key: String!\n  answer: Int = 42\n}\n\ninput AnnotatedInput @onInputObjectType {\n  annotatedField: Type @onField\n}\n\nextend type Foo {\n  seven(argument: [[String!]!]!): Type\n}\n\nextend type Foo @onType {}\n\ntype NoFields {}\n\ndirective @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\n\ndirective @include(if: Boolean!)\n  on FIELD\n   | FRAGMENT_SPREAD\n   | INLINE_FRAGMENT\n"
  },
  {
    "path": "packages/codemirror-graphql/src/__tests__/testSchema.ts",
    "content": "/* istanbul ignore file */\n/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport {\n  DirectiveLocation,\n  GraphQLBoolean,\n  GraphQLDeprecatedDirective,\n  GraphQLDirective,\n  GraphQLEnumType,\n  GraphQLFloat,\n  GraphQLID,\n  GraphQLIncludeDirective,\n  GraphQLInputObjectType,\n  GraphQLInt,\n  GraphQLInterfaceType,\n  GraphQLList,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQLSkipDirective,\n  GraphQLString,\n  GraphQLUnionType,\n} from 'graphql';\n\n// Test Schema\n\nexport const TestEnum = new GraphQLEnumType({\n  name: 'TestEnum',\n  values: {\n    RED: {},\n    GREEN: {},\n    BLUE: {},\n  },\n});\n\nexport const TestInputObject: GraphQLInputObjectType =\n  new GraphQLInputObjectType({\n    name: 'TestInput',\n    fields: () => ({\n      string: { type: GraphQLString },\n      int: { type: GraphQLInt },\n      float: { type: GraphQLFloat },\n      boolean: { type: GraphQLBoolean },\n      id: { type: GraphQLID },\n      enum: { type: TestEnum },\n      object: { type: TestInputObject },\n      // List\n      listString: { type: new GraphQLList(GraphQLString) },\n      listInt: { type: new GraphQLList(GraphQLInt) },\n      listFloat: { type: new GraphQLList(GraphQLFloat) },\n      listBoolean: { type: new GraphQLList(GraphQLBoolean) },\n      listID: { type: new GraphQLList(GraphQLID) },\n      listEnum: { type: new GraphQLList(TestEnum) },\n      listObject: { type: new GraphQLList(TestInputObject) },\n    }),\n  });\n\nconst TestInterface: GraphQLInterfaceType = new GraphQLInterfaceType({\n  name: 'TestInterface',\n  resolveType: () => UnionFirst,\n  fields: {\n    scalar: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n  },\n});\n\nconst AnotherTestInterface: GraphQLInterfaceType = new GraphQLInterfaceType({\n  name: 'AnotherTestInterface',\n  resolveType: () => UnionFirst,\n  fields: {\n    example: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n  },\n});\n\nexport const UnionFirst = new GraphQLObjectType({\n  name: 'First',\n  interfaces: [TestInterface, AnotherTestInterface],\n  fields: () => ({\n    scalar: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n    first: {\n      type: TestType,\n      resolve: () => ({}),\n    },\n    example: {\n      type: GraphQLString,\n      resolve: () => ({}),\n    },\n  }),\n});\n\nexport const UnionSecond = new GraphQLObjectType({\n  name: 'Second',\n  fields: () => ({\n    second: {\n      type: TestType,\n      resolve: () => ({}),\n    },\n  }),\n});\n\nexport const TestUnion = new GraphQLUnionType({\n  name: 'TestUnion',\n  types: [UnionFirst, UnionSecond],\n  resolveType() {\n    return UnionFirst;\n  },\n});\n\nexport const TestType: GraphQLObjectType = new GraphQLObjectType({\n  name: 'Test',\n  fields: () => ({\n    test: {\n      type: TestType,\n      resolve: () => ({}),\n    },\n    deprecatedTest: {\n      type: TestType,\n      deprecationReason: 'Use test instead.',\n      resolve: () => ({}),\n    },\n    union: {\n      type: TestUnion,\n      resolve: () => ({}),\n    },\n    first: {\n      type: UnionFirst,\n      resolve: () => ({}),\n    },\n    id: {\n      type: GraphQLInt,\n      resolve: () => ({}),\n    },\n    isTest: {\n      type: GraphQLBoolean,\n      resolve() {\n        return true;\n      },\n    },\n    hasArgs: {\n      type: GraphQLString,\n      resolve(_value, args) {\n        return JSON.stringify(args);\n      },\n      args: {\n        string: { type: GraphQLString },\n        int: { type: GraphQLInt },\n        float: { type: GraphQLFloat },\n        boolean: { type: GraphQLBoolean },\n        id: { type: GraphQLID },\n        enum: { type: TestEnum },\n        object: { type: TestInputObject },\n        // List\n        listString: { type: new GraphQLList(GraphQLString) },\n        listInt: { type: new GraphQLList(GraphQLInt) },\n        listFloat: { type: new GraphQLList(GraphQLFloat) },\n        listBoolean: { type: new GraphQLList(GraphQLBoolean) },\n        listID: { type: new GraphQLList(GraphQLID) },\n        listEnum: { type: new GraphQLList(TestEnum) },\n        listObject: { type: new GraphQLList(TestInputObject) },\n      },\n    },\n  }),\n});\n\nconst TestMutationType = new GraphQLObjectType({\n  name: 'MutationType',\n  description: 'This is a simple mutation type',\n  fields: {\n    setString: {\n      type: GraphQLString,\n      description: 'Set the string field',\n      args: {\n        value: { type: GraphQLString },\n      },\n    },\n  },\n});\n\nconst TestSubscriptionType = new GraphQLObjectType({\n  name: 'SubscriptionType',\n  description: 'This is a simple subscription type',\n  fields: {\n    subscribeToTest: {\n      type: TestType,\n      description: 'Subscribe to the test type',\n      args: {\n        id: { type: GraphQLString },\n      },\n    },\n  },\n});\n\nconst OnArgDirective = new GraphQLDirective({\n  name: 'onArg',\n  locations: [DirectiveLocation.ARGUMENT_DEFINITION],\n});\n\nconst OnAllDefsDirective = new GraphQLDirective({\n  name: 'onAllDefs',\n  locations: [\n    DirectiveLocation.SCHEMA,\n    DirectiveLocation.SCALAR,\n    DirectiveLocation.OBJECT,\n    DirectiveLocation.FIELD_DEFINITION,\n    DirectiveLocation.INTERFACE,\n    DirectiveLocation.UNION,\n    DirectiveLocation.ENUM,\n    DirectiveLocation.ENUM_VALUE,\n    DirectiveLocation.INPUT_OBJECT,\n    DirectiveLocation.ARGUMENT_DEFINITION,\n    DirectiveLocation.INPUT_FIELD_DEFINITION,\n  ],\n});\n\nexport const TestSchema = new GraphQLSchema({\n  query: TestType,\n  mutation: TestMutationType,\n  subscription: TestSubscriptionType,\n  directives: [\n    GraphQLIncludeDirective,\n    GraphQLSkipDirective,\n    GraphQLDeprecatedDirective,\n    OnArgDirective,\n    OnAllDefsDirective,\n  ],\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/cm6-legacy/mode.ts",
    "content": "import type { StreamParser } from '@codemirror/language';\nimport graphqlModeFactory from '../utils/mode-factory';\n\n// Types of property 'token' are incompatible.\n// Type '((stream: StringStream, state: any) => string | null) | undefined' is not comparable to type '(stream: StringStream, state: any) => string | null'.\nexport const graphql = graphqlModeFactory({}) as unknown as StreamParser<any>;\n"
  },
  {
    "path": "packages/codemirror-graphql/src/hint.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n *\n *\n */\n\nimport CodeMirror, { Hints, Hint } from 'codemirror';\nimport 'codemirror/addon/hint/show-hint.js';\n\nimport { FragmentDefinitionNode, GraphQLSchema, GraphQLType } from 'graphql';\nimport type {\n  AutocompleteSuggestionOptions,\n  Maybe,\n} from 'graphql-language-service';\nimport { getAutocompleteSuggestions, Position } from 'graphql-language-service';\n\nexport interface GraphQLHintOptions {\n  schema?: GraphQLSchema;\n  externalFragments?: string | FragmentDefinitionNode[];\n  autocompleteOptions?: AutocompleteSuggestionOptions;\n}\n\ninterface IHint extends Hint {\n  isDeprecated?: boolean;\n  type?: Maybe<GraphQLType>;\n  description?: Maybe<string>;\n  deprecationReason?: Maybe<string>;\n}\n\ninterface IHints extends Hints {\n  list: IHint[];\n}\n\ndeclare module 'codemirror' {\n  interface ShowHintOptions {\n    schema?: GraphQLSchema;\n    externalFragments?: string | FragmentDefinitionNode[];\n  }\n\n  interface CodeMirrorHintMap {\n    graphql: (\n      editor: CodeMirror.Editor,\n      options: GraphQLHintOptions,\n    ) => IHints | undefined;\n  }\n}\n\n/**\n * Registers a \"hint\" helper for CodeMirror.\n *\n * Using CodeMirror's \"hint\" addon: https://codemirror.net/demo/complete.html\n * Given an editor, this helper will take the token at the cursor and return a\n * list of suggested tokens.\n *\n * Options:\n *\n *   - schema: GraphQLSchema provides the hinter with positionally relevant info\n *\n * Additional Events:\n *\n *   - hasCompletion (codemirror, data, token) - signaled when the hinter has a\n *     new list of completion suggestions.\n *\n */\nCodeMirror.registerHelper(\n  'hint',\n  'graphql',\n  (\n    editor: CodeMirror.Editor,\n    options: GraphQLHintOptions,\n  ): IHints | undefined => {\n    const { schema, externalFragments, autocompleteOptions } = options;\n    if (!schema) {\n      return;\n    }\n\n    const cur = editor.getCursor();\n    const token = editor.getTokenAt(cur);\n\n    const tokenStart =\n      token.type !== null && /\"|\\w/.test(token.string[0])\n        ? token.start\n        : token.end;\n\n    const position = new Position(cur.line, tokenStart);\n\n    const rawResults = getAutocompleteSuggestions(\n      schema,\n      editor.getValue(),\n      position,\n      token,\n      externalFragments,\n      autocompleteOptions,\n    );\n\n    const results = {\n      list: rawResults.map(item => ({\n        // important! for when the label is different from the insert text\n        text: item?.rawInsert ?? item.label,\n        type: item.type,\n        description: item.documentation,\n        isDeprecated: item.isDeprecated,\n        deprecationReason: item.deprecationReason,\n      })),\n      from: { line: cur.line, ch: tokenStart },\n      to: { line: cur.line, ch: token.end },\n    };\n\n    if (results?.list && results.list.length > 0) {\n      results.from = CodeMirror.Pos(results.from.line, results.from.ch);\n      results.to = CodeMirror.Pos(results.to.line, results.to.ch);\n      CodeMirror.signal(editor, 'hasCompletion', editor, results, token);\n    }\n\n    return results;\n  },\n);\n// exporting here so we don't need to import the codemirror show-hint addon module (and its implementation)\nexport type { IHint, IHints };\n"
  },
  {
    "path": "packages/codemirror-graphql/src/index.d.ts",
    "content": "import 'codemirror/addon/hint/show-hint';\n\ndeclare module 'codemirror' {\n  let Init: any;\n\n  interface Editor {\n    doc: CodeMirror.Doc;\n    getHelper(pos: { line: number; ch: number }, type: string): any;\n    getHelpers(pos: { line: number; ch: number }, type: string): any[];\n  }\n\n  interface ShowHintOptions {\n    hint?: ShowHintOptions['hint'];\n  }\n\n  const hint: object;\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/info.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport {\n  GraphQLDirective,\n  GraphQLEnumType,\n  GraphQLEnumValue,\n  GraphQLInputField,\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQLType,\n} from 'graphql';\nimport CodeMirror from 'codemirror';\n\nimport getTypeInfo, { TypeInfo } from './utils/getTypeInfo';\nimport {\n  getArgumentReference,\n  getDirectiveReference,\n  getEnumValueReference,\n  getFieldReference,\n  getTypeReference,\n  SchemaReference,\n} from './utils/SchemaReference';\nimport './utils/info-addon';\nimport type { Maybe } from 'graphql-language-service';\n\nexport interface GraphQLInfoOptions {\n  schema?: GraphQLSchema;\n  onClick?: Maybe<(ref: Maybe<SchemaReference>, e: MouseEvent) => void>;\n  renderDescription?: (str: string) => string;\n  render?: () => string;\n}\n\n/**\n * Registers GraphQL \"info\" tooltips for CodeMirror.\n *\n * When hovering over a token, this presents a tooltip explaining it.\n *\n * Options:\n *\n *   - schema: GraphQLSchema provides positionally relevant info.\n *   - hoverTime: The number of ms to wait before showing info. (Default 500)\n *   - renderDescription: Convert a description to some HTML, Useful since\n *                        descriptions are often Markdown formatted.\n *   - onClick: A function called when a named thing is clicked.\n *\n */\nCodeMirror.registerHelper(\n  'info',\n  'graphql',\n  (token: CodeMirror.Token, options: GraphQLInfoOptions) => {\n    if (!options.schema || !token.state) {\n      return;\n    }\n    const { kind, step } = token.state;\n    const typeInfo = getTypeInfo(options.schema, token.state);\n    // Given a Schema and a Token, produce the contents of an info tooltip.\n    // To do this, create a div element that we will render \"into\" and then pass\n    // it to various rendering functions.\n    if (\n      (kind === 'Field' && step === 0 && typeInfo.fieldDef) ||\n      (kind === 'AliasedField' && step === 2 && typeInfo.fieldDef) ||\n      (kind === 'ObjectField' && step === 0 && typeInfo.fieldDef)\n    ) {\n      const header = document.createElement('div');\n      header.className = 'CodeMirror-info-header';\n      renderField(header, typeInfo, options);\n      const into = document.createElement('div');\n      into.append(header);\n      renderDescription(into, options, typeInfo.fieldDef as any);\n      return into;\n    }\n\n    if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) {\n      const header = document.createElement('div');\n      header.className = 'CodeMirror-info-header';\n      renderDirective(header, typeInfo, options);\n      const into = document.createElement('div');\n      into.append(header);\n      renderDescription(into, options, typeInfo.directiveDef);\n      return into;\n    }\n    if (kind === 'Argument' && step === 0 && typeInfo.argDef) {\n      const header = document.createElement('div');\n      header.className = 'CodeMirror-info-header';\n      renderArg(header, typeInfo, options);\n      const into = document.createElement('div');\n      into.append(header);\n      renderDescription(into, options, typeInfo.argDef);\n      return into;\n    }\n    if (kind === 'EnumValue' && typeInfo.enumValue?.description) {\n      const header = document.createElement('div');\n      header.className = 'CodeMirror-info-header';\n      renderEnumValue(header, typeInfo, options);\n      const into = document.createElement('div');\n      into.append(header);\n      renderDescription(into, options, typeInfo.enumValue);\n      return into;\n    }\n    if (\n      kind === 'NamedType' &&\n      typeInfo.type &&\n      (typeInfo.type as GraphQLObjectType).description\n    ) {\n      const header = document.createElement('div');\n      header.className = 'CodeMirror-info-header';\n      renderType(header, typeInfo, options, typeInfo.type);\n      const into = document.createElement('div');\n      into.append(header);\n      renderDescription(into, options, typeInfo.type);\n      return into;\n    }\n  },\n);\n\nfunction renderField(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n) {\n  renderQualifiedField(into, typeInfo, options);\n  renderTypeAnnotation(into, typeInfo, options, typeInfo.type);\n}\n\nfunction renderQualifiedField(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n) {\n  const fieldName = typeInfo.fieldDef?.name || '';\n  text(into, fieldName, 'field-name', options, getFieldReference(typeInfo));\n}\n\nfunction renderDirective(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n) {\n  const name = '@' + (typeInfo.directiveDef?.name || '');\n  text(into, name, 'directive-name', options, getDirectiveReference(typeInfo));\n}\n\nfunction renderArg(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n) {\n  const name = typeInfo.argDef?.name || '';\n  text(into, name, 'arg-name', options, getArgumentReference(typeInfo));\n  renderTypeAnnotation(into, typeInfo, options, typeInfo.inputType);\n}\n\nfunction renderEnumValue(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n) {\n  const name = typeInfo.enumValue?.name || '';\n  renderType(into, typeInfo, options, typeInfo.inputType);\n  text(into, '.');\n  text(into, name, 'enum-value', options, getEnumValueReference(typeInfo));\n}\n\nfunction renderTypeAnnotation(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n  t: Maybe<GraphQLType>,\n) {\n  const typeSpan = document.createElement('span');\n  typeSpan.className = 'type-name-pill';\n  if (t instanceof GraphQLNonNull) {\n    renderType(typeSpan, typeInfo, options, t.ofType);\n    text(typeSpan, '!');\n  } else if (t instanceof GraphQLList) {\n    text(typeSpan, '[');\n    renderType(typeSpan, typeInfo, options, t.ofType);\n    text(typeSpan, ']');\n  } else {\n    text(\n      typeSpan,\n      t?.name || '',\n      'type-name',\n      options,\n      getTypeReference(typeInfo, t),\n    );\n  }\n  into.append(typeSpan);\n}\n\nfunction renderType(\n  into: HTMLElement,\n  typeInfo: TypeInfo,\n  options: GraphQLInfoOptions,\n  t: Maybe<GraphQLType>,\n) {\n  if (t instanceof GraphQLNonNull) {\n    renderType(into, typeInfo, options, t.ofType);\n    text(into, '!');\n  } else if (t instanceof GraphQLList) {\n    text(into, '[');\n    renderType(into, typeInfo, options, t.ofType);\n    text(into, ']');\n  } else {\n    text(\n      into,\n      t?.name || '',\n      'type-name',\n      options,\n      getTypeReference(typeInfo, t),\n    );\n  }\n}\n\nfunction renderDescription(\n  into: HTMLElement,\n  options: GraphQLInfoOptions,\n  def:\n    | GraphQLInputField\n    | GraphQLEnumType\n    | GraphQLDirective\n    | GraphQLEnumValue\n    | GraphQLType,\n) {\n  const { description } = def as GraphQLInputField;\n  if (description) {\n    const descriptionDiv = document.createElement('div');\n    descriptionDiv.className = 'info-description';\n    if (options.renderDescription) {\n      descriptionDiv.innerHTML = options.renderDescription(description);\n    } else {\n      descriptionDiv.append(document.createTextNode(description));\n    }\n    into.append(descriptionDiv);\n  }\n\n  renderDeprecation(into, options, def);\n}\n\nfunction renderDeprecation(\n  into: HTMLElement,\n  options: GraphQLInfoOptions,\n  def:\n    | GraphQLInputField\n    | GraphQLEnumType\n    | GraphQLDirective\n    | GraphQLEnumValue\n    | GraphQLType,\n) {\n  const reason = (def as GraphQLInputField).deprecationReason;\n  if (reason) {\n    const deprecationDiv = document.createElement('div');\n    deprecationDiv.className = 'info-deprecation';\n    into.append(deprecationDiv);\n\n    const label = document.createElement('span');\n    label.className = 'info-deprecation-label';\n    label.append(document.createTextNode('Deprecated'));\n    deprecationDiv.append(label);\n\n    const reasonDiv = document.createElement('div');\n    reasonDiv.className = 'info-deprecation-reason';\n    if (options.renderDescription) {\n      reasonDiv.innerHTML = options.renderDescription(reason);\n    } else {\n      reasonDiv.append(document.createTextNode(reason));\n    }\n    deprecationDiv.append(reasonDiv);\n  }\n}\n\nfunction text(\n  into: HTMLElement,\n  content: string,\n  className = '',\n  options: GraphQLInfoOptions = { onClick: null },\n  ref: Maybe<SchemaReference> = null,\n) {\n  if (className) {\n    const { onClick } = options;\n    let node;\n    if (onClick) {\n      node = document.createElement('a');\n\n      // Providing a href forces proper a tag behavior, though we don't actually\n      // want clicking the node to navigate anywhere.\n      node.href = 'javascript:void 0'; // eslint-disable-line no-script-url\n      node.addEventListener('click', (e: MouseEvent) => {\n        // Although an href of 'javascript:void 0' should never navigate away from the page,\n        //   that is not always the case: https://github.com/graphql/graphiql/issues/3565\n        e.preventDefault();\n        onClick(ref, e);\n      });\n    } else {\n      node = document.createElement('span');\n    }\n    node.className = className;\n    node.append(document.createTextNode(content));\n    into.append(node);\n  } else {\n    into.append(document.createTextNode(content));\n  }\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/jump.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\n\nimport getTypeInfo from './utils/getTypeInfo';\nimport {\n  getArgumentReference,\n  getDirectiveReference,\n  getEnumValueReference,\n  getFieldReference,\n  getTypeReference,\n} from './utils/SchemaReference';\nimport './utils/jump-addon';\nimport { GraphQLSchema } from 'graphql';\nimport type { State } from 'graphql-language-service';\n\nexport interface GraphQLJumpOptions {\n  schema?: GraphQLSchema;\n  onClick?: () => void;\n  state?: State;\n}\n\n/**\n * Registers GraphQL \"jump\" links for CodeMirror.\n *\n * When command-hovering over a token, this converts it to a link, which when\n * pressed will call the provided onClick handler.\n *\n * Options:\n *\n *   - schema: GraphQLSchema provides positionally relevant info.\n *   - onClick: A function called when a named thing is clicked.\n *\n */\nCodeMirror.registerHelper(\n  'jump',\n  'graphql',\n  (token: CodeMirror.Token, options: GraphQLJumpOptions) => {\n    if (!options.schema || !options.onClick || !token.state) {\n      return;\n    }\n\n    // Given a Schema and a Token, produce a \"SchemaReference\" which refers to\n    // the particular artifact from the schema (such as a type, field, argument,\n    // or directive) that token references.\n    const { state } = token;\n    const { kind, step } = state;\n    const typeInfo = getTypeInfo(options.schema, state);\n\n    if (\n      (kind === 'Field' && step === 0 && typeInfo.fieldDef) ||\n      (kind === 'AliasedField' && step === 2 && typeInfo.fieldDef)\n    ) {\n      return getFieldReference(typeInfo);\n    }\n    if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) {\n      return getDirectiveReference(typeInfo);\n    }\n    if (kind === 'Argument' && step === 0 && typeInfo.argDef) {\n      return getArgumentReference(typeInfo);\n    }\n    if (kind === 'EnumValue' && typeInfo.enumValue) {\n      return getEnumValueReference(typeInfo);\n    }\n    if (kind === 'NamedType' && typeInfo.type) {\n      return getTypeReference(typeInfo);\n    }\n  },\n);\n"
  },
  {
    "path": "packages/codemirror-graphql/src/lint.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport { FragmentDefinitionNode, GraphQLSchema, ValidationRule } from 'graphql';\nimport { getDiagnostics } from 'graphql-language-service';\n\nconst SEVERITY = ['error', 'warning', 'information', 'hint'];\nconst TYPE: Record<string, string> = {\n  'GraphQL: Validation': 'validation',\n  'GraphQL: Deprecation': 'deprecation',\n  'GraphQL: Syntax': 'syntax',\n};\n\ninterface GraphQLLintOptions {\n  schema?: GraphQLSchema;\n  validationRules: ValidationRule[];\n  externalFragments?: string | FragmentDefinitionNode[];\n}\n\n/**\n * Registers a \"lint\" helper for CodeMirror.\n *\n * Using CodeMirror's \"lint\" addon: https://codemirror.net/demo/lint.html\n * Given the text within an editor, this helper will take that text and return\n * a list of linter issues, derived from GraphQL's parse and validate steps.\n * Also, this uses `graphql-language-service-parser` to power the diagnostics\n * service.\n *\n * Options:\n *\n *   - schema: GraphQLSchema provides the linter with positionally relevant info\n *\n */\nCodeMirror.registerHelper(\n  'lint',\n  'graphql',\n  (text: string, options: GraphQLLintOptions): CodeMirror.Annotation[] => {\n    const { schema, validationRules, externalFragments } = options;\n    const rawResults = getDiagnostics(\n      text,\n      schema,\n      validationRules,\n      undefined,\n      externalFragments,\n    );\n\n    const results = rawResults.map(error => ({\n      message: error.message,\n      severity: error.severity ? SEVERITY[error.severity - 1] : SEVERITY[0],\n      type: error.source ? TYPE[error.source] : undefined,\n      from: CodeMirror.Pos(error.range.start.line, error.range.start.character),\n      to: CodeMirror.Pos(error.range.end.line, error.range.end.character),\n    }));\n\n    return results;\n  },\n);\n"
  },
  {
    "path": "packages/codemirror-graphql/src/mode.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport modeFactory from './utils/mode-factory';\n\nCodeMirror.defineMode('graphql', modeFactory);\n"
  },
  {
    "path": "packages/codemirror-graphql/src/results/__tests__/mode.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/runmode/runmode';\nimport '../mode';\n\ndescribe('graphql-results-mode', () => {\n  it('provides correct tokens and styles after parsing', () => {\n    const queryStr =\n      '{ \"data\": { \"field\": \"value\" }, \"errors\": [ { \"message\": \"bork\" } ] }';\n    const tokens: [string, string][] = [];\n\n    CodeMirror.runMode(queryStr, 'graphql-results', (token, style) => {\n      if (style && style !== 'ws') {\n        tokens.push([token, style]);\n      }\n    });\n\n    expect(tokens).toEqual([\n      ['{', 'punctuation'],\n      ['\"data\"', 'def'],\n      [':', 'punctuation'],\n      ['{', 'punctuation'],\n      ['\"field\"', 'property'],\n      [':', 'punctuation'],\n      ['\"value\"', 'string'],\n      ['}', 'punctuation'],\n      [',', 'punctuation'],\n      ['\"errors\"', 'def'],\n      [':', 'punctuation'],\n      ['[', 'punctuation'],\n      ['{', 'punctuation'],\n      ['\"message\"', 'property'],\n      [':', 'punctuation'],\n      ['\"bork\"', 'string'],\n      ['}', 'punctuation'],\n      [']', 'punctuation'],\n      ['}', 'punctuation'],\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/results/mode.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\n\nimport { list, t, onlineParser, p, Token } from 'graphql-language-service';\nimport indent from '../utils/mode-indent';\n\n/**\n * This mode defines JSON, but provides a data-laden parser state to enable\n * better code intelligence.\n */\nCodeMirror.defineMode('graphql-results', config => {\n  const parser = onlineParser({\n    eatWhitespace: stream => stream.eatSpace(),\n    lexRules: LexRules,\n    parseRules: ParseRules,\n    editorConfig: { tabSize: config.tabSize },\n  });\n\n  return {\n    config,\n    startState: parser.startState,\n    token: parser.token as unknown as CodeMirror.Mode<any>['token'], // TODO: Check if the types are indeed compatible\n    indent,\n    electricInput: /^\\s*[}\\]]/,\n    fold: 'brace',\n    closeBrackets: {\n      pairs: '[]{}\"\"',\n      explode: '[]{}',\n    },\n  };\n});\n\n/**\n * The lexer rules. These are exactly as described by the spec.\n */\nconst LexRules = {\n  // All Punctuation used in JSON.\n  Punctuation: /^\\[|]|\\{|\\}|:|,/,\n\n  // JSON Number.\n  Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/,\n\n  // JSON String.\n  String: /^\"(?:[^\"\\\\]|\\\\(?:\"|\\/|\\\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*\"?/,\n\n  // JSON literal keywords.\n  Keyword: /^true|false|null/,\n};\n\n/**\n * The parser rules for JSON.\n */\nconst ParseRules = {\n  Document: [p('{'), list('Entry', p(',')), p('}')],\n  Entry: [t('String', 'def'), p(':'), 'Value'],\n  Value(token: Token) {\n    switch (token.kind) {\n      case 'Number':\n        return 'NumberValue';\n      case 'String':\n        return 'StringValue';\n      case 'Punctuation':\n        switch (token.value) {\n          case '[':\n            return 'ListValue';\n          case '{':\n            return 'ObjectValue';\n        }\n        return null;\n      case 'Keyword':\n        switch (token.value) {\n          case 'true':\n          case 'false':\n            return 'BooleanValue';\n          case 'null':\n            return 'NullValue';\n        }\n        return null;\n    }\n  },\n  NumberValue: [t('Number', 'number')],\n  StringValue: [t('String', 'string')],\n  BooleanValue: [t('Keyword', 'builtin')],\n  NullValue: [t('Keyword', 'keyword')],\n  ListValue: [p('['), list('Value', p(',')), p(']')],\n  ObjectValue: [p('{'), list('ObjectField', p(',')), p('}')],\n  ObjectField: [t('String', 'property'), p(':'), 'Value'],\n};\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/SchemaReference.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport { getNamedType, GraphQLSchema } from 'graphql';\n\nimport type {\n  GraphQLArgument,\n  GraphQLDirective,\n  GraphQLEnumValue,\n  GraphQLEnumType,\n  GraphQLField,\n  GraphQLNamedType,\n} from 'graphql';\nimport { Maybe } from 'graphql/jsutils/Maybe';\nimport { TypeInfo } from './getTypeInfo';\n\nexport type SchemaReference =\n  | FieldReference\n  | DirectiveReference\n  | ArgumentReference\n  | EnumValueReference\n  | TypeReference;\n\nexport type FieldReference = {\n  kind: 'Field';\n  field: GraphQLField<any, any>;\n  type: Maybe<GraphQLNamedType>;\n  schema?: GraphQLSchema;\n};\n\nexport type DirectiveReference = {\n  kind: 'Directive';\n  directive: GraphQLDirective;\n  schema?: GraphQLSchema;\n};\n\nexport type ArgumentReference = {\n  kind: 'Argument';\n  argument: GraphQLArgument;\n  field?: GraphQLField<any, any>;\n  type?: GraphQLNamedType;\n  directive?: GraphQLDirective;\n  schema?: GraphQLSchema;\n};\n\nexport type EnumValueReference = {\n  kind: 'EnumValue';\n  value?: GraphQLEnumValue;\n  type?: GraphQLEnumType;\n  schema?: GraphQLSchema;\n};\n\nexport type TypeReference = {\n  kind: 'Type';\n  type: GraphQLNamedType;\n  schema?: GraphQLSchema;\n};\n\nexport function getFieldReference(typeInfo: any): FieldReference {\n  return {\n    kind: 'Field',\n    schema: typeInfo.schema,\n    field: typeInfo.fieldDef,\n    type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType,\n  };\n}\n\nexport function getDirectiveReference(typeInfo: any): DirectiveReference {\n  return {\n    kind: 'Directive',\n    schema: typeInfo.schema,\n    directive: typeInfo.directiveDef,\n  };\n}\n\nexport function getArgumentReference(typeInfo: any): ArgumentReference {\n  return typeInfo.directiveDef\n    ? {\n        kind: 'Argument',\n        schema: typeInfo.schema,\n        argument: typeInfo.argDef,\n        directive: typeInfo.directiveDef,\n      }\n    : {\n        kind: 'Argument',\n        schema: typeInfo.schema,\n        argument: typeInfo.argDef,\n        field: typeInfo.fieldDef,\n        type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType,\n      };\n}\n\nexport function getEnumValueReference(typeInfo: TypeInfo): EnumValueReference {\n  return {\n    kind: 'EnumValue',\n    value: typeInfo.enumValue || undefined,\n    type: typeInfo.inputType\n      ? (getNamedType(typeInfo.inputType) as GraphQLEnumType)\n      : undefined,\n  };\n}\n\n// Note: for reusability, getTypeReference can produce a reference to any type,\n// though it defaults to the current type.\nexport function getTypeReference(\n  typeInfo: any,\n  type?: Maybe<GraphQLNamedType>,\n): TypeReference {\n  return {\n    kind: 'Type',\n    schema: typeInfo.schema,\n    type: type || typeInfo.type,\n  };\n}\n\nfunction isMetaField(fieldDef: GraphQLField<any, any>) {\n  return fieldDef.name.slice(0, 2) === '__';\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/__tests__/jsonParse.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\nimport jsonParse, { ParseTokenOutput } from '../jsonParse';\n\ndescribe('jsonParse', () => {\n  function expectEscapedString(\n    str: string,\n    key: ParseTokenOutput,\n    value: ParseTokenOutput,\n  ) {\n    const ast = jsonParse(str);\n    expect(ast.kind).toBe('Object');\n    expect(ast.members[0].key).toStrictEqual(key);\n    expect(ast.members[0].value).toStrictEqual(value);\n  }\n\n  it('correctly parses escaped strings', () => {\n    expectEscapedString(\n      '{ \"test\": \"\\\\\"\" }',\n      { kind: 'String', start: 2, end: 8, value: 'test' },\n      { kind: 'String', start: 10, end: 14, value: '\"' },\n    );\n    expectEscapedString(\n      '{ \"test\": \"\\\\\\\\\" }',\n      { kind: 'String', start: 2, end: 8, value: 'test' },\n      { kind: 'String', start: 10, end: 14, value: '\\\\' },\n    );\n    expectEscapedString(\n      '{ \"slash\": \"\\\\/\" }',\n      { kind: 'String', start: 2, end: 9, value: 'slash' },\n      { kind: 'String', start: 11, end: 15, value: '/' },\n    );\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/collectVariables.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport {\n  DocumentNode,\n  GraphQLSchema,\n  NamedTypeNode,\n  typeFromAST,\n} from 'graphql';\n\n/**\n * Provided a schema and a document, produces a `variableToType` Object.\n */\nexport default function collectVariables(\n  schema: GraphQLSchema,\n  documentAST: DocumentNode,\n) {\n  const variableToType = Object.create(null);\n  for (const definition of documentAST.definitions) {\n    if (definition.kind === 'OperationDefinition') {\n      const { variableDefinitions } = definition;\n      if (variableDefinitions) {\n        for (const { variable, type } of variableDefinitions) {\n          const inputType = typeFromAST(schema, type as NamedTypeNode);\n          if (inputType) {\n            variableToType[variable.name.value] = inputType;\n          }\n        }\n      }\n    }\n  }\n  return variableToType;\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/forEachState.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport type { State, Maybe } from 'graphql-language-service';\n\n// Utility for iterating through a CodeMirror parse state stack bottom-up.\nexport default function forEachState(stack: State, fn: (state: State) => void) {\n  const reverseStateStack = [];\n  let state: Maybe<State> = stack;\n  while (state?.kind) {\n    reverseStateStack.push(state);\n    state = state.prevState;\n  }\n  for (let i = reverseStateStack.length - 1; i >= 0; i--) {\n    fn(reverseStateStack[i]);\n  }\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/getTypeInfo.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport {\n  isCompositeType,\n  getNullableType,\n  getNamedType,\n  GraphQLEnumType,\n  GraphQLInputObjectType,\n  GraphQLList,\n  GraphQLSchema,\n  GraphQLType,\n  GraphQLObjectType,\n  GraphQLField,\n  GraphQLDirective,\n  GraphQLArgument,\n  GraphQLInputType,\n  GraphQLEnumValue,\n  GraphQLInputFieldMap,\n  SchemaMetaFieldDef,\n  TypeMetaFieldDef,\n  TypeNameMetaFieldDef,\n} from 'graphql';\nimport type { State, Maybe } from 'graphql-language-service';\nimport forEachState from './forEachState';\n\nexport interface TypeInfo {\n  schema: GraphQLSchema;\n  type?: Maybe<GraphQLType>;\n  parentType?: Maybe<GraphQLType>;\n  inputType?: Maybe<GraphQLInputType>;\n  directiveDef?: Maybe<GraphQLDirective>;\n  fieldDef?: Maybe<GraphQLField<any, any>>;\n  argDef?: Maybe<GraphQLArgument>;\n  argDefs?: Maybe<GraphQLArgument[]>;\n  enumValue?: Maybe<GraphQLEnumValue>;\n  objectFieldDefs?: Maybe<GraphQLInputFieldMap>;\n}\n\n/**\n * Utility for collecting rich type information given any token's state\n * from the graphql-mode parser.\n */\nexport default function getTypeInfo(schema: GraphQLSchema, tokenState: State) {\n  const info: TypeInfo = {\n    schema,\n    type: null,\n    parentType: null,\n    inputType: null,\n    directiveDef: null,\n    fieldDef: null,\n    argDef: null,\n    argDefs: null,\n    objectFieldDefs: null,\n  };\n\n  forEachState(tokenState, (state: State) => {\n    switch (state.kind) {\n      case 'Query':\n      case 'ShortQuery':\n        info.type = schema.getQueryType();\n        break;\n      case 'Mutation':\n        info.type = schema.getMutationType();\n        break;\n      case 'Subscription':\n        info.type = schema.getSubscriptionType();\n        break;\n      case 'InlineFragment':\n      case 'FragmentDefinition':\n        if (state.type) {\n          info.type = schema.getType(state.type);\n        }\n        break;\n      case 'Field':\n      case 'AliasedField':\n        info.fieldDef =\n          info.type && state.name\n            ? getFieldDef(schema, info.parentType, state.name)\n            : null;\n        info.type = info.fieldDef?.type;\n        break;\n      case 'SelectionSet':\n        info.parentType = info.type ? getNamedType(info.type) : null;\n        break;\n      case 'Directive':\n        info.directiveDef = state.name ? schema.getDirective(state.name) : null;\n        break;\n      case 'Arguments':\n        const parentDef = state.prevState\n          ? state.prevState.kind === 'Field'\n            ? info.fieldDef\n            : state.prevState.kind === 'Directive'\n              ? info.directiveDef\n              : state.prevState.kind === 'AliasedField'\n                ? state.prevState.name &&\n                  getFieldDef(schema, info.parentType, state.prevState.name)\n                : null\n          : null;\n        info.argDefs = parentDef ? (parentDef.args as GraphQLArgument[]) : null;\n        break;\n      case 'Argument':\n        info.argDef = null;\n        if (info.argDefs) {\n          for (let i = 0; i < info.argDefs.length; i++) {\n            if (info.argDefs[i].name === state.name) {\n              info.argDef = info.argDefs[i];\n              break;\n            }\n          }\n        }\n        info.inputType = info.argDef?.type;\n        break;\n      case 'EnumValue':\n        const enumType = info.inputType ? getNamedType(info.inputType) : null;\n        info.enumValue =\n          enumType instanceof GraphQLEnumType\n            ? find(\n                enumType.getValues() as GraphQLEnumValue[],\n                val => val.value === state.name,\n              )\n            : null;\n        break;\n      case 'ListValue':\n        const nullableType = info.inputType\n          ? getNullableType(info.inputType)\n          : null;\n        info.inputType =\n          nullableType instanceof GraphQLList ? nullableType.ofType : null;\n        break;\n      case 'ObjectValue':\n        const objectType = info.inputType ? getNamedType(info.inputType) : null;\n        info.objectFieldDefs =\n          objectType instanceof GraphQLInputObjectType\n            ? objectType.getFields()\n            : null;\n        break;\n      case 'ObjectField':\n        const objectField =\n          state.name && info.objectFieldDefs\n            ? info.objectFieldDefs[state.name]\n            : null;\n        info.inputType = objectField?.type;\n        // @ts-expect-error\n        info.fieldDef = objectField;\n        break;\n      case 'NamedType':\n        info.type = state.name ? schema.getType(state.name) : null;\n        break;\n    }\n  });\n\n  return info;\n}\n\n// Gets the field definition given a type and field name\nfunction getFieldDef(\n  schema: GraphQLSchema,\n  type: Maybe<GraphQLType>,\n  fieldName: string,\n) {\n  if (fieldName === SchemaMetaFieldDef.name && schema.getQueryType() === type) {\n    return SchemaMetaFieldDef;\n  }\n  if (fieldName === TypeMetaFieldDef.name && schema.getQueryType() === type) {\n    return TypeMetaFieldDef;\n  }\n  if (fieldName === TypeNameMetaFieldDef.name && isCompositeType(type)) {\n    return TypeNameMetaFieldDef;\n  }\n  if (type && (type as GraphQLObjectType).getFields) {\n    return (type as GraphQLObjectType).getFields()[fieldName];\n  }\n}\n\n// Returns the first item in the array which causes predicate to return truthy.\nfunction find<T>(array: T[], predicate: (item: T) => boolean) {\n  for (let i = 0; i < array.length; i++) {\n    if (predicate(array[i])) {\n      return array[i];\n    }\n  }\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/hintList.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport type CodeMirror from 'codemirror';\nimport { IHint, IHints } from '../hint';\n\n// Create the expected hint response given a possible list and a token\nexport default function hintList(\n  cursor: CodeMirror.Position,\n  token: CodeMirror.Token,\n  list: IHint[],\n): IHints | undefined {\n  const hints = filterAndSortList(list, normalizeText(token.string));\n  if (!hints) {\n    return;\n  }\n\n  const tokenStart =\n    token.type !== null && /\"|\\w/.test(token.string[0])\n      ? token.start\n      : token.end;\n\n  return {\n    list: hints,\n    from: { line: cursor.line, ch: tokenStart }, // TODO: Confirm. Was changed column to ch\n    to: { line: cursor.line, ch: token.end },\n  };\n}\n\n// Given a list of hint entries and currently typed text, sort and filter to\n// provide a concise list.\nfunction filterAndSortList(list: IHint[], text: string) {\n  if (!text) {\n    return filterNonEmpty(list, entry => !entry.isDeprecated);\n  }\n\n  const byProximity = list.map(entry => ({\n    proximity: getProximity(normalizeText(entry.text), text),\n    entry,\n  }));\n\n  const conciseMatches = filterNonEmpty(\n    filterNonEmpty(byProximity, pair => pair.proximity <= 2),\n    pair => !pair.entry.isDeprecated,\n  );\n\n  const sortedMatches = conciseMatches.sort(\n    (a, b) =>\n      (a.entry.isDeprecated ? 1 : 0) - (b.entry.isDeprecated ? 1 : 0) ||\n      a.proximity - b.proximity ||\n      a.entry.text.length - b.entry.text.length,\n  );\n\n  return sortedMatches.map(pair => pair.entry);\n}\n\n// Filters the array by the predicate, unless it results in an empty array,\n// in which case return the original array.\nfunction filterNonEmpty<T>(array: T[], predicate: (item: T) => boolean) {\n  const filtered = array.filter(predicate);\n  return filtered.length === 0 ? array : filtered;\n}\n\nfunction normalizeText(text: string) {\n  return text.toLowerCase().replaceAll(/\\W/g, '');\n}\n\n// Determine a numeric proximity for a suggestion based on current text.\nfunction getProximity(suggestion: string, text: string) {\n  // start with lexical distance\n  let proximity = lexicalDistance(text, suggestion);\n  if (suggestion.length > text.length) {\n    // do not penalize long suggestions.\n    proximity -= suggestion.length - text.length - 1;\n    // penalize suggestions not starting with this phrase\n    proximity += suggestion.indexOf(text) === 0 ? 0 : 0.5;\n  }\n  return proximity;\n}\n\n/**\n * Computes the lexical distance between strings A and B.\n *\n * The \"distance\" between two strings is given by counting the minimum number\n * of edits needed to transform string A into string B. An edit can be an\n * insertion, deletion, or substitution of a single character, or a swap of two\n * adjacent characters.\n *\n * This distance can be useful for detecting typos in input or sorting\n *\n * @param {string} a\n * @param {string} b\n * @return {int} distance in number of edits\n */\nfunction lexicalDistance(a: string, b: string) {\n  let i;\n  let j;\n  const d = [];\n  const aLength = a.length;\n  const bLength = b.length;\n\n  for (i = 0; i <= aLength; i++) {\n    d[i] = [i];\n  }\n\n  for (j = 1; j <= bLength; j++) {\n    d[0][j] = j;\n  }\n\n  for (i = 1; i <= aLength; i++) {\n    for (j = 1; j <= bLength; j++) {\n      const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\n      d[i][j] = Math.min(\n        d[i - 1][j] + 1,\n        d[i][j - 1] + 1,\n        d[i - 1][j - 1] + cost,\n      );\n\n      if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n        d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);\n      }\n    }\n  }\n\n  return d[aLength][bLength];\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/info-addon.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport { GraphQLInfoOptions } from '../info';\n\nCodeMirror.defineOption(\n  'info',\n  false,\n  (\n    cm: CodeMirror.Editor,\n    options: GraphQLInfoOptions,\n    old?: GraphQLInfoOptions,\n  ) => {\n    if (old && old !== CodeMirror.Init) {\n      const oldOnMouseOver = cm.state.info.onMouseOver;\n      CodeMirror.off(cm.getWrapperElement(), 'mouseover', oldOnMouseOver);\n      clearTimeout(cm.state.info.hoverTimeout);\n      delete cm.state.info;\n    }\n\n    if (options) {\n      const state: Record<string, any> = (cm.state.info = createState(options));\n      state.onMouseOver = onMouseOver.bind(null, cm);\n      CodeMirror.on(cm.getWrapperElement(), 'mouseover', state.onMouseOver);\n    }\n  },\n);\n\nfunction createState(options: GraphQLInfoOptions) {\n  return {\n    options:\n      options instanceof Function\n        ? { render: options }\n        : options === true\n          ? {}\n          : options,\n  };\n}\n\nfunction getHoverTime(cm: CodeMirror.Editor) {\n  const { options } = cm.state.info;\n  return options?.hoverTime || 500;\n}\n\nfunction onMouseOver(cm: CodeMirror.Editor, e: MouseEvent) {\n  const state = cm.state.info;\n\n  const target = e.target || e.srcElement;\n\n  if (!(target instanceof HTMLElement)) {\n    return;\n  }\n  if (target.nodeName !== 'SPAN' || state.hoverTimeout !== undefined) {\n    return;\n  }\n\n  const box = target.getBoundingClientRect();\n\n  const onMouseMove = function () {\n    clearTimeout(state.hoverTimeout);\n    state.hoverTimeout = setTimeout(onHover, hoverTime);\n  };\n\n  const onMouseOut = function () {\n    CodeMirror.off(document, 'mousemove', onMouseMove);\n    CodeMirror.off(cm.getWrapperElement(), 'mouseout', onMouseOut);\n    clearTimeout(state.hoverTimeout);\n    state.hoverTimeout = undefined;\n  };\n\n  const onHover = function () {\n    CodeMirror.off(document, 'mousemove', onMouseMove);\n    CodeMirror.off(cm.getWrapperElement(), 'mouseout', onMouseOut);\n    state.hoverTimeout = undefined;\n    onMouseHover(cm, box);\n  };\n\n  const hoverTime = getHoverTime(cm);\n  state.hoverTimeout = setTimeout(onHover, hoverTime);\n\n  CodeMirror.on(document, 'mousemove', onMouseMove);\n  CodeMirror.on(cm.getWrapperElement(), 'mouseout', onMouseOut);\n}\n\nfunction onMouseHover(cm: CodeMirror.Editor, box: DOMRect) {\n  const pos = cm.coordsChar(\n    {\n      left: (box.left + box.right) / 2,\n      top: (box.top + box.bottom) / 2,\n    },\n    'window',\n  ); // 'window' allows to work when editor is not full page and window has scrolled\n\n  const state = cm.state.info;\n  const { options } = state;\n  const render = options.render || cm.getHelper(pos, 'info');\n  if (render) {\n    const token = cm.getTokenAt(pos, true);\n    if (token) {\n      const info: HTMLDivElement = render(token, options, cm, pos);\n      if (info) {\n        showPopup(cm, box, info);\n      }\n    }\n  }\n}\n\nfunction showPopup(cm: CodeMirror.Editor, box: DOMRect, info: HTMLDivElement) {\n  const popup = document.createElement('div');\n  popup.className = 'CodeMirror-info';\n  popup.append(info);\n  document.body.append(popup);\n\n  const popupBox = popup.getBoundingClientRect();\n  const { marginLeft, marginRight, marginBottom, marginTop } =\n    getComputedStyle(popup);\n\n  const popupWidth =\n    popupBox.right -\n    popupBox.left +\n    parseFloat(marginLeft) +\n    parseFloat(marginRight);\n  const popupHeight =\n    popupBox.bottom -\n    popupBox.top +\n    parseFloat(marginTop) +\n    parseFloat(marginBottom);\n\n  let topPos = box.bottom;\n  if (\n    popupHeight > window.innerHeight - box.bottom - 15 &&\n    box.top > window.innerHeight - box.bottom\n  ) {\n    topPos = box.top - popupHeight;\n  }\n\n  if (topPos < 0) {\n    topPos = box.bottom;\n  }\n\n  let leftPos = Math.max(0, window.innerWidth - popupWidth - 15);\n  if (leftPos > box.left) {\n    leftPos = box.left;\n  }\n\n  popup.style.opacity = '1';\n  popup.style.top = topPos + 'px';\n  popup.style.left = leftPos + 'px';\n\n  let popupTimeout: NodeJS.Timeout;\n\n  const onMouseOverPopup = function () {\n    clearTimeout(popupTimeout);\n  };\n\n  const onMouseOut = function () {\n    clearTimeout(popupTimeout);\n    popupTimeout = setTimeout(hidePopup, 200);\n  };\n\n  const hidePopup = function () {\n    CodeMirror.off(popup, 'mouseover', onMouseOverPopup);\n    CodeMirror.off(popup, 'mouseout', onMouseOut);\n    CodeMirror.off(cm.getWrapperElement(), 'mouseout', onMouseOut);\n\n    if (popup.style.opacity) {\n      popup.style.opacity = '0';\n      setTimeout(() => {\n        if (popup.parentNode) {\n          popup.remove();\n        }\n      }, 600);\n    } else if (popup.parentNode) {\n      popup.remove();\n    }\n  };\n\n  CodeMirror.on(popup, 'mouseover', onMouseOverPopup);\n  CodeMirror.on(popup, 'mouseout', onMouseOut);\n  CodeMirror.on(cm.getWrapperElement(), 'mouseout', onMouseOut);\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/jsonParse.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n/**\n * This JSON parser simply walks the input, generating an AST. Use this in lieu\n * of JSON.parse if you need character offset parse errors and an AST parse tree\n * with location information.\n *\n * If an error is encountered, a SyntaxError will be thrown, with properties:\n *\n *   - message: string\n *   - start: int - the start inclusive offset of the syntax error\n *   - end: int - the end exclusive offset of the syntax error\n *\n */\nexport default function jsonParse(str: string) {\n  string = str;\n  strLen = str.length;\n  start = end = lastEnd = -1;\n  ch();\n  lex();\n  const ast = parseObj();\n  expect('EOF');\n  return ast;\n}\n\nlet string: string;\nlet strLen: number;\nlet start: number;\nlet end: number;\nlet lastEnd: number;\nlet code: number;\nlet kind: string;\n\ninterface BaseParseOutput {\n  kind: string;\n  start: number;\n  end: number;\n}\nexport interface ParseTokenOutput extends BaseParseOutput {\n  value: any;\n}\nexport interface ParseObjectOutput extends BaseParseOutput {\n  kind: 'Object';\n  members: ParseMemberOutput[];\n}\nexport interface ParseArrayOutput extends BaseParseOutput {\n  kind: 'Array';\n  values?: ParseValueOutput[];\n}\nexport interface ParseMemberOutput extends BaseParseOutput {\n  key: ParseTokenOutput | null;\n  value?: ParseValueOutput;\n}\nexport type ParseValueOutput =\n  | ParseTokenOutput\n  | ParseObjectOutput\n  | ParseArrayOutput\n  | undefined;\n\nfunction parseObj(): ParseObjectOutput {\n  const nodeStart = start;\n  const members = [];\n  expect('{');\n  if (!skip('}')) {\n    do {\n      members.push(parseMember());\n    } while (skip(','));\n    expect('}');\n  }\n  return {\n    kind: 'Object',\n    start: nodeStart,\n    end: lastEnd,\n    members,\n  };\n}\n\nfunction parseMember(): ParseMemberOutput {\n  const nodeStart = start;\n  const key = kind === 'String' ? curToken() : null;\n  expect('String');\n  expect(':');\n  const value = parseVal();\n  return {\n    kind: 'Member',\n    start: nodeStart,\n    end: lastEnd,\n    key,\n    value,\n  };\n}\n\nfunction parseArr(): ParseArrayOutput {\n  const nodeStart = start;\n  const values = [];\n  expect('[');\n  if (!skip(']')) {\n    do {\n      values.push(parseVal());\n    } while (skip(','));\n    expect(']');\n  }\n  return {\n    kind: 'Array',\n    start: nodeStart,\n    end: lastEnd,\n    values,\n  };\n}\n\nfunction parseVal(): ParseValueOutput | undefined {\n  switch (kind) {\n    case '[':\n      return parseArr();\n    case '{':\n      return parseObj();\n    case 'String':\n    case 'Number':\n    case 'Boolean':\n    case 'Null':\n      const token = curToken();\n      lex();\n      return token;\n  }\n  expect('Value');\n}\n\nfunction curToken(): ParseTokenOutput {\n  return { kind, start, end, value: JSON.parse(string.slice(start, end)) };\n}\n\nfunction expect(str: string) {\n  if (kind === str) {\n    lex();\n    return;\n  }\n\n  let found;\n  if (kind === 'EOF') {\n    found = '[end of file]';\n  } else if (end - start > 1) {\n    found = '`' + string.slice(start, end) + '`';\n  } else {\n    const match = string.slice(start).match(/^.+?\\b/);\n    found = '`' + (match ? match[0] : string[start]) + '`';\n  }\n\n  throw syntaxError(`Expected ${str} but found ${found}.`);\n}\n\ntype SyntaxErrorPosition = { start: number; end: number };\n\nexport class JSONSyntaxError extends Error {\n  readonly position: SyntaxErrorPosition;\n  constructor(message: string, position: SyntaxErrorPosition) {\n    super(message);\n    this.position = position;\n  }\n}\n\nfunction syntaxError(message: string) {\n  return new JSONSyntaxError(message, { start, end });\n}\n\nfunction skip(k: string) {\n  if (kind === k) {\n    lex();\n    return true;\n  }\n}\n\nfunction ch() {\n  if (end < strLen) {\n    end++;\n    code = end === strLen ? 0 : string.charCodeAt(end);\n  }\n  return code;\n}\n\nfunction lex() {\n  lastEnd = end;\n\n  while (code === 9 || code === 10 || code === 13 || code === 32) {\n    ch();\n  }\n\n  if (code === 0) {\n    kind = 'EOF';\n    return;\n  }\n\n  start = end;\n\n  switch (code) {\n    // \"\n    case 34:\n      kind = 'String';\n      return readString();\n    // -, 0-9\n    case 45:\n    case 48:\n    case 49:\n    case 50:\n    case 51:\n    case 52:\n    case 53:\n    case 54:\n    case 55:\n    case 56:\n    case 57:\n      kind = 'Number';\n      return readNumber();\n    // f\n    case 102:\n      if (string.slice(start, start + 5) !== 'false') {\n        break;\n      }\n      end += 4;\n      ch();\n\n      kind = 'Boolean';\n      return;\n    // n\n    case 110:\n      if (string.slice(start, start + 4) !== 'null') {\n        break;\n      }\n      end += 3;\n      ch();\n\n      kind = 'Null';\n      return;\n    // t\n    case 116:\n      if (string.slice(start, start + 4) !== 'true') {\n        break;\n      }\n      end += 3;\n      ch();\n\n      kind = 'Boolean';\n      return;\n  }\n\n  kind = string[start];\n  ch();\n}\n\nfunction readString() {\n  ch();\n  while (code !== 34 && code > 31) {\n    if (code === 92) {\n      // \\\n      code = ch();\n      switch (code) {\n        case 34: // \"\n        case 47: // /\n        case 92: // \\\n        case 98: // b\n        case 102: // f\n        case 110: // n\n        case 114: // r\n        case 116: // t\n          ch();\n          break;\n        case 117: // u\n          ch();\n          readHex();\n          readHex();\n          readHex();\n          readHex();\n          break;\n        default:\n          throw syntaxError('Bad character escape sequence.');\n      }\n    } else if (end === strLen) {\n      throw syntaxError('Unterminated string.');\n    } else {\n      ch();\n    }\n  }\n\n  if (code === 34) {\n    ch();\n    return;\n  }\n\n  throw syntaxError('Unterminated string.');\n}\n\nfunction readHex() {\n  if (\n    (code >= 48 && code <= 57) || // 0-9\n    (code >= 65 && code <= 70) || // A-F\n    (code >= 97 && code <= 102) // a-f\n  ) {\n    return ch();\n  }\n  throw syntaxError('Expected hexadecimal digit.');\n}\n\nfunction readNumber() {\n  if (code === 45) {\n    // -\n    ch();\n  }\n\n  if (code === 48) {\n    // 0\n    ch();\n  } else {\n    readDigits();\n  }\n\n  if (code === 46) {\n    // .\n    ch();\n    readDigits();\n  }\n\n  if (code === 69 || code === 101) {\n    // E e\n    code = ch();\n    if (code === 43 || code === 45) {\n      // + -\n      ch();\n    }\n    readDigits();\n  }\n}\n\nfunction readDigits() {\n  if (code < 48 || code > 57) {\n    // 0 - 9\n    throw syntaxError('Expected decimal digit.');\n  }\n  do {\n    ch();\n  } while (code >= 48 && code <= 57); // 0 - 9\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/jump-addon.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport { GraphQLJumpOptions } from '../jump';\n\nCodeMirror.defineOption(\n  'jump',\n  false,\n  (\n    cm: CodeMirror.Editor,\n    options: GraphQLJumpOptions,\n    old?: GraphQLJumpOptions,\n  ) => {\n    if (old && old !== CodeMirror.Init) {\n      const oldOnMouseOver = cm.state.jump.onMouseOver;\n      CodeMirror.off(cm.getWrapperElement(), 'mouseover', oldOnMouseOver);\n      const oldOnMouseOut = cm.state.jump.onMouseOut;\n      CodeMirror.off(cm.getWrapperElement(), 'mouseout', oldOnMouseOut);\n      CodeMirror.off(document, 'keydown', cm.state.jump.onKeyDown);\n      delete cm.state.jump;\n    }\n\n    if (options) {\n      const state = (cm.state.jump = {\n        options,\n        onMouseOver: onMouseOver.bind(null, cm),\n        onMouseOut: onMouseOut.bind(null, cm),\n        onKeyDown: onKeyDown.bind(null, cm),\n      });\n\n      CodeMirror.on(cm.getWrapperElement(), 'mouseover', state.onMouseOver);\n      CodeMirror.on(cm.getWrapperElement(), 'mouseout', state.onMouseOut);\n      CodeMirror.on(document, 'keydown', state.onKeyDown);\n    }\n  },\n);\n\nfunction onMouseOver(cm: CodeMirror.Editor, event: MouseEvent) {\n  const target = event.target || event.srcElement;\n  if (!(target instanceof HTMLElement)) {\n    return;\n  }\n  if (target?.nodeName !== 'SPAN') {\n    return;\n  }\n\n  const box = target.getBoundingClientRect();\n  const cursor = {\n    left: (box.left + box.right) / 2,\n    top: (box.top + box.bottom) / 2,\n  };\n\n  cm.state.jump.cursor = cursor;\n\n  if (cm.state.jump.isHoldingModifier) {\n    enableJumpMode(cm);\n  }\n}\n\nfunction onMouseOut(cm: CodeMirror.Editor) {\n  if (!cm.state.jump.isHoldingModifier && cm.state.jump.cursor) {\n    cm.state.jump.cursor = null;\n    return;\n  }\n\n  if (cm.state.jump.isHoldingModifier && cm.state.jump.marker) {\n    disableJumpMode(cm);\n  }\n}\n\nfunction onKeyDown(cm: CodeMirror.Editor, event: KeyboardEvent) {\n  if (cm.state.jump.isHoldingModifier || !isJumpModifier(event.key)) {\n    return;\n  }\n\n  cm.state.jump.isHoldingModifier = true;\n\n  if (cm.state.jump.cursor) {\n    enableJumpMode(cm);\n  }\n\n  const onKeyUp = (upEvent: KeyboardEvent) => {\n    if (upEvent.code !== event.code) {\n      return;\n    }\n\n    cm.state.jump.isHoldingModifier = false;\n\n    if (cm.state.jump.marker) {\n      disableJumpMode(cm);\n    }\n\n    CodeMirror.off(document, 'keyup', onKeyUp);\n    CodeMirror.off(document, 'click', onClick);\n    cm.off('mousedown', onMouseDown);\n  };\n\n  const onClick = (clickEvent: MouseEvent) => {\n    const { destination, options } = cm.state.jump;\n    if (destination) {\n      options.onClick(destination, clickEvent);\n    }\n  };\n\n  const onMouseDown = (_: any, downEvent: MouseEvent) => {\n    if (cm.state.jump.destination) {\n      (downEvent as any).codemirrorIgnore = true;\n    }\n  };\n\n  CodeMirror.on(document, 'keyup', onKeyUp);\n  CodeMirror.on(document, 'click', onClick);\n  cm.on('mousedown', onMouseDown);\n}\n\nconst isMac =\n  typeof navigator !== 'undefined' && navigator.userAgent.includes('Mac');\n\nfunction isJumpModifier(key: string) {\n  return key === (isMac ? 'Meta' : 'Control');\n}\n\nfunction enableJumpMode(cm: CodeMirror.Editor) {\n  if (cm.state.jump.marker) {\n    return;\n  }\n\n  const { cursor, options } = cm.state.jump;\n  const pos = cm.coordsChar(cursor);\n  const token = cm.getTokenAt(pos, true);\n  const getDestination = options.getDestination || cm.getHelper(pos, 'jump');\n  if (getDestination) {\n    const destination = getDestination(token, options, cm);\n    if (destination) {\n      const marker = cm.markText(\n        { line: pos.line, ch: token.start },\n        { line: pos.line, ch: token.end },\n        { className: 'CodeMirror-jump-token' },\n      );\n\n      cm.state.jump.marker = marker;\n      cm.state.jump.destination = destination;\n    }\n  }\n}\n\nfunction disableJumpMode(cm: CodeMirror.Editor) {\n  const { marker } = cm.state.jump;\n  cm.state.jump.marker = null;\n  cm.state.jump.destination = null;\n\n  marker.clear();\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/mode-factory.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport {\n  LexRules,\n  ParseRules,\n  isIgnored,\n  onlineParser,\n} from 'graphql-language-service';\nimport indent from './mode-indent';\n\n/**\n * The GraphQL mode is defined as a tokenizer along with a list of rules, each\n * of which is either a function or an array.\n *\n *   * Function: Provided a token and the stream, returns an expected next step.\n *   * Array: A list of steps to take in order.\n *\n * A step is either another rule, or a terminal description of a token. If it\n * is a rule, that rule is pushed onto the stack and the parsing continues from\n * that point.\n *\n * If it is a terminal description, the token is checked against it using a\n * `match` function. If the match is successful, the token is colored and the\n * rule is stepped forward. If the match is unsuccessful, the remainder of the\n * rule is skipped and the previous rule is advanced.\n *\n * This parsing algorithm allows for incremental online parsing within various\n * levels of the syntax tree and results in a structured `state` linked-list\n * which contains the relevant information to produce valuable typeahead.\n */\nconst graphqlModeFactory: CodeMirror.ModeFactory<any> = config => {\n  const parser = onlineParser({\n    eatWhitespace: stream => stream.eatWhile(isIgnored),\n    lexRules: LexRules,\n    parseRules: ParseRules,\n    editorConfig: { tabSize: config.tabSize },\n  });\n\n  return {\n    config,\n    startState: parser.startState,\n    token: parser.token as unknown as NonNullable<\n      CodeMirror.Mode<any>['token']\n    >, // TODO: Check if the types are indeed compatible\n    indent,\n    electricInput: /^\\s*[})\\]]/,\n    fold: 'brace',\n    lineComment: '#',\n    closeBrackets: {\n      pairs: '()[]{}\"\"',\n      explode: '()[]{}',\n    },\n  };\n};\n\nexport default graphqlModeFactory;\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/mode-indent.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport { State } from 'graphql-language-service';\n\n// Seems the electricInput type in @types/codemirror is wrong (i.e it is written all lowercase)\nexport default function indent(\n  this: CodeMirror.Mode<any> & {\n    electricInput?: RegExp;\n    config?: CodeMirror.EditorConfiguration;\n  },\n  state: State,\n  textAfter: string,\n) {\n  const { levels, indentLevel } = state;\n  // If there is no stack of levels, use the current level.\n  // Otherwise, use the top level, preemptively dedenting for close braces.\n  const level =\n    !levels || levels.length === 0\n      ? indentLevel\n      : levels.at(-1)! - (this.electricInput?.test(textAfter) ? 1 : 0);\n  return (level || 0) * (this.config?.indentUnit || 0);\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/utils/runParser.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport {\n  CharacterStream,\n  onlineParser,\n  ParserOptions,\n  State,\n} from 'graphql-language-service';\n\nexport default function runParser(\n  sourceText: string,\n  parserOptions: ParserOptions,\n  callbackFn: (stream: CharacterStream, state: State, style: string) => void,\n) {\n  const parser = onlineParser(parserOptions);\n  const state = parser.startState();\n  const lines = sourceText.split('\\n');\n\n  for (const line of lines) {\n    const stream = new CharacterStream(line);\n    while (!stream.eol()) {\n      const style = parser.token(stream, state);\n      callbackFn(stream, state, style);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/variables/__tests__/hint.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/hint/show-hint';\nimport { GraphQLEnumType, GraphQLInputObjectType, parse } from 'graphql';\nimport { IHint, IHints } from '../../hint';\nimport collectVariables from '../../utils/collectVariables';\nimport { TestSchema } from '../../__tests__/testSchema';\nimport '../hint';\nimport '../mode';\n\nfunction createEditorWithHint(query: string) {\n  return CodeMirror(document.createElement('div'), {\n    mode: 'graphql-variables',\n    hintOptions: {\n      variableToType: query && collectVariables(TestSchema, parse(query)),\n      closeOnUnfocus: false,\n      completeSingle: false,\n    },\n  });\n}\n\nfunction getHintSuggestions(\n  query: string,\n  variables: string,\n  cursor: CodeMirror.Position,\n) {\n  const editor = createEditorWithHint(query);\n  return new Promise<IHints | undefined>(resolve => {\n    const graphqlVariablesHint = CodeMirror.hint['graphql-variables'];\n    CodeMirror.hint['graphql-variables'] = (cm, options) => {\n      const result = graphqlVariablesHint(cm, options);\n      resolve(result);\n      CodeMirror.hint['graphql-variables'] = graphqlVariablesHint;\n      return result;\n    };\n\n    editor.doc.setValue(variables);\n    editor.doc.setCursor(cursor);\n    editor.execCommand('autocomplete');\n  });\n}\n\nfunction expectSuggestions(source: string[], suggestions?: IHint[]) {\n  const titles = suggestions?.map(suggestion => suggestion.text);\n  expect(titles).toEqual(source);\n}\n\ndescribe('graphql-variables-hint', () => {\n  it('attaches a GraphQL hint function with correct mode/hint options', () => {\n    const editor = createEditorWithHint('{ f }');\n    expect(editor.getHelpers(editor.getCursor(), 'hint')).not.toHaveLength(0);\n  });\n\n  it('provides correct initial token', async () => {\n    const suggestions = await getHintSuggestions('', '', { line: 0, ch: 0 });\n    const initialKeywords = ['{'];\n    expectSuggestions(initialKeywords, suggestions?.list);\n  });\n\n  it('provides correct field name suggestions', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($foo: String!, $bar: Int) { f }',\n      '{ ',\n      { line: 0, ch: 2 },\n    );\n    expectSuggestions(['\"foo\": ', '\"bar\": '], suggestions?.list);\n  });\n\n  it('provides correct variable suggestion indentation', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($foo: String!, $bar: Int) { f }',\n      '{\\n  ',\n      { line: 1, ch: 2 },\n    );\n    expect(suggestions?.from).toEqual({ line: 1, ch: 2, sticky: null });\n    expect(suggestions?.to).toEqual({ line: 1, ch: 2, sticky: null });\n  });\n\n  it('provides correct variable completion', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($foo: String!, $bar: Int) { f }',\n      '{\\n  ba',\n      { line: 1, ch: 4 },\n    );\n    expectSuggestions(['\"bar\": '], suggestions?.list);\n    expect(suggestions?.from).toEqual({ line: 1, ch: 2, sticky: null });\n    expect(suggestions?.to).toEqual({ line: 1, ch: 4, sticky: null });\n  });\n\n  it('provides correct variable completion with open quote', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($foo: String!, $bar: Int) { f }',\n      '{\\n  \"',\n      { line: 1, ch: 4 },\n    );\n    expectSuggestions(['\"foo\": ', '\"bar\": '], suggestions?.list);\n    expect(suggestions?.from).toEqual({ line: 1, ch: 2, sticky: null });\n    expect(suggestions?.to).toEqual({ line: 1, ch: 3, sticky: null });\n  });\n\n  it('provides correct Enum suggestions', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($myEnum: TestEnum) { f }',\n      '{\\n  \"myEnum\": ',\n      { line: 1, ch: 12 },\n    );\n    const TestEnum = TestSchema.getType('TestEnum');\n    expectSuggestions(\n      (TestEnum as GraphQLEnumType)\n        ?.getValues()\n        .map(value => `\"${value.name}\"`),\n      suggestions?.list,\n    );\n  });\n\n  it('suggests to open an Input Object', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($myInput: TestInput) { f }',\n      '{\\n  \"myInput\": ',\n      { line: 1, ch: 13 },\n    );\n    expectSuggestions(['{'], suggestions?.list);\n  });\n\n  it('provides Input Object fields', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($myInput: TestInput) { f }',\n      '{\\n  \"myInput\": {\\n    ',\n      { line: 2, ch: 4 },\n    );\n    const TestInput = TestSchema.getType('TestInput');\n    expectSuggestions(\n      Object.keys((TestInput as GraphQLInputObjectType).getFields()).map(\n        name => `\"${name}\": `,\n      ),\n      suggestions?.list,\n    );\n    expect(suggestions?.from).toEqual({ line: 2, ch: 4, sticky: null });\n    expect(suggestions?.to).toEqual({ line: 2, ch: 4, sticky: null });\n  });\n\n  it('provides correct Input Object field completion', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($myInput: TestInput) { f }',\n      '{\\n  \"myInput\": {\\n    bool',\n      { line: 2, ch: 8 },\n    );\n    expectSuggestions(['\"boolean\": ', '\"listBoolean\": '], suggestions?.list);\n    expect(suggestions?.from).toEqual({ line: 2, ch: 4, sticky: null });\n    expect(suggestions?.to).toEqual({ line: 2, ch: 8, sticky: null });\n  });\n\n  it('provides correct Input Object field value completion', async () => {\n    const suggestions = await getHintSuggestions(\n      'query ($myInput: TestInput) { f }',\n      '{\\n  \"myInput\": {\\n    \"boolean\": ',\n      { line: 2, ch: 15 },\n    );\n    expectSuggestions(['true', 'false'], suggestions?.list);\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/variables/__tests__/lint.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/lint/lint';\nimport { parse } from 'graphql';\nimport { Maybe } from 'graphql-language-service';\nimport collectVariables from '../../utils/collectVariables';\nimport { TestSchema } from '../../__tests__/testSchema';\nimport '../lint';\nimport '../mode';\n\nfunction createEditorWithLint(lintConfig?: any) {\n  return CodeMirror(document.createElement('div'), {\n    mode: 'graphql-variables',\n    lint: lintConfig || true,\n  });\n}\n\nfunction printLintErrors(query: Maybe<string>, variables: string) {\n  const editor = createEditorWithLint({\n    variableToType: query && collectVariables(TestSchema, parse(query)),\n  });\n\n  return new Promise<CodeMirror.Annotation[]>(resolve => {\n    editor.state.lint.options.onUpdateLinting = (\n      errors: CodeMirror.Annotation[],\n    ) => {\n      if (errors?.[0] && !errors[0].message?.match('Unexpected EOF')) {\n        resolve(errors);\n        return;\n      }\n      resolve([]);\n    };\n    editor.doc.setValue(variables);\n  });\n}\n\ndescribe('graphql-variables-lint', () => {\n  it('attaches a GraphQL lint function with correct mode/lint options', () => {\n    const editor = createEditorWithLint();\n    expect(editor.getHelpers(editor.getCursor(), 'lint')).not.toHaveLength(0);\n  });\n\n  it('catches syntax errors', async () => {\n    expect((await printLintErrors(null, '{ foo: \"bar\" }'))[0].message).toBe(\n      'Expected String but found `foo`.',\n    );\n  });\n\n  it('catches type validation errors', async () => {\n    const errors = await printLintErrors(\n      'query ($foo: Int) { f }',\n      ' { \"foo\": \"NaN\" }',\n    );\n\n    expect(errors[0]).toEqual({\n      message: 'Expected value of type \"Int\".',\n      severity: 'error',\n      type: 'validation',\n      from: { line: 0, ch: 10, sticky: null },\n      to: { line: 0, ch: 15, sticky: null },\n    });\n  });\n\n  it('reports unknown variable names', async () => {\n    const errors = await printLintErrors(\n      'query ($foo: Int) { f }',\n      ' { \"food\": \"NaN\" }',\n    );\n\n    expect(errors[0]).toEqual({\n      message: 'Variable \"$food\" does not appear in any GraphQL query.',\n      severity: 'error',\n      type: 'validation',\n      from: { line: 0, ch: 3, sticky: null },\n      to: { line: 0, ch: 9, sticky: null },\n    });\n  });\n\n  it('reports nothing when not configured', async () => {\n    const errors = await printLintErrors(null, ' { \"foo\": \"NaN\" }');\n    expect(errors.length).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/variables/__tests__/mode.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport 'codemirror/addon/runmode/runmode';\nimport '../mode';\n\ndescribe('graphql-variables-mode', () => {\n  it('provides correct tokens and styles after parsing', () => {\n    const queryStr =\n      '{ \"variable\": { \"field\": \"value\" }, \"list\": [ 1, true, null ] }';\n    const tokens: [string, string][] = [];\n\n    CodeMirror.runMode(queryStr, 'graphql-variables', (token, style) => {\n      if (style && style !== 'ws') {\n        tokens.push([token, style]);\n      }\n    });\n\n    expect(tokens).toEqual([\n      ['{', 'punctuation'],\n      ['\"variable\"', 'variable'],\n      [':', 'punctuation'],\n      ['{', 'punctuation'],\n      ['\"field\"', 'attribute'],\n      [':', 'punctuation'],\n      ['\"value\"', 'string'],\n      ['}', 'punctuation'],\n      [',', 'punctuation'],\n      ['\"list\"', 'variable'],\n      [':', 'punctuation'],\n      ['[', 'punctuation'],\n      ['1', 'number'],\n      [',', 'punctuation'],\n      ['true', 'builtin'],\n      [',', 'punctuation'],\n      ['null', 'keyword'],\n      [']', 'punctuation'],\n      ['}', 'punctuation'],\n    ]);\n  });\n\n  it('is resilient to missing commas', () => {\n    const queryStr =\n      '{ \"variable\": { \"field\": \"value\" } \"list\": [ 1 true null ] }';\n    const tokens: [string, string][] = [];\n\n    CodeMirror.runMode(queryStr, 'graphql-variables', (token, style) => {\n      if (style && style !== 'ws') {\n        tokens.push([token, style]);\n      }\n    });\n\n    expect(tokens).toEqual([\n      ['{', 'punctuation'],\n      ['\"variable\"', 'variable'],\n      [':', 'punctuation'],\n      ['{', 'punctuation'],\n      ['\"field\"', 'attribute'],\n      [':', 'punctuation'],\n      ['\"value\"', 'string'],\n      ['}', 'punctuation'],\n      ['\"list\"', 'variable'],\n      [':', 'punctuation'],\n      ['[', 'punctuation'],\n      ['1', 'number'],\n      ['true', 'builtin'],\n      ['null', 'keyword'],\n      [']', 'punctuation'],\n      ['}', 'punctuation'],\n    ]);\n  });\n\n  it('returns \"invalidchar\" message when there is no matching token', () => {\n    CodeMirror.runMode('nope', 'graphql-variables', (token, style) => {\n      if (token.trim()) {\n        expect(style).toBe('invalidchar');\n      }\n    });\n\n    CodeMirror.runMode('{ foo', 'graphql-variables', (token, style) => {\n      if (token === 'foo') {\n        expect(style).toBe('invalidchar');\n      }\n    });\n  });\n});\n"
  },
  {
    "path": "packages/codemirror-graphql/src/variables/hint.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror, { Hints } from 'codemirror';\nimport {\n  getNullableType,\n  getNamedType,\n  GraphQLEnumType,\n  GraphQLInputObjectType,\n  GraphQLList,\n  GraphQLBoolean,\n  GraphQLInputType,\n  GraphQLInputFieldMap,\n} from 'graphql';\nimport type { State, Maybe } from 'graphql-language-service';\nimport { IHints } from '../hint';\n\nimport forEachState from '../utils/forEachState';\nimport hintList from '../utils/hintList';\n\nexport type VariableToType = Record<string, GraphQLInputType>;\ninterface GraphQLVariableHintOptions {\n  variableToType: VariableToType;\n}\n\ndeclare module 'codemirror' {\n  interface ShowHintOptions {\n    variableToType?: VariableToType;\n  }\n\n  interface CodeMirrorHintMap {\n    'graphql-variables': (\n      editor: CodeMirror.Editor,\n      options: GraphQLVariableHintOptions,\n    ) => IHints | undefined;\n  }\n}\n\n/**\n * Registers a \"hint\" helper for CodeMirror.\n *\n * Using CodeMirror's \"hint\" addon: https://codemirror.net/demo/complete.html\n * Given an editor, this helper will take the token at the cursor and return a\n * list of suggested tokens.\n *\n * Options:\n *\n *   - variableToType: { [variable: string]: GraphQLInputType }\n *\n * Additional Events:\n *\n *   - hasCompletion (codemirror, data, token) - signaled when the hinter has a\n *     new list of completion suggestions.\n *\n */\nCodeMirror.registerHelper(\n  'hint',\n  'graphql-variables',\n  (\n    editor: CodeMirror.Editor,\n    options: GraphQLVariableHintOptions,\n  ): Hints | undefined => {\n    const cur = editor.getCursor();\n    const token = editor.getTokenAt(cur);\n\n    const results = getVariablesHint(cur, token, options);\n    if (results?.list && results.list.length > 0) {\n      results.from = CodeMirror.Pos(results.from.line, results.from.ch);\n      results.to = CodeMirror.Pos(results.to.line, results.to.ch);\n      CodeMirror.signal(editor, 'hasCompletion', editor, results, token);\n    }\n\n    return results;\n  },\n);\n\nfunction getVariablesHint(\n  cur: CodeMirror.Position,\n  token: CodeMirror.Token,\n  options: GraphQLVariableHintOptions,\n) {\n  // If currently parsing an invalid state, attempt to hint to the prior state.\n  const state =\n    token.state.kind === 'Invalid' ? token.state.prevState : token.state;\n\n  const { kind, step } = state;\n  // Variables can only be an object literal.\n  if (kind === 'Document' && step === 0) {\n    return hintList(cur, token, [{ text: '{' }]);\n  }\n\n  const { variableToType } = options;\n  if (!variableToType) {\n    return;\n  }\n\n  const typeInfo = getTypeInfo(variableToType, token.state);\n\n  // Top level should typeahead possible variables.\n  if (kind === 'Document' || (kind === 'Variable' && step === 0)) {\n    const variableNames = Object.keys(variableToType);\n    return hintList(\n      cur,\n      token,\n      variableNames.map(name => ({\n        text: `\"${name}\": `,\n        type: variableToType[name],\n      })),\n    );\n  }\n\n  // Input Object fields\n  if (\n    (kind === 'ObjectValue' || (kind === 'ObjectField' && step === 0)) &&\n    typeInfo.fields\n  ) {\n    const inputFields = Object.keys(typeInfo.fields).map(\n      fieldName => typeInfo.fields![fieldName],\n    );\n    return hintList(\n      cur,\n      token,\n      inputFields.map(field => ({\n        text: `\"${field.name}\": `,\n        type: field.type,\n        description: field.description,\n      })),\n    );\n  }\n\n  // Input values.\n  if (\n    kind === 'StringValue' ||\n    kind === 'NumberValue' ||\n    kind === 'BooleanValue' ||\n    kind === 'NullValue' ||\n    (kind === 'ListValue' && step === 1) ||\n    (kind === 'ObjectField' && step === 2) ||\n    (kind === 'Variable' && step === 2)\n  ) {\n    const namedInputType = typeInfo.type\n      ? getNamedType(typeInfo.type)\n      : undefined;\n    if (namedInputType instanceof GraphQLInputObjectType) {\n      return hintList(cur, token, [{ text: '{' }]);\n    }\n    if (namedInputType instanceof GraphQLEnumType) {\n      const values = namedInputType.getValues();\n      // const values = Object.keys(valueMap).map(name => valueMap[name]); // TODO: Previously added\n      return hintList(\n        cur,\n        token,\n        values.map(value => ({\n          text: `\"${value.name}\"`,\n          type: namedInputType,\n          description: value.description,\n        })),\n      );\n    }\n    if (namedInputType === GraphQLBoolean) {\n      return hintList(cur, token, [\n        { text: 'true', type: GraphQLBoolean, description: 'Not false.' }, // TODO: type and description don't seem to be used. Added them as optional anyway.\n        { text: 'false', type: GraphQLBoolean, description: 'Not true.' },\n      ]);\n    }\n  }\n}\n\ninterface VariableTypeInfo {\n  type?: Maybe<GraphQLInputType>;\n  fields?: Maybe<GraphQLInputFieldMap>;\n}\n\n// Utility for collecting rich type information given any token's state\n// from the graphql-variables-mode parser.\nfunction getTypeInfo(\n  variableToType: Record<string, GraphQLInputType>,\n  tokenState: State,\n) {\n  const info: VariableTypeInfo = {\n    type: null,\n    fields: null,\n  };\n\n  forEachState(tokenState, state => {\n    switch (state.kind) {\n      case 'Variable': {\n        info.type = variableToType[state.name!];\n        break;\n      }\n      case 'ListValue': {\n        const nullableType = info.type ? getNullableType(info.type) : undefined;\n        info.type =\n          nullableType instanceof GraphQLList ? nullableType.ofType : null;\n        break;\n      }\n      case 'ObjectValue': {\n        const objectType = info.type ? getNamedType(info.type) : undefined;\n        info.fields =\n          objectType instanceof GraphQLInputObjectType\n            ? objectType.getFields()\n            : null;\n        break;\n      }\n      case 'ObjectField': {\n        const objectField =\n          state.name && info.fields ? info.fields[state.name] : null;\n        info.type = objectField?.type;\n        break;\n      }\n    }\n  });\n\n  return info;\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/variables/lint.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\nimport {\n  GraphQLEnumType,\n  GraphQLInputObjectType,\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLScalarType,\n  GraphQLType,\n} from 'graphql';\n\nimport jsonParse, {\n  JSONSyntaxError,\n  ParseArrayOutput,\n  ParseObjectOutput,\n  ParseValueOutput,\n} from '../utils/jsonParse';\nimport { VariableToType } from './hint';\n\ninterface GraphQLVariableLintOptions {\n  variableToType: VariableToType;\n}\n\n/**\n * Registers a \"lint\" helper for CodeMirror.\n *\n * Using CodeMirror's \"lint\" addon: https://codemirror.net/demo/lint.html\n * Given the text within an editor, this helper will take that text and return\n * a list of linter issues ensuring that correct variables were provided.\n *\n * Options:\n *\n *   - variableToType: { [variable: string]: GraphQLInputType }\n *\n */\nCodeMirror.registerHelper(\n  'lint',\n  'graphql-variables',\n  (\n    text: string,\n    options: GraphQLVariableLintOptions,\n    editor: CodeMirror.Editor,\n  ) => {\n    // If there's no text, do nothing.\n    if (!text) {\n      return [];\n    }\n\n    // First, linter needs to determine if there are any parsing errors.\n    let ast;\n    try {\n      ast = jsonParse(text);\n    } catch (error) {\n      if (error instanceof JSONSyntaxError) {\n        return [lintError(editor, error.position, error.message)];\n      }\n      throw error;\n    }\n\n    // If there are not yet known variables, do nothing.\n    const { variableToType } = options;\n    if (!variableToType) {\n      return [];\n    }\n\n    // Then highlight any issues with the provided variables.\n    return validateVariables(editor, variableToType, ast);\n  },\n);\n\n// Given a variableToType object, a source text, and a JSON AST, produces a\n// list of CodeMirror annotations for any variable validation errors.\nfunction validateVariables(\n  editor: CodeMirror.Editor,\n  variableToType: VariableToType,\n  variablesAST: ParseObjectOutput,\n) {\n  const errors: CodeMirror.Annotation[] = [];\n\n  for (const member of variablesAST.members) {\n    if (member) {\n      const variableName = member.key?.value;\n      const type = variableToType[variableName];\n      if (type) {\n        for (const [node, message] of validateValue(type, member.value)) {\n          errors.push(lintError(editor, node, message));\n        }\n      } else {\n        errors.push(\n          lintError(\n            editor,\n            member.key!,\n            `Variable \"$${variableName}\" does not appear in any GraphQL query.`,\n          ),\n        );\n      }\n    }\n  }\n\n  return errors;\n}\n\n// Returns a list of validation errors in the form Array<[Node, String]>.\nfunction validateValue(\n  type?: GraphQLType,\n  valueAST?: ParseValueOutput,\n): any[][] {\n  // TODO: Can't figure out the right type.\n  if (!type || !valueAST) {\n    return [];\n  }\n\n  // Validate non-nullable values.\n  if (type instanceof GraphQLNonNull) {\n    if (valueAST.kind === 'Null') {\n      return [[valueAST, `Type \"${type}\" is non-nullable and cannot be null.`]];\n    }\n    return validateValue(type.ofType, valueAST);\n  }\n\n  if (valueAST.kind === 'Null') {\n    return [];\n  }\n\n  // Validate lists of values, accepting a non-list as a list of one.\n  if (type instanceof GraphQLList) {\n    const itemType = type.ofType;\n    if (valueAST.kind === 'Array') {\n      const values = (valueAST as ParseArrayOutput).values || [];\n      return mapCat(values, item => validateValue(itemType, item));\n    }\n    return validateValue(itemType, valueAST);\n  }\n\n  // Validate input objects.\n  if (type instanceof GraphQLInputObjectType) {\n    if (valueAST.kind !== 'Object') {\n      return [[valueAST, `Type \"${type}\" must be an Object.`]];\n    }\n\n    // Validate each field in the input object.\n    const providedFields = Object.create(null);\n    const fieldErrors: any[][] = mapCat(\n      (valueAST as ParseObjectOutput).members,\n      member => {\n        // TODO: Can't figure out the right type here\n        const fieldName = member?.key?.value;\n        providedFields[fieldName] = true;\n        const inputField = type.getFields()[fieldName];\n        if (!inputField) {\n          return [\n            [\n              member.key,\n              `Type \"${type}\" does not have a field \"${fieldName}\".`,\n            ],\n          ];\n        }\n        const fieldType = inputField ? inputField.type : undefined;\n        return validateValue(fieldType, member.value);\n      },\n    );\n\n    // Look for missing non-nullable fields.\n    for (const fieldName of Object.keys(type.getFields())) {\n      const field = type.getFields()[fieldName];\n      if (\n        !providedFields[fieldName] &&\n        field.type instanceof GraphQLNonNull &&\n        !field.defaultValue\n      ) {\n        fieldErrors.push([\n          valueAST,\n          `Object of type \"${type}\" is missing required field \"${fieldName}\".`,\n        ]);\n      }\n    }\n\n    return fieldErrors;\n  }\n\n  // Validate common scalars.\n  if (\n    (type.name === 'Boolean' && valueAST.kind !== 'Boolean') ||\n    (type.name === 'String' && valueAST.kind !== 'String') ||\n    (type.name === 'ID' &&\n      valueAST.kind !== 'Number' &&\n      valueAST.kind !== 'String') ||\n    (type.name === 'Float' && valueAST.kind !== 'Number') ||\n    (type.name === 'Int' &&\n      // eslint-disable-next-line no-bitwise\n      (valueAST.kind !== 'Number' || (valueAST.value | 0) !== valueAST.value))\n  ) {\n    return [[valueAST, `Expected value of type \"${type}\".`]];\n  }\n\n  // Validate enums and custom scalars.\n  if (\n    (type instanceof GraphQLEnumType || type instanceof GraphQLScalarType) &&\n    ((valueAST.kind !== 'String' &&\n      valueAST.kind !== 'Number' &&\n      valueAST.kind !== 'Boolean' &&\n      valueAST.kind !== 'Null') ||\n      isNullish(type.parseValue(valueAST.value)))\n  ) {\n    return [[valueAST, `Expected value of type \"${type}\".`]];\n  }\n\n  return [];\n}\n\n// Give a parent text, an AST node with location, and a message, produces a\n// CodeMirror annotation object.\nfunction lintError(\n  editor: CodeMirror.Editor,\n  node: { start: number; end: number },\n  message: string,\n): CodeMirror.Annotation & { type: string } {\n  return {\n    message,\n    severity: 'error',\n    type: 'validation',\n    from: editor.posFromIndex(node.start),\n    to: editor.posFromIndex(node.end),\n  };\n}\n\nfunction isNullish(value: any): boolean {\n  // eslint-disable-next-line no-self-compare\n  return value === null || value === undefined || value !== value;\n}\n\nfunction mapCat<T, R>(array: T[], mapper: (item: T) => R[]): R[] {\n  return Array.prototype.concat.apply([], array.map(mapper));\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/src/variables/mode.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the BSD-style license found in the\n *  LICENSE file in the root directory of this source tree. An additional grant\n *  of patent rights can be found in the PATENTS file in the same directory.\n */\n\nimport CodeMirror from 'codemirror';\n\nimport {\n  list,\n  t,\n  onlineParser,\n  opt,\n  p,\n  State,\n  Token,\n} from 'graphql-language-service';\nimport indent from '../utils/mode-indent';\n\n/**\n * This mode defines JSON, but provides a data-laden parser state to enable\n * better code intelligence.\n */\nCodeMirror.defineMode('graphql-variables', config => {\n  const parser = onlineParser({\n    eatWhitespace: stream => stream.eatSpace(),\n    lexRules: LexRules,\n    parseRules: ParseRules,\n    editorConfig: { tabSize: config.tabSize },\n  });\n\n  return {\n    config,\n    startState: parser.startState,\n    token: parser.token as unknown as CodeMirror.Mode<any>['token'], // TODO: Check if the types are indeed compatible\n    indent,\n    electricInput: /^\\s*[}\\]]/,\n    fold: 'brace',\n    closeBrackets: {\n      pairs: '[]{}\"\"',\n      explode: '[]{}',\n    },\n  };\n});\n\n/**\n * The lexer rules. These are exactly as described by the spec.\n */\nconst LexRules = {\n  // All Punctuation used in JSON.\n  Punctuation: /^\\[|]|\\{|\\}|:|,/,\n\n  // JSON Number.\n  Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/,\n\n  // JSON String.\n  String: /^\"(?:[^\"\\\\]|\\\\(?:\"|\\/|\\\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*\"?/,\n\n  // JSON literal keywords.\n  Keyword: /^true|false|null/,\n};\n\n/**\n * The parser rules for JSON.\n */\nconst ParseRules = {\n  Document: [p('{'), list('Variable', opt(p(','))), p('}')],\n  Variable: [namedKey('variable'), p(':'), 'Value'],\n  Value(token: Token) {\n    switch (token.kind) {\n      case 'Number':\n        return 'NumberValue';\n      case 'String':\n        return 'StringValue';\n      case 'Punctuation':\n        switch (token.value) {\n          case '[':\n            return 'ListValue';\n          case '{':\n            return 'ObjectValue';\n        }\n        return null;\n      case 'Keyword':\n        switch (token.value) {\n          case 'true':\n          case 'false':\n            return 'BooleanValue';\n          case 'null':\n            return 'NullValue';\n        }\n        return null;\n    }\n  },\n  NumberValue: [t('Number', 'number')],\n  StringValue: [t('String', 'string')],\n  BooleanValue: [t('Keyword', 'builtin')],\n  NullValue: [t('Keyword', 'keyword')],\n  ListValue: [p('['), list('Value', opt(p(','))), p(']')],\n  ObjectValue: [p('{'), list('ObjectField', opt(p(','))), p('}')],\n  ObjectField: [namedKey('attribute'), p(':'), 'Value'],\n};\n\n// A namedKey Token which will decorate the state with a `name`\nfunction namedKey(style: string) {\n  return {\n    style,\n    match: (token: Token) => token.kind === 'String',\n    update(state: State, token: Token) {\n      state.name = token.value.slice(1, -1); // Remove quotes.\n    },\n  };\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/tsconfig.esm.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./esm\",\n    \"composite\": true,\n    \"jsx\": \"react\",\n    \"strictPropertyInitialization\": false,\n    \"baseUrl\": \".\"\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\n    \"**/__tests__/**\",\n    \"**/dist/**.*\",\n    \"**/*.spec.ts\",\n    \"**/*.spec.js\",\n    \"**/*-test.ts\",\n    \"**/*-test.js\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./\",\n    \"composite\": true,\n    \"jsx\": \"react\",\n    \"target\": \"es5\",\n    \"baseUrl\": \".\",\n    \"strictPropertyInitialization\": false\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\n    \"**/__tests__/**\",\n    \"**/dist/**.*\",\n    \"**/esm/**.*\",\n    \"**/*.spec.ts\",\n    \"**/*.spec.js\",\n    \"**/*-test.ts\",\n    \"**/*-test.js\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/codemirror-graphql/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\nexport default defineConfig({\n  test: {\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: ['./setup-files.ts'],\n    alias: {\n      // fixes Duplicate \"graphql\" modules cannot be used at the same time since different\n      graphql: require.resolve('graphql'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/graphiql/CHANGELOG.md",
    "content": "# Change Log\n\n## 5.2.2\n\n### Patch Changes\n\n- [#4133](https://github.com/graphql/graphiql/pull/4133) [`1bc6568`](https://github.com/graphql/graphiql/commit/1bc6568da947394c216342ae75fb509fdbf03390) Thanks [@dimaMachina](https://github.com/dimaMachina)! - to fix esm.sh example we should pin `monaco-editor` peer dependency to versions `≥ 0.20.0 and < 0.53`, since `monaco-editor@^0.53.0` isn't supported yet with `monaco-graphql`\n\n- Updated dependencies [[`1bc6568`](https://github.com/graphql/graphiql/commit/1bc6568da947394c216342ae75fb509fdbf03390)]:\n  - @graphiql/react@0.37.3\n\n## 5.2.1\n\n### Patch Changes\n\n- [#4124](https://github.com/graphql/graphiql/pull/4124) [`d77abe6`](https://github.com/graphql/graphiql/commit/d77abe647e700ef8949a16c3bccda648d5c6adae) Thanks [@dimaMachina](https://github.com/dimaMachina)! - pin `monaco-editor` to `0.52.2`\n\n- Updated dependencies [[`d77abe6`](https://github.com/graphql/graphiql/commit/d77abe647e700ef8949a16c3bccda648d5c6adae)]:\n  - @graphiql/react@0.37.2\n\n## 5.2.0\n\n### Minor Changes\n\n- [#4081](https://github.com/graphql/graphiql/pull/4081) [`4950dec`](https://github.com/graphql/graphiql/commit/4950decaddb816ef3e3d22d814d976d94405029e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat: add loader for initial loading of operation editor\n  fix: adjust command palette `width`, `border` and remove `box-shadow`\n  feat: add short cut `Cmd/Ctrl + ,` for opening GraphiQL settings dialog\n\n### Patch Changes\n\n- Updated dependencies [[`4950dec`](https://github.com/graphql/graphiql/commit/4950decaddb816ef3e3d22d814d976d94405029e)]:\n  - @graphiql/react@0.37.1\n\n## 5.1.1\n\n### Patch Changes\n\n- [#4078](https://github.com/graphql/graphiql/pull/4078) [`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix color in the F1 popup should be graphiql primary color and add deprecated exports for `useEditorStore`, `useExecutionStore`, `usePluginStore` and `useSchemaStore`\n\n- Updated dependencies [[`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf), [`293beed`](https://github.com/graphql/graphiql/commit/293beed772baa2be834cad5f19e1aee0628e15cc)]:\n  - @graphiql/react@0.37.0\n  - @graphiql/plugin-doc-explorer@0.4.1\n  - @graphiql/plugin-history@0.4.1\n\n## 5.1.0\n\n### Minor Changes\n\n- [#4071](https://github.com/graphql/graphiql/pull/4071) [`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(graphql-language-service): export `getContextAtPosition`\n  feat(graphiql): dynamically import `monaco-editor` and `monaco-graphql`\n\n  When using GraphiQL in Next.js app, you no longer need to use `next/dynamic`:\n\n  ```diff\n  -import dynamic from 'next/dynamic'\n  -const GraphiQL = dynamic(() => import('graphiql').then(mod => mod.GraphiQL), {\n  -  ssr: false\n  -})\n  +import { GraphiQL } from 'graphiql'\n  ```\n\n- [#4074](https://github.com/graphql/graphiql/pull/4074) [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Ensure `storage` and `theme` store values aren't shared between GraphiQL instances. Deprecate `useTheme` and `useStorage` hooks in favour of values from `useGraphiQL` and `useGraphiQLActions` hooks\n\n  feat(`@graphiql/plugin-history`/`@graphiql/plugin-doc-explorer`): move `@graphiql/react` to `peerDependencies`\n\n- [#4077](https://github.com/graphql/graphiql/pull/4077) [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add new example [Usage GraphiQL 5 with Vite, React Router and `ssr: true`](https://github.com/graphql/graphiql/tree/main/examples/example-graphiql-vite-react-router)\n\n### Patch Changes\n\n- [#4076](https://github.com/graphql/graphiql/pull/4076) [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix broken `useOperationsEditorState` and `useEditorState` hook and add unit tests\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd), [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198), [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14), [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b)]:\n  - @graphiql/react@0.36.0\n  - @graphiql/plugin-history@0.4.0\n  - @graphiql/plugin-doc-explorer@0.4.0\n\n## 5.0.6\n\n### Patch Changes\n\n- [#4069](https://github.com/graphql/graphiql/pull/4069) [`142f3f2`](https://github.com/graphql/graphiql/commit/142f3f2529c668aa1a6ba2f7269cf4b7e2fd3e61) Thanks [@dimaMachina](https://github.com/dimaMachina)! - reduce bundle size, import `prettier` dynamically to avoid bundling Prettier\n\n  diff from vite example\n\n  ```diff\n  -dist/assets/index-BMgFrxsd.js             4,911.53 kB │ gzip: 1,339.77 kB\n  +dist/assets/index-BlpzusGL.js             4,221.28 kB │ gzip: 1,145.58 kB\n  ```\n\n- Updated dependencies [[`142f3f2`](https://github.com/graphql/graphiql/commit/142f3f2529c668aa1a6ba2f7269cf4b7e2fd3e61)]:\n  - @graphiql/react@0.35.6\n\n## 5.0.5\n\n### Patch Changes\n\n- [#4065](https://github.com/graphql/graphiql/pull/4065) [`962225a`](https://github.com/graphql/graphiql/commit/962225ad74c8b69101f900c63243612560ddd501) Thanks [@benjie](https://github.com/benjie)! - Expose the `GraphiQLInterfaceProps` type.\n\n## 5.0.4\n\n### Patch Changes\n\n- [#4061](https://github.com/graphql/graphiql/pull/4061) [`8f14fff`](https://github.com/graphql/graphiql/commit/8f14fff26e0d804b5f4ecf307b7b29bb78664973) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add `graphiql.css`, CSS file without importing fonts and monaco-editor styles\n\n- [#4059](https://github.com/graphql/graphiql/pull/4059) [`a4382bf`](https://github.com/graphql/graphiql/commit/a4382bfae28efd6e03153cf8aa81f55db43de6ed) Thanks [@dimaMachina](https://github.com/dimaMachina)! - export `GraphiQLInterface`\n\n- [#4063](https://github.com/graphql/graphiql/pull/4063) [`44b18e4`](https://github.com/graphql/graphiql/commit/44b18e4ed054d757568b5cfedc43614fd7ea3fc9) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix `useOperationsEditorState` wasn't returned updated return value\n\n- Updated dependencies [[`44b18e4`](https://github.com/graphql/graphiql/commit/44b18e4ed054d757568b5cfedc43614fd7ea3fc9)]:\n  - @graphiql/react@0.35.5\n\n## 5.0.3\n\n### Patch Changes\n\n- [#4052](https://github.com/graphql/graphiql/pull/4052) [`9b54581`](https://github.com/graphql/graphiql/commit/9b54581e74a7e6c6354a810c2288869fb85f24eb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix multiple GraphiQL instances, suffix a unique id for operation, request headers, variables and response URI.\n\n  E.g., the first GraphiQL instance will have:\n\n  - `1-operation.graphql`\n  - `1-request-headers.json`\n  - `1-variables.json`\n  - `1-response.json`\n\n  The 2nd instance will have:\n\n  - `2-operation.graphql`\n  - `2-request-headers.json`\n  - `2-variables.json`\n  - `2-response.json`\n\n  etc.\n\n- [#4049](https://github.com/graphql/graphiql/pull/4049) [`2c0586d`](https://github.com/graphql/graphiql/commit/2c0586d1f3db8fe8dc604032010cc9840d10b72d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - use `allowTrailingComma` option in jsonc parser to make `tryParseJsonObject` sync\n\n  - parse introspection headers with jsonc parser\n  - use prettier format for operation editor since we already use prettier for jsonc editors\n\n- [#4050](https://github.com/graphql/graphiql/pull/4050) [`002f133`](https://github.com/graphql/graphiql/commit/002f1336db4bdafa01cff1964a1b56ba858699eb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix can't access property \"jsonDefaults\"\n\n- Updated dependencies [[`9b54581`](https://github.com/graphql/graphiql/commit/9b54581e74a7e6c6354a810c2288869fb85f24eb), [`2c0586d`](https://github.com/graphql/graphiql/commit/2c0586d1f3db8fe8dc604032010cc9840d10b72d), [`002f133`](https://github.com/graphql/graphiql/commit/002f1336db4bdafa01cff1964a1b56ba858699eb)]:\n  - @graphiql/react@0.35.4\n\n## 5.0.2\n\n### Patch Changes\n\n- [#4046](https://github.com/graphql/graphiql/pull/4046) [`8b56462`](https://github.com/graphql/graphiql/commit/8b564625b2470652db3c27dc70b0f85d5bbc3a0f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Enable font ligatures in monaco-editors fix incorrect caret position on Windows\n\n- Updated dependencies [[`8b56462`](https://github.com/graphql/graphiql/commit/8b564625b2470652db3c27dc70b0f85d5bbc3a0f)]:\n  - @graphiql/react@0.35.3\n\n## 5.0.1\n\n### Patch Changes\n\n- [#4044](https://github.com/graphql/graphiql/pull/4044) [`68b347c`](https://github.com/graphql/graphiql/commit/68b347c78faa80cc00397fc1705dbf114c1f374b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix `Fixes Uncaught Error: can't access property \"offsetNode\", hitResult is null` on Mozilla\n\n- Updated dependencies [[`68b347c`](https://github.com/graphql/graphiql/commit/68b347c78faa80cc00397fc1705dbf114c1f374b)]:\n  - @graphiql/react@0.35.2\n\n## 5.0.0\n\n### Major Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n- [#3999](https://github.com/graphql/graphiql/pull/3999) [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update graphiql-cdn example to show how to load workers with esm.sh\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n- [#4002](https://github.com/graphql/graphiql/pull/4002) [`2d9faec`](https://github.com/graphql/graphiql/commit/2d9faec57830b38aa175929c47a55c959c327535) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove UMD builds\n\n- [#4005](https://github.com/graphql/graphiql/pull/4005) [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - support `externalFragments` prop and remove `validationRules` prop\n\n- [#4003](https://github.com/graphql/graphiql/pull/4003) [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `readOnly` prop\n  document `keyMap` prop was removed in migration guide\n\n- [#3735](https://github.com/graphql/graphiql/pull/3735) [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - Remove `query`, `variables`, `headers`, and `response` props from `<GraphiQL />` and `<GraphiQLProvider />`\n\n  - Add `initialQuery`, `initialVariables` and `initialHeaders` props\n  - Fix `defaultQuery`, when is set will only be used for the first tab. When opening more tabs, the query editor will start out empty\n  - remove `useSynchronizeValue` hook\n\n- [#3966](https://github.com/graphql/graphiql/pull/3966) [`17bee1c`](https://github.com/graphql/graphiql/commit/17bee1ced4637cfa5e0e6cddc7716d89cfa49687) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Remove examples: `GraphiQL x Parcel` and `GraphiQL x Create React App`\n\n  Add new examples: `GraphiQL x Vite` and `GraphiQL x Next.js`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n### Minor Changes\n\n- [#4017](https://github.com/graphql/graphiql/pull/4017) [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - extract graphiql sidebar to react component\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#4008](https://github.com/graphql/graphiql/pull/4008) [`e0dafa4`](https://github.com/graphql/graphiql/commit/e0dafa4cf86edffc8344c11f2c0a5280d873585a) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - add f1 command as first item in shortcut table\n\n  - set color of `quickInputList.focusForeground` in command palette to be primary color\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n- Updated dependencies [[`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92), [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270), [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531), [`7792dc9`](https://github.com/graphql/graphiql/commit/7792dc98814abcd6dc5f5cd94ae84c308a260dcf), [`f9780bd`](https://github.com/graphql/graphiql/commit/f9780bd44f67acad0a9bb10f57eb6059db60e1ec), [`3c0ad34`](https://github.com/graphql/graphiql/commit/3c0ad34a8f2f9d0f912db9597f608d7405c2bd83), [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d), [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439), [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7), [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb), [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b), [`16fdd6a`](https://github.com/graphql/graphiql/commit/16fdd6a16684c9f250ee53ea2dfbb24435cee6a9), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c), [`4b39f11`](https://github.com/graphql/graphiql/commit/4b39f1118d008c2fac6e2df9c94a3f3271c4eeb9), [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/plugin-doc-explorer@0.3.0\n  - @graphiql/plugin-history@0.3.0\n  - @graphiql/react@0.35.0\n\n## 5.0.0-rc.6\n\n### Major Changes\n\n- [#3735](https://github.com/graphql/graphiql/pull/3735) [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - Remove `query`, `variables`, `headers`, and `response` props from `<GraphiQL />` and `<GraphiQLProvider />`\n  - Add `initialQuery`, `initialVariables` and `initialHeaders` props\n  - Fix `defaultQuery`, when is set will only be used for the first tab. When opening more tabs, the query editor will start out empty\n  - remove `useSynchronizeValue` hook\n\n### Patch Changes\n\n- Updated dependencies [[`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7)]:\n  - @graphiql/react@0.35.0-rc.9\n\n## 5.0.0-rc.5\n\n### Minor Changes\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n### Patch Changes\n\n- Updated dependencies [[`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b), [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b)]:\n  - @graphiql/plugin-doc-explorer@0.3.0-rc.4\n  - @graphiql/plugin-history@0.3.0-rc.3\n  - @graphiql/react@0.35.0-rc.8\n\n## 5.0.0-rc.4\n\n### Minor Changes\n\n- [#4017](https://github.com/graphql/graphiql/pull/4017) [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - extract graphiql sidebar to react component\n\n### Patch Changes\n\n- Updated dependencies [[`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb)]:\n  - @graphiql/react@0.35.0-rc.6\n\n## 5.0.0-rc.3\n\n### Major Changes\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n### Patch Changes\n\n- Updated dependencies [[`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531)]:\n  - @graphiql/plugin-doc-explorer@0.3.0-rc.3\n  - @graphiql/react@0.35.0-rc.3\n\n## 5.0.0-rc.2\n\n### Major Changes\n\n- [#3999](https://github.com/graphql/graphiql/pull/3999) [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update graphiql-cdn example to show how to load workers with esm.sh\n\n- [#4002](https://github.com/graphql/graphiql/pull/4002) [`2d9faec`](https://github.com/graphql/graphiql/commit/2d9faec57830b38aa175929c47a55c959c327535) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove UMD builds\n\n- [#4005](https://github.com/graphql/graphiql/pull/4005) [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - support `externalFragments` prop and remove `validationRules` prop\n\n- [#4003](https://github.com/graphql/graphiql/pull/4003) [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `readOnly` prop\n  document `keyMap` prop was removed in migration guide\n\n### Patch Changes\n\n- [#4008](https://github.com/graphql/graphiql/pull/4008) [`e0dafa4`](https://github.com/graphql/graphiql/commit/e0dafa4cf86edffc8344c11f2c0a5280d873585a) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - add f1 command as first item in shortcut table\n  - set color of `quickInputList.focusForeground` in command palette to be primary color\n- Updated dependencies [[`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270), [`7792dc9`](https://github.com/graphql/graphiql/commit/7792dc98814abcd6dc5f5cd94ae84c308a260dcf), [`f9780bd`](https://github.com/graphql/graphiql/commit/f9780bd44f67acad0a9bb10f57eb6059db60e1ec), [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d), [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439), [`16fdd6a`](https://github.com/graphql/graphiql/commit/16fdd6a16684c9f250ee53ea2dfbb24435cee6a9)]:\n  - @graphiql/react@0.35.0-rc.2\n  - @graphiql/plugin-doc-explorer@0.3.0-rc.2\n\n## 5.0.0-rc.1\n\n### Major Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n### Patch Changes\n\n- Updated dependencies [[`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92)]:\n  - @graphiql/plugin-doc-explorer@0.3.0-rc.1\n  - @graphiql/plugin-history@0.3.0-rc.1\n  - @graphiql/react@0.35.0-rc.1\n\n## 5.0.0-rc.0\n\n### Major Changes\n\n- [#3966](https://github.com/graphql/graphiql/pull/3966) [`17bee1c`](https://github.com/graphql/graphiql/commit/17bee1ced4637cfa5e0e6cddc7716d89cfa49687) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Remove examples: `GraphiQL x Parcel` and `GraphiQL x Create React App`\n\n  Add new examples: `GraphiQL x Vite` and `GraphiQL x Next.js`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n- Updated dependencies [[`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/plugin-doc-explorer@0.3.0-rc.0\n  - @graphiql/plugin-history@0.3.0-rc.0\n  - @graphiql/react@0.35.0-rc.0\n\n## 4.1.2\n\n### Patch Changes\n\n- [#3993](https://github.com/graphql/graphiql/pull/3993) [`70d2216`](https://github.com/graphql/graphiql/commit/70d22164d67b925f3342800161a2b568997bd689) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix `TypeError: Cannot read properties of null (reading 'get')` and update graphiql webpack example to show how to use `useStorage` hook with `GraphiQL` component\n\n## 4.1.1\n\n### Patch Changes\n\n- [#3970](https://github.com/graphql/graphiql/pull/3970) [`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - revert https://github.com/graphql/graphiql/pull/3946 to have support multiple embedded graphiql instances on the same page\n\n- Updated dependencies [[`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7)]:\n  - @graphiql/plugin-doc-explorer@0.2.2\n  - @graphiql/plugin-history@0.2.2\n  - @graphiql/react@0.34.1\n\n## 4.1.0\n\n### Minor Changes\n\n- [#3946](https://github.com/graphql/graphiql/pull/3946) [`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand:\n  - replace `useExecutionContext` with `useExecutionStore` hook\n  - replace `useEditorContext` with `useEditorStore` hook\n  - replace `useAutoCompleteLeafs` hook with `getAutoCompleteLeafs` function\n\n### Patch Changes\n\n- [#3963](https://github.com/graphql/graphiql/pull/3963) [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix headers are not set in the refetch of introspection query\n\n- Updated dependencies [[`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af), [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781)]:\n  - @graphiql/plugin-doc-explorer@0.2.1\n  - @graphiql/plugin-history@0.2.1\n  - @graphiql/react@0.34.0\n\n## 4.0.5\n\n### Patch Changes\n\n- [#3945](https://github.com/graphql/graphiql/pull/3945) [`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `usePluginContext` with `usePluginStore` hook\n\n- [#3947](https://github.com/graphql/graphiql/pull/3947) [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - refactor `useStorage`, `useDocExplorer` and `useHistory` hooks\n\n- [#3943](https://github.com/graphql/graphiql/pull/3943) [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useSchemaContext` with `useSchemaStore` hook\n\n- [#3942](https://github.com/graphql/graphiql/pull/3942) [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useStorageContext` with `useStorage` hook\n\n- Updated dependencies [[`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71), [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0), [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e), [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921)]:\n  - @graphiql/plugin-doc-explorer@0.2.0\n  - @graphiql/plugin-history@0.2.0\n  - @graphiql/react@0.33.0\n\n## 4.0.4\n\n### Patch Changes\n\n- [#3940](https://github.com/graphql/graphiql/pull/3940) [`5a66864`](https://github.com/graphql/graphiql/commit/5a668647e1cbca9e846bfa617f97fbae21c821bd) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/plugin-doc-explorer): migrate React context to zustand, replace `useExplorerContext` with `useDocExplorer` and `useDocExplorerActions` hooks\n\n- Updated dependencies [[`5a66864`](https://github.com/graphql/graphiql/commit/5a668647e1cbca9e846bfa617f97fbae21c821bd)]:\n  - @graphiql/plugin-doc-explorer@0.1.0\n\n## 4.0.3\n\n### Patch Changes\n\n- [#3938](https://github.com/graphql/graphiql/pull/3938) [`9f55d93`](https://github.com/graphql/graphiql/commit/9f55d930c8a63b1683740cc7e51531fe09059b72) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix unable override `referencePlugin` prop\n\n- [#3936](https://github.com/graphql/graphiql/pull/3936) [`2bfbb06`](https://github.com/graphql/graphiql/commit/2bfbb06e416cabc46951a137b61a12a571f0c937) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add scroll-x to graphiql tabs area\n\n- [#3939](https://github.com/graphql/graphiql/pull/3939) [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `React.FC` type when declaring React components\n\n- [#3937](https://github.com/graphql/graphiql/pull/3937) [`2500288`](https://github.com/graphql/graphiql/commit/250028863f6eefe4167ff9f9c23168ccf0a85b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `Warning: useLayoutEffect does nothing on the server, because its effect cannot be encoded into the server renderer's output format` warnings on SSR\n\n- [#3935](https://github.com/graphql/graphiql/pull/3935) [`5985e13`](https://github.com/graphql/graphiql/commit/5985e135fcc38a0ce90bf5a5d2cc344ec6b36aab) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/plugin-history): migrate React context to zustand, replace `useHistoryContext` with `useHistory`, `useHistoryActions` hooks\n\n- Updated dependencies [[`2bfbb06`](https://github.com/graphql/graphiql/commit/2bfbb06e416cabc46951a137b61a12a571f0c937), [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7), [`2500288`](https://github.com/graphql/graphiql/commit/250028863f6eefe4167ff9f9c23168ccf0a85b7b), [`5985e13`](https://github.com/graphql/graphiql/commit/5985e135fcc38a0ce90bf5a5d2cc344ec6b36aab)]:\n  - @graphiql/react@0.32.2\n  - @graphiql/plugin-doc-explorer@0.0.2\n  - @graphiql/plugin-history@0.1.0\n\n## 4.0.2\n\n### Patch Changes\n\n- [#3916](https://github.com/graphql/graphiql/pull/3916) [`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove the following exports from `@graphiql/react` and move them in `@graphiql/plugin-doc-explorer` package:\n\n  - Argument\n  - DefaultValue\n  - DeprecationReason\n  - Directive\n  - DocExplorer\n  - ExplorerContext\n  - ExplorerContextProvider\n  - ExplorerSection\n  - FieldDocumentation\n  - FieldLink\n  - SchemaDocumentation\n  - Search\n  - TypeDocumentation\n  - TypeLink\n  - useExplorerContext\n  - DOC_EXPLORER_PLUGIN\n  - ExplorerContextType\n  - ExplorerFieldDef\n  - ExplorerNavStack\n  - ExplorerNavStackItem\n  - add new `referencePlugin` prop on `PluginContextProviderProps` component for plugin which is used to display the reference documentation when selecting a type.\n\n- Updated dependencies [[`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67)]:\n  - @graphiql/plugin-doc-explorer@0.0.1\n  - @graphiql/react@0.32.0\n  - @graphiql/plugin-history@0.0.2\n\n## 4.0.1\n\n### Patch Changes\n\n- [#3911](https://github.com/graphql/graphiql/pull/3911) [`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - export `cn` from `@graphiql/react`\n\n  - remove following exports from `@graphiql/react` and move them in `@graphiql/plugin-history` package:\n    - `History`\n    - `HistoryContext`\n    - `HistoryContextType`\n    - `HistoryContextProvider`\n    - `useHistoryContext`\n    - `HISTORY_PLUGIN`\n  - remove types from `@graphiql/react` (use `ComponentProps<typeof MyContextProviderProps>` instead):\n    - `HistoryContextProviderProps`\n    - `ExecutionContextProviderProps`\n    - `EditorContextProviderProps`\n    - `ExplorerContextProviderProps`\n    - `PluginContextProviderProps`\n    - `SchemaContextProviderProps`\n    - `StorageContextProviderProps`\n    - `GraphiQLProviderProps`\n\n- [#3915](https://github.com/graphql/graphiql/pull/3915) [`bc31cd9`](https://github.com/graphql/graphiql/commit/bc31cd99a92693238e7359456e3cc22ed0387df0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix unpkg.com results to `Not found` when `main` field isn't specified in `package.json`\n\n- Updated dependencies [[`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6)]:\n  - @graphiql/plugin-history@0.0.1\n  - @graphiql/react@0.31.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - drop commonjs build files\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - show tabs even there is only 1 tab\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove default export\n\n  ## Migration\n\n  ### Before\n\n  ```jsx\n  import GraphiQL from 'graphiql';\n  ```\n\n  ### After\n\n  ```jsx\n  import { GraphiQL } from 'graphiql';\n  ```\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - support react 19, drop support react 16 and react 17\n\n  - replace deprecated `ReactDOM.unmountComponentAtNode()` and `ReactDOM.render()` with `root.unmount()` and `createRoot(container).render()`\n  - update `@radix-ui` and `@headlessui/react` dependencies\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `disableTabs` option\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `data-testid=\"graphiql-container\"`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - changed exports\n\n  ```diff\n  -graphiql/graphiql.css\n  +graphiql/style.css\n  ```\n\n  changed cdn paths, `dist/index.umd.js` and `dist/style.css` are minified\n\n  ```diff\n  -https://unpkg.com/graphiql/graphiql.js\n  -https://unpkg.com/graphiql/graphiql.min.js\n  +https://unpkg.com/graphiql/dist/index.umd.js\n  -https://unpkg.com/graphiql/graphiql.css\n  -https://unpkg.com/graphiql/graphiql.min.css\n  +https://unpkg.com/graphiql/dist/style.css\n  ```\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - new looks of tabs\n\n  - fix `disableTabs` when `Add tab` button is still shown\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Remove `toolbar.additionalContent` and `toolbar.additionalComponent` props in favor of `GraphiQL.Toolbar` render props.\n\n  ## Migration from `toolbar.additionalContent`\n\n  ### Before\n\n  ```jsx\n  <GraphiQL toolbar={{ additionalContent: <button>My button</button> }} />\n  ```\n\n  ### After\n\n  ```jsx\n  <GraphiQL>\n    <GraphiQL.Toolbar>\n      {({ merge, prettify, copy }) => (\n        <>\n          {prettify}\n          {merge}\n          {copy}\n          <button>My button</button>\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n  ```\n\n  ## Migration from `toolbar.additionalComponent`\n\n  ### Before\n\n  ```jsx\n  <GraphiQL\n    toolbar={{\n      additionalComponent: function MyComponentWithAccessToContext() {\n        return <button>My button</button>;\n      },\n    }}\n  />\n  ```\n\n  ### After\n\n  ```jsx\n  <GraphiQL>\n    <GraphiQL.Toolbar>\n      {({ merge, prettify, copy }) => (\n        <>\n          {prettify}\n          {merge}\n          {copy}\n          <MyComponentWithAccessToContext />\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n  ```\n\n  ***\n\n  Additionally, you can sort default toolbar buttons in different order or remove unneeded buttons for you:\n\n  ```jsx\n  <GraphiQL>\n    <GraphiQL.Toolbar>\n      {({ prettify, copy }) => (\n        <>\n          {copy /* Copy button will be first instead of default last */}\n          {/* Merge button is removed from toolbar */}\n          {prettify}\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n  ```\n\n### Minor Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Add support for `onPrettifyQuery` callback to enable customised query formatting\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Update GraphiQL CDN example using ESM-based CDN esm.sh\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update `vite` and related dependencies\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `.graphiql-session` class\n\n### Patch Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update graphql to `16.9.0` and use vite `define` configuration to remove development code from cdn bundle\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Respect Markdown format: ignore single newline\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `position: absolute` for `.graphiql-logo` class\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace `overflow-y: scroll` with `overflow-y: auto`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - rollback `position: absolute` style for `.graphiql-logo` because tabs will behind logo\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - prefer `location` over `window.location`\n\n  - prefer `navigator` over `window.navigator`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `right: var(--px-16)` instead of `right: 0` for `.graphiql-logo`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace `Tooltip`s in tabs with html `title=\"...\"` attribute\n\n- Updated dependencies [[`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602)]:\n  - @graphiql/react@0.30.0\n\n## 4.0.0-alpha.5\n\n### Minor Changes\n\n- [#3733](https://github.com/graphql/graphiql/pull/3733) [`8dbddb5`](https://github.com/graphql/graphiql/commit/8dbddb50273720d76f895af6b783b04204c68e03) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Add support for `onPrettifyQuery` callback to enable customised query formatting\n\n### Patch Changes\n\n- Updated dependencies [[`8dbddb5`](https://github.com/graphql/graphiql/commit/8dbddb50273720d76f895af6b783b04204c68e03)]:\n  - @graphiql/react@1.0.0-alpha.4\n\n## 4.0.0-alpha.4\n\n### Minor Changes\n\n- [#3728](https://github.com/graphql/graphiql/pull/3728) [`a1a5208`](https://github.com/graphql/graphiql/commit/a1a5208aeebe4ff622e83cd355f8b4e9b7fa011c) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `.graphiql-session` class\n\n### Patch Changes\n\n- [#3414](https://github.com/graphql/graphiql/pull/3414) [`f8b719f`](https://github.com/graphql/graphiql/commit/f8b719f215a79038d1b2a54ddfef461fd849a912) Thanks [@leonardehrenfried](https://github.com/leonardehrenfried)! - Respect Markdown format: ignore single newline\n\n- [#3730](https://github.com/graphql/graphiql/pull/3730) [`360a038`](https://github.com/graphql/graphiql/commit/360a0385d4ef0105beb8e76044a78f5cd43c9448) Thanks [@dimaMachina](https://github.com/dimaMachina)! - rollback `position: absolute` style for `.graphiql-logo` because tabs will behind logo\n\n- [#3726](https://github.com/graphql/graphiql/pull/3726) [`196e9a0`](https://github.com/graphql/graphiql/commit/196e9a081ffc0df16a5537c8ec0fb622fc3ba0b0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `right: var(--px-16)` instead of `right: 0` for `.graphiql-logo`\n\n- Updated dependencies [[`f8b719f`](https://github.com/graphql/graphiql/commit/f8b719f215a79038d1b2a54ddfef461fd849a912), [`360a038`](https://github.com/graphql/graphiql/commit/360a0385d4ef0105beb8e76044a78f5cd43c9448)]:\n  - @graphiql/react@1.0.0-alpha.3\n\n## 4.0.0-alpha.3\n\n### Patch Changes\n\n- [#3720](https://github.com/graphql/graphiql/pull/3720) [`79f3abf`](https://github.com/graphql/graphiql/commit/79f3abf9b697c448442e32eb5a21b7ff720bc242) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace `overflow-y: scroll` with `overflow-y: auto`\n\n- [#3720](https://github.com/graphql/graphiql/pull/3720) [`79f3abf`](https://github.com/graphql/graphiql/commit/79f3abf9b697c448442e32eb5a21b7ff720bc242) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace `Tooltip`s in tabs with html `title=\"...\"` attribute\n\n- Updated dependencies [[`79f3abf`](https://github.com/graphql/graphiql/commit/79f3abf9b697c448442e32eb5a21b7ff720bc242)]:\n  - @graphiql/react@1.0.0-alpha.2\n\n## 4.0.0-alpha.2\n\n### Patch Changes\n\n- [#3716](https://github.com/graphql/graphiql/pull/3716) [`cc2808f`](https://github.com/graphql/graphiql/commit/cc2808f9b0d9ac0f98603299ec67e2a659cbfcd7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `position: absolute` for `.graphiql-logo` class\n\n- Updated dependencies [[`bf0c4e7`](https://github.com/graphql/graphiql/commit/bf0c4e7236f4a68448063aa0c6a4ed439e869a9f)]:\n  - @graphiql/react@1.0.0-alpha.1\n\n## 4.0.0-alpha.1\n\n### Major Changes\n\n- [#3713](https://github.com/graphql/graphiql/pull/3713) [`27bbc51`](https://github.com/graphql/graphiql/commit/27bbc51a69504ffa9c6efbb17f112668f38fe52d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - show tabs even there is only 1 tab\n\n- [#3707](https://github.com/graphql/graphiql/pull/3707) [`3c901c1`](https://github.com/graphql/graphiql/commit/3c901c104123750f45bcd64ade5b0ab9706d3146) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Remove `toolbar.additionalContent` and `toolbar.additionalComponent` props in favor of `GraphiQL.Toolbar` render props.\n\n  ## Migration from `toolbar.additionalContent`\n\n  #### Before\n\n  ```jsx\n  <GraphiQL toolbar={{ additionalContent: <button>My button</button> }} />\n  ```\n\n  #### After\n\n  ```jsx\n  <GraphiQL>\n    <GraphiQL.Toolbar>\n      {({ merge, prettify, copy }) => (\n        <>\n          {prettify}\n          {merge}\n          {copy}\n          <button>My button</button>\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n  ```\n\n  ### Migration from `toolbar.additionalComponent`\n\n  #### Before\n\n  ```jsx\n  <GraphiQL\n    toolbar={{\n      additionalComponent: function MyComponentWithAccessToContext() {\n        return <button>My button</button>;\n      },\n    }}\n  />\n  ```\n\n  #### After\n\n  ```jsx\n  <GraphiQL>\n    <GraphiQL.Toolbar>\n      {({ merge, prettify, copy }) => (\n        <>\n          {prettify}\n          {merge}\n          {copy}\n          <MyComponentWithAccessToContext />\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n  ```\n\n  ***\n\n  Additionally, you can sort default toolbar buttons in different order or remove unneeded buttons for you:\n\n  ```jsx\n  <GraphiQL>\n    <GraphiQL.Toolbar>\n      {({ prettify, copy }) => (\n        <>\n          {copy /* Copy button will be first instead of default last */}\n          {/* Merge button is removed from toolbar */}\n          {prettify}\n        </>\n      )}\n    </GraphiQL.Toolbar>\n  </GraphiQL>\n  ```\n\n## 4.0.0-alpha.0\n\n### Major Changes\n\n- [#3706](https://github.com/graphql/graphiql/pull/3706) [`343dd59`](https://github.com/graphql/graphiql/commit/343dd599ee10b0670cd7ab4dfaa65344f0d48c84) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove default export\n\n  ## Migration\n\n  ### Before\n\n  ```jsx\n  import GraphiQL from 'graphiql';\n  ```\n\n  ### After\n\n  ```jsx\n  import { GraphiQL } from 'graphiql';\n  ```\n\n- [#3687](https://github.com/graphql/graphiql/pull/3687) [`09e7004`](https://github.com/graphql/graphiql/commit/09e700403beb6c7290d165df33a2455ac2196971) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `disableTabs` option\n\n- [#3688](https://github.com/graphql/graphiql/pull/3688) [`0fdd9b9`](https://github.com/graphql/graphiql/commit/0fdd9b9f32513d96281f577a5d9bd2fefb5f05d4) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `data-testid=\"graphiql-container\"`\n\n- [#3679](https://github.com/graphql/graphiql/pull/3679) [`5d90e0e`](https://github.com/graphql/graphiql/commit/5d90e0eed58214c5926e6e0edb196971b15b1121) Thanks [@dimaMachina](https://github.com/dimaMachina)! - migrate from `webpack` to `vite`\n\n  changed exports\n\n  ```diff\n  -graphiql/graphiql.css\n  +graphiql/style.css\n  ```\n\n  changed cdn paths, `dist/index.umd.js` and `dist/style.css` are minified\n\n  ```diff\n  -https://unpkg.com/graphiql/graphiql.js\n  -https://unpkg.com/graphiql/graphiql.min.js\n  +https://unpkg.com/graphiql/dist/index.umd.js\n  -https://unpkg.com/graphiql/graphiql.css\n  -https://unpkg.com/graphiql/graphiql.min.css\n  +https://unpkg.com/graphiql/dist/style.css\n  ```\n\n- [#3644](https://github.com/graphql/graphiql/pull/3644) [`3c1a345`](https://github.com/graphql/graphiql/commit/3c1a345acd9bf07b45bc230009cb57c51c425673) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - new looks of tabs\n\n  - fix `disableTabs` when `Add tab` button is still shown\n\n### Patch Changes\n\n- [#3683](https://github.com/graphql/graphiql/pull/3683) [`8efb873`](https://github.com/graphql/graphiql/commit/8efb873458489ce3497d917bcafd4ad8dfcbe6c8) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update graphql to `16.9.0` and use vite `define` configuration to remove development code from cdn bundle\n\n- [#3692](https://github.com/graphql/graphiql/pull/3692) [`82bc961`](https://github.com/graphql/graphiql/commit/82bc961a33c4e9da29dffb4a603035a4909f49ad) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - prefer `location` over `window.location`\n  - prefer `navigator` over `window.navigator`\n- Updated dependencies [[`00415d2`](https://github.com/graphql/graphiql/commit/00415d2940c4d76a4a9e683e9fa0504ba97dd627), [`9baf1f0`](https://github.com/graphql/graphiql/commit/9baf1f0fc9f32404fbb8bf57b3d1c2c2c8778ddb), [`8ff87d7`](https://github.com/graphql/graphiql/commit/8ff87d7b6b3d5d12b539612a39ca3abf7e631106), [`82bc961`](https://github.com/graphql/graphiql/commit/82bc961a33c4e9da29dffb4a603035a4909f49ad), [`3c1a345`](https://github.com/graphql/graphiql/commit/3c1a345acd9bf07b45bc230009cb57c51c425673)]:\n  - @graphiql/react@1.0.0-alpha.0\n\n## 3.9.0\n\n### Minor Changes\n\n- [#3826](https://github.com/graphql/graphiql/pull/3826) [`cb29e9f`](https://github.com/graphql/graphiql/commit/cb29e9fbe1362778bc327513fc884c4ec419775e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove react compiler custom patch\n\n  - update `react-compiler-runtime` to use `19.1.0-rc.1` version\n\n- [#3826](https://github.com/graphql/graphiql/pull/3826) [`cb29e9f`](https://github.com/graphql/graphiql/commit/cb29e9fbe1362778bc327513fc884c4ec419775e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - migrate `graphiql` to `vite` and `react compiler`\n\n### Patch Changes\n\n- Updated dependencies [[`cb29e9f`](https://github.com/graphql/graphiql/commit/cb29e9fbe1362778bc327513fc884c4ec419775e), [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - @graphiql/react@0.29.0\n\n## 3.8.3\n\n### Patch Changes\n\n- [#3843](https://github.com/graphql/graphiql/pull/3843) [`16b5698`](https://github.com/graphql/graphiql/commit/16b56982ce4de62c850380fe25698c3893551c5a) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix regression in documentation explorer search when clicking on results in dropdown\n\n- Updated dependencies [[`16b5698`](https://github.com/graphql/graphiql/commit/16b56982ce4de62c850380fe25698c3893551c5a)]:\n  - @graphiql/react@0.28.2\n\n## 3.8.2\n\n### Patch Changes\n\n- [#3840](https://github.com/graphql/graphiql/pull/3840) [`b529a6c`](https://github.com/graphql/graphiql/commit/b529a6c59b760f8bc54df0cd691b0704d94c022b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update `@graphiql/react` dependency range to `^0.28.1`\n\n## 3.8.1\n\n### Patch Changes\n\n- Updated dependencies [[`3633d61`](https://github.com/graphql/graphiql/commit/3633d61c3c597adf60c0ec1bbf98cf6a1f49beed)]:\n  - @graphiql/react@0.28.0\n\n## 3.8.0\n\n### Minor Changes\n\n- [#3825](https://github.com/graphql/graphiql/pull/3825) [`7cdcabf`](https://github.com/graphql/graphiql/commit/7cdcabf9d401683e90c995476b187c6f8ea70f63) Thanks [@dimaMachina](https://github.com/dimaMachina)! - migrate `graphiql` from `jest` to `vitest`\n\n### Patch Changes\n\n- Updated dependencies [[`72f06bc`](https://github.com/graphql/graphiql/commit/72f06bc52a9bdc0cb146d65861ba7364717bbdf5)]:\n  - @graphiql/react@0.27.1\n\n## 3.7.2\n\n### Patch Changes\n\n- Updated dependencies [[`f86e2bc`](https://github.com/graphql/graphiql/commit/f86e2bce40826b3d07755f91b37a72051de00f9c)]:\n  - @graphiql/react@0.27.0\n\n## 3.7.1\n\n### Patch Changes\n\n- [#3751](https://github.com/graphql/graphiql/pull/3751) [`b8538d8`](https://github.com/graphql/graphiql/commit/b8538d87421edb086b32d4eb2e30a3f7d9d9e893) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace deprecated `navigator.platform` with `navigator.userAgent`\n\n  fix placeholder `⌘ K` in doc explorer search input for non mac devices, replace by `Ctrl K`\n\n- Updated dependencies [[`b8538d8`](https://github.com/graphql/graphiql/commit/b8538d87421edb086b32d4eb2e30a3f7d9d9e893)]:\n  - @graphiql/react@0.26.2\n\n## 3.7.0\n\n### Minor Changes\n\n- [#3619](https://github.com/graphql/graphiql/pull/3619) [`9aef83a`](https://github.com/graphql/graphiql/commit/9aef83a32aeb5f193a3ff0f191c95d09eb0d70b6) Thanks [@Yahkob](https://github.com/Yahkob)! - add new prop `defaultTheme` to set the default color preference theme\n\n### Patch Changes\n\n- [#3441](https://github.com/graphql/graphiql/pull/3441) [`959ed21`](https://github.com/graphql/graphiql/commit/959ed21815682fc439f64d78e23e603a8f313a6f) Thanks [@cimdalli](https://github.com/cimdalli)! - fix: set query editor to `defaultQuery` while adding a new tab or GraphiQL's default query\n\n  ```graphql\n  # Welcome to GraphiQL\n  #\n  # GraphiQL is an in-browser tool for writing, validating, and\n  # testing GraphQL queries.\n\n  ...\n  ```\n\n- Updated dependencies [[`959ed21`](https://github.com/graphql/graphiql/commit/959ed21815682fc439f64d78e23e603a8f313a6f), [`9aef83a`](https://github.com/graphql/graphiql/commit/9aef83a32aeb5f193a3ff0f191c95d09eb0d70b6)]:\n  - @graphiql/react@0.26.0\n\n## 3.6.0\n\n### Minor Changes\n\n- [#3563](https://github.com/graphql/graphiql/pull/3563) [`4fb231f`](https://github.com/graphql/graphiql/commit/4fb231fb9619544974d81be9a2e7d92e37ab7426) Thanks [@klippx](https://github.com/klippx)! - Add new prop `confirmCloseTab` to allow control of closing tabs\n\n- [#3532](https://github.com/graphql/graphiql/pull/3532) [`7404e8e`](https://github.com/graphql/graphiql/commit/7404e8e6c62b06107f452142493297ec70f1649c) Thanks [@Cr4xy](https://github.com/Cr4xy)! - Add webp support to graphiql results image-preview\n\n### Patch Changes\n\n- Updated dependencies [[`7404e8e`](https://github.com/graphql/graphiql/commit/7404e8e6c62b06107f452142493297ec70f1649c)]:\n  - @graphiql/react@0.25.0\n\n## 3.5.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - @graphiql/react@0.24.0\n\n## 3.4.1\n\n### Patch Changes\n\n- [#3675](https://github.com/graphql/graphiql/pull/3675) [`676f910`](https://github.com/graphql/graphiql/commit/676f910638eed5177146045d028a74e623884b45) Thanks [@dimaMachina](https://github.com/dimaMachina)! - move `@graphiql/toolkit` to `devDependecies` because umd build is bundled with all dependencies in one file\n\n- [#3655](https://github.com/graphql/graphiql/pull/3655) [`5450e6b`](https://github.com/graphql/graphiql/commit/5450e6b547add41a9dd89145934e79576b5544e6) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove unused dependencies `graphql-language-service` and `markdown-it`\n\n- Updated dependencies [[`6a0a5e5`](https://github.com/graphql/graphiql/commit/6a0a5e590b7b526af8a66c59a27ec3d0144af572)]:\n  - @graphiql/react@0.23.1\n\n## 3.4.0\n\n### Minor Changes\n\n- [#3643](https://github.com/graphql/graphiql/pull/3643) [`82f1ecc`](https://github.com/graphql/graphiql/commit/82f1eccb52e328241cee93389c58154b9f2e8730) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add `className` prop. Additional class names which will be appended to the GraphiQL container element\n\n### Patch Changes\n\n- Updated dependencies [[`5bc7b84`](https://github.com/graphql/graphiql/commit/5bc7b84531b6404553787615d61a5cbcc96c1d6f), [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d), [`56c6f45`](https://github.com/graphql/graphiql/commit/56c6f4571dd0dfda307ed11c5afb8c837ad928b0), [`93c7e9f`](https://github.com/graphql/graphiql/commit/93c7e9fd224cb4f1e9a86b3391efc1e0ef6e1e3f)]:\n  - @graphiql/react@0.23.0\n  - graphql-language-service@5.2.2\n  - @graphiql/toolkit@0.9.2\n\n## 3.3.2\n\n### Patch Changes\n\n- [#3634](https://github.com/graphql/graphiql/pull/3634) [`adf0ba01`](https://github.com/graphql/graphiql/commit/adf0ba019902dcac2e49ccee69b79a6665c4766d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - when alpha is `1`, use `hsl` instead of `hsla`\n\n- Updated dependencies [[`adf0ba01`](https://github.com/graphql/graphiql/commit/adf0ba019902dcac2e49ccee69b79a6665c4766d)]:\n  - @graphiql/react@0.22.4\n\n## 3.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`335d830c`](https://github.com/graphql/graphiql/commit/335d830c2a4e551ef97fbeff8ed7c538ff5cd4af)]:\n  - @graphiql/react@0.22.3\n\n## 3.3.0\n\n### Minor Changes\n\n- [#3407](https://github.com/graphql/graphiql/pull/3407) [`115c1c02`](https://github.com/graphql/graphiql/commit/115c1c0281b3bcba6d2ae13f0df51e2cb1d0c24c) Thanks [@TuvalSimha](https://github.com/TuvalSimha)! - Add a new prop to GraphiQL component: `forcedTheme` to force the theme and hide the theme switcher.\n\n## 3.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`03ab3a6b`](https://github.com/graphql/graphiql/commit/03ab3a6b76378591ef79a828d80cc69b0b8f2842), [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - @graphiql/react@0.22.2\n  - graphql-language-service@5.2.1\n\n## 3.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`224b43f5`](https://github.com/graphql/graphiql/commit/224b43f5473456f264a82998d48a34a441537f54)]:\n  - @graphiql/react@0.22.1\n\n## 3.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`d48f4ef5`](https://github.com/graphql/graphiql/commit/d48f4ef56578dad7ec90f33458353791e463ef7b)]:\n  - @graphiql/react@0.22.0\n\n## 3.2.0\n\n### Minor Changes\n\n- [#3569](https://github.com/graphql/graphiql/pull/3569) [`5d051054`](https://github.com/graphql/graphiql/commit/5d05105469c3f0cbeb5e294da1cf6ff2355e4eb5) Thanks [@AaronMoat](https://github.com/AaronMoat)! - Update to markdown-it 14.x\n\n### Patch Changes\n\n- Updated dependencies [[`5d051054`](https://github.com/graphql/graphiql/commit/5d05105469c3f0cbeb5e294da1cf6ff2355e4eb5)]:\n  - @graphiql/react@0.21.0\n\n## 3.1.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.20.4\n\n## 3.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`2b6ea316`](https://github.com/graphql/graphiql/commit/2b6ea3166c8d8e152f16d87c878aa8a66f1b3775)]:\n  - @graphiql/react@0.20.3\n\n## 3.1.0\n\n### Minor Changes\n\n- [#3408](https://github.com/graphql/graphiql/pull/3408) [`a8080197`](https://github.com/graphql/graphiql/commit/a80801970e095e493eb0fda7687766f103bf701e) Thanks [@TuvalSimha](https://github.com/TuvalSimha)! - Allow disabling tabs and added new prop `disableTabs`\n\n## 3.0.10\n\n### Patch Changes\n\n- [#3439](https://github.com/graphql/graphiql/pull/3439) [`d07d5fc0`](https://github.com/graphql/graphiql/commit/d07d5fc0cf764518bc1184ef168361cedf61540b) Thanks [@xonx4l](https://github.com/xonx4l)! - FIX: Unexpected duplicate CSS \"display\" property\n\n## 3.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`e89c432d`](https://github.com/graphql/graphiql/commit/e89c432d8d2b91f087b683360f23e0686462bc02)]:\n  - @graphiql/react@0.20.2\n\n## 3.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`39bf31d1`](https://github.com/graphql/graphiql/commit/39bf31d15b1e7fb5f235ec9adc1ce8081536de4a)]:\n  - @graphiql/react@0.20.1\n\n## 3.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`f6afd22d`](https://github.com/graphql/graphiql/commit/f6afd22d3f5a20089759042f16fd865646a32038)]:\n  - @graphiql/react@0.20.0\n\n## 3.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n  - @graphiql/react@0.19.4\n\n## 3.0.5\n\n### Patch Changes\n\n- [#3371](https://github.com/graphql/graphiql/pull/3371) [`2348641c`](https://github.com/graphql/graphiql/commit/2348641c07748691c478ac5f67032b7e9081f9cb) Thanks [@acao](https://github.com/acao)! - Solves #2825, an old bug where new tabs were created on every refresh\n\n  the bug occurred when:\n\n  1. `shouldPersistHeaders` is not set to true\n  2. `headers` or `defaultHeaders` are provided as props\n  3. the user refreshes the browser\n\n- Updated dependencies [[`2348641c`](https://github.com/graphql/graphiql/commit/2348641c07748691c478ac5f67032b7e9081f9cb)]:\n  - @graphiql/react@0.19.3\n\n## 3.0.4\n\n### Patch Changes\n\n- [#3364](https://github.com/graphql/graphiql/pull/3364) [`d67c13f6`](https://github.com/graphql/graphiql/commit/d67c13f6e1f478b171801afd0767b98312db04c9) Thanks [@acao](https://github.com/acao)! - Fix search result bug on select, #33307\n\n- Updated dependencies [[`4cbdf183`](https://github.com/graphql/graphiql/commit/4cbdf18385d34ef9bc095c376936f92a62eb9e9b), [`d67c13f6`](https://github.com/graphql/graphiql/commit/d67c13f6e1f478b171801afd0767b98312db04c9)]:\n  - @graphiql/toolkit@0.9.1\n  - @graphiql/react@0.19.2\n\n## 3.0.3\n\n### Patch Changes\n\n- [#3359](https://github.com/graphql/graphiql/pull/3359) [`8ebedc9a`](https://github.com/graphql/graphiql/commit/8ebedc9a518581f3dcbaa440bcd829d4546c76db) Thanks [@acao](https://github.com/acao)! - export createLocalStorage in UMD bundle\n\n## 3.0.2\n\n### Patch Changes\n\n- [#3349](https://github.com/graphql/graphiql/pull/3349) [`17069e7a`](https://github.com/graphql/graphiql/commit/17069e7a0224dbce3f5523630a898e093f5c47c9) Thanks [@acao](https://github.com/acao)! - fix display of deprecation reason on field type docs\n\n- Updated dependencies [[`17069e7a`](https://github.com/graphql/graphiql/commit/17069e7a0224dbce3f5523630a898e093f5c47c9), [`ffb6486d`](https://github.com/graphql/graphiql/commit/ffb6486d1eab0be2bc8fdec366b5671a5d6504d1), [`e4a36207`](https://github.com/graphql/graphiql/commit/e4a362071edf1db53f87f271c523ab2f3a5c4717)]:\n  - @graphiql/react@0.19.1\n  - @graphiql/toolkit@0.9.0\n\n## 3.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`9a38de29`](https://github.com/graphql/graphiql/commit/9a38de29fddf174ba9e793ac5852407537244f87)]:\n  - @graphiql/react@0.19.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - remove `initialTabs`, use `defaultTabs` instead\n\n### Patch Changes\n\n- [#3235](https://github.com/graphql/graphiql/pull/3235) [`5d062809`](https://github.com/graphql/graphiql/commit/5d062809b5240c393854e3f97f2117e58d505991) Thanks [@B2o5T](https://github.com/B2o5T)! - remove unnecessary `<div />` wrappers\n\n- Updated dependencies [[`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5), [`bc9d243d`](https://github.com/graphql/graphiql/commit/bc9d243d40b95f95fc9d00d25aa0dd1733952626), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`67bf93a3`](https://github.com/graphql/graphiql/commit/67bf93a33e98c60ae3a686063a1c47037f88ef49)]:\n  - @graphiql/react@0.18.0\n  - graphql-language-service@5.1.7\n\n## 3.0.0-alpha.1\n\n### Patch Changes\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5), [`bc9d243d`](https://github.com/graphql/graphiql/commit/bc9d243d40b95f95fc9d00d25aa0dd1733952626), [`67bf93a3`](https://github.com/graphql/graphiql/commit/67bf93a33e98c60ae3a686063a1c47037f88ef49)]:\n  - graphql-language-service@5.1.7-alpha.0\n  - @graphiql/react@0.18.0-alpha.1\n\n## 3.0.0-alpha.0\n\n### Major Changes\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - remove `initialTabs`, use `defaultTabs` instead\n\n### Patch Changes\n\n- Updated dependencies [[`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696)]:\n  - @graphiql/react@0.18.0-alpha.0\n\n## 2.4.7\n\n### Patch Changes\n\n- [#3198](https://github.com/graphql/graphiql/pull/3198) [`e6cb6395`](https://github.com/graphql/graphiql/commit/e6cb63956baf338f09806c2fb8d5648fde19869d) Thanks [@B2o5T](https://github.com/B2o5T)! - fix ReferenceError: window is not defined in Next.js\n\n## 2.4.6\n\n### Patch Changes\n\n- [#3124](https://github.com/graphql/graphiql/pull/3124) [`c645932c`](https://github.com/graphql/graphiql/commit/c645932c7973e11ad917e1d1d897fd409f8c042f) Thanks [@B2o5T](https://github.com/B2o5T)! - avoid unnecessary renders by using useMemo or useCallback\n\n- Updated dependencies [[`911cf3e0`](https://github.com/graphql/graphiql/commit/911cf3e0b0fa13268245463c8db8299279e5c461), [`c645932c`](https://github.com/graphql/graphiql/commit/c645932c7973e11ad917e1d1d897fd409f8c042f), [`2ca4841b`](https://github.com/graphql/graphiql/commit/2ca4841baf74e87a3f067b3415f8da3347ee3898), [`7bf90929`](https://github.com/graphql/graphiql/commit/7bf90929f62ba812c0946e0424f9f843f7b6b0ff), [`431b7fe1`](https://github.com/graphql/graphiql/commit/431b7fe1efefa4867f0ea617adc436b1117052e8)]:\n  - @graphiql/react@0.17.6\n\n## 2.4.5\n\n### Patch Changes\n\n- Updated dependencies [[`2b212941`](https://github.com/graphql/graphiql/commit/2b212941628498957d95ee89a7a5a0623f391b7a), [`9b333a04`](https://github.com/graphql/graphiql/commit/9b333a047d6b75db7681f484156d8772e9f91810)]:\n  - @graphiql/react@0.17.5\n\n## 2.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`707f3cbc`](https://github.com/graphql/graphiql/commit/707f3cbca3ac2ce186058e7d2b145cdf69bf7d9c), [`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939)]:\n  - @graphiql/react@0.17.4\n  - graphql-language-service@5.1.6\n\n## 2.4.3\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service@5.1.5\n  - @graphiql/react@0.17.3\n\n## 2.4.2\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9), [`4879984e`](https://github.com/graphql/graphiql/commit/4879984ea1803a6e9f97d81c97e8ba27aacddae9), [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b), [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040)]:\n  - @graphiql/react@0.17.2\n  - @graphiql/toolkit@0.8.4\n  - graphql-language-service@5.1.4\n\n## 2.4.1\n\n### Patch Changes\n\n- [#3087](https://github.com/graphql/graphiql/pull/3087) [`0e2dfd49`](https://github.com/graphql/graphiql/commit/0e2dfd49b95d670a0955991fd65055000e52a9f8) Thanks [@B2o5T](https://github.com/B2o5T)! - remove nowhere used `entities` dependency\n\n- Updated dependencies [[`2d5c60ec`](https://github.com/graphql/graphiql/commit/2d5c60ecf717abafde2bddd32b2772261d3eec8b), [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`4a2284f5`](https://github.com/graphql/graphiql/commit/4a2284f54809f91d03ba51b9eb4e3ba7b8b7e773), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0), [`7cf4908a`](https://github.com/graphql/graphiql/commit/7cf4908a5d4bd58af315047f4dec5236e8c701fc)]:\n  - @graphiql/react@0.17.1\n  - @graphiql/toolkit@0.8.3\n  - graphql-language-service@5.1.3\n\n## 2.4.0\n\n### Minor Changes\n\n- [#3012](https://github.com/graphql/graphiql/pull/3012) [`65f5176a`](https://github.com/graphql/graphiql/commit/65f5176a408cfbbc514ca60e2e4bd2ea133a8b0b) Thanks [@benjie](https://github.com/benjie)! - GraphiQL now maintains the DocExplorer navigation stack as best it can when the schema is updated\n\n### Patch Changes\n\n- [#2995](https://github.com/graphql/graphiql/pull/2995) [`5f276c41`](https://github.com/graphql/graphiql/commit/5f276c415ad93350382fec873025ffecc9a29d9d) Thanks [@imolorhe](https://github.com/imolorhe)! - fix(cm6-graphql): Fix query token used as field name\n\n- [#2962](https://github.com/graphql/graphiql/pull/2962) [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d) Thanks [@B2o5T](https://github.com/B2o5T)! - clean all ESLint warnings, add `--max-warnings=0` and `--cache` flags\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`65f5176a`](https://github.com/graphql/graphiql/commit/65f5176a408cfbbc514ca60e2e4bd2ea133a8b0b), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n  - @graphiql/react@0.17.0\n  - @graphiql/toolkit@0.8.2\n\n## 2.3.0\n\n### Minor Changes\n\n- [#2895](https://github.com/graphql/graphiql/pull/2895) [`ccba2f33`](https://github.com/graphql/graphiql/commit/ccba2f33b67a03f492222f7afde1354cfd033b42) Thanks [@TheMightyPenguin](https://github.com/TheMightyPenguin)! - Add user facing setting for persisting headers\n\n### Patch Changes\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2941](https://github.com/graphql/graphiql/pull/2941) [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-logical-operator-over-ternary` rule\n\n- [#2964](https://github.com/graphql/graphiql/pull/2964) [`cec3fb2a`](https://github.com/graphql/graphiql/commit/cec3fb2a493c4a0c40df7dfad04e1a95ed35e786) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-export-from` rule\n\n- [#2939](https://github.com/graphql/graphiql/pull/2939) [`bca318ce`](https://github.com/graphql/graphiql/commit/bca318ceb7821f0c4b3973c5b05131c9a23bf2cf) Thanks [@jonathanawesome](https://github.com/jonathanawesome)! - removes regenerator-runtime from cdn.ts, resolves #2868\n\n- [#2963](https://github.com/graphql/graphiql/pull/2963) [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `prefer-destructuring` rule\n\n- [#2938](https://github.com/graphql/graphiql/pull/2938) [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/throw-new-error` rule\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de), [`cec3fb2a`](https://github.com/graphql/graphiql/commit/cec3fb2a493c4a0c40df7dfad04e1a95ed35e786), [`695100bd`](https://github.com/graphql/graphiql/commit/695100bd317940ff3ffd8f56b54248c1dba1ac04), [`11e6ad11`](https://github.com/graphql/graphiql/commit/11e6ad11e745c671eb320731697887bb8d7177b7), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9), [`d502a33b`](https://github.com/graphql/graphiql/commit/d502a33b4332f1025e947c02d7cfdc5799365c8d), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`ccba2f33`](https://github.com/graphql/graphiql/commit/ccba2f33b67a03f492222f7afde1354cfd033b42), [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171), [`4ff2794c`](https://github.com/graphql/graphiql/commit/4ff2794c8b6032168e27252096cb276ce712878e)]:\n  - @graphiql/react@0.16.0\n  - @graphiql/toolkit@0.8.1\n  - graphql-language-service@5.1.1\n\n## 2.2.0\n\n### Minor Changes\n\n- [#2908](https://github.com/graphql/graphiql/pull/2908) [`3340fd74`](https://github.com/graphql/graphiql/commit/3340fd745e181ba8f1f5a6ed002a04d253a78d4a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Deprecate the `initialTabs` prop and add a `defaultTabs` props that supersedes it\n\n### Patch Changes\n\n- [#2911](https://github.com/graphql/graphiql/pull/2911) [`118db402`](https://github.com/graphql/graphiql/commit/118db402eb1f5569e29f8f9bffef86d941dd2634) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix styles of secondary editor buttons\n\n- [#2919](https://github.com/graphql/graphiql/pull/2919) [`f6cae4ea`](https://github.com/graphql/graphiql/commit/f6cae4eaa0258ea7fcde97ba6368830955f0abf4) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix overflow when there are lots of tabs that don't fit into the tab bar at once\n\n- Updated dependencies [[`16174a05`](https://github.com/graphql/graphiql/commit/16174a053ed89fb9554d096395ab7bf69c8f6911), [`f6cae4ea`](https://github.com/graphql/graphiql/commit/f6cae4eaa0258ea7fcde97ba6368830955f0abf4), [`3340fd74`](https://github.com/graphql/graphiql/commit/3340fd745e181ba8f1f5a6ed002a04d253a78d4a), [`0851d5f9`](https://github.com/graphql/graphiql/commit/0851d5f9ecf709597d0a698609d88f99c4395665), [`83364b28`](https://github.com/graphql/graphiql/commit/83364b28020b5946ed58908d6d977f1de766e75d), [`3a7d0007`](https://github.com/graphql/graphiql/commit/3a7d00071922e2005777c92daf6ad0c1ce3e2816)]:\n  - @graphiql/react@0.15.0\n\n## 2.1.0\n\n### Minor Changes\n\n- [#2821](https://github.com/graphql/graphiql/pull/2821) [`29630c22`](https://github.com/graphql/graphiql/commit/29630c2219bca8b825ab0897840864364a9de2e8) Thanks [@avaly](https://github.com/avaly)! - Initial tabs support\n\n### Patch Changes\n\n- [#2885](https://github.com/graphql/graphiql/pull/2885) [`8f926489`](https://github.com/graphql/graphiql/commit/8f9264896e9971951853463a283a90ba3d1310ef) Thanks [@simhnna](https://github.com/simhnna)! - Fix stop execution button showing a dropdown\n\n- [#2886](https://github.com/graphql/graphiql/pull/2886) [`2ba2f620`](https://github.com/graphql/graphiql/commit/2ba2f620b6e7de3ae6b5ea641f33e600f7f44e08) Thanks [@B2o5T](https://github.com/B2o5T)! - feat: add `defaultHeaders` prop\n\n- Updated dependencies [[`29630c22`](https://github.com/graphql/graphiql/commit/29630c2219bca8b825ab0897840864364a9de2e8), [`8f926489`](https://github.com/graphql/graphiql/commit/8f9264896e9971951853463a283a90ba3d1310ef), [`2ba2f620`](https://github.com/graphql/graphiql/commit/2ba2f620b6e7de3ae6b5ea641f33e600f7f44e08)]:\n  - @graphiql/react@0.14.0\n\n## 2.0.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.13.7\n\n## 2.0.12\n\n### Patch Changes\n\n- [#2758](https://github.com/graphql/graphiql/pull/2758) [`d63801fa`](https://github.com/graphql/graphiql/commit/d63801fad08e840eff7ff26f55694c6d18769466) Thanks [@LekoArts](https://github.com/LekoArts)! - Fix the width of the plugin pane\n\n- Updated dependencies []:\n  - @graphiql/react@0.13.6\n\n## 2.0.11\n\n### Patch Changes\n\n- Updated dependencies [[`682ad06e`](https://github.com/graphql/graphiql/commit/682ad06e58ded2f82fa973e8e6613dd654417fe2)]:\n  - @graphiql/react@0.13.5\n\n## 2.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`4e2f7ff9`](https://github.com/graphql/graphiql/commit/4e2f7ff99c578ceae54a1ae17c02088bd91b89c3)]:\n  - @graphiql/react@0.13.4\n\n## 2.0.9\n\n### Patch Changes\n\n- [#2778](https://github.com/graphql/graphiql/pull/2778) [`905f2e5e`](https://github.com/graphql/graphiql/commit/905f2e5ea3f0b304d27ea583e250ed4baff5016e) Thanks [@jonathanawesome](https://github.com/jonathanawesome)! - Adds a box-model reset for all children of the `.graphiql-container` class. This change facilitated another change to the `--sidebar-width` variable.\n\n- Updated dependencies [[`42700076`](https://github.com/graphql/graphiql/commit/4270007671ce52f6c2250739916083611748b657), [`36839800`](https://github.com/graphql/graphiql/commit/36839800de128b05d11c262036c8240390c72a14), [`905f2e5e`](https://github.com/graphql/graphiql/commit/905f2e5ea3f0b304d27ea583e250ed4baff5016e)]:\n  - @graphiql/react@0.13.3\n\n## 2.0.8\n\n### Patch Changes\n\n- [#2653](https://github.com/graphql/graphiql/pull/2653) [`39b4668d`](https://github.com/graphql/graphiql/commit/39b4668d43176526d37ecf07d8c86901d53e0d80) Thanks [@dylanowen](https://github.com/dylanowen)! - Fix `fetchError` not being cleared when a new `fetcher` is used\n\n- Updated dependencies [[`39b4668d`](https://github.com/graphql/graphiql/commit/39b4668d43176526d37ecf07d8c86901d53e0d80)]:\n  - @graphiql/react@0.13.2\n\n## 2.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`e244b782`](https://github.com/graphql/graphiql/commit/e244b78291c2e2bb02d5753db82437926ebb4df4)]:\n  - @graphiql/toolkit@0.8.0\n  - @graphiql/react@0.13.1\n\n## 2.0.6\n\n### Patch Changes\n\n- [#2735](https://github.com/graphql/graphiql/pull/2735) [`ca067d88`](https://github.com/graphql/graphiql/commit/ca067d88148c5d221d196790a997ad599038fad1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Use the new CSS variables for color alpha values defined in `@graphiql/react` in style definitions\n\n- Updated dependencies [[`ca067d88`](https://github.com/graphql/graphiql/commit/ca067d88148c5d221d196790a997ad599038fad1), [`674bf3f8`](https://github.com/graphql/graphiql/commit/674bf3f8ff321dfb8471b0f6e5419bb77ddc94af), [`32a70065`](https://github.com/graphql/graphiql/commit/32a70065434eaa7733e28cda0ea0e7d51952e62a)]:\n  - @graphiql/react@0.13.0\n  - @graphiql/toolkit@0.7.3\n\n## 2.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`bfa90f24`](https://github.com/graphql/graphiql/commit/bfa90f249be4f68049c1bb81abfb524ae623313f), [`8ab5fcd0`](https://github.com/graphql/graphiql/commit/8ab5fcd0a8399a0f8eb1b569751dd0e8390b9679)]:\n  - @graphiql/toolkit@0.7.2\n  - @graphiql/react@0.12.1\n\n## 2.0.4\n\n### Patch Changes\n\n- [#2745](https://github.com/graphql/graphiql/pull/2745) [`92a17490`](https://github.com/graphql/graphiql/commit/92a17490c3842b4f83ed1065b73a803f73d02a17) Thanks [@acao](https://github.com/acao)! - Specify MIT license for `@graphiql/plugin-explorer` `package.json`\n\n* [#2741](https://github.com/graphql/graphiql/pull/2741) [`0219eef3`](https://github.com/graphql/graphiql/commit/0219eef39146495749aca2487112db52fa3bb8fd) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Improved sizing of button for adding tabs\n\n- [#2746](https://github.com/graphql/graphiql/pull/2746) [`6f0fa98e`](https://github.com/graphql/graphiql/commit/6f0fa98eadf897c7eaf8eb89e49c46880d381033) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix CodeMirror editors overlapping other parts of the UI on certain browser-OS-combinations (e.g. Chrome on Windows)\n\n- Updated dependencies [[`98e14155`](https://github.com/graphql/graphiql/commit/98e14155c650ee7c5ac639e594eb47f0052b7fa9), [`48872a87`](https://github.com/graphql/graphiql/commit/48872a87e6edec0c301102baaf669ffcce043a13), [`7dfea94a`](https://github.com/graphql/graphiql/commit/7dfea94afc0cfe79b5080f10d840bfdce53f02d7), [`3aa1f39f`](https://github.com/graphql/graphiql/commit/3aa1f39f6df559b54f703937ed510c8ba1f21058), [`0219eef3`](https://github.com/graphql/graphiql/commit/0219eef39146495749aca2487112db52fa3bb8fd)]:\n  - @graphiql/react@0.12.0\n  - @graphiql/toolkit@0.7.1\n\n## 2.0.3\n\n### Patch Changes\n\n- [#2706](https://github.com/graphql/graphiql/pull/2706) [`ff20a381`](https://github.com/graphql/graphiql/commit/ff20a3818f10f648d7b8c18229138b0424b8b25c) Thanks [@mxstbr](https://github.com/mxstbr)! - Wrap the GraphiQL logo with a link to the repository\n\n* [#2715](https://github.com/graphql/graphiql/pull/2715) [`c922719e`](https://github.com/graphql/graphiql/commit/c922719e6b960776cd0a71f14d2b86c6bb69373c) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add the contents of `graphql` and `@graphiql/react` as static properties to the `GraphiQL` component in CDN bundles so that these modules can be reused from plugin CDN bundles.\n\n## 2.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`d65f00ea`](https://github.com/graphql/graphiql/commit/d65f00ea2d158cf532d1c71844630c5d9ec13410), [`f15ee38d`](https://github.com/graphql/graphiql/commit/f15ee38d56e4f749c145e0a17f0ed8e9a6096ac2), [`d65f00ea`](https://github.com/graphql/graphiql/commit/d65f00ea2d158cf532d1c71844630c5d9ec13410)]:\n  - @graphiql/react@0.11.1\n\n## 2.0.1\n\n### Patch Changes\n\n- [#2699](https://github.com/graphql/graphiql/pull/2699) [`3b642aa3`](https://github.com/graphql/graphiql/commit/3b642aa31b306994e3052bb2454933307aa51426) Thanks [@patrick91](https://github.com/patrick91)! - Export hooks in CDN bundle\n\n* [#2700](https://github.com/graphql/graphiql/pull/2700) [`3acacf5b`](https://github.com/graphql/graphiql/commit/3acacf5b90040bbede30ad1a778e06bc969a5900) Thanks [@patrick91](https://github.com/patrick91)! - Fix cannot access `initialHeaders` before initialization\n\n## 2.0.0\n\n### Major Changes\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The `GraphiQL` component does no longer set a property `g` on the `window` object.\n\n* [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: Implement a new design for the GraphiQL UI. This changes both DOM structure and class names. We consider this a breaking change as custom GraphQL IDEs built on top of GraphiQL relied on these internals, e.g. overriding styles using certain class names.\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The following static properties of the `GraphiQL` component have been removed:\n  - `GraphiQL.formatResult`: You can use the function `formatResult` from `@graphiql/toolkit` instead.\n  - `GraphiQL.formatError`: You can use the function `formatError` from `@graphiql/toolkit` instead.\n  - `GraphiQL.QueryEditor`: You can use the `QueryEditor` component from `@graphiql/react` instead.\n  - `GraphiQL.VariableEditor`: You can use the `VariableEditor` component from `@graphiql/react` instead.\n  - `GraphiQL.HeaderEditor`: You can use the `HeaderEditor` component from `@graphiql/react` instead.\n  - `GraphiQL.ResultViewer`: You can use the `ResponseEditor` component from `@graphiql/react` instead.\n  - `GraphiQL.Button`: You can use the `ToolbarButton` component from `@graphiql/react` instead.\n  - `GraphiQL.ToolbarButton`: This exposed the same component as `GraphiQL.Button`.\n  - `GraphiQL.Menu`: You can use the `ToolbarMenu` component from `@graphiql/react` instead.\n  - `GraphiQL.MenuItem`: You can use the `ToolbarMenu.Item` component from `@graphiql/react` instead.\n  - `GraphiQL.Group`: Grouping multiple buttons side-by-side is not provided out-of-the box anymore in the new GraphiQL UI. If you want to implement a similar feature in the new vertical toolbar you can do so by adding your own styles for your custom toolbar elements. Example:\n    ```jsx\n    import { GraphiQL } from 'graphiql';\n    function CustomGraphiQL() {\n      return (\n        <GraphiQL>\n          <GraphiQL.Toolbar>\n            {/* Add custom styles for your buttons using the given class */}\n            <div className=\"button-group\">\n              <button>1</button>\n              <button>2</button>\n              <button>3</button>\n            </div>\n          </GraphiQL.Toolbar>\n        </GraphiQL>\n      );\n    }\n    ```\n\n* [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The following exports of the `graphiql` package have been removed:\n  - `DocExplorer`: Now exported from `@graphiql/react` as `DocExplorer`\n    - The `schema` prop has been removed, the component now uses the schema provided by the `ExplorerContext`\n  - `fillLeafs`: Now exported from `@graphiql/toolkit` as `fillLeafs`\n  - `getSelectedOperationName`: Now exported from `@graphiql/toolkit` as `getSelectedOperationName`\n  - `mergeAst`: Now exported from `@graphiql/toolkit` as `mergeAst`\n  - `onHasCompletion`: Now exported from `@graphiql/react` as `onHasCompletion`\n  - `QueryEditor`: Now exported from `@graphiql/react` as `QueryEditor`\n  - `ToolbarMenu`: Now exported from `@graphiql/react` as `ToolbarMenu`\n  - `ToolbarMenuItem`: Now exported from `@graphiql/react` as `ToolbarMenu.Item`\n  - `ToolbarSelect`: Now exported from `@graphiql/react` as `ToolbarListbox`\n  - `ToolbarSelectOption`: Now exported from `@graphiql/react` as `ToolbarListbox.Option`\n  - `VariableEditor`: Now exported from `@graphiql/react` as `VariableEditor`\n  - type `Fetcher`: Now exported from `@graphiql/toolkit`\n  - type `FetcherOpts`: Now exported from `@graphiql/toolkit`\n  - type `FetcherParams`: Now exported from `@graphiql/toolkit`\n  - type `FetcherResult`: Now exported from `@graphiql/toolkit`\n  - type `FetcherReturnType`: Now exported from `@graphiql/toolkit`\n  - type `Observable`: Now exported from `@graphiql/toolkit`\n  - type `Storage`: Now exported from `@graphiql/toolkit`\n  - type `SyncFetcherResult`: Now exported from `@graphiql/toolkit`\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The `GraphiQL` component has been refactored to be a function component. Attaching a ref to this component will no longer provide access to props, state or class methods. In order to interact with or change `GraphiQL` state you need to use the contexts and hooks provided by the `@graphiql/react` package. More details and examples can be found in the migration guide.\n\n* [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The following props of the `GraphiQL` component have been changed:\n  - The props `defaultVariableEditorOpen` and `defaultSecondaryEditorOpen` have been merged into one prop `defaultEditorToolsVisibility`. The default behavior if this prop is not passed is that the editor tools are shown if at least one of the secondary editors has contents. You can pass the following values to the prop:\n    - Passing `false` hides the editor tools.\n    - Passing `true` shows the editor tools.\n    - Passing `\"variables\"` explicitly shows the variables editor.\n    - Passing `\"headers\"` explicitly shows the headers editor.\n  - The props `docExplorerOpen`, `onToggleDocs` and `onToggleHistory` have been removed. They are replaced by the more generic props `visiblePlugin` (for controlling which plugin is visible) and `onTogglePluginVisibility` (which is called each time the visibility of any plugin changes).\n  - The `headerEditorEnabled` prop has been renamed to `isHeadersEditorEnabled`.\n  - The `ResultsTooltip` prop has been renamed to `responseTooltip`.\n  - Tabs are now always enabled. The `tabs` prop has therefore been replaced with a prop `onTabChange`. If you used the `tabs` prop before to pass this function you can change your implementation like so:\n    ```diff\n    <GraphiQL\n    -  tabs={{ onTabChange: (tabState) => {/* do something */} }}\n    +  onTabChange={(tabState) => {/* do something */}}\n    />\n    ```\n\n### Minor Changes\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - GraphiQL now ships with a dark theme. By default the interface respects the system settings, the theme can also be explicitly chosen via the new settings dialog.\n\n### Patch Changes\n\n- Updated dependencies [[`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279)]:\n  - @graphiql/react@0.11.0\n  - @graphiql/toolkit@0.7.0\n\n## 1.11.6\n\n### Patch Changes\n\n- Updated dependencies [[`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782)]:\n  - graphql-language-service@5.1.0\n  - @graphiql/react@0.10.1\n\n## 1.11.5\n\n### Patch Changes\n\n- [#2678](https://github.com/graphql/graphiql/pull/2678) [`b3470b99`](https://github.com/graphql/graphiql/commit/b3470b993bd4c1b90ab7831581de2021af1bb6b0) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add the attribute `type=\"button\"` to all buttons\n\n## 1.11.4\n\n### Patch Changes\n\n- Updated dependencies [[`85d5af25`](https://github.com/graphql/graphiql/commit/85d5af25d77c29b7d02da90a431c8c15f610c22a), [`6ff0bab9`](https://github.com/graphql/graphiql/commit/6ff0bab978d63778b8ab4ba6e79fceb36c2db87f), [`0aff68a6`](https://github.com/graphql/graphiql/commit/0aff68a645cceb6b9689e0f394e8bece01710efc)]:\n  - @graphiql/react@0.10.0\n\n## 1.11.3\n\n### Patch Changes\n\n- [#2642](https://github.com/graphql/graphiql/pull/2642) [`100af928`](https://github.com/graphql/graphiql/commit/100af9284de18ca89524c646e86854313c5d067b) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix controlling the operation name sent with the request using the `operationName` prop\n\n- Updated dependencies [[`100af928`](https://github.com/graphql/graphiql/commit/100af9284de18ca89524c646e86854313c5d067b), [`100af928`](https://github.com/graphql/graphiql/commit/100af9284de18ca89524c646e86854313c5d067b)]:\n  - @graphiql/react@0.9.0\n\n## 1.11.2\n\n### Patch Changes\n\n- Updated dependencies [[`62317e0b`](https://github.com/graphql/graphiql/commit/62317e0bae6d4ccf89d9e1e6607fd8feeb100078)]:\n  - @graphiql/react@0.8.0\n\n## 1.11.1\n\n### Patch Changes\n\n- Updated dependencies [[`ea732ea8`](https://github.com/graphql/graphiql/commit/ea732ea8e12272c998f1467af8b3b88b6b508e12)]:\n  - @graphiql/toolkit@0.6.1\n  - @graphiql/react@0.7.1\n\n## 1.11.0\n\n### Minor Changes\n\n- [#2618](https://github.com/graphql/graphiql/pull/2618) [`4c814506`](https://github.com/graphql/graphiql/commit/4c814506183579b78731659d871cd4b0ba93305a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a toolbar button for manually triggering introspection\n\n### Patch Changes\n\n- Updated dependencies [[`4c814506`](https://github.com/graphql/graphiql/commit/4c814506183579b78731659d871cd4b0ba93305a)]:\n  - @graphiql/react@0.7.0\n\n## 1.10.0\n\n### Minor Changes\n\n- [#2574](https://github.com/graphql/graphiql/pull/2574) [`0c98fa59`](https://github.com/graphql/graphiql/commit/0c98fa5924eadaee33713ccd8a9be6419d50cab1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Allow passing introspection data to the `schema` prop of the `GraphiQL` component\n\n### Patch Changes\n\n- Updated dependencies [[`0c98fa59`](https://github.com/graphql/graphiql/commit/0c98fa5924eadaee33713ccd8a9be6419d50cab1), [`0c98fa59`](https://github.com/graphql/graphiql/commit/0c98fa5924eadaee33713ccd8a9be6419d50cab1)]:\n  - @graphiql/react@0.6.0\n\n## 1.9.13\n\n### Patch Changes\n\n- Updated dependencies [[`f581b437`](https://github.com/graphql/graphiql/commit/f581b437e5bdab6f3ad817d230ee6d1b410bb591)]:\n  - @graphiql/react@0.5.2\n\n## 1.9.12\n\n### Patch Changes\n\n- Updated dependencies [[`08346cba`](https://github.com/graphql/graphiql/commit/08346cba136825341881f9dfefc62a60d748e0ee)]:\n  - @graphiql/react@0.5.1\n\n## 1.9.11\n\n### Patch Changes\n\n- [#2541](https://github.com/graphql/graphiql/pull/2541) [`788d84ef`](https://github.com/graphql/graphiql/commit/788d84ef2784188981f1b4cfb78fba24153bf0cb) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix the `onSchemaChange` prop, it is now again called after the schema is fetched (this was broken since v1.9.3)\n\n- Updated dependencies [[`8ce5b483`](https://github.com/graphql/graphiql/commit/8ce5b483ee190b5f5dd84eaf42e5d1359ce185e6), [`788d84ef`](https://github.com/graphql/graphiql/commit/788d84ef2784188981f1b4cfb78fba24153bf0cb)]:\n  - @graphiql/react@0.5.0\n\n## 1.9.10\n\n### Patch Changes\n\n- Updated dependencies [[`26e44120`](https://github.com/graphql/graphiql/commit/26e44120a18d49af451c97619fe3386a65579e05)]:\n  - @graphiql/react@0.4.3\n\n## 1.9.9\n\n### Patch Changes\n\n- [#2501](https://github.com/graphql/graphiql/pull/2501) [`5437ee61`](https://github.com/graphql/graphiql/commit/5437ee61e1ba6cd28ccc1cb3543df1ea788278f4) Thanks [@acao](https://github.com/acao)! - Allow Codemirror 5 `keyMap` to be defined, default `vim` or `emacs` allowed in addition to the original default of `sublime`.\n\n- Updated dependencies [[`5437ee61`](https://github.com/graphql/graphiql/commit/5437ee61e1ba6cd28ccc1cb3543df1ea788278f4), [`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - @graphiql/react@0.4.2\n  - graphql-language-service@5.0.6\n\n## 1.9.8\n\n### Patch Changes\n\n- [#2499](https://github.com/graphql/graphiql/pull/2499) [`731b3b72`](https://github.com/graphql/graphiql/commit/731b3b72e9f087a3b429ef5e8143219a0dcf7f00) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - fix the default value for the `headerEditorEnabled` prop to be `true`\n\n## 1.9.7\n\n### Patch Changes\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service@5.0.5\n  - @graphiql/react@0.4.1\n\n## 1.9.6\n\n### Patch Changes\n\n- [#2475](https://github.com/graphql/graphiql/pull/2475) [`d6558e43`](https://github.com/graphql/graphiql/commit/d6558e43bd24a3af7c5f78dbae572bd8ca7b3995) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix using the `GraphiQL` export as type by exporting a class again\n\n* [#2461](https://github.com/graphql/graphiql/pull/2461) [`7dfe3ece`](https://github.com/graphql/graphiql/commit/7dfe3ece4e8ab6b3400888f7f357e394db63439d) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Use the `useDragResize` hook from `@graphiql/react` for the sizing of the editors and the docs explorer\n\n* Updated dependencies [[`7dfe3ece`](https://github.com/graphql/graphiql/commit/7dfe3ece4e8ab6b3400888f7f357e394db63439d)]:\n  - @graphiql/react@0.4.0\n\n## 1.9.5\n\n### Patch Changes\n\n- [#2453](https://github.com/graphql/graphiql/pull/2453) [`1b41e33c`](https://github.com/graphql/graphiql/commit/1b41e33c4a871a345836de58f415b7c461ced1f8) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add execution context to `@graphiql/react` and move over the logic from `graphiql`\n\n* [#2454](https://github.com/graphql/graphiql/pull/2454) [`a53bec64`](https://github.com/graphql/graphiql/commit/a53bec64b511fca2da828d7c0ff100e3a110aec1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Deprecate the public methods `getQueryEditor`, `getVariableEditor`, `getHeaderEditor`, and `refresh` on the `GraphiQL` class.\n\n- [#2451](https://github.com/graphql/graphiql/pull/2451) [`0659e96e`](https://github.com/graphql/graphiql/commit/0659e96e07f98d532619f29f52cba59e2d528327) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Always use the current value of the headers for the introspection request\n\n* [#2452](https://github.com/graphql/graphiql/pull/2452) [`ee0fd8bf`](https://github.com/graphql/graphiql/commit/ee0fd8bf4042053ec647080b83656dc5e54a7239) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move tab state from `graphiql` into editor context from `@graphiql/react`\n\n- [#2454](https://github.com/graphql/graphiql/pull/2454) [`a53bec64`](https://github.com/graphql/graphiql/commit/a53bec64b511fca2da828d7c0ff100e3a110aec1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Continue forwarding the ref to the class component to not break public methods\n\n* [#2449](https://github.com/graphql/graphiql/pull/2449) [`a0b02eda`](https://github.com/graphql/graphiql/commit/a0b02edaa629c6113c1c5518fd3aa05b355a1921) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Assume all context values are nullable and create hooks to consume individual contexts\n\n- [#2450](https://github.com/graphql/graphiql/pull/2450) [`1e6fc68b`](https://github.com/graphql/graphiql/commit/1e6fc68b73941544ee64e0499e459f9c7d39aa14) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Extract the `copy`, `merge`, `prettify`, and `autoCompleteLeafs` functions into hooks and remove these functions from the editor context value\n\n- Updated dependencies [[`1b41e33c`](https://github.com/graphql/graphiql/commit/1b41e33c4a871a345836de58f415b7c461ced1f8), [`0659e96e`](https://github.com/graphql/graphiql/commit/0659e96e07f98d532619f29f52cba59e2d528327), [`ee0fd8bf`](https://github.com/graphql/graphiql/commit/ee0fd8bf4042053ec647080b83656dc5e54a7239), [`a0b02eda`](https://github.com/graphql/graphiql/commit/a0b02edaa629c6113c1c5518fd3aa05b355a1921), [`1e6fc68b`](https://github.com/graphql/graphiql/commit/1e6fc68b73941544ee64e0499e459f9c7d39aa14)]:\n  - @graphiql/react@0.3.0\n\n## 1.9.4\n\n### Patch Changes\n\n- [#2437](https://github.com/graphql/graphiql/pull/2437) [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move prettify query functionality to editor context in `@graphiql/react`\n\n* [#2435](https://github.com/graphql/graphiql/pull/2435) [`89f0244f`](https://github.com/graphql/graphiql/commit/89f0244f7b7cdf01c168638a09f5137788401995) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic for deriving operation facts from the current query to `@graphiql/react` and store these facts as properties on the query editor instance\n\n- [#2437](https://github.com/graphql/graphiql/pull/2437) [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move copy query functionality to editor context in `@graphiql/react`\n\n* [#2437](https://github.com/graphql/graphiql/pull/2437) [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move merge query functionality to editor context in `@graphiql/react`\n\n- [#2436](https://github.com/graphql/graphiql/pull/2436) [`3e5295f0`](https://github.com/graphql/graphiql/commit/3e5295f0fd3b5f999643ea97e6cee706554f0b50) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Inline logic for clicking a reference to open the docs and remove the `onClickReference` and `onHintInformationRender` props of the editor components and hooks\n\n* [#2436](https://github.com/graphql/graphiql/pull/2436) [`3e5295f0`](https://github.com/graphql/graphiql/commit/3e5295f0fd3b5f999643ea97e6cee706554f0b50) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move visibility state for doc explorer from `graphiql` to the explorer context in `@graphiql/react`\n\n* Updated dependencies [[`89f0244f`](https://github.com/graphql/graphiql/commit/89f0244f7b7cdf01c168638a09f5137788401995), [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789), [`89f0244f`](https://github.com/graphql/graphiql/commit/89f0244f7b7cdf01c168638a09f5137788401995), [`3dae62fc`](https://github.com/graphql/graphiql/commit/3dae62fc871385e148a799cde55a52a5e6b41d19), [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789), [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789), [`3e5295f0`](https://github.com/graphql/graphiql/commit/3e5295f0fd3b5f999643ea97e6cee706554f0b50), [`3e5295f0`](https://github.com/graphql/graphiql/commit/3e5295f0fd3b5f999643ea97e6cee706554f0b50)]:\n  - @graphiql/react@0.2.1\n\n## 1.9.3\n\n### Patch Changes\n\n- [#2419](https://github.com/graphql/graphiql/pull/2419) [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the `fillLeafs` utility function from `graphiql` into `@graphiql/toolkit` and deprecate the export from `graphiql`\n\n* [#2413](https://github.com/graphql/graphiql/pull/2413) [`8be164b1`](https://github.com/graphql/graphiql/commit/8be164b1e158d00752d6d3f30630a797d07d08c9) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a `StorageContext` and a `HistoryContext` to `@graphiql/react` that replaces the logic in the `graphiql` package\n\n- [#2419](https://github.com/graphql/graphiql/pull/2419) [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the `mergeAst` utility function from `graphiql` into `@graphiql/toolkit` and deprecate the export from `graphiql`\n\n* [#2420](https://github.com/graphql/graphiql/pull/2420) [`3467cd33`](https://github.com/graphql/graphiql/commit/3467cd33264e0766a0a43cf53e52ec371df26962) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix sending multiple introspection requests when loading the page\n\n- [#2420](https://github.com/graphql/graphiql/pull/2420) [`3467cd33`](https://github.com/graphql/graphiql/commit/3467cd33264e0766a0a43cf53e52ec371df26962) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Deprecate the `autoCompleteLeafs` method of the `GraphiQL` component in favor of the function provided by the `EditorContext` from `@graphiql/react`\n\n* [#2420](https://github.com/graphql/graphiql/pull/2420) [`3467cd33`](https://github.com/graphql/graphiql/commit/3467cd33264e0766a0a43cf53e52ec371df26962) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a `SchemaContext` to `@graphiql/react` that replaces the logic for fetching and validating the schema in the `graphiql` package\n\n- [#2419](https://github.com/graphql/graphiql/pull/2419) [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the `getSelectedOperationName` utility function from `graphiql` into `@graphiql/toolkit` and deprecate the export from `graphiql`\n\n- Updated dependencies [[`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e), [`8be164b1`](https://github.com/graphql/graphiql/commit/8be164b1e158d00752d6d3f30630a797d07d08c9), [`8be164b1`](https://github.com/graphql/graphiql/commit/8be164b1e158d00752d6d3f30630a797d07d08c9), [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e), [`3467cd33`](https://github.com/graphql/graphiql/commit/3467cd33264e0766a0a43cf53e52ec371df26962), [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e)]:\n  - @graphiql/toolkit@0.6.0\n  - @graphiql/react@0.2.0\n\n## 1.9.2\n\n### Patch Changes\n\n- Updated dependencies [[`ebc864f0`](https://github.com/graphql/graphiql/commit/ebc864f0ab05000758cb2898daaa73a2f15255ec), [`ebc864f0`](https://github.com/graphql/graphiql/commit/ebc864f0ab05000758cb2898daaa73a2f15255ec)]:\n  - @graphiql/react@0.1.2\n\n## 1.9.1\n\n### Patch Changes\n\n- [#2423](https://github.com/graphql/graphiql/pull/2423) [`838e58da`](https://github.com/graphql/graphiql/commit/838e58dad652d8f5559af7b88d049b1c62348f2f) Thanks [@chentsulin](https://github.com/chentsulin)! - Fix peer dependency declaration by using `||` instead of `|` to link multiple major versions\n\n- Updated dependencies [[`838e58da`](https://github.com/graphql/graphiql/commit/838e58dad652d8f5559af7b88d049b1c62348f2f)]:\n  - @graphiql/react@0.1.1\n\n## 1.9.0\n\n### Minor Changes\n\n- [#2412](https://github.com/graphql/graphiql/pull/2412) [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move QueryStore from `graphiql` package to `@graphiql/toolkit`\n\n* [#2412](https://github.com/graphql/graphiql/pull/2412) [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move HistoryStore from `graphiql` package to `@graphiql/toolkit`\n\n- [#2409](https://github.com/graphql/graphiql/pull/2409) [`f2025ba0`](https://github.com/graphql/graphiql/commit/f2025ba06c5aa8e8ac68d29538ff135f3efc8e46) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic of the variable editor from the `graphiql` package into a hook `useVariableEditor` provided by `@graphiql/react`\n\n* [#2408](https://github.com/graphql/graphiql/pull/2408) [`d825bb75`](https://github.com/graphql/graphiql/commit/d825bb7569ca6b1ebbe534b893354645c790e003) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic of the query editor from the `graphiql` package into a hook `useQueryEditor` provided by `@graphiql/react`\n\n- [#2411](https://github.com/graphql/graphiql/pull/2411) [`ad448693`](https://github.com/graphql/graphiql/commit/ad4486934ba69247efd33ee500e30f8236ecd079) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic of the result viewer from the `graphiql` package into a hook `useResponseEditor` provided by `@graphiql/react`\n\n* [#2370](https://github.com/graphql/graphiql/pull/2370) [`7f695b10`](https://github.com/graphql/graphiql/commit/7f695b104f9b25ba8c6d36f7827c475b297b7482) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Include the context provider for the explorer from `@graphiql/react` and replace the local state for the nav stack of the docs with methods provided by hooks from `@graphiql/react`.\n\n- [#2412](https://github.com/graphql/graphiql/pull/2412) [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move StorageAPI from `graphiql` package to `@graphiql/toolkit`\n\n* [#2404](https://github.com/graphql/graphiql/pull/2404) [`029ddf82`](https://github.com/graphql/graphiql/commit/029ddf82c29754ab8518ae7df66f9b25361a8247) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a context provider for editors and move the logic of the headers editor from the `graphiql` package into a hook `useHeaderEditor` provided by `@graphiql/react`\n\n### Patch Changes\n\n- [#2418](https://github.com/graphql/graphiql/pull/2418) [`6d7fb6e6`](https://github.com/graphql/graphiql/commit/6d7fb6e6fa4734e2274d8875971613a8254674e3) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix persisting headers in tab state and avoid opening duplicate tabs when reloading\n\n- Updated dependencies [[`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29), [`bc3dc64c`](https://github.com/graphql/graphiql/commit/bc3dc64c37478ba6170c49c25fb755b4f2e020b2), [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29), [`f2025ba0`](https://github.com/graphql/graphiql/commit/f2025ba06c5aa8e8ac68d29538ff135f3efc8e46), [`d825bb75`](https://github.com/graphql/graphiql/commit/d825bb7569ca6b1ebbe534b893354645c790e003), [`ad448693`](https://github.com/graphql/graphiql/commit/ad4486934ba69247efd33ee500e30f8236ecd079), [`7f695b10`](https://github.com/graphql/graphiql/commit/7f695b104f9b25ba8c6d36f7827c475b297b7482), [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29), [`029ddf82`](https://github.com/graphql/graphiql/commit/029ddf82c29754ab8518ae7df66f9b25361a8247)]:\n  - @graphiql/toolkit@0.5.0\n  - @graphiql/react@0.1.0\n\n## 1.8.10\n\n### Patch Changes\n\n- [#2397](https://github.com/graphql/graphiql/pull/2397) [`a63ff958`](https://github.com/graphql/graphiql/commit/a63ff958838cf4fcf31f7eaa3e3b022d02838f65) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - upgrade to React v17\n\n* [#2401](https://github.com/graphql/graphiql/pull/2401) [`60a744b1`](https://github.com/graphql/graphiql/commit/60a744b1d73d1021afb7abeea1573f26178102b5) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - move async helper functions and formatting functions over into the @graphiql/toolkit package\n\n* Updated dependencies [[`60a744b1`](https://github.com/graphql/graphiql/commit/60a744b1d73d1021afb7abeea1573f26178102b5), [`60a744b1`](https://github.com/graphql/graphiql/commit/60a744b1d73d1021afb7abeea1573f26178102b5)]:\n  - @graphiql/toolkit@0.4.5\n\n## 1.8.9\n\n### Patch Changes\n\n- [#2387](https://github.com/graphql/graphiql/pull/2387) [`e823697b`](https://github.com/graphql/graphiql/commit/e823697b5d47565671d5919be84f69919e70977f) Thanks [@benjie](https://github.com/benjie)! - Add 'children' type definition to various component props\n\n* [#2388](https://github.com/graphql/graphiql/pull/2388) [`d3ae074c`](https://github.com/graphql/graphiql/commit/d3ae074c9b9dae6ed4f69b0a79efaa0353dcea2d) Thanks [@benjie](https://github.com/benjie)! - Add 'pointer-events: none' to SVG style for dropdown arrow in GraphiQL.Menu component\n\n- [#2373](https://github.com/graphql/graphiql/pull/2373) [`5b2c1b20`](https://github.com/graphql/graphiql/commit/5b2c1b2054a70e8dca173f380f44766438cb5597) Thanks [@benjie](https://github.com/benjie)! - Fix TypeScript definition of FetcherParams to reflect that operationName is optional\n\n- Updated dependencies [[`5b2c1b20`](https://github.com/graphql/graphiql/commit/5b2c1b2054a70e8dca173f380f44766438cb5597)]:\n  - @graphiql/toolkit@0.4.4\n\n## 1.8.8\n\n### Patch Changes\n\n- Updated dependencies [[`2dec55f2`](https://github.com/graphql/graphiql/commit/2dec55f2c5e979cc7bb1adadff4fb063775b088c), [`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2)]:\n  - codemirror-graphql@1.3.0\n  - graphql-language-service@5.0.4\n\n## 1.8.7\n\n### Patch Changes\n\n- [#2316](https://github.com/graphql/graphiql/pull/2316) [`3d8510c8`](https://github.com/graphql/graphiql/commit/3d8510c87b9f0cc73f747ed4cd88e112f9fe65f7) Thanks [@AlirezaHaghshenas](https://github.com/AlirezaHaghshenas)! - Fix: With tabs enabled, if a subscription is restored from storage, a query request is sent instead\n\n## 1.8.6\n\n### Patch Changes\n\n- [#2312](https://github.com/graphql/graphiql/pull/2312) [`3c97cf63`](https://github.com/graphql/graphiql/commit/3c97cf63f0d6a8c27265905af1a2da243925ff01) Thanks [@AlirezaHaghshenas](https://github.com/AlirezaHaghshenas)! - Fix: After changing to a tab with a subscription, graphiql sends a query request\n\n- Updated dependencies [[`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902)]:\n  - graphql-language-service@5.0.3\n  - codemirror-graphql@1.2.17\n\n## 1.8.5\n\n### Patch Changes\n\n- Updated dependencies [[`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f)]:\n  - graphql-language-service@5.0.2\n  - codemirror-graphql@1.2.16\n\n## 1.8.4\n\n### Patch Changes\n\n- [#2274](https://github.com/graphql/graphiql/pull/2274) [`12950380`](https://github.com/graphql/graphiql/commit/12950380e92c38f6eec23499e7fca5dc9dcd8216) Thanks [@B2o5T](https://github.com/B2o5T)! - turn `valid-typeof` as `error`, SSR fix\n\n- Updated dependencies [[`12950380`](https://github.com/graphql/graphiql/commit/12950380e92c38f6eec23499e7fca5dc9dcd8216)]:\n  - @graphiql/toolkit@0.4.3\n\n## 1.8.3\n\n### Patch Changes\n\n- [#2268](https://github.com/graphql/graphiql/pull/2268) [`b1886822`](https://github.com/graphql/graphiql/commit/b188682296ee04a87fbf09dc51385f127bffcec0) Thanks [@acao](https://github.com/acao)! - remove dependency on `global` for esbuild/etc users!\n\n* [#2265](https://github.com/graphql/graphiql/pull/2265) [`9458e10b`](https://github.com/graphql/graphiql/commit/9458e10ba24a6c919142ea1cebb409c7d055baf9) Thanks [@acao](https://github.com/acao)! - fix `codemirror` import bug for `onHasCompletion` for #2263. for esm/cjs users on autocomplete (umd bundle users not impacted)\n\n## 1.8.2\n\n### Patch Changes\n\n- Updated dependencies [[`261f2044`](https://github.com/graphql/graphiql/commit/261f2044066412e40f9962bef55295f7c9c35aec)]:\n  - codemirror-graphql@1.2.15\n\n## 1.8.1\n\n### Patch Changes\n\n- [#2257](https://github.com/graphql/graphiql/pull/2257) [`6cc95851`](https://github.com/graphql/graphiql/commit/6cc9585119f33ba80f960da310f7ef2747b7bc38) Thanks [@acao](https://github.com/acao)! - _security fix:_ replace the vulnerable `dset` dependency with `set-value`\n\n  `dset` is vulnerable to prototype pollution attacks. this is only possible if you are doing all of the following:\n\n  1. running graphiql with an experimental graphql-js release tag that supports @stream and @defer\n  2. executing a properly @streamed or @deferred query ala IncrementalDelivery spec, with multipart chunks\n  3. consuming a malicious schema that contains field names like proto, prototype, or constructor that return malicious data designed to exploit a prototype pollution attack\n\n## 1.8.0\n\n### Minor Changes\n\n- [#2197](https://github.com/graphql/graphiql/pull/2197) [`3137a6c4`](https://github.com/graphql/graphiql/commit/3137a6c4333dad8db8a0eb980d6c6464c7292946) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Now featuring: tabs! 🥳 🍾 just opt-in with new prop `<GraphiQL tabs />`. You can also both opt-in and provide a handler via `<GraphiQL tabs={{ onTabsChange }} />`!\n\n### Patch Changes\n\n- [#2249](https://github.com/graphql/graphiql/pull/2249) [`1540fd3d`](https://github.com/graphql/graphiql/commit/1540fd3d0df553798e41a153c5f0386d9d52be01) Thanks [@acao](https://github.com/acao)! - Finally remove inline `require()` for codemirror addon imports, replace with modern dynamic `import()` (which enables `esbuild`, `vite`, etc).\n\n  This change should allow your bundler to code split codemirror-graphql and the codemirror addons based on which you import. For SSR support, GraphiQL must load these modules dynamically.\n\n  If you want to use other codemirror addons (vim, etc) for non-ssr you can just import them top level, or for SSR, you can just dynamically import them.\n\n## 1.7.2\n\n### Patch Changes\n\n- Updated dependencies [[`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa), [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa)]:\n  - graphql-language-service@5.0.1\n  - codemirror-graphql@1.2.14\n\n## 1.7.1\n\n### Patch Changes\n\n- Updated dependencies [[`2502a364`](https://github.com/graphql/graphiql/commit/2502a364b74dc754d92baa1579b536cf42139958)]:\n  - graphql-language-service@5.0.0\n  - codemirror-graphql@1.2.13\n\n## 1.7.0\n\n### Minor Changes\n\n- [#2221](https://github.com/graphql/graphiql/pull/2221) [`64826c87`](https://github.com/graphql/graphiql/commit/64826c8776dfc8394a65c98663d47cc3c9d397b9) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - Fix to trigger codemirror update when externalFragments prop changes [#2220](https://github.com/graphql/graphiql/pull/2220)\n\n* [#2213](https://github.com/graphql/graphiql/pull/2213) [`ba85bc24`](https://github.com/graphql/graphiql/commit/ba85bc242b8271cbd09ade9d69a93d86e4e1a49f) Thanks [@hatappi](https://github.com/hatappi)! - remove IE7 CSS star property hack\n\n### Patch Changes\n\n- [#2205](https://github.com/graphql/graphiql/pull/2205) [`91500d4e`](https://github.com/graphql/graphiql/commit/91500d4eba8b99bf779ff6ac899c814070c6dff3) Thanks [@francisu](https://github.com/francisu)! - Fixed problem where 'global' variable is referenced when it might not be present (#2155)\n\n## 1.6.0\n\n### Minor Changes\n\n- [#2191](https://github.com/graphql/graphiql/pull/2191) [`eb8af7b5`](https://github.com/graphql/graphiql/commit/eb8af7b5666e7ed01497a862127011524fc400f5) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Allow inserting content before the topBar element via the `beforeTopBarContent` property.\n\n  ```jsx\n  <GraphiQL beforeTopBarContent={<SomeComponent />} />\n  ```\n\n* [#2189](https://github.com/graphql/graphiql/pull/2189) [`96d47267`](https://github.com/graphql/graphiql/commit/96d4726716b782fcafa9d6c1671f3a3050ebe0b7) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Apply variable editor title text styles via class `variable-editor-title-text` instead of using inline-styles. This allows better customization of styles. An active element also has the class `active`. This allows overriding the inactive state color using the selector `.graphiql-container .variable-editor-title-text` and overriding the active state color using the selector `.graphiql-container .variable-editor-title-text.active`.\n\n- [#2190](https://github.com/graphql/graphiql/pull/2190) [`d5179899`](https://github.com/graphql/graphiql/commit/d517989996cf6f33ef7e08d18a870e2bed565cca) Thanks [@n1ru4l](https://github.com/n1ru4l)! - New callback property `onSchemaChange` for `GraphiQL`.\n\n  The callback is invoked with the successfully fetched schema from the remote.\n\n  **Usage example:**\n\n  ```tsx\n  <GraphiQL onSchemaChange={schema => console.log(schema)} />\n  ```\n\n## 1.5.20\n\n### Patch Changes\n\n- Updated dependencies [[`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f), [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c), [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5)]:\n  - graphql-language-service@4.1.5\n  - codemirror-graphql@1.2.12\n\n## 1.5.19\n\n### Patch Changes\n\n- [#2167](https://github.com/graphql/graphiql/pull/2167) [`bc81f0ee`](https://github.com/graphql/graphiql/commit/bc81f0ee6d382fe996d92e55f90cdc3be10910a7) Thanks [@acao](https://github.com/acao)! - Fix legacy bug where global is expected\n\n## 1.5.18\n\n### Patch Changes\n\n- [#2156](https://github.com/graphql/graphiql/pull/2156) [`ae5ea77b`](https://github.com/graphql/graphiql/commit/ae5ea77b4c2ec2a25e25c542ae72b2c3dabbe256) Thanks [@francisu](https://github.com/francisu)! - Fixed problem where 'global' variable is referenced when it might not be present (#2155)\n\n## 1.5.17\n\n### Patch Changes\n\n- [#2138](https://github.com/graphql/graphiql/pull/2138) [`8700b4bb`](https://github.com/graphql/graphiql/commit/8700b4bbaadb17136f649f504c9575a8c853cd0b) Thanks [@danielleletarte](https://github.com/danielleletarte)! - Correctly render line breaks for Descriptions in Doc Explorer - #2137 - @danielleletarte\n\n## 1.5.16\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service@4.1.4\n  - codemirror-graphql@1.2.11\n\n## 1.5.15\n\n### Patch Changes\n\n- Updated dependencies [[`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8)]:\n  - graphql-language-service@4.1.3\n  - codemirror-graphql@1.2.10\n\n## 1.5.14\n\n### Patch Changes\n\n- Updated dependencies [[`e20760fb`](https://github.com/graphql/graphiql/commit/e20760fbd95c13d6d549cba3faa15a59aee9a2c0)]:\n  - graphql-language-service@4.1.2\n  - codemirror-graphql@1.2.9\n\n## 1.5.13\n\n### Patch Changes\n\n- [#2097](https://github.com/graphql/graphiql/pull/2097) [`4d3eeaa4`](https://github.com/graphql/graphiql/commit/4d3eeaa4446c84e92cd77f213e454059602a72e5) Thanks [@acao](https://github.com/acao)! - Disable introspection of schema.description by default\n\n## 1.5.12\n\n### Patch Changes\n\n- [#2091](https://github.com/graphql/graphiql/pull/2091) [`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63) Thanks [@acao](https://github.com/acao)! - Fix graphql 15 related issues. Should now build & test interchangeably.\n\n- Updated dependencies [[`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63)]:\n  - codemirror-graphql@1.2.8\n  - graphql-language-service@4.1.1\n\n## 1.5.11\n\n### Patch Changes\n\n- Updated dependencies [[`0f1f90ce`](https://github.com/graphql/graphiql/commit/0f1f90ce8f4a25ddebdaf7a9ddbe136214aa64a3)]:\n  - graphql-language-service@4.1.0\n  - codemirror-graphql@1.2.7\n\n## 1.5.10\n\n### Patch Changes\n\n- [#2087](https://github.com/graphql/graphiql/pull/2087) [`45a9075d`](https://github.com/graphql/graphiql/commit/45a9075d718046e0f17c930162fa9752dfe052ec) Thanks [@acao](https://github.com/acao)! - Fix issue with introspection in servers which don't support `inputValueDeprecation`. make `inputValueDeprecation` an opt-in prop for DocExplorer features\n\n## 1.5.9\n\n### Patch Changes\n\n- [#2077](https://github.com/graphql/graphiql/pull/2077) [`701ca13f`](https://github.com/graphql/graphiql/commit/701ca13f625735564d71931e6d917e5bf69c8aa5) Thanks [@acao](https://github.com/acao)! - Include schema description in DocExplorer for schema introspection requests. Enables the `schemaDescription` option for `getIntrospectionQuery()`. Also includes `deprecationReason` support in DocExplorer for arguments! Enables `inputValueDeprecation` in `getIntrospectionQuery()` and displays deprecation section on field doc view.\n- Updated dependencies [[`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3)]:\n  - graphql-language-service@4.0.0\n  - codemirror-graphql@1.2.6\n\n## 1.5.8\n\n### Patch Changes\n\n- Updated dependencies [[`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1)]:\n  - graphql-language-service@3.2.5\n  - codemirror-graphql@1.2.5\n\n## 1.5.7\n\n### Patch Changes\n\n- [`49bce429`](https://github.com/graphql/graphiql/commit/49bce429f0780a5e2856cfb7ccda50d10d38f724) [#2051](https://github.com/graphql/graphiql/pull/2051) Thanks [@willstott101](https://github.com/willstott101)! - Include source maps for minified JS and CSS in the graphiql package.\n\n## 1.5.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service@3.2.4\n  - codemirror-graphql@1.2.4\n\n## 1.5.5\n\n### Patch Changes\n\n- Updated dependencies [[`c42b145f`](https://github.com/graphql/graphiql/commit/c42b145fffeaefbd1103bc7addee1873e939bc83)]:\n  - codemirror-graphql@1.2.3\n\n## 1.5.4\n\n### Patch Changes\n\n- [`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf) [#2047](https://github.com/graphql/graphiql/pull/2047) Thanks [@willstott101](https://github.com/willstott101)! - Source code included in all packages to fix source maps. codemirror-graphql includes esm build in package.\n\n- Updated dependencies [[`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf), [`8b486555`](https://github.com/graphql/graphiql/commit/8b486555e2aa4d90891070a1bbc52b59d9c670c4)]:\n  - codemirror-graphql@1.2.2\n  - graphql-language-service@3.2.3\n\n## 1.5.3\n\n### Patch Changes\n\n- [`c83d1d4c`](https://github.com/graphql/graphiql/commit/c83d1d4c518ad1b0862aae5f46359dfaee00dda1) Thanks [@kikkupico](https://github.com/kikkupico)! - fix `schema` type nullability for #2028\n\n* [`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf) [#2045](https://github.com/graphql/graphiql/pull/2045) Thanks [@acao](https://github.com/acao)! - fix graphql-js peer dependencies - [#2044](https://github.com/graphql/graphiql/pull/2044)\n\n* Updated dependencies [[`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf)]:\n  - codemirror-graphql@1.2.1\n  - @graphiql/toolkit@0.4.2\n  - graphql-language-service@3.2.2\n\n## 1.5.2\n\n### Patch Changes\n\n- Updated dependencies [[`dec207e7`](https://github.com/graphql/graphiql/commit/dec207e74f0506db069482cc30f8cd1f045d8107), [`b79bf304`](https://github.com/graphql/graphiql/commit/b79bf304045add4b5c3b2539dd6b551a64e6ed87), [`d0c22c4f`](https://github.com/graphql/graphiql/commit/d0c22c4fce5ea39611c7ecee553943fdf27fd03e)]:\n  - @graphiql/toolkit@0.4.1\n  - codemirror-graphql@1.2.0\n\n## 1.5.1\n\n### Patch Changes\n\n- [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce) [#2013](https://github.com/graphql/graphiql/pull/2013) Thanks [@PabloSzx](https://github.com/PabloSzx)! - Update utils\n\n- Updated dependencies [[`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce)]:\n  - graphql-language-service@3.2.1\n\n## 1.5.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n### Patch Changes\n\n- Updated dependencies [[`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a)]:\n  - codemirror-graphql@1.1.0\n  - @graphiql/toolkit@0.4.0\n  - graphql-language-service@3.2.0\n\n## 1.4.8\n\n### Patch Changes\n\n- [`e63696de`](https://github.com/graphql/graphiql/commit/e63696de57a85c34d937bfb53345e2e0d0b874a4) [#2005](https://github.com/graphql/graphiql/pull/2005) Thanks [@acao](https://github.com/acao)! - Correct the npm readme security fix version number and links, thanks [@glasser](https://github.com/glasser) & [@dotansimha](https://github.com/dotansimha)!\n\n## 1.4.7\n\n### Patch Changes\n\n- [`130ddad6`](https://github.com/graphql/graphiql/commit/130ddad6d0394356ec32070a6fee1840450a4660) Thanks [@acao](https://github.com/acao)! - **CRITICAL SECURITY PATCH** for the [GraphiQL introspection schema template injection attack](https://github.com/graphql/graphiql/security/advisories/GHSA-x4r7-m2q9-69c8)\n\n## 1.4.6\n\n### Patch Changes\n\n- [`d3a88283`](https://github.com/graphql/graphiql/commit/d3a88283c7b618376ad4a06c7db20e60b066d1a0) [#1934](https://github.com/graphql/graphiql/pull/1934) Thanks [@tonyfromundefined](https://github.com/tonyfromundefined)! - add react 17, 18 in peerDependencies\n\n* [`afaa36c1`](https://github.com/graphql/graphiql/commit/afaa36c198648e84f305986a0b1dfefa97e70221) [#1883](https://github.com/graphql/graphiql/pull/1883) Thanks [@Sweetabix1](https://github.com/Sweetabix1)! - Updating font colors for line numbers, comments & brackets from #999 to #666 for accessibility purposes. #666 passes AA accessibility standards for small text, with a contrast ratio of over 5:1.\n\n- [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8) [#1777](https://github.com/graphql/graphiql/pull/1777) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - adopt block string parsing for variables in language parser\n\n- Updated dependencies [[`0e2c1a02`](https://github.com/graphql/graphiql/commit/0e2c1a020cc2761155f7c9467d3ed4cb45941aeb), [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8)]:\n  - graphql-language-service@3.1.6\n  - codemirror-graphql@1.0.3\n\n## 1.4.5\n\n### Patch Changes\n\n- [`86795d5f`](https://github.com/graphql/graphiql/commit/86795d5ffa2d3e6c8aee74f761d02f054b428d46) Thanks [@acao](https://github.com/acao)! - Remove bad type definition from `subscriptions-transport-ws` #1992 closes #1989\n\n- Updated dependencies [[`86795d5f`](https://github.com/graphql/graphiql/commit/86795d5ffa2d3e6c8aee74f761d02f054b428d46)]:\n  - @graphiql/toolkit@0.3.2\n\n## 1.4.4\n\n### Patch Changes\n\n- [`62e786b5`](https://github.com/graphql/graphiql/commit/62e786b57cc5748eccac59814dfc8ecd0104c748) [#1990](https://github.com/graphql/graphiql/pull/1990) Thanks [@acao](https://github.com/acao)! - Remove type definition from `subscriptions-transport-ws`\n\n- Updated dependencies [[`62e786b5`](https://github.com/graphql/graphiql/commit/62e786b57cc5748eccac59814dfc8ecd0104c748)]:\n  - @graphiql/toolkit@0.3.1\n\n## 1.4.3\n\n### Patch Changes\n\n- [`6a459f4c`](https://github.com/graphql/graphiql/commit/6a459f4c235bb0d70725ae6ad7fc1cfa34f49dca) [#1968](https://github.com/graphql/graphiql/pull/1968) Thanks [@acao](https://github.com/acao)! - Remove `optionalDependencies` entirely, remove `subscriptions-transport-ws` which introduces vulnerabilities, upgrade `@n1ru4l/push-pull-async-iterable-iterator` to 3.0.0, upgrade `graphql-ws` several minor versions - the `graphql-ws@5.x` upgrade will come in a later minor release.\n\n* [`eb2d91fa`](https://github.com/graphql/graphiql/commit/eb2d91fa8e4a03cb5663f27f724db2c95989a40f) [#1914](https://github.com/graphql/graphiql/pull/1914) Thanks [@harshithpabbati](https://github.com/harshithpabbati)! - fix: history can now be saved even when query history panel is not opened feat: create a new maxHistoryLength prop to allow more than 20 queries in history panel\n\n- [`04fad79c`](https://github.com/graphql/graphiql/commit/04fad79c094318d4b4c9e0250c5cff55d9fc5116) [#1889](https://github.com/graphql/graphiql/pull/1889) Thanks [@henryqdineen](https://github.com/henryqdineen)! - feat: export ToolbarSelectOption and ToolbarMenuItem\n\n* [`cd685435`](https://github.com/graphql/graphiql/commit/cd6854352ac6beff57af76db7de38e8157ff13aa) [#1923](https://github.com/graphql/graphiql/pull/1923) Thanks [@cgarnier](https://github.com/cgarnier)! - Fix result window theme\n\n* Updated dependencies [[`6a459f4c`](https://github.com/graphql/graphiql/commit/6a459f4c235bb0d70725ae6ad7fc1cfa34f49dca), [`2fd5bf72`](https://github.com/graphql/graphiql/commit/2fd5bf7239edb78339e5ac7211f09c245e47c3bb)]:\n  - @graphiql/toolkit@0.3.0\n  - graphql-language-service@3.1.5\n\n## 1.4.2\n\n### Patch Changes\n\n- [`5b8a057d`](https://github.com/graphql/graphiql/commit/5b8a057dd64ebecc391be32176a2403bb9d9ff92) [#1838](https://github.com/graphql/graphiql/pull/1838) Thanks [@acao](https://github.com/acao)! - Set all cross-runtime build targets to es6\n\n## 1.4.1\n\n### Patch Changes\n\n- [`9f8c78ce`](https://github.com/graphql/graphiql/commit/9f8c78ce8c72a9dcf35b3e82bd3129ac17d845e6) [#1821](https://github.com/graphql/graphiql/pull/1821) Thanks [@harshithpabbati](https://github.com/harshithpabbati)! - fix: render query history panel only when it's toggled, instead of hiding with CSS\n\n* [`dd9397e4`](https://github.com/graphql/graphiql/commit/dd9397e4c693b5ceadbd26d6fa92aa6246aac9c3) [#1819](https://github.com/graphql/graphiql/pull/1819) Thanks [@acao](https://github.com/acao)! - `GraphiQL.createClient()` accepts custom `legacyClient`, exports typescript types, fixes #1800.\n\n  `createGraphiQLFetcher` now only attempts an `graphql-ws` connection when only `subscriptionUrl` is provided. In order to use `graphql-transport-ws`, you'll need to provide the `legacyClient` option only, and no `subscriptionUrl` or `wsClient` option.\n\n- [`1f92d1dc`](https://github.com/graphql/graphiql/commit/1f92d1dcc0102bdec078263b87ca20cd670a1c86) [#1804](https://github.com/graphql/graphiql/pull/1804) Thanks [@maraisr](https://github.com/maraisr)! - Fixes issue where with IncrementalDelivery directives objects wouldn't deep-merge.\n\n* [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n* Updated dependencies [[`dd9397e4`](https://github.com/graphql/graphiql/commit/dd9397e4c693b5ceadbd26d6fa92aa6246aac9c3), [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a)]:\n  - @graphiql/toolkit@0.2.0\n\n## 1.4.0\n\n### Patch Changes\n\n- Updated dependencies [[`b4fc16c0`](https://github.com/graphql/graphiql/commit/b4fc16c025da6f466727dc17cab6026d14c6e7fe)]:\n  - codemirror-graphql@1.0.0\n\n## 1.4.0\n\n### Bugfixes\n\n- Fixes the search icon misalignment. (#1776) by [@iifawzi](https://github.com/iifawzi)\n- run `onToggleDocs` when setting `docExplorerOpen` to false (#1768) by [@ChiragKasat](https://github.com/ChiragKasat)\n\n### Minor Changes\n\n- 1c119386: `@defer`, `@stream`, and `graphql-ws` support in a `createGraphiQLFetcher` utility (#1770)\n\n  - support for `@defer` and `@stream` in `GraphiQL` itself on fetcher execution and when handling stream payloads\n  - introduce `@graphiql/toolkit` for types and utilities used to compose `GraphiQL` and other related libraries\n  - introduce `@graphiql/create-fetcher` to accept simplified parameters to generate a `fetcher` that covers the most commonly used `graphql-over-http` transport spec proposals. using `meros` for multipart http, and `graphql-ws` for websockets subscriptions.\n  - use `graphql` and `graphql-express` `experimental-defer-stream` branch in development until it's merged\n  - add cypress e2e tests for `@stream` in different scenarios\n  - add some unit tests for `createGraphiQLFetcher`\n\n### Patch Changes\n\n- Updated dependencies [1c119386]\n  - @graphiql/create-fetcher@0.1.0\n  - @graphiql/toolkit@0.1.0\n\n## [1.3.2](https://github.com/graphql/graphiql/compare/graphiql@1.3.1...graphiql@1.3.2) (2021-01-07)\n\n**Note:** Version bump only for package graphiql\n\n## [1.3.1](https://github.com/graphql/graphiql/compare/graphiql@1.3.0...graphiql@1.3.1) (2021-01-07)\n\n**Note:** Version bump only for package graphiql\n\n## [1.3.0](https://github.com/graphql/graphiql/compare/graphiql@1.2.2...graphiql@1.3.0) (2021-01-07)\n\n### Features\n\n- also support fetcher functions that return Promise<Observable> or Promise ([#1739](https://github.com/graphql/graphiql/issues/1739)) ([a804f3c](https://github.com/graphql/graphiql/commit/a804f3c011e7cafb4f8a48a1ba101b875be3540d))\n- implied or external fragments, for [#612](https://github.com/graphql/graphiql/issues/612) ([#1750](https://github.com/graphql/graphiql/issues/1750)) ([cfed265](https://github.com/graphql/graphiql/commit/cfed265e3cf31875b39ea517781a217fcdfcadc2))\n\n## [1.2.2](https://github.com/graphql/graphiql/compare/graphiql@1.2.1...graphiql@1.2.2) (2021-01-03)\n\n**Note:** Version bump only for package graphiql\n\n## [1.2.1](https://github.com/graphql/graphiql/compare/graphiql@1.2.0...graphiql@1.2.1) (2020-12-28)\n\n### Bug Fixes\n\n- display schema description if available ([050c506](https://github.com/graphql/graphiql/commit/050c506ed4ed2852bf9a5b099f967928d9856156))\n- fix linting issue ([7117b7c](https://github.com/graphql/graphiql/commit/7117b7ccd2a2872e0051c8751252040d4042e190))\n\n## [1.2.0](https://github.com/graphql/graphiql/compare/graphiql@1.1.0...graphiql@1.2.0) (2020-12-08)\n\n### Features\n\n- add AsyncIterable support to fetcher function ([#1724](https://github.com/graphql/graphiql/issues/1724)) ([a568af3](https://github.com/graphql/graphiql/commit/a568af3674404b8a15055792c2c35128b2bd711c))\n- provide validation rules via props ([#1716](https://github.com/graphql/graphiql/issues/1716)) ([0c5785c](https://github.com/graphql/graphiql/commit/0c5785c82adbd4affb25300ae2d128b42c9b81fe))\n\n## [1.1.0](https://github.com/graphql/graphiql/compare/graphiql@1.0.6...graphiql@1.1.0) (2020-11-28)\n\n### Bug Fixes\n\n- improve props in GraphiQL readme ([b9b2c8d](https://github.com/graphql/graphiql/commit/b9b2c8d8bde6064a4cdcb01911b024602fcdbe9f))\n\n### Features\n\n- **graphiql:** add prop for adding toolbar content while preserving the default buttons ([ea81056](https://github.com/graphql/graphiql/commit/ea81056e09b0a95e1536c79fab27e027739808c4))\n- deeper fragment merging ([238d0b5](https://github.com/graphql/graphiql/commit/238d0b5e52cfa9354757c9d52050692d152aae21))\n\n## [1.0.6](https://github.com/graphql/graphiql/compare/graphiql@1.0.5...graphiql@1.0.6) (2020-10-20)\n\n### Bug Fixes\n\n- enable variable editor when header editor is not enabled ([#1682](https://github.com/graphql/graphiql/issues/1682)) ([205fbad](https://github.com/graphql/graphiql/commit/205fbad84806d175d66a6f5598e0a0f521129a16))\n\n## [1.0.5](https://github.com/graphql/graphiql/compare/graphiql@1.0.4...graphiql@1.0.5) (2020-09-18)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.4](https://github.com/graphql/graphiql/compare/graphiql@2.0.0-alpha.5...graphiql@1.0.4) (2020-09-11)\n\n### Bug Fixes\n\n- don't use initial query on every re-render ([#1663](https://github.com/graphql/graphiql/issues/1663)) ([5aa890f](https://github.com/graphql/graphiql/commit/5aa890f6e145a7ad49f82cc122e209a291060709))\n\n## [1.0.3](https://github.com/graphql/graphiql/compare/graphiql@1.0.2...graphiql@1.0.3) (2020-06-24)\n\n### Bug Fixes\n\n- headers tab - highlighting and schema fetch ([#1593](https://github.com/graphql/graphiql/issues/1593)) ([0d050ca](https://github.com/graphql/graphiql/commit/0d050caeb5278799f2b1c206d0c61f3ac768e7cd))\n\n## [1.0.2](https://github.com/graphql/graphiql/compare/graphiql@1.0.1...graphiql@1.0.2) (2020-06-19)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.1](https://github.com/graphql/graphiql/compare/graphiql@1.0.0...graphiql@1.0.1) (2020-06-17)\n\n### Bug Fixes\n\n- more server side rendering fixes ([#1581](https://github.com/graphql/graphiql/issues/1581)) ([881a19f](https://github.com/graphql/graphiql/commit/881a19fbd5fbe5f65678de8074e593be7deb2ede)), closes [#1573](https://github.com/graphql/graphiql/issues/1573)\n- network cancellation for 1.0 ([#1582](https://github.com/graphql/graphiql/issues/1582)) ([ad3cc0d](https://github.com/graphql/graphiql/commit/ad3cc0d1567ea49ff5677d4cd8524e5e072b605e))\n- Set headers to localStorage ([#1578](https://github.com/graphql/graphiql/issues/1578)) ([cc7a7e2](https://github.com/graphql/graphiql/commit/cc7a7e2f6d25d7e8150dc89c6984e6a04b01566b))\n\n## [1.0.0](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.13...graphiql@1.0.0) (2020-06-11)\n\n### Bug Fixes\n\n- call debounce statements as they are functions ([#1571](https://github.com/graphql/graphiql/issues/1571)) ([8541250](https://github.com/graphql/graphiql/commit/85412501307ccfffe258b7fbca74bb9309726a73))\n- fix server side rendering by using type only codemirror import ([#1573](https://github.com/graphql/graphiql/issues/1573)) ([1ee60a6](https://github.com/graphql/graphiql/commit/1ee60a6db87d54c7a1e8f1089e52a65f335351b6)), closes [#118](https://github.com/graphql/graphiql/issues/118)\n- Move all componentWillUnMount functionality to respective events ([#1544](https://github.com/graphql/graphiql/issues/1544)) ([046b09f](https://github.com/graphql/graphiql/commit/046b09f541e6a9f2ce4b46de590d49c04c916716))\n\n## [1.0.0-alpha.13](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.12...graphiql@1.0.0-alpha.13) (2020-06-04)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.0-alpha.12](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.11...graphiql@1.0.0-alpha.12) (2020-06-04)\n\n### Bug Fixes\n\n- cleanup cache entry from lerna publish ([4a26218](https://github.com/graphql/graphiql/commit/4a2621808a1aea8b30d5d27b8d86a60bf2b44b01))\n- display variable editor when headers are not enabled ([ce7b2e2](https://github.com/graphql/graphiql/commit/ce7b2e2b45d530b61e916112e864074cf3a6ddc7))\n\n## [1.0.0-alpha.11](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.10...graphiql@1.0.0-alpha.11) (2020-05-28)\n\n### Bug Fixes\n\n- Safe setState ([#1547](https://github.com/graphql/graphiql/issues/1547)) ([f85969c](https://github.com/graphql/graphiql/commit/f85969c7e77e8fd269e026be36cc5065d6d33237))\n- trigger edit variables on first render ([#1545](https://github.com/graphql/graphiql/issues/1545)) ([e54e1a8](https://github.com/graphql/graphiql/commit/e54e1a8691483f1d336231314130d9822481b3be))\n\n### Features\n\n- Add Headers Editor to GraphiQL ([#1543](https://github.com/graphql/graphiql/issues/1543)) ([3faa1ac](https://github.com/graphql/graphiql/commit/3faa1ac46514252e90abf2b2bda0841edf6115ea))\n\n## [1.0.0-alpha.10](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.9...graphiql@1.0.0-alpha.10) (2020-05-19)\n\n### Bug Fixes\n\n- graphiql non-relative import issues ([#1534](https://github.com/graphql/graphiql/issues/1534)) fixes [#1530](https://github.com/graphql/graphiql/issues/1530) ([0ac9fa0](https://github.com/graphql/graphiql/commit/0ac9fa0a8dcdf8464c8ce31c487ebcfd6b9536a8))\n\n## [1.0.0-alpha.9](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.8...graphiql@1.0.0-alpha.9) (2020-05-17)\n\n### Bug Fixes\n\n- remove problematic file resolution module from webpack sco… ([#1489](https://github.com/graphql/graphiql/issues/1489)) ([8dab038](https://github.com/graphql/graphiql/commit/8dab0385772f443f73b559e2c668080733168236))\n\n### Features\n\n- introduce proper vscode completion kinds ([#1488](https://github.com/graphql/graphiql/issues/1488)) ([f19aa0d](https://github.com/graphql/graphiql/commit/f19aa0ddde6109526c101c8a487f43bbb8238394))\n- Monaco Mode - Phase 2 - Mode & Worker ([#1459](https://github.com/graphql/graphiql/issues/1459)) ([bc95fb4](https://github.com/graphql/graphiql/commit/bc95fb46459a4437ff9471ff43c98e1c5c50f51e))\n\n## [1.0.0-alpha.8](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.7...graphiql@1.0.0-alpha.8) (2020-04-10)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.0-alpha.7](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.6...graphiql@1.0.0-alpha.7) (2020-04-10)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.0-alpha.6](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.5...graphiql@1.0.0-alpha.6) (2020-04-10)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.0-alpha.5](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.4...graphiql@1.0.0-alpha.5) (2020-04-06)\n\n### Features\n\n- upgrade to graphql@15.0.0 for [#1191](https://github.com/graphql/graphiql/issues/1191) ([#1204](https://github.com/graphql/graphiql/issues/1204)) ([f13c8e9](https://github.com/graphql/graphiql/commit/f13c8e9d0e66df4b051b332c7d02f4bb83e07ffd))\n\n## [1.0.0-alpha.4](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.3...graphiql@1.0.0-alpha.4) (2020-04-03)\n\n### Bug Fixes\n\n- fix query argument missing from onEditQuery call ([#1440](https://github.com/graphql/graphiql/issues/1440)) ([6c335a8](https://github.com/graphql/graphiql/commit/6c335a813f6101afded00c0e869c337a7ca44020))\n\n## [1.0.0-alpha.3](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.2...graphiql@1.0.0-alpha.3) (2020-03-20)\n\n**Note:** Version bump only for package graphiql\n\n## [1.0.0-alpha.2](https://github.com/graphql/graphiql/compare/graphiql@1.0.0-alpha.0...graphiql@1.0.0-alpha.2) (2020-03-20)\n\n### Bug Fixes\n\n- Fix typo in documentation (comments) ([#1431](https://github.com/graphql/graphiql/issues/1431)) ([fdda8f0](https://github.com/graphql/graphiql/commit/fdda8f04479412d22e9a3e9215c7caa5369e7d83))\n- initial request cache set, import tsc bugs ([#1266](https://github.com/graphql/graphiql/issues/1266)) ([6b98f8a](https://github.com/graphql/graphiql/commit/6b98f8a442d4a8ea160fb90a29acf33f5382db2e))\n\n## [1.0.0-alpha.1](https://github.com/graphql/graphiql/compare/graphiql@0.17.5...graphiql@1.0.0-alpha.1) (2020-01-18)\n\n### Bug Fixes\n\n- hmr, file resolution warnings ([69bf701](https://github.com/graphql/graphiql/commit/69bf701))\n- prefer displayName over type equality for children overrides ([e4cec0a](https://github.com/graphql/graphiql/commit/e4cec0a))\n  - remove use of `findDOMNode` ([0b12323](https://github.com/graphql/graphiql/commit/0b12323)) by [@ryan-m-walker](https://github.com/ryan-m-walker)\n\n### Features\n\n- deprecate support for 15, support react 16 features ([#1107](https://github.com/graphql/graphiql/issues/1107)) ([bc4b6fc](https://github.com/graphql/graphiql/commit/bc4b6fc))\n- **graphiql-theming:** Toolbar component ([#1203](https://github.com/graphql/graphiql/issues/1203)) by [@walaura](https://github.com/walaura) ([adb73f5](https://github.com/graphql/graphiql/commit/adb73f5))\n- [new-ui] Tabs & Tab-bars ([#1198](https://github.com/graphql/graphiql/issues/1198)) ([033f971](https://github.com/graphql/graphiql/commit/033f971)) by [@walaura](https://github.com/walaura)\n- replace use of enzyme with react-testing-library ([#1144](https://github.com/graphql/graphiql/issues/1144)) by [@ryan-m-walker](https://github.com/ryan-m-walker) ([de73d6c](https://github.com/graphql/graphiql/commit/de73d6c))\n- storybook+theme-ui for the new design ([#1145](https://github.com/graphql/graphiql/issues/1145)) ([7f97c0c](https://github.com/graphql/graphiql/commit/7f97c0c)) by [@walaura](https://github.com/walaura)\n\n### BREAKING CHANGES\n\n- Deprecate support for React 15. Please use React 16.8 or greater for hooks support. Co-authored-by: @ryan-m-walker, @acao Reviewed-by: @benjie\n\n## [0.17.5](https://github.com/graphql/graphiql/compare/graphiql@0.17.4...graphiql@0.17.5) (2019-12-09)\n\n**Note:** Version bump only for package graphiql\n\n## [0.17.4](https://github.com/graphql/graphiql/compare/graphiql@0.17.3...graphiql@0.17.4) (2019-12-09)\n\n### Bug Fixes\n\n- graphiql babel test ignore paths ([e1588d9](https://github.com/graphql/graphiql/commit/e1588d9))\n\n## [0.17.3](https://github.com/graphql/graphiql/compare/graphiql@0.17.2...graphiql@0.17.3) (2019-12-09)\n\n### Bug Fixes\n\n- express-graphql version ([e9848b0](https://github.com/graphql/graphiql/commit/e9848b0))\n- test output, webpack resolution, clean build ([3b1c2c1](https://github.com/graphql/graphiql/commit/3b1c2c1))\n\n## [0.17.2](https://github.com/graphql/graphiql/compare/graphiql@0.17.1...graphiql@0.17.2) (2019-12-03)\n\n### Bug Fixes\n\n- ensure css files move with babel dist ([ca95547](https://github.com/graphql/graphiql/commit/ca95547))\n- remove css from downstream components. soon to be replaced w styled ([e765543](https://github.com/graphql/graphiql/commit/e765543))\n\n## [0.17.1](https://github.com/graphql/graphiql/compare/graphiql@0.17.0...graphiql@0.17.1) (2019-12-03)\n\n### Bug Fixes\n\n- **graphiql:** duplicate query history key issue, fixes [#988](https://github.com/graphql/graphiql/issues/988) ([#1035](https://github.com/graphql/graphiql/issues/1035)) ([69c6826](https://github.com/graphql/graphiql/commit/69c6826))\n- convert browserify build to webpack, fixes [#976](https://github.com/graphql/graphiql/issues/976) ([#1001](https://github.com/graphql/graphiql/issues/1001)) ([3caf041](https://github.com/graphql/graphiql/commit/3caf041))\n- hints vertical scroll ([216eaeb](https://github.com/graphql/graphiql/commit/216eaeb))\n\n## [0.17.0](https://github.com/graphql/graphiql/compare/graphiql@0.16.0...graphiql@0.17.0) (2019-11-26)\n\n### Bug Fixes\n\n- security bump, resolves [#1004](https://github.com/graphql/graphiql/issues/1004), SNYK-JS-MARKDOWNIT-459438 ([89c83db](https://github.com/graphql/graphiql/commit/89c83db))\n- webpack resolutions for [#882](https://github.com/graphql/graphiql/issues/882), add webpack example ([ea9df3e](https://github.com/graphql/graphiql/commit/ea9df3e))\n\n### Features\n\n- **graphiql:** Prettify also formats query variables ([b7d0bfd](https://github.com/graphql/graphiql/commit/b7d0bfd))\n\n## [0.16.0](https://github.com/graphql/graphiql/compare/graphiql@0.15.1...graphiql@0.16.0) (2019-10-19)\n\n### Bug Fixes\n\n- **accessibility:** improve accessibility of all components ([#967](https://github.com/graphql/graphiql/issues/967)) ([73a3f90](https://github.com/graphql/graphiql/commit/73a3f90))\n- **css:** added minimum width for result panel in GraphiQL ([#980](https://github.com/graphql/graphiql/issues/980)) ([0c8b7ad](https://github.com/graphql/graphiql/commit/0c8b7ad))\n- **graphiql:** better quota management ([#764](https://github.com/graphql/graphiql/issues/764)) ([7efed6c](https://github.com/graphql/graphiql/commit/7efed6c))\n\n### Features\n\n- **css:** beautify code tag in doc explorer ([#959](https://github.com/graphql/graphiql/issues/959)) resolves [#949](https://github.com/graphql/graphiql/issues/949) ([30810a2](https://github.com/graphql/graphiql/commit/30810a2))\n\n### [0.15.1](https://github.com/graphql/graphiql/compare/graphiql@0.15.0...graphiql@0.15.1) (2019-10-04)\n\n### Bug Fixes\n\n- build tweaks ([0bc6a7c](https://github.com/graphql/graphiql/commit/0bc6a7c))\n\n## 0.15.0 (2019-10-04)\n\n### Bug Fixes\n\n- check `window` is defined before using it ([#962](https://github.com/graphql/graphiql/issues/962)) ([e4866ad](https://github.com/graphql/graphiql/commit/e4866ad))\n- **graphiql:** prettify keybinding bug for Firefox. Fixes [#905](https://github.com/graphql/graphiql/issues/905) ([fdf98ba](https://github.com/graphql/graphiql/commit/fdf98ba))\n- check `this.editor` exist before `this.editor.off` in QueryEditor ([#669](https://github.com/graphql/graphiql/issues/669)) ([ca226ee](https://github.com/graphql/graphiql/commit/ca226ee)), closes [#665](https://github.com/graphql/graphiql/issues/665)\n- extraKeys bugfix window regression ([f3d0427](https://github.com/graphql/graphiql/commit/f3d0427))\n- preserve ctrl-f key for macOS ([7c381f9](https://github.com/graphql/graphiql/commit/7c381f9))\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 0.13.2 (2019-06-21)\n\n## 0.14.3 (2019-09-01)\n\n### Bug Fixes\n\n- check `this.editor` exist before `this.editor.off` in QueryEditor ([#669](https://github.com/graphql/graphiql/issues/669)) ([ca226ee](https://github.com/graphql/graphiql/commit/ca226ee)), closes [#665](https://github.com/graphql/graphiql/issues/665)\n- extraKeys bugfix window regression ([f3d0427](https://github.com/graphql/graphiql/commit/f3d0427))\n- preserve ctrl-f key for macOS ([7c381f9](https://github.com/graphql/graphiql/commit/7c381f9))\n- remove newline ([19f5d1d](https://github.com/graphql/graphiql/commit/19f5d1d))\n\n## 0.13.2 (2019-06-21)\n\n## 0.13.2 (2019-06-21)\n"
  },
  {
    "path": "packages/graphiql/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/graphiql/README.md",
    "content": "# GraphiQL\n\n> **Security Notice:** All versions of `graphiql` < `1.4.3` are vulnerable to an\n> XSS attack in cases where the GraphQL server to which the GraphiQL web app\n> connects is not trusted. Learn more in\n> [our security advisory](https://github.com/graphql/graphiql/tree/main/docs/security/2021-introspection-schema-xss.md).\n\n[![NPM](https://img.shields.io/npm/v/graphiql.svg)](https://npmjs.com/graphiql)\n![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/graphiql)\n![npm downloads](https://img.shields.io/npm/dm/graphiql?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/graphiql)\n![npm bundle size (version)](https://img.shields.io/bundlephobia/min/graphiql/latest)\n![npm bundle size (version)](https://img.shields.io/bundlephobia/minzip/graphiql/latest)\n[![License](https://img.shields.io/npm/l/graphiql.svg?style=flat-square)](LICENSE)\n[![](https://dcbadge.vercel.app/api/server/NP5vbPeUFp?style=flat)](https://discord.gg/NP5vbPeUFp)\n\n_/ˈɡrafək(ə)l/_ A graphical interactive in-browser GraphQL IDE.\n[Try the live demo](https://graphql.org/swapi-graphql).\n\n[![](resources/graphiql.png)](https://graphql.org/swapi-graphql)\n\n## Features\n\n- Full language support of the latest\n  [GraphQL Specification](https://spec.graphql.org/draft/#sec-Language):\n- Syntax highlighting\n- Intelligent type ahead of fields, arguments, types, and more\n- Real-time error highlighting and reporting for queries and variables\n- Automatic query and variables completion\n- Automatic leaf node insertion for non-scalar fields\n- Documentation explorer with search and markdown support\n- Persisted state using `localStorage`\n- Simple API for adding custom plugins\n\n## Live Demos\n\n- The [latest stable version](https://graphql.org/swapi-graphql)\n- The current state of the `main` branch:\n  - An [installable PWA](https://graphiql-test.netlify.com/webpack) with plugins ([source](../../examples//graphiql-webpack))\n  - Using the [minified bundles](https://graphiql-test.netlify.com)\n  - Using the [development bundles](https://graphiql-test.netlify.com/dev) (good\n    for inspecting, debugging, etc)\n- Each pull request will also get its own preview deployment on Netlify, you'll\n  find a link in the GitHub checks\n\n## Examples\n\n- [`CDN (ESM-based)`](../../examples/graphiql-cdn) - A single HTML file using [JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) from http URLs and a `<script>` tag\n- [`Webpack`](../../examples/graphiql-webpack) - A starter for Webpack\n- [`Create React App`](../../examples/graphiql-create-react-app) - An example\n  using [Create React App](https://create-react-app.dev)\n- [`Parcel`](../../examples/graphiql-parcel) - An example using\n  [Parcel](https://parceljs.org)\n\n## Getting started\n\n- [Migration guide to GraphiQL 2](../../docs/migration/graphiql-2.0.0.md)\n- [Migration guide to GraphiQL 4](../../docs/migration/graphiql-4.0.0.md)\n- [Migration guide to GraphiQL 5](../../docs/migration/graphiql-5.0.0.md)\n\n### CDN usage\n\n#### ESM-based (recommended)\n\nUse the modern, ESM-based CDN approach.\nSee the [ESM-based example](../../examples/graphiql-cdn) for setup details.\n\n#### UMD (deprecated)\n\n> [!WARNING]\n>\n> The UMD CDN build is **deprecated** and will be removed in a future major release of GraphiQL.\n> Please migrate to the [ESM-based example](../../examples/graphiql-cdn).\n\n## Usage\n\n### Using as package\n\nThe `graphiql` package can be installed using your favorite package manager. You\nalso need to have `react`,`react-dom` and `graphql` installed which are peer\ndependencies of `graphiql`.\n\n```sh\nnpm install graphiql react react-dom graphql\n```\n\nThe package exports a bunch of React components:\n\n- The `GraphiQLProvider` components renders multiple context providers that\n  encapsulate all state management\n- The `GraphiQLInterface` component renders the UI that makes up GraphiQL\n- The `GraphiQL` component is a combination of both the above components\n\nThere is a single prop that is required for the `GraphiQL` component called\nfetcher. A fetcher is a function that performs a request to a GraphQL API. It\nmay return a `Promise` for queries or mutations, but also an `Observable` or an\n`AsyncIterable` in order to handle subscriptions or multipart responses.\n\nAn easy way to get create such a function is the\n[`createGraphiQLFetcher`](../graphiql-toolkit/src/create-fetcher/createFetcher.ts)\nmethod exported from the `@graphiql/toolkit` package. If you want to implement\nyour own fetcher function, you can use the `Fetcher` type from\n`@graphiql/toolkit` to make sure the signature matches what GraphiQL expects.\n\nThe following is everything you need to render GraphiQL in your React\napplication:\n\n```jsx\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { GraphiQL } from 'graphiql';\nimport { createRoot } from 'react-dom/client';\nimport 'graphiql/style.css';\n\nconst fetcher = createGraphiQLFetcher({ url: 'https://my.backend/graphql' });\n\nconst root = createRoot(document.getElementById('root'));\nroot.render(<GraphiQL fetcher={fetcher} />);\n```\n\n## Customize\n\nGraphiQL supports customization in UI and behavior by accepting React props and\nchildren.\n\n### Props\n\nFor props documentation, see the\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql.html#graphiqlprops-1)\n\n### Children\n\nParts of the UI can be customized by passing children to the `GraphiQL` or the\n`GraphiQLInterface` component.\n\n- `<GraphiQL.Logo>`: Replace the GraphiQL logo with your own.\n\n- `<GraphiQL.Toolbar>`: Add a custom toolbar below the execution button. Pass\n  the empty `<GraphiQL.Toolbar />` if an empty toolbar is desired. Use the\n  components provided by `@graphiql/react` to create toolbar buttons with proper\n  styles.\n\n- `<GraphiQL.Footer>`: Add a custom footer shown below the response editor.\n\n### Plugins\n\nStarting with `graphiql@2` there exists a simple plugin API that allows you to\nbuild your own custom tools right into GraphiQL.\n\nThere are two built-in plugins that come with GraphiQL: The documentation\nexplorer and the query history. Both can be toggled using icons in the sidebar\non the left side of the screen. When opened, they appear next to the sidebar in\na resizable portion of the screen.\n\nTo define your own plugin, all you need is a JavaScript object with three\nproperties:\n\n- `title`: A unique title for the plugin (this will show up in a tooltip when\n  hovering over the sidebar icon)\n- `icon`: A React component that renders an icon which will be included in the\n  sidebar\n- `content`: A React component that renders the plugin contents which will be\n  shown next to the sidebar when opening the plugin\n\nYou can pass a list of plugin objects to the `GraphiQL` component using the\n`plugins` prop. You can also control the visibility state of plugins using the\n`visiblePlugin` prop and react to changes of the plugin visibility state using\nthe `onTogglePluginVisibility` prop.\n\nInside the component you pass to `content` you can interact with the GraphiQL\nstate using the hooks provided by `@graphiql/react`. For example, check out\nhow you can integrate the OneGraph Explorer in GraphiQL using the plugin API in\nthe [plugin package](../graphiql-plugin-explorer) in this repo.\n\n### Theming\n\nThe GraphiQL interface uses CSS variables for theming, in particular for colors.\nCheck out the [`root.css`](../graphiql-react/src/style/root.css) file for the\navailable variables.\n\nOverriding these variables is the only officially supported way of customizing\nthe appearance of GraphiQL. Starting from version 2, class names are no longer\nbe considered stable and might change between minor or patch version updates.\n\n### Editor Theme\n\nThe colors inside the editor can also be altered using\n[CodeMirror editor themes](https://codemirror.net/demo/theme.html). You can use\nthe `editorTheme` prop to pass in the name of the theme. The CSS for the theme\nhas to be loaded for the theme prop to work.\n\n```jsx\n// In your document head:\n<link\n  rel=\"stylesheet\"\n  href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.23.0/theme/solarized.css\"\n/>\n```\n\n```jsx\n// When rendering GraphiQL:\n<GraphiQL editorTheme=\"solarized light\" />\n```\n\nYou can also create your own theme in CSS. As a reference, the default\n`graphiql` theme definition can be found\n[here](../graphiql-react/src/style/codemirror.css).\n\n## Usage with a Custom Storage Namespace\n\nWhen multiple GraphiQL instances run on the same origin—such as in different apps or\nenvironments—they can conflict by reading from and writing to the same `localStorage` keys. To\nprevent this, you can provide a custom `storage` object that prefixes all keys with a unique\nnamespace, isolating each instance’s state and avoiding collisions.\n\n```tsx\nimport type { FC } from 'react';\nimport { GraphiQL } from 'graphiql';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst fetcher = createGraphiQLFetcher({ url: 'https://my.backend/graphql' });\n\nconst NAMESPACE = 'my-namespace';\n\nconst storage: typeof localStorage = {\n  ...localStorage,\n  getItem(key) {\n    return localStorage.getItem(`${NAMESPACE}:${key}`);\n  },\n  setItem(key, value) {\n    return localStorage.setItem(`${NAMESPACE}:${key}`, value);\n  },\n  removeItem(key) {\n    return localStorage.removeItem(`${NAMESPACE}:${key}`);\n  },\n};\n\nexport const App: FC = () => {\n  return <GraphiQL fetcher={fetcher} storage={myStorage} />;\n};\n```\n"
  },
  {
    "path": "packages/graphiql/__mocks__/monaco-editor.ts",
    "content": "import { defineWebWorkers } from '@vitest/web-worker/pure';\n/**\n * Fixes TypeError: Cannot read properties of null (reading 'webkitBackingStorePixelRatio')\n */\nimport 'vitest-canvas-mock';\n\ndefineWebWorkers();\n\n/**\n * Fixes TypeError: document.queryCommandSupported is not a function\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!navigator.clipboard) {\n  Object.defineProperty(navigator, 'clipboard', {\n    writable: false,\n    value: {\n      write: async () => null,\n    },\n  });\n}\n\n/**\n * Fixes ReferenceError: ResizeObserver is not defined\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!window.ResizeObserver) {\n  Object.defineProperty(window, 'ResizeObserver', {\n    writable: false,\n    value: vi.fn().mockReturnValue({\n      observe() {},\n      disconnect() {},\n    }),\n  });\n}\n\n/**\n * ReferenceError: ClipboardItem is not defined\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!window.ClipboardItem) {\n  Object.defineProperty(window, 'ClipboardItem', {\n    writable: false,\n    value: vi.fn(),\n  });\n}\n\nprocess.on('unhandledRejection', reason => {\n  if (\n    reason instanceof Error &&\n    reason.name === 'Canceled' &&\n    reason.name === reason.message\n  ) {\n    // ignore DeferredPromise.cancel\n    return;\n  }\n  throw reason;\n});\n\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports, import-x/no-extraneous-dependencies\nexport * from 'monaco-editor';\n"
  },
  {
    "path": "packages/graphiql/__mocks__/zustand.ts",
    "content": "/* eslint-disable no-console */\n\n/**\n * Mocking Zustand for Vitest with resetting store between each test.\n * @see https://zustand.docs.pmnd.rs/guides/testing#vitest\n */\n\nimport { act } from '@testing-library/react';\n// eslint-disable-next-line import-x/no-extraneous-dependencies\nimport {\n  create as originalCreate,\n  createStore as originalCreateStore,\n  useStore,\n  StateCreator,\n} from 'zustand';\n\n// Originally zustand docs suggest to use `export * from 'zustand'`, but I had issues with it.\n// It conflicts with locale export of `create` and `createStore` functions\nexport { useStore };\n\n// a variable to hold reset functions for all stores declared in the app\nexport const storeResetFns = new Set<() => void>();\n\nconst createUncurried = <T>(stateCreator: StateCreator<T>) => {\n  const store = originalCreate(stateCreator);\n  const initialState = store.getInitialState();\n  storeResetFns.add(() => {\n    store.setState(initialState, true);\n  });\n  return store;\n};\n\n// when creating a store, we get its initial state, create a reset function and add it in the set\nexport const create = (<T>(stateCreator: StateCreator<T>) => {\n  console.log('zustand create mock');\n\n  // to support a curried version of create\n  return typeof stateCreator === 'function'\n    ? createUncurried(stateCreator)\n    : createUncurried;\n}) as typeof originalCreate;\n\nfunction createStoreUncurried<T>(stateCreator: StateCreator<T>) {\n  const store = originalCreateStore(stateCreator);\n  const initialState = store.getInitialState();\n\n  storeResetFns.add(() => {\n    store.setState(initialState, true);\n  });\n  return store;\n}\n\n// When creating a store, we get its initial state, create a reset function and add it in the set\nexport const createStore = (<T>(stateCreator: StateCreator<T>) => {\n  console.log('zustand createStore mock');\n\n  // to support a curried version of createStore\n  return typeof stateCreator === 'function'\n    ? createStoreUncurried(stateCreator)\n    : createStoreUncurried;\n}) as typeof originalCreateStore;\n\n// Reset all stores after each test run\nafterEach(() => {\n  act(() => {\n    for (const resetFn of storeResetFns) {\n      resetFn();\n    }\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/docs.cy.ts",
    "content": "import { version } from 'graphql';\n\nbeforeEach(() => {\n  cy.visit('/');\n});\n\ndescribe('GraphiQL DocExplorer - button', () => {\n  beforeEach(() => {\n    cy.get('.graphiql-sidebar button').eq(0).click();\n  });\n  it('Toggles doc pane on', () => {\n    cy.get('.graphiql-doc-explorer').should('be.visible');\n  });\n\n  it('Toggles doc pane back off', () => {\n    cy.get('.graphiql-sidebar button').eq(0).click();\n    cy.get('.graphiql-doc-explorer').should('not.exist');\n  });\n});\n\ndescribe('GraphiQL DocExplorer - search', () => {\n  beforeEach(() => {\n    cy.get('.graphiql-sidebar button').eq(0).click();\n    cy.dataCy('doc-explorer-input').type('test');\n    cy.dataCy('doc-explorer-option').should('have.length', 7);\n  });\n\n  it('Searches docs for values', () => {\n    cy.dataCy('doc-explorer-list').should('not.have.attr', 'hidden');\n  });\n\n  it('Navigates to a docs entry on selecting a search result', () => {\n    cy.dataCy('doc-explorer-option').eq(4).children().click();\n    cy.get('.graphiql-doc-explorer-title').should('have.text', 'TestInput');\n  });\n\n  it('Allows searching fields within a type', () => {\n    cy.dataCy('doc-explorer-option').eq(4).children().click();\n    cy.dataCy('doc-explorer-input').type('list');\n    cy.dataCy('doc-explorer-option').should('have.length', 14);\n    cy.get('.graphiql-doc-explorer-search-divider').should(\n      'have.text',\n      'Other results',\n    );\n    cy.dataCy('doc-explorer-option').contains('hasArgs');\n  });\n\n  it('Closes popover when blurring input', () => {\n    cy.dataCy('doc-explorer-input').focus();\n    cy.dataCy('doc-explorer-input').type('list');\n    cy.dataCy('doc-explorer-input').blur();\n    cy.dataCy('doc-explorer-list').should('not.exist');\n  });\n\n  it('Navigates back', () => {\n    cy.dataCy('doc-explorer-option').eq(4).children().click();\n    cy.get('.graphiql-doc-explorer-back').click();\n    cy.get('.graphiql-doc-explorer-title').should('have.text', 'Docs');\n  });\n\n  it('Type fields link to their own docs entry', () => {\n    cy.dataCy('doc-explorer-option').last().click();\n    cy.get('.graphiql-doc-explorer-title').should('have.text', 'isTest');\n    cy.get('.graphiql-markdown-description').should(\n      'have.text',\n      'Is this a test schema? Sure it is.\\n',\n    );\n  });\n});\n\ndescribe('GraphQL DocExplorer - deprecated fields', () => {\n  it('should show deprecated fields details when expanding', () => {\n    // Open doc explorer\n    cy.get('.graphiql-sidebar button').eq(0).click();\n\n    // Select query type\n    cy.get('.graphiql-doc-explorer-type-name').first().click();\n\n    // Show deprecated fields\n    cy.contains('Show Deprecated Fields').click();\n\n    // Assert that title is shown\n    cy.get('.graphiql-doc-explorer-section-title').contains(\n      'Deprecated Fields',\n    );\n\n    // Assert that the deprecated field is shown correctly\n    cy.get('.graphiql-doc-explorer-field-name')\n      .contains('deprecatedField')\n      .closest('.graphiql-doc-explorer-item')\n      .should('contain.text', 'This field is an example of a deprecated field')\n      .and(\n        'contain.html',\n        '<p>No longer in use, try <code>test</code> instead.</p>',\n      );\n  });\n});\n\nlet describeOrSkip = describe.skip;\n\nif (!version.includes('15.5')) {\n  describeOrSkip = describe;\n}\n\ndescribeOrSkip('GraphQL DocExplorer - deprecated arguments', () => {\n  it('should show deprecated arguments category title', () => {\n    // Open doc explorer\n    cy.get('.graphiql-sidebar button').eq(0).click();\n\n    // Select query type\n    cy.get('.graphiql-doc-explorer-type-name').first().click();\n\n    cy.get('.graphiql-doc-explorer-field-name').contains('hasArgs').click();\n    cy.contains('Show Deprecated Arguments').click();\n    cy.get('.graphiql-doc-explorer-section-title').contains(\n      'Deprecated Arguments',\n    );\n    cy.get('.graphiql-markdown-deprecation').should(\n      'have.text',\n      'Argument \"deprecatedArg\" is deprecated. Use \"string\" instead.\\n',\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/errors.cy.ts",
    "content": "import { GraphQLError, version } from 'graphql';\n\ndescribe('Errors', () => {\n  it('Should show an error when the HTTP request fails', () => {\n    cy.intercept('/graphql', {\n      statusCode: 502,\n      body: 'Bad Gateway',\n    });\n    cy.visit('/');\n    cy.assertQueryResult({\n      errors: [\n        {\n          /**\n           * The exact error message can differ depending on the browser and\n           * its JSON parser. This is the error you get in Electron (which\n           * we use to run the tests headless), the error in the latest Chrome\n           * version is different!\n           */\n          message: 'Unexpected token \\'B\\', \"Bad Gateway\" is not valid JSON',\n        },\n      ],\n    });\n  });\n\n  it('Should show an error when introspection fails', () => {\n    cy.intercept('/graphql', {\n      body: { errors: [new GraphQLError('Something unexpected happened...')] },\n    });\n    cy.visit('/');\n    cy.assertQueryResult({\n      errors: [{ message: 'Something unexpected happened...' }],\n    });\n  });\n\n  it('Should show an error when the schema is invalid', () => {\n    cy.intercept('/graphql', { fixture: 'bad-schema.json' });\n    cy.visit('/');\n    /**\n     * We can't use `cy.assertQueryResult` here because the stack contains line\n     * and column numbers of the `index.umd.js` bundle which are not stable.\n     */\n    const expected = version.startsWith('15')\n      ? 'Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but \\\\\"<img src=x onerror=alert(document.'\n      : 'Names must only contain [_a-zA-Z0-9] but \\\\\"<img src=x onerror=alert(document.';\n    cy.containQueryResult(expected);\n  });\n\n  it('Should show an error when sending an invalid query', () => {\n    cy.visitWithOp({ query: '{thisDoesNotExist}' });\n    cy.clickExecuteQuery();\n    cy.assertQueryResult({\n      errors: [\n        {\n          message: 'Cannot query field \"thisDoesNotExist\" on type \"Test\".',\n          locations: [{ line: 1, column: 2 }],\n        },\n      ],\n    });\n  });\n\n  it('Should show an error when sending an invalid subscription', () => {\n    cy.visitWithOp({ query: 'subscription {thisDoesNotExist}' });\n    cy.clickExecuteQuery();\n    cy.assertQueryResult({\n      errors: [\n        {\n          message:\n            'Cannot query field \"thisDoesNotExist\" on type \"SubscriptionType\".',\n          locations: [{ line: 1, column: 15 }],\n        },\n      ],\n    });\n    cy.on('uncaught:exception', () => {\n      // TODO: should GraphiQL doesn't throw an unhandled promise rejection for subscriptions ?\n\n      // return false to prevent the error from failing this test\n      return false;\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/graphql-ws.cy.ts",
    "content": "describe('IncrementalDelivery support via fetcher', () => {\n  describe('When operation contains @stream', () => {\n    const testSubscription =\n      'subscription TestSubscription($delay: Int) { message(delay: $delay) }';\n    const mockSubscriptionSuccess = {\n      data: {\n        message: 'Zdravo',\n      },\n    };\n\n    it('Expects a subscription to resolve', () => {\n      cy.visitWithOp({ query: testSubscription, variables: { delay: 0 } });\n      cy.get('.monaco-editor').should('have.length', 4);\n      cy.clickExecuteQuery();\n      cy.assertQueryResult(mockSubscriptionSuccess);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/headers.cy.ts",
    "content": "const DEFAULT_HEADERS = '{\"foo\":2}';\n\ndescribe('Headers', () => {\n  it('should have default query only on first tab and default headers in all tabs', () => {\n    cy.visit(`?defaultQuery={test}&defaultHeaders=${DEFAULT_HEADERS}`);\n    cy.assertHasValues({ query: '{test}', headersString: DEFAULT_HEADERS });\n    cy.get('.graphiql-tab-add').click();\n    cy.assertHasValues({ query: '', headersString: DEFAULT_HEADERS });\n    cy.get('.graphiql-tab-add').click();\n    cy.assertHasValues({ query: '', headersString: DEFAULT_HEADERS });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/history.cy.ts",
    "content": "import {\n  mockQuery1,\n  mockVariables1,\n  mockBadQuery,\n  mockQuery2,\n  mockVariables2,\n  mockHeaders1,\n  mockHeaders2,\n} from '../fixtures/fixtures';\n\ndescribe('history', () => {\n  it('will save history item even when history panel is closed', () => {\n    cy.visit('?query={test}');\n    cy.clickExecuteQuery();\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.get('ul.graphiql-history-items').should('have.length', 1);\n    cy.get('ul.graphiql-history-items li').should('have.length', 1);\n  });\n\n  it('will not save invalid queries', () => {\n    cy.visit(`?query=${mockBadQuery}`);\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 0);\n  });\n\n  it('will save if new query is different than previous query', () => {\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 1);\n\n    cy.visit(`?query=${mockQuery2}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 2);\n  });\n\n  it('will not save if new query is the same as previous query', () => {\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 1);\n\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 1);\n  });\n\n  it('will save query if the variables change', () => {\n    cy.visit(\n      `?query=${mockQuery1}&headers=${mockHeaders1}&variables=${mockVariables1}`,\n    );\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 1);\n\n    cy.visit(\n      `?query=${mockQuery1}&headers=${mockHeaders1}&variables=${mockVariables2}`,\n    );\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 2);\n  });\n\n  it('will save query if the headers change', () => {\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 1);\n\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders2}`);\n    cy.clickExecuteQuery();\n    cy.get('ul.graphiql-history-items li').should('have.length', 2);\n  });\n\n  it('should remove individual item', () => {\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.visit(`?query=${mockQuery2}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.get('button[aria-label=\"Show History\"]').click();\n\n    cy.get('ul.graphiql-history-items li').should('have.length', 2);\n\n    cy.get(\n      '.graphiql-history-item:nth-child(2) > button[aria-label=\"Delete from history\"]',\n    ).click();\n    cy.get('.graphiql-history-item').should('have.length', 1);\n  });\n\n  it('should remove all items', () => {\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.visit(`?query=${mockQuery2}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.get('ul.graphiql-history-items li').should('have.length', 2);\n\n    cy.get('.graphiql-history-header > button:last-child').click();\n    cy.get('.graphiql-history-item').should('have.length', 0);\n  });\n\n  it('should add/remove item to favorite', () => {\n    cy.visit(`?query=${mockQuery1}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.visit(`?query=${mockQuery2}&headers=${mockHeaders1}`);\n    cy.clickExecuteQuery();\n    cy.get('button[aria-label=\"Show History\"]').click();\n    cy.get('ul.graphiql-history-items li').should('have.length', 2);\n    cy.get('.graphiql-history-item-label').eq(0).should('have.text', 'Test2');\n\n    const favorites =\n      '.graphiql-history ul:first-of-type .graphiql-history-item';\n    const items = '.graphiql-history ul:last-of-type .graphiql-history-item';\n\n    cy.get(\n      '.graphiql-history-item:nth-child(2) > button[aria-label=\"Add favorite\"]',\n    ).click();\n    cy.get('.graphiql-history ul').should('have.length', 2); // favorites and items\n    cy.get(favorites).should('have.length', 1);\n    cy.get(items).should('have.length', 1);\n    cy.get('.graphiql-history-item-label').eq(0).should('have.text', 'Test'); // favorite so now at top of a list\n\n    cy.get(\n      '.graphiql-history-item:nth-child(1) > button[aria-label=\"Remove favorite\"]',\n    ).click();\n    cy.get('.graphiql-history ul').should('have.length', 1); // just items\n    cy.get(items).should('have.length', 2);\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/incremental-delivery.cy.ts",
    "content": "describe('IncrementalDelivery support via fetcher', () => {\n  describe('When operation contains @stream', () => {\n    const testStreamQuery = /* GraphQL */ `\n      query StreamQuery($delay: Int) {\n        streamable(delay: $delay) @stream(initialCount: 2) {\n          text\n        }\n      }\n    `;\n\n    const mockStreamSuccess = {\n      data: {\n        streamable: [\n          { text: 'Hi' },\n          { text: '你好' },\n          { text: 'Hola' },\n          { text: 'أهلاً' },\n          { text: 'Bonjour' },\n          { text: 'سلام' },\n          { text: '안녕' },\n          { text: 'Ciao' },\n          { text: 'हेलो' },\n          { text: 'Здорово' },\n        ],\n      },\n    };\n\n    it('Expects slower streams to resolve in several increments, and the payloads to patch properly', () => {\n      const delay = 100;\n      const timeout = mockStreamSuccess.data.streamable.length * (delay * 1.5);\n\n      cy.visitWithOp({ query: testStreamQuery, variables: { delay } });\n      cy.clickExecuteQuery();\n      cy.wait(timeout);\n      cy.assertQueryResult(mockStreamSuccess);\n    });\n\n    it('Expects a quick stream to resolve in a single increment', () => {\n      cy.visitWithOp({ query: testStreamQuery, variables: { delay: 0 } });\n      cy.clickExecuteQuery();\n      cy.assertQueryResult(mockStreamSuccess);\n    });\n  });\n\n  describe('When operating with @defer', () => {\n    it('Excepts to see a slow response but path properly', () => {\n      const delay = 1000;\n      const timeout = delay * 1.5;\n\n      const testQuery = /* GraphQL */ `\n        query DeferQuery($delay: Int) {\n          deferrable {\n            normalString\n            ... @defer {\n              deferredString(delay: $delay)\n            }\n          }\n        }\n      `;\n\n      cy.visitWithOp({ query: testQuery, variables: { delay } });\n      cy.clickExecuteQuery();\n      cy.wait(timeout);\n      cy.assertQueryResult({\n        data: {\n          deferrable: {\n            normalString: 'Nice',\n            deferredString:\n              'Oops, this took 1 seconds longer than I thought it would!',\n          },\n        },\n      });\n    });\n\n    it('Expects to merge types when members arrive at different times', () => {\n      /*\n      This tests that;\n      1. user ({name}) => { name }\n      2. user ({age}) => { name, age }\n      3. user.friends.0 ({name}) => { name, age, friends: [{name}] } <- can sometimes happen before 4, due to the promise race\n      4. user.friends.0 ({age}) => { name, age, friends: [{name, age}] }\n\n      This shows us that we can deep merge defers, deep merge streams, and also deep merge defers inside streams\n       */\n\n      const delay = 1000;\n      const timeout = 4 /* friends */ * (delay * 1.5);\n\n      const testQuery = /* GraphQL */ `\n        query DeferQuery($delay: Int) {\n          person {\n            name\n            ... @defer {\n              age(delay: $delay)\n            }\n            friends @stream(initialCount: 0) {\n              ... @defer {\n                name\n              }\n              ... @defer {\n                age(delay: $delay)\n              }\n            }\n          }\n        }\n      `;\n\n      cy.visitWithOp({ query: testQuery, variables: { delay } });\n      cy.clickExecuteQuery();\n      cy.wait(timeout);\n      cy.assertQueryResult({\n        data: {\n          person: {\n            name: 'Mark',\n            friends: [\n              { name: 'James', age: 1000 },\n              { name: 'Mary', age: 1000 },\n              { name: 'John', age: 1000 },\n              { name: 'Patrica', age: 1000 },\n            ],\n            age: 1000,\n          },\n        },\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/init.cy.ts",
    "content": "const testQuery = `{\nlongDescriptionType {\n  id\n  image\n  hasArgs\n  test {\n    id\n    isTest\n    __typename\n  }\n }\n}`;\n\nconst mockSuccess = {\n  data: {\n    longDescriptionType: {\n      id: 'abc123',\n      image: '/resources/logo.svg',\n      hasArgs: '{\"defaultValue\":\"test default value\"}',\n      test: {\n        id: 'abc123',\n        isTest: true,\n        __typename: 'Test',\n      },\n    },\n  },\n};\n\ndescribe('GraphiQL On Initialization', () => {\n  it('Renders default value without error', () => {\n    const containers = [\n      '#graphiql',\n      '.graphiql-container',\n      '.graphiql-sessions',\n      '.graphiql-editors',\n      '.graphiql-response',\n      '.graphiql-editor-tool',\n    ];\n    cy.visit('/');\n    cy.get('.graphiql-query-editor').contains('# Welcome to GraphiQL');\n    for (const cSelector of containers) {\n      cy.get(cSelector).should('be.visible');\n    }\n  });\n\n  it('Executes a GraphQL query over HTTP that has the expected result', () => {\n    cy.visitWithOp({ query: testQuery });\n    cy.clickExecuteQuery();\n    cy.assertQueryResult(mockSuccess);\n  });\n  it('Shows the expected error when the schema is invalid', () => {\n    cy.intercept('/graphql', { fixture: 'bad-schema.json' });\n    cy.visit('/');\n    cy.containQueryResult('Names must');\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/keyboard.cy.ts",
    "content": "describe('GraphiQL keyboard interactions', () => {\n  it('Does not prevent the escape key from being handled outside the editor', () => {\n    cy.visit('/');\n    const mockFn = cy.stub().as('escapeHandler');\n    cy.document().then(doc => {\n      doc.addEventListener('keydown', event => {\n        if (event.key === 'Escape') {\n          mockFn();\n        }\n      });\n    });\n\n    cy.get('.graphiql-query-editor textarea').type('{esc}', { force: true });\n\n    cy.get('@escapeHandler').should('have.been.called');\n  });\n\n  it('Does prevent the escape key from being handled outside the editor if closing the autocomplete dialog', () => {\n    cy.visit('/');\n    const mockFn = cy.stub().as('escapeHandler');\n    cy.document().then(doc => {\n      doc.addEventListener('keydown', event => {\n        if (event.key === 'Escape') {\n          mockFn();\n        }\n      });\n    });\n    cy.get('.graphiql-query-editor textarea').type('{\\n  t', { force: true });\n    // Wait autocomplete dialog to appear\n    cy.get('.monaco-list').should('exist');\n    cy.get('.graphiql-query-editor textarea').type('{esc}');\n    cy.get('@escapeHandler').should('not.have.been.called');\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/lint.cy.ts",
    "content": "import { version as graphqlVersion } from 'graphql';\n\ndescribe('Linting', () => {\n  it('Does not mark valid fields', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        {\n          myAlias: id\n          test {\n            id\n          }\n        }\n      `,\n    })\n      .contains('myAlias')\n      .should('not.have.class', 'CodeMirror-lint-mark')\n      .and('not.have.class', 'CodeMirror-lint-mark-error');\n  });\n\n  it('Marks invalid fields as error', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        {\n          doesNotExist\n          test {\n            id\n          }\n        }\n      `,\n    }).assertLinterMarkWithMessage(\n      'doesNotExist',\n      'error',\n      'Cannot query field \"doesNotExist\" on type \"Test\".',\n    );\n  });\n\n  it('Marks deprecated fields as warning', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        {\n          id\n          deprecatedField {\n            id\n          }\n        }\n      `,\n    }).assertLinterMarkWithMessage(\n      'deprecatedField',\n      'warning',\n      'The field Test.deprecatedField is deprecated. No longer in use, try `test` instead.',\n    );\n  });\n\n  it('Marks syntax errors in variables JSON as error', () => {\n    cy.visitWithOp({\n      query: '',\n      variablesString: JSON.stringify({ stringArg: '42' }, null, 2).slice(\n        0,\n        -1,\n      ),\n    }).assertLinterMarkWithMessage(\n      '\"42\"',\n      'error',\n      'Expected comma or closing brace',\n      'variables.json',\n    );\n  });\n\n  it('Marks unused variables as error', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        query WithVariables($stringArg: String) {\n          hasArgs(string: $stringArg)\n        }\n      `,\n      variables: {\n        stringArg: '42',\n        unusedVariable: 'whoops',\n      },\n    }).assertLinterMarkWithMessage(\n      'unusedVariable',\n      'error',\n      'Property unusedVariable is not allowed.',\n    );\n  });\n\n  it('Marks invalid variable type as error', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        query WithVariables($stringArg: String) {\n          hasArgs(string: $stringArg)\n        }\n      `,\n      variables: {\n        stringArg: 42,\n      },\n    }).assertLinterMarkWithMessage(\n      '42',\n      'error',\n      'Incorrect type. Expected one of string, null.',\n      'variables.json',\n    );\n  });\n\n  it('Marks variables with null values for a non-nullable type as error', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        query WithVariables($stringArg: String!) {\n          hasArgs(string: $stringArg)\n        }\n      `,\n      variables: {\n        stringArg: null,\n      },\n    }).assertLinterMarkWithMessage(\n      'null',\n      'error',\n      'Incorrect type. Expected \"string\".',\n      'variables.json',\n    );\n  });\n\n  it('Marks variables with non-object values for a input object type as error', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        query WithVariables($objectArg: TestInput) {\n          hasArgs(object: $objectArg)\n        }\n      `,\n      variables: {\n        objectArg: '42',\n      },\n    }).assertLinterMarkWithMessage(\n      '\"42\"',\n      'error',\n      'Incorrect type. Expected \"object\".',\n      'variables.json',\n    );\n  });\n\n  it('Marks GraphQL syntax errors as error', () => {\n    cy.visitWithOp({\n      query: /* GraphQL */ `\n        {\n          doesNotExist\n          test {\n            id\n          }\n          +++\n        }\n      `,\n    }).assertLinterMarkWithMessage(\n      '+++',\n      'error',\n      graphqlVersion.startsWith('15.')\n        ? 'Syntax Error: Cannot parse the unexpected character \"+\".'\n        : 'Syntax Error: Unexpected character: \"+\".',\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/prettify.cy.ts",
    "content": "import { version } from 'graphql';\n\nlet describeOrSkip = describe.skip;\n\n// hard to account for the extra \\n between 15/16 so these only run for 16 for now\nif (parseInt(version, 10) > 15) {\n  describeOrSkip = describe;\n}\n\nconst prettifiedQuery = `{\n  longDescriptionType {\n    id\n  }\n}`;\n\nconst prettifiedVariables = `{\n  \"a\": 1\n}`;\n\nconst uglyQuery = '{longDescriptionType {id}}';\n\nconst uglyVariables = '{\"a\": 1}';\n\nconst brokenQuery = 'longDescriptionType {id}}';\n\nconst brokenVariables = '\"a\": 1}';\n\ndescribeOrSkip('GraphiQL Prettify', () => {\n  it('should work while click on prettify button', () => {\n    const rawQuery = '{  test\\n\\nid  }';\n    const resultQuery = '{ test id }';\n    cy.visit(`?query=${rawQuery}&onPrettifyQuery=true`);\n    cy.clickPrettify();\n    cy.assertHasValues({ query: resultQuery });\n  });\n\n  it('Regular prettification', () => {\n    cy.visitWithOp({ query: uglyQuery, variablesString: uglyVariables });\n\n    cy.clickPrettify();\n\n    cy.assertHasValues({\n      query: prettifiedQuery,\n      variablesString: prettifiedVariables,\n    });\n  });\n\n  it('Noop prettification', () => {\n    cy.visitWithOp({\n      query: prettifiedQuery,\n      variablesString: prettifiedVariables,\n    });\n\n    cy.clickPrettify();\n\n    cy.assertHasValues({\n      query: prettifiedQuery,\n      variablesString: prettifiedVariables,\n    });\n  });\n\n  it('No crash on bad query', () => {\n    cy.visitWithOp({ query: brokenQuery, variablesString: uglyVariables });\n\n    cy.clickPrettify();\n\n    cy.assertHasValues({\n      query: brokenQuery,\n      variablesString: prettifiedVariables,\n    });\n  });\n\n  it('No crash on bad variablesString', () => {\n    cy.visitWithOp({ query: uglyQuery, variablesString: brokenVariables });\n\n    cy.clickPrettify();\n\n    cy.assertHasValues({\n      query: prettifiedQuery,\n      variablesString: brokenVariables,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/tabs.cy.ts",
    "content": "describe('Tabs', () => {\n  it('Should store editor contents when switching between tabs', () => {\n    cy.visit('?defaultQuery=');\n\n    // Assert that tab visible when there's only one session\n    cy.get('.graphiql-tab-button').eq(0).should('exist');\n    // Enter a query without operation name\n    cy.get('.graphiql-query-editor textarea').type('{id', { force: true });\n\n    // Run the query\n    cy.clickExecuteQuery();\n    // Assert request is not cancelled\n    cy.get('.result-window').should('not.have.text', '');\n\n    // Open a new tab\n    cy.get('.graphiql-tab-add').click();\n\n    // Enter a query\n    cy.get('.graphiql-query-editor textarea').type('query Foo {image', {\n      force: true,\n    });\n    cy.get('.graphiql-tab-button').eq(1).should('have.text', 'Foo');\n\n    // Enter variables\n    cy.get('.graphiql-editor-tool textarea')\n      .eq(0)\n      .type('{\"someVar\":42', { force: true });\n\n    // Enter headers\n    cy.contains('Headers').click();\n    cy.get('.graphiql-editor-tool textarea')\n      .eq(1)\n      .type('{\"someHeader\":\"someValue\"', { force: true });\n\n    // Run the query\n    cy.clickExecuteQuery();\n    // Assert request is not cancelled\n    cy.get('.result-window').should('not.have.text', '');\n    // Switch back to the first tab\n    cy.get('.graphiql-tab-button').eq(0).click();\n\n    // Assert tab titles\n    cy.get('.graphiql-tab-button').eq(0).should('have.text', '<untitled>');\n    cy.get('.graphiql-tab-button').eq(1).should('have.text', 'Foo');\n\n    // Assert editor values\n    cy.assertHasValues({\n      query: '{id}',\n      variablesString: '',\n      headersString: '',\n      response: { data: { id: 'abc123' } },\n    });\n\n    // Switch back to the second tab\n    cy.get('.graphiql-tab-button').eq(1).click();\n\n    // Assert tab titles\n    cy.get('.graphiql-tab-button').eq(0).should('have.text', '<untitled>');\n    cy.get('.graphiql-tab-button').eq(1).should('have.text', 'Foo');\n\n    // Assert editor values\n    cy.assertHasValues({\n      query: 'query Foo {image}',\n      variablesString: '{\"someVar\":42}',\n      headersString: '{\"someHeader\":\"someValue\"}',\n      response: { data: { image: '/resources/logo.svg' } },\n    });\n\n    // Close tab\n    cy.get('.graphiql-tab-button + .graphiql-tab-close').eq(1).click();\n\n    // Assert that tab close button not visible when there is only 1 tab\n    cy.get('.graphiql-tab-button + .graphiql-tab-close').should('not.exist');\n\n    // Assert editor values\n    cy.assertHasValues({\n      query: '{id}',\n      variablesString: '',\n      headersString: '',\n      response: { data: { id: 'abc123' } },\n    });\n  });\n\n  describe('confirmCloseTab()', () => {\n    it('should keep tab when `Cancel` was clicked', () => {\n      cy.on('window:confirm', () => false);\n      cy.visit('?confirmCloseTab=true');\n\n      cy.get('.graphiql-tab-add').click();\n\n      cy.get('.graphiql-tab-button + .graphiql-tab-close').eq(1).click();\n\n      cy.get('.graphiql-tab-button').should('have.length', 2);\n    });\n\n    it('should close tab when `OK` was clicked', () => {\n      cy.on('window:confirm', () => true);\n      cy.visit('?confirmCloseTab=true');\n\n      cy.get('.graphiql-tab-add').click();\n\n      cy.get('.graphiql-tab-button + .graphiql-tab-close').eq(1).click();\n\n      cy.get('.graphiql-tab-button').should('have.length', 1);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/e2e/theme.cy.ts",
    "content": "describe('Theme', () => {\n  describe('`forcedTheme`', () => {\n    it('Switches to light theme when `forcedTheme` is light', () => {\n      cy.visit('?forcedTheme=light');\n      cy.get('body').should('have.class', 'graphiql-light');\n    });\n\n    it('Switches to dark theme when `forcedTheme` is dark', () => {\n      cy.visit('?forcedTheme=dark');\n      cy.get('body').should('have.class', 'graphiql-dark');\n    });\n\n    it('Defaults to light theme when `forcedTheme` value is invalid', () => {\n      cy.visit('?forcedTheme=invalid');\n      cy.get('[data-value=settings]').click();\n      cy.get('.graphiql-dialog-section-title')\n        .eq(1)\n        .should('have.text', 'Theme'); // Check for the presence of the theme dialog\n    });\n  });\n\n  describe('`defaultTheme`', () => {\n    it('should have light theme', () => {\n      cy.visit('?defaultTheme=light');\n      cy.get('body').should('have.class', 'graphiql-light');\n    });\n    it('should have dark theme', () => {\n      cy.visit('?defaultTheme=dark');\n      cy.get('body').should('have.class', 'graphiql-dark');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/cypress/env.d.ts",
    "content": "import type * as monaco from 'monaco-editor';\n\ndeclare global {\n  interface Window {\n    __MONACO: typeof monaco;\n  }\n}\n"
  },
  {
    "path": "packages/graphiql/cypress/fixtures/bad-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\": null,\n          \"fields\": [\n            {\n              \"name\": \"user\",\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\": \"<img src=x onerror=alert(document.domain)>\",\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\": \"\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"<img src=x onerror=alert(document.domain)>\",\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          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"String\",\n          \"description\": \"\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        }\n      ],\n      \"directives\": []\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphiql/cypress/fixtures/example.json",
    "content": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\",\n  \"body\": \"Fixtures are a great way to mock data for responses to routes\"\n}\n"
  },
  {
    "path": "packages/graphiql/cypress/fixtures/fixtures.ts",
    "content": "export const mockBadQuery = 'bad {} query';\n\nexport const mockQuery1 = /* GraphQL */ `\n  query Test($string: String) {\n    test {\n      hasArgs(string: $string)\n    }\n  }\n`;\n\nexport const mockQuery2 = /* GraphQL */ `\n  query Test2 {\n    test {\n      id\n    }\n  }\n`;\n\nexport const mockVariables1 = JSON.stringify({ string: 'string' });\nexport const mockVariables2 = JSON.stringify({ string: 'string2' });\n\nexport const mockHeaders1 = JSON.stringify({ foo: 'bar' });\nexport const mockHeaders2 = JSON.stringify({ foo: 'baz' });\n"
  },
  {
    "path": "packages/graphiql/cypress/plugins/index.ts",
    "content": "// @ts-expect-error -- fixme\nexport default (on, config) => {\n  return config;\n};\n"
  },
  {
    "path": "packages/graphiql/cypress/support/commands.ts",
    "content": "/**\n * This example commands.ts shows you how to create various custom commands and\n * overwrite existing commands.\n *\n * For more comprehensive examples of custom commands, please read more here:\n * https://on.cypress.io/custom-commands\n */\n\n/// <reference types=\"cypress\" />\n\ninterface Op {\n  query: string;\n  variables?: Record<string, any>;\n  variablesString?: string;\n  headersString?: string;\n  response?: Record<string, any>;\n}\n\ndeclare namespace Cypress {\n  type MockResult =\n    | { data: any }\n    | { data: any; hasNext?: boolean }\n    | { error: any[] }\n    | { errors: any[] };\n\n  interface Chainable {\n    /**\n     * Custom command to select a DOM element by `data-cy` attribute.\n     * @example cy.dataCy('greeting')\n     */\n    dataCy(value: string): Chainable<Element>;\n\n    clickExecuteQuery(): Chainable<Element>;\n\n    visitWithOp(op: Op): Chainable<Element>;\n\n    clickPrettify(): Chainable<Element>;\n\n    assertHasValues(op: Op): Chainable<Element>;\n\n    assertQueryResult(expectedResult: MockResult): Chainable<Element>;\n\n    containQueryResult(expectedResult: string): Chainable<Element>;\n\n    assertLinterMarkWithMessage(\n      text: string,\n      severity: 'error' | 'warning',\n      message: string,\n      uri?: 'operation.graphql' | 'variables.json',\n    ): Chainable<Element>;\n  }\n}\n\nCypress.Commands.add('dataCy', value => {\n  cy.get(`[data-cy=\"${value}\"]`);\n});\n\nCypress.Commands.add('clickExecuteQuery', () => {\n  cy.get('.graphiql-execute-button').click();\n});\n\nCypress.Commands.add('clickPrettify', () => {\n  cy.get('[aria-label=\"Prettify query (Shift-Ctrl-P)\"]').click();\n});\n\nCypress.Commands.add('visitWithOp', ({ query, variables, variablesString }) => {\n  let url = `?query=${encodeURIComponent(query)}`;\n  if (variables || variablesString) {\n    url += `&variables=${encodeURIComponent(\n      JSON.stringify(variables, null, 2) || variablesString,\n    )}`;\n  }\n  cy.visit(url);\n});\n\nCypress.Commands.add(\n  'assertHasValues',\n  ({ query, variables, variablesString, headersString, response }: Op) => {\n    cy.get(\n      '.graphiql-query-editor .view-lines.monaco-mouse-cursor-text',\n    ).should(element => {\n      const actual = normalizeMonacoWhitespace(element.get(0).innerText); // should be innerText\n      const expected = query;\n      expect(actual).to.equal(expected);\n    });\n    if (variables !== undefined) {\n      cy.contains('Variables').click();\n      cy.get(\n        '.graphiql-editor-tool .graphiql-editor .view-lines.monaco-mouse-cursor-text',\n      )\n        .eq(0)\n        .should(element => {\n          const actual = normalizeMonacoWhitespace(element.get(0).textContent!);\n          const expected = JSON.stringify(variables, null, 2);\n          expect(actual).to.equal(expected);\n        });\n    }\n    if (variablesString !== undefined) {\n      cy.contains('Variables').click();\n      cy.get(\n        '.graphiql-editor-tool .graphiql-editor .view-lines.monaco-mouse-cursor-text',\n      )\n        .eq(0)\n        .should(element => {\n          const actual = normalizeMonacoWhitespace(element.get(0).innerText); // should be innerText\n          const expected = variablesString;\n          expect(actual).to.equal(expected);\n        });\n    }\n    if (headersString !== undefined) {\n      cy.contains('Headers').click();\n      cy.get(\n        '.graphiql-editor-tool .graphiql-editor .view-lines.monaco-mouse-cursor-text',\n      )\n        .eq(1)\n        .should(element => {\n          const actual = normalizeMonacoWhitespace(element.get(0).textContent!);\n          const expected = headersString;\n          expect(actual).to.equal(expected);\n        });\n    }\n    if (response !== undefined) {\n      cy.get('.result-window').should(element => {\n        const actual = normalizeMonacoWhitespace(element.get(0).innerText); // should be innerText\n        const expected = JSON.stringify(response, null, 2);\n        expect(actual).to.equal(expected);\n      });\n    }\n  },\n);\n\nCypress.Commands.add('assertQueryResult', expectedResult => {\n  cy.get('section.result-window').should(element => {\n    const actual = normalizeMonacoWhitespace(element.get(0).innerText); // should be innerText\n    const expected = JSON.stringify(expectedResult, null, 2);\n    expect(actual).to.equal(expected);\n  });\n});\n\n// Monaco editor adds non-breaking spaces for all spaces, we need to normalize them\nfunction normalizeMonacoWhitespace(str: string): string {\n  return str.replaceAll(' ', ' ');\n}\n\nCypress.Commands.add('containQueryResult', expected => {\n  cy.get('section.result-window').should(element => {\n    const actual = normalizeMonacoWhitespace(element.get(0).textContent!);\n    expect(actual).to.contain(expected);\n  });\n});\n\nCypress.Commands.add(\n  'assertLinterMarkWithMessage',\n  (text, severity, message, uri = 'operation.graphql') => {\n    // Ensure error is visible in the DOM\n    cy.get(`.squiggly-${severity}`, { timeout: 10_000 });\n    cy.window().then(win => {\n      const { editor, MarkerSeverity } = win.__MONACO;\n      const models = editor.getModels();\n      const model = models.find(m => m.uri.path.endsWith(uri))!;\n      const markers = editor.getModelMarkers({\n        resource: model.uri,\n      });\n      // Only \"Property is not allowed.\" isn't added in model markers\n      if (!message.endsWith(' is not allowed.')) {\n        expect(markers.length).to.be.greaterThan(0);\n        expect(markers[0].message).eq(message);\n        const markerSeverity = {\n          error: MarkerSeverity.Error,\n          warning: MarkerSeverity.Warning,\n        }[severity];\n        expect(markers[0].severity).eq(markerSeverity);\n      }\n      cy.contains(text).trigger('mousemove', {\n        // Hover in the right corner, because some errors like `Expected comma or closing brace` are\n        // highlighted at the end\n        position: 'bottomRight',\n        force: true, // otherwise popup doesn't show\n      });\n      cy.contains(message);\n    });\n  },\n);\n"
  },
  {
    "path": "packages/graphiql/cypress/support/e2e.ts",
    "content": "// ***********************************************************\n// This example support/e2e.ts is processed and\n// loaded automatically before your test files.\n//\n// This is a great place to put global configuration and\n// behavior that modifies Cypress.\n//\n// You can change the location of this file or turn off\n// automatically serving support files with the\n// 'supportFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/configuration\n// ***********************************************************\n/// <reference types=\"cypress\" />\n\nimport './commands';\n"
  },
  {
    "path": "packages/graphiql/cypress/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"es2021\", \"dom\"],\n    \"types\": [\"cypress\", \"node\"],\n    \"strictNullChecks\": true,\n    \"strict\": true\n  },\n  \"include\": [\"**/*.ts\"]\n}\n"
  },
  {
    "path": "packages/graphiql/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nconst PORT = process.env.CI === 'true' ? 8080 : 5173;\n\nexport default defineConfig({\n  e2e: {\n    baseUrl: `http://localhost:${PORT}`,\n  },\n  video: true,\n  viewportWidth: 1920,\n  viewportHeight: 1080,\n});\n"
  },
  {
    "path": "packages/graphiql/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=\"/resources/logo.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>GraphiQL</title>\n    <style>\n      body {\n        margin: 0;\n      }\n\n      #graphiql {\n        height: 100dvh;\n      }\n\n      .loading {\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 4rem;\n      }\n    </style>\n    <!--vite-replace-start-->\n    <link href=\"/dist/style.css\" rel=\"stylesheet\" />\n    <script\n      crossorigin\n      src=\"https://unpkg.com/react@18/umd/react.production.min.js\"\n    ></script>\n    <script\n      crossorigin\n      src=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"\n    ></script>\n    <script type=\"module\">\n      /**\n       * Setup workers for GraphiQL UMD bundle\n       */\n      function getWorkerUrl(label) {\n        switch (label) {\n          case 'json':\n            return '/dist/workers/json.worker.js';\n          case 'graphql':\n            return '/dist/workers/graphql.worker.js';\n        }\n        return '/dist/workers/editor.worker.js';\n      }\n\n      globalThis.MonacoEnvironment = {\n        // `MonacoEnvironment.getWorkerUrl` throws Uncaught SyntaxError: Unexpected token 'export',\n        // we use` MonacoEnvironment getWorker` instead\n        getWorker(_workerId, label) {\n          console.log('setup workers in cdn');\n          const url = new URL(getWorkerUrl(label), import.meta.url);\n          return new Worker(url, { type: 'module' });\n        },\n      };\n    </script>\n    <script src=\"/dist/index.umd.js\"></script>\n    <script type=\"module\" src=\"/dist/e2e.js\"></script>\n    <!--vite-replace-end-->\n  </head>\n  <body>\n    <div id=\"graphiql\">\n      <div class=\"loading\">Loading…</div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "packages/graphiql/package.json",
    "content": "{\n  \"name\": \"graphiql\",\n  \"version\": \"5.2.2\",\n  \"sideEffects\": [\n    \"dist/setup-workers/*\"\n  ],\n  \"description\": \"An graphical interactive in-browser GraphQL IDE.\",\n  \"contributors\": [\n    \"Dimitri POSTOLOV <dmytropostolov@gmail.com> (https://dimaMachina.com)\",\n    \"Hyohyeon Jeong <asiandrummer@fb.com>\",\n    \"Lee Byron <lee@leebyron.com> (https://leebyron.com)\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/master/packages/graphiql#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:graphiql\"\n  },\n  \"license\": \"MIT\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"files\": [\n    \"dist\",\n    \"!dist/e2e.*\",\n    \"!dist/workers/*\",\n    \"!dist/index.umd.*\",\n    \"!dist/cdn.*\"\n  ],\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./style.css\": \"./dist/style.css\",\n    \"./graphiql.css\": \"./dist/graphiql.css\",\n    \".\": \"./dist/index.js\",\n    \"./setup-workers/*\": {\n      \"types\": \"./dist/setup-workers/*.d.ts\",\n      \"import\": \"./dist/setup-workers/*.js\"\n    }\n  },\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"build\": \"vite build && UMD=true vite build\",\n    \"cypress-open\": \"cypress open --browser electron\",\n    \"dev\": \"concurrently 'cross-env PORT=8080 node test/e2e-server' vite\",\n    \"e2e\": \"yarn e2e-server 'cypress run'\",\n    \"e2e-server\": \"start-server-and-test 'cross-env PORT=8080 node test/e2e-server' 'http-get://localhost:8080/graphql?query={test { id }}'\",\n    \"test\": \"vitest\"\n  },\n  \"dependencies\": {\n    \"@graphiql/plugin-doc-explorer\": \"^0.4.1\",\n    \"@graphiql/plugin-history\": \"^0.4.1\",\n    \"@graphiql/react\": \"^0.37.3\",\n    \"react-compiler-runtime\": \"19.1.0-rc.1\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\",\n    \"react\": \"^18 || ^19\",\n    \"react-dom\": \"^18 || ^19\"\n  },\n  \"devDependencies\": {\n    \"@graphiql/toolkit\": \"^0.11.3\",\n    \"@testing-library/dom\": \"^10.4.0\",\n    \"@testing-library/jest-dom\": \"^6.6.3\",\n    \"@testing-library/react\": \"^16.3.0\",\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"@vitest/web-worker\": \"3.1.4\",\n    \"babel-plugin-react-compiler\": \"19.1.0-rc.1\",\n    \"cross-env\": \"^7.0.2\",\n    \"cypress\": \"^13.13.2\",\n    \"graphql\": \"^16.11.0\",\n    \"lightningcss\": \"^1.29.3\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"start-server-and-test\": \"^1.10.11\",\n    \"typescript\": \"^4.6.3\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-dts\": \"^4.5.3\",\n    \"vitest-canvas-mock\": \"0.3.3\"\n  },\n  \"browser\": {\n    \"//\": \"esm.sh polyfills `process`, we don't need it\",\n    \"process\": false\n  }\n}\n"
  },
  {
    "path": "packages/graphiql/setup-files.ts",
    "content": "'use no memo';\n\nimport '@testing-library/jest-dom';\nimport { configure } from '@testing-library/react';\n\n// to make it works like Jest (auto-mocking)\nvi.mock('zustand');\nvi.mock('monaco-editor');\n\n// Since we load `monaco-editor` dynamically, we need to allow more time for tests that assert editor values\nconfigure({ asyncUtilTimeout: 9_000 });\n"
  },
  {
    "path": "packages/graphiql/setup-window.ts",
    "content": "/**\n * Fixes TypeError: mainWindow.matchMedia is not a function\n * @see https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nif (!window.matchMedia) {\n  Object.defineProperty(window, 'matchMedia', {\n    writable: false,\n    value: vi.fn().mockImplementation(query => ({\n      matches: false,\n      media: query,\n      onchange: null,\n      addListener: vi.fn(), // deprecated\n      removeListener: vi.fn(), // deprecated\n      addEventListener: vi.fn(),\n      removeEventListener: vi.fn(),\n      dispatchEvent: vi.fn(),\n    })),\n  });\n}\n\nexport {};\n"
  },
  {
    "path": "packages/graphiql/src/GraphiQL.spec.tsx",
    "content": "'use no memo';\n\n/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport { act, render, waitFor, fireEvent } from '@testing-library/react';\nimport { Component, FC, useEffect } from 'react';\nimport { GraphiQL } from './GraphiQL';\nimport type { Fetcher } from '@graphiql/toolkit';\nimport {\n  ToolbarButton,\n  useGraphiQL,\n  useOperationsEditorState,\n  MonacoEditor,\n} from '@graphiql/react';\nimport '@graphiql/react/setup-workers/vite';\n\n// The smallest possible introspection result that builds a schema.\nconst simpleIntrospection = {\n  data: {\n    __schema: {\n      queryType: { name: 'Q' },\n      types: [\n        {\n          kind: 'OBJECT',\n          name: 'Q',\n          interfaces: [],\n          fields: [{ name: 'q', args: [], type: { name: 'Q' } }],\n        },\n      ],\n    },\n  },\n};\n\nbeforeEach(() => {\n  localStorage.clear();\n});\n\ndescribe('GraphiQL', () => {\n  // @ts-expect-error -- fixme\n  const noOpFetcher: Fetcher = () => {};\n\n  describe('fetcher', () => {\n    it('should throw error without fetcher', () => {\n      const spy = vi.spyOn(console, 'error').mockImplementation(() => {});\n\n      // @ts-expect-error fetcher is a required prop to GraphiQL\n      expect(() => render(<GraphiQL />)).toThrow(\n        'The `GraphiQLProvider` component requires a `fetcher` function to be passed as prop.',\n      );\n      spy.mockRestore();\n    });\n\n    it('should construct correctly with fetcher', () => {\n      // `return` fix error:\n      // Warning: An update to GraphiQLInterface inside a test was not wrapped in act(...).\n      return act(() => {\n        expect(() => render(<GraphiQL fetcher={noOpFetcher} />)).not.toThrow();\n      });\n    });\n\n    it('should refetch schema with new fetcher', async () => {\n      let firstCalled = false;\n\n      function firstFetcher() {\n        firstCalled = true;\n        return Promise.resolve(simpleIntrospection);\n      }\n\n      let secondCalled = false;\n\n      function secondFetcher() {\n        secondCalled = true;\n        return Promise.resolve(simpleIntrospection);\n      }\n\n      // Initial render calls fetcher\n      const { rerender } = render(<GraphiQL fetcher={firstFetcher} />);\n\n      await waitFor(() => {\n        expect(firstCalled).toEqual(true);\n      });\n\n      // Re-render does not call fetcher again\n      firstCalled = false;\n      await act(async () => {\n        rerender(<GraphiQL fetcher={firstFetcher} />);\n      });\n\n      await waitFor(() => {\n        expect(firstCalled).toEqual(false);\n      });\n\n      // Re-render with new fetcher is called.\n      await act(async () => {\n        rerender(<GraphiQL fetcher={secondFetcher} />);\n      });\n\n      await waitFor(() => {\n        expect(secondCalled).toEqual(true);\n      });\n    });\n\n    it('should refresh schema with new fetcher after a fetchError', async () => {\n      function firstFetcher() {\n        return Promise.reject('Schema Error');\n      }\n\n      function secondFetcher() {\n        return Promise.resolve(simpleIntrospection);\n      }\n\n      // Use a bad fetcher for our initial render\n      const { rerender, container, getByLabelText } = render(\n        <GraphiQL fetcher={firstFetcher} />,\n      );\n\n      const showDocExplorerButton = getByLabelText(\n        'Show Documentation Explorer',\n      );\n\n      await waitFor(() => {\n        expect(showDocExplorerButton).not.toBe(null);\n      });\n\n      act(() => {\n        fireEvent.click(showDocExplorerButton);\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelector('.graphiql-doc-explorer-error'),\n        ).not.toBe(null);\n      });\n\n      // Re-render with valid fetcher\n      await act(async () => {\n        rerender(<GraphiQL fetcher={secondFetcher} />);\n      });\n\n      await waitFor(() => {\n        expect(container.querySelector('.graphiql-doc-explorer-error')).toBe(\n          null,\n        );\n      });\n    });\n  }); // fetcher\n\n  describe('schema', () => {\n    it('should not throw error if schema missing and query provided', async () => {\n      await act(async () => {\n        expect(() =>\n          render(<GraphiQL fetcher={noOpFetcher} initialQuery=\"{}\" />),\n        ).not.toThrow();\n      });\n    });\n  }); // schema\n\n  describe('default query', () => {\n    it('defaults to the built-in default query', async () => {\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      await waitFor(() => {\n        const queryEditor = container.querySelector<HTMLDivElement>(\n          '.graphiql-editor .monaco-scrollable-element',\n        );\n        expect(queryEditor).toBeVisible();\n        expect(queryEditor!.textContent).toBe('# Welcome to GraphiQL');\n      });\n    });\n\n    it('accepts a custom default query', async () => {\n      const { container } = render(\n        <GraphiQL fetcher={noOpFetcher} defaultQuery=\"GraphQL Party!!\" />,\n      );\n\n      await waitFor(() => {\n        const queryEditor = container.querySelector<HTMLDivElement>(\n          '.graphiql-editor .monaco-scrollable-element',\n        );\n        expect(queryEditor).toBeVisible();\n        expect(queryEditor!.textContent).toBe('GraphQL Party!!');\n      });\n    });\n  }); // default query\n\n  // TODO: rewrite these plugin tests after plugin API has more structure\n  describe('plugins', () => {\n    it('displays correct plugin when visiblePlugin prop is used', async () => {\n      const { container } = render(\n        <GraphiQL\n          fetcher={noOpFetcher}\n          visiblePlugin=\"Documentation Explorer\"\n        />,\n      );\n      await waitFor(() => {\n        expect(\n          container.querySelector('.graphiql-doc-explorer'),\n        ).toBeInTheDocument();\n      });\n    });\n\n    it('defaults to not displaying plugin pane', async () => {\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      await waitFor(() => {\n        expect(container.querySelector('.graphiql-plugin')).not.toBeVisible();\n      });\n    });\n  }); // plugins\n\n  describe('editor tools', () => {\n    it('can control the default editor tools visibility', async () => {\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      const editorToolTabPanelWrap = container.querySelector(\n        '.graphiql-editor-tool',\n      );\n\n      await waitFor(() => {\n        expect(editorToolTabPanelWrap).not.toBeVisible();\n      });\n\n      const secondaryEditorTitle = container.querySelector(\n        '.graphiql-editor-tools',\n      )!;\n\n      // drag the editor tools handle up\n      act(() => {\n        fireEvent.mouseDown(secondaryEditorTitle);\n        fireEvent.mouseMove(secondaryEditorTitle, { buttons: 1, clientY: 50 });\n      });\n\n      await waitFor(() => {\n        expect(editorToolTabPanelWrap).toBeVisible();\n      });\n    });\n\n    it('correctly displays variables editor when using defaultEditorToolsVisibility prop', async () => {\n      const { container } = render(\n        <GraphiQL\n          fetcher={noOpFetcher}\n          defaultEditorToolsVisibility=\"variables\"\n        />,\n      );\n      await waitFor(() => {\n        expect(\n          container.querySelector('[aria-label=\"Variables\"]'),\n        ).toBeVisible();\n      });\n    });\n\n    it('correctly displays request headers editor when using defaultEditorToolsVisibility prop', async () => {\n      const { container } = render(\n        <GraphiQL\n          fetcher={noOpFetcher}\n          defaultEditorToolsVisibility=\"headers\"\n        />,\n      );\n      await waitFor(() => {\n        expect(container.querySelector('[aria-label=\"Headers\"]')).toBeVisible();\n      });\n    });\n\n    it('correctly hides editor tools when using defaultEditorToolsVisibility prop is false but either of the editors has a value', async () => {\n      const { container } = render(\n        <GraphiQL\n          fetcher={noOpFetcher}\n          initialVariables=\"🚀\"\n          defaultEditorToolsVisibility={false}\n        />,\n      );\n\n      const editorToolTabPanelWrap = container.querySelector(\n        '.graphiql-editor-tool',\n      );\n\n      await waitFor(() => {\n        expect(editorToolTabPanelWrap).not.toBeVisible();\n      });\n    });\n  }); // editor tools\n\n  describe('panel resizing', () => {\n    it('readjusts the query wrapper flex style field when the result panel is resized', async () => {\n      // Mock the drag bar width\n      const clientWidthSpy = vi\n        .spyOn(Element.prototype, 'clientWidth', 'get')\n        .mockReturnValue(0);\n      // Mock the container width\n      const boundingClientRectSpy = vi\n        .spyOn(Element.prototype, 'getBoundingClientRect')\n        .mockReturnValue({ left: 0, right: 900 } as DOMRect);\n\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      const dragBar = container.querySelector('.graphiql-horizontal-drag-bar')!;\n      const editors =\n        container.querySelector<HTMLDivElement>('.graphiql-editors')!;\n\n      act(() => {\n        fireEvent.mouseDown(dragBar, {\n          button: 0,\n          ctrlKey: false,\n        });\n\n        fireEvent.mouseMove(dragBar, {\n          buttons: 1,\n          clientX: 700,\n        });\n\n        fireEvent.mouseUp(dragBar);\n      });\n\n      await waitFor(() => {\n        // 700 / (900 - 700) = 3.5\n        expect(editors.style.flex).toEqual('3.5');\n      });\n\n      clientWidthSpy.mockRestore();\n      boundingClientRectSpy.mockRestore();\n    });\n\n    it('allows for resizing the doc explorer correctly', async () => {\n      // Mock the drag bar width\n      const clientWidthSpy = vi\n        .spyOn(Element.prototype, 'clientWidth', 'get')\n        .mockReturnValue(0);\n      // Mock the container width\n      const boundingClientRectSpy = vi\n        .spyOn(Element.prototype, 'getBoundingClientRect')\n        .mockReturnValue({ left: 0, right: 1200 } as DOMRect);\n\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      act(() => {\n        fireEvent.click(\n          container.querySelector(\n            '[aria-label=\"Show Documentation Explorer\"]',\n          )!,\n        );\n      });\n\n      const dragBar = container.querySelector('.graphiql-horizontal-drag-bar')!;\n\n      act(() => {\n        fireEvent.mouseDown(dragBar, {\n          clientX: 3,\n        });\n\n        fireEvent.mouseMove(dragBar, {\n          buttons: 1,\n          clientX: 800,\n        });\n        fireEvent.mouseUp(dragBar);\n      });\n\n      await waitFor(() => {\n        // 797 / (1200 - 797) = 1.977667493796526\n        expect(\n          container.querySelector<HTMLDivElement>('.graphiql-plugin')!.style\n            .flex,\n        ).toBe('1.977667493796526');\n      });\n\n      clientWidthSpy.mockRestore();\n      boundingClientRectSpy.mockRestore();\n    });\n  }); // panel resizing\n\n  it('allows the user to control persisting headers if it is true', async () => {\n    const { container, findByText } = render(\n      <GraphiQL shouldPersistHeaders fetcher={noOpFetcher} />,\n    );\n\n    act(() => {\n      fireEvent.click(\n        container.querySelector('[aria-label=\"Open settings dialog\"]')!,\n      );\n    });\n\n    const element = await findByText('Persist headers');\n    expect(element).toBeInTheDocument();\n  });\n\n  it('allows the user to control persisting headers if it is not passed in', async () => {\n    const { container, findByText } = render(\n      <GraphiQL fetcher={noOpFetcher} />,\n    );\n\n    act(() => {\n      fireEvent.click(\n        container.querySelector('[aria-label=\"Open settings dialog\"]')!,\n      );\n    });\n\n    const element = await findByText('Persist headers');\n    expect(element).toBeInTheDocument();\n  });\n\n  it('does not allow the user to control persisting headers is false', async () => {\n    const { container, findByText } = render(\n      <GraphiQL shouldPersistHeaders={false} fetcher={noOpFetcher} />,\n    );\n\n    act(() => {\n      fireEvent.click(\n        container.querySelector('[aria-label=\"Open settings dialog\"]')!,\n      );\n    });\n\n    const callback = async () => {\n      try {\n        await findByText('Persist headers');\n      } catch {\n        // eslint-disable-next-line no-throw-literal\n        throw 'failed';\n      }\n    };\n    await expect(callback).rejects.toEqual('failed');\n  });\n\n  describe('Tabs', () => {\n    it('show tabs', async () => {\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tabs .graphiql-tab'),\n        ).toHaveLength(1);\n      });\n\n      act(() => {\n        fireEvent.click(container.querySelector('.graphiql-tab-add')!);\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tabs .graphiql-tab'),\n        ).toHaveLength(2);\n      });\n\n      act(() => {\n        fireEvent.click(container.querySelector('.graphiql-tab-add')!);\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tabs .graphiql-tab'),\n        ).toHaveLength(3);\n      });\n    });\n\n    it('each tab has a close button when multiple tabs are open', async () => {\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tab .graphiql-tab-close'),\n        ).toHaveLength(0);\n      });\n\n      act(() => {\n        fireEvent.click(container.querySelector('.graphiql-tab-add')!);\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tab .graphiql-tab-close'),\n        ).toHaveLength(2);\n      });\n\n      act(() => {\n        fireEvent.click(container.querySelector('.graphiql-tab-add')!);\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tab .graphiql-tab-close'),\n        ).toHaveLength(3);\n      });\n    });\n\n    it('close button removes a tab', async () => {\n      const { container } = render(<GraphiQL fetcher={noOpFetcher} />);\n\n      act(() => {\n        fireEvent.click(container.querySelector('.graphiql-tab-add')!);\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tab .graphiql-tab-close'),\n        ).toHaveLength(2);\n      });\n\n      act(() => {\n        fireEvent.click(\n          container.querySelector('.graphiql-tab .graphiql-tab-close')!,\n        );\n      });\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tabs .graphiql-tab'),\n        ).toHaveLength(1);\n        expect(\n          container.querySelectorAll('.graphiql-tab .graphiql-tab-close'),\n        ).toHaveLength(0);\n      });\n    });\n\n    it('shows default tabs', async () => {\n      const { container } = render(\n        <GraphiQL\n          fetcher={noOpFetcher}\n          defaultTabs={[\n            {\n              query: 'query Person { person { name } }',\n            },\n            {\n              query: 'query Image { image }',\n            },\n          ]}\n        />,\n      );\n\n      await waitFor(() => {\n        expect(\n          container.querySelectorAll('.graphiql-tabs .graphiql-tab'),\n        ).toHaveLength(2);\n      });\n    });\n  });\n\n  describe('children overrides', () => {\n    const MyFunctionalComponent = () => {\n      return null;\n    };\n\n    it('properly ignores fragments', async () => {\n      const myFragment = (\n        <>\n          <MyFunctionalComponent />\n          <MyFunctionalComponent />\n        </>\n      );\n\n      const { container, getByRole } = render(\n        <GraphiQL fetcher={noOpFetcher}>{myFragment}</GraphiQL>,\n      );\n\n      await waitFor(() => {\n        expect(\n          container.querySelector('.graphiql-container'),\n        ).toBeInTheDocument();\n        expect(container.querySelector('.graphiql-logo')).toBeInTheDocument();\n        expect(getByRole('toolbar')).toBeInTheDocument();\n      });\n    });\n\n    it('properly ignores non-override children components', async () => {\n      const { container, getByRole } = render(\n        <GraphiQL fetcher={noOpFetcher}>\n          <MyFunctionalComponent />\n        </GraphiQL>,\n      );\n\n      await waitFor(() => {\n        expect(\n          container.querySelector('.graphiql-container'),\n        ).toBeInTheDocument();\n        expect(container.querySelector('.graphiql-logo')).toBeInTheDocument();\n        expect(getByRole('toolbar')).toBeInTheDocument();\n      });\n    });\n\n    it('properly ignores non-override class components', async () => {\n      // eslint-disable-next-line react/prefer-stateless-function\n      class MyClassComponent extends Component {\n        render() {\n          return null;\n        }\n      }\n\n      const { container, getByRole } = render(\n        <GraphiQL fetcher={noOpFetcher}>\n          <MyClassComponent />\n        </GraphiQL>,\n      );\n\n      await waitFor(() => {\n        expect(\n          container.querySelector('.graphiql-container'),\n        ).toBeInTheDocument();\n        expect(container.querySelector('.graphiql-logo')).toBeInTheDocument();\n        expect(getByRole('toolbar')).toBeInTheDocument();\n      });\n    });\n\n    describe('GraphiQL.Logo', () => {\n      it('can be overridden using the exported type', async () => {\n        const { getByText } = render(\n          <GraphiQL fetcher={noOpFetcher}>\n            <GraphiQL.Logo>My Exported Type Logo</GraphiQL.Logo>\n          </GraphiQL>,\n        );\n\n        await waitFor(() => {\n          expect(getByText('My Exported Type Logo')).toBeInTheDocument();\n        });\n      });\n    });\n\n    describe('GraphiQL.Toolbar', () => {\n      it('can be overridden using the exported type', async () => {\n        const { container } = render(\n          <GraphiQL fetcher={noOpFetcher}>\n            <GraphiQL.Toolbar>\n              {() => <ToolbarButton label=\"My Fun Label\" />}\n            </GraphiQL.Toolbar>\n          </GraphiQL>,\n        );\n\n        await waitFor(() => {\n          expect(\n            container.querySelectorAll(\n              '[role=\"toolbar\"] .graphiql-toolbar-button',\n            ),\n          ).toHaveLength(1);\n        });\n      });\n    });\n\n    describe('GraphiQL.Footer', () => {\n      it('can be overridden using the exported type', async () => {\n        const { container } = render(\n          <GraphiQL fetcher={noOpFetcher}>\n            <GraphiQL.Footer>\n              <ToolbarButton label=\"My Fun Label\" />\n            </GraphiQL.Footer>\n          </GraphiQL>,\n        );\n\n        await waitFor(() => {\n          expect(\n            container.querySelectorAll('.graphiql-footer button'),\n          ).toHaveLength(1);\n        });\n      });\n    });\n  });\n\n  it('should support multiple instances', async () => {\n    const queryEditors: Record<0 | 1, MonacoEditor> = Object.create(null);\n\n    const HookConsumer: FC<{ id: 0 | 1 }> = ({ id }) => {\n      const $queryEditor = useGraphiQL(state => state.queryEditor);\n      useEffect(() => {\n        queryEditors[id] = $queryEditor!;\n      }, [$queryEditor, id]);\n      return null;\n    };\n\n    const { container, getAllByLabelText } = render(\n      <>\n        <GraphiQL fetcher={noOpFetcher}>\n          <HookConsumer id={0} />\n        </GraphiQL>\n        <GraphiQL fetcher={noOpFetcher}>\n          <HookConsumer id={1} />\n        </GraphiQL>\n      </>,\n    );\n    const [firstEl, secondEl] = container.querySelectorAll(\n      '.graphiql-container',\n    );\n    expect(firstEl).toBeInTheDocument();\n    expect(secondEl).toBeInTheDocument();\n    const [showDocExplorerButton] = getAllByLabelText(\n      'Show Documentation Explorer',\n    );\n    const [addTab] = getAllByLabelText('New tab');\n    fireEvent.click(showDocExplorerButton!);\n    fireEvent.click(addTab!);\n\n    await waitFor(() => {\n      // Plugin store\n      expect(\n        firstEl!.querySelector('.graphiql-doc-explorer'),\n      ).toBeInTheDocument();\n      expect(\n        secondEl!.querySelector('.graphiql-doc-explorer'),\n      ).not.toBeInTheDocument();\n\n      // Editor store\n      expect(firstEl!.querySelectorAll('.graphiql-tab').length).toBe(2);\n      expect(secondEl!.querySelectorAll('.graphiql-tab').length).toBe(1);\n\n      // Query\n      queryEditors[0].setValue('{__typename}');\n      queryEditors[1].setValue('bar');\n      const editors = container.querySelectorAll<HTMLDivElement>(\n        '.graphiql-query-editor .monaco-scrollable-element',\n      );\n      expect(editors[0]!.textContent).toBe('{__typename}');\n      expect(editors[1]!.textContent).toBe('bar');\n    });\n  });\n\n  it('`useOperationsEditorState` hook', async () => {\n    let hookResult: ReturnType<typeof useOperationsEditorState>;\n    let queryEditor: MonacoEditor;\n\n    const HookConsumer: FC = () => {\n      const $hookResult = useOperationsEditorState();\n      const $queryEditor = useGraphiQL(state => state.queryEditor);\n      useEffect(() => {\n        hookResult = $hookResult;\n        queryEditor = $queryEditor!;\n      }, [$hookResult, $queryEditor]);\n      return null;\n    };\n\n    const { container } = render(\n      <GraphiQL fetcher={noOpFetcher} initialQuery=\"query { hello }\">\n        <HookConsumer />\n      </GraphiQL>,\n    );\n    let editor: HTMLDivElement = null!;\n\n    // Assert initial values\n    await waitFor(() => {\n      editor = container.querySelector<HTMLDivElement>(\n        '.graphiql-editor .monaco-scrollable-element',\n      )!;\n      expect(editor.textContent).toBe('query { hello }');\n      expect(hookResult[0]).toBe('query { hello }');\n    });\n    // Assert value was changed after UI editing\n    await waitFor(() => {\n      const newValue = 'bar';\n      queryEditor.setValue(newValue);\n      expect(editor.textContent).toBe(newValue);\n      expect(hookResult[0]).toBe(newValue);\n    });\n\n    // Assert using hook handler\n    await waitFor(() => {\n      const newValue = 'foo';\n      hookResult[1](newValue);\n      expect(editor.textContent).toBe(newValue);\n      expect(hookResult[0]).toBe(newValue);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql/src/GraphiQL.tsx",
    "content": "/**\n *  Copyright (c) 2020 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport type {\n  MouseEventHandler,\n  ReactNode,\n  FC,\n  ComponentPropsWithoutRef,\n} from 'react';\nimport { useState, Children, useRef, Fragment } from 'react';\nimport {\n  ChevronDownIcon,\n  ChevronUpIcon,\n  ExecuteButton,\n  GraphiQLProvider,\n  HeaderEditor,\n  PlusIcon,\n  QueryEditor,\n  ResponseEditor,\n  Spinner,\n  Tab,\n  Tabs,\n  Tooltip,\n  UnStyledButton,\n  useDragResize,\n  useGraphiQL,\n  pick,\n  VariableEditor,\n  EditorProps,\n  cn,\n  useGraphiQLActions,\n  useMonaco,\n} from '@graphiql/react';\nimport { HistoryStore, HISTORY_PLUGIN } from '@graphiql/plugin-history';\nimport {\n  DocExplorerStore,\n  DOC_EXPLORER_PLUGIN,\n} from '@graphiql/plugin-doc-explorer';\nimport { GraphiQLLogo, GraphiQLToolbar, GraphiQLFooter, Sidebar } from './ui';\n\n/**\n * API docs for this live here:\n *\n * https://graphiql-test.netlify.app/typedoc/modules/graphiql.html#graphiqlprops\n */\nexport interface GraphiQLProps\n  // `children` prop should be optional\n  extends GraphiQLInterfaceProps,\n    Omit<ComponentPropsWithoutRef<typeof GraphiQLProvider>, 'children'>,\n    Omit<ComponentPropsWithoutRef<typeof HistoryStore>, 'children'> {}\n\n/**\n * The top-level React component for GraphiQL, intended to encompass the entire\n * browser viewport.\n *\n * @see https://github.com/graphql/graphiql#usage\n */\nconst GraphiQL_: FC<GraphiQLProps> = ({\n  maxHistoryLength,\n  plugins = [HISTORY_PLUGIN],\n  referencePlugin = DOC_EXPLORER_PLUGIN,\n  onEditQuery,\n  onEditVariables,\n  onEditHeaders,\n  responseTooltip,\n  defaultEditorToolsVisibility,\n  isHeadersEditorEnabled,\n  showPersistHeadersSettings,\n  forcedTheme,\n  confirmCloseTab,\n  className,\n\n  children,\n  ...props\n}) => {\n  // @ts-expect-error -- Prop is removed\n  if (props.toolbar?.additionalContent) {\n    throw new TypeError(\n      'The `toolbar.additionalContent` prop has been removed. Use render props on `GraphiQL.Toolbar` component instead.',\n    );\n  }\n  // @ts-expect-error -- Prop is removed\n  if (props.toolbar?.additionalComponent) {\n    throw new TypeError(\n      'The `toolbar.additionalComponent` prop has been removed. Use render props on `GraphiQL.Toolbar` component instead.',\n    );\n  }\n  // @ts-expect-error -- Prop is removed\n  if (props.keyMap) {\n    throw new TypeError(\n      '`keyMap` was removed. To use Vim or Emacs keybindings in Monaco, you can use community plugins. Monaco Vim: https://github.com/brijeshb42/monaco-vim. Monaco Emacs: https://github.com/aioutecism/monaco-emacs',\n    );\n  }\n  // @ts-expect-error -- Prop is removed\n  if (props.readOnly) {\n    throw new TypeError('The `readOnly` prop has been removed.');\n  }\n  const interfaceProps: GraphiQLInterfaceProps = {\n    // TODO check if `showPersistHeadersSettings` prop is needed, or we can just use `shouldPersistHeaders` instead\n    showPersistHeadersSettings:\n      showPersistHeadersSettings ?? props.shouldPersistHeaders !== false,\n    onEditQuery,\n    onEditVariables,\n    onEditHeaders,\n    responseTooltip,\n    defaultEditorToolsVisibility,\n    isHeadersEditorEnabled,\n    forcedTheme,\n    confirmCloseTab,\n    className,\n  };\n  const hasHistoryPlugin = plugins.includes(HISTORY_PLUGIN);\n  const HistoryToUse = hasHistoryPlugin ? HistoryStore : Fragment;\n  const DocExplorerToUse =\n    referencePlugin === DOC_EXPLORER_PLUGIN ? DocExplorerStore : Fragment;\n\n  return (\n    <GraphiQLProvider\n      plugins={[...(referencePlugin ? [referencePlugin] : []), ...plugins]}\n      referencePlugin={referencePlugin}\n      {...props}\n    >\n      <HistoryToUse {...(hasHistoryPlugin && { maxHistoryLength })}>\n        <DocExplorerToUse>\n          <GraphiQLInterface {...interfaceProps}>{children}</GraphiQLInterface>\n        </DocExplorerToUse>\n      </HistoryToUse>\n    </GraphiQLProvider>\n  );\n};\n\ntype AddSuffix<Obj extends Record<string, any>, Suffix extends string> = {\n  [Key in keyof Obj as `${string & Key}${Suffix}`]: Obj[Key];\n};\n\ntype QueryEditorProps = ComponentPropsWithoutRef<typeof QueryEditor>;\ntype VariableEditorProps = ComponentPropsWithoutRef<typeof VariableEditor>;\ntype HeaderEditorProps = ComponentPropsWithoutRef<typeof HeaderEditor>;\ntype ResponseEditorProps = ComponentPropsWithoutRef<typeof ResponseEditor>;\n\nexport interface GraphiQLInterfaceProps\n  extends EditorProps,\n    AddSuffix<Pick<QueryEditorProps, 'onEdit'>, 'Query'>,\n    AddSuffix<Pick<VariableEditorProps, 'onEdit'>, 'Variables'>,\n    AddSuffix<Pick<HeaderEditorProps, 'onEdit'>, 'Headers'>,\n    Pick<ResponseEditorProps, 'responseTooltip'>,\n    Pick<\n      ComponentPropsWithoutRef<typeof Sidebar>,\n      'forcedTheme' | 'showPersistHeadersSettings'\n    > {\n  children?: ReactNode;\n  /**\n   * Set the default state for the editor tools.\n   * - `false` hides the editor tools\n   * - `true` shows the editor tools\n   * - `'variables'` specifically shows the variables editor\n   * - `'headers'` specifically shows the request headers editor\n   * By default, the editor tools are initially shown when at least one of the\n   * editors has contents.\n   */\n  defaultEditorToolsVisibility?: boolean | 'variables' | 'headers';\n  /**\n   * Toggle if the headers' editor should be shown inside the editor tools.\n   * @default true\n   */\n  isHeadersEditorEnabled?: boolean;\n  /**\n   * Additional class names which will be appended to the container element.\n   */\n  className?: string;\n\n  /**\n   * When the user clicks a close tab button, this function is invoked with\n   * the index of the tab that is about to be closed. It can return a promise\n   * that should resolve to `true` (meaning the tab may be closed) or `false`\n   * (meaning the tab may not be closed).\n   * @param index - The index of the tab that should be closed.\n   */\n  confirmCloseTab?(index: number): Promise<boolean> | boolean;\n}\n\nconst TAB_CLASS_PREFIX = 'graphiql-session-tab-';\n\ntype ButtonHandler = MouseEventHandler<HTMLButtonElement>;\n\nconst LABEL = {\n  newTab: 'New tab',\n};\n\nexport const GraphiQLInterface: FC<GraphiQLInterfaceProps> = ({\n  forcedTheme,\n  isHeadersEditorEnabled = true,\n  defaultEditorToolsVisibility,\n  children: $children,\n  confirmCloseTab,\n  className,\n  onEditQuery,\n  onEditVariables,\n  onEditHeaders,\n  responseTooltip,\n  showPersistHeadersSettings,\n}) => {\n  const { addTab, moveTab, closeTab, changeTab, setVisiblePlugin } =\n    useGraphiQLActions();\n  const {\n    initialVariables,\n    initialHeaders,\n    tabs,\n    activeTabIndex,\n    isFetching,\n    visiblePlugin,\n  } = useGraphiQL(\n    pick(\n      'initialVariables',\n      'initialHeaders',\n      'tabs',\n      'activeTabIndex',\n      'isFetching',\n      'visiblePlugin',\n    ),\n  );\n  const hasMonaco = useMonaco(state => Boolean(state.monaco));\n\n  const PluginContent = visiblePlugin?.content;\n\n  const pluginResize = useDragResize({\n    defaultSizeRelation: 1 / 3,\n    direction: 'horizontal',\n    initiallyHidden: visiblePlugin ? undefined : 'first',\n    onHiddenElementChange(resizableElement) {\n      if (resizableElement === 'first') {\n        setVisiblePlugin(null);\n      }\n    },\n    sizeThresholdSecond: 200,\n    storageKey: 'docExplorerFlex',\n  });\n  const editorResize = useDragResize({\n    direction: 'horizontal',\n    storageKey: 'editorFlex',\n  });\n  const editorToolsResize = useDragResize({\n    defaultSizeRelation: 3,\n    direction: 'vertical',\n    initiallyHidden: ((d: typeof defaultEditorToolsVisibility) => {\n      if (d === 'variables' || d === 'headers') {\n        return;\n      }\n      if (typeof d === 'boolean') {\n        return d ? undefined : 'second';\n      }\n      return initialVariables || initialHeaders ? undefined : 'second';\n    })(defaultEditorToolsVisibility),\n    sizeThresholdSecond: 60,\n    storageKey: 'secondaryEditorFlex',\n  });\n\n  const [activeSecondaryEditor, setActiveSecondaryEditor] = useState<\n    'variables' | 'headers'\n  >(() => {\n    if (\n      defaultEditorToolsVisibility === 'variables' ||\n      defaultEditorToolsVisibility === 'headers'\n    ) {\n      return defaultEditorToolsVisibility;\n    }\n    return !initialVariables && initialHeaders && isHeadersEditorEnabled\n      ? 'headers'\n      : 'variables';\n  });\n\n  const { logo, toolbar, footer, children } = Children.toArray(\n    $children,\n  ).reduce<{\n    logo?: ReactNode;\n    toolbar?: ReactNode;\n    footer?: ReactNode;\n    children: ReactNode[];\n  }>(\n    (acc, curr) => {\n      switch (getChildComponentType(curr)) {\n        case GraphiQL.Logo:\n          acc.logo = curr;\n          break;\n        case GraphiQL.Toolbar:\n          acc.toolbar = curr;\n          break;\n        case GraphiQL.Footer:\n          acc.footer = curr;\n          break;\n        default:\n          acc.children.push(curr);\n      }\n      return acc;\n    },\n    {\n      logo: <GraphiQL.Logo />,\n      toolbar: <GraphiQL.Toolbar />,\n      children: [],\n    },\n  );\n\n  function onClickReference() {\n    if (pluginResize.hiddenElement === 'first') {\n      pluginResize.setHiddenElement(null);\n    }\n  }\n\n  const handleToolsTabClick: ButtonHandler = event => {\n    if (editorToolsResize.hiddenElement === 'second') {\n      editorToolsResize.setHiddenElement(null);\n    }\n    const tabName = event.currentTarget.dataset.name as 'variables' | 'headers';\n    setActiveSecondaryEditor(tabName);\n  };\n\n  const toggleEditorTools: ButtonHandler = () => {\n    editorToolsResize.setHiddenElement(\n      editorToolsResize.hiddenElement === 'second' ? null : 'second',\n    );\n  };\n\n  const handleTabClose: ButtonHandler = async event => {\n    const tabButton = event.currentTarget.previousSibling as HTMLButtonElement;\n    const index = Number(tabButton.id.replace(TAB_CLASS_PREFIX, ''));\n    const shouldCloseTab = confirmCloseTab\n      ? await confirmCloseTab(index)\n      : true;\n\n    if (!shouldCloseTab) {\n      return;\n    }\n    closeTab(index);\n  };\n\n  const handleTabClick: ButtonHandler = event => {\n    const index = Number(event.currentTarget.id.replace(TAB_CLASS_PREFIX, ''));\n    changeTab(index);\n  };\n\n  const editorToolsText = `${editorToolsResize.hiddenElement === 'second' ? 'Show' : 'Hide'} editor tools`;\n\n  const EditorToolsIcon =\n    editorToolsResize.hiddenElement === 'second'\n      ? ChevronUpIcon\n      : ChevronDownIcon;\n\n  const editors = (\n    <div className=\"graphiql-editors\" ref={editorResize.firstRef}>\n      <section\n        className=\"graphiql-query-editor\"\n        aria-label=\"Operation Editor\"\n        ref={editorToolsResize.firstRef}\n      >\n        {hasMonaco ? (\n          <QueryEditor\n            onClickReference={onClickReference}\n            onEdit={onEditQuery}\n          />\n        ) : (\n          <Spinner />\n        )}\n\n        <div\n          className=\"graphiql-toolbar\"\n          role=\"toolbar\"\n          aria-label=\"Editor Commands\"\n        >\n          <ExecuteButton />\n          {toolbar}\n        </div>\n      </section>\n\n      <div ref={editorToolsResize.dragBarRef} className=\"graphiql-editor-tools\">\n        <UnStyledButton\n          type=\"button\"\n          className={cn(\n            activeSecondaryEditor === 'variables' &&\n              editorToolsResize.hiddenElement !== 'second' &&\n              'active',\n          )}\n          onClick={handleToolsTabClick}\n          data-name=\"variables\"\n        >\n          Variables\n        </UnStyledButton>\n        {isHeadersEditorEnabled && (\n          <UnStyledButton\n            type=\"button\"\n            className={cn(\n              activeSecondaryEditor === 'headers' &&\n                editorToolsResize.hiddenElement !== 'second' &&\n                'active',\n            )}\n            onClick={handleToolsTabClick}\n            data-name=\"headers\"\n          >\n            Headers\n          </UnStyledButton>\n        )}\n\n        <Tooltip label={editorToolsText}>\n          <UnStyledButton\n            type=\"button\"\n            onClick={toggleEditorTools}\n            aria-label={editorToolsText}\n            className=\"graphiql-toggle-editor-tools\"\n          >\n            <EditorToolsIcon\n              className=\"graphiql-chevron-icon\"\n              aria-hidden=\"true\"\n            />\n          </UnStyledButton>\n        </Tooltip>\n      </div>\n\n      <section\n        className=\"graphiql-editor-tool\"\n        aria-label={\n          activeSecondaryEditor === 'variables' ? 'Variables' : 'Headers'\n        }\n        ref={editorToolsResize.secondRef}\n      >\n        <VariableEditor\n          className={activeSecondaryEditor === 'variables' ? '' : 'hidden'}\n          onEdit={onEditVariables}\n        />\n        {isHeadersEditorEnabled && (\n          <HeaderEditor\n            className={activeSecondaryEditor === 'headers' ? '' : 'hidden'}\n            onEdit={onEditHeaders}\n          />\n        )}\n      </section>\n    </div>\n  );\n\n  const tabContainerRef = useRef<HTMLUListElement>(null!);\n\n  return (\n    <Tooltip.Provider>\n      <div className={cn('graphiql-container', className)}>\n        <Sidebar\n          forcedTheme={forcedTheme}\n          showPersistHeadersSettings={showPersistHeadersSettings}\n          setHiddenElement={pluginResize.setHiddenElement}\n        />\n        <div className=\"graphiql-main\">\n          <div\n            ref={pluginResize.firstRef}\n            className=\"graphiql-plugin\"\n            style={{\n              // Make sure the container shrinks when containing long\n              // non-breaking texts\n              minWidth: '200px',\n            }}\n          >\n            {PluginContent && <PluginContent />}\n          </div>\n          {visiblePlugin && (\n            <div\n              className=\"graphiql-horizontal-drag-bar\"\n              ref={pluginResize.dragBarRef}\n            />\n          )}\n          <div ref={pluginResize.secondRef} className=\"graphiql-sessions\">\n            <div className=\"graphiql-session-header\">\n              <Tabs\n                ref={tabContainerRef}\n                values={tabs}\n                onReorder={moveTab}\n                aria-label=\"Select active operation\"\n                className=\"no-scrollbar\"\n              >\n                {tabs.map((tab, index, arr) => (\n                  <Tab\n                    key={tab.id}\n                    // Prevent overscroll over container\n                    dragConstraints={tabContainerRef}\n                    value={tab}\n                    isActive={index === activeTabIndex}\n                  >\n                    <Tab.Button\n                      aria-controls=\"graphiql-session\"\n                      id={`graphiql-session-tab-${index}`}\n                      title={tab.title}\n                      onClick={handleTabClick}\n                    >\n                      {tab.title}\n                    </Tab.Button>\n                    {arr.length > 1 && <Tab.Close onClick={handleTabClose} />}\n                  </Tab>\n                ))}\n              </Tabs>\n              <Tooltip label={LABEL.newTab}>\n                <UnStyledButton\n                  type=\"button\"\n                  className=\"graphiql-tab-add\"\n                  onClick={addTab}\n                  aria-label={LABEL.newTab}\n                >\n                  <PlusIcon aria-hidden=\"true\" />\n                </UnStyledButton>\n              </Tooltip>\n              {logo}\n            </div>\n            <div\n              role=\"tabpanel\"\n              id=\"graphiql-session\" // used by aria-controls=\"graphiql-session\"\n              aria-labelledby={`${TAB_CLASS_PREFIX}${activeTabIndex}`}\n            >\n              {editors}\n              <div\n                className=\"graphiql-horizontal-drag-bar\"\n                ref={editorResize.dragBarRef}\n              />\n              <div className=\"graphiql-response\" ref={editorResize.secondRef}>\n                {isFetching && <Spinner />}\n                <ResponseEditor responseTooltip={responseTooltip} />\n                {footer}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      {children}\n    </Tooltip.Provider>\n  );\n};\n\nfunction getChildComponentType(child: ReactNode) {\n  if (\n    child &&\n    typeof child === 'object' &&\n    'type' in child &&\n    typeof child.type === 'function'\n  ) {\n    return child.type;\n  }\n}\n\n// Export main windows/panes to be used separately if desired.\nexport const GraphiQL = Object.assign(GraphiQL_, {\n  Logo: GraphiQLLogo,\n  Toolbar: GraphiQLToolbar,\n  Footer: GraphiQLFooter,\n});\n"
  },
  {
    "path": "packages/graphiql/src/cdn.ts",
    "content": "/**\n *  Copyright (c) 2025 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport { version } from 'react';\nimport * as GraphiQLReact from '@graphiql/react';\nimport { createGraphiQLFetcher, createLocalStorage } from '@graphiql/toolkit';\nimport * as GraphQL from 'graphql';\nimport { GraphiQL } from './GraphiQL';\nimport './setup-workers/vite';\n\nconst majorVersion = parseInt(version.slice(0, 2), 10);\n\nif (majorVersion < 16) {\n  throw new Error(\n    [\n      'GraphiQL 0.18.0 and after is not compatible with React 15 or below.',\n      'If you are using a CDN source (jsdelivr, unpkg, etc), follow this example:',\n      'https://github.com/graphql/graphiql/blob/master/examples/graphiql-cdn/index.html#L49',\n    ].join('\\n'),\n  );\n}\n\n/**\n * For the CDN bundle we add some static properties to the component function\n * so that they can be accessed in the inline-script in the HTML file.\n */\nexport default Object.assign(GraphiQL, {\n  /**\n   * This function is needed in order to easily create a fetcher function.\n   */\n  createFetcher: createGraphiQLFetcher,\n  /**\n   * This function is needed in order to easily generate a custom storage namespace\n   */\n  createLocalStorage,\n  /**\n   * We also add the complete `graphiql-js` exports so that this instance of\n   * `graphiql-js` can be reused from plugin CDN bundles.\n   */\n  GraphQL,\n  /**\n   * We also add the complete `@graphiql/react` exports. These will be included\n   * in the bundle anyway since they make up the `GraphiQL` component, so by\n   * doing this we can reuse them from plugin CDN bundles.\n   */\n  React: GraphiQLReact,\n});\n"
  },
  {
    "path": "packages/graphiql/src/e2e.ts",
    "content": "'use no memo';\n\nimport React, { ComponentProps } from 'react';\nimport ReactDOM from 'react-dom/client';\nimport GraphiQL from './cdn';\nimport type { TabsState, Theme } from '@graphiql/react';\nimport './style.css';\n\n/**\n * CDN GraphiQL Example\n *\n * This is a simple example that provides a primitive query string parser on top of GraphiQL props\n * It assumes a global umd GraphiQL, which would be provided by an index.html in the default example\n *\n * It is used by:\n * - the netlify demo\n * - end-to-end tests\n * - vite dev server\n */\n\ninterface Params {\n  query?: string;\n  variables?: string;\n  headers?: string;\n\n  defaultQuery?: string;\n  defaultHeaders?: string;\n\n  confirmCloseTab?: 'true';\n  onPrettifyQuery?: 'true';\n  forcedTheme?: 'light' | 'dark' | 'system';\n  defaultTheme?: Theme;\n}\n\n// Parse the search string to get url parameters.\nconst parameters: Params = Object.fromEntries(\n  new URLSearchParams(location.search).entries(),\n);\n\n// When the query and variables string is edited, update the URL bar so\n// that it can be easily shared.\nfunction onEditQuery(newQuery: string): void {\n  parameters.query = newQuery;\n  updateURL();\n}\n\nfunction onEditVariables(newVariables: string): void {\n  parameters.variables = newVariables;\n  updateURL();\n}\n\nfunction onEditHeaders(newHeaders: string): void {\n  parameters.headers = newHeaders;\n  updateURL();\n}\n\nfunction onTabChange(tabsState: TabsState): void {\n  const activeTab = tabsState.tabs[tabsState.activeTabIndex]!;\n  parameters.query = activeTab.query ?? undefined;\n  parameters.variables = activeTab.variables ?? undefined;\n  parameters.headers = activeTab.headers ?? undefined;\n  updateURL();\n}\n\nfunction confirmCloseTab(index: number): boolean {\n  // eslint-disable-next-line no-alert\n  return confirm(`Are you sure you want to close tab with index ${index}?`);\n}\n\nfunction onPrettifyQuery(query: string): string {\n  return query.replaceAll(/([ \\n])+/g, ' ');\n}\n\nfunction updateURL(): void {\n  const newSearch = Object.entries(parameters)\n    .filter(([_key, value]) => value)\n    .map(\n      ([key, value]) =>\n        encodeURIComponent(key) + '=' + encodeURIComponent(value),\n    )\n    .join('&');\n  history.replaceState(null, '', `?${newSearch}`);\n}\n\nfunction getSchemaUrl(): string {\n  const isDev = /localhost$/.test(location.hostname);\n\n  if (isDev) {\n    return '/graphql';\n  }\n  return '/.netlify/functions/graphql';\n}\n\n// Render <GraphiQL /> into the body.\n// See the README in the top level of this module to learn more about\n// how you can customize GraphiQL by providing different values or\n// additional child elements.\nconst root = ReactDOM.createRoot(document.getElementById('graphiql')!);\nconst graphqlVersion = GraphiQL.GraphQL.version;\n\nconst props: ComponentProps<typeof GraphiQL> = {\n  fetcher: GraphiQL.createFetcher({\n    url: getSchemaUrl(),\n    subscriptionUrl: 'ws://localhost:8081/subscriptions',\n  }),\n\n  initialQuery: parameters.query,\n  initialVariables: parameters.variables,\n  initialHeaders: parameters.headers,\n\n  defaultQuery: parameters.defaultQuery,\n  defaultHeaders: parameters.defaultHeaders,\n\n  onEditQuery,\n  onEditVariables,\n  onEditHeaders,\n  defaultEditorToolsVisibility: true,\n  isHeadersEditorEnabled: true,\n  shouldPersistHeaders: true,\n  inputValueDeprecation: !graphqlVersion.includes('15.5'),\n  confirmCloseTab:\n    parameters.confirmCloseTab === 'true' ? confirmCloseTab : undefined,\n  onPrettifyQuery:\n    parameters.onPrettifyQuery === 'true' ? onPrettifyQuery : undefined,\n  onTabChange,\n  forcedTheme: parameters.forcedTheme,\n  defaultTheme: parameters.defaultTheme,\n};\n\nfunction App() {\n  return React.createElement(\n    React.StrictMode,\n    null,\n    React.createElement(GraphiQL, props),\n  );\n}\n\nroot.render(React.createElement(App));\n"
  },
  {
    "path": "packages/graphiql/src/graphiql.css",
    "content": "/* Everything */\n.graphiql-container {\n  background-color: hsl(var(--color-base));\n  display: flex;\n  height: 100%;\n  margin: 0;\n  overflow: hidden;\n  width: 100%;\n}\n\n/* The sidebar */\n.graphiql-container .graphiql-sidebar {\n  display: flex;\n  flex-direction: column;\n  padding: var(--px-8);\n  width: var(--sidebar-width);\n  gap: var(--px-8);\n  overflow-y: auto;\n}\n\n.graphiql-container .graphiql-sidebar > button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  height: calc(var(--sidebar-width) - (2 * var(--px-8)));\n  width: calc(var(--sidebar-width) - (2 * var(--px-8)));\n  flex-shrink: 0;\n}\n\n.graphiql-container .graphiql-sidebar button.active {\n  color: hsl(var(--color-neutral));\n}\n\n.graphiql-container .graphiql-sidebar button > svg {\n  height: var(--px-20);\n  width: var(--px-20);\n}\n\n/* The main content, i.e. everything except the sidebar */\n.graphiql-container .graphiql-main {\n  display: flex;\n  flex: 1;\n  min-width: 0;\n}\n\n/* The current session and tabs */\n.graphiql-container .graphiql-sessions {\n  background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  /* Adding the 8px of padding to the inner border radius of the operation editor */\n  border-radius: calc(var(--border-radius-12) + var(--px-8));\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  max-height: 100%;\n  margin: var(--px-16);\n  margin-left: 0;\n  min-width: 0;\n}\n\n/* The session header containing tabs and the logo */\n.graphiql-container .graphiql-session-header {\n  height: var(--session-header-height);\n  align-items: center;\n  display: flex;\n  padding: var(--px-8) var(--px-8) 0;\n  gap: var(--px-8);\n}\n\n/* The button to add a new tab */\nbutton.graphiql-tab-add {\n  padding: var(--px-4);\n\n  & > svg {\n    color: hsla(var(--color-neutral), var(--alpha-secondary));\n    display: block;\n    height: var(--px-16);\n    width: var(--px-16);\n  }\n}\n\n/* The GraphiQL logo */\n.graphiql-container .graphiql-logo {\n  margin-left: auto;\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  font-size: var(--font-size-h4);\n  font-weight: var(--font-weight-medium);\n}\n\n/* Undo default link styling for the default GraphiQL logo link */\n.graphiql-container .graphiql-logo .graphiql-logo-link {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  text-decoration: none;\n\n  &:focus {\n    outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px;\n  }\n}\n\n/* The editor of the session */\n.graphiql-container #graphiql-session {\n  display: flex;\n  flex: 1;\n  padding: 0 var(--px-8) var(--px-8);\n}\n\n/* All editors (operation, variable, request headers) */\n.graphiql-container .graphiql-editors {\n  background-color: hsl(var(--color-base));\n  border-radius: 0 0 var(--border-radius-12) var(--border-radius-12);\n  box-shadow: var(--popover-box-shadow);\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n}\n\n/* The operation editor and the toolbar */\n.graphiql-container .graphiql-query-editor {\n  border-bottom: 1px solid\n    hsla(var(--color-neutral), var(--alpha-background-heavy));\n  padding: var(--px-16);\n  column-gap: var(--px-16);\n  display: flex;\n  width: 100%;\n}\n\n/* The vertical toolbar next to the operation editor */\n.graphiql-container .graphiql-toolbar {\n  width: var(--toolbar-width);\n  display: flex;\n  flex-direction: column;\n  gap: var(--px-8);\n}\n\n.graphiql-container .graphiql-toolbar > button {\n  flex-shrink: 0;\n}\n\n/* The toolbar icons */\n.graphiql-toolbar-icon {\n  color: hsla(var(--color-neutral), var(--alpha-tertiary));\n  display: block;\n  height: calc(var(--toolbar-width) - (var(--px-8) * 2));\n  width: calc(var(--toolbar-width) - (var(--px-8) * 2));\n}\n\n/* The tab bar for editor tools */\n.graphiql-container .graphiql-editor-tools {\n  cursor: row-resize;\n  display: flex;\n  width: 100%;\n  column-gap: var(--px-8);\n  padding: var(--px-8);\n}\n\n.graphiql-container .graphiql-editor-tools button {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n}\n\n.graphiql-container .graphiql-editor-tools button.active {\n  color: hsl(var(--color-neutral));\n}\n\n/* The tab buttons to switch between editor tools */\n.graphiql-container\n  .graphiql-editor-tools\n  > button:not(.graphiql-toggle-editor-tools) {\n  padding: var(--px-8) var(--px-12);\n}\n\n.graphiql-container .graphiql-editor-tools .graphiql-toggle-editor-tools {\n  margin-left: auto;\n}\n\n/* An editor tool, e.g. variables or request headers editor */\n.graphiql-container .graphiql-editor-tool {\n  flex: 1;\n  padding: var(--px-16);\n}\n\n/**\n   * The way CodeMirror editors are styled they overflow their containing\n   * element. For some OS-browser-combinations this might cause overlap issues,\n   * setting the position of this to `relative` makes sure this element will\n   * always be on top of any editors.\n   */\n.graphiql-container .graphiql-toolbar,\n.graphiql-container .graphiql-editor-tools,\n.graphiql-container .graphiql-editor-tool {\n  position: relative;\n}\n\n/* The response view */\n.graphiql-container .graphiql-response {\n  /* Add some padding so it doesn’t touch the tabs */\n  padding-top: var(--px-16);\n  display: flex;\n  width: 100%;\n  flex-direction: column;\n}\n\n/* The results editor wrapping container */\n.graphiql-container .graphiql-response .result-window {\n  position: relative;\n  flex: 1;\n}\n\n/* The footer below the response view */\n.graphiql-container .graphiql-footer {\n  border-top: 1px solid\n    hsla(var(--color-neutral), var(--alpha-background-heavy));\n}\n\n/* The plugin container */\n.graphiql-container .graphiql-plugin {\n  border-left: 1px solid\n    hsla(var(--color-neutral), var(--alpha-background-heavy));\n  flex: 1;\n  overflow-y: auto;\n  padding: var(--px-16);\n}\n\n/* Generic drag bar for horizontal resizing */\n.graphiql-horizontal-drag-bar {\n  width: var(--px-12);\n  cursor: col-resize;\n}\n\n.graphiql-horizontal-drag-bar:hover::after {\n  border: var(--px-2) solid\n    hsla(var(--color-neutral), var(--alpha-background-heavy));\n  border-radius: var(--border-radius-2);\n  content: '';\n  display: block;\n  height: 25%;\n  margin: 0 auto;\n  position: relative;\n  /* (100% - 25%) / 2 = 37.5% */\n  top: 37.5%;\n  width: 0;\n}\n\n.graphiql-container .graphiql-chevron-icon {\n  color: hsla(var(--color-neutral), var(--alpha-tertiary));\n  display: block;\n  height: var(--px-12);\n  margin: var(--px-12);\n  width: var(--px-12);\n}\n\n/* Generic spin animation */\n.graphiql-spin {\n  animation: spin 0.8s linear 0s infinite;\n}\n\n@keyframes spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n/* The header of the settings dialog */\n.graphiql-dialog .graphiql-dialog-header {\n  align-items: center;\n  display: flex;\n  justify-content: space-between;\n  padding: var(--px-24);\n}\n\n/* The title of the settings dialog */\n.graphiql-dialog .graphiql-dialog-title {\n  font-size: var(--font-size-h3);\n  font-weight: var(--font-weight-medium);\n  margin: 0;\n}\n\n/* A section inside the settings dialog */\n.graphiql-dialog .graphiql-dialog-section {\n  align-items: center;\n  border-top: 1px solid\n    hsla(var(--color-neutral), var(--alpha-background-heavy));\n  display: flex;\n  justify-content: space-between;\n  padding: var(--px-24);\n}\n\n.graphiql-dialog .graphiql-dialog-section > :not(:first-child) {\n  margin-left: var(--px-24);\n}\n\n/* The section title in the settings dialog */\n.graphiql-dialog .graphiql-dialog-section-title {\n  font-size: var(--font-size-h4);\n  font-weight: var(--font-weight-medium);\n}\n\n/* The section caption in the settings dialog */\n.graphiql-dialog .graphiql-dialog-section-caption {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n}\n\n.graphiql-dialog .graphiql-warning-text {\n  color: hsl(var(--color-warning));\n  font-weight: var(--font-weight-medium);\n}\n\n.graphiql-dialog .graphiql-table {\n  border-collapse: collapse;\n  width: 100%;\n}\n\n.graphiql-dialog .graphiql-table :is(th, td) {\n  border: 1px solid hsla(var(--color-neutral), var(--alpha-background-heavy));\n  padding: var(--px-8) var(--px-12);\n}\n\n/* A single key the short-key dialog */\n.graphiql-dialog .graphiql-key {\n  background-color: hsla(var(--color-neutral), var(--alpha-background-medium));\n  border-radius: var(--border-radius-4);\n  padding: var(--px-4);\n}\n\n/* Avoid showing native tooltips for icons with titles */\n.graphiql-container svg {\n  pointer-events: none;\n}\n"
  },
  {
    "path": "packages/graphiql/src/index.ts",
    "content": "'use no memo';\n\n/**\n *  Copyright (c) 2025 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport './graphiql.css';\nimport './style.css';\n\nexport {\n  GraphiQL,\n  // https://github.com/graphql/graphiql/issues/4057\n  GraphiQLInterface,\n  type GraphiQLProps,\n  type GraphiQLInterfaceProps,\n} from './GraphiQL';\n\nexport { HISTORY_PLUGIN } from '@graphiql/plugin-history';\n"
  },
  {
    "path": "packages/graphiql/src/setup-workers/esm.sh.ts",
    "content": "import '@graphiql/react/setup-workers/esm.sh';\n"
  },
  {
    "path": "packages/graphiql/src/setup-workers/vite.ts",
    "content": "import '@graphiql/react/setup-workers/vite';\n"
  },
  {
    "path": "packages/graphiql/src/setup-workers/webpack.ts",
    "content": "import '@graphiql/react/setup-workers/webpack';\n"
  },
  {
    "path": "packages/graphiql/src/style.css",
    "content": "/* Monaco import is only needed for CDN bundle */\n@import 'monaco-editor/min/vs/editor/editor.main.css';\n\n@import '@graphiql/react/font/roboto.css';\n@import '@graphiql/react/font/fira-code.css';\n@import '@graphiql/react/style.css';\n@import '@graphiql/plugin-history/style.css';\n@import '@graphiql/plugin-doc-explorer/style.css';\n\n/**\n * Separate CSS without importing fonts/etc\n *\n * @see https://github.com/graphql/graphiql/issues/4058\n */\n@import './graphiql.css';\n"
  },
  {
    "path": "packages/graphiql/src/ui/footer.tsx",
    "content": "import type { FC, ReactNode } from 'react';\n\n// Configure the UI by providing this Component as a child of GraphiQL.\nexport const GraphiQLFooter: FC<{ children: ReactNode }> = ({ children }) => {\n  return <div className=\"graphiql-footer\">{children}</div>;\n};\n"
  },
  {
    "path": "packages/graphiql/src/ui/index.ts",
    "content": "export { GraphiQLFooter } from './footer';\nexport { GraphiQLLogo } from './logo';\nexport { ShortKeys } from './short-keys';\nexport { Sidebar } from './sidebar';\nexport { GraphiQLToolbar } from './toolbar';\n"
  },
  {
    "path": "packages/graphiql/src/ui/logo.tsx",
    "content": "import type { FC, ReactNode } from 'react';\n\nconst defaultGraphiqlLogo = (\n  <a\n    className=\"graphiql-logo-link\"\n    href=\"https://github.com/graphql/graphiql\"\n    target=\"_blank\"\n    rel=\"noreferrer\"\n  >\n    Graph\n    <em>i</em>\n    QL\n  </a>\n);\n\n// Configure the UI by providing this Component as a child of GraphiQL.\nexport const GraphiQLLogo: FC<{ children?: ReactNode }> = ({\n  children = defaultGraphiqlLogo,\n}) => {\n  return <div className=\"graphiql-logo\">{children}</div>;\n};\n"
  },
  {
    "path": "packages/graphiql/src/ui/short-keys.tsx",
    "content": "import { FC, Fragment } from 'react';\nimport { formatShortcutForOS, KEY_MAP } from '@graphiql/react';\n\nconst SHORT_KEYS = Object.entries({\n  'Execute query': formatShortcutForOS(KEY_MAP.runQuery.key),\n  'Open the Command Palette (you must have focus in the editor)': 'F1',\n  'Prettify editors': KEY_MAP.prettify.key,\n  'Copy query': KEY_MAP.copyQuery.key,\n  'Re-fetch schema using introspection': KEY_MAP.refetchSchema.key,\n  'Search in documentation': formatShortcutForOS(KEY_MAP.searchInDocs.key),\n  'Search in editor': formatShortcutForOS(KEY_MAP.searchInEditor.key),\n  'Merge fragments definitions into operation definition':\n    KEY_MAP.mergeFragments.key,\n});\n\nexport const ShortKeys: FC = () => {\n  return (\n    <div>\n      <table className=\"graphiql-table\">\n        <thead>\n          <tr>\n            <th>Short Key</th>\n            <th>Function</th>\n          </tr>\n        </thead>\n        <tbody>\n          {SHORT_KEYS.map(([title, keys]) => (\n            <tr key={title}>\n              <td>\n                {keys.split('-').map((key, index, array) => (\n                  <Fragment key={key}>\n                    <code className=\"graphiql-key\">{key}</code>\n                    {index !== array.length - 1 && ' + '}\n                  </Fragment>\n                ))}\n              </td>\n              <td>{title}</td>\n            </tr>\n          ))}\n        </tbody>\n      </table>\n      <p>\n        This Graph<em>i</em>QL editor uses{' '}\n        <a\n          href=\"https://code.visualstudio.com/docs/reference/default-keybindings\"\n          target=\"_blank\"\n          rel=\"noreferrer\"\n        >\n          Monaco editor shortcuts\n        </a>\n        , with keybindings similar to VS Code. See the full list of shortcuts\n        for{' '}\n        <a\n          href=\"https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf\"\n          target=\"_blank\"\n          rel=\"noreferrer\"\n        >\n          macOS\n        </a>{' '}\n        or{' '}\n        <a\n          href=\"https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf\"\n          target=\"_blank\"\n          rel=\"noreferrer\"\n        >\n          Windows\n        </a>\n        .\n      </p>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql/src/ui/sidebar.tsx",
    "content": "import { FC, type MouseEventHandler, useEffect, useState } from 'react';\nimport {\n  Button,\n  ButtonGroup,\n  cn,\n  Dialog,\n  isMacOs,\n  KEY_MAP,\n  KeyboardShortcutIcon,\n  pick,\n  ReloadIcon,\n  SettingsIcon,\n  Tooltip,\n  UnStyledButton,\n  useDragResize,\n  useGraphiQL,\n  useGraphiQLActions,\n  VisuallyHidden,\n} from '@graphiql/react';\nimport { ShortKeys } from './short-keys';\n\ntype ButtonHandler = MouseEventHandler<HTMLButtonElement>;\n\nconst LABEL = {\n  refetchSchema: `Re-fetch GraphQL schema (${KEY_MAP.refetchSchema.key})`,\n  shortCutDialog: 'Open short keys dialog',\n  settingsDialogs: 'Open settings dialog',\n};\n\nconst THEMES = ['light', 'dark', 'system'] as const;\n\ninterface SidebarProps {\n  /**\n   * `forcedTheme` allows enforcement of a specific theme for GraphiQL.\n   * This is useful when you want to make sure that GraphiQL is always\n   * rendered with a specific theme.\n   */\n  forcedTheme?: (typeof THEMES)[number];\n\n  /**\n   * Indicates if settings for persisting headers should appear in the\n   * settings modal.\n   */\n  showPersistHeadersSettings?: boolean;\n\n  setHiddenElement: ReturnType<typeof useDragResize>['setHiddenElement'];\n}\n\nexport const Sidebar: FC<SidebarProps> = ({\n  forcedTheme: $forcedTheme,\n  showPersistHeadersSettings,\n  setHiddenElement,\n}) => {\n  const forcedTheme =\n    $forcedTheme && THEMES.includes($forcedTheme) ? $forcedTheme : undefined;\n  const { setShouldPersistHeaders, introspect, setVisiblePlugin, setTheme } =\n    useGraphiQLActions();\n  const {\n    shouldPersistHeaders,\n    isIntrospecting,\n    visiblePlugin,\n    plugins,\n    theme,\n    storage,\n  } = useGraphiQL(\n    pick(\n      'shouldPersistHeaders',\n      'isIntrospecting',\n      'visiblePlugin',\n      'plugins',\n      'theme',\n      'storage',\n    ),\n  );\n\n  useEffect(() => {\n    if (forcedTheme === 'system') {\n      setTheme(null);\n    } else if (forcedTheme === 'light' || forcedTheme === 'dark') {\n      setTheme(forcedTheme);\n    }\n  }, [forcedTheme, setTheme]);\n\n  const [showDialog, setShowDialog] = useState<\n    'settings' | 'short-keys' | null\n  >(null);\n  const [clearStorageStatus, setClearStorageStatus] = useState<\n    'success' | 'error' | undefined\n  >();\n\n  useEffect(() => {\n    function openSettings(event: KeyboardEvent) {\n      if ((isMacOs ? event.metaKey : event.ctrlKey) && event.key === ',') {\n        event.preventDefault(); // prevent default browser settings dialog\n        setShowDialog(prev => (prev === 'settings' ? null : 'settings'));\n      }\n    }\n\n    window.addEventListener('keydown', openSettings);\n    return () => {\n      window.removeEventListener('keydown', openSettings);\n    };\n  }, []);\n\n  function handleOpenShortKeysDialog(isOpen: boolean) {\n    if (!isOpen) {\n      setShowDialog(null);\n    }\n  }\n\n  function handleOpenSettingsDialog(isOpen: boolean) {\n    if (!isOpen) {\n      setShowDialog(null);\n      setClearStorageStatus(undefined);\n    }\n  }\n\n  function handleClearData() {\n    try {\n      storage.clear();\n      setClearStorageStatus('success');\n    } catch {\n      setClearStorageStatus('error');\n    }\n  }\n\n  const handlePersistHeaders: ButtonHandler = event => {\n    setShouldPersistHeaders(event.currentTarget.dataset.value === 'true');\n  };\n\n  const handleChangeTheme: ButtonHandler = event => {\n    const selectedTheme = event.currentTarget.dataset.theme as\n      | 'light'\n      | 'dark'\n      | undefined;\n    setTheme(selectedTheme || null);\n  };\n\n  const handleShowDialog: ButtonHandler = event => {\n    setShowDialog(\n      event.currentTarget.dataset.value as 'short-keys' | 'settings',\n    );\n  };\n\n  const handlePluginClick: ButtonHandler = event => {\n    const pluginIndex = Number(event.currentTarget.dataset.index!);\n    const plugin = plugins.find((_, index) => pluginIndex === index)!;\n    const isVisible = plugin === visiblePlugin;\n    if (isVisible) {\n      setVisiblePlugin(null);\n      setHiddenElement('first');\n    } else {\n      setVisiblePlugin(plugin);\n      setHiddenElement(null);\n    }\n  };\n\n  return (\n    <div className=\"graphiql-sidebar\">\n      {plugins.map((plugin, index) => {\n        const isVisible = plugin === visiblePlugin;\n        const label = `${isVisible ? 'Hide' : 'Show'} ${plugin.title}`;\n        return (\n          <Tooltip key={plugin.title} label={label}>\n            <UnStyledButton\n              type=\"button\"\n              className={cn(isVisible && 'active')}\n              onClick={handlePluginClick}\n              data-index={index}\n              aria-label={label}\n            >\n              <plugin.icon aria-hidden=\"true\" />\n            </UnStyledButton>\n          </Tooltip>\n        );\n      })}\n      <Tooltip label={LABEL.refetchSchema}>\n        <UnStyledButton\n          type=\"button\"\n          disabled={isIntrospecting}\n          onClick={introspect}\n          aria-label={LABEL.refetchSchema}\n          style={{ marginTop: 'auto' }}\n        >\n          <ReloadIcon\n            className={cn(isIntrospecting && 'graphiql-spin')}\n            aria-hidden=\"true\"\n          />\n        </UnStyledButton>\n      </Tooltip>\n      <Tooltip label={LABEL.shortCutDialog}>\n        <UnStyledButton\n          type=\"button\"\n          data-value=\"short-keys\"\n          onClick={handleShowDialog}\n          aria-label={LABEL.shortCutDialog}\n        >\n          <KeyboardShortcutIcon aria-hidden=\"true\" />\n        </UnStyledButton>\n      </Tooltip>\n      <Tooltip label={LABEL.settingsDialogs}>\n        <UnStyledButton\n          type=\"button\"\n          data-value=\"settings\"\n          onClick={handleShowDialog}\n          aria-label={LABEL.settingsDialogs}\n        >\n          <SettingsIcon aria-hidden=\"true\" />\n        </UnStyledButton>\n      </Tooltip>\n      <Dialog\n        open={showDialog === 'short-keys'}\n        onOpenChange={handleOpenShortKeysDialog}\n      >\n        <div className=\"graphiql-dialog-header\">\n          <Dialog.Title className=\"graphiql-dialog-title\">\n            Short Keys\n          </Dialog.Title>\n          <VisuallyHidden>\n            {/* Fixes Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent} */}\n            <Dialog.Description>\n              This modal provides a list of available keyboard shortcuts and\n              their functions.\n            </Dialog.Description>\n          </VisuallyHidden>\n          <Dialog.Close />\n        </div>\n        <div className=\"graphiql-dialog-section\">\n          <ShortKeys />\n        </div>\n      </Dialog>\n      <Dialog\n        open={showDialog === 'settings'}\n        onOpenChange={handleOpenSettingsDialog}\n      >\n        <div className=\"graphiql-dialog-header\">\n          <Dialog.Title className=\"graphiql-dialog-title\">\n            Settings\n          </Dialog.Title>\n          <VisuallyHidden>\n            {/* Fixes Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent} */}\n            <Dialog.Description>\n              This modal lets you adjust header persistence, interface theme,\n              and clear local storage.\n            </Dialog.Description>\n          </VisuallyHidden>\n          <Dialog.Close />\n        </div>\n        {showPersistHeadersSettings ? (\n          <div className=\"graphiql-dialog-section\">\n            <div>\n              <div className=\"graphiql-dialog-section-title\">\n                Persist headers\n              </div>\n              <div className=\"graphiql-dialog-section-caption\">\n                Save headers upon reloading.{' '}\n                <span className=\"graphiql-warning-text\">\n                  Only enable if you trust this device.\n                </span>\n              </div>\n            </div>\n            <ButtonGroup>\n              <Button\n                type=\"button\"\n                id=\"enable-persist-headers\"\n                className={cn(shouldPersistHeaders && 'active')}\n                data-value=\"true\"\n                onClick={handlePersistHeaders}\n              >\n                On\n              </Button>\n              <Button\n                type=\"button\"\n                id=\"disable-persist-headers\"\n                className={cn(!shouldPersistHeaders && 'active')}\n                onClick={handlePersistHeaders}\n              >\n                Off\n              </Button>\n            </ButtonGroup>\n          </div>\n        ) : null}\n        {!forcedTheme && (\n          <div className=\"graphiql-dialog-section\">\n            <div>\n              <div className=\"graphiql-dialog-section-title\">Theme</div>\n              <div className=\"graphiql-dialog-section-caption\">\n                Adjust how the interface appears.\n              </div>\n            </div>\n            <ButtonGroup>\n              <Button\n                type=\"button\"\n                className={cn(theme === null && 'active')}\n                onClick={handleChangeTheme}\n              >\n                System\n              </Button>\n              <Button\n                type=\"button\"\n                className={cn(theme === 'light' && 'active')}\n                data-theme=\"light\"\n                onClick={handleChangeTheme}\n              >\n                Light\n              </Button>\n              <Button\n                type=\"button\"\n                className={cn(theme === 'dark' && 'active')}\n                data-theme=\"dark\"\n                onClick={handleChangeTheme}\n              >\n                Dark\n              </Button>\n            </ButtonGroup>\n          </div>\n        )}\n        <div className=\"graphiql-dialog-section\">\n          <div>\n            <div className=\"graphiql-dialog-section-title\">Clear storage</div>\n            <div className=\"graphiql-dialog-section-caption\">\n              Remove all locally stored data and start fresh.\n            </div>\n          </div>\n          <Button\n            type=\"button\"\n            state={clearStorageStatus}\n            disabled={clearStorageStatus === 'success'}\n            onClick={handleClearData}\n          >\n            {{\n              success: 'Cleared data',\n              error: 'Failed',\n            }[clearStorageStatus!] || 'Clear data'}\n          </Button>\n        </div>\n      </Dialog>\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql/src/ui/toolbar.tsx",
    "content": "import type { FC, ReactElement, ReactNode } from 'react';\nimport {\n  CopyIcon,\n  KEY_MAP,\n  MergeIcon,\n  PrettifyIcon,\n  ToolbarButton,\n  useGraphiQLActions,\n} from '@graphiql/react';\n\nconst DefaultToolbarRenderProps: FC<{\n  prettify: ReactNode;\n  copy: ReactNode;\n  merge: ReactNode;\n}> = ({ prettify, copy, merge }) => (\n  <>\n    {prettify}\n    {merge}\n    {copy}\n  </>\n);\n\n/**\n * Configure the UI by providing this Component as a child of GraphiQL.\n */\nexport const GraphiQLToolbar: FC<{\n  children?: typeof DefaultToolbarRenderProps | ReactNode;\n}> = ({ children = DefaultToolbarRenderProps }) => {\n  const isRenderProp = typeof children === 'function';\n  const { copyQuery, prettifyEditors, mergeQuery } = useGraphiQLActions();\n\n  if (!isRenderProp) {\n    return children as ReactElement;\n  }\n\n  const prettify = (\n    <ToolbarButton\n      onClick={prettifyEditors}\n      label={`Prettify query (${KEY_MAP.prettify.key})`}\n    >\n      <PrettifyIcon className=\"graphiql-toolbar-icon\" aria-hidden=\"true\" />\n    </ToolbarButton>\n  );\n\n  const merge = (\n    <ToolbarButton\n      onClick={mergeQuery}\n      label={`Merge fragments into query (${KEY_MAP.mergeFragments.key})`}\n    >\n      <MergeIcon className=\"graphiql-toolbar-icon\" aria-hidden=\"true\" />\n    </ToolbarButton>\n  );\n\n  const copy = (\n    <ToolbarButton\n      onClick={copyQuery}\n      label={`Copy query (${KEY_MAP.copyQuery.key})`}\n    >\n      <CopyIcon className=\"graphiql-toolbar-icon\" aria-hidden=\"true\" />\n    </ToolbarButton>\n  );\n\n  return children({ prettify, copy, merge });\n};\n"
  },
  {
    "path": "packages/graphiql/test/README.md",
    "content": "# Test GraphiQL Application\n\nThis test folder serves as a basis for testing in-development changes and offers\nwatching/compiling of the `src` folder. To utilize this, simply:\n\n1. Run `npm install`\n2. Run `npm run dev`\n3. Open your browser to the address listed in your console. e.g.\n   `Started on http://localhost:49811/`\n"
  },
  {
    "path": "packages/graphiql/test/e2e-server.js",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\n/* eslint-disable no-console */\nimport { createServer } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport express from 'express';\nimport { useServer } from 'graphql-ws/use/ws';\nimport { WebSocketServer } from 'ws';\nimport {\n  getGraphQLParameters,\n  processRequest,\n  sendResult,\n} from 'graphql-helix'; // update when `graphql-http` is upgraded to support multipart requests for incremental delivery https://github.com/graphql/graphiql/pull/3682#discussion_r1715545279\nimport * as graphql from 'graphql';\n\nimport { createSchema } from './schema.js';\nimport { createExecute } from './execute.js';\n\nconst schema = createSchema(graphql);\nconst customExecute = createExecute(graphql);\n\nconst app = express();\n\nasync function handler(req, res) {\n  const request = {\n    body: req.body,\n    headers: req.headers,\n    method: req.method,\n    query: req.query,\n  };\n\n  const { operationName, query, variables } = getGraphQLParameters(request);\n\n  const result = await processRequest({\n    operationName,\n    query,\n    variables,\n    request,\n    schema,\n    execute: customExecute,\n  });\n\n  sendResult(result, res);\n}\n\n// Server\napp.use(express.json());\n\napp.post('/graphql', handler);\napp.get('/graphql', handler);\n\n// On CI we test the UMD build\nif (process.env.CI === 'true') {\n  const __dirname = path.dirname(fileURLToPath(import.meta.url));\n  // const __dirname = import.meta.dirname; // can be converted to, after Node.js upgrade to v20\n  app.use(express.static(path.join(__dirname, '..')));\n} else {\n  app.get('/', (req, res) => {\n    res.redirect('http://localhost:5173');\n  });\n}\n\n// messy but it allows close\nconst server = createServer(app);\n\nserver.listen(process.env.PORT || 3100, function () {\n  const { port } = this.address();\n\n  console.log(`Started on http://localhost:${port}`);\n  console.log('PID', process.pid);\n\n  process.once('SIGINT', () => {\n    process.exit();\n  });\n  process.once('SIGTERM', () => {\n    process.exit();\n  });\n});\n\nconst wsServer = new WebSocketServer({\n  path: '/subscriptions',\n  port: 8081,\n});\n\n// eslint-disable-next-line react-hooks/rules-of-hooks\nuseServer({ schema }, wsServer);\n"
  },
  {
    "path": "packages/graphiql/test/execute.js",
    "content": "export function createExecute({\n  execute,\n  experimentalExecuteIncrementally,\n  version,\n}) {\n  if (parseInt(version, 10) < 17) {\n    return execute;\n  }\n  return async (...args) => {\n    const result = await experimentalExecuteIncrementally(...args);\n\n    if (!('subsequentResults' in result)) {\n      return result;\n    }\n\n    const { initialResult, subsequentResults } = result;\n    if (typeof subsequentResults[Symbol.asyncIterator] !== 'function') {\n      return result;\n    }\n\n    return (async function* () {\n      yield initialResult;\n      yield* subsequentResults;\n    })();\n  };\n}\n"
  },
  {
    "path": "packages/graphiql/test/package.json",
    "content": "{\n  \"type\": \"module\",\n  \"name\": \"test-server\",\n  \"private\": true,\n  \"dependencies\": {\n    \"express\": \"^4.20.0\",\n    \"graphql\": \"^17.0.0-alpha.8\",\n    \"graphql-helix\": \"^1.13.0\",\n    \"graphql-ws\": \"^6.0.5\",\n    \"ws\": \"8.17.1\"\n  }\n}\n"
  },
  {
    "path": "packages/graphiql/test/schema.js",
    "content": "/* eslint-disable no-await-in-loop */\n\n/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n/**\n * Create GraphQL schema from `graphql-js` 16 or 17.\n */\nexport function createSchema({\n  GraphQLSchema,\n  GraphQLObjectType,\n  GraphQLUnionType,\n  GraphQLEnumType,\n  GraphQLInputObjectType,\n  GraphQLInterfaceType,\n  GraphQLBoolean,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLString,\n  GraphQLID,\n  GraphQLList,\n  GraphQLDeferDirective,\n  GraphQLStreamDirective,\n  specifiedDirectives,\n  version,\n}) {\n  const directives =\n    parseInt(version, 10) > 16\n      ? [...specifiedDirectives, GraphQLDeferDirective, GraphQLStreamDirective]\n      : specifiedDirectives;\n  // Test Schema\n  const TestEnum = new GraphQLEnumType({\n    name: 'TestEnum',\n    description: 'An enum of super cool colors.',\n    values: {\n      RED: { description: 'A rosy color' },\n      GREEN: { description: 'The color of martians and slime' },\n      BLUE: {\n        description: \"A feeling you might have if you can't use GraphQL\",\n      },\n      GRAY: {\n        description: 'A really dull color',\n        deprecationReason: 'Colors are available now.',\n      },\n    },\n  });\n\n  const TestInputObject = new GraphQLInputObjectType({\n    name: 'TestInput',\n    description: 'Test all sorts of inputs in this input object type.',\n    fields: () => ({\n      string: {\n        type: GraphQLString,\n        description: 'Repeats back this string',\n      },\n      int: { type: GraphQLInt },\n      float: { type: GraphQLFloat },\n      boolean: { type: GraphQLBoolean },\n      id: { type: GraphQLID },\n      enum: { type: TestEnum },\n      object: { type: TestInputObject },\n      defaultValueString: {\n        type: GraphQLString,\n        defaultValue: 'test default value',\n      },\n      defaultValueBoolean: {\n        type: GraphQLBoolean,\n        defaultValue: false,\n      },\n      defaultValueInt: {\n        type: GraphQLInt,\n        defaultValue: 5,\n      },\n      // List\n      listString: { type: new GraphQLList(GraphQLString) },\n      listInt: { type: new GraphQLList(GraphQLInt) },\n      listFloat: { type: new GraphQLList(GraphQLFloat) },\n      listBoolean: { type: new GraphQLList(GraphQLBoolean) },\n      listID: { type: new GraphQLList(GraphQLID) },\n      listEnum: { type: new GraphQLList(TestEnum) },\n      listObject: { type: new GraphQLList(TestInputObject) },\n    }),\n  });\n\n  const TestInterface = new GraphQLInterfaceType({\n    name: 'TestInterface',\n    description: 'Test interface.',\n    fields: () => ({\n      name: {\n        type: GraphQLString,\n        description: 'Common name string.',\n      },\n    }),\n    resolveType(check) {\n      return check ? UnionFirst : UnionSecond;\n    },\n  });\n\n  const UnionFirst = new GraphQLObjectType({\n    name: 'First',\n    fields: () => ({\n      name: {\n        type: GraphQLString,\n        description: 'Common name string for UnionFirst.',\n      },\n      first: {\n        type: new GraphQLList(TestInterface),\n        resolve: () => true,\n      },\n    }),\n    interfaces: [TestInterface],\n  });\n\n  const UnionSecond = new GraphQLObjectType({\n    name: 'Second',\n    fields: () => ({\n      name: {\n        type: GraphQLString,\n        description: 'Common name string for UnionFirst.',\n      },\n      second: {\n        type: TestInterface,\n        resolve: () => false,\n      },\n    }),\n    interfaces: [TestInterface],\n  });\n\n  const TestUnion = new GraphQLUnionType({\n    name: 'TestUnion',\n    types: [UnionFirst, UnionSecond],\n    resolveType: () => UnionFirst,\n  });\n\n  const Greeting = new GraphQLObjectType({\n    name: 'Greeting',\n    fields: {\n      text: {\n        type: GraphQLString,\n      },\n    },\n  });\n\n  const delayArgument = (defaultValue = 400) => ({\n    description:\n      'delay in milliseconds for subsequent results, for demonstration purposes',\n    type: GraphQLInt,\n    defaultValue,\n  });\n\n  const DeferrableObject = new GraphQLObjectType({\n    name: 'Deferrable',\n    fields: {\n      normalString: {\n        type: GraphQLString,\n        resolve: () => 'Nice',\n      },\n      deferredString: {\n        args: {\n          delay: delayArgument(600),\n        },\n        type: GraphQLString,\n        resolve: async function lazilyReturnValue(_value, args) {\n          const seconds = args.delay / 1000;\n          await sleep(args.delay);\n          return `Oops, this took ${seconds} seconds longer than I thought it would!`;\n        },\n      },\n    },\n  });\n\n  const Person = new GraphQLObjectType({\n    name: 'Person',\n    fields: () => ({\n      name: {\n        type: GraphQLString,\n        resolve: obj => obj.name,\n      },\n      age: {\n        args: {\n          delay: delayArgument(600),\n        },\n        type: GraphQLInt,\n        resolve: async function lazilyReturnValue(_value, args) {\n          await sleep(args.delay);\n          return Math.ceil(args.delay);\n        },\n      },\n      friends: {\n        type: new GraphQLList(Person),\n        async *resolve(_value, _args) {\n          const names = ['James', 'Mary', 'John', 'Patrica']; // Top 4 names https://ssa.gov/oact/babynames/decades/century.html\n          for (const name of names) {\n            await sleep(100);\n            yield { name };\n          }\n        },\n      },\n    }),\n  });\n\n  const sleep = async timeout =>\n    new Promise(resolve => setTimeout(resolve, timeout));\n\n  const longDescription = `\nThe \\`longDescriptionType\\` field on the \\`Test\\` type has a long, verbose, description to test inline field docs.\n\n> We want to test several \\`markdown\\` styles!\n\nCheck out [Markdown](https://markdownguide.org) by the way.\n\nSome notes:\n- Lists\n- work\n  - also nested\n  - and with very very very very very very very very very very long items that span multiple lines\n- you get the gist\n\nTO-DO's:\n1. Open GraphiQL\n1. Write a query\n   1. Maybe add some variables\n   1. Could also add headers\n1. Send the request\n\nExample query:\n\\`\\`\\`graphql\n{\n  test {\n    id\n  }\n  hasArgs(string: \"very very very very very long string\")\n}\n\\`\\`\\`\n\nAnd we have a local image:\n\n![GraphQL Logo](/resources/logo.svg)\n\nAnd external image:\n\n![Cat](https://placecats.com/300/200)\n`.trim();\n\n  const TestType = new GraphQLObjectType({\n    name: 'Test',\n    description: 'Test type for testing\\n New line works',\n    fields: () => ({\n      test: {\n        type: TestType,\n        description: '`test` field from `Test` type.',\n        resolve: () => ({}),\n      },\n      deferrable: {\n        type: DeferrableObject,\n        resolve: () => ({}),\n      },\n      streamable: {\n        type: new GraphQLList(Greeting),\n        args: {\n          delay: delayArgument(300),\n        },\n        async *resolve(_value, args) {\n          let i = 0;\n          for (const hi of [\n            'Hi',\n            '你好',\n            'Hola',\n            'أهلاً',\n            'Bonjour',\n            'سلام',\n            '안녕',\n            'Ciao',\n            'हेलो',\n            'Здорово',\n          ]) {\n            if (i > 2) {\n              await sleep(args.delay);\n            }\n            i++;\n            yield { text: hi };\n          }\n        },\n      },\n      person: {\n        type: Person,\n        resolve: () => ({ name: 'Mark' }),\n      },\n      longDescriptionType: {\n        type: TestType,\n        description: longDescription,\n        resolve: () => ({}),\n      },\n      union: {\n        type: TestUnion,\n        resolve: () => ({}),\n      },\n      id: {\n        type: GraphQLID,\n        description: 'id field from Test type.',\n        resolve: () => 'abc123',\n      },\n      isTest: {\n        type: GraphQLBoolean,\n        description: 'Is this a test schema? Sure it is.',\n        resolve: () => true,\n      },\n      image: {\n        type: GraphQLString,\n        description: 'field that returns an image URI.',\n        resolve: () => '/resources/logo.svg',\n      },\n      deprecatedField: {\n        type: TestType,\n        description: 'This field is an example of a deprecated field',\n        deprecationReason: 'No longer in use, try `test` instead.',\n      },\n      alsoDeprecated: {\n        type: TestType,\n        description:\n          'This field is an example of a deprecated field with markdown in its deprecation reason',\n        deprecationReason: longDescription,\n      },\n      hasArgs: {\n        type: GraphQLString,\n        resolve(_value, args) {\n          return JSON.stringify(args);\n        },\n        args: {\n          string: { type: GraphQLString, description: 'A string' },\n          int: { type: GraphQLInt },\n          float: { type: GraphQLFloat },\n          boolean: { type: GraphQLBoolean },\n          id: { type: GraphQLID },\n          enum: { type: TestEnum },\n          object: { type: TestInputObject },\n          defaultValue: {\n            type: GraphQLString,\n            defaultValue: 'test default value',\n          },\n          // List\n          listString: { type: new GraphQLList(GraphQLString) },\n          listInt: { type: new GraphQLList(GraphQLInt) },\n          listFloat: { type: new GraphQLList(GraphQLFloat) },\n          listBoolean: { type: new GraphQLList(GraphQLBoolean) },\n          listID: { type: new GraphQLList(GraphQLID) },\n          listEnum: { type: new GraphQLList(TestEnum) },\n          listObject: { type: new GraphQLList(TestInputObject) },\n          deprecatedArg: {\n            type: GraphQLString,\n            deprecationReason:\n              'Argument \"deprecatedArg\" is deprecated. Use \"string\" instead.',\n            description: 'Hello!',\n          },\n        },\n      },\n    }),\n  });\n\n  const TestMutationType = new GraphQLObjectType({\n    name: 'MutationType',\n    description: 'This is a simple mutation type',\n    fields: {\n      setString: {\n        type: GraphQLString,\n        description: 'Set the string field',\n        args: {\n          value: { type: GraphQLString },\n        },\n      },\n    },\n  });\n\n  const TestSubscriptionType = new GraphQLObjectType({\n    name: 'SubscriptionType',\n    description:\n      'This is a simple subscription type. Learn more at https://npmjs.com/package/graphql-ws',\n    fields: {\n      message: {\n        type: GraphQLString,\n        description: 'Subscribe to a message',\n        args: {\n          delay: delayArgument(600),\n        },\n        async *subscribe(root, args) {\n          for (const hi of ['Hi', 'Bonjour', 'Hola', 'Ciao', 'Zdravo']) {\n            if (args?.delay) {\n              await sleep(args.delay);\n            }\n            yield { message: hi };\n          }\n        },\n      },\n    },\n  });\n\n  return new GraphQLSchema({\n    query: TestType,\n    mutation: TestMutationType,\n    subscription: TestSubscriptionType,\n    description: 'This is a test schema for GraphiQL',\n    directives,\n  });\n}\n"
  },
  {
    "path": "packages/graphiql/tsconfig.json",
    "content": "{\n  \"extends\": \"../graphiql-react/tsconfig.json\",\n  // https://github.com/testing-library/jest-dom/issues/546#issuecomment-2558621842\n  \"exclude\": [\"cypress\", \"cypress.config.ts\"]\n}\n"
  },
  {
    "path": "packages/graphiql/vite.config.mts",
    "content": "import path from 'node:path';\nimport { defineConfig, PluginOption } from 'vite';\nimport dts from 'vite-plugin-dts';\nimport react from '@vitejs/plugin-react';\nimport { reactCompilerConfig as $reactCompilerConfig } from '../graphiql-react/vite.config.mjs';\nimport type { PluginOptions as ReactCompilerConfig } from 'babel-plugin-react-compiler';\nimport packageJSON from './package.json';\n\nconst reactCompilerConfig: Partial<ReactCompilerConfig> = {\n  ...$reactCompilerConfig,\n  sources(filename) {\n    if (\n      filename.includes('__tests__') ||\n      /\\.(spec|test)\\.tsx?$/.test(filename)\n    ) {\n      return false;\n    }\n    return filename.includes(`packages${path.sep}graphiql${path.sep}src`);\n  },\n};\n\nexport const plugins: PluginOption[] = [\n  react({\n    babel: {\n      plugins: [['babel-plugin-react-compiler', reactCompilerConfig]],\n    },\n  }),\n];\n\nconst umdConfig = defineConfig({\n  define: {\n    // graphql v17\n    'globalThis.process.env.NODE_ENV': 'true',\n    // https://github.com/graphql/graphql-js/blob/16.x.x/website/pages/docs/going-to-production.mdx\n    'globalThis.process': 'true',\n    'process.env.NODE_ENV': '\"production\"',\n  },\n  plugins,\n  css: {\n    transformer: 'lightningcss',\n  },\n  build: {\n    minify: 'terser', // produce less bundle size\n    sourcemap: true,\n    emptyOutDir: false,\n    lib: {\n      entry: 'src/cdn.ts',\n      /**\n       * The name of the exposed global variable. Required when the `formats` option includes `umd`\n       * or `iife`.\n       */\n      name: 'GraphiQL',\n      fileName: 'index',\n      formats: ['umd'],\n    },\n    rollupOptions: {\n      external: ['react', 'react-dom'],\n      output: {\n        globals: {\n          react: 'React',\n          'react-dom': 'ReactDOM',\n        },\n      },\n    },\n  },\n  worker: {\n    format: 'es',\n    rollupOptions: {\n      output: {\n        entryFileNames: 'workers/[name].js',\n        // Just to group worker assets, add shared/internal chunks too\n        chunkFileNames: 'workers/[name].js',\n      },\n    },\n  },\n});\n\nconst esmConfig = defineConfig({\n  build: {\n    cssCodeSplit: true,\n    minify: false,\n    sourcemap: true,\n    lib: {\n      entry: [\n        'src/index.ts',\n        'src/e2e.ts',\n        'src/setup-workers/webpack.ts',\n        'src/setup-workers/vite.ts',\n        'src/setup-workers/esm.sh.ts',\n      ],\n      fileName: (_format, filePath) => `${filePath}.js`,\n      formats: ['es'],\n      cssFileName: 'style',\n    },\n    rollupOptions: {\n      external: [\n        'react/jsx-runtime',\n        // Exclude peer dependencies and dependencies from bundle\n        ...Object.keys({\n          ...packageJSON.peerDependencies,\n          ...packageJSON.dependencies,\n        }),\n        /^@graphiql\\/react\\//,\n      ],\n      output: {\n        // Separate chunks for all modules\n        preserveModules: true,\n      },\n    },\n  },\n  server: {\n    // Prevent a browser window from opening automatically\n    open: false,\n    proxy: {\n      '/graphql': 'http://localhost:8080',\n      '/subscriptions': {\n        target: 'ws://localhost:8081',\n        ws: true,\n      },\n    },\n  },\n  plugins: [\n    ...plugins,\n    htmlPlugin(),\n    process.env.NODE_ENV === 'production' && removeImportsFromE2EFile(),\n    dts({\n      include: ['src/**'],\n      outDir: ['dist'],\n      exclude: ['**/*.spec.{ts,tsx}', '**/__tests__/'],\n    }),\n  ],\n  worker: {\n    format: 'es',\n  },\n});\n\nfunction htmlPlugin(): PluginOption {\n  return {\n    name: 'html-replace-umd-with-src',\n    transformIndexHtml: {\n      order: 'pre',\n      handler(html) {\n        const start = '<!--vite-replace-start-->';\n        const end = '<!--vite-replace-end-->';\n        const contentToReplace = html.slice(\n          html.indexOf(start),\n          html.indexOf(end) + end.length,\n        );\n        return html.replace(\n          contentToReplace,\n          '<script type=\"module\" src=\"/src/e2e.ts\"></script>',\n        );\n      },\n    },\n  };\n}\n\nfunction removeImportsFromE2EFile(): PluginOption {\n  return {\n    name: 'remove-imports-from-e2e-file',\n    enforce: 'pre', // Ensure it runs before Vite's own transformers\n    transform(code: string, id: string) {\n      if (id.endsWith('e2e.ts')) {\n        const transformedCode = code\n          .split('\\n')\n          .filter(line => !line.startsWith('import '))\n          .join('\\n');\n        return {\n          code: transformedCode,\n          // Remove source map to clean vite warning:\n          // a plugin (remove-imports-from-e2e-file) was used to transform files, but didn't generate a sourcemap for the transformation\n          map: null,\n        };\n      }\n    },\n  };\n}\n\nexport default process.env.UMD === 'true' ? umdConfig : esmConfig;\n"
  },
  {
    "path": "packages/graphiql/vitest.config.mts",
    "content": "import path from 'node:path';\nimport { defineConfig } from 'vitest/config';\nimport { plugins } from './vite.config.mjs';\n\nexport default defineConfig({\n  plugins,\n  test: {\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: ['./setup-files.ts', './setup-window.ts'],\n    // Since we increased `waitFor` timeout in setup-files.ts\n    testTimeout: 9_000,\n    alias: [\n      {\n        // Fixes Error: Failed to resolve entry for package \"monaco-editor\". The package may have incorrect main/module/exports specified in its package.json.\n        find: /^monaco-editor$/,\n        replacement: path.resolve(\n          '../../node_modules/monaco-editor/esm/vs/editor/editor.api',\n        ),\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/CHANGELOG.md",
    "content": "# @graphiql/plugin-code-exporter\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf), [`293beed`](https://github.com/graphql/graphiql/commit/293beed772baa2be834cad5f19e1aee0628e15cc)]:\n  - @graphiql/react@0.37.0\n\n## 5.1.0\n\n### Minor Changes\n\n- [#4077](https://github.com/graphql/graphiql/pull/4077) [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add new example [Usage GraphiQL 5 with Vite, React Router and `ssr: true`](https://github.com/graphql/graphiql/tree/main/examples/example-graphiql-vite-react-router)\n\n### Patch Changes\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd), [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198), [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14), [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b)]:\n  - @graphiql/react@0.36.0\n\n## 5.0.0\n\n### Major Changes\n\n- [#4002](https://github.com/graphql/graphiql/pull/4002) [`2d9faec`](https://github.com/graphql/graphiql/commit/2d9faec57830b38aa175929c47a55c959c327535) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove UMD builds\n\n### Minor Changes\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n### Patch Changes\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n## 5.0.0-rc.2\n\n### Minor Changes\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n## 5.0.0-rc.1\n\n### Major Changes\n\n- [#4002](https://github.com/graphql/graphiql/pull/4002) [`2d9faec`](https://github.com/graphql/graphiql/commit/2d9faec57830b38aa175929c47a55c959c327535) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove UMD builds\n\n## 4.0.6-rc.0\n\n### Patch Changes\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- Updated dependencies [[`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/react@0.35.0-rc.0\n\n## 4.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af), [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781)]:\n  - @graphiql/react@0.34.0\n\n## 4.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71), [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0), [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e), [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921)]:\n  - @graphiql/react@0.33.0\n\n## 4.0.3\n\n### Patch Changes\n\n- [#3939](https://github.com/graphql/graphiql/pull/3939) [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `React.FC` type when declaring React components\n\n## 4.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67)]:\n  - @graphiql/react@0.32.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#3915](https://github.com/graphql/graphiql/pull/3915) [`bc31cd9`](https://github.com/graphql/graphiql/commit/bc31cd99a92693238e7359456e3cc22ed0387df0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix unpkg.com results to `Not found` when `main` field isn't specified in `package.json`\n\n- Updated dependencies [[`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6)]:\n  - @graphiql/react@0.31.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - `style.css` import was changed\n\n  ## Migration\n\n  ```diff\n  -import '@graphiql/plugin-code-exporter/dist/style.css';\n  +import '@graphiql/plugin-code-exporter/style.css';\n  ```\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - drop commonjs build files\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - support react 19, drop support react 16 and react 17\n  - replace deprecated `ReactDOM.unmountComponentAtNode()` and `ReactDOM.render()` with `root.unmount()` and `createRoot(container).render()`\n  - update `@radix-ui` and `@headlessui/react` dependencies\n\n### Minor Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Update GraphiQL CDN example using ESM-based CDN esm.sh\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - generate types with `vite-plugin-dts`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update `vite` and related dependencies\n\n### Patch Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix types incorrect types entry\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `vite build --watch` instead of `vite` for `dev` script because we don't need development server for them\n\n  do not use `vite-plugin-dts` when generating umd build\n\n- Updated dependencies [[`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602)]:\n  - @graphiql/react@0.30.0\n\n## 4.0.0-alpha.1\n\n### Patch Changes\n\n- [#3740](https://github.com/graphql/graphiql/pull/3740) [`3c12ce0`](https://github.com/graphql/graphiql/commit/3c12ce01eb3b2ec9a317a2fea2bb92602b748a8b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix types incorrect types entry\n\n## 4.0.0-alpha.0\n\n### Major Changes\n\n- [#3709](https://github.com/graphql/graphiql/pull/3709) [`9baf1f0`](https://github.com/graphql/graphiql/commit/9baf1f0fc9f32404fbb8bf57b3d1c2c2c8778ddb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - `style.css` import was changed\n\n  ## Migration\n\n  ```diff\n  -import '@graphiql/plugin-code-exporter/dist/style.css';\n  +import '@graphiql/plugin-code-exporter/style.css';\n  ```\n\n### Minor Changes\n\n- [#3702](https://github.com/graphql/graphiql/pull/3702) [`00415d2`](https://github.com/graphql/graphiql/commit/00415d2940c4d76a4a9e683e9fa0504ba97dd627) Thanks [@dimaMachina](https://github.com/dimaMachina)! - generate types with `vite-plugin-dts`\n\n### Patch Changes\n\n- [#3705](https://github.com/graphql/graphiql/pull/3705) [`8ff87d7`](https://github.com/graphql/graphiql/commit/8ff87d7b6b3d5d12b539612a39ca3abf7e631106) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `vite build --watch` instead of `vite` for `dev` script because we don't need development server for them\n\n  do not use `vite-plugin-dts` when generating umd build\n\n- Updated dependencies [[`00415d2`](https://github.com/graphql/graphiql/commit/00415d2940c4d76a4a9e683e9fa0504ba97dd627), [`9baf1f0`](https://github.com/graphql/graphiql/commit/9baf1f0fc9f32404fbb8bf57b3d1c2c2c8778ddb), [`8ff87d7`](https://github.com/graphql/graphiql/commit/8ff87d7b6b3d5d12b539612a39ca3abf7e631106), [`82bc961`](https://github.com/graphql/graphiql/commit/82bc961a33c4e9da29dffb4a603035a4909f49ad), [`3c1a345`](https://github.com/graphql/graphiql/commit/3c1a345acd9bf07b45bc230009cb57c51c425673)]:\n  - @graphiql/react@1.0.0-alpha.0\n\n## 3.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`cb29e9f`](https://github.com/graphql/graphiql/commit/cb29e9fbe1362778bc327513fc884c4ec419775e), [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - @graphiql/react@0.29.0\n\n## 3.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`3633d61`](https://github.com/graphql/graphiql/commit/3633d61c3c597adf60c0ec1bbf98cf6a1f49beed)]:\n  - @graphiql/react@0.28.0\n\n## 3.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`f86e2bc`](https://github.com/graphql/graphiql/commit/f86e2bce40826b3d07755f91b37a72051de00f9c)]:\n  - @graphiql/react@0.27.0\n\n## 3.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`959ed21`](https://github.com/graphql/graphiql/commit/959ed21815682fc439f64d78e23e603a8f313a6f), [`9aef83a`](https://github.com/graphql/graphiql/commit/9aef83a32aeb5f193a3ff0f191c95d09eb0d70b6)]:\n  - @graphiql/react@0.26.0\n\n## 3.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`7404e8e`](https://github.com/graphql/graphiql/commit/7404e8e6c62b06107f452142493297ec70f1649c)]:\n  - @graphiql/react@0.25.0\n\n## 3.1.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - @graphiql/react@0.24.0\n\n## 3.0.5\n\n### Patch Changes\n\n- [#3657](https://github.com/graphql/graphiql/pull/3657) [`5bc7b84`](https://github.com/graphql/graphiql/commit/5bc7b84531b6404553787615d61a5cbcc96c1d6f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update vite to v5\n\n- [#3656](https://github.com/graphql/graphiql/pull/3656) [`93c7e9f`](https://github.com/graphql/graphiql/commit/93c7e9fd224cb4f1e9a86b3391efc1e0ef6e1e3f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set `build.minify: false` for cjs/esm builds since minified variable names change every build time\n\n- Updated dependencies [[`5bc7b84`](https://github.com/graphql/graphiql/commit/5bc7b84531b6404553787615d61a5cbcc96c1d6f), [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d), [`93c7e9f`](https://github.com/graphql/graphiql/commit/93c7e9fd224cb4f1e9a86b3391efc1e0ef6e1e3f)]:\n  - @graphiql/react@0.23.0\n\n## 3.0.4\n\n### Patch Changes\n\n- [#3634](https://github.com/graphql/graphiql/pull/3634) [`adf0ba01`](https://github.com/graphql/graphiql/commit/adf0ba019902dcac2e49ccee69b79a6665c4766d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - when alpha is `1`, use `hsl` instead of `hsla`\n\n- Updated dependencies [[`adf0ba01`](https://github.com/graphql/graphiql/commit/adf0ba019902dcac2e49ccee69b79a6665c4766d)]:\n  - @graphiql/react@0.22.4\n\n## 3.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`335d830c`](https://github.com/graphql/graphiql/commit/335d830c2a4e551ef97fbeff8ed7c538ff5cd4af)]:\n  - @graphiql/react@0.22.3\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`03ab3a6b`](https://github.com/graphql/graphiql/commit/03ab3a6b76378591ef79a828d80cc69b0b8f2842)]:\n  - @graphiql/react@0.22.2\n\n## 3.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`224b43f5`](https://github.com/graphql/graphiql/commit/224b43f5473456f264a82998d48a34a441537f54)]:\n  - @graphiql/react@0.22.1\n\n## 3.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`d48f4ef5`](https://github.com/graphql/graphiql/commit/d48f4ef56578dad7ec90f33458353791e463ef7b)]:\n  - @graphiql/react@0.22.0\n\n## 2.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`5d051054`](https://github.com/graphql/graphiql/commit/5d05105469c3f0cbeb5e294da1cf6ff2355e4eb5)]:\n  - @graphiql/react@0.21.0\n\n## 1.0.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.20.4\n\n## 1.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`2b6ea316`](https://github.com/graphql/graphiql/commit/2b6ea3166c8d8e152f16d87c878aa8a66f1b3775)]:\n  - @graphiql/react@0.20.3\n\n## 1.0.3\n\n### Patch Changes\n\n- [#3439](https://github.com/graphql/graphiql/pull/3439) [`d07d5fc0`](https://github.com/graphql/graphiql/commit/d07d5fc0cf764518bc1184ef168361cedf61540b) Thanks [@xonx4l](https://github.com/xonx4l)! - FIX: Unexpected duplicate CSS \"display\" property\n\n## 1.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`e89c432d`](https://github.com/graphql/graphiql/commit/e89c432d8d2b91f087b683360f23e0686462bc02)]:\n  - @graphiql/react@0.20.2\n\n## 1.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`39bf31d1`](https://github.com/graphql/graphiql/commit/39bf31d15b1e7fb5f235ec9adc1ce8081536de4a)]:\n  - @graphiql/react@0.20.1\n\n## 1.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`f6afd22d`](https://github.com/graphql/graphiql/commit/f6afd22d3f5a20089759042f16fd865646a32038)]:\n  - @graphiql/react@0.20.0\n\n## 0.3.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.19.4\n\n## 0.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`2348641c`](https://github.com/graphql/graphiql/commit/2348641c07748691c478ac5f67032b7e9081f9cb)]:\n  - @graphiql/react@0.19.3\n\n## 0.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`d67c13f6`](https://github.com/graphql/graphiql/commit/d67c13f6e1f478b171801afd0767b98312db04c9)]:\n  - @graphiql/react@0.19.2\n\n## 0.3.2\n\n### Patch Changes\n\n- [#3341](https://github.com/graphql/graphiql/pull/3341) [`e4a36207`](https://github.com/graphql/graphiql/commit/e4a362071edf1db53f87f271c523ab2f3a5c4717) Thanks [@acao](https://github.com/acao)! - Fix code exporter plugin on early init, add hooks\n\n- Updated dependencies [[`17069e7a`](https://github.com/graphql/graphiql/commit/17069e7a0224dbce3f5523630a898e093f5c47c9), [`e4a36207`](https://github.com/graphql/graphiql/commit/e4a362071edf1db53f87f271c523ab2f3a5c4717)]:\n  - @graphiql/react@0.19.1\n\n## 0.3.1\n\n### Patch Changes\n\n- [#3350](https://github.com/graphql/graphiql/pull/3350) [`119775ed`](https://github.com/graphql/graphiql/commit/119775ed191ce075532a6e85cbfeac2364c0ba40) Thanks [@acao](https://github.com/acao)! - handle null editor in explorer plugin [(PR)](https://github.com/graphql/graphiql/pull/3340)\n\n## 0.3.0\n\n### Minor Changes\n\n- [#3330](https://github.com/graphql/graphiql/pull/3330) [`bed5fc86`](https://github.com/graphql/graphiql/commit/bed5fc86173eb0e770f966fa529ee035b97a1349) Thanks [@acao](https://github.com/acao)! - **BREAKING CHANGE**: fix lifecycle issue in plugin-explorer, change implementation pattern\n\n  `value` and `setValue` is no longer an implementation detail, and are handled internally by plugins. the plugin signature has changed slightly as well.\n\n  now, instead of something like this:\n\n  ```jsx\n  import { useExplorerPlugin } from '@graphiql/plugin-explorer';\n  import { snippets } from './snippets';\n  import { useExporterPlugin } from '@graphiql/plugin-code-exporter';\n\n  const App = () => {\n    const [query, setQuery] = React.useState('');\n    const explorerPlugin = useExplorerPlugin({\n      query,\n      onEdit: setQuery,\n    });\n    const codeExporterPlugin = useExporterPlugin({\n      query,\n      snippets,\n    });\n\n    const plugins = React.useMemo(\n      () => [explorerPlugin, codeExporterPlugin],\n      [explorerPlugin, codeExporterPlugin],\n    );\n\n    return (\n      <GraphiQL\n        query={query}\n        onEditQuery={setQuery}\n        plugins={plugins}\n        fetcher={fetcher}\n      />\n    );\n  };\n  ```\n\n  you can just do this:\n\n  ```jsx\n  import { explorerPlugin } from '@graphiql/plugin-explorer';\n  import { snippets } from './snippets';\n  import { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\n  import { createGraphiQLFetcher } from '@graphiql/toolkit';\n\n  // only invoke these inside the component lifecycle\n  // if there are dynamic values, and then use useMemo() (see below)\n  const explorer = explorerPlugin();\n  const exporter = codeExporterPlugin({ snippets });\n\n  const fetcher = createGraphiQLFetcher({ url: '/graphql' });\n\n  const App = () => {\n    return <GraphiQL plugins={[explorer, exporter]} fetcher={fetcher} />;\n  };\n  ```\n\n  or this, for more complex state-driven needs:\n\n  ```jsx\n  import { useMemo } from 'react';\n  import { explorerPlugin } from '@graphiql/plugin-explorer';\n  import { snippets } from './snippets';\n  import { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\n\n  const explorer = explorerPlugin();\n  const fetcher = createGraphiQLFetcher({ url: '/graphql' });\n\n  const App = () => {\n    const { snippets } = useMyUserSuppliedState();\n    const exporter = useMemo(\n      () => codeExporterPlugin({ snippets }),\n      [snippets],\n    );\n\n    return <GraphiQL plugins={[explorer, exporter]} fetcher={fetcher} />;\n  };\n  ```\n\n## 0.2.0\n\n### Minor Changes\n\n- [#3293](https://github.com/graphql/graphiql/pull/3293) [`1b8f3fe9`](https://github.com/graphql/graphiql/commit/1b8f3fe9c41697855378ec13a76f1a908fda778a) Thanks [@B2o5T](https://github.com/B2o5T)! - BREAKING CHANGE: umd build was renamed to `index.umd.js`\n\n## 0.1.4\n\n### Patch Changes\n\n- [#3292](https://github.com/graphql/graphiql/pull/3292) [`f86e4172`](https://github.com/graphql/graphiql/commit/f86e41721d4d990535253b579c810bc5e291b40b) Thanks [@B2o5T](https://github.com/B2o5T)! - fix umd build names `graphiql-plugin-code-exporter.umd.js` and `graphiql-plugin-explorer.umd.js`\n\n## 0.1.3\n\n### Patch Changes\n\n- [#3229](https://github.com/graphql/graphiql/pull/3229) [`0a65e720`](https://github.com/graphql/graphiql/commit/0a65e7207b6bc4174896f6acca8a40f45d2fb1b8) Thanks [@B2o5T](https://github.com/B2o5T)! - exclude peer dependencies and dependencies from bundle\n\n- [#3251](https://github.com/graphql/graphiql/pull/3251) [`f8d8509b`](https://github.com/graphql/graphiql/commit/f8d8509b432803eaeb2e53b6b6d4321535e11c1d) Thanks [@B2o5T](https://github.com/B2o5T)! - always bundle `package.json#dependencies` for UMD build for `@graphiql/plugin-code-exporter` and `@graphiql/plugin-explorer`\n\n- [#3236](https://github.com/graphql/graphiql/pull/3236) [`64da8c30`](https://github.com/graphql/graphiql/commit/64da8c3074628bb411eb1c28aa4738843f60910c) Thanks [@B2o5T](https://github.com/B2o5T)! - update vite\n\n## 0.1.3-alpha.0\n\n### Patch Changes\n\n- [#3229](https://github.com/graphql/graphiql/pull/3229) [`0a65e720`](https://github.com/graphql/graphiql/commit/0a65e7207b6bc4174896f6acca8a40f45d2fb1b8) Thanks [@B2o5T](https://github.com/B2o5T)! - exclude peer dependencies and dependencies from bundle\n\n## 0.1.2\n\n### Patch Changes\n\n- [#3017](https://github.com/graphql/graphiql/pull/3017) [`4a2284f5`](https://github.com/graphql/graphiql/commit/4a2284f54809f91d03ba51b9eb4e3ba7b8b7e773) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Avoid bundling code from `react/jsx-runtime` so that the package can be used with Preact\n\n- [#3063](https://github.com/graphql/graphiql/pull/3063) [`5792aaa5`](https://github.com/graphql/graphiql/commit/5792aaa5b26b68dc396f7bfb5dc3defd9331b831) Thanks [@B2o5T](https://github.com/B2o5T)! - avoid `useMemo` with empty array `[]` since React can't guarantee stable reference, + lint restrict syntax for future mistakes\n\n## 0.1.1\n\n### Patch Changes\n\n- [#2864](https://github.com/graphql/graphiql/pull/2864) [`f61a5574`](https://github.com/graphql/graphiql/commit/f61a55747a6ff3a125c54e2bf3512f8f4b8f4c50) Thanks [@LekoArts](https://github.com/LekoArts)! - chore(@graphiql/plugin-code-exporter): Fix Typo\n\n## 0.1.0\n\n### Minor Changes\n\n- [#2758](https://github.com/graphql/graphiql/pull/2758) [`d63801fa`](https://github.com/graphql/graphiql/commit/d63801fad08e840eff7ff26f55694c6d18769466) Thanks [@LekoArts](https://github.com/LekoArts)! - Add code exported plugin\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/README.md",
    "content": "# GraphiQL Code Exporter Plugin\n\nThis package provides a plugin that integrates the\n[GraphiQL Code Exporter](https://github.com/OneGraph/graphiql-code-exporter) into the GraphiQL UI.\n\n## Installation\n\nInstall the plugin using your preferred package manager:\n\n```sh\nnpm install @graphiql/plugin-code-exporter\n```\n\nMake sure to also install the required peer dependencies:\n\n```sh\nnpm install react react-dom graphql\n```\n\n## Usage\n\nRefer to the\n[GraphiQL Code Exporter README](https://github.com/OneGraph/graphiql-code-exporter) for full details on available `props` and how to [create snippets](https://github.com/OneGraph/graphiql-code-exporter#snippets).\n\nExample integration:\n\n```jsx\nimport { GraphiQL } from 'graphiql';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\nimport 'graphiql/style.css';\nimport '@graphiql/plugin-code-exporter/style.css';\n\nconst fetcher = createGraphiQLFetcher({\n  url: 'https://countries.trevorblades.com',\n});\nfunction getQuery(arg, spaceCount = 2) {\n  const spaces = ' '.repeat(spaceCount);\n  const { query } = arg.operationDataList[0];\n  return spaces + query.replaceAll('\\n', '\\n' + spaces);\n}\n\nconst codeExporter = codeExporterPlugin({\n  /**\n   * Example code for snippets. See https://github.com/OneGraph/graphiql-code-exporter#snippets for details.\n   */\n  snippets: [\n    {\n      name: 'Example One',\n      language: 'JavaScript',\n      codeMirrorMode: 'jsx',\n      options: [],\n      generate: arg =>\n        ['export const query = graphql`', getQuery(arg), '`'].join('\\n'),\n    },\n    {\n      name: 'Example Two',\n      language: 'JavaScript',\n      codeMirrorMode: 'jsx',\n      options: [],\n      generate: arg =>\n        [\n          \"import { graphql } from 'graphql'\",\n          '',\n          'export const query = graphql`',\n          getQuery(arg),\n          '`',\n        ].join('\\n'),\n    },\n  ],\n});\nfunction App() {\n  return <GraphiQL fetcher={fetcher} plugins={[codeExporter]} />;\n}\n```\n\n## CDN bundles\n\nYou can also use this plugin via an ESM-based CDN like [esm.sh](https://esm.sh).\n\nSee the [CDN example](./example/index.html) for a working demo.\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/example/index.html",
    "content": "<!--\n *  Copyright (c) 2025 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n-->\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>GraphiQL 5 with React 19 and GraphiQL Code Exporter</title>\n    <style>\n      body {\n        margin: 0;\n      }\n\n      #graphiql {\n        height: 100dvh;\n      }\n\n      .loading {\n        height: 100%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 4rem;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"https://esm.sh/graphiql/dist/style.css\" />\n    <link\n      rel=\"stylesheet\"\n      href=\"https://esm.sh/@graphiql/plugin-code-exporter/dist/style.css\"\n    />\n    <!-- Note: the ?standalone flag bundles the module along with all of its `dependencies`, excluding `peerDependencies`, into a single JavaScript file. -->\n    <script type=\"importmap\">\n      {\n        \"imports\": {\n          \"react\": \"https://esm.sh/react@19.1.0\",\n          \"react/jsx-runtime\": \"https://esm.sh/react@19.1.0/jsx-runtime\",\n\n          \"react-dom\": \"https://esm.sh/react-dom@19.1.0\",\n          \"react-dom/client\": \"https://esm.sh/react-dom@19.1.0/client\",\n\n          \"graphiql\": \"https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql\",\n          \"@graphiql/plugin-code-exporter\": \"https://esm.sh/@graphiql/plugin-code-exporter?standalone&external=react,@graphiql/react,graphql&deps=codemirror@5.65.3\",\n          \"@graphiql/react\": \"https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql\",\n\n          \"@graphiql/toolkit\": \"https://esm.sh/@graphiql/toolkit?standalone&external=graphql\",\n          \"graphql\": \"https://esm.sh/graphql@16.11.0\",\n          \"regenerator-runtime/runtime\": \"https://esm.sh/regenerator-runtime/runtime\"\n        }\n      }\n    </script>\n    <script type=\"module\">\n      // Import React and ReactDOM\n      import React from 'react';\n      import ReactDOM from 'react-dom/client';\n      // Import GraphiQL and the Explorer plugin\n      import { GraphiQL, HISTORY_PLUGIN } from 'graphiql';\n      import { createGraphiQLFetcher } from '@graphiql/toolkit';\n      // Required to be before `@graphiql/plugin-code-exporter`\n      import 'regenerator-runtime/runtime';\n      import { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\n\n      import createJSONWorker from 'https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker';\n      import createGraphQLWorker from 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker';\n      import createEditorWorker from 'https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker';\n\n      globalThis.MonacoEnvironment = {\n        getWorker(_workerId, label) {\n          console.info('MonacoEnvironment.getWorker', { label });\n          switch (label) {\n            case 'json':\n              return createJSONWorker();\n            case 'graphql':\n              return createGraphQLWorker();\n          }\n          return createEditorWorker();\n        },\n      };\n\n      const fetcher = createGraphiQLFetcher({\n        url: 'https://countries.trevorblades.com',\n      });\n      function getQuery(arg, spaceCount = 2) {\n        const spaces = ' '.repeat(spaceCount);\n        const { query } = arg.operationDataList[0];\n        return spaces + query.replaceAll('\\n', '\\n' + spaces);\n      }\n\n      const codeExporter = codeExporterPlugin({\n        /**\n         * Example code for snippets. See https://github.com/OneGraph/graphiql-code-exporter#snippets for details.\n         */\n        snippets: [\n          {\n            name: 'Example One',\n            language: 'JavaScript',\n            codeMirrorMode: 'jsx',\n            options: [],\n            generate: arg =>\n              ['export const query = graphql`', getQuery(arg), '`'].join('\\n'),\n          },\n          {\n            name: 'Example Two',\n            language: 'JavaScript',\n            codeMirrorMode: 'jsx',\n            options: [],\n            generate: arg =>\n              [\n                \"import { graphql } from 'graphql'\",\n                '',\n                'export const query = graphql`',\n                getQuery(arg),\n                '`',\n              ].join('\\n'),\n          },\n        ],\n      });\n\n      const plugins = [HISTORY_PLUGIN, codeExporter];\n\n      function App() {\n        return React.createElement(GraphiQL, {\n          fetcher,\n          plugins,\n          defaultEditorToolsVisibility: true,\n        });\n      }\n\n      const container = document.getElementById('graphiql');\n      const root = ReactDOM.createRoot(container);\n      root.render(React.createElement(App));\n    </script>\n  </head>\n  <body>\n    <div id=\"graphiql\">\n      <div class=\"loading\">Loading…</div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/package.json",
    "content": "{\n  \"name\": \"@graphiql/plugin-code-exporter\",\n  \"version\": \"5.1.1\",\n  \"sideEffects\": false,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql-plugin-code-exporter\"\n  },\n  \"author\": \"LekoArts\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"react\",\n    \"graphql\",\n    \"graphiql\",\n    \"plugin\",\n    \"explorer\"\n  ],\n  \"files\": [\n    \"dist\"\n  ],\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./style.css\": \"./dist/style.css\",\n    \".\": \"./dist/index.js\"\n  },\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"vite build --watch --emptyOutDir=false\",\n    \"build\": \"vite build\",\n    \"postbuild\": \"cp src/graphiql-code-exporter.d.ts dist/graphiql-code-exporter.d.ts\"\n  },\n  \"dependencies\": {\n    \"graphiql-code-exporter\": \"^3.0.3\"\n  },\n  \"peerDependencies\": {\n    \"@graphiql/react\": \"^0.37.0\",\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0-alpha.2\",\n    \"react\": \"^18 || ^19\",\n    \"react-dom\": \"^18 || ^19\"\n  },\n  \"devDependencies\": {\n    \"@graphiql/react\": \"^0.37.0\",\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"graphql\": \"^16.9.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"typescript\": \"^4.6.3\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-dts\": \"^4.0.1\"\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/src/graphiql-code-exporter.d.ts",
    "content": "declare module 'graphiql-code-exporter' {\n  import { ComponentType } from 'react';\n  import {\n    GraphQLSchema,\n    OperationTypeNode,\n    OperationDefinitionNode,\n    FragmentDefinitionNode,\n  } from 'graphql';\n\n  type OperationData = {\n    query: string;\n    name: string;\n    displayName: string;\n    type: OperationTypeNode | 'fragment';\n    variableName: string;\n    variables: Record<string, any>;\n    operationDefinition: OperationDefinitionNode | FragmentDefinitionNode;\n    fragmentDependencies: Array<FragmentDefinitionNode>;\n  };\n\n  type GenerateOptions = {\n    serverUrl: string;\n    headers: Record<string, string>;\n    context: Record<string, any>;\n    operationDataList: Array<OperationData>;\n    options: Record<string, boolean>;\n  };\n\n  type Snippet = {\n    language: string;\n    codeMirrorMode: string;\n    name: string;\n    options: Array<{\n      id: string;\n      label: string;\n      initial: boolean;\n    }>;\n    generate: (options: GenerateOptions) => string;\n  };\n\n  export type GraphiQLCodeExporterProps = {\n    query: string;\n    snippets: Array<Snippet>;\n    codeMirrorTheme?: string;\n    variables?: string;\n    context?: Record<string, any>;\n    schema?: GraphQLSchema | null | undefined;\n  };\n\n  const GraphiQLCodeExporter: ComponentType<GraphiQLCodeExporterProps>;\n\n  export default GraphiQLCodeExporter;\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/src/index.css",
    "content": ".docExplorerWrap {\n  height: unset !important;\n  min-width: unset !important;\n  width: unset !important;\n}\n\n.doc-explorer-title {\n  font-size: var(--font-size-h2);\n  font-weight: var(--font-weight-medium);\n}\n\n.doc-explorer-rhs {\n  display: none;\n}\n\n.doc-explorer-contents {\n  border-top: none !important;\n}\n\n.graphiql-code-exporter {\n  min-width: unset !important;\n  position: relative;\n  padding: var(--px-16) 0;\n  & > div {\n    font-family: var(--font-family) !important;\n    padding: 0 !important;\n    font-size: var(--font-size-body) !important;\n  }\n  & > div:first-of-type {\n    display: flex;\n    flex-direction: column;\n    gap: var(--px-16);\n    & > div {\n      padding: 0 !important;\n    }\n    & > div:first-of-type {\n      display: flex;\n      flex-direction: row;\n      gap: var(--px-16);\n    }\n    & > div:last-of-type {\n      & > div:first-of-type {\n        color: hsla(var(--color-neutral), var(--alpha-secondary)) !important;\n        font-variant: unset !important;\n        text-transform: unset !important;\n        font-weight: unset !important;\n        margin-bottom: var(--px-12);\n      }\n    }\n  }\n  & button.toolbar-button {\n    height: var(--toolbar-width) !important;\n    width: var(--toolbar-width) !important;\n    border-radius: var(--border-radius-4) !important;\n    cursor: pointer;\n    display: inline-flex;\n    font-size: unset !important;\n    left: unset !important;\n    margin-top: unset !important;\n    top: var(--px-16);\n    right: 0;\n    justify-content: center;\n    align-items: center;\n    background-color: unset !important;\n    & svg {\n      fill: hsla(var(--color-neutral), var(--alpha-tertiary));\n    }\n  }\n  & > div:last-of-type {\n    border-top: none !important;\n    display: flex;\n    flex: 1;\n    margin-top: var(--px-24) !important;\n    & > div {\n      position: relative;\n      min-height: 600px;\n      width: 100%;\n    }\n  }\n  & .toolbar-menu.toolbar-button {\n    position: relative;\n    cursor: pointer;\n    text-decoration: none;\n    padding: var(--px-8) var(--px-12);\n    color: hsl(var(--color-neutral)) !important;\n    border-radius: var(--border-radius-4) !important;\n    &:hover {\n      background-color: hsla(\n        var(--color-neutral),\n        var(--alpha-background-light)\n      ) !important;\n    }\n  }\n  & .toolbar-menu-items {\n    background-color: hsl(var(--color-base)) !important;\n    border: var(--popover-border);\n    border-radius: var(--border-radius-8);\n    box-shadow: var(--popover-box-shadow) !important;\n    padding: var(--px-4);\n    max-width: 250px;\n    font-size: inherit;\n    display: block;\n    white-space: nowrap;\n    outline: none;\n    position: absolute;\n    z-index: 100;\n    margin-top: var(--px-8);\n    visibility: hidden;\n    left: 0;\n    &.open {\n      visibility: visible;\n    }\n    & > li {\n      cursor: pointer;\n      display: block;\n      color: inherit;\n      font: inherit;\n      text-decoration: initial;\n      border-radius: var(--border-radius-4);\n      margin: var(--px-4);\n      overflow: hidden;\n      padding: var(--px-6) var(--px-8);\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      &:hover {\n        color: inherit;\n        background-color: hsla(\n          var(--color-neutral),\n          var(--alpha-background-light)\n        );\n      }\n    }\n  }\n  & .CodeMirror {\n    box-shadow: var(--popover-box-shadow);\n    border-radius: var(--border-radius-12);\n    padding: var(--px-16);\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/src/index.tsx",
    "content": "import { useOperationsEditorState, type GraphiQLPlugin } from '@graphiql/react';\nimport type { FC } from 'react';\nimport GraphiQLCodeExporter, {\n  GraphiQLCodeExporterProps,\n} from 'graphiql-code-exporter';\nimport './index.css';\n\ntype GraphiQLCodeExporterPluginProps = Omit<GraphiQLCodeExporterProps, 'query'>;\n\nconst GraphiQLCodeExporterPlugin: FC<\n  GraphiQLCodeExporterPluginProps\n> = props => {\n  const [operationsString] = useOperationsEditorState();\n  return (\n    <GraphiQLCodeExporter\n      codeMirrorTheme=\"graphiql\"\n      {...props}\n      query={operationsString}\n    />\n  );\n};\n\nexport function codeExporterPlugin(\n  props: GraphiQLCodeExporterPluginProps,\n): GraphiQLPlugin {\n  return {\n    title: 'GraphiQL Code Exporter',\n    icon: () => (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth=\"1.5\"\n        stroke=\"currentColor\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M9 8.25H7.5a2.25 2.25 0 00-2.25 2.25v9a2.25 2.25 0 002.25 2.25h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25H15m0-3l-3-3m0 0l-3 3m3-3V15\"\n        />\n      </svg>\n    ),\n    content() {\n      return <GraphiQLCodeExporterPlugin {...props} />;\n    },\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/tsconfig.json",
    "content": "{\n  \"extends\": \"../graphiql-react/tsconfig.json\"\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-code-exporter/vite.config.mts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport packageJSON from './package.json';\nimport dts from 'vite-plugin-dts';\n\nexport default defineConfig({\n  plugins: [react(), dts({ include: ['src/**'] })],\n  css: {\n    transformer: 'lightningcss',\n  },\n  build: {\n    minify: false,\n    lib: {\n      entry: 'src/index.tsx',\n      fileName: (_format, filePath) => `${filePath}.js`,\n      formats: ['es'],\n      cssFileName: 'style',\n    },\n    rollupOptions: {\n      external: [\n        'react/jsx-runtime',\n        // Exclude peer dependencies and dependencies from bundle\n        ...Object.keys({\n          ...packageJSON.peerDependencies,\n          ...packageJSON.dependencies,\n        }),\n      ],\n    },\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/CHANGELOG.md",
    "content": "# @graphiql/plugin-doc-explorer\n\n## 0.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf), [`293beed`](https://github.com/graphql/graphiql/commit/293beed772baa2be834cad5f19e1aee0628e15cc)]:\n  - @graphiql/react@0.37.0\n\n## 0.4.0\n\n### Minor Changes\n\n- [#4074](https://github.com/graphql/graphiql/pull/4074) [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Ensure `storage` and `theme` store values aren't shared between GraphiQL instances. Deprecate `useTheme` and `useStorage` hooks in favour of values from `useGraphiQL` and `useGraphiQLActions` hooks\n\n  feat(`@graphiql/plugin-history`/`@graphiql/plugin-doc-explorer`): move `@graphiql/react` to `peerDependencies`\n\n- [#4077](https://github.com/graphql/graphiql/pull/4077) [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add new example [Usage GraphiQL 5 with Vite, React Router and `ssr: true`](https://github.com/graphql/graphiql/tree/main/examples/example-graphiql-vite-react-router)\n\n### Patch Changes\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd), [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198), [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14), [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b)]:\n  - @graphiql/react@0.36.0\n\n## 0.3.0\n\n### Minor Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#4006](https://github.com/graphql/graphiql/pull/4006) [`7792dc9`](https://github.com/graphql/graphiql/commit/7792dc98814abcd6dc5f5cd94ae84c308a260dcf) Thanks [@dimaMachina](https://github.com/dimaMachina)! - push field type on stack too before field\n\n- [#4007](https://github.com/graphql/graphiql/pull/4007) [`f9780bd`](https://github.com/graphql/graphiql/commit/f9780bd44f67acad0a9bb10f57eb6059db60e1ec) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Use an additional `Alt` key for focus doc explorer search input instead of `Cmd/Ctrl+K` because monaco-editor has a built-in shortcut for `Cmd/Ctrl+K`\n\n- [#4004](https://github.com/graphql/graphiql/pull/4004) [`16fdd6a`](https://github.com/graphql/graphiql/commit/16fdd6a16684c9f250ee53ea2dfbb24435cee6a9) Thanks [@dimaMachina](https://github.com/dimaMachina)! - show spinner in doc explorer based on `isIntrospecting` value, and not based on `isFetching`\n\n- Updated dependencies [[`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92), [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270), [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531), [`3c0ad34`](https://github.com/graphql/graphiql/commit/3c0ad34a8f2f9d0f912db9597f608d7405c2bd83), [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d), [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439), [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7), [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb), [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c), [`4b39f11`](https://github.com/graphql/graphiql/commit/4b39f1118d008c2fac6e2df9c94a3f3271c4eeb9), [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/react@0.35.0\n\n## 0.3.0-rc.4\n\n### Minor Changes\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n### Patch Changes\n\n- Updated dependencies [[`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b), [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b)]:\n  - @graphiql/react@0.35.0-rc.8\n\n## 0.3.0-rc.3\n\n### Minor Changes\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n### Patch Changes\n\n- Updated dependencies [[`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531)]:\n  - @graphiql/react@0.35.0-rc.3\n\n## 0.3.0-rc.2\n\n### Patch Changes\n\n- [#4006](https://github.com/graphql/graphiql/pull/4006) [`7792dc9`](https://github.com/graphql/graphiql/commit/7792dc98814abcd6dc5f5cd94ae84c308a260dcf) Thanks [@dimaMachina](https://github.com/dimaMachina)! - push field type on stack too before field\n\n- [#4007](https://github.com/graphql/graphiql/pull/4007) [`f9780bd`](https://github.com/graphql/graphiql/commit/f9780bd44f67acad0a9bb10f57eb6059db60e1ec) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Use an additional `Alt` key for focus doc explorer search input instead of `Cmd/Ctrl+K` because monaco-editor has a built-in shortcut for `Cmd/Ctrl+K`\n\n- [#4004](https://github.com/graphql/graphiql/pull/4004) [`16fdd6a`](https://github.com/graphql/graphiql/commit/16fdd6a16684c9f250ee53ea2dfbb24435cee6a9) Thanks [@dimaMachina](https://github.com/dimaMachina)! - show spinner in doc explorer based on `isIntrospecting` value, and not based on `isFetching`\n\n- Updated dependencies [[`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270), [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d), [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439)]:\n  - @graphiql/react@0.35.0-rc.2\n\n## 0.3.0-rc.1\n\n### Minor Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n### Patch Changes\n\n- Updated dependencies [[`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92)]:\n  - @graphiql/react@0.35.0-rc.1\n\n## 0.3.0-rc.0\n\n### Minor Changes\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n- Updated dependencies [[`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/react@0.35.0-rc.0\n\n## 0.2.2\n\n### Patch Changes\n\n- [#3970](https://github.com/graphql/graphiql/pull/3970) [`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - revert https://github.com/graphql/graphiql/pull/3946 to have support multiple embedded graphiql instances on the same page\n\n- Updated dependencies [[`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7)]:\n  - @graphiql/react@0.34.1\n\n## 0.2.1\n\n### Patch Changes\n\n- [#3946](https://github.com/graphql/graphiql/pull/3946) [`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand:\n  - replace `useExecutionContext` with `useExecutionStore` hook\n  - replace `useEditorContext` with `useEditorStore` hook\n  - replace `useAutoCompleteLeafs` hook with `getAutoCompleteLeafs` function\n- Updated dependencies [[`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af), [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781)]:\n  - @graphiql/react@0.34.0\n\n## 0.2.0\n\n### Minor Changes\n\n- [#3947](https://github.com/graphql/graphiql/pull/3947) [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - refactor `useStorage`, `useDocExplorer` and `useHistory` hooks\n\n### Patch Changes\n\n- [#3945](https://github.com/graphql/graphiql/pull/3945) [`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `usePluginContext` with `usePluginStore` hook\n\n- [#3943](https://github.com/graphql/graphiql/pull/3943) [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useSchemaContext` with `useSchemaStore` hook\n\n- Updated dependencies [[`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71), [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0), [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e), [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921)]:\n  - @graphiql/react@0.33.0\n\n## 0.1.0\n\n### Minor Changes\n\n- [#3940](https://github.com/graphql/graphiql/pull/3940) [`5a66864`](https://github.com/graphql/graphiql/commit/5a668647e1cbca9e846bfa617f97fbae21c821bd) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/plugin-doc-explorer): migrate React context to zustand, replace `useExplorerContext` with `useDocExplorer` and `useDocExplorerActions` hooks\n\n## 0.0.2\n\n### Patch Changes\n\n- [#3939](https://github.com/graphql/graphiql/pull/3939) [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `React.FC` type when declaring React components\n\n- Updated dependencies [[`2bfbb06`](https://github.com/graphql/graphiql/commit/2bfbb06e416cabc46951a137b61a12a571f0c937), [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7), [`2500288`](https://github.com/graphql/graphiql/commit/250028863f6eefe4167ff9f9c23168ccf0a85b7b)]:\n  - @graphiql/react@0.32.2\n\n## 0.0.1\n\n### Patch Changes\n\n- [#3916](https://github.com/graphql/graphiql/pull/3916) [`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove the following exports from `@graphiql/react` and move them in `@graphiql/plugin-doc-explorer` package:\n\n  - Argument\n  - DefaultValue\n  - DeprecationReason\n  - Directive\n  - DocExplorer\n  - ExplorerContext\n  - ExplorerContextProvider\n  - ExplorerSection\n  - FieldDocumentation\n  - FieldLink\n  - SchemaDocumentation\n  - Search\n  - TypeDocumentation\n  - TypeLink\n  - useExplorerContext\n  - DOC_EXPLORER_PLUGIN\n  - ExplorerContextType\n  - ExplorerFieldDef\n  - ExplorerNavStack\n  - ExplorerNavStackItem\n  - add new `referencePlugin` prop on `PluginContextProviderProps` component for plugin which is used to display the reference documentation when selecting a type.\n\n- Updated dependencies [[`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67)]:\n  - @graphiql/react@0.32.0\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/README.md",
    "content": "# `@graphiql/plugin-doc-explorer`\n\n## API\n\n- `useDocExplorer`: Handles the state for the doc explorer\n- `useDocExplorerActions`: Actions related to the doc explorer\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/package.json",
    "content": "{\n  \"name\": \"@graphiql/plugin-doc-explorer\",\n  \"version\": \"0.4.1\",\n  \"sideEffects\": false,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql-plugin-doc-explorer\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/master/packages/graphiql-plugin-doc-explorer#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:@graphiql/plugin-doc-explorer\"\n  },\n  \"license\": \"MIT\",\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./style.css\": \"./dist/style.css\",\n    \".\": \"./dist/index.js\"\n  },\n  \"types\": \"dist/index.d.ts\",\n  \"keywords\": [\n    \"react\",\n    \"graphql\",\n    \"graphiql\",\n    \"plugin\",\n    \"documentation\",\n    \"explorer\"\n  ],\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"vite build --watch --emptyOutDir=false\",\n    \"build\": \"vite build\",\n    \"test\": \"vitest\"\n  },\n  \"peerDependencies\": {\n    \"@graphiql/react\": \"^0.37.0\",\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\",\n    \"react\": \"^18 || ^19\",\n    \"react-compiler-runtime\": \"19.1.0-rc.1\",\n    \"react-dom\": \"^18 || ^19\"\n  },\n  \"dependencies\": {\n    \"@headlessui/react\": \"^2.2\",\n    \"zustand\": \"^5\"\n  },\n  \"devDependencies\": {\n    \"@testing-library/dom\": \"^10.4.0\",\n    \"@testing-library/jest-dom\": \"^6.6.3\",\n    \"@testing-library/react\": \"^16.3.0\",\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"babel-plugin-react-compiler\": \"19.1.0-rc.1\",\n    \"graphql\": \"^16.9.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-dts\": \"^4.5.3\"\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/setup-files.ts",
    "content": "'use no memo';\n\nimport '@testing-library/jest-dom';\n\n// to make it works like Jest (auto-mocking)\nvi.mock('zustand');\nvi.mock('monaco-editor');\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/__tests__/doc-explorer.spec.tsx",
    "content": "import type { Mock } from 'vitest';\nimport { useGraphiQL as $useGraphiQL } from '@graphiql/react';\nimport { render } from '@testing-library/react';\nimport { GraphQLInt, GraphQLObjectType, GraphQLSchema } from 'graphql';\nimport { FC, useEffect } from 'react';\nimport {\n  DocExplorerStore,\n  useDocExplorer,\n  useDocExplorerActions,\n} from '../../context';\nimport { DocExplorer } from '../doc-explorer';\n\nconst useGraphiQL = $useGraphiQL as Mock;\n\nvi.mock('@graphiql/react', async () => {\n  const originalModule =\n    await vi.importActual<typeof import('@graphiql/react')>('@graphiql/react');\n  return {\n    ...originalModule,\n    useGraphiQL: vi.fn(),\n  };\n});\n\nfunction makeSchema(fieldName = 'field') {\n  return new GraphQLSchema({\n    description: 'GraphQL Schema for testing',\n    query: new GraphQLObjectType({\n      name: 'Query',\n      fields: {\n        [fieldName]: {\n          type: GraphQLInt,\n          args: {\n            arg: {\n              type: GraphQLInt,\n            },\n          },\n        },\n      },\n    }),\n  });\n}\n\nconst defaultSchemaContext = {\n  introspect() {},\n  schema: makeSchema(),\n  validationErrors: [],\n};\n\nconst withErrorSchemaContext = {\n  ...defaultSchemaContext,\n  fetchError: 'Error fetching schema',\n  schema: new GraphQLSchema({ description: 'GraphQL Schema for testing' }),\n};\n\nconst DocExplorerWithContext: FC = () => {\n  return (\n    <DocExplorerStore>\n      <DocExplorer />\n    </DocExplorerStore>\n  );\n};\n\ndescribe('DocExplorer', () => {\n  beforeEach(() => {\n    vi.resetModules();\n  });\n\n  it('renders spinner when the schema is loading', () => {\n    useGraphiQL.mockImplementation(cb =>\n      cb({ ...defaultSchemaContext, isIntrospecting: true }),\n    );\n    const { container } = render(<DocExplorerWithContext />);\n    const spinner = container.querySelectorAll('.graphiql-spinner');\n    expect(spinner).toHaveLength(1);\n  });\n  it('renders with null schema', () => {\n    useGraphiQL.mockImplementation(cb =>\n      cb({ ...defaultSchemaContext, schema: null }),\n    );\n    const { container } = render(<DocExplorerWithContext />);\n    const error = container.querySelectorAll('.graphiql-doc-explorer-error');\n    expect(error).toHaveLength(1);\n    expect(error[0]).toHaveTextContent('No GraphQL schema available');\n  });\n  it('renders with schema', () => {\n    useGraphiQL.mockImplementation(cb => cb(defaultSchemaContext));\n    const { container } = render(<DocExplorerWithContext />);\n    const error = container.querySelectorAll('.graphiql-doc-explorer-error');\n    expect(error).toHaveLength(0);\n    expect(\n      container.querySelector('.graphiql-markdown-description'),\n    ).toHaveTextContent('GraphQL Schema for testing');\n  });\n  it('renders correctly with schema error', () => {\n    useGraphiQL.mockImplementation(cb => cb(withErrorSchemaContext));\n    const { rerender, container } = render(<DocExplorerWithContext />);\n    const error = container.querySelector('.graphiql-doc-explorer-error');\n    expect(error).toHaveTextContent('Error fetching schema');\n    useGraphiQL.mockImplementation(cb => cb(defaultSchemaContext));\n    rerender(<DocExplorerWithContext />);\n    const errors = container.querySelectorAll('.graphiql-doc-explorer-error');\n    expect(errors).toHaveLength(0);\n  });\n  it('maintains nav stack when possible', () => {\n    const initialSchema = makeSchema();\n    const Query = initialSchema.getType('Query');\n    const { field } = (Query as GraphQLObjectType).getFields();\n\n    // A hacky component to set the initial explorer nav stack\n    const SetInitialStack: React.FC = () => {\n      const explorerNavStack = useDocExplorer();\n      const { push } = useDocExplorerActions();\n      useEffect(() => {\n        if (explorerNavStack.length === 1) {\n          push({ name: 'Query', def: Query });\n          push({ name: 'field', def: field });\n        }\n      }, [explorerNavStack.length, push]);\n      return null;\n    };\n\n    // Initial render, set initial state\n    useGraphiQL.mockImplementation(cb =>\n      cb({ ...defaultSchemaContext, schema: initialSchema }),\n    );\n    const { container, rerender } = render(\n      <DocExplorerStore>\n        <SetInitialStack />\n      </DocExplorerStore>,\n    );\n\n    // First proper render of doc explorer\n    rerender(\n      <DocExplorerStore>\n        <DocExplorer />\n      </DocExplorerStore>,\n    );\n\n    const title = container.querySelector('.graphiql-doc-explorer-title')!;\n    expect(title.textContent).toEqual('field');\n\n    // Second render of doc explorer, this time with a new schema, with _same_ field name\n    useGraphiQL.mockImplementation(cb =>\n      cb({\n        ...defaultSchemaContext,\n        schema: makeSchema(), // <<< New, but equivalent, schema\n      }),\n    );\n    rerender(\n      <DocExplorerStore>\n        <DocExplorer />\n      </DocExplorerStore>,\n    );\n    const title2 = container.querySelector('.graphiql-doc-explorer-title')!;\n    // Because `Query.field` still exists in the new schema, we can still render it\n    expect(title2.textContent).toEqual('field');\n  });\n  it('trims nav stack when necessary', () => {\n    const initialSchema = makeSchema();\n    const Query = initialSchema.getType('Query');\n    const { field } = (Query as GraphQLObjectType).getFields();\n\n    // A hacky component to set the initial explorer nav stack\n    // eslint-disable-next-line sonarjs/no-identical-functions -- todo: could be refactored\n    const SetInitialStack: React.FC = () => {\n      const explorerNavStack = useDocExplorer();\n      const { push } = useDocExplorerActions();\n      useEffect(() => {\n        if (explorerNavStack.length === 1) {\n          push({ name: 'Query', def: Query });\n          push({ name: 'field', def: field });\n        }\n      }, [explorerNavStack.length, push]);\n      return null;\n    };\n\n    // Initial render, set initial state\n    useGraphiQL.mockImplementation(cb =>\n      cb({ ...defaultSchemaContext, schema: initialSchema }),\n    );\n    const { container, rerender } = render(\n      <DocExplorerStore>\n        <SetInitialStack />\n      </DocExplorerStore>,\n    );\n\n    // First proper render of doc explorer\n    rerender(\n      <DocExplorerStore>\n        <DocExplorer />\n      </DocExplorerStore>,\n    );\n\n    const title = container.querySelector('.graphiql-doc-explorer-title')!;\n    expect(title.textContent).toEqual('field');\n\n    // Second render of doc explorer, this time with a new schema, with a different field name\n    useGraphiQL.mockImplementation(cb =>\n      cb({\n        ...defaultSchemaContext,\n        schema: makeSchema('field2'), // <<< New schema with a new field name\n      }),\n    );\n    rerender(\n      <DocExplorerStore>\n        <DocExplorer />\n      </DocExplorerStore>,\n    );\n    const title2 = container.querySelector('.graphiql-doc-explorer-title')!;\n    // Because `Query.field` doesn't exist anymore, the top-most item we can render is `Query`\n    expect(title2.textContent).toEqual('Query');\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/__tests__/field-documentation.spec.tsx",
    "content": "import { FC, useEffect } from 'react';\nimport { fireEvent, render } from '@testing-library/react';\nimport { GraphQLString, GraphQLObjectType, Kind } from 'graphql';\nimport { DocExplorerFieldDef, docExplorerStore } from '../../context';\nimport { FieldDocumentation } from '../field-documentation';\n\nconst exampleObject = new GraphQLObjectType({\n  name: 'Query',\n  fields: {\n    string: {\n      type: GraphQLString,\n    },\n    stringWithArgs: {\n      type: GraphQLString,\n      description: 'Example String field with arguments',\n      args: {\n        stringArg: {\n          type: GraphQLString,\n        },\n        deprecatedStringArg: {\n          type: GraphQLString,\n          deprecationReason: 'no longer used',\n        },\n      },\n    },\n    stringWithDirective: {\n      type: GraphQLString,\n      astNode: {\n        kind: Kind.FIELD_DEFINITION,\n        name: {\n          kind: Kind.NAME,\n          value: 'stringWithDirective',\n        },\n        type: {\n          kind: Kind.NAMED_TYPE,\n          name: {\n            kind: Kind.NAME,\n            value: 'GraphQLString',\n          },\n        },\n        directives: [\n          {\n            kind: Kind.DIRECTIVE,\n            name: {\n              kind: Kind.NAME,\n              value: 'development',\n            },\n          },\n        ],\n      },\n    },\n  },\n});\n\nconst FieldDocumentationWithContext: FC<{\n  field: DocExplorerFieldDef;\n}> = ({ field }) => {\n  useEffect(() => {\n    docExplorerStore.setState({\n      explorerNavStack: [\n        {\n          name: field.name,\n          def: field,\n        },\n      ],\n    });\n  }, [field]);\n\n  return <FieldDocumentation field={field} />;\n};\n\ndescribe('FieldDocumentation', () => {\n  it('should render a simple string field', () => {\n    const { container } = render(\n      <FieldDocumentationWithContext\n        field={exampleObject.getFields().string!}\n      />,\n    );\n    expect(\n      container.querySelector('.graphiql-markdown-description'),\n    ).not.toBeInTheDocument();\n    expect(\n      container.querySelector('.graphiql-doc-explorer-type-name'),\n    ).toHaveTextContent('String');\n    expect(\n      container.querySelector('.graphiql-doc-explorer-argument'),\n    ).not.toBeInTheDocument();\n  });\n\n  it('should re-render on field change', () => {\n    const { container, rerender } = render(\n      <FieldDocumentationWithContext\n        field={exampleObject.getFields().string!}\n      />,\n    );\n    expect(\n      container.querySelector('.graphiql-markdown-description'),\n    ).not.toBeInTheDocument();\n    expect(\n      container.querySelector('.graphiql-doc-explorer-type-name'),\n    ).toHaveTextContent('String');\n    expect(\n      container.querySelector('.graphiql-doc-explorer-argument'),\n    ).not.toBeInTheDocument();\n\n    rerender(\n      <FieldDocumentationWithContext\n        field={exampleObject.getFields().stringWithArgs!}\n      />,\n    );\n    expect(\n      container.querySelector('.graphiql-doc-explorer-type-name'),\n    ).toHaveTextContent('String');\n    expect(\n      container.querySelector('.graphiql-markdown-description'),\n    ).toHaveTextContent('Example String field with arguments');\n  });\n\n  it('should render a string field with arguments', () => {\n    const { container, getByText } = render(\n      <FieldDocumentationWithContext\n        field={exampleObject.getFields().stringWithArgs!}\n      />,\n    );\n    expect(\n      container.querySelector('.graphiql-doc-explorer-type-name'),\n    ).toHaveTextContent('String');\n    expect(\n      container.querySelector('.graphiql-markdown-description'),\n    ).toHaveTextContent('Example String field with arguments');\n    expect(\n      container.querySelectorAll('.graphiql-doc-explorer-argument'),\n    ).toHaveLength(1);\n    expect(\n      container.querySelector('.graphiql-doc-explorer-argument'),\n    ).toHaveTextContent('stringArg: String');\n    // by default, the deprecation docs should be hidden\n    expect(\n      container.querySelectorAll('.graphiql-markdown-deprecation'),\n    ).toHaveLength(0);\n    // make sure deprecation is present\n    fireEvent.click(getByText('Show Deprecated Arguments'));\n    const deprecationDocs = container.querySelectorAll(\n      '.graphiql-markdown-deprecation',\n    );\n    expect(deprecationDocs).toHaveLength(1);\n    expect(deprecationDocs[0]).toHaveTextContent('no longer used');\n  });\n\n  it('should render a string field with directives', () => {\n    const { container } = render(\n      <FieldDocumentationWithContext\n        field={exampleObject.getFields().stringWithDirective!}\n      />,\n    );\n    expect(\n      container.querySelector('.graphiql-doc-explorer-type-name'),\n    ).toHaveTextContent('String');\n    expect(\n      container.querySelector('.graphiql-doc-explorer-directive'),\n    ).toHaveTextContent('@development');\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/__tests__/fixtures.ts",
    "content": "import {\n  GraphQLBoolean,\n  GraphQLEnumType,\n  GraphQLInterfaceType,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQLString,\n  GraphQLUnionType,\n} from 'graphql';\n\nconst ExampleInterface = new GraphQLInterfaceType({\n  name: 'exampleInterface',\n  fields: {\n    name: { type: GraphQLString },\n  },\n});\n\nexport const ExampleEnum = new GraphQLEnumType({\n  name: 'exampleEnum',\n  values: {\n    value1: { value: 'Value 1' },\n    value2: { value: 'Value 2' },\n    value3: { value: 'Value 3', deprecationReason: 'Only two are needed' },\n  },\n});\n\nconst ExampleUnionType1 = new GraphQLObjectType({\n  name: 'Union_Type_1',\n  interfaces: [ExampleInterface],\n  fields: {\n    name: { type: GraphQLString },\n    enum: { type: ExampleEnum },\n  },\n});\n\nconst ExampleUnionType2 = new GraphQLObjectType({\n  name: 'Union_Type_2',\n  interfaces: [ExampleInterface],\n  fields: {\n    name: { type: GraphQLString },\n    string: { type: GraphQLString },\n  },\n});\n\nexport const ExampleUnion = new GraphQLUnionType({\n  name: 'exampleUnion',\n  types: [ExampleUnionType1, ExampleUnionType2],\n});\n\nexport const ExampleQuery = new GraphQLObjectType({\n  name: 'Query',\n  description: 'Query description\\n Second line',\n  fields: {\n    string: { type: GraphQLString },\n    union: { type: ExampleUnion },\n    fieldWithArgs: {\n      type: GraphQLString,\n      args: {\n        stringArg: { type: GraphQLString },\n      },\n    },\n    deprecatedField: {\n      type: GraphQLBoolean,\n      deprecationReason: 'example deprecation reason',\n    },\n  },\n});\nexport const ExampleSchema = new GraphQLSchema({\n  query: ExampleQuery,\n  description: 'GraphQL Schema for testing',\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/__tests__/test-utils.ts",
    "content": "'use no memo';\nimport type { GraphQLNamedType, GraphQLType } from 'graphql';\n\nexport function unwrapType(type: GraphQLType): GraphQLNamedType {\n  return 'ofType' in type ? unwrapType(type.ofType) : type;\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/__tests__/type-documentation.spec.tsx",
    "content": "import { FC, useEffect } from 'react';\nimport { fireEvent, render } from '@testing-library/react';\nimport type { GraphQLNamedType } from 'graphql';\nimport {\n  ExampleSchema,\n  ExampleEnum,\n  ExampleUnion,\n  ExampleQuery,\n} from './fixtures';\nimport { docExplorerStore } from '../../context';\nimport { TypeDocumentation } from '../type-documentation';\nimport { unwrapType } from './test-utils';\nimport type { SlicesWithActions } from '@graphiql/react';\n\nvi.mock('@graphiql/react', async () => {\n  const originalModule =\n    await vi.importActual<typeof import('@graphiql/react')>('@graphiql/react');\n  const useGraphiQL: (typeof originalModule)['useGraphiQL'] = cb =>\n    cb({ schema: ExampleSchema } as SlicesWithActions);\n\n  return {\n    ...originalModule,\n    useGraphiQL,\n  };\n});\n\nconst TypeDocumentationWithContext: FC<{ type: GraphQLNamedType }> = ({\n  type,\n}) => {\n  useEffect(() => {\n    docExplorerStore.setState({\n      explorerNavStack: [\n        {\n          name: unwrapType(type).name,\n          def: type,\n        },\n      ],\n    });\n  }, [type]);\n  return <TypeDocumentation type={type} />;\n};\n\ndescribe('TypeDocumentation', () => {\n  it('renders a top-level query object type', () => {\n    const { container } = render(\n      <TypeDocumentationWithContext type={ExampleQuery} />,\n    );\n    const description = container.querySelectorAll(\n      '.graphiql-markdown-description',\n    );\n    expect(description).toHaveLength(1);\n    expect(description[0]).toHaveTextContent('Query description\\nSecond line', {\n      normalizeWhitespace: false,\n    });\n\n    const cats = container.querySelectorAll('.graphiql-doc-explorer-item');\n    expect(cats[0]).toHaveTextContent('string: String');\n    expect(cats[1]).toHaveTextContent('union: exampleUnion');\n    expect(cats[2]).toHaveTextContent(\n      'fieldWithArgs(stringArg: String): String',\n    );\n  });\n\n  it('renders deprecated fields when you click to see them', () => {\n    const { container, getByText } = render(\n      <TypeDocumentationWithContext type={ExampleQuery} />,\n    );\n    let cats = container.querySelectorAll('.graphiql-doc-explorer-item');\n    expect(cats).toHaveLength(3);\n\n    fireEvent.click(getByText('Show Deprecated Fields'));\n\n    cats = container.querySelectorAll('.graphiql-doc-explorer-item');\n    expect(cats).toHaveLength(4);\n    expect(\n      container.querySelectorAll('.graphiql-doc-explorer-field-name')[3],\n    ).toHaveTextContent('deprecatedField');\n    expect(\n      container.querySelector('.graphiql-markdown-deprecation'),\n    ).toHaveTextContent('example deprecation reason');\n  });\n\n  it('renders a Union type', () => {\n    const { container } = render(\n      <TypeDocumentationWithContext type={ExampleUnion} />,\n    );\n    const title = container.querySelector(\n      '.graphiql-doc-explorer-section-title',\n    )!;\n    title.childNodes[0]!.remove();\n    expect(title).toHaveTextContent('Possible Types');\n  });\n\n  it('renders an Enum type', () => {\n    const { container } = render(\n      <TypeDocumentationWithContext type={ExampleEnum} />,\n    );\n    const title = container.querySelector(\n      '.graphiql-doc-explorer-section-title',\n    )!;\n    title.childNodes[0]!.remove();\n    expect(title).toHaveTextContent('Enum Values');\n    const enums = container.querySelectorAll(\n      '.graphiql-doc-explorer-enum-value',\n    );\n    expect(enums[0]).toHaveTextContent('value1');\n    expect(enums[1]).toHaveTextContent('value2');\n  });\n\n  it('shows deprecated enum values on click', () => {\n    const { getByText, container } = render(\n      <TypeDocumentationWithContext type={ExampleEnum} />,\n    );\n    const showBtn = getByText('Show Deprecated Values');\n    expect(showBtn).toBeInTheDocument();\n\n    const title = container.querySelector(\n      '.graphiql-doc-explorer-section-title',\n    )!;\n    title.childNodes[0]!.remove();\n    expect(title).toHaveTextContent('Enum Values');\n\n    let enums = container.querySelectorAll('.graphiql-doc-explorer-enum-value');\n    expect(enums).toHaveLength(2);\n\n    // click button to show deprecated enum values\n    fireEvent.click(showBtn);\n    expect(showBtn).not.toBeInTheDocument();\n\n    const deprecatedTitle = container.querySelectorAll(\n      '.graphiql-doc-explorer-section-title',\n    )[1]!;\n    deprecatedTitle.childNodes[0]!.remove();\n    expect(deprecatedTitle).toHaveTextContent('Deprecated Enum Values');\n\n    enums = container.querySelectorAll('.graphiql-doc-explorer-enum-value');\n    expect(enums).toHaveLength(3);\n    expect(enums[2]).toHaveTextContent('value3');\n    expect(\n      container.querySelector('.graphiql-markdown-deprecation'),\n    ).toHaveTextContent('Only two are needed');\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/__tests__/type-link.spec.tsx",
    "content": "import { FC, useEffect } from 'react';\nimport { fireEvent, render } from '@testing-library/react';\nimport { GraphQLNonNull, GraphQLList, GraphQLString } from 'graphql';\nimport { docExplorerStore, useDocExplorer } from '../../context';\nimport { TypeLink } from '../type-link';\nimport { unwrapType } from './test-utils';\n\nconst nonNullType = new GraphQLNonNull(GraphQLString);\nconst listType = new GraphQLList(GraphQLString);\n\nconst TypeLinkConsumer: FC = () => {\n  const explorerNavStack = useDocExplorer();\n  return (\n    <span data-testid=\"nav-stack\">\n      {JSON.stringify(explorerNavStack[explorerNavStack.length + 1])}\n    </span>\n  );\n};\n\nconst TypeLinkWithContext: typeof TypeLink = ({ type }) => {\n  useEffect(() => {\n    docExplorerStore.setState({\n      explorerNavStack: [\n        {\n          name: unwrapType(type).name,\n          def: unwrapType(type),\n        },\n      ],\n    });\n  }, [type]);\n\n  return (\n    <>\n      <TypeLink type={type} />\n      {/* Print the top of the current nav stack for test assertions */}\n      <TypeLinkConsumer />\n    </>\n  );\n};\n\ndescribe('TypeLink', () => {\n  it('should render a string', () => {\n    const { container } = render(<TypeLinkWithContext type={GraphQLString} />);\n    expect(container).toHaveTextContent('String');\n    expect(container.querySelectorAll('a')).toHaveLength(1);\n  });\n  it('should render a non-null type', () => {\n    const { container } = render(<TypeLinkWithContext type={nonNullType} />);\n    expect(container).toHaveTextContent('String!');\n    expect(container.querySelectorAll('span')).toHaveLength(1);\n  });\n  it('should render a list type', () => {\n    const { container } = render(<TypeLinkWithContext type={listType} />);\n    expect(container).toHaveTextContent('[String]');\n    expect(container.querySelectorAll('span')).toHaveLength(1);\n  });\n  it('should push to the nav stack on click', () => {\n    const { container, getByTestId } = render(\n      <TypeLinkWithContext type={listType} />,\n    );\n    fireEvent.click(container.querySelector('a')!);\n    expect(getByTestId('nav-stack')).toHaveTextContent('');\n  });\n  it('should re-render on type change', () => {\n    const { container, rerender } = render(\n      <TypeLinkWithContext type={listType} />,\n    );\n    expect(container).toHaveTextContent('[String]');\n    rerender(<TypeLinkWithContext type={GraphQLString} />);\n    expect(container).toHaveTextContent('String');\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/argument.css",
    "content": ".graphiql-doc-explorer-argument {\n  & > * + * {\n    margin-top: var(--px-12);\n  }\n}\n\n.graphiql-doc-explorer-argument-name {\n  color: hsl(var(--color-secondary));\n}\n\n.graphiql-doc-explorer-argument-deprecation {\n  background-color: hsla(var(--color-warning), var(--alpha-background-light));\n  border: 1px solid hsl(var(--color-warning));\n  border-radius: var(--border-radius-4);\n  color: hsl(var(--color-warning));\n  padding: var(--px-8);\n}\n\n.graphiql-doc-explorer-argument-deprecation-label {\n  font-size: var(--font-size-hint);\n  font-weight: var(--font-weight-medium);\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/argument.tsx",
    "content": "import type { FC } from 'react';\nimport type { GraphQLArgument } from 'graphql';\nimport { MarkdownContent } from '@graphiql/react';\nimport { DefaultValue } from './default-value';\nimport { TypeLink } from './type-link';\nimport './argument.css';\n\ntype ArgumentProps = {\n  /**\n   * The argument that should be rendered.\n   */\n  arg: GraphQLArgument;\n  /**\n   * Toggle if the default value for the argument is shown (if there is one)\n   * @default false\n   */\n  showDefaultValue?: boolean;\n  /**\n   * Toggle whether to render the whole argument including description and\n   * deprecation reason (`false`) or to just render the argument name, type,\n   * and default value in a single line (`true`).\n   * @default false\n   */\n  inline?: boolean;\n};\n\nexport const Argument: FC<ArgumentProps> = ({\n  arg,\n  showDefaultValue,\n  inline,\n}) => {\n  const definition = (\n    <span>\n      <span className=\"graphiql-doc-explorer-argument-name\">{arg.name}</span>\n      {': '}\n      <TypeLink type={arg.type} />\n      {showDefaultValue !== false && <DefaultValue field={arg} />}\n    </span>\n  );\n  if (inline) {\n    return definition;\n  }\n  return (\n    <div className=\"graphiql-doc-explorer-argument\">\n      {definition}\n      {arg.description ? (\n        <MarkdownContent type=\"description\">{arg.description}</MarkdownContent>\n      ) : null}\n      {arg.deprecationReason ? (\n        <div className=\"graphiql-doc-explorer-argument-deprecation\">\n          <div className=\"graphiql-doc-explorer-argument-deprecation-label\">\n            Deprecated\n          </div>\n          <MarkdownContent type=\"deprecation\">\n            {arg.deprecationReason}\n          </MarkdownContent>\n        </div>\n      ) : null}\n    </div>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/default-value.css",
    "content": ".graphiql-doc-explorer-default-value {\n  color: hsl(var(--color-success));\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/default-value.tsx",
    "content": "import type { FC } from 'react';\nimport { astFromValue, print, ValueNode } from 'graphql';\nimport type { DocExplorerFieldDef } from '../context';\nimport './default-value.css';\n\nconst printDefault = (ast?: ValueNode | null): string => {\n  if (!ast) {\n    return '';\n  }\n  return print(ast);\n};\n\ntype DefaultValueProps = {\n  /**\n   * The field or argument for which to render the default value.\n   */\n  field: DocExplorerFieldDef;\n};\n\nexport const DefaultValue: FC<DefaultValueProps> = ({ field }) => {\n  if (!('defaultValue' in field) || field.defaultValue === undefined) {\n    return null;\n  }\n  const ast = astFromValue(field.defaultValue, field.type);\n  if (!ast) {\n    return null;\n  }\n  return (\n    <>\n      {' = '}\n      <span className=\"graphiql-doc-explorer-default-value\">\n        {printDefault(ast)}\n      </span>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/deprecation-reason.css",
    "content": ".graphiql-doc-explorer-deprecation {\n  background-color: hsla(var(--color-warning), var(--alpha-background-light));\n  border: 1px solid hsl(var(--color-warning));\n  border-radius: var(--px-4);\n  color: hsl(var(--color-warning));\n  padding: var(--px-8);\n}\n\n.graphiql-doc-explorer-deprecation-label {\n  font-size: var(--font-size-hint);\n  font-weight: var(--font-weight-medium);\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/deprecation-reason.tsx",
    "content": "import type { FC } from 'react';\nimport { MarkdownContent } from '@graphiql/react';\nimport './deprecation-reason.css';\n\ntype DeprecationReasonProps = {\n  /**\n   * The deprecation reason as Markdown string.\n   */\n  children?: string | null;\n  preview?: boolean;\n};\n\nexport const DeprecationReason: FC<DeprecationReasonProps> = props => {\n  return props.children ? (\n    <div className=\"graphiql-doc-explorer-deprecation\">\n      <div className=\"graphiql-doc-explorer-deprecation-label\">Deprecated</div>\n      <MarkdownContent\n        type=\"deprecation\"\n        onlyShowFirstChild={props.preview ?? true}\n      >\n        {props.children}\n      </MarkdownContent>\n    </div>\n  ) : null;\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/directive.css",
    "content": ".graphiql-doc-explorer-directive {\n  color: hsl(var(--color-secondary));\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/directive.tsx",
    "content": "import type { FC } from 'react';\nimport type { DirectiveNode } from 'graphql';\nimport './directive.css';\n\ntype DirectiveProps = {\n  /**\n   * The directive that should be rendered.\n   */\n  directive: DirectiveNode;\n};\n\nexport const Directive: FC<DirectiveProps> = ({ directive }) => {\n  return (\n    <span className=\"graphiql-doc-explorer-directive\">\n      @{directive.name.value}\n    </span>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/doc-explorer.css",
    "content": "/* The header of the doc explorer */\n.graphiql-doc-explorer-header {\n  display: flex;\n  justify-content: space-between;\n  position: relative;\n\n  &:focus-within {\n    & .graphiql-doc-explorer-title {\n      /* Hide the header when focussing the search input */\n      visibility: hidden;\n    }\n\n    & .graphiql-doc-explorer-back:not(:focus) {\n      /**\n        * Make the back link invisible when focussing the search input. Hiding\n        * it in any other way makes it impossible to focus the link by pressing\n        * Shift-Tab while the input is focussed.\n        */\n      color: transparent;\n    }\n  }\n}\n.graphiql-doc-explorer-header-content {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n}\n\n/* The search input in the header of the doc explorer */\n.graphiql-doc-explorer-search {\n  position: absolute;\n  right: 0;\n  top: 0;\n\n  &:focus-within {\n    left: 0;\n  }\n\n  &:not(:focus-within) [role='combobox'] {\n    height: 24px;\n    width: 6.5ch;\n  }\n\n  & [role='combobox']:focus {\n    width: 100%;\n  }\n}\n\n/* The back-button in the doc explorer */\na.graphiql-doc-explorer-back {\n  align-items: center;\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  display: flex;\n  text-decoration: none;\n\n  &:hover {\n    text-decoration: underline;\n  }\n\n  &:focus {\n    outline: hsla(var(--color-neutral), var(--alpha-secondary)) auto 1px;\n\n    & + .graphiql-doc-explorer-title {\n      /* Don't hide the header when focussing the back link */\n      visibility: unset;\n    }\n  }\n\n  & > svg {\n    height: var(--px-8);\n    margin-right: var(--px-8);\n    width: var(--px-8);\n  }\n}\n\n/* The title of the currently active page in the doc explorer */\n.graphiql-doc-explorer-title {\n  font-weight: var(--font-weight-medium);\n  font-size: var(--font-size-h2);\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  &:not(:first-child) {\n    font-size: var(--font-size-h3);\n    margin-top: var(--px-8);\n  }\n}\n\n/* The contents of the currently active page in the doc explorer */\n.graphiql-doc-explorer-content > * {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  margin-top: var(--px-20);\n}\n\n/* Error message */\n.graphiql-doc-explorer-error {\n  background-color: hsla(var(--color-error), var(--alpha-background-heavy));\n  border: 1px solid hsl(var(--color-error));\n  border-radius: var(--border-radius-8);\n  color: hsl(var(--color-error));\n  padding: var(--px-8) var(--px-12);\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/doc-explorer.tsx",
    "content": "import { isType } from 'graphql';\nimport type { FC, ReactNode } from 'react';\nimport { ChevronLeftIcon, Spinner, useGraphiQL, pick } from '@graphiql/react';\nimport { useDocExplorer, useDocExplorerActions } from '../context';\nimport { FieldDocumentation } from './field-documentation';\nimport { SchemaDocumentation } from './schema-documentation';\nimport { Search } from './search';\nimport { TypeDocumentation } from './type-documentation';\nimport './doc-explorer.css';\n\nexport const DocExplorer: FC = () => {\n  const { fetchError, isIntrospecting, schema, validationErrors } = useGraphiQL(\n    pick('fetchError', 'isIntrospecting', 'schema', 'validationErrors'),\n  );\n  const explorerNavStack = useDocExplorer();\n  const { pop } = useDocExplorerActions();\n  const navItem = explorerNavStack.at(-1)!;\n\n  let content: ReactNode = null;\n  if (fetchError) {\n    content = (\n      <div className=\"graphiql-doc-explorer-error\">Error fetching schema</div>\n    );\n  } else if (validationErrors[0]) {\n    content = (\n      <div className=\"graphiql-doc-explorer-error\">\n        Schema is invalid: {validationErrors[0].message}\n      </div>\n    );\n  } else if (isIntrospecting) {\n    // Schema is undefined when it is being loaded via introspection.\n    content = <Spinner />;\n  } else if (!schema) {\n    // Schema is null when it explicitly does not exist, typically due to\n    // an error during introspection.\n    content = (\n      <div className=\"graphiql-doc-explorer-error\">\n        No GraphQL schema available\n      </div>\n    );\n  } else if (explorerNavStack.length === 1) {\n    content = <SchemaDocumentation schema={schema} />;\n  } else if (isType(navItem.def)) {\n    content = <TypeDocumentation type={navItem.def} />;\n  } else if (navItem.def) {\n    content = <FieldDocumentation field={navItem.def} />;\n  }\n\n  let prevName;\n  if (explorerNavStack.length > 1) {\n    prevName = explorerNavStack.at(-2)!.name;\n  }\n\n  return (\n    <section\n      className=\"graphiql-doc-explorer\"\n      aria-label=\"Documentation Explorer\"\n    >\n      <div className=\"graphiql-doc-explorer-header\">\n        <div className=\"graphiql-doc-explorer-header-content\">\n          {prevName && (\n            <a\n              href=\"#\"\n              className=\"graphiql-doc-explorer-back\"\n              onClick={event => {\n                event.preventDefault();\n                pop();\n              }}\n              aria-label={`Go back to ${prevName}`}\n            >\n              <ChevronLeftIcon />\n              {prevName}\n            </a>\n          )}\n          <div className=\"graphiql-doc-explorer-title\">{navItem.name}</div>\n        </div>\n        <Search key={navItem.name} />\n      </div>\n      <div className=\"graphiql-doc-explorer-content\">{content}</div>\n    </section>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/field-documentation.tsx",
    "content": "import type { GraphQLArgument } from 'graphql';\nimport { FC, useState } from 'react';\nimport { Button, MarkdownContent } from '@graphiql/react';\nimport type { DocExplorerFieldDef } from '../context';\nimport { Argument } from './argument';\nimport { DeprecationReason } from './deprecation-reason';\nimport { Directive } from './directive';\nimport { ExplorerSection } from './section';\nimport { TypeLink } from './type-link';\n\ntype FieldDocumentationProps = {\n  /**\n   * The field or argument that should be rendered.\n   */\n  field: DocExplorerFieldDef;\n};\n\nexport const FieldDocumentation: FC<FieldDocumentationProps> = ({ field }) => {\n  return (\n    <>\n      {field.description ? (\n        <MarkdownContent type=\"description\">\n          {field.description}\n        </MarkdownContent>\n      ) : null}\n      <DeprecationReason preview={false}>\n        {field.deprecationReason}\n      </DeprecationReason>\n      <ExplorerSection title=\"Type\">\n        <TypeLink type={field.type} />\n      </ExplorerSection>\n      <Arguments field={field} />\n      <Directives field={field} />\n    </>\n  );\n};\n\nconst Arguments: FC<{ field: DocExplorerFieldDef }> = ({ field }) => {\n  const [showDeprecated, setShowDeprecated] = useState(false);\n  const handleShowDeprecated = () => {\n    setShowDeprecated(true);\n  };\n\n  if (!('args' in field)) {\n    return null;\n  }\n\n  const args: GraphQLArgument[] = [];\n  const deprecatedArgs: GraphQLArgument[] = [];\n  for (const argument of field.args) {\n    if (argument.deprecationReason) {\n      deprecatedArgs.push(argument);\n    } else {\n      args.push(argument);\n    }\n  }\n\n  return (\n    <>\n      {args.length > 0 ? (\n        <ExplorerSection title=\"Arguments\">\n          {args.map(arg => (\n            <Argument key={arg.name} arg={arg} />\n          ))}\n        </ExplorerSection>\n      ) : null}\n      {deprecatedArgs.length > 0 ? (\n        showDeprecated || args.length === 0 ? (\n          <ExplorerSection title=\"Deprecated Arguments\">\n            {deprecatedArgs.map(arg => (\n              <Argument key={arg.name} arg={arg} />\n            ))}\n          </ExplorerSection>\n        ) : (\n          <Button type=\"button\" onClick={handleShowDeprecated}>\n            Show Deprecated Arguments\n          </Button>\n        )\n      ) : null}\n    </>\n  );\n};\n\nconst Directives: FC<{ field: DocExplorerFieldDef }> = ({ field }) => {\n  const directives = field.astNode?.directives;\n  if (!directives?.length) {\n    return null;\n  }\n  return (\n    <ExplorerSection title=\"Directives\">\n      {directives.map(directive => (\n        <div key={directive.name.value}>\n          <Directive directive={directive} />\n        </div>\n      ))}\n    </ExplorerSection>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/field-link.css",
    "content": "a.graphiql-doc-explorer-field-name {\n  color: hsl(var(--color-info));\n  text-decoration: none;\n\n  &:hover {\n    text-decoration: underline;\n  }\n\n  &:focus {\n    outline: hsl(var(--color-info)) auto 1px;\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/field-link.tsx",
    "content": "import type { FC } from 'react';\nimport { DocExplorerFieldDef, useDocExplorerActions } from '../context';\nimport './field-link.css';\n\ntype FieldLinkProps = {\n  /**\n   * The field or argument that should be linked to.\n   */\n  field: DocExplorerFieldDef;\n};\n\nexport const FieldLink: FC<FieldLinkProps> = ({ field }) => {\n  const { push } = useDocExplorerActions();\n\n  return (\n    <a\n      className=\"graphiql-doc-explorer-field-name\"\n      onClick={event => {\n        event.preventDefault();\n        push({ name: field.name, def: field });\n      }}\n      href=\"#\"\n    >\n      {field.name}\n    </a>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/index.ts",
    "content": "export { Argument } from './argument';\nexport { DefaultValue } from './default-value';\nexport { DeprecationReason } from './deprecation-reason';\nexport { Directive } from './directive';\nexport { DocExplorer } from './doc-explorer';\nexport { FieldDocumentation } from './field-documentation';\nexport { FieldLink } from './field-link';\nexport { SchemaDocumentation } from './schema-documentation';\nexport { Search } from './search';\nexport { ExplorerSection } from './section';\nexport { TypeDocumentation } from './type-documentation';\nexport { TypeLink } from './type-link';\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/schema-documentation.css",
    "content": ".graphiql-doc-explorer-root-type {\n  color: hsl(var(--color-info));\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/schema-documentation.tsx",
    "content": "import type { FC } from 'react';\nimport type { GraphQLSchema } from 'graphql';\nimport { MarkdownContent } from '@graphiql/react';\nimport { ExplorerSection } from './section';\nimport { TypeLink } from './type-link';\nimport './schema-documentation.css';\n\ntype SchemaDocumentationProps = {\n  /**\n   * The schema that should be rendered.\n   */\n  schema: GraphQLSchema;\n};\n\nexport const SchemaDocumentation: FC<SchemaDocumentationProps> = ({\n  schema,\n}) => {\n  const queryType = schema.getQueryType();\n  const mutationType = schema.getMutationType();\n  const subscriptionType = schema.getSubscriptionType();\n  const typeMap = schema.getTypeMap();\n  const ignoreTypesInAllSchema = [\n    queryType?.name,\n    mutationType?.name,\n    subscriptionType?.name,\n  ];\n\n  return (\n    <>\n      <MarkdownContent type=\"description\">\n        {schema.description ||\n          'A GraphQL schema provides a root type for each kind of operation.'}\n      </MarkdownContent>\n      <ExplorerSection title=\"Root Types\">\n        {queryType ? (\n          <div>\n            <span className=\"graphiql-doc-explorer-root-type\">query</span>\n            {': '}\n            <TypeLink type={queryType} />\n          </div>\n        ) : null}\n        {mutationType && (\n          <div>\n            <span className=\"graphiql-doc-explorer-root-type\">mutation</span>\n            {': '}\n            <TypeLink type={mutationType} />\n          </div>\n        )}\n        {subscriptionType && (\n          <div>\n            <span className=\"graphiql-doc-explorer-root-type\">\n              subscription\n            </span>\n            {': '}\n            <TypeLink type={subscriptionType} />\n          </div>\n        )}\n      </ExplorerSection>\n      <ExplorerSection title=\"All Schema Types\">\n        <div>\n          {Object.values(typeMap).map(type => {\n            if (\n              ignoreTypesInAllSchema.includes(type.name) ||\n              type.name.startsWith('__')\n            ) {\n              return null;\n            }\n\n            return (\n              <div key={type.name}>\n                <TypeLink type={type} />\n              </div>\n            );\n          })}\n        </div>\n      </ExplorerSection>\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/search.css",
    "content": ".graphiql-doc-explorer-search {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n\n  &:not([data-state='idle']) {\n    border: var(--popover-border);\n    border-radius: var(--border-radius-4);\n    box-shadow: var(--popover-box-shadow);\n    color: hsl(var(--color-neutral));\n\n    & .graphiql-doc-explorer-search-input {\n      background: hsl(var(--color-base));\n    }\n  }\n}\n\n.graphiql-doc-explorer-search-input {\n  align-items: center;\n  background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  border-radius: var(--border-radius-4);\n  display: flex;\n  padding: var(--px-8) var(--px-12);\n}\n\n.graphiql-doc-explorer-search [role='combobox'] {\n  border: none;\n  background-color: transparent;\n  margin-left: var(--px-4);\n  width: 100%;\n\n  &:focus {\n    outline: none;\n  }\n}\n\n.graphiql-doc-explorer-search [role='listbox'] {\n  background-color: hsl(var(--color-base));\n  border: none;\n  border-bottom-left-radius: var(--border-radius-4);\n  border-bottom-right-radius: var(--border-radius-4);\n  border-top: 1px solid\n    hsla(var(--color-neutral), var(--alpha-background-heavy));\n  max-height: 400px;\n  overflow-y: auto;\n  margin: 0;\n  font-size: var(--font-size-body);\n  padding: var(--px-4);\n  /**\n   * This makes sure that the logic for auto-scrolling the search results when\n   * using keyboard navigation works properly (we use `offsetTop` there).\n   */\n  position: relative;\n}\n\n.graphiql-doc-explorer-search [role='option'] {\n  border-radius: var(--border-radius-4);\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  overflow-x: hidden;\n  padding: var(--px-8) var(--px-12);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  cursor: pointer;\n\n  &[data-headlessui-state='active'] {\n    background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  }\n\n  &:hover {\n    background-color: hsla(\n      var(--color-neutral),\n      var(--alpha-background-medium)\n    );\n  }\n\n  &[data-headlessui-state='active']:hover {\n    background-color: hsla(var(--color-neutral), var(--alpha-background-heavy));\n  }\n\n  & + & {\n    margin-top: var(--px-4);\n  }\n}\n\n.graphiql-doc-explorer-search-type {\n  color: hsl(var(--color-info));\n}\n\n.graphiql-doc-explorer-search-field {\n  color: hsl(var(--color-warning));\n}\n\n.graphiql-doc-explorer-search-argument {\n  color: hsl(var(--color-secondary));\n}\n\n.graphiql-doc-explorer-search-divider {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  font-size: var(--font-size-hint);\n  font-weight: var(--font-weight-medium);\n  margin-top: var(--px-8);\n  padding: var(--px-8) var(--px-12);\n}\n\n.graphiql-doc-explorer-search-empty {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  padding: var(--px-8) var(--px-12);\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/search.tsx",
    "content": "import {\n  GraphQLArgument,\n  GraphQLField,\n  GraphQLInputField,\n  GraphQLNamedType,\n  isInputObjectType,\n  isInterfaceType,\n  isObjectType,\n} from 'graphql';\nimport { FC, useEffect, useRef, useState } from 'react';\nimport {\n  Combobox,\n  ComboboxInput,\n  ComboboxOptions,\n  ComboboxOption,\n} from '@headlessui/react';\nimport {\n  formatShortcutForOS,\n  useGraphiQL,\n  MagnifyingGlassIcon,\n  debounce,\n  KEY_MAP,\n} from '@graphiql/react';\nimport { useDocExplorer, useDocExplorerActions } from '../context';\nimport { renderType } from './utils';\nimport './search.css';\n\nexport const Search: FC = () => {\n  const explorerNavStack = useDocExplorer();\n  const { push } = useDocExplorerActions();\n\n  const inputRef = useRef<HTMLInputElement>(null!);\n  const getSearchResults = useSearchResults();\n  const [searchValue, setSearchValue] = useState('');\n  const [results, setResults] = useState(() => getSearchResults(searchValue));\n  const debouncedGetSearchResults = debounce(200, (search: string) => {\n    setResults(getSearchResults(search));\n  });\n  // Workaround to fix React compiler error:\n  // Ref values (the `current` property) may not be accessed during render.\n  const [ref] = useState(inputRef);\n  const isFocused = ref.current === document.activeElement;\n\n  useEffect(() => {\n    debouncedGetSearchResults(searchValue);\n  }, [debouncedGetSearchResults, searchValue]);\n\n  const navItem = explorerNavStack.at(-1)!;\n\n  const onSelect = (def: TypeMatch | FieldMatch | null) => {\n    // `null` when we remove search value\n    if (!def) {\n      return;\n    }\n    push(\n      'field' in def\n        ? { name: def.field.name, def: def.field }\n        : { name: def.type.name, def: def.type },\n    );\n  };\n  const shouldSearchBoxAppear =\n    explorerNavStack.length === 1 ||\n    isObjectType(navItem.def) ||\n    isInterfaceType(navItem.def) ||\n    isInputObjectType(navItem.def);\n  if (!shouldSearchBoxAppear) {\n    return null;\n  }\n\n  return (\n    <Combobox\n      as=\"div\"\n      className=\"graphiql-doc-explorer-search\"\n      onChange={onSelect}\n      data-state={isFocused ? undefined : 'idle'}\n      aria-label={`Search ${navItem.name}...`}\n    >\n      <div\n        className=\"graphiql-doc-explorer-search-input\"\n        onClick={() => {\n          inputRef.current.focus();\n        }}\n      >\n        <MagnifyingGlassIcon />\n        <ComboboxInput\n          autoComplete=\"off\"\n          onChange={event => setSearchValue(event.target.value)}\n          placeholder={formatShortcutForOS(\n            formatShortcutForOS(KEY_MAP.searchInDocs.key).replaceAll('-', ' '),\n          )}\n          ref={inputRef}\n          value={searchValue}\n          data-cy=\"doc-explorer-input\"\n        />\n      </div>\n      {isFocused && (\n        <ComboboxOptions data-cy=\"doc-explorer-list\">\n          {results.within.length +\n            results.types.length +\n            results.fields.length ===\n          0 ? (\n            <div className=\"graphiql-doc-explorer-search-empty\">\n              No results found\n            </div>\n          ) : (\n            results.within.map((result, i) => (\n              <ComboboxOption\n                key={`within-${i}`}\n                value={result}\n                data-cy=\"doc-explorer-option\"\n              >\n                <Field field={result.field} argument={result.argument} />\n              </ComboboxOption>\n            ))\n          )}\n          {results.within.length > 0 &&\n          results.types.length + results.fields.length > 0 ? (\n            <div className=\"graphiql-doc-explorer-search-divider\">\n              Other results\n            </div>\n          ) : null}\n          {results.types.map((result, i) => (\n            <ComboboxOption\n              key={`type-${i}`}\n              value={result}\n              data-cy=\"doc-explorer-option\"\n            >\n              <Type type={result.type} />\n            </ComboboxOption>\n          ))}\n          {results.fields.map((result, i) => (\n            <ComboboxOption\n              key={`field-${i}`}\n              value={result}\n              data-cy=\"doc-explorer-option\"\n            >\n              <Type type={result.type} />.\n              <Field field={result.field} argument={result.argument} />\n            </ComboboxOption>\n          ))}\n        </ComboboxOptions>\n      )}\n    </Combobox>\n  );\n};\n\ntype TypeMatch = { type: GraphQLNamedType };\n\ntype FieldMatch = {\n  type: GraphQLNamedType;\n  field: GraphQLField<unknown, unknown> | GraphQLInputField;\n  argument?: GraphQLArgument;\n};\n\nexport function useSearchResults() {\n  const explorerNavStack = useDocExplorer();\n  const schema = useGraphiQL(state => state.schema);\n\n  const navItem = explorerNavStack.at(-1)!;\n\n  return (searchValue: string) => {\n    const matches: {\n      within: FieldMatch[];\n      types: TypeMatch[];\n      fields: FieldMatch[];\n    } = {\n      within: [],\n      types: [],\n      fields: [],\n    };\n\n    if (!schema) {\n      return matches;\n    }\n\n    const withinType = navItem.def;\n\n    const typeMap = schema.getTypeMap();\n    let typeNames = Object.keys(typeMap);\n\n    // Move the within type name to be the first searched.\n    if (withinType) {\n      typeNames = typeNames.filter(n => n !== withinType.name);\n      typeNames.unshift(withinType.name);\n    }\n    for (const typeName of typeNames) {\n      if (\n        matches.within.length + matches.types.length + matches.fields.length >=\n        100\n      ) {\n        break;\n      }\n\n      const type = typeMap[typeName]!;\n      if (withinType !== type && isMatch(typeName, searchValue)) {\n        matches.types.push({ type });\n      }\n\n      if (\n        !isObjectType(type) &&\n        !isInterfaceType(type) &&\n        !isInputObjectType(type)\n      ) {\n        continue;\n      }\n\n      const fields = type.getFields();\n      for (const fieldName in fields) {\n        const field = fields[fieldName]!;\n        let matchingArgs: GraphQLArgument[] | undefined;\n\n        if (!isMatch(fieldName, searchValue)) {\n          if ('args' in field) {\n            matchingArgs = field.args.filter(arg =>\n              isMatch(arg.name, searchValue),\n            );\n            if (matchingArgs.length === 0) {\n              continue;\n            }\n          } else {\n            continue;\n          }\n        }\n\n        matches[withinType === type ? 'within' : 'fields'].push(\n          ...(matchingArgs\n            ? matchingArgs.map(argument => ({ type, field, argument }))\n            : [{ type, field }]),\n        );\n      }\n    }\n\n    return matches;\n  };\n}\n\nfunction isMatch(sourceText: string, searchValue: string): boolean {\n  try {\n    const escaped = searchValue.replaceAll(/[^_0-9A-Za-z]/g, ch => '\\\\' + ch);\n    return new RegExp(escaped, 'i').test(sourceText);\n  } catch {\n    return sourceText.toLowerCase().includes(searchValue.toLowerCase());\n  }\n}\n\nconst Type: FC<{ type: GraphQLNamedType }> = ({ type }) => {\n  return <span className=\"graphiql-doc-explorer-search-type\">{type.name}</span>;\n};\n\ntype FieldProps = {\n  field: GraphQLField<unknown, unknown> | GraphQLInputField;\n  argument?: GraphQLArgument;\n};\n\nconst Field: FC<FieldProps> = ({ field, argument }) => {\n  return (\n    <>\n      <span className=\"graphiql-doc-explorer-search-field\">{field.name}</span>\n      {argument ? (\n        <>\n          (\n          <span className=\"graphiql-doc-explorer-search-argument\">\n            {argument.name}\n          </span>\n          :{' '}\n          {renderType(argument.type, namedType => (\n            <Type type={namedType} />\n          ))}\n          )\n        </>\n      ) : null}\n    </>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/section.css",
    "content": ".graphiql-doc-explorer-section-title {\n  align-items: center;\n  display: flex;\n  font-size: var(--font-size-hint);\n  font-weight: var(--font-weight-medium);\n  line-height: 1;\n\n  & > svg {\n    height: var(--px-16);\n    margin-right: var(--px-8);\n    width: var(--px-16);\n  }\n}\n\n.graphiql-doc-explorer-section-content {\n  margin-left: var(--px-8);\n  margin-top: var(--px-16);\n\n  & > * + * {\n    margin-top: var(--px-16);\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/section.tsx",
    "content": "import type { FC, ReactNode } from 'react';\nimport {\n  ArgumentIcon,\n  DeprecatedArgumentIcon,\n  DeprecatedEnumValueIcon,\n  DeprecatedFieldIcon,\n  DirectiveIcon,\n  EnumValueIcon,\n  FieldIcon,\n  ImplementsIcon,\n  RootTypeIcon,\n  TypeIcon,\n} from '@graphiql/react';\nimport './section.css';\n\ntype ExplorerSectionProps = {\n  children: ReactNode;\n  /**\n   * The title of the section, which will also determine the icon rendered next\n   * to the headline.\n   */\n  title:\n    | 'Root Types'\n    | 'Fields'\n    | 'Deprecated Fields'\n    | 'Type'\n    | 'Arguments'\n    | 'Deprecated Arguments'\n    | 'Implements'\n    | 'Implementations'\n    | 'Possible Types'\n    | 'Enum Values'\n    | 'Deprecated Enum Values'\n    | 'Directives'\n    | 'All Schema Types';\n};\n\nexport const ExplorerSection: FC<ExplorerSectionProps> = ({\n  title,\n  children,\n}) => {\n  const Icon = TYPE_TO_ICON[title];\n  return (\n    <div>\n      <div className=\"graphiql-doc-explorer-section-title\">\n        <Icon />\n        {title}\n      </div>\n      <div className=\"graphiql-doc-explorer-section-content\">{children}</div>\n    </div>\n  );\n};\n\nconst TYPE_TO_ICON: Record<ExplorerSectionProps['title'], FC> = {\n  Arguments: ArgumentIcon,\n  'Deprecated Arguments': DeprecatedArgumentIcon,\n  'Deprecated Enum Values': DeprecatedEnumValueIcon,\n  'Deprecated Fields': DeprecatedFieldIcon,\n  Directives: DirectiveIcon,\n  'Enum Values': EnumValueIcon,\n  Fields: FieldIcon,\n  Implements: ImplementsIcon,\n  Implementations: TypeIcon,\n  'Possible Types': TypeIcon,\n  'Root Types': RootTypeIcon,\n  Type: TypeIcon,\n  'All Schema Types': TypeIcon,\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/type-documentation.css",
    "content": ".graphiql-doc-explorer-item > :not(:first-child) {\n  margin-top: var(--px-12);\n}\n\n.graphiql-doc-explorer-argument-multiple {\n  margin-left: var(--px-8);\n}\n\n.graphiql-doc-explorer-enum-value {\n  color: hsl(var(--color-info));\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/type-documentation.tsx",
    "content": "import { FC, useState } from 'react';\nimport {\n  GraphQLEnumValue,\n  GraphQLNamedType,\n  isAbstractType,\n  isEnumType,\n  isInputObjectType,\n  isInterfaceType,\n  isNamedType,\n  isObjectType,\n} from 'graphql';\nimport { useGraphiQL, Button, MarkdownContent } from '@graphiql/react';\nimport type { DocExplorerFieldDef } from '../context';\nimport { Argument } from './argument';\nimport { DefaultValue } from './default-value';\nimport { DeprecationReason } from './deprecation-reason';\nimport { FieldLink } from './field-link';\nimport { ExplorerSection } from './section';\nimport { TypeLink } from './type-link';\nimport './type-documentation.css';\n\ntype TypeDocumentationProps = {\n  /**\n   * The type that should be rendered.\n   */\n  type: GraphQLNamedType;\n};\n\nexport const TypeDocumentation: FC<TypeDocumentationProps> = ({ type }) => {\n  return isNamedType(type) ? (\n    <>\n      {type.description ? (\n        <MarkdownContent type=\"description\">{type.description}</MarkdownContent>\n      ) : null}\n      <ImplementsInterfaces type={type} />\n      <Fields type={type} />\n      <EnumValues type={type} />\n      <PossibleTypes type={type} />\n    </>\n  ) : null;\n};\n\nconst ImplementsInterfaces: FC<{ type: GraphQLNamedType }> = ({ type }) => {\n  if (!isObjectType(type)) {\n    return null;\n  }\n  const interfaces = type.getInterfaces();\n  return interfaces.length > 0 ? (\n    <ExplorerSection title=\"Implements\">\n      {type.getInterfaces().map(implementedInterface => (\n        <div key={implementedInterface.name}>\n          <TypeLink type={implementedInterface} />\n        </div>\n      ))}\n    </ExplorerSection>\n  ) : null;\n};\n\nconst Fields: FC<{ type: GraphQLNamedType }> = ({ type }) => {\n  const [showDeprecated, setShowDeprecated] = useState(false);\n  const handleShowDeprecated = () => {\n    setShowDeprecated(true);\n  };\n\n  if (\n    !isObjectType(type) &&\n    !isInterfaceType(type) &&\n    !isInputObjectType(type)\n  ) {\n    return null;\n  }\n\n  const fieldMap = type.getFields();\n\n  const fields: DocExplorerFieldDef[] = [];\n  const deprecatedFields: DocExplorerFieldDef[] = [];\n\n  // TODO: maybe can be refactored to Object.values(fieldMap) ?\n  for (const field of Object.keys(fieldMap).map(name => fieldMap[name]!)) {\n    if (field.deprecationReason) {\n      deprecatedFields.push(field);\n    } else {\n      fields.push(field);\n    }\n  }\n\n  return (\n    <>\n      {fields.length > 0 ? (\n        <ExplorerSection title=\"Fields\">\n          {fields.map(field => (\n            <Field key={field.name} field={field} />\n          ))}\n        </ExplorerSection>\n      ) : null}\n      {deprecatedFields.length > 0 ? (\n        showDeprecated || fields.length === 0 ? (\n          <ExplorerSection title=\"Deprecated Fields\">\n            {deprecatedFields.map(field => (\n              <Field key={field.name} field={field} />\n            ))}\n          </ExplorerSection>\n        ) : (\n          <Button type=\"button\" onClick={handleShowDeprecated}>\n            Show Deprecated Fields\n          </Button>\n        )\n      ) : null}\n    </>\n  );\n};\n\nconst Field: FC<{ field: DocExplorerFieldDef }> = ({ field }) => {\n  const args =\n    'args' in field ? field.args.filter(arg => !arg.deprecationReason) : [];\n  return (\n    <div className=\"graphiql-doc-explorer-item\">\n      <div>\n        <FieldLink field={field} />\n        {args.length > 0 ? (\n          <>\n            (\n            <span>\n              {args.map(arg =>\n                args.length === 1 ? (\n                  <Argument key={arg.name} arg={arg} inline />\n                ) : (\n                  <div\n                    key={arg.name}\n                    className=\"graphiql-doc-explorer-argument-multiple\"\n                  >\n                    <Argument arg={arg} inline />\n                  </div>\n                ),\n              )}\n            </span>\n            )\n          </>\n        ) : null}\n        {': '}\n        <TypeLink type={field.type} />\n        <DefaultValue field={field} />\n      </div>\n      {field.description ? (\n        <MarkdownContent type=\"description\" onlyShowFirstChild>\n          {field.description}\n        </MarkdownContent>\n      ) : null}\n      <DeprecationReason>{field.deprecationReason}</DeprecationReason>\n    </div>\n  );\n};\n\nconst EnumValues: FC<{ type: GraphQLNamedType }> = ({ type }) => {\n  const [showDeprecated, setShowDeprecated] = useState(false);\n  const handleShowDeprecated = () => {\n    setShowDeprecated(true);\n  };\n\n  if (!isEnumType(type)) {\n    return null;\n  }\n\n  const values: GraphQLEnumValue[] = [];\n  const deprecatedValues: GraphQLEnumValue[] = [];\n  for (const value of type.getValues()) {\n    if (value.deprecationReason) {\n      deprecatedValues.push(value);\n    } else {\n      values.push(value);\n    }\n  }\n\n  return (\n    <>\n      {values.length > 0 && (\n        <ExplorerSection title=\"Enum Values\">\n          {values.map(value => (\n            <EnumValue key={value.name} value={value} />\n          ))}\n        </ExplorerSection>\n      )}\n      {deprecatedValues.length > 0 &&\n        (showDeprecated || !values.length ? (\n          <ExplorerSection title=\"Deprecated Enum Values\">\n            {deprecatedValues.map(value => (\n              <EnumValue key={value.name} value={value} />\n            ))}\n          </ExplorerSection>\n        ) : (\n          <Button type=\"button\" onClick={handleShowDeprecated}>\n            Show Deprecated Values\n          </Button>\n        ))}\n    </>\n  );\n};\n\nconst EnumValue: FC<{ value: GraphQLEnumValue }> = ({ value }) => {\n  return (\n    <div className=\"graphiql-doc-explorer-item\">\n      <div className=\"graphiql-doc-explorer-enum-value\">{value.name}</div>\n      {value.description && (\n        <MarkdownContent type=\"description\">\n          {value.description}\n        </MarkdownContent>\n      )}\n      {value.deprecationReason && (\n        <MarkdownContent type=\"deprecation\">\n          {value.deprecationReason}\n        </MarkdownContent>\n      )}\n    </div>\n  );\n};\n\nconst PossibleTypes: FC<{ type: GraphQLNamedType }> = ({ type }) => {\n  const schema = useGraphiQL(state => state.schema);\n  if (!schema || !isAbstractType(type)) {\n    return null;\n  }\n  return (\n    <ExplorerSection\n      title={isInterfaceType(type) ? 'Implementations' : 'Possible Types'}\n    >\n      {schema.getPossibleTypes(type).map(possibleType => (\n        <div key={possibleType.name}>\n          <TypeLink type={possibleType} />\n        </div>\n      ))}\n    </ExplorerSection>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/type-link.css",
    "content": "a.graphiql-doc-explorer-type-name {\n  color: hsl(var(--color-warning));\n  text-decoration: none;\n\n  &:hover {\n    text-decoration: underline;\n  }\n\n  &:focus {\n    outline: hsl(var(--color-warning)) auto 1px;\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/type-link.tsx",
    "content": "import type { FC } from 'react';\nimport type { GraphQLType } from 'graphql';\nimport { useDocExplorerActions } from '../context';\nimport { renderType } from './utils';\nimport './type-link.css';\n\ntype TypeLinkProps = {\n  /**\n   * The type that should be linked to.\n   */\n  type: GraphQLType;\n};\n\nexport const TypeLink: FC<TypeLinkProps> = ({ type }) => {\n  const { push } = useDocExplorerActions();\n\n  return renderType(type, def => (\n    <a\n      className=\"graphiql-doc-explorer-type-name\"\n      onClick={event => {\n        event.preventDefault();\n        push({ name: def.name, def });\n      }}\n      href=\"#\"\n    >\n      {def.name}\n    </a>\n  ));\n};\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/components/utils.tsx",
    "content": "'use no memo';\n\nimport {\n  GraphQLNamedType,\n  GraphQLType,\n  isListType,\n  isNonNullType,\n} from 'graphql';\nimport type { JSX } from 'react';\n\nexport function renderType(\n  type: GraphQLType,\n  renderNamedType: (namedType: GraphQLNamedType) => JSX.Element,\n): JSX.Element {\n  if (isNonNullType(type)) {\n    return <>{renderType(type.ofType, renderNamedType)}!</>;\n  }\n  if (isListType(type)) {\n    return <>[{renderType(type.ofType, renderNamedType)}]</>;\n  }\n  return renderNamedType(type);\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/context.tsx",
    "content": "import type {\n  GraphQLArgument,\n  GraphQLField,\n  GraphQLInputField,\n  GraphQLNamedType,\n  GraphQLSchema,\n} from 'graphql';\nimport {\n  isEnumType,\n  isInputObjectType,\n  isInterfaceType,\n  isNamedType,\n  isObjectType,\n  isScalarType,\n  isUnionType,\n} from 'graphql';\nimport { FC, ReactElement, ReactNode, useEffect } from 'react';\nimport {\n  SchemaReference,\n  useGraphiQL,\n  pick,\n  createBoundedUseStore,\n  GraphiQLPlugin,\n  DocsFilledIcon,\n  DocsIcon,\n  isMacOs,\n} from '@graphiql/react';\nimport { createStore } from 'zustand';\nimport { getSchemaReference } from './schema-reference';\nimport { DocExplorer } from './components';\n\nexport const DOC_EXPLORER_PLUGIN: GraphiQLPlugin = {\n  title: 'Documentation Explorer',\n  icon: function Icon() {\n    const visiblePlugin = useGraphiQL(state => state.visiblePlugin);\n    return visiblePlugin === DOC_EXPLORER_PLUGIN ? (\n      <DocsFilledIcon />\n    ) : (\n      <DocsIcon />\n    );\n  },\n  content: DocExplorer,\n};\n\nexport type DocExplorerFieldDef =\n  | GraphQLField<unknown, unknown>\n  | GraphQLInputField\n  | GraphQLArgument;\n\nexport type DocExplorerNavStackItem = {\n  /**\n   * The name of the item.\n   */\n  name: string;\n  /**\n   * The definition object of the item, this can be a named type, a field, an\n   * input field or an argument.\n   */\n  def?: GraphQLNamedType | DocExplorerFieldDef;\n};\n\n// There's always at least one item in the nav stack\nexport type DocExplorerNavStack = [\n  DocExplorerNavStackItem,\n  ...DocExplorerNavStackItem[],\n];\n\nexport type DocExplorerStoreType = {\n  /**\n   * A stack of navigation items. The last item in the list is the current one.\n   * This list always contains at least one item.\n   */\n  explorerNavStack: DocExplorerNavStack;\n  actions: {\n    /**\n     * Push an item to the navigation stack.\n     * @param item The item that should be pushed to the stack.\n     */\n    push(item: DocExplorerNavStackItem): void;\n    /**\n     * Pop the last item from the navigation stack.\n     */\n    pop(): void;\n    /**\n     * Reset the navigation stack to its initial state, this will remove all but\n     * the initial stack item.\n     */\n    reset(): void;\n    resolveSchemaReferenceToNavItem(\n      schemaReference: SchemaReference | null,\n    ): void;\n    /**\n     * Replace the nav stack with an updated version using the new schema.\n     */\n    rebuildNavStackWithSchema(schema: GraphQLSchema): void;\n  };\n};\n\nconst INITIAL_NAV_STACK: DocExplorerNavStack = [{ name: 'Docs' }];\n\nexport const docExplorerStore = createStore<DocExplorerStoreType>(\n  (set, get) => ({\n    explorerNavStack: INITIAL_NAV_STACK,\n    actions: {\n      push(item) {\n        set(state => {\n          const curr = state.explorerNavStack;\n          const lastItem = curr.at(-1)!;\n          const explorerNavStack: DocExplorerNavStack =\n            // Avoid pushing duplicate items\n            lastItem.def === item.def ? curr : [...curr, item];\n\n          return { explorerNavStack };\n        });\n      },\n      pop() {\n        set(state => {\n          const curr = state.explorerNavStack;\n\n          const explorerNavStack =\n            curr.length > 1 ? (curr.slice(0, -1) as DocExplorerNavStack) : curr;\n\n          return { explorerNavStack };\n        });\n      },\n      reset() {\n        set(state => {\n          const curr = state.explorerNavStack;\n          const explorerNavStack = curr.length === 1 ? curr : INITIAL_NAV_STACK;\n          return { explorerNavStack };\n        });\n      },\n      resolveSchemaReferenceToNavItem(schemaReference) {\n        if (!schemaReference) {\n          return;\n        }\n        const { kind, typeInfo } = schemaReference;\n        const ref = getSchemaReference(kind, typeInfo);\n        if (!ref) {\n          return;\n        }\n\n        const { push } = get().actions;\n        switch (ref.kind) {\n          case 'Type': {\n            push({\n              name: ref.type.name,\n              def: ref.type,\n            });\n            break;\n          }\n          case 'Field': {\n            // Show a field type on stack\n            if (ref.type) {\n              push({\n                name: ref.type.name,\n                def: ref.type,\n              });\n            }\n            push({\n              name: ref.field.name,\n              def: ref.field,\n            });\n            break;\n          }\n          case 'Argument': {\n            if (ref.field) {\n              push({\n                name: ref.field.name,\n                def: ref.field,\n              });\n            }\n            break;\n          }\n          case 'EnumValue': {\n            if (ref.type) {\n              push({\n                name: ref.type.name,\n                def: ref.type,\n              });\n            }\n            break;\n          }\n        }\n      },\n      rebuildNavStackWithSchema(schema: GraphQLSchema) {\n        set(state => {\n          const oldNavStack = state.explorerNavStack;\n          if (oldNavStack.length === 1) {\n            return state;\n          }\n          // Spread is needed\n          const newNavStack: DocExplorerNavStack = [...INITIAL_NAV_STACK];\n          let lastEntity:\n            | GraphQLNamedType\n            | GraphQLField<unknown, unknown>\n            | null = null;\n          for (const item of oldNavStack) {\n            if (item === INITIAL_NAV_STACK[0]) {\n              // No need to copy the initial item\n              continue;\n            }\n            if (item.def) {\n              // If item.def isn't a named type, it must be a field, inputField, or argument\n              if (isNamedType(item.def)) {\n                // The type needs to be replaced with the new schema type of the same name\n                const newType = schema.getType(item.def.name);\n                if (newType) {\n                  newNavStack.push({\n                    name: item.name,\n                    def: newType,\n                  });\n                  lastEntity = newType;\n                } else {\n                  // This type no longer exists; the stack cannot be built beyond here\n                  break;\n                }\n              } else if (lastEntity === null) {\n                // We can't have a sub-entity if we have no entity; stop rebuilding the nav stack\n                break;\n              } else if (\n                isObjectType(lastEntity) ||\n                isInputObjectType(lastEntity)\n              ) {\n                // item.def must be a Field / input field; replace with the new field of the same name\n                const field = lastEntity.getFields()[item.name];\n                if (field) {\n                  newNavStack.push({\n                    name: item.name,\n                    def: field,\n                  });\n                } else {\n                  // This field no longer exists; the stack cannot be built beyond here\n                  break;\n                }\n              } else if (\n                isScalarType(lastEntity) ||\n                isEnumType(lastEntity) ||\n                isInterfaceType(lastEntity) ||\n                isUnionType(lastEntity)\n              ) {\n                // These don't (currently) have non-type sub-entries; something has gone wrong.\n                // Handle gracefully by discontinuing rebuilding the stack.\n                break;\n              } else {\n                // lastEntity must be a field (because it's not a named type)\n                const field: GraphQLField<unknown, unknown> = lastEntity;\n                // Thus item.def must be an argument, so find the same named argument in the new schema\n                if (field.args.some(a => a.name === item.name)) {\n                  newNavStack.push({\n                    name: item.name,\n                    def: field,\n                  });\n                } else {\n                  // This argument no longer exists; the stack cannot be built beyond here\n                  break;\n                }\n              }\n            } else {\n              lastEntity = null;\n              newNavStack.push(item);\n            }\n          }\n          return { explorerNavStack: newNavStack };\n        });\n      },\n    },\n  }),\n);\n\nexport const DocExplorerStore: FC<{\n  children: ReactNode;\n}> = ({ children }) => {\n  const { schema, validationErrors, schemaReference } = useGraphiQL(\n    pick('schema', 'validationErrors', 'schemaReference'),\n  );\n\n  useEffect(() => {\n    const { resolveSchemaReferenceToNavItem } =\n      docExplorerStore.getState().actions;\n    resolveSchemaReferenceToNavItem(schemaReference);\n  }, [schemaReference]);\n\n  useEffect(() => {\n    const { reset, rebuildNavStackWithSchema } =\n      docExplorerStore.getState().actions;\n\n    // Whenever the schema changes, we must revalidate/replace the nav stack.\n    if (schema == null || validationErrors.length > 0) {\n      reset();\n    } else {\n      rebuildNavStackWithSchema(schema);\n    }\n  }, [schema, validationErrors]);\n\n  useEffect(() => {\n    function handleKeyDown(event: KeyboardEvent) {\n      const shouldFocusInput =\n        // Use an additional `Alt` key instead of `Cmd/Ctrl+K` because monaco-editor has a built-in\n        // shortcut for `Cmd/Ctrl+K`\n        event.altKey &&\n        event[isMacOs ? 'metaKey' : 'ctrlKey'] &&\n        // Using `event.code` because `event.key` will trigger different character\n        // in English `˚` and in French `È`\n        event.code === 'KeyK';\n      if (!shouldFocusInput) {\n        return;\n      }\n      const button = document.querySelector<HTMLButtonElement>(\n        '.graphiql-sidebar button[aria-label=\"Show Documentation Explorer\"]',\n      );\n      button?.click();\n      // Execute on next tick when doc explorer is opened and input exists in DOM\n      requestAnimationFrame(() => {\n        const el = document.querySelector<HTMLDivElement>(\n          '.graphiql-doc-explorer-search-input',\n        );\n        el?.click();\n      });\n    }\n\n    window.addEventListener('keydown', handleKeyDown);\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown);\n    };\n  }, []);\n\n  return children as ReactElement;\n};\n\nconst useDocExplorerStore = createBoundedUseStore(docExplorerStore);\n\nexport const useDocExplorer = () =>\n  useDocExplorerStore(state => state.explorerNavStack);\n\n/**\n * Actions are functions used to update values in your store. They are static and never change.\n * @see https://tkdodo.eu/blog/working-with-zustand#separate-actions-from-state\n */\nexport const useDocExplorerActions = () =>\n  useDocExplorerStore(state => state.actions);\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/deprecated.ts",
    "content": "import { useDocExplorer, useDocExplorerActions } from './context';\n\n/**\n * @deprecated Use `useDocExplorerActions` and `useDocExplorer` hooks instead.\n */\nexport function useExplorerContext() {\n  const actions = useDocExplorerActions();\n  const explorerNavStack = useDocExplorer();\n  return {\n    ...actions,\n    explorerNavStack,\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/index.ts",
    "content": "export * from './components';\n\nexport {\n  DocExplorerStore,\n  useDocExplorer,\n  useDocExplorerActions,\n  DOC_EXPLORER_PLUGIN,\n} from './context';\n\nexport type {\n  DocExplorerFieldDef,\n  DocExplorerNavStack,\n  DocExplorerNavStackItem,\n} from './context';\nexport * from './deprecated';\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/src/schema-reference.ts",
    "content": "import { getNamedType } from 'graphql';\nimport type {\n  GraphQLEnumType,\n  GraphQLNamedType,\n  GraphQLField,\n  GraphQLArgument,\n  GraphQLDirective,\n  GraphQLSchema,\n  GraphQLEnumValue,\n  GraphQLInputFieldMap,\n  GraphQLInputType,\n  GraphQLType,\n} from 'graphql';\nimport type { Maybe } from 'graphql/jsutils/Maybe';\n\n/**\n * Copied from packages/codemirror-graphql/src/jump.ts\n */\nexport function getSchemaReference(kind: string, typeInfo: any) {\n  if (\n    (kind === 'Field' && typeInfo.fieldDef) ||\n    (kind === 'AliasedField' && typeInfo.fieldDef)\n  ) {\n    return getFieldReference(typeInfo);\n  }\n  if (kind === 'Directive' && typeInfo.directiveDef) {\n    return getDirectiveReference(typeInfo);\n  }\n  if (kind === 'Argument' && typeInfo.argDef) {\n    return getArgumentReference(typeInfo);\n  }\n  if (kind === 'EnumValue' && typeInfo.enumValue) {\n    return getEnumValueReference(typeInfo);\n  }\n  if (kind === 'NamedType' && typeInfo.type) {\n    return getTypeReference(typeInfo);\n  }\n}\n\nfunction getArgumentReference(typeInfo: any): ArgumentReference {\n  return typeInfo.directiveDef\n    ? {\n        kind: 'Argument',\n        schema: typeInfo.schema,\n        argument: typeInfo.argDef,\n        directive: typeInfo.directiveDef,\n      }\n    : {\n        kind: 'Argument',\n        schema: typeInfo.schema,\n        argument: typeInfo.argDef,\n        field: typeInfo.fieldDef,\n        type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType,\n      };\n}\n\nfunction getDirectiveReference(typeInfo: any): DirectiveReference {\n  return {\n    kind: 'Directive',\n    schema: typeInfo.schema,\n    directive: typeInfo.directiveDef,\n  };\n}\n\nfunction getFieldReference(typeInfo: any): FieldReference {\n  return {\n    kind: 'Field',\n    schema: typeInfo.schema,\n    field: typeInfo.fieldDef,\n    type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType,\n  };\n}\n\n// Note: for reusability, getTypeReference can produce a reference to any type,\n// though it defaults to the current type.\nfunction getTypeReference(\n  typeInfo: any,\n  type?: Maybe<GraphQLNamedType>,\n): TypeReference {\n  return {\n    kind: 'Type',\n    schema: typeInfo.schema,\n    type: type || typeInfo.type,\n  };\n}\n\nfunction getEnumValueReference(typeInfo: TypeInfo): EnumValueReference {\n  return {\n    kind: 'EnumValue',\n    value: typeInfo.enumValue || undefined,\n    type: typeInfo.inputType\n      ? (getNamedType(typeInfo.inputType) as GraphQLEnumType)\n      : undefined,\n  };\n}\n\nfunction isMetaField(fieldDef: GraphQLField<unknown, unknown>) {\n  return fieldDef.name.slice(0, 2) === '__';\n}\n\ntype ArgumentReference = {\n  kind: 'Argument';\n  argument: GraphQLArgument;\n  field?: GraphQLField<unknown, unknown>;\n  type?: GraphQLNamedType;\n  directive?: GraphQLDirective;\n  schema?: GraphQLSchema;\n};\n\ntype DirectiveReference = {\n  kind: 'Directive';\n  directive: GraphQLDirective;\n  schema?: GraphQLSchema;\n};\n\ntype EnumValueReference = {\n  kind: 'EnumValue';\n  value?: GraphQLEnumValue;\n  type?: GraphQLEnumType;\n  schema?: GraphQLSchema;\n};\n\ntype FieldReference = {\n  kind: 'Field';\n  field: GraphQLField<unknown, unknown>;\n  type: Maybe<GraphQLNamedType>;\n  schema?: GraphQLSchema;\n};\n\ntype TypeReference = {\n  kind: 'Type';\n  type: GraphQLNamedType;\n  schema?: GraphQLSchema;\n};\n\ninterface TypeInfo {\n  schema: GraphQLSchema;\n  type?: Maybe<GraphQLType>;\n  parentType?: Maybe<GraphQLType>;\n  inputType?: Maybe<GraphQLInputType>;\n  directiveDef?: Maybe<GraphQLDirective>;\n  fieldDef?: Maybe<GraphQLField<unknown, unknown>>;\n  argDef?: Maybe<GraphQLArgument>;\n  argDefs?: Maybe<GraphQLArgument[]>;\n  enumValue?: Maybe<GraphQLEnumValue>;\n  objectFieldDefs?: Maybe<GraphQLInputFieldMap>;\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/tsconfig.json",
    "content": "{\n  \"extends\": \"../graphiql-react/tsconfig.json\"\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/vite.config.mts",
    "content": "import { defineConfig, PluginOption } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport type { PluginOptions as ReactCompilerConfig } from 'babel-plugin-react-compiler';\nimport packageJSON from './package.json' assert { type: 'json' };\nimport dts from 'vite-plugin-dts';\nimport { reactCompilerConfig as $reactCompilerConfig } from '../graphiql-react/vite.config.mjs';\n\nexport const reactCompilerConfig: Partial<ReactCompilerConfig> = {\n  ...$reactCompilerConfig,\n  sources(filename) {\n    if (filename.includes('__tests__')) {\n      return false;\n    }\n    return filename.includes('/graphiql-plugin-doc-explorer/src/');\n  },\n};\n\nexport const plugins: PluginOption[] = [\n  react({\n    babel: {\n      plugins: [['babel-plugin-react-compiler', reactCompilerConfig]],\n    },\n  }),\n  dts({\n    include: ['src/**'],\n    exclude: ['**/*.spec.{ts,tsx}', '**/__tests__/'],\n  }),\n];\n\nexport default defineConfig({\n  plugins,\n  css: {\n    transformer: 'lightningcss',\n  },\n  build: {\n    minify: false,\n    sourcemap: true,\n    lib: {\n      entry: 'src/index.ts',\n      fileName(_format, entryName) {\n        const filePath = entryName.replace(/\\.svg$/, '');\n        return `${filePath}.js`;\n      },\n      formats: ['es'],\n      cssFileName: 'style',\n    },\n    rollupOptions: {\n      external: [\n        'react/jsx-runtime',\n        // Exclude peer dependencies and dependencies from bundle\n        ...Object.keys(packageJSON.peerDependencies),\n        ...Object.keys(packageJSON.dependencies),\n      ],\n      output: {\n        preserveModules: true,\n      },\n    },\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-doc-explorer/vitest.config.mts",
    "content": "import path from 'node:path';\nimport { defineConfig } from 'vitest/config';\nimport { plugins } from './vite.config.mjs';\n\nexport default defineConfig({\n  plugins,\n  test: {\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: ['./setup-files.ts'],\n    alias: [\n      {\n        // Fixes Error: Failed to resolve entry for package \"monaco-editor\". The package may have incorrect main/module/exports specified in its package.json.\n        find: /^monaco-editor$/,\n        replacement: path.resolve(\n          '../../node_modules/monaco-editor/esm/vs/editor/editor.api',\n        ),\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/CHANGELOG.md",
    "content": "# @graphiql/plugin-explorer\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf), [`293beed`](https://github.com/graphql/graphiql/commit/293beed772baa2be834cad5f19e1aee0628e15cc)]:\n  - @graphiql/react@0.37.0\n\n## 5.1.0\n\n### Minor Changes\n\n- [#4077](https://github.com/graphql/graphiql/pull/4077) [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add new example [Usage GraphiQL 5 with Vite, React Router and `ssr: true`](https://github.com/graphql/graphiql/tree/main/examples/example-graphiql-vite-react-router)\n\n### Patch Changes\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd), [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198), [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14), [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b)]:\n  - @graphiql/react@0.36.0\n\n## 5.0.0\n\n### Major Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n- [#4002](https://github.com/graphql/graphiql/pull/4002) [`2d9faec`](https://github.com/graphql/graphiql/commit/2d9faec57830b38aa175929c47a55c959c327535) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove UMD builds\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n## 5.0.0-rc.3\n\n### Major Changes\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n## 5.0.0-rc.2\n\n### Major Changes\n\n- [#4002](https://github.com/graphql/graphiql/pull/4002) [`2d9faec`](https://github.com/graphql/graphiql/commit/2d9faec57830b38aa175929c47a55c959c327535) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove UMD builds\n\n## 5.0.0-rc.1\n\n### Major Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n## 4.0.7-rc.0\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- Updated dependencies [[`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/react@0.35.0-rc.0\n\n## 4.0.6\n\n### Patch Changes\n\n- [#3970](https://github.com/graphql/graphiql/pull/3970) [`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - revert https://github.com/graphql/graphiql/pull/3946 to have support multiple embedded graphiql instances on the same page\n\n## 4.0.5\n\n### Patch Changes\n\n- [#3946](https://github.com/graphql/graphiql/pull/3946) [`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand:\n  - replace `useExecutionContext` with `useExecutionStore` hook\n  - replace `useEditorContext` with `useEditorStore` hook\n  - replace `useAutoCompleteLeafs` hook with `getAutoCompleteLeafs` function\n- Updated dependencies [[`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af), [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781)]:\n  - @graphiql/react@0.34.0\n\n## 4.0.4\n\n### Patch Changes\n\n- [#3945](https://github.com/graphql/graphiql/pull/3945) [`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `usePluginContext` with `usePluginStore` hook\n\n- [#3947](https://github.com/graphql/graphiql/pull/3947) [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - refactor `useStorage`, `useDocExplorer` and `useHistory` hooks\n\n- [#3943](https://github.com/graphql/graphiql/pull/3943) [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useSchemaContext` with `useSchemaStore` hook\n\n- Updated dependencies [[`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71), [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0), [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e), [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921)]:\n  - @graphiql/react@0.33.0\n\n## 4.0.3\n\n### Patch Changes\n\n- [#3939](https://github.com/graphql/graphiql/pull/3939) [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `React.FC` type when declaring React components\n\n## 4.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67)]:\n  - @graphiql/react@0.32.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#3915](https://github.com/graphql/graphiql/pull/3915) [`bc31cd9`](https://github.com/graphql/graphiql/commit/bc31cd99a92693238e7359456e3cc22ed0387df0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix unpkg.com results to `Not found` when `main` field isn't specified in `package.json`\n\n- Updated dependencies [[`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6)]:\n  - @graphiql/react@0.31.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - drop commonjs build files\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - support react 19, drop support react 16 and react 17\n\n  - replace deprecated `ReactDOM.unmountComponentAtNode()` and `ReactDOM.render()` with `root.unmount()` and `createRoot(container).render()`\n  - update `@radix-ui` and `@headlessui/react` dependencies\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - `style.css` import was changed\n\n  ## Migration\n\n  ```diff\n  -import '@graphiql/plugin-explorer/dist/style.css';\n  +import '@graphiql/plugin-explorer/style.css';\n  ```\n\n### Minor Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Update GraphiQL CDN example using ESM-based CDN esm.sh\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - generate types with `vite-plugin-dts`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update `vite` and related dependencies\n\n### Patch Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - improve explorer styles\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix types incorrect types entry\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `vite build --watch` instead of `vite` for `dev` script because we don't need development server for them\n\n  do not use `vite-plugin-dts` when generating umd build\n\n- Updated dependencies [[`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602), [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602)]:\n  - @graphiql/react@0.30.0\n\n## 4.0.0-alpha.2\n\n### Patch Changes\n\n- [#3740](https://github.com/graphql/graphiql/pull/3740) [`3c12ce0`](https://github.com/graphql/graphiql/commit/3c12ce01eb3b2ec9a317a2fea2bb92602b748a8b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix types incorrect types entry\n\n## 4.0.0-alpha.1\n\n### Patch Changes\n\n- [#3738](https://github.com/graphql/graphiql/pull/3738) [`eaa415c`](https://github.com/graphql/graphiql/commit/eaa415cce5c3baecea76068c02953884eec5ba2e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - improve explorer styles\n\n## 4.0.0-alpha.0\n\n### Major Changes\n\n- [#3709](https://github.com/graphql/graphiql/pull/3709) [`9baf1f0`](https://github.com/graphql/graphiql/commit/9baf1f0fc9f32404fbb8bf57b3d1c2c2c8778ddb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - `style.css` import was changed\n\n  ## Migration\n\n  ```diff\n  -import '@graphiql/plugin-explorer/dist/style.css';\n  +import '@graphiql/plugin-explorer/style.css';\n  ```\n\n### Minor Changes\n\n- [#3702](https://github.com/graphql/graphiql/pull/3702) [`00415d2`](https://github.com/graphql/graphiql/commit/00415d2940c4d76a4a9e683e9fa0504ba97dd627) Thanks [@dimaMachina](https://github.com/dimaMachina)! - generate types with `vite-plugin-dts`\n\n### Patch Changes\n\n- [#3705](https://github.com/graphql/graphiql/pull/3705) [`8ff87d7`](https://github.com/graphql/graphiql/commit/8ff87d7b6b3d5d12b539612a39ca3abf7e631106) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `vite build --watch` instead of `vite` for `dev` script because we don't need development server for them\n\n  do not use `vite-plugin-dts` when generating umd build\n\n- Updated dependencies [[`00415d2`](https://github.com/graphql/graphiql/commit/00415d2940c4d76a4a9e683e9fa0504ba97dd627), [`9baf1f0`](https://github.com/graphql/graphiql/commit/9baf1f0fc9f32404fbb8bf57b3d1c2c2c8778ddb), [`8ff87d7`](https://github.com/graphql/graphiql/commit/8ff87d7b6b3d5d12b539612a39ca3abf7e631106), [`82bc961`](https://github.com/graphql/graphiql/commit/82bc961a33c4e9da29dffb4a603035a4909f49ad), [`3c1a345`](https://github.com/graphql/graphiql/commit/3c1a345acd9bf07b45bc230009cb57c51c425673)]:\n  - @graphiql/react@1.0.0-alpha.0\n\n## 3.2.6\n\n### Patch Changes\n\n- Updated dependencies [[`cb29e9f`](https://github.com/graphql/graphiql/commit/cb29e9fbe1362778bc327513fc884c4ec419775e), [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - @graphiql/react@0.29.0\n\n## 3.2.5\n\n### Patch Changes\n\n- [#3837](https://github.com/graphql/graphiql/pull/3837) [`5e76a4f`](https://github.com/graphql/graphiql/commit/5e76a4f3c8b089a1de0c92c9b9c1edc2ae3f49d4) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix query builder updated only first selected field in query editor due recent enabled react-compiler\n\n## 3.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`3633d61`](https://github.com/graphql/graphiql/commit/3633d61c3c597adf60c0ec1bbf98cf6a1f49beed)]:\n  - @graphiql/react@0.28.0\n\n## 3.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`f86e2bc`](https://github.com/graphql/graphiql/commit/f86e2bce40826b3d07755f91b37a72051de00f9c)]:\n  - @graphiql/react@0.27.0\n\n## 3.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`959ed21`](https://github.com/graphql/graphiql/commit/959ed21815682fc439f64d78e23e603a8f313a6f), [`9aef83a`](https://github.com/graphql/graphiql/commit/9aef83a32aeb5f193a3ff0f191c95d09eb0d70b6)]:\n  - @graphiql/react@0.26.0\n\n## 3.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`7404e8e`](https://github.com/graphql/graphiql/commit/7404e8e6c62b06107f452142493297ec70f1649c)]:\n  - @graphiql/react@0.25.0\n\n## 3.2.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - @graphiql/react@0.24.0\n\n## 3.1.1\n\n### Patch Changes\n\n- [#3657](https://github.com/graphql/graphiql/pull/3657) [`5bc7b84`](https://github.com/graphql/graphiql/commit/5bc7b84531b6404553787615d61a5cbcc96c1d6f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update vite to v5\n\n- [#3656](https://github.com/graphql/graphiql/pull/3656) [`93c7e9f`](https://github.com/graphql/graphiql/commit/93c7e9fd224cb4f1e9a86b3391efc1e0ef6e1e3f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set `build.minify: false` for cjs/esm builds since minified variable names change every build time\n\n- Updated dependencies [[`5bc7b84`](https://github.com/graphql/graphiql/commit/5bc7b84531b6404553787615d61a5cbcc96c1d6f), [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d), [`93c7e9f`](https://github.com/graphql/graphiql/commit/93c7e9fd224cb4f1e9a86b3391efc1e0ef6e1e3f)]:\n  - @graphiql/react@0.23.0\n\n## 3.1.0\n\n### Minor Changes\n\n- [#3633](https://github.com/graphql/graphiql/pull/3633) [`8849a15b`](https://github.com/graphql/graphiql/commit/8849a15b6e80fe1b34e8250e74a56b85ccdb6ac6) Thanks [@dimaMachina](https://github.com/dimaMachina)! - adjust `@graphiql/plugin-explorer` styles\n\n### Patch Changes\n\n- Updated dependencies [[`adf0ba01`](https://github.com/graphql/graphiql/commit/adf0ba019902dcac2e49ccee69b79a6665c4766d)]:\n  - @graphiql/react@0.22.4\n\n## 3.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`335d830c`](https://github.com/graphql/graphiql/commit/335d830c2a4e551ef97fbeff8ed7c538ff5cd4af)]:\n  - @graphiql/react@0.22.3\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`03ab3a6b`](https://github.com/graphql/graphiql/commit/03ab3a6b76378591ef79a828d80cc69b0b8f2842)]:\n  - @graphiql/react@0.22.2\n\n## 3.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`224b43f5`](https://github.com/graphql/graphiql/commit/224b43f5473456f264a82998d48a34a441537f54)]:\n  - @graphiql/react@0.22.1\n\n## 3.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`d48f4ef5`](https://github.com/graphql/graphiql/commit/d48f4ef56578dad7ec90f33458353791e463ef7b)]:\n  - @graphiql/react@0.22.0\n\n## 2.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`5d051054`](https://github.com/graphql/graphiql/commit/5d05105469c3f0cbeb5e294da1cf6ff2355e4eb5)]:\n  - @graphiql/react@0.21.0\n\n## 1.0.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.20.4\n\n## 1.0.3\n\n### Patch Changes\n\n- [#3526](https://github.com/graphql/graphiql/pull/3526) [`2b6ea316`](https://github.com/graphql/graphiql/commit/2b6ea3166c8d8e152f16d87c878aa8a66f1b3775) Thanks [@benjie](https://github.com/benjie)! - Fix bug whereby typing quickly into explorer sidebar would result in characters being dropped.\n\n- Updated dependencies [[`2b6ea316`](https://github.com/graphql/graphiql/commit/2b6ea3166c8d8e152f16d87c878aa8a66f1b3775)]:\n  - @graphiql/react@0.20.3\n\n## 1.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`e89c432d`](https://github.com/graphql/graphiql/commit/e89c432d8d2b91f087b683360f23e0686462bc02)]:\n  - @graphiql/react@0.20.2\n\n## 1.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`39bf31d1`](https://github.com/graphql/graphiql/commit/39bf31d15b1e7fb5f235ec9adc1ce8081536de4a)]:\n  - @graphiql/react@0.20.1\n\n## 1.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`f6afd22d`](https://github.com/graphql/graphiql/commit/f6afd22d3f5a20089759042f16fd865646a32038)]:\n  - @graphiql/react@0.20.0\n\n## 0.3.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.19.4\n\n## 0.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`2348641c`](https://github.com/graphql/graphiql/commit/2348641c07748691c478ac5f67032b7e9081f9cb)]:\n  - @graphiql/react@0.19.3\n\n## 0.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`d67c13f6`](https://github.com/graphql/graphiql/commit/d67c13f6e1f478b171801afd0767b98312db04c9)]:\n  - @graphiql/react@0.19.2\n\n## 0.3.2\n\n### Patch Changes\n\n- [#3341](https://github.com/graphql/graphiql/pull/3341) [`e4a36207`](https://github.com/graphql/graphiql/commit/e4a362071edf1db53f87f271c523ab2f3a5c4717) Thanks [@acao](https://github.com/acao)! - Fix code exporter plugin on early init, add hooks\n\n- Updated dependencies [[`17069e7a`](https://github.com/graphql/graphiql/commit/17069e7a0224dbce3f5523630a898e093f5c47c9), [`e4a36207`](https://github.com/graphql/graphiql/commit/e4a362071edf1db53f87f271c523ab2f3a5c4717)]:\n  - @graphiql/react@0.19.1\n\n## 0.3.1\n\n### Patch Changes\n\n- [#3350](https://github.com/graphql/graphiql/pull/3350) [`119775ed`](https://github.com/graphql/graphiql/commit/119775ed191ce075532a6e85cbfeac2364c0ba40) Thanks [@acao](https://github.com/acao)! - handle null editor in explorer plugin [(PR)](https://github.com/graphql/graphiql/pull/3340)\n\n## 0.3.0\n\n### Minor Changes\n\n- [#3330](https://github.com/graphql/graphiql/pull/3330) [`bed5fc86`](https://github.com/graphql/graphiql/commit/bed5fc86173eb0e770f966fa529ee035b97a1349) Thanks [@acao](https://github.com/acao)! - **BREAKING CHANGE**: fix lifecycle issue in plugin-explorer, change implementation pattern\n\n  `value` and `setValue` is no longer an implementation detail, and are handled internally by plugins. the plugin signature has changed slightly as well.\n\n  now, instead of something like this:\n\n  ```jsx\n  import { useExplorerPlugin } from '@graphiql/plugin-explorer';\n  import { snippets } from './snippets';\n  import { useExporterPlugin } from '@graphiql/plugin-code-exporter';\n\n  const App = () => {\n    const [query, setQuery] = React.useState('');\n    const explorerPlugin = useExplorerPlugin({\n      query,\n      onEdit: setQuery,\n    });\n    const codeExporterPlugin = useExporterPlugin({\n      query,\n      snippets,\n    });\n\n    const plugins = React.useMemo(\n      () => [explorerPlugin, codeExporterPlugin],\n      [explorerPlugin, codeExporterPlugin],\n    );\n\n    return (\n      <GraphiQL\n        query={query}\n        onEditQuery={setQuery}\n        plugins={plugins}\n        fetcher={fetcher}\n      />\n    );\n  };\n  ```\n\n  you can just do this:\n\n  ```jsx\n  import { explorerPlugin } from '@graphiql/plugin-explorer';\n  import { snippets } from './snippets';\n  import { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\n  import { createGraphiQLFetcher } from '@graphiql/toolkit';\n\n  // only invoke these inside the component lifecycle\n  // if there are dynamic values, and then use useMemo() (see below)\n  const explorer = explorerPlugin();\n  const exporter = codeExporterPlugin({ snippets });\n\n  const fetcher = createGraphiQLFetcher({ url: '/graphql' });\n\n  const App = () => {\n    return <GraphiQL plugins={[explorer, exporter]} fetcher={fetcher} />;\n  };\n  ```\n\n  or this, for more complex state-driven needs:\n\n  ```jsx\n  import { useMemo } from 'react';\n  import { explorerPlugin } from '@graphiql/plugin-explorer';\n  import { snippets } from './snippets';\n  import { codeExporterPlugin } from '@graphiql/plugin-code-exporter';\n\n  const explorer = explorerPlugin();\n  const fetcher = createGraphiQLFetcher({ url: '/graphql' });\n\n  const App = () => {\n    const { snippets } = useMyUserSuppliedState();\n    const exporter = useMemo(\n      () => codeExporterPlugin({ snippets }),\n      [snippets],\n    );\n\n    return <GraphiQL plugins={[explorer, exporter]} fetcher={fetcher} />;\n  };\n  ```\n\n## 0.2.0\n\n### Minor Changes\n\n- [#3293](https://github.com/graphql/graphiql/pull/3293) [`1b8f3fe9`](https://github.com/graphql/graphiql/commit/1b8f3fe9c41697855378ec13a76f1a908fda778a) Thanks [@B2o5T](https://github.com/B2o5T)! - BREAKING CHANGE: umd build was renamed to `index.umd.js`\n\n### Patch Changes\n\n- [#3319](https://github.com/graphql/graphiql/pull/3319) [`2f51b1a5`](https://github.com/graphql/graphiql/commit/2f51b1a5f25ac515af89b708c009796c57a611fb) Thanks [@LekoArts](https://github.com/LekoArts)! - Use named `Explorer` import from `graphiql-explorer` to fix an issue where the bundler didn't correctly choose either the `default` or `Explorer` import. This change should ensure that `@graphiql/plugin-explorer` works correctly without `graphiql-explorer` being bundled.\n\n## 0.1.22\n\n### Patch Changes\n\n- [#3292](https://github.com/graphql/graphiql/pull/3292) [`f86e4172`](https://github.com/graphql/graphiql/commit/f86e41721d4d990535253b579c810bc5e291b40b) Thanks [@B2o5T](https://github.com/B2o5T)! - fix umd build names `graphiql-plugin-code-exporter.umd.js` and `graphiql-plugin-explorer.umd.js`\n\n## 0.1.21\n\n### Patch Changes\n\n- [#3229](https://github.com/graphql/graphiql/pull/3229) [`0a65e720`](https://github.com/graphql/graphiql/commit/0a65e7207b6bc4174896f6acca8a40f45d2fb1b8) Thanks [@B2o5T](https://github.com/B2o5T)! - exclude peer dependencies and dependencies from bundle\n\n- [#3251](https://github.com/graphql/graphiql/pull/3251) [`f8d8509b`](https://github.com/graphql/graphiql/commit/f8d8509b432803eaeb2e53b6b6d4321535e11c1d) Thanks [@B2o5T](https://github.com/B2o5T)! - always bundle `package.json#dependencies` for UMD build for `@graphiql/plugin-code-exporter` and `@graphiql/plugin-explorer`\n\n- [#3236](https://github.com/graphql/graphiql/pull/3236) [`64da8c30`](https://github.com/graphql/graphiql/commit/64da8c3074628bb411eb1c28aa4738843f60910c) Thanks [@B2o5T](https://github.com/B2o5T)! - update vite\n\n- [#3252](https://github.com/graphql/graphiql/pull/3252) [`c915a4ee`](https://github.com/graphql/graphiql/commit/c915a4eead4ae39cb5c9fa615b5b55945da06c01) Thanks [@B2o5T](https://github.com/B2o5T)! - `@graphiql/react` should be in `peerDependencies` not in `dependencies`\n\n- Updated dependencies [[`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`bc9d243d`](https://github.com/graphql/graphiql/commit/bc9d243d40b95f95fc9d00d25aa0dd1733952626), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`67bf93a3`](https://github.com/graphql/graphiql/commit/67bf93a33e98c60ae3a686063a1c47037f88ef49)]:\n  - @graphiql/react@0.18.0\n\n## 0.1.21-alpha.1\n\n### Patch Changes\n\n- [#3229](https://github.com/graphql/graphiql/pull/3229) [`0a65e720`](https://github.com/graphql/graphiql/commit/0a65e7207b6bc4174896f6acca8a40f45d2fb1b8) Thanks [@B2o5T](https://github.com/B2o5T)! - exclude peer dependencies and dependencies from bundle\n\n- Updated dependencies [[`bc9d243d`](https://github.com/graphql/graphiql/commit/bc9d243d40b95f95fc9d00d25aa0dd1733952626), [`67bf93a3`](https://github.com/graphql/graphiql/commit/67bf93a33e98c60ae3a686063a1c47037f88ef49)]:\n  - @graphiql/react@0.18.0-alpha.1\n\n## 0.1.21-alpha.0\n\n### Patch Changes\n\n- Updated dependencies [[`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696), [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696)]:\n  - @graphiql/react@0.18.0-alpha.0\n\n## 0.1.20\n\n### Patch Changes\n\n- [#3124](https://github.com/graphql/graphiql/pull/3124) [`c645932c`](https://github.com/graphql/graphiql/commit/c645932c7973e11ad917e1d1d897fd409f8c042f) Thanks [@B2o5T](https://github.com/B2o5T)! - avoid unnecessary renders by using useMemo or useCallback\n\n- Updated dependencies [[`911cf3e0`](https://github.com/graphql/graphiql/commit/911cf3e0b0fa13268245463c8db8299279e5c461), [`c645932c`](https://github.com/graphql/graphiql/commit/c645932c7973e11ad917e1d1d897fd409f8c042f), [`2ca4841b`](https://github.com/graphql/graphiql/commit/2ca4841baf74e87a3f067b3415f8da3347ee3898), [`7bf90929`](https://github.com/graphql/graphiql/commit/7bf90929f62ba812c0946e0424f9f843f7b6b0ff), [`431b7fe1`](https://github.com/graphql/graphiql/commit/431b7fe1efefa4867f0ea617adc436b1117052e8)]:\n  - @graphiql/react@0.17.6\n\n## 0.1.19\n\n### Patch Changes\n\n- Updated dependencies [[`2b212941`](https://github.com/graphql/graphiql/commit/2b212941628498957d95ee89a7a5a0623f391b7a), [`9b333a04`](https://github.com/graphql/graphiql/commit/9b333a047d6b75db7681f484156d8772e9f91810)]:\n  - @graphiql/react@0.17.5\n\n## 0.1.18\n\n### Patch Changes\n\n- Updated dependencies [[`707f3cbc`](https://github.com/graphql/graphiql/commit/707f3cbca3ac2ce186058e7d2b145cdf69bf7d9c)]:\n  - @graphiql/react@0.17.4\n\n## 0.1.17\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.17.3\n\n## 0.1.16\n\n### Patch Changes\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9), [`4879984e`](https://github.com/graphql/graphiql/commit/4879984ea1803a6e9f97d81c97e8ba27aacddae9), [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b)]:\n  - @graphiql/react@0.17.2\n\n## 0.1.15\n\n### Patch Changes\n\n- [#3017](https://github.com/graphql/graphiql/pull/3017) [`4a2284f5`](https://github.com/graphql/graphiql/commit/4a2284f54809f91d03ba51b9eb4e3ba7b8b7e773) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Avoid bundling code from `react/jsx-runtime` so that the package can be used with Preact\n\n- [#3063](https://github.com/graphql/graphiql/pull/3063) [`5792aaa5`](https://github.com/graphql/graphiql/commit/5792aaa5b26b68dc396f7bfb5dc3defd9331b831) Thanks [@B2o5T](https://github.com/B2o5T)! - avoid `useMemo` with empty array `[]` since React can't guarantee stable reference, + lint restrict syntax for future mistakes\n\n- Updated dependencies [[`2d5c60ec`](https://github.com/graphql/graphiql/commit/2d5c60ecf717abafde2bddd32b2772261d3eec8b), [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`4a2284f5`](https://github.com/graphql/graphiql/commit/4a2284f54809f91d03ba51b9eb4e3ba7b8b7e773), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0), [`7cf4908a`](https://github.com/graphql/graphiql/commit/7cf4908a5d4bd58af315047f4dec5236e8c701fc)]:\n  - @graphiql/react@0.17.1\n\n## 0.1.14\n\n### Patch Changes\n\n- Updated dependencies [[`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`65f5176a`](https://github.com/graphql/graphiql/commit/65f5176a408cfbbc514ca60e2e4bd2ea133a8b0b)]:\n  - @graphiql/react@0.17.0\n\n## 0.1.13\n\n### Patch Changes\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`cec3fb2a`](https://github.com/graphql/graphiql/commit/cec3fb2a493c4a0c40df7dfad04e1a95ed35e786), [`11e6ad11`](https://github.com/graphql/graphiql/commit/11e6ad11e745c671eb320731697887bb8d7177b7), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`d502a33b`](https://github.com/graphql/graphiql/commit/d502a33b4332f1025e947c02d7cfdc5799365c8d), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`ccba2f33`](https://github.com/graphql/graphiql/commit/ccba2f33b67a03f492222f7afde1354cfd033b42), [`4ff2794c`](https://github.com/graphql/graphiql/commit/4ff2794c8b6032168e27252096cb276ce712878e)]:\n  - @graphiql/react@0.16.0\n\n## 0.1.12\n\n### Patch Changes\n\n- Updated dependencies [[`16174a05`](https://github.com/graphql/graphiql/commit/16174a053ed89fb9554d096395ab7bf69c8f6911), [`f6cae4ea`](https://github.com/graphql/graphiql/commit/f6cae4eaa0258ea7fcde97ba6368830955f0abf4), [`3340fd74`](https://github.com/graphql/graphiql/commit/3340fd745e181ba8f1f5a6ed002a04d253a78d4a), [`0851d5f9`](https://github.com/graphql/graphiql/commit/0851d5f9ecf709597d0a698609d88f99c4395665), [`83364b28`](https://github.com/graphql/graphiql/commit/83364b28020b5946ed58908d6d977f1de766e75d), [`3a7d0007`](https://github.com/graphql/graphiql/commit/3a7d00071922e2005777c92daf6ad0c1ce3e2816)]:\n  - @graphiql/react@0.15.0\n\n## 0.1.11\n\n### Patch Changes\n\n- Updated dependencies [[`29630c22`](https://github.com/graphql/graphiql/commit/29630c2219bca8b825ab0897840864364a9de2e8), [`8f926489`](https://github.com/graphql/graphiql/commit/8f9264896e9971951853463a283a90ba3d1310ef), [`2ba2f620`](https://github.com/graphql/graphiql/commit/2ba2f620b6e7de3ae6b5ea641f33e600f7f44e08)]:\n  - @graphiql/react@0.14.0\n\n## 0.1.10\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.13.7\n\n## 0.1.9\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.13.6\n\n## 0.1.8\n\n### Patch Changes\n\n- Updated dependencies [[`682ad06e`](https://github.com/graphql/graphiql/commit/682ad06e58ded2f82fa973e8e6613dd654417fe2)]:\n  - @graphiql/react@0.13.5\n\n## 0.1.7\n\n### Patch Changes\n\n- Updated dependencies [[`4e2f7ff9`](https://github.com/graphql/graphiql/commit/4e2f7ff99c578ceae54a1ae17c02088bd91b89c3)]:\n  - @graphiql/react@0.13.4\n\n## 0.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`42700076`](https://github.com/graphql/graphiql/commit/4270007671ce52f6c2250739916083611748b657), [`36839800`](https://github.com/graphql/graphiql/commit/36839800de128b05d11c262036c8240390c72a14), [`905f2e5e`](https://github.com/graphql/graphiql/commit/905f2e5ea3f0b304d27ea583e250ed4baff5016e)]:\n  - @graphiql/react@0.13.3\n\n## 0.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`39b4668d`](https://github.com/graphql/graphiql/commit/39b4668d43176526d37ecf07d8c86901d53e0d80)]:\n  - @graphiql/react@0.13.2\n\n## 0.1.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @graphiql/react@0.13.1\n\n## 0.1.3\n\n### Patch Changes\n\n- [#2735](https://github.com/graphql/graphiql/pull/2735) [`ca067d88`](https://github.com/graphql/graphiql/commit/ca067d88148c5d221d196790a997ad599038fad1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Use the new CSS variables for color alpha values defined in `@graphiql/react` in style definitions\n\n* [#2757](https://github.com/graphql/graphiql/pull/2757) [`32a70065`](https://github.com/graphql/graphiql/commit/32a70065434eaa7733e28cda0ea0e7d51952e62a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Use different colors for field names and argument names\n\n* Updated dependencies [[`ca067d88`](https://github.com/graphql/graphiql/commit/ca067d88148c5d221d196790a997ad599038fad1), [`32a70065`](https://github.com/graphql/graphiql/commit/32a70065434eaa7733e28cda0ea0e7d51952e62a)]:\n  - @graphiql/react@0.13.0\n\n## 0.1.2\n\n### Patch Changes\n\n- [#2750](https://github.com/graphql/graphiql/pull/2750) [`cdc44aab`](https://github.com/graphql/graphiql/commit/cdc44aabdc549f5a0359b8f69506cc0c31661d16) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Remove `type` field from `package.json` to support both ES Modules and CommonJS\n\n- Updated dependencies []:\n  - @graphiql/react@0.12.1\n\n## 0.1.1\n\n### Patch Changes\n\n- [#2745](https://github.com/graphql/graphiql/pull/2745) [`92a17490`](https://github.com/graphql/graphiql/commit/92a17490c3842b4f83ed1065b73a803f73d02a17) Thanks [@acao](https://github.com/acao)! - Specify MIT license for `@graphiql/plugin-explorer` `package.json`\n\n* [#2731](https://github.com/graphql/graphiql/pull/2731) [`3e8f0d1f`](https://github.com/graphql/graphiql/commit/3e8f0d1fe4da5cdea94240119bbad587720ca324) Thanks [@hasparus](https://github.com/hasparus)! - Expose typings for graphiql-explorer\n\n- [#2738](https://github.com/graphql/graphiql/pull/2738) [`33bef178`](https://github.com/graphql/graphiql/commit/33bef17832edb29f5b26f4ed1cf33fd0d7fbbed1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix peer dependency versions\n\n* [#2747](https://github.com/graphql/graphiql/pull/2747) [`52d0003f`](https://github.com/graphql/graphiql/commit/52d0003fd0c405da65b7b23dcfed9f3aacbad067) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Make `@graphiql/react` a real dependency instead of a peer dependency\n\n* Updated dependencies [[`98e14155`](https://github.com/graphql/graphiql/commit/98e14155c650ee7c5ac639e594eb47f0052b7fa9), [`7dfea94a`](https://github.com/graphql/graphiql/commit/7dfea94afc0cfe79b5080f10d840bfdce53f02d7), [`3aa1f39f`](https://github.com/graphql/graphiql/commit/3aa1f39f6df559b54f703937ed510c8ba1f21058), [`0219eef3`](https://github.com/graphql/graphiql/commit/0219eef39146495749aca2487112db52fa3bb8fd)]:\n  - @graphiql/react@0.12.0\n\n## 0.1.0\n\n### Minor Changes\n\n- [#2724](https://github.com/graphql/graphiql/pull/2724) [`dd5db3b2`](https://github.com/graphql/graphiql/commit/dd5db3b2ee08b240ba7b77a9b7ff621115bd25f3) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a package that exports a plugin to use the GraphiQL Explorer from OneGraph\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/README.md",
    "content": "# GraphiQL Explorer Plugin\n\nThis package provides a plugin that integrates the\n[`GraphiQL Explorer`](https://github.com/OneGraph/graphiql-explorer) into the GraphiQL UI.\n\n## Installation\n\nUse your preferred package manager to install the plugin:\n\n```sh\nnpm install @graphiql/plugin-explorer\n```\n\nMake sure to also install the required peer dependencies:\n\n```sh\nnpm install react react-dom graphql\n```\n\n## Usage\n\n```jsx\nimport { GraphiQL } from 'graphiql';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { explorerPlugin } from '@graphiql/plugin-explorer';\nimport 'graphiql/style.css';\nimport '@graphiql/plugin-explorer/style.css';\n\nconst fetcher = createGraphiQLFetcher({\n  url: 'https://swapi-graphql.netlify.app/.netlify/functions/index',\n});\n\n// Pass the explorer props here if you want\nconst explorer = explorerPlugin();\n\nfunction GraphiQLWithExplorer() {\n  return <GraphiQL fetcher={fetcher} plugins={[explorer]} />;\n}\n```\n\n## CDN bundles\n\nYou can also use this plugin via an ESM-based CDN like [esm.sh](https://esm.sh).\n\nSee the [CDN example](./example/index.html) for a working demo.\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/package.json",
    "content": "{\n  \"name\": \"@graphiql/plugin-explorer\",\n  \"version\": \"5.1.1\",\n  \"sideEffects\": false,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql-plugin-explorer\"\n  },\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"react\",\n    \"graphql\",\n    \"graphiql\",\n    \"plugin\",\n    \"explorer\"\n  ],\n  \"files\": [\n    \"dist\"\n  ],\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./style.css\": \"./dist/style.css\",\n    \".\": \"./dist/index.js\"\n  },\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"vite build --watch --emptyOutDir=false\",\n    \"build\": \"vite build\",\n    \"postbuild\": \"cp src/graphiql-explorer.d.ts dist/graphiql-explorer.d.ts\"\n  },\n  \"dependencies\": {\n    \"graphiql-explorer\": \"^0.9.0\"\n  },\n  \"peerDependencies\": {\n    \"@graphiql/react\": \"^0.37.0\",\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0-alpha.2\",\n    \"react\": \"^18 || ^19\",\n    \"react-dom\": \"^18 || ^19\"\n  },\n  \"devDependencies\": {\n    \"@graphiql/react\": \"^0.37.0\",\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"graphql\": \"^16.9.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"typescript\": \"^4.6.3\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-dts\": \"^4.0.1\",\n    \"vite-plugin-svgr\": \"^4.3.0\"\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/src/graphiql-explorer.d.ts",
    "content": "declare module 'graphiql-explorer' {\n  import {\n    FragmentDefinitionNode,\n    GraphQLArgument,\n    GraphQLField,\n    GraphQLInputField,\n    GraphQLLeafType,\n    GraphQLObjectType,\n    GraphQLSchema,\n    ValueNode,\n  } from 'graphql';\n  import { ComponentType, ReactNode, CSSProperties } from 'react';\n\n  export type GraphiQLExplorerProps = {\n    query: string;\n    width?: number;\n    title?: string;\n    schema?: GraphQLSchema | null;\n    onEdit?(newQuery: string): void;\n    getDefaultFieldNames?(type: GraphQLObjectType): string[];\n    getDefaultScalarArgValue?(\n      parentField: GraphQLField<any, any>,\n      arg: GraphQLArgument | GraphQLInputField,\n      underlyingArgType: GraphQLLeafType,\n    ): ValueNode;\n    makeDefaultArg?(\n      parentField: GraphQLField<any, any>,\n      arg: GraphQLArgument | GraphQLInputField,\n    ): boolean;\n    onToggleExplorer?(): void;\n    explorerIsOpen?: boolean;\n    onRunOperation?(name: string | null): void;\n    colors?: {\n      keyword: string;\n      def: string;\n      property: string;\n      qualifier: string;\n      attribute: string;\n      number: string;\n      string: string;\n      builtin: string;\n      string2: string;\n      variable: string;\n      atom: string;\n    };\n    arrowOpen?: ReactNode;\n    arrowClosed?: ReactNode;\n    checkboxChecked?: ReactNode;\n    checkboxUnchecked?: ReactNode;\n    styles?: {\n      explorerActionsStyle?: CSSProperties;\n      buttonStyle?: CSSProperties;\n      actionButtonStyle?: CSSProperties;\n    };\n    showAttribution?: boolean;\n    hideActions?: boolean;\n    externalFragments?: FragmentDefinitionNode[];\n  };\n\n  const GraphiQLExplorer: ComponentType<GraphiQLExplorerProps> & {\n    defaultValue: (arg: GraphQLLeafType) => ValueNode;\n  };\n\n  export { GraphiQLExplorer as Explorer };\n\n  export default GraphiQLExplorer;\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/src/index.css",
    "content": ".docExplorerWrap {\n  height: unset !important;\n  min-width: unset !important;\n  width: unset !important;\n}\n\n.docExplorerWrap svg {\n  display: unset;\n}\n\n.doc-explorer-title {\n  font-size: var(--font-size-h2);\n  font-weight: var(--font-weight-medium);\n}\n\n.doc-explorer-rhs {\n  display: none;\n}\n\n.graphiql-explorer-root {\n  font-family: var(--font-family-mono) !important;\n  font-size: var(--font-size-body) !important;\n  padding: 0 !important;\n}\n\n.graphiql-explorer-root > div > div {\n  border-color: hsla(\n    var(--color-neutral),\n    var(--alpha-background-heavy)\n  ) !important;\n  padding-top: var(--px-16);\n}\n\n.graphiql-explorer-root > div {\n  overflow: auto !important; /* override overflow: scroll */\n}\n\n.graphiql-explorer-root input {\n  background: unset;\n}\n\n.graphiql-explorer-root select {\n  background: hsl(var(--color-base)) !important;\n  border: 1px solid hsla(var(--color-neutral), var(--alpha-secondary));\n  border-radius: var(--border-radius-4);\n  color: hsl(var(--color-neutral)) !important;\n  margin: 0 var(--px-8);\n  padding: var(--px-4) var(--px-6);\n}\n\n.toolbar-button {\n  all: unset;\n  cursor: pointer;\n  line-height: 0 !important;\n  margin-left: var(--px-6);\n  color: hsl(var(--color-primary));\n  font-size: var(--font-size-h3) !important;\n}\n\n.graphiql-explorer-slug .toolbar-button,\n.graphiql-explorer-graphql-arguments .toolbar-button {\n  font-size: inherit !important;\n}\n\n.graphiql-explorer-graphql-arguments input {\n  line-height: 0;\n  min-width: 2rem;\n}\n\n.graphiql-explorer-actions {\n  border-color: hsla(\n    var(--color-neutral),\n    var(--alpha-background-heavy)\n  ) !important;\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/src/index.tsx",
    "content": "import { CSSProperties, FC, useCallback } from 'react';\nimport {\n  GraphiQLPlugin,\n  useGraphiQL,\n  useGraphiQLActions,\n  useOperationsEditorState,\n  useOptimisticState,\n} from '@graphiql/react';\nimport {\n  Explorer as GraphiQLExplorer,\n  GraphiQLExplorerProps,\n} from 'graphiql-explorer';\nimport ArrowIcon from './icons/arrow.svg?react';\nimport FolderPlusIcon from './icons/folder-plus.svg?react';\nimport CheckboxUncheckedIcon from './icons/checkbox-unchecked.svg?react';\nimport CheckboxCheckedIcon from './icons/checkbox-checked.svg?react';\nimport './index.css';\n\nconst colors = {\n  keyword: 'hsl(var(--color-primary))',\n  def: 'hsl(var(--color-tertiary))',\n  property: 'hsl(var(--color-info))',\n  qualifier: 'hsl(var(--color-secondary))',\n  attribute: 'hsl(var(--color-tertiary))',\n  number: 'hsl(var(--color-success))',\n  string: 'hsl(var(--color-warning))',\n  builtin: 'hsl(var(--color-success))',\n  string2: 'hsl(var(--color-secondary))',\n  variable: 'hsl(var(--color-secondary))',\n  atom: 'hsl(var(--color-tertiary))',\n};\n\nconst arrowOpen = (\n  <ArrowIcon style={{ width: 'var(--px-16)', transform: 'rotate(90deg)' }} />\n);\nconst arrowClosed = <ArrowIcon style={{ width: 'var(--px-16)' }} />;\nconst checkboxUnchecked = (\n  <CheckboxUncheckedIcon style={{ marginRight: 'var(--px-4)' }} />\n);\nconst checkboxChecked = (\n  <CheckboxCheckedIcon\n    style={{ fill: 'hsl(var(--color-info))', marginRight: 'var(--px-4)' }}\n  />\n);\n\nconst styles: Record<string, CSSProperties> = {\n  buttonStyle: {\n    cursor: 'pointer',\n    fontSize: '2em',\n    lineHeight: 0,\n  },\n  explorerActionsStyle: {\n    paddingTop: 'var(--px-16)',\n  },\n  actionButtonStyle: {},\n};\n\nexport type GraphiQLExplorerPluginProps = Omit<\n  GraphiQLExplorerProps,\n  'onEdit' | 'query'\n>;\n\nconst ExplorerPlugin: FC<GraphiQLExplorerPluginProps> = props => {\n  const { setOperationName, run } = useGraphiQLActions();\n  const schema = useGraphiQL(state => state.schema);\n\n  // handle running the current operation from the plugin\n  const handleRunOperation = useCallback(\n    (operationName: string | null) => {\n      if (operationName) {\n        // set the plugin-defined operation name before executing\n        setOperationName(operationName);\n      }\n      run();\n    },\n    [run, setOperationName],\n  );\n\n  // load the current editor tab state into the explorer\n  const [operationsString, handleEditOperations] = useOptimisticState(\n    useOperationsEditorState(),\n  );\n\n  return (\n    <GraphiQLExplorer\n      schema={schema}\n      onRunOperation={handleRunOperation}\n      explorerIsOpen\n      colors={colors}\n      arrowOpen={arrowOpen}\n      arrowClosed={arrowClosed}\n      checkboxUnchecked={checkboxUnchecked}\n      checkboxChecked={checkboxChecked}\n      styles={styles}\n      query={operationsString}\n      onEdit={handleEditOperations}\n      {...props}\n    />\n  );\n};\n\nexport function explorerPlugin(\n  props?: GraphiQLExplorerPluginProps,\n): GraphiQLPlugin {\n  return {\n    title: 'GraphiQL Explorer',\n    icon: FolderPlusIcon,\n    content: () => <ExplorerPlugin {...props} />,\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite-plugin-svgr/client\" />\n/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/tsconfig.json",
    "content": "{\n  \"extends\": \"../graphiql-react/tsconfig.json\"\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-explorer/vite.config.mts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport svgr from 'vite-plugin-svgr';\nimport dts from 'vite-plugin-dts';\nimport packageJSON from './package.json';\n\nexport default defineConfig({\n  plugins: [\n    react(),\n    svgr({\n      svgrOptions: {\n        titleProp: true,\n      },\n    }),\n    dts({ include: ['src/**'] }),\n  ],\n  css: {\n    transformer: 'lightningcss',\n  },\n  build: {\n    minify: false,\n    lib: {\n      entry: 'src/index.tsx',\n      fileName: (_format, filePath) => `${filePath}.js`,\n      formats: ['es'],\n      cssFileName: 'style',\n    },\n    rollupOptions: {\n      external: [\n        'react/jsx-runtime',\n        // Exclude peer dependencies and dependencies from bundle\n        ...Object.keys({\n          ...packageJSON.peerDependencies,\n          ...packageJSON.dependencies,\n        }),\n      ],\n    },\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-history/CHANGELOG.md",
    "content": "# @graphiql/plugin-history\n\n## 0.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf), [`293beed`](https://github.com/graphql/graphiql/commit/293beed772baa2be834cad5f19e1aee0628e15cc)]:\n  - @graphiql/react@0.37.0\n\n## 0.4.0\n\n### Minor Changes\n\n- [#4074](https://github.com/graphql/graphiql/pull/4074) [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Ensure `storage` and `theme` store values aren't shared between GraphiQL instances. Deprecate `useTheme` and `useStorage` hooks in favour of values from `useGraphiQL` and `useGraphiQLActions` hooks\n\n  feat(`@graphiql/plugin-history`/`@graphiql/plugin-doc-explorer`): move `@graphiql/react` to `peerDependencies`\n\n- [#4077](https://github.com/graphql/graphiql/pull/4077) [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add new example [Usage GraphiQL 5 with Vite, React Router and `ssr: true`](https://github.com/graphql/graphiql/tree/main/examples/example-graphiql-vite-react-router)\n\n### Patch Changes\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd), [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198), [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14), [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b)]:\n  - @graphiql/react@0.36.0\n\n## 0.3.0\n\n### Minor Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#4011](https://github.com/graphql/graphiql/pull/4011) [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix execute query shortcut in query editor, run it even there are no operations in query editor\n\n  fix plugin store, save last opened plugin in storage\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- Updated dependencies [[`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92), [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270), [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531), [`3c0ad34`](https://github.com/graphql/graphiql/commit/3c0ad34a8f2f9d0f912db9597f608d7405c2bd83), [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d), [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439), [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7), [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb), [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c), [`4b39f11`](https://github.com/graphql/graphiql/commit/4b39f1118d008c2fac6e2df9c94a3f3271c4eeb9), [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/react@0.35.0\n\n## 0.3.0-rc.3\n\n### Minor Changes\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n### Patch Changes\n\n- Updated dependencies [[`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b), [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b)]:\n  - @graphiql/react@0.35.0-rc.8\n\n## 0.3.0-rc.2\n\n### Minor Changes\n\n- [#4011](https://github.com/graphql/graphiql/pull/4011) [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix execute query shortcut in query editor, run it even there are no operations in query editor\n\n  fix plugin store, save last opened plugin in storage\n\n### Patch Changes\n\n- Updated dependencies [[`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c)]:\n  - @graphiql/react@0.35.0-rc.4\n\n## 0.3.0-rc.1\n\n### Minor Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n### Patch Changes\n\n- Updated dependencies [[`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92)]:\n  - @graphiql/react@0.35.0-rc.1\n\n## 0.3.0-rc.0\n\n### Minor Changes\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n\n### Patch Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- Updated dependencies [[`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e), [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91), [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb)]:\n  - @graphiql/react@0.35.0-rc.0\n\n## 0.2.2\n\n### Patch Changes\n\n- [#3970](https://github.com/graphql/graphiql/pull/3970) [`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - revert https://github.com/graphql/graphiql/pull/3946 to have support multiple embedded graphiql instances on the same page\n\n- Updated dependencies [[`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7)]:\n  - @graphiql/toolkit@0.11.3\n  - @graphiql/react@0.34.1\n\n## 0.2.1\n\n### Patch Changes\n\n- [#3946](https://github.com/graphql/graphiql/pull/3946) [`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand:\n  - replace `useExecutionContext` with `useExecutionStore` hook\n  - replace `useEditorContext` with `useEditorStore` hook\n  - replace `useAutoCompleteLeafs` hook with `getAutoCompleteLeafs` function\n- Updated dependencies [[`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af), [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781)]:\n  - @graphiql/react@0.34.0\n\n## 0.2.0\n\n### Minor Changes\n\n- [#3947](https://github.com/graphql/graphiql/pull/3947) [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - refactor `useStorage`, `useDocExplorer` and `useHistory` hooks\n\n### Patch Changes\n\n- [#3945](https://github.com/graphql/graphiql/pull/3945) [`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `usePluginContext` with `usePluginStore` hook\n\n- [#3942](https://github.com/graphql/graphiql/pull/3942) [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useStorageContext` with `useStorage` hook\n\n- Updated dependencies [[`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71), [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0), [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e), [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921)]:\n  - @graphiql/react@0.33.0\n\n## 0.1.0\n\n### Minor Changes\n\n- [#3935](https://github.com/graphql/graphiql/pull/3935) [`5985e13`](https://github.com/graphql/graphiql/commit/5985e135fcc38a0ce90bf5a5d2cc344ec6b36aab) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/plugin-history): migrate React context to zustand, replace `useHistoryContext` with `useHistory`, `useHistoryActions` hooks\n\n### Patch Changes\n\n- [#3939](https://github.com/graphql/graphiql/pull/3939) [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `React.FC` type when declaring React components\n\n- Updated dependencies [[`2bfbb06`](https://github.com/graphql/graphiql/commit/2bfbb06e416cabc46951a137b61a12a571f0c937), [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7), [`2500288`](https://github.com/graphql/graphiql/commit/250028863f6eefe4167ff9f9c23168ccf0a85b7b)]:\n  - @graphiql/react@0.32.2\n\n## 0.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67)]:\n  - @graphiql/react@0.32.0\n\n## 0.0.1\n\n### Patch Changes\n\n- [#3911](https://github.com/graphql/graphiql/pull/3911) [`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - export `cn` from `@graphiql/react`\n\n  - remove following exports from `@graphiql/react` and move them in `@graphiql/plugin-history` package:\n    - `History`\n    - `HistoryContext`\n    - `HistoryContextType`\n    - `HistoryContextProvider`\n    - `useHistoryContext`\n    - `HISTORY_PLUGIN`\n  - remove types from `@graphiql/react` (use `ComponentProps<typeof MyContextProviderProps>` instead):\n    - `HistoryContextProviderProps`\n    - `ExecutionContextProviderProps`\n    - `EditorContextProviderProps`\n    - `ExplorerContextProviderProps`\n    - `PluginContextProviderProps`\n    - `SchemaContextProviderProps`\n    - `StorageContextProviderProps`\n    - `GraphiQLProviderProps`\n\n- Updated dependencies [[`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6)]:\n  - @graphiql/react@0.31.0\n"
  },
  {
    "path": "packages/graphiql-plugin-history/README.md",
    "content": "# `@graphiql/plugin-history`\n\n## API\n\n- `useHistory`: Persists executed requests in storage\n- `useHistoryActions`: Actions related to the history\n"
  },
  {
    "path": "packages/graphiql-plugin-history/package.json",
    "content": "{\n  \"name\": \"@graphiql/plugin-history\",\n  \"version\": \"0.4.1\",\n  \"sideEffects\": false,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql-plugin-history\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/master/packages/graphiql-plugin-history#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:@graphiql/plugin-history\"\n  },\n  \"license\": \"MIT\",\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./style.css\": \"./dist/style.css\",\n    \".\": \"./dist/index.js\"\n  },\n  \"types\": \"dist/index.d.ts\",\n  \"keywords\": [\n    \"react\",\n    \"graphql\",\n    \"graphiql\",\n    \"plugin\",\n    \"history\"\n  ],\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"vite build --watch --emptyOutDir=false\",\n    \"build\": \"vite build\",\n    \"test\": \"vitest\"\n  },\n  \"peerDependencies\": {\n    \"@graphiql/react\": \"^0.37.0\",\n    \"react\": \"^18 || ^19\",\n    \"react-compiler-runtime\": \"19.1.0-rc.1\",\n    \"react-dom\": \"^18 || ^19\"\n  },\n  \"dependencies\": {\n    \"@graphiql/toolkit\": \"^0.11.3\",\n    \"zustand\": \"^5\"\n  },\n  \"devDependencies\": {\n    \"@testing-library/react\": \"^16.1.0\",\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"babel-plugin-react-compiler\": \"19.1.0-rc.1\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-dts\": \"^4.5.3\"\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-history/setup-files.ts",
    "content": "'use no memo';\n\nimport '@testing-library/jest-dom';\n\n// to make it works like Jest (auto-mocking)\nvi.mock('zustand');\nvi.mock('monaco-editor');\n"
  },
  {
    "path": "packages/graphiql-plugin-history/src/__tests__/components.spec.tsx",
    "content": "import type { Mock } from 'vitest';\nimport { fireEvent, render } from '@testing-library/react';\nimport type { ComponentProps } from 'react';\nimport { formatQuery, HistoryItem } from '../components';\nimport { HistoryStore } from '../context';\nimport { Tooltip, GraphiQLProvider, useGraphiQL } from '@graphiql/react';\n\nvi.mock('@graphiql/react', async () => {\n  const originalModule = await vi.importActual('@graphiql/react');\n  const mockedSetQueryEditor = vi.fn();\n  const mockedSetVariableEditor = vi.fn();\n  const mockedSetHeaderEditor = vi.fn();\n  return {\n    ...originalModule,\n    useGraphiQL() {\n      return {\n        queryEditor: { setValue: mockedSetQueryEditor },\n        variableEditor: { setValue: mockedSetVariableEditor },\n        headerEditor: { setValue: mockedSetHeaderEditor },\n        tabs: [],\n        storage: {\n          get() {},\n        },\n      };\n    },\n  };\n});\n\nconst mockQuery = /* GraphQL */ `\n  query Test($string: String) {\n    test {\n      hasArgs(string: $string)\n    }\n  }\n`;\n\nconst mockVariables = JSON.stringify({ string: 'string' });\n\nconst mockHeaders = JSON.stringify({ foo: 'bar' });\n\nconst mockOperationName = 'Test';\n\ntype QueryHistoryItemProps = ComponentProps<typeof HistoryItem>;\n\nconst QueryHistoryItemWithContext: typeof HistoryItem = props => {\n  return (\n    <Tooltip.Provider>\n      <GraphiQLProvider fetcher={vi.fn()}>\n        <HistoryStore>\n          <HistoryItem {...props} />\n        </HistoryStore>\n      </GraphiQLProvider>\n    </Tooltip.Provider>\n  );\n};\n\nconst baseMockProps: QueryHistoryItemProps = {\n  item: {\n    query: mockQuery,\n    variables: mockVariables,\n    headers: mockHeaders,\n    favorite: false,\n  },\n};\n\nfunction getMockProps(\n  customProps?: Partial<QueryHistoryItemProps>,\n): QueryHistoryItemProps {\n  return {\n    ...baseMockProps,\n    ...customProps,\n    item: { ...baseMockProps.item, ...customProps?.item },\n  };\n}\n\ndescribe('QueryHistoryItem', () => {\n  const { queryEditor, variableEditor, headerEditor } = useGraphiQL(\n    state => state,\n  );\n  const mockedSetQueryEditor = queryEditor!.setValue as Mock;\n  const mockedSetVariableEditor = variableEditor!.setValue as Mock;\n  const mockedSetHeaderEditor = headerEditor!.setValue as Mock;\n\n  beforeEach(() => {\n    mockedSetQueryEditor.mockClear();\n    mockedSetVariableEditor.mockClear();\n    mockedSetHeaderEditor.mockClear();\n  });\n\n  it('renders operationName if label is not provided', () => {\n    const otherMockProps = { item: { operationName: mockOperationName } };\n    const props = getMockProps(otherMockProps);\n    const { container } = render(<QueryHistoryItemWithContext {...props} />);\n    expect(\n      container.querySelector('button.graphiql-history-item-label')!\n        .textContent,\n    ).toBe(mockOperationName);\n  });\n\n  it('renders a string version of the query if label or operation name are not provided', () => {\n    const { container } = render(\n      <QueryHistoryItemWithContext {...getMockProps()} />,\n    );\n    expect(\n      container.querySelector('button.graphiql-history-item-label')!\n        .textContent,\n    ).toBe(formatQuery(mockQuery));\n  });\n\n  it('selects the item when history label button is clicked', () => {\n    const otherMockProps = { item: { operationName: mockOperationName } };\n    const mockProps = getMockProps(otherMockProps);\n    const { container } = render(\n      <QueryHistoryItemWithContext {...mockProps} />,\n    );\n    fireEvent.click(\n      container.querySelector('button.graphiql-history-item-label')!,\n    );\n    expect(mockedSetQueryEditor).toHaveBeenCalledTimes(1);\n    expect(mockedSetQueryEditor).toHaveBeenCalledWith(mockProps.item.query);\n    expect(mockedSetVariableEditor).toHaveBeenCalledTimes(1);\n    expect(mockedSetVariableEditor).toHaveBeenCalledWith(\n      mockProps.item.variables,\n    );\n    expect(mockedSetHeaderEditor).toHaveBeenCalledTimes(1);\n    expect(mockedSetHeaderEditor).toHaveBeenCalledWith(mockProps.item.headers);\n  });\n\n  it('renders label input if the edit label button is clicked', () => {\n    const { container, getByLabelText } = render(\n      <QueryHistoryItemWithContext {...getMockProps()} />,\n    );\n    fireEvent.click(getByLabelText('Edit label'));\n    expect(container.querySelectorAll('li.editable').length).toBe(1);\n    expect(container.querySelectorAll('input').length).toBe(1);\n    expect(\n      container.querySelectorAll('button.graphiql-history-item-label').length,\n    ).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-history/src/components.tsx",
    "content": "import type { QueryStoreItem } from '@graphiql/toolkit';\nimport { FC, MouseEventHandler, useEffect, useRef, useState } from 'react';\nimport {\n  cn,\n  CloseIcon,\n  PenIcon,\n  StarFilledIcon,\n  StarIcon,\n  TrashIcon,\n  useGraphiQL,\n  pick,\n  Button,\n  Tooltip,\n  UnStyledButton,\n} from '@graphiql/react';\nimport { useHistory, useHistoryActions } from './context';\n\n// Fix error from react-compiler\n// Support value blocks (conditional, logical, optional chaining, etc.) within a try/catch statement\nfunction handleDelete(\n  items: QueryStoreItem[],\n  deleteFromHistory: ReturnType<typeof useHistoryActions>['deleteFromHistory'],\n) {\n  for (const item of items) {\n    deleteFromHistory(item, true);\n  }\n}\n\nexport const History: FC = () => {\n  const all = useHistory();\n  const { deleteFromHistory } = useHistoryActions();\n\n  // Reverse items since we push them in so want the latest one at the top, and pass the\n  // original index in case multiple items share the same label so we can edit the correct item\n  let items = all\n    .slice()\n    .map((item, i) => ({ ...item, index: i }))\n    .reverse();\n  const favorites = items.filter(item => item.favorite);\n  if (favorites.length) {\n    items = items.filter(item => !item.favorite);\n  }\n\n  const [clearStatus, setClearStatus] = useState<'success' | 'error' | null>(\n    null,\n  );\n  useEffect(() => {\n    if (clearStatus) {\n      // reset the button after a couple seconds\n      setTimeout(() => {\n        setClearStatus(null);\n      }, 2000);\n    }\n  }, [clearStatus]);\n\n  const handleClearStatus = () => {\n    try {\n      handleDelete(items, deleteFromHistory);\n      setClearStatus('success');\n    } catch {\n      setClearStatus('error');\n    }\n  };\n  const hasFavorites = Boolean(favorites.length);\n  const hasItems = Boolean(items.length);\n\n  return (\n    <section aria-label=\"History\" className=\"graphiql-history\">\n      <div className=\"graphiql-history-header\">\n        History\n        {(clearStatus || hasItems) && (\n          <Button\n            type=\"button\"\n            state={clearStatus || undefined}\n            disabled={!items.length}\n            onClick={handleClearStatus}\n          >\n            {{\n              success: 'Cleared',\n              error: 'Failed to Clear',\n            }[clearStatus!] || 'Clear'}\n          </Button>\n        )}\n      </div>\n\n      {hasFavorites && (\n        <ul className=\"graphiql-history-items\">\n          {favorites.map(item => (\n            <HistoryItem item={item} key={item.index} />\n          ))}\n        </ul>\n      )}\n\n      {hasFavorites && hasItems && (\n        <div className=\"graphiql-history-item-spacer\" />\n      )}\n\n      {hasItems && (\n        <ul className=\"graphiql-history-items\">\n          {items.map(item => (\n            <HistoryItem item={item} key={item.index} />\n          ))}\n        </ul>\n      )}\n    </section>\n  );\n};\n\ntype QueryHistoryItemProps = {\n  item: QueryStoreItem & { index?: number };\n};\n\nexport const HistoryItem: FC<QueryHistoryItemProps> = props => {\n  const { editLabel, toggleFavorite, deleteFromHistory, setActive } =\n    useHistoryActions();\n  const { headerEditor, queryEditor, variableEditor } = useGraphiQL(\n    pick('headerEditor', 'queryEditor', 'variableEditor'),\n  );\n  const inputRef = useRef<HTMLInputElement>(null);\n  const buttonRef = useRef<HTMLButtonElement>(null);\n  const [isEditable, setIsEditable] = useState(false);\n\n  useEffect(() => {\n    if (isEditable) {\n      inputRef.current?.focus();\n    }\n  }, [isEditable]);\n\n  const displayName =\n    props.item.label ||\n    props.item.operationName ||\n    formatQuery(props.item.query);\n\n  const handleSave = () => {\n    setIsEditable(false);\n    const { index, ...item } = props.item;\n    editLabel({ ...item, label: inputRef.current?.value }, index);\n  };\n\n  const handleClose = () => {\n    setIsEditable(false);\n  };\n\n  const handleEditLabel: MouseEventHandler<HTMLButtonElement> = e => {\n    e.stopPropagation();\n    setIsEditable(true);\n  };\n\n  const handleHistoryItemClick: MouseEventHandler<HTMLButtonElement> = () => {\n    const { query, variables, headers } = props.item;\n    queryEditor?.setValue(query ?? '');\n    variableEditor?.setValue(variables ?? '');\n    headerEditor?.setValue(headers ?? '');\n    setActive(props.item);\n  };\n\n  const handleDeleteItemFromHistory: MouseEventHandler<\n    HTMLButtonElement\n  > = e => {\n    e.stopPropagation();\n    deleteFromHistory(props.item);\n  };\n\n  const handleToggleFavorite: MouseEventHandler<HTMLButtonElement> = e => {\n    e.stopPropagation();\n    toggleFavorite(props.item);\n  };\n\n  return (\n    <li className={cn('graphiql-history-item', isEditable && 'editable')}>\n      {isEditable ? (\n        <>\n          <input\n            type=\"text\"\n            defaultValue={props.item.label}\n            ref={inputRef}\n            onKeyDown={e => {\n              if (e.key === 'Esc') {\n                setIsEditable(false);\n              } else if (e.key === 'Enter') {\n                setIsEditable(false);\n                editLabel({ ...props.item, label: e.currentTarget.value });\n              }\n            }}\n            placeholder=\"Type a label\"\n          />\n          <UnStyledButton type=\"button\" ref={buttonRef} onClick={handleSave}>\n            Save\n          </UnStyledButton>\n          <UnStyledButton type=\"button\" ref={buttonRef} onClick={handleClose}>\n            <CloseIcon />\n          </UnStyledButton>\n        </>\n      ) : (\n        <>\n          <Tooltip label=\"Set active\">\n            <UnStyledButton\n              type=\"button\"\n              className=\"graphiql-history-item-label\"\n              onClick={handleHistoryItemClick}\n              aria-label=\"Set active\"\n            >\n              {displayName}\n            </UnStyledButton>\n          </Tooltip>\n          <Tooltip label=\"Edit label\">\n            <UnStyledButton\n              type=\"button\"\n              className=\"graphiql-history-item-action\"\n              onClick={handleEditLabel}\n              aria-label=\"Edit label\"\n            >\n              <PenIcon aria-hidden=\"true\" />\n            </UnStyledButton>\n          </Tooltip>\n          <Tooltip\n            label={props.item.favorite ? 'Remove favorite' : 'Add favorite'}\n          >\n            <UnStyledButton\n              type=\"button\"\n              className=\"graphiql-history-item-action\"\n              onClick={handleToggleFavorite}\n              aria-label={\n                props.item.favorite ? 'Remove favorite' : 'Add favorite'\n              }\n            >\n              {props.item.favorite ? (\n                <StarFilledIcon aria-hidden=\"true\" />\n              ) : (\n                <StarIcon aria-hidden=\"true\" />\n              )}\n            </UnStyledButton>\n          </Tooltip>\n          <Tooltip label=\"Delete from history\">\n            <UnStyledButton\n              type=\"button\"\n              className=\"graphiql-history-item-action\"\n              onClick={handleDeleteItemFromHistory}\n              aria-label=\"Delete from history\"\n            >\n              <TrashIcon aria-hidden=\"true\" />\n            </UnStyledButton>\n          </Tooltip>\n        </>\n      )}\n    </li>\n  );\n};\n\nexport function formatQuery(query?: string) {\n  return query\n    ?.split('\\n')\n    .map(line => line.replace(/#(.*)/, ''))\n    .join(' ')\n    .replaceAll('{', ' { ')\n    .replaceAll('}', ' } ')\n    .replaceAll(/[\\s]{2,}/g, ' ');\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-history/src/context.ts",
    "content": "import { FC, ReactElement, ReactNode, useEffect } from 'react';\nimport { createStore } from 'zustand';\nimport {\n  HistoryStore as ToolkitHistoryStore,\n  QueryStoreItem,\n} from '@graphiql/toolkit';\nimport { useGraphiQL, pick, createBoundedUseStore } from '@graphiql/react';\n\nconst historyStore = createStore<HistoryStoreType>((set, get) => ({\n  historyStorage: null,\n  actions: {\n    addToHistory(operation) {\n      const { historyStorage } = get();\n      historyStorage?.updateHistory(operation);\n      set({}); // trigger rerender\n    },\n    editLabel(operation, index) {\n      const { historyStorage } = get();\n      historyStorage?.editLabel(operation, index);\n      set({}); // trigger rerender\n    },\n    toggleFavorite(operation) {\n      const { historyStorage } = get();\n      historyStorage?.toggleFavorite(operation);\n      set({}); // trigger rerender\n    },\n    setActive: item => item,\n    deleteFromHistory(item, clearFavorites) {\n      const { historyStorage } = get();\n      historyStorage?.deleteHistory(item, clearFavorites);\n      set({}); // trigger rerender\n    },\n  },\n}));\n\ntype HistoryStoreType = {\n  // Can be `null` if History plugin saved in `localStorage` as `visiblePlugin`\n  historyStorage: ToolkitHistoryStore | null;\n  actions: {\n    /**\n     * Add an operation to the history.\n     * @param operation The operation that was executed, consisting of the query,\n     * variables, headers, and operation name.\n     */\n    addToHistory(operation: {\n      query?: string;\n      variables?: string;\n      headers?: string;\n      operationName?: string;\n    }): void;\n    /**\n     * Change the custom label of an item from the history.\n     * @param args An object containing the label (`undefined` if it should be\n     * unset) and properties that identify the history item that the label should\n     * be applied to. (This can result in the label being applied to multiple\n     * history items.)\n     * @param index Index to edit. Without it, will look for the first index matching the\n     * operation, which may lead to misleading results if multiple items have the same label\n     */\n    editLabel(\n      args: {\n        query?: string;\n        variables?: string;\n        headers?: string;\n        operationName?: string;\n        label?: string;\n        favorite?: boolean;\n      },\n      index?: number,\n    ): void;\n    /**\n     * Toggle the favorite state of an item from the history.\n     * @param args An object containing the favorite state (`undefined` if it\n     * should be unset) and properties that identify the history item that the\n     * label should be applied to. (This can result in the label being applied\n     * to multiple history items.)\n     */\n    toggleFavorite(args: {\n      query?: string;\n      variables?: string;\n      headers?: string;\n      operationName?: string;\n      label?: string;\n      favorite?: boolean;\n    }): void;\n    /**\n     * Delete an operation from the history.\n     * @param args The operation that was executed, consisting of the query,\n     * variables, headers, and operation name.\n     * @param clearFavorites This is only if you press the 'clear' button\n     */\n    deleteFromHistory(args: QueryStoreItem, clearFavorites?: boolean): void;\n    /**\n     * If you need to know when an item in history is set as active to customize\n     * your application.\n     */\n    setActive(args: QueryStoreItem): void;\n  };\n};\n\ntype HistoryStoreProps = {\n  children: ReactNode;\n  /**\n   * The maximum number of executed operations to store.\n   * @default 20\n   */\n  maxHistoryLength?: number;\n};\n\n/**\n * The functions send the entire operation so users can customize their own application and get\n * access to the operation plus any additional props they added for their needs (i.e., build their\n * own functions that may save to a backend instead of localStorage and might need an id property\n * added to the `QueryStoreItem`)\n */\nexport const HistoryStore: FC<HistoryStoreProps> = ({\n  maxHistoryLength = 20,\n  children,\n}) => {\n  const { isFetching, tabs, activeTabIndex, storage } = useGraphiQL(\n    pick('isFetching', 'tabs', 'activeTabIndex', 'storage'),\n  );\n  const activeTab = tabs[activeTabIndex]!;\n  const historyStorage = // eslint-disable-line react-hooks/exhaustive-deps -- false positive, code is optimized by React Compiler\n    new ToolkitHistoryStore(storage, maxHistoryLength);\n\n  useEffect(() => {\n    historyStore.setState({ historyStorage });\n  }, [historyStorage]);\n\n  useEffect(() => {\n    if (!isFetching) {\n      return;\n    }\n    const { addToHistory } = historyStore.getState().actions;\n    addToHistory({\n      query: activeTab.query ?? undefined,\n      variables: activeTab.variables ?? undefined,\n      headers: activeTab.headers ?? undefined,\n      operationName: activeTab.operationName ?? undefined,\n    });\n  }, [isFetching, activeTab]);\n\n  return children as ReactElement;\n};\n\nconst useHistoryStore = createBoundedUseStore(historyStore);\n\nconst EMPTY_ARRAY: QueryStoreItem[] = [];\n\nexport const useHistory = () =>\n  useHistoryStore(state => state.historyStorage?.queries ?? EMPTY_ARRAY);\n\n/**\n * Actions are functions used to update values in your store. They are static and never change.\n * @see https://tkdodo.eu/blog/working-with-zustand#separate-actions-from-state\n */\nexport const useHistoryActions = () => useHistoryStore(state => state.actions);\n"
  },
  {
    "path": "packages/graphiql-plugin-history/src/deprecated.ts",
    "content": "import { useHistory, useHistoryActions } from './context';\n\n/**\n * @deprecated Use `useHistoryActions` and `useHistory` hooks instead.\n */\nexport function useHistoryContext() {\n  const actions = useHistoryActions();\n  const items = useHistory();\n  return { ...actions, items };\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-history/src/index.ts",
    "content": "import { GraphiQLPlugin, HistoryIcon } from '@graphiql/react';\nimport './style.css';\n\nimport { History } from './components';\n\nexport const HISTORY_PLUGIN: GraphiQLPlugin = {\n  title: 'History',\n  icon: HistoryIcon,\n  content: History,\n};\n\nexport { History };\n\nexport { HistoryStore, useHistory, useHistoryActions } from './context';\nexport * from './deprecated';\n"
  },
  {
    "path": "packages/graphiql-plugin-history/src/style.css",
    "content": ".graphiql-history-header {\n  font-size: var(--font-size-h2);\n  font-weight: var(--font-weight-medium);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.graphiql-history-header button {\n  font-size: var(--font-size-inline-code);\n  padding: var(--px-6) var(--px-10);\n}\n\n.graphiql-history-items {\n  margin: var(--px-16) 0 0;\n  list-style: none;\n  padding: 0;\n}\n\n.graphiql-history-item {\n  border-radius: var(--border-radius-4);\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  display: flex;\n  font-size: var(--font-size-inline-code);\n  font-family: var(--font-family-mono);\n  height: 34px;\n\n  &:hover {\n    color: hsl(var(--color-neutral));\n    background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  }\n\n  &:not(:first-child) {\n    margin-top: var(--px-4);\n  }\n\n  &.editable {\n    background-color: hsla(\n      var(--color-primary),\n      var(--alpha-background-medium)\n    );\n\n    & > input {\n      background: transparent;\n      border: none;\n      flex: 1;\n      margin: 0;\n      outline: none;\n      padding: 0 var(--px-10);\n      width: 100%;\n\n      &::placeholder {\n        color: hsla(var(--color-neutral), var(--alpha-secondary));\n      }\n    }\n\n    & > button {\n      color: hsl(var(--color-primary));\n      padding: 0 var(--px-10);\n\n      &:active {\n        background-color: hsla(\n          var(--color-primary),\n          var(--alpha-background-heavy)\n        );\n      }\n\n      &:focus {\n        outline: hsl(var(--color-primary)) auto 1px;\n      }\n\n      & > svg {\n        display: block;\n      }\n    }\n  }\n}\n\nbutton.graphiql-history-item-label {\n  flex: 1;\n  padding: var(--px-8) var(--px-10);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\nbutton.graphiql-history-item-action {\n  align-items: center;\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  display: flex;\n  padding: var(--px-8) var(--px-6);\n\n  &:hover {\n    color: hsl(var(--color-neutral));\n  }\n\n  & > svg {\n    height: 14px;\n    width: 14px;\n  }\n}\n\n.graphiql-history-item-spacer {\n  height: var(--px-16);\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-history/tsconfig.json",
    "content": "{\n  \"extends\": \"../graphiql-react/tsconfig.json\"\n}\n"
  },
  {
    "path": "packages/graphiql-plugin-history/vite.config.mts",
    "content": "import { defineConfig, PluginOption } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport type { PluginOptions as ReactCompilerConfig } from 'babel-plugin-react-compiler';\nimport packageJSON from './package.json' assert { type: 'json' };\nimport dts from 'vite-plugin-dts';\nimport { reactCompilerConfig as $reactCompilerConfig } from '../graphiql-react/vite.config.mjs';\n\nexport const reactCompilerConfig: Partial<ReactCompilerConfig> = {\n  ...$reactCompilerConfig,\n  sources(filename) {\n    if (filename.includes('__tests__')) {\n      return false;\n    }\n    return filename.includes('/graphiql-plugin-history/src/');\n  },\n};\n\nexport const plugins: PluginOption[] = [\n  react({\n    babel: {\n      plugins: [['babel-plugin-react-compiler', reactCompilerConfig]],\n    },\n  }),\n  dts({\n    include: ['src/**'],\n    exclude: ['**/*.spec.{ts,tsx}', '**/__tests__/'],\n  }),\n];\n\nexport default defineConfig({\n  plugins,\n  css: {\n    transformer: 'lightningcss',\n  },\n  build: {\n    minify: false,\n    sourcemap: true,\n    lib: {\n      entry: 'src/index.ts',\n      fileName(_format, entryName) {\n        const filePath = entryName.replace(/\\.svg$/, '');\n        return `${filePath}.js`;\n      },\n      formats: ['es'],\n      cssFileName: 'style',\n    },\n    rollupOptions: {\n      external: [\n        'react/jsx-runtime',\n        // Exclude peer dependencies and dependencies from bundle\n        ...Object.keys(packageJSON.peerDependencies),\n        ...Object.keys(packageJSON.dependencies),\n      ],\n      output: {\n        // Separate chunks for all modules\n        preserveModules: true,\n      },\n    },\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-plugin-history/vitest.config.mts",
    "content": "import path from 'node:path';\nimport { defineConfig } from 'vitest/config';\nimport { plugins } from './vite.config.mjs';\n\nexport default defineConfig({\n  plugins,\n  test: {\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: ['./setup-files.ts', '../graphiql/setup-window.ts'],\n    alias: [\n      {\n        // Fixes Error: Failed to resolve entry for package \"monaco-editor\". The package may have incorrect main/module/exports specified in its package.json.\n        find: /^monaco-editor$/,\n        replacement: path.resolve(\n          '../../node_modules/monaco-editor/esm/vs/editor/editor.api',\n        ),\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-react/CHANGELOG.md",
    "content": "# @graphiql/react\n\n## 0.37.3\n\n### Patch Changes\n\n- [#4133](https://github.com/graphql/graphiql/pull/4133) [`1bc6568`](https://github.com/graphql/graphiql/commit/1bc6568da947394c216342ae75fb509fdbf03390) Thanks [@dimaMachina](https://github.com/dimaMachina)! - to fix esm.sh example we should pin `monaco-editor` peer dependency to versions `≥ 0.20.0 and < 0.53`, since `monaco-editor@^0.53.0` isn't supported yet with `monaco-graphql`\n\n- Updated dependencies [[`1bc6568`](https://github.com/graphql/graphiql/commit/1bc6568da947394c216342ae75fb509fdbf03390)]:\n  - monaco-graphql@1.7.3\n\n## 0.37.2\n\n### Patch Changes\n\n- [#4124](https://github.com/graphql/graphiql/pull/4124) [`d77abe6`](https://github.com/graphql/graphiql/commit/d77abe647e700ef8949a16c3bccda648d5c6adae) Thanks [@dimaMachina](https://github.com/dimaMachina)! - pin `monaco-editor` to `0.52.2`\n\n## 0.37.1\n\n### Patch Changes\n\n- [#4081](https://github.com/graphql/graphiql/pull/4081) [`4950dec`](https://github.com/graphql/graphiql/commit/4950decaddb816ef3e3d22d814d976d94405029e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat: add loader for initial loading of operation editor\n  fix: adjust command palette `width`, `border` and remove `box-shadow`\n  feat: add short cut `Cmd/Ctrl + ,` for opening GraphiQL settings dialog\n\n## 0.37.0\n\n### Minor Changes\n\n- [#4078](https://github.com/graphql/graphiql/pull/4078) [`6e5d5fc`](https://github.com/graphql/graphiql/commit/6e5d5fce9a7eb5770f40300fc153e0b9b10edfbf) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix color in the F1 popup should be graphiql primary color and add deprecated exports for `useEditorStore`, `useExecutionStore`, `usePluginStore` and `useSchemaStore`\n\n### Patch Changes\n\n- [#4079](https://github.com/graphql/graphiql/pull/4079) [`293beed`](https://github.com/graphql/graphiql/commit/293beed772baa2be834cad5f19e1aee0628e15cc) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove legacy codemirror CSS styles\n\n## 0.36.0\n\n### Minor Changes\n\n- [#4071](https://github.com/graphql/graphiql/pull/4071) [`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(graphql-language-service): export `getContextAtPosition`\n  feat(graphiql): dynamically import `monaco-editor` and `monaco-graphql`\n\n  When using GraphiQL in Next.js app, you no longer need to use `next/dynamic`:\n\n  ```diff\n  -import dynamic from 'next/dynamic'\n  -const GraphiQL = dynamic(() => import('graphiql').then(mod => mod.GraphiQL), {\n  -  ssr: false\n  -})\n  +import { GraphiQL } from 'graphiql'\n  ```\n\n- [#4074](https://github.com/graphql/graphiql/pull/4074) [`fd3f9e6`](https://github.com/graphql/graphiql/commit/fd3f9e6a91be728a69a136ad8680f6e3c7241198) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Ensure `storage` and `theme` store values aren't shared between GraphiQL instances. Deprecate `useTheme` and `useStorage` hooks in favour of values from `useGraphiQL` and `useGraphiQLActions` hooks\n\n  feat(`@graphiql/plugin-history`/`@graphiql/plugin-doc-explorer`): move `@graphiql/react` to `peerDependencies`\n\n- [#4077](https://github.com/graphql/graphiql/pull/4077) [`3d41e11`](https://github.com/graphql/graphiql/commit/3d41e113fbf53930fd1b519b6d1330d0f4b23b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add new example [Usage GraphiQL 5 with Vite, React Router and `ssr: true`](https://github.com/graphql/graphiql/tree/main/examples/example-graphiql-vite-react-router)\n\n### Patch Changes\n\n- [#4076](https://github.com/graphql/graphiql/pull/4076) [`416e3a0`](https://github.com/graphql/graphiql/commit/416e3a05e9473eb2abd444da61ecfb8614020d14) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix broken `useOperationsEditorState` and `useEditorState` hook and add unit tests\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd)]:\n  - monaco-graphql@1.7.2\n  - graphql-language-service@5.5.0\n\n## 0.35.6\n\n### Patch Changes\n\n- [#4069](https://github.com/graphql/graphiql/pull/4069) [`142f3f2`](https://github.com/graphql/graphiql/commit/142f3f2529c668aa1a6ba2f7269cf4b7e2fd3e61) Thanks [@dimaMachina](https://github.com/dimaMachina)! - reduce bundle size, import `prettier` dynamically to avoid bundling Prettier\n\n  diff from vite example\n\n  ```diff\n  -dist/assets/index-BMgFrxsd.js             4,911.53 kB │ gzip: 1,339.77 kB\n  +dist/assets/index-BlpzusGL.js             4,221.28 kB │ gzip: 1,145.58 kB\n  ```\n\n## 0.35.5\n\n### Patch Changes\n\n- [#4063](https://github.com/graphql/graphiql/pull/4063) [`44b18e4`](https://github.com/graphql/graphiql/commit/44b18e4ed054d757568b5cfedc43614fd7ea3fc9) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix `useOperationsEditorState` wasn't returned updated return value\n\n## 0.35.4\n\n### Patch Changes\n\n- [#4052](https://github.com/graphql/graphiql/pull/4052) [`9b54581`](https://github.com/graphql/graphiql/commit/9b54581e74a7e6c6354a810c2288869fb85f24eb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix multiple GraphiQL instances, suffix a unique id for operation, request headers, variables and response URI.\n\n  E.g., the first GraphiQL instance will have:\n\n  - `1-operation.graphql`\n  - `1-request-headers.json`\n  - `1-variables.json`\n  - `1-response.json`\n\n  The 2nd instance will have:\n\n  - `2-operation.graphql`\n  - `2-request-headers.json`\n  - `2-variables.json`\n  - `2-response.json`\n\n  etc.\n\n- [#4049](https://github.com/graphql/graphiql/pull/4049) [`2c0586d`](https://github.com/graphql/graphiql/commit/2c0586d1f3db8fe8dc604032010cc9840d10b72d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - use `allowTrailingComma` option in jsonc parser to make `tryParseJsonObject` sync\n\n  - parse introspection headers with jsonc parser\n  - use prettier format for operation editor since we already use prettier for jsonc editors\n\n- [#4050](https://github.com/graphql/graphiql/pull/4050) [`002f133`](https://github.com/graphql/graphiql/commit/002f1336db4bdafa01cff1964a1b56ba858699eb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix can't access property \"jsonDefaults\"\n\n## 0.35.3\n\n### Patch Changes\n\n- [#4046](https://github.com/graphql/graphiql/pull/4046) [`8b56462`](https://github.com/graphql/graphiql/commit/8b564625b2470652db3c27dc70b0f85d5bbc3a0f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Enable font ligatures in monaco-editors fix incorrect caret position on Windows\n\n## 0.35.2\n\n### Patch Changes\n\n- [#4044](https://github.com/graphql/graphiql/pull/4044) [`68b347c`](https://github.com/graphql/graphiql/commit/68b347c78faa80cc00397fc1705dbf114c1f374b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix `Fixes Uncaught Error: can't access property \"offsetNode\", hitResult is null` on Mozilla\n\n## 0.35.1\n\n### Patch Changes\n\n- [#4037](https://github.com/graphql/graphiql/pull/4037) [`e548574`](https://github.com/graphql/graphiql/commit/e548574101313349ffa11e6b5a36d1f68be3679c) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix execute button becomes unstyled if there are several queries present\n\n## 0.35.0\n\n### Minor Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3999](https://github.com/graphql/graphiql/pull/3999) [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update graphiql-cdn example to show how to load workers with esm.sh\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n- [#4005](https://github.com/graphql/graphiql/pull/4005) [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - support `externalFragments` prop and remove `validationRules` prop\n\n- [#4003](https://github.com/graphql/graphiql/pull/4003) [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `readOnly` prop\n  document `keyMap` prop was removed in migration guide\n\n- [#3735](https://github.com/graphql/graphiql/pull/3735) [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - Remove `query`, `variables`, `headers`, and `response` props from `<GraphiQL />` and `<GraphiQLProvider />`\n\n  - Add `initialQuery`, `initialVariables` and `initialHeaders` props\n  - Fix `defaultQuery`, when is set will only be used for the first tab. When opening more tabs, the query editor will start out empty\n  - remove `useSynchronizeValue` hook\n\n- [#4017](https://github.com/graphql/graphiql/pull/4017) [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - extract graphiql sidebar to react component\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- [#4011](https://github.com/graphql/graphiql/pull/4011) [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix execute query shortcut in query editor, run it even there are no operations in query editor\n\n  fix plugin store, save last opened plugin in storage\n\n- [#4014](https://github.com/graphql/graphiql/pull/4014) [`4b39f11`](https://github.com/graphql/graphiql/commit/4b39f1118d008c2fac6e2df9c94a3f3271c4eeb9) Thanks [@dimaMachina](https://github.com/dimaMachina)! - extract storage key constants\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n\n### Patch Changes\n\n- [#4020](https://github.com/graphql/graphiql/pull/4020) [`3c0ad34`](https://github.com/graphql/graphiql/commit/3c0ad34a8f2f9d0f912db9597f608d7405c2bd83) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - run cypress tests in React strict mode\n  - fix `defaultQuery` with empty string does not result in an empty default query\n  - fix `useDidUpdate` in React strict mode\n- Updated dependencies [[`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d)]:\n  - monaco-graphql@1.7.1\n\n## 0.35.0-rc.9\n\n### Minor Changes\n\n- [#3735](https://github.com/graphql/graphiql/pull/3735) [`0a08642`](https://github.com/graphql/graphiql/commit/0a0864268da4f340e30a1e9b8191d34e33ffbfa7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - Remove `query`, `variables`, `headers`, and `response` props from `<GraphiQL />` and `<GraphiQLProvider />`\n  - Add `initialQuery`, `initialVariables` and `initialHeaders` props\n  - Fix `defaultQuery`, when is set will only be used for the first tab. When opening more tabs, the query editor will start out empty\n  - remove `useSynchronizeValue` hook\n\n## 0.35.0-rc.8\n\n### Minor Changes\n\n- [#4025](https://github.com/graphql/graphiql/pull/4025) [`6a50740`](https://github.com/graphql/graphiql/commit/6a507407c7c63bfc779ad383054ab3a8c003ef5b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set \"importsNotUsedAsValues\": \"error\" in tsconfig\n\n- [#4026](https://github.com/graphql/graphiql/pull/4026) [`7fb5ac3`](https://github.com/graphql/graphiql/commit/7fb5ac38b8ec27f0234adc06aacf42e71f6a259b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - deprecate `useExplorerContext`, `useHistoryContext`, `usePrettifyEditors`, `useCopyQuery`, `useMergeQuery`, `useExecutionContext`, `usePluginContext`, `useSchemaContext`, `useStorageContext` hooks\n  - fix response editor overflow on `<GraphiQL.Footer />`\n  - export `GraphiQLProps` type\n  - allow `children: ReactNode` for `<GraphiQL.Toolbar />`\n  - change `ToolbarMenu` component:\n    - The `label` and `className` props were removed\n    - The `button` prop should now be a button element\n  - document `useGraphiQL` and `useGraphiQLActions` hooks in `@graphiql/react` README.md\n  - rename `useThemeStore` to `useTheme`\n\n## 0.35.0-rc.7\n\n### Patch Changes\n\n- [#4020](https://github.com/graphql/graphiql/pull/4020) [`3c0ad34`](https://github.com/graphql/graphiql/commit/3c0ad34a8f2f9d0f912db9597f608d7405c2bd83) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - run cypress tests in React strict mode\n  - fix `defaultQuery` with empty string does not result in an empty default query\n  - fix `useDidUpdate` in React strict mode\n\n## 0.35.0-rc.6\n\n### Minor Changes\n\n- [#4017](https://github.com/graphql/graphiql/pull/4017) [`cff3da5`](https://github.com/graphql/graphiql/commit/cff3da541184d36d1c2e5c919dd4231e9905ccbb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - extract graphiql sidebar to react component\n\n## 0.35.0-rc.5\n\n### Minor Changes\n\n- [#4014](https://github.com/graphql/graphiql/pull/4014) [`4b39f11`](https://github.com/graphql/graphiql/commit/4b39f1118d008c2fac6e2df9c94a3f3271c4eeb9) Thanks [@dimaMachina](https://github.com/dimaMachina)! - extract storage key constants\n\n## 0.35.0-rc.4\n\n### Minor Changes\n\n- [#4011](https://github.com/graphql/graphiql/pull/4011) [`30bc3f9`](https://github.com/graphql/graphiql/commit/30bc3f9cae4dbb11649a0952dad092e192ad653c) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix execute query shortcut in query editor, run it even there are no operations in query editor\n\n  fix plugin store, save last opened plugin in storage\n\n## 0.35.0-rc.3\n\n### Minor Changes\n\n- [#4009](https://github.com/graphql/graphiql/pull/4009) [`4936492`](https://github.com/graphql/graphiql/commit/49364924d0da05a86f7c6c3139d44aed0e474531) Thanks [@dimaMachina](https://github.com/dimaMachina)! - separate store actions from state, add `useGraphiQLActions` state\n\n## 0.35.0-rc.2\n\n### Minor Changes\n\n- [#3999](https://github.com/graphql/graphiql/pull/3999) [`866a8f3`](https://github.com/graphql/graphiql/commit/866a8f39a27d213315ccc55ec06353bb3280b270) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update graphiql-cdn example to show how to load workers with esm.sh\n\n- [#4005](https://github.com/graphql/graphiql/pull/4005) [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - support `externalFragments` prop and remove `validationRules` prop\n\n- [#4003](https://github.com/graphql/graphiql/pull/4003) [`0c8e390`](https://github.com/graphql/graphiql/commit/0c8e3906cf58055f898cb173b2e912a494ae8439) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `readOnly` prop\n  document `keyMap` prop was removed in migration guide\n\n### Patch Changes\n\n- Updated dependencies [[`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d)]:\n  - monaco-graphql@1.7.1-rc.0\n\n## 0.35.0-rc.1\n\n### Minor Changes\n\n- [#3990](https://github.com/graphql/graphiql/pull/3990) [`27e7eb6`](https://github.com/graphql/graphiql/commit/27e7eb60247437d992c1fcdcc6870cb7892d4b92) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - allow multiple independent instances of GraphiQL on the same page\n  - store `onClickReference` in query editor in React `ref`\n  - remove `onClickReference` from variable editor\n  - fix shortcut text per OS for run query in execute query button's tooltip and in default query\n  - allow override all default GraphiQL plugins\n  - adjust operation argument color to be purple from GraphiQL v2 on dark/light theme\n\n## 0.35.0-rc.0\n\n### Minor Changes\n\n- [#3949](https://github.com/graphql/graphiql/pull/3949) [`0844dc1`](https://github.com/graphql/graphiql/commit/0844dc1ca89a5d8fce0dc23658cca6987ff8443e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - replace `onCopyQuery` hook with `copyQuery` function\n\n  - replace `onMergeQuery` hook with `mergeQuery` function\n  - replace `onPrettifyEditors` hook with `prettifyEditors` function\n  - remove `fetcher` prop from `SchemaContextProvider` and `schemaStore` and add `fetcher` to `executionStore`\n  - add `onCopyQuery` and `onPrettifyQuery` props to `EditorContextProvider`\n  - remove exports (use `GraphiQLProvider`)\n    - `EditorContextProvider`\n    - `ExecutionContextProvider`\n    - `PluginContextProvider`\n    - `SchemaContextProvider`\n    - `StorageContextProvider`\n    - `ExecutionContextType`\n    - `PluginContextType`\n  - feat(@graphiql/react): migrate React context to zustand:\n    - replace `useExecutionContext` with `useExecutionStore` hook\n    - replace `useEditorContext` with `useEditorStore` hook\n  - prefer `getComputedStyle` over `window.getComputedStyle`\n\n- [#3234](https://github.com/graphql/graphiql/pull/3234) [`86a96e5`](https://github.com/graphql/graphiql/commit/86a96e5f1779b5d0e84ad4179dbd6c5d4947fb91) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Migration from Codemirror to [Monaco Editor](https://github.com/microsoft/monaco-editor)\n\n  Replacing `codemirror-graphql` with [`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\n\n  Support for comments in **Variables** and **Headers** editors\n\n- [#3950](https://github.com/graphql/graphiql/pull/3950) [`2455907`](https://github.com/graphql/graphiql/commit/245590708cea52ff6f1bcce8664781f7e56029cb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove `useQueryEditor`, `useVariableEditor`, `useHeaderEditor`, `useResponseEditor` hooks\n  - remove `UseHeaderEditorArgs`, `UseQueryEditorArgs`, `UseResponseEditorArgs`, `UseVariableEditorArgs` exports\n  - rename components\n    - `StorageContextProvider` => `StorageStore`\n    - `EditorContextProvider` => `EditorStore`\n    - `SchemaContextProvider` => `SchemaStore`\n    - `ExecutionContextProvider` => `ExecutionStore`\n    - `HistoryContextProvider` => `HistoryStore`\n    - `ExplorerContextProvider` => `ExplorerStore`\n\n## 0.34.1\n\n### Patch Changes\n\n- [#3970](https://github.com/graphql/graphiql/pull/3970) [`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - revert https://github.com/graphql/graphiql/pull/3946 to have support multiple embedded graphiql instances on the same page\n\n- Updated dependencies [[`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7)]:\n  - @graphiql/toolkit@0.11.3\n\n## 0.34.0\n\n### Minor Changes\n\n- [#3946](https://github.com/graphql/graphiql/pull/3946) [`71755b7`](https://github.com/graphql/graphiql/commit/71755b7f412f8f3dd9f5194d3f1e0168b9ad07af) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand:\n  - replace `useExecutionContext` with `useExecutionStore` hook\n  - replace `useEditorContext` with `useEditorStore` hook\n  - replace `useAutoCompleteLeafs` hook with `getAutoCompleteLeafs` function\n\n### Patch Changes\n\n- [#3963](https://github.com/graphql/graphiql/pull/3963) [`6d631e2`](https://github.com/graphql/graphiql/commit/6d631e2e558d038476fe235b1506bc52ecf68781) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix headers are not set in the refetch of introspection query\n\n## 0.33.0\n\n### Minor Changes\n\n- [#3945](https://github.com/graphql/graphiql/pull/3945) [`117627b`](https://github.com/graphql/graphiql/commit/117627b451607198dd7b9dc19e76da8a71d14b71) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `usePluginContext` with `usePluginStore` hook\n\n- [#3947](https://github.com/graphql/graphiql/pull/3947) [`fa78481`](https://github.com/graphql/graphiql/commit/fa784819ce020346052901019079fb5b44af6ef0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - refactor `useStorage`, `useDocExplorer` and `useHistory` hooks\n\n- [#3943](https://github.com/graphql/graphiql/pull/3943) [`7275472`](https://github.com/graphql/graphiql/commit/727547236bbd4fc721069ceae63eb8a6acffa57e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useSchemaContext` with `useSchemaStore` hook\n\n- [#3942](https://github.com/graphql/graphiql/pull/3942) [`00c8605`](https://github.com/graphql/graphiql/commit/00c8605e1f3068e6547a5a9e969571a86a57f921) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(@graphiql/react): migrate React context to zustand, replace `useStorageContext` with `useStorage` hook\n\n## 0.32.2\n\n### Patch Changes\n\n- [#3936](https://github.com/graphql/graphiql/pull/3936) [`2bfbb06`](https://github.com/graphql/graphiql/commit/2bfbb06e416cabc46951a137b61a12a571f0c937) Thanks [@dimaMachina](https://github.com/dimaMachina)! - add scroll-x to graphiql tabs area\n\n- [#3939](https://github.com/graphql/graphiql/pull/3939) [`69ad489`](https://github.com/graphql/graphiql/commit/69ad489678d0096432d5c4b1749d87343f4ed1f7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `React.FC` type when declaring React components\n\n- [#3937](https://github.com/graphql/graphiql/pull/3937) [`2500288`](https://github.com/graphql/graphiql/commit/250028863f6eefe4167ff9f9c23168ccf0a85b7b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `Warning: useLayoutEffect does nothing on the server, because its effect cannot be encoded into the server renderer's output format` warnings on SSR\n\n## 0.32.1\n\n### Patch Changes\n\n- [#3929](https://github.com/graphql/graphiql/pull/3929) [`96dcbdf`](https://github.com/graphql/graphiql/commit/96dcbdfae25a10de668cdcb6826fd0cb857a361b) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix: `ReferenceError: window is not defined` when using with SSR\n\n## 0.32.0\n\n### Minor Changes\n\n- [#3916](https://github.com/graphql/graphiql/pull/3916) [`98d13a3`](https://github.com/graphql/graphiql/commit/98d13a3e515eb70aaf5a5ba669c680d5959fef67) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove the following exports from `@graphiql/react` and move them in `@graphiql/plugin-doc-explorer` package:\n\n  - Argument\n  - DefaultValue\n  - DeprecationReason\n  - Directive\n  - DocExplorer\n  - ExplorerContext\n  - ExplorerContextProvider\n  - ExplorerSection\n  - FieldDocumentation\n  - FieldLink\n  - SchemaDocumentation\n  - Search\n  - TypeDocumentation\n  - TypeLink\n  - useExplorerContext\n  - DOC_EXPLORER_PLUGIN\n  - ExplorerContextType\n  - ExplorerFieldDef\n  - ExplorerNavStack\n  - ExplorerNavStackItem\n  - add new `referencePlugin` prop on `PluginContextProviderProps` component for plugin which is used to display the reference documentation when selecting a type.\n\n## 0.31.0\n\n### Minor Changes\n\n- [#3911](https://github.com/graphql/graphiql/pull/3911) [`e7c436b`](https://github.com/graphql/graphiql/commit/e7c436b329a68981bdbd2b662be94875a546a1d6) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - export `cn` from `@graphiql/react`\n\n  - remove following exports from `@graphiql/react` and move them in `@graphiql/plugin-history` package:\n    - `History`\n    - `HistoryContext`\n    - `HistoryContextType`\n    - `HistoryContextProvider`\n    - `useHistoryContext`\n    - `HISTORY_PLUGIN`\n  - remove types from `@graphiql/react` (use `ComponentProps<typeof MyContextProviderProps>` instead):\n    - `HistoryContextProviderProps`\n    - `ExecutionContextProviderProps`\n    - `EditorContextProviderProps`\n    - `ExplorerContextProviderProps`\n    - `PluginContextProviderProps`\n    - `SchemaContextProviderProps`\n    - `StorageContextProviderProps`\n    - `GraphiQLProviderProps`\n\n## 0.30.0\n\n### Minor Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Add support for `onPrettifyQuery` callback to enable customised query formatting\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Update GraphiQL CDN example using ESM-based CDN esm.sh\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - drop commonjs build files\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - generate types with `vite-plugin-dts`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - support react 19, drop support react 16 and react 17\n\n  - replace deprecated `ReactDOM.unmountComponentAtNode()` and `ReactDOM.render()` with `root.unmount()` and `createRoot(container).render()`\n  - update `@radix-ui` and `@headlessui/react` dependencies\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - `style.css` import was changed\n\n  ## Migration\n\n  ```diff\n  -import '@graphiql/react/dist/style.css';\n  +import '@graphiql/react/style.css';\n  ```\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update `vite` and related dependencies\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `createComponentGroup` utility in favour `Object.assign`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - new looks of tabs\n\n  - fix `disableTabs` when `Add tab` button is still shown\n\n### Patch Changes\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Respect Markdown format: ignore single newline\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `vite build --watch` instead of `vite` for `dev` script because we don't need development server for them\n\n  do not use `vite-plugin-dts` when generating umd build\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace `overflow-y: scroll` with `overflow-y: auto`\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - rollback `position: absolute` style for `.graphiql-logo` because tabs will behind logo\n\n- [#3904](https://github.com/graphql/graphiql/pull/3904) [`d1395f9`](https://github.com/graphql/graphiql/commit/d1395f987b3f9c70b69ec5ad7283c63594dd7602) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - prefer `location` over `window.location`\n  - prefer `navigator` over `window.navigator`\n\n## 1.0.0-alpha.4\n\n### Minor Changes\n\n- [#3733](https://github.com/graphql/graphiql/pull/3733) [`8dbddb5`](https://github.com/graphql/graphiql/commit/8dbddb50273720d76f895af6b783b04204c68e03) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Add support for `onPrettifyQuery` callback to enable customised query formatting\n\n## 1.0.0-alpha.3\n\n### Patch Changes\n\n- [#3414](https://github.com/graphql/graphiql/pull/3414) [`f8b719f`](https://github.com/graphql/graphiql/commit/f8b719f215a79038d1b2a54ddfef461fd849a912) Thanks [@leonardehrenfried](https://github.com/leonardehrenfried)! - Respect Markdown format: ignore single newline\n\n- [#3730](https://github.com/graphql/graphiql/pull/3730) [`360a038`](https://github.com/graphql/graphiql/commit/360a0385d4ef0105beb8e76044a78f5cd43c9448) Thanks [@dimaMachina](https://github.com/dimaMachina)! - rollback `position: absolute` style for `.graphiql-logo` because tabs will behind logo\n\n## 1.0.0-alpha.2\n\n### Patch Changes\n\n- [#3720](https://github.com/graphql/graphiql/pull/3720) [`79f3abf`](https://github.com/graphql/graphiql/commit/79f3abf9b697c448442e32eb5a21b7ff720bc242) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace `overflow-y: scroll` with `overflow-y: auto`\n\n## 1.0.0-alpha.1\n\n### Minor Changes\n\n- [#3717](https://github.com/graphql/graphiql/pull/3717) [`bf0c4e7`](https://github.com/graphql/graphiql/commit/bf0c4e7236f4a68448063aa0c6a4ed439e869a9f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove `createComponentGroup` utility in favour `Object.assign`\n\n## 1.0.0-alpha.0\n\n### Major Changes\n\n- [#3709](https://github.com/graphql/graphiql/pull/3709) [`9baf1f0`](https://github.com/graphql/graphiql/commit/9baf1f0fc9f32404fbb8bf57b3d1c2c2c8778ddb) Thanks [@dimaMachina](https://github.com/dimaMachina)! - `style.css` import was changed\n\n  ## Migration\n\n  ```diff\n  -import '@graphiql/react/dist/style.css';\n  +import '@graphiql/react/style.css';\n  ```\n\n### Minor Changes\n\n- [#3702](https://github.com/graphql/graphiql/pull/3702) [`00415d2`](https://github.com/graphql/graphiql/commit/00415d2940c4d76a4a9e683e9fa0504ba97dd627) Thanks [@dimaMachina](https://github.com/dimaMachina)! - generate types with `vite-plugin-dts`\n\n- [#3644](https://github.com/graphql/graphiql/pull/3644) [`3c1a345`](https://github.com/graphql/graphiql/commit/3c1a345acd9bf07b45bc230009cb57c51c425673) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - new looks of tabs\n\n  - fix `disableTabs` when `Add tab` button is still shown\n\n### Patch Changes\n\n- [#3705](https://github.com/graphql/graphiql/pull/3705) [`8ff87d7`](https://github.com/graphql/graphiql/commit/8ff87d7b6b3d5d12b539612a39ca3abf7e631106) Thanks [@dimaMachina](https://github.com/dimaMachina)! - use `vite build --watch` instead of `vite` for `dev` script because we don't need development server for them\n\n  do not use `vite-plugin-dts` when generating umd build\n\n- [#3692](https://github.com/graphql/graphiql/pull/3692) [`82bc961`](https://github.com/graphql/graphiql/commit/82bc961a33c4e9da29dffb4a603035a4909f49ad) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - prefer `location` over `window.location`\n  - prefer `navigator` over `window.navigator`\n\n## 0.29.0\n\n### Minor Changes\n\n- [#3826](https://github.com/graphql/graphiql/pull/3826) [`cb29e9f`](https://github.com/graphql/graphiql/commit/cb29e9fbe1362778bc327513fc884c4ec419775e) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - remove react compiler custom patch\n  - update `react-compiler-runtime` to use `19.1.0-rc.1` version\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n- Updated dependencies [[`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - graphql-language-service@5.3.1\n  - codemirror-graphql@2.2.1\n  - @graphiql/toolkit@0.11.2\n\n## 0.28.2\n\n### Patch Changes\n\n- [#3843](https://github.com/graphql/graphiql/pull/3843) [`16b5698`](https://github.com/graphql/graphiql/commit/16b56982ce4de62c850380fe25698c3893551c5a) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix regression in documentation explorer search when clicking on results in dropdown\n\n## 0.28.1\n\n### Patch Changes\n\n- [#3837](https://github.com/graphql/graphiql/pull/3837) [`5e76a4f`](https://github.com/graphql/graphiql/commit/5e76a4f3c8b089a1de0c92c9b9c1edc2ae3f49d4) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix query builder updated only first selected field in query editor due recent enabled react-compiler\n\n## 0.28.0\n\n### Minor Changes\n\n- [#3821](https://github.com/graphql/graphiql/pull/3821) [`3633d61`](https://github.com/graphql/graphiql/commit/3633d61c3c597adf60c0ec1bbf98cf6a1f49beed) Thanks [@dimaMachina](https://github.com/dimaMachina)! - compile source code with react-compiler, remove `useMemo` and `useCallback` usages\n\n## 0.27.1\n\n### Patch Changes\n\n- [#3824](https://github.com/graphql/graphiql/pull/3824) [`72f06bc`](https://github.com/graphql/graphiql/commit/72f06bc52a9bdc0cb146d65861ba7364717bbdf5) Thanks [@dimaMachina](https://github.com/dimaMachina)! - Exclude `codemirror/...` and `codemirror-graphql/...` imports from bundle\n\n- Updated dependencies [[`7cdcabf`](https://github.com/graphql/graphiql/commit/7cdcabf9d401683e90c995476b187c6f8ea70f63)]:\n  - codemirror-graphql@2.2.0\n\n## 0.27.0\n\n### Minor Changes\n\n- [#3806](https://github.com/graphql/graphiql/pull/3806) [`f86e2bc`](https://github.com/graphql/graphiql/commit/f86e2bce40826b3d07755f91b37a72051de00f9c) Thanks [@simmerer](https://github.com/simmerer)! - Fix: removed deprecated usage of Fn.prototype.caller\n\n## 0.26.2\n\n### Patch Changes\n\n- [#3751](https://github.com/graphql/graphiql/pull/3751) [`b8538d8`](https://github.com/graphql/graphiql/commit/b8538d87421edb086b32d4eb2e30a3f7d9d9e893) Thanks [@dimaMachina](https://github.com/dimaMachina)! - replace deprecated `navigator.platform` with `navigator.userAgent`\n\n  fix placeholder `⌘ K` in doc explorer search input for non mac devices, replace by `Ctrl K`\n\n- Updated dependencies [[`b8538d8`](https://github.com/graphql/graphiql/commit/b8538d87421edb086b32d4eb2e30a3f7d9d9e893)]:\n  - codemirror-graphql@2.1.1\n\n## 0.26.1\n\n### Patch Changes\n\n- [#3743](https://github.com/graphql/graphiql/pull/3743) [`7275c19`](https://github.com/graphql/graphiql/commit/7275c19b174f06bd031f49b33912c1babf29ccb0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - create instance of `new HistoryStore` and `new StorageAPI` only on mount, use function with `useState`\n\n- Updated dependencies [[`21c4409`](https://github.com/graphql/graphiql/commit/21c44096c0c0b23cea955a574d1110cb19ab6405), [`2ad4e75`](https://github.com/graphql/graphiql/commit/2ad4e7505385fefd252b9aa8ea2233cbaeca7f6a)]:\n  - @graphiql/toolkit@0.11.0\n\n## 0.26.0\n\n### Minor Changes\n\n- [#3619](https://github.com/graphql/graphiql/pull/3619) [`9aef83a`](https://github.com/graphql/graphiql/commit/9aef83a32aeb5f193a3ff0f191c95d09eb0d70b6) Thanks [@Yahkob](https://github.com/Yahkob)! - add new prop `defaultTheme` to set the default color preference theme\n\n### Patch Changes\n\n- [#3441](https://github.com/graphql/graphiql/pull/3441) [`959ed21`](https://github.com/graphql/graphiql/commit/959ed21815682fc439f64d78e23e603a8f313a6f) Thanks [@cimdalli](https://github.com/cimdalli)! - fix: set query editor to `defaultQuery` while adding a new tab or GraphiQL's default query\n\n  ```graphql\n  # Welcome to GraphiQL\n  #\n  # GraphiQL is an in-browser tool for writing, validating, and\n  # testing GraphQL queries.\n\n  ...\n  ```\n\n## 0.25.0\n\n### Minor Changes\n\n- [#3532](https://github.com/graphql/graphiql/pull/3532) [`7404e8e`](https://github.com/graphql/graphiql/commit/7404e8e6c62b06107f452142493297ec70f1649c) Thanks [@Cr4xy](https://github.com/Cr4xy)! - Add webp support to graphiql results image-preview\n\n## 0.24.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service@5.3.0\n  - codemirror-graphql@2.1.0\n  - @graphiql/toolkit@0.10.0\n\n## 0.23.1\n\n### Patch Changes\n\n- [#3552](https://github.com/graphql/graphiql/pull/3552) [`6a0a5e5`](https://github.com/graphql/graphiql/commit/6a0a5e590b7b526af8a66c59a27ec3d0144af572) Thanks [@klippx](https://github.com/klippx)! - do not clear `defaultHeaders` when switching between tabs upon reload\n\n## 0.23.0\n\n### Minor Changes\n\n- [#3657](https://github.com/graphql/graphiql/pull/3657) [`5bc7b84`](https://github.com/graphql/graphiql/commit/5bc7b84531b6404553787615d61a5cbcc96c1d6f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update vite to v5\n\n### Patch Changes\n\n- [#3637](https://github.com/graphql/graphiql/pull/3637) [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update eslint plugins and fix errors\n\n- [#3656](https://github.com/graphql/graphiql/pull/3656) [`93c7e9f`](https://github.com/graphql/graphiql/commit/93c7e9fd224cb4f1e9a86b3391efc1e0ef6e1e3f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - set `build.minify: false` for cjs/esm builds since minified variable names change every build time\n\n- Updated dependencies [[`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d), [`56c6f45`](https://github.com/graphql/graphiql/commit/56c6f4571dd0dfda307ed11c5afb8c837ad928b0)]:\n  - codemirror-graphql@2.0.13\n  - graphql-language-service@5.2.2\n  - @graphiql/toolkit@0.9.2\n\n## 0.22.4\n\n### Patch Changes\n\n- [#3634](https://github.com/graphql/graphiql/pull/3634) [`adf0ba01`](https://github.com/graphql/graphiql/commit/adf0ba019902dcac2e49ccee69b79a6665c4766d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - when alpha is `1`, use `hsl` instead of `hsla`\n\n## 0.22.3\n\n### Patch Changes\n\n- [#3624](https://github.com/graphql/graphiql/pull/3624) [`335d830c`](https://github.com/graphql/graphiql/commit/335d830c2a4e551ef97fbeff8ed7c538ff5cd4af) Thanks [@dimaMachina](https://github.com/dimaMachina)! - fix doc explorer search input is cut off while clicking on autocomplete results\n\n## 0.22.2\n\n### Patch Changes\n\n- [#3602](https://github.com/graphql/graphiql/pull/3602) [`03ab3a6b`](https://github.com/graphql/graphiql/commit/03ab3a6b76378591ef79a828d80cc69b0b8f2842) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Avoid using deprecated Component.defaultProps for icon titles\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service@5.2.1\n  - codemirror-graphql@2.0.12\n\n## 0.22.1\n\n### Patch Changes\n\n- [#3597](https://github.com/graphql/graphiql/pull/3597) [`224b43f5`](https://github.com/graphql/graphiql/commit/224b43f5473456f264a82998d48a34a441537f54) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix TypeScript type of the `label` prop of the `Tooltip` component\n\n## 0.22.0\n\n### Minor Changes\n\n- [#3580](https://github.com/graphql/graphiql/pull/3580) [`d48f4ef5`](https://github.com/graphql/graphiql/commit/d48f4ef56578dad7ec90f33458353791e463ef7b) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Implement correct merging of incremental responses (@defer/@stream)\n\n## 0.21.0\n\n### Minor Changes\n\n- [#3569](https://github.com/graphql/graphiql/pull/3569) [`5d051054`](https://github.com/graphql/graphiql/commit/5d05105469c3f0cbeb5e294da1cf6ff2355e4eb5) Thanks [@AaronMoat](https://github.com/AaronMoat)! - Update to markdown-it 14.x\n\n## 0.20.4\n\n### Patch Changes\n\n- Updated dependencies [[`fc7de5a7`](https://github.com/graphql/graphiql/commit/fc7de5a75f4b23dd62dd630b705895b5fa5d0a03)]:\n  - codemirror-graphql@2.0.11\n\n## 0.20.3\n\n### Patch Changes\n\n- [#3526](https://github.com/graphql/graphiql/pull/3526) [`2b6ea316`](https://github.com/graphql/graphiql/commit/2b6ea3166c8d8e152f16d87c878aa8a66f1b3775) Thanks [@benjie](https://github.com/benjie)! - Add new `useOptimisticState` hook that can wrap a useState-like hook to perform optimistic caching of state changes, this helps to avoid losing characters when the user is typing rapidly. Example of usage: `const [state, setState] = useOptimisticState(useOperationsEditorState());`\n\n## 0.20.2\n\n### Patch Changes\n\n- [#3447](https://github.com/graphql/graphiql/pull/3447) [`e89c432d`](https://github.com/graphql/graphiql/commit/e89c432d8d2b91f087b683360f23e0686462bc02) Thanks [@acao](https://github.com/acao)! - Remove initialState for new hooks, add `additionalComponent` to toolbar to allow buttons to use context\n\n## 0.20.1\n\n### Patch Changes\n\n- [#3445](https://github.com/graphql/graphiql/pull/3445) [`39bf31d1`](https://github.com/graphql/graphiql/commit/39bf31d15b1e7fb5f235ec9adc1ce8081536de4a) Thanks [@acao](https://github.com/acao)! - Export new hooks\n\n## 0.20.0\n\n### Minor Changes\n\n- [#3443](https://github.com/graphql/graphiql/pull/3443) [`f6afd22d`](https://github.com/graphql/graphiql/commit/f6afd22d3f5a20089759042f16fd865646a32038) Thanks [@acao](https://github.com/acao)! - Add useHeadersEditorState and generic useEditorState hooks\n\n## 0.19.4\n\n### Patch Changes\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n  - codemirror-graphql@2.0.10\n\n## 0.19.3\n\n### Patch Changes\n\n- [#3371](https://github.com/graphql/graphiql/pull/3371) [`2348641c`](https://github.com/graphql/graphiql/commit/2348641c07748691c478ac5f67032b7e9081f9cb) Thanks [@acao](https://github.com/acao)! - Solves #2825, an old bug where new tabs were created on every refresh\n\n  the bug occurred when:\n\n  1. `shouldPersistHeaders` is not set to true\n  2. `headers` or `defaultHeaders` are provided as props\n  3. the user refreshes the browser\n\n## 0.19.2\n\n### Patch Changes\n\n- [#3364](https://github.com/graphql/graphiql/pull/3364) [`d67c13f6`](https://github.com/graphql/graphiql/commit/d67c13f6e1f478b171801afd0767b98312db04c9) Thanks [@acao](https://github.com/acao)! - Fix search result bug on select, #33307\n\n- Updated dependencies [[`4cbdf183`](https://github.com/graphql/graphiql/commit/4cbdf18385d34ef9bc095c376936f92a62eb9e9b)]:\n  - @graphiql/toolkit@0.9.1\n\n## 0.19.1\n\n### Patch Changes\n\n- [#3349](https://github.com/graphql/graphiql/pull/3349) [`17069e7a`](https://github.com/graphql/graphiql/commit/17069e7a0224dbce3f5523630a898e093f5c47c9) Thanks [@acao](https://github.com/acao)! - fix display of deprecation reason on field type docs\n\n- [#3341](https://github.com/graphql/graphiql/pull/3341) [`e4a36207`](https://github.com/graphql/graphiql/commit/e4a362071edf1db53f87f271c523ab2f3a5c4717) Thanks [@acao](https://github.com/acao)! - Fix code exporter plugin on early init, add hooks\n\n- Updated dependencies [[`ffb6486d`](https://github.com/graphql/graphiql/commit/ffb6486d1eab0be2bc8fdec366b5671a5d6504d1)]:\n  - @graphiql/toolkit@0.9.0\n\n## 0.19.0\n\n### Minor Changes\n\n- [#3130](https://github.com/graphql/graphiql/pull/3130) [`9a38de29`](https://github.com/graphql/graphiql/commit/9a38de29fddf174ba9e793ac5852407537244f87) Thanks [@lesleydreyer](https://github.com/lesleydreyer)! - - Add a \"clear history\" button to clear all history as well as trash icons to clear individual history items\n\n  - Change so item is in history items or history favorites, not both\n  - Fix history label editing so if the same item is in the list more than once it edits the correct label\n  - Pass the entire history item in history functions (addToHistory, editLabel, toggleFavorite, etc.) so users building their own HistoryContext.Provider will get any additional props they added to the item in their customized functions\n  - Adds a \"setActive\" callback users can use to customize their UI when the history item is clicked\n\n## 0.18.0\n\n### Minor Changes\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - remove `initialTabs`, use `defaultTabs` instead\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/dialog` by `@radix-ui/react-dialog` replace `@reach/visually-hidden` by `@radix-ui/react-visually-hidden`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/menu-button` by `@radix-ui/react-dropdown-menu` remove `@reach/listbox` remove `<ToolbarListbox />` and `<Listbox />` components (use `<Menu />` instead)\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - fixed long list items in dropdown were hidden\n\n  rename `<Menu />` to `<DropdownMenu />` rename `<Menu.List />` to `<DropdownMenu.Content />` rename `<Menu.Item />` to `<DropdownMenu.Item />` rename `<Menu.Button />` to `<DropdownMenu.Button />`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/tooltip` by `@radix-ui/react-tooltip`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/combobox` with `Combobox` from `@headlessui/react`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - tabs could be reorderded\n\n### Patch Changes\n\n- [#2716](https://github.com/graphql/graphiql/pull/2716) [`bc9d243d`](https://github.com/graphql/graphiql/commit/bc9d243d40b95f95fc9d00d25aa0dd1733952626) Thanks [@SimenB](https://github.com/SimenB)! - Make `@types/codemirror` a dependency of `@graphiql/react`\n\n- [#3228](https://github.com/graphql/graphiql/pull/3228) [`67bf93a3`](https://github.com/graphql/graphiql/commit/67bf93a33e98c60ae3a686063a1c47037f88ef49) Thanks [@B2o5T](https://github.com/B2o5T)! - exclude peer dependencies and dependencies from bundle\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5), [`61986469`](https://github.com/graphql/graphiql/commit/619864691941c46cc0b0848e8713028e20212c36)]:\n  - graphql-language-service@5.1.7\n  - codemirror-graphql@2.0.9\n\n## 0.18.0-alpha.1\n\n### Patch Changes\n\n- [#2716](https://github.com/graphql/graphiql/pull/2716) [`bc9d243d`](https://github.com/graphql/graphiql/commit/bc9d243d40b95f95fc9d00d25aa0dd1733952626) Thanks [@SimenB](https://github.com/SimenB)! - Make `@types/codemirror` a dependency of `@graphiql/react`\n\n- [#3228](https://github.com/graphql/graphiql/pull/3228) [`67bf93a3`](https://github.com/graphql/graphiql/commit/67bf93a33e98c60ae3a686063a1c47037f88ef49) Thanks [@B2o5T](https://github.com/B2o5T)! - exclude peer dependencies and dependencies from bundle\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7-alpha.0\n  - codemirror-graphql@2.0.9-alpha.1\n\n## 0.18.0-alpha.0\n\n### Minor Changes\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - remove `initialTabs`, use `defaultTabs` instead\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/dialog` by `@radix-ui/react-dialog` replace `@reach/visually-hidden` by `@radix-ui/react-visually-hidden`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/menu-button` by `@radix-ui/react-dropdown-menu` remove `@reach/listbox` remove `<ToolbarListbox />` and `<Listbox />` components (use `<Menu />` instead)\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - fixed long list items in dropdown were hidden\n\n  rename `<Menu />` to `<DropdownMenu />` rename `<Menu.List />` to `<DropdownMenu.Content />` rename `<Menu.Item />` to `<DropdownMenu.Item />` rename `<Menu.Button />` to `<DropdownMenu.Button />`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/tooltip` by `@radix-ui/react-tooltip`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `@reach/combobox` with `Combobox` from `@headlessui/react`\n\n- [#3181](https://github.com/graphql/graphiql/pull/3181) [`9ac84bfc`](https://github.com/graphql/graphiql/commit/9ac84bfc7b847105565852a01bdca122319e3696) Thanks [@B2o5T](https://github.com/B2o5T)! - tabs could be reorderded\n\n### Patch Changes\n\n- Updated dependencies [[`61986469`](https://github.com/graphql/graphiql/commit/619864691941c46cc0b0848e8713028e20212c36)]:\n  - codemirror-graphql@2.0.9-alpha.0\n\n## 0.17.6\n\n### Patch Changes\n\n- [#3194](https://github.com/graphql/graphiql/pull/3194) [`911cf3e0`](https://github.com/graphql/graphiql/commit/911cf3e0b0fa13268245463c8db8299279e5c461) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - fix tab content getting replaced on `changeTab`\n\n- [#3124](https://github.com/graphql/graphiql/pull/3124) [`c645932c`](https://github.com/graphql/graphiql/commit/c645932c7973e11ad917e1d1d897fd409f8c042f) Thanks [@B2o5T](https://github.com/B2o5T)! - avoid unnecessary renders by using useMemo or useCallback\n\n- [#3197](https://github.com/graphql/graphiql/pull/3197) [`2ca4841b`](https://github.com/graphql/graphiql/commit/2ca4841baf74e87a3f067b3415f8da3347ee3898) Thanks [@B2o5T](https://github.com/B2o5T)! - remove confusing ligatures, set `font-variant-ligatures: none`\n\n- [#3136](https://github.com/graphql/graphiql/pull/3136) [`7bf90929`](https://github.com/graphql/graphiql/commit/7bf90929f62ba812c0946e0424f9f843f7b6b0ff) Thanks [@B2o5T](https://github.com/B2o5T)! - replace rest of `event.keyCode` usages by `event.code`\n\n- [#3118](https://github.com/graphql/graphiql/pull/3118) [`431b7fe1`](https://github.com/graphql/graphiql/commit/431b7fe1efefa4867f0ea617adc436b1117052e8) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer `.textContent` over `.innerText`\n\n## 0.17.5\n\n### Patch Changes\n\n- [#3147](https://github.com/graphql/graphiql/pull/3147) [`2b212941`](https://github.com/graphql/graphiql/commit/2b212941628498957d95ee89a7a5a0623f391b7a) Thanks [@Yahkob](https://github.com/Yahkob)! - limit code-mirror css scope to .graphiql-container\n\n- [#3180](https://github.com/graphql/graphiql/pull/3180) [`9b333a04`](https://github.com/graphql/graphiql/commit/9b333a047d6b75db7681f484156d8772e9f91810) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Remove duplicate Vite config and again make sure to not include `react/jsx-runtime` in the bundle\n\n## 0.17.4\n\n### Patch Changes\n\n- [#3077](https://github.com/graphql/graphiql/pull/3077) [`707f3cbc`](https://github.com/graphql/graphiql/commit/707f3cbca3ac2ce186058e7d2b145cdf69bf7d9c) Thanks [@Zolwiastyl](https://github.com/Zolwiastyl)! - show all schema types in explorer\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939)]:\n  - graphql-language-service@5.1.6\n  - codemirror-graphql@2.0.8\n\n## 0.17.3\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service@5.1.5\n  - codemirror-graphql@2.0.7\n\n## 0.17.2\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- [#3126](https://github.com/graphql/graphiql/pull/3126) [`4879984e`](https://github.com/graphql/graphiql/commit/4879984ea1803a6e9f97d81c97e8ba27aacddae9) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer KeyboardEvent#key over KeyboardEvent#keyCode\n\n- [#3109](https://github.com/graphql/graphiql/pull/3109) [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-floating-promises` eslint rule\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9), [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b), [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040)]:\n  - codemirror-graphql@2.0.6\n  - @graphiql/toolkit@0.8.4\n  - graphql-language-service@5.1.4\n\n## 0.17.1\n\n### Patch Changes\n\n- [#3033](https://github.com/graphql/graphiql/pull/3033) [`2d5c60ec`](https://github.com/graphql/graphiql/commit/2d5c60ecf717abafde2bddd32b2772261d3eec8b) Thanks [@B2o5T](https://github.com/B2o5T)! - remove redundant `catch` statement\n\n- [#3046](https://github.com/graphql/graphiql/pull/3046) [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer .at() method for index access\n\n- [#3017](https://github.com/graphql/graphiql/pull/3017) [`4a2284f5`](https://github.com/graphql/graphiql/commit/4a2284f54809f91d03ba51b9eb4e3ba7b8b7e773) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Avoid bundling code from `react/jsx-runtime` so that the package can be used with Preact\n\n- [#3042](https://github.com/graphql/graphiql/pull/3042) [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer String#slice() over String#substr() and String#substring()\n\n- [#3061](https://github.com/graphql/graphiql/pull/3061) [`7cf4908a`](https://github.com/graphql/graphiql/commit/7cf4908a5d4bd58af315047f4dec5236e8c701fc) Thanks [@B2o5T](https://github.com/B2o5T)! - remove unneeded `reference &&` assertion, convert to switch\n\n- Updated dependencies [[`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0)]:\n  - codemirror-graphql@2.0.5\n  - @graphiql/toolkit@0.8.3\n  - graphql-language-service@5.1.3\n\n## 0.17.0\n\n### Minor Changes\n\n- [#3012](https://github.com/graphql/graphiql/pull/3012) [`65f5176a`](https://github.com/graphql/graphiql/commit/65f5176a408cfbbc514ca60e2e4bd2ea133a8b0b) Thanks [@benjie](https://github.com/benjie)! - GraphiQL now maintains the DocExplorer navigation stack as best it can when the schema is updated\n\n### Patch Changes\n\n- [#2993](https://github.com/graphql/graphiql/pull/2993) [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4) Thanks [@B2o5T](https://github.com/B2o5T)! - add `unicorn/consistent-destructuring` rule\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n  - codemirror-graphql@2.0.4\n  - @graphiql/toolkit@0.8.2\n\n## 0.16.0\n\n### Minor Changes\n\n- [#2895](https://github.com/graphql/graphiql/pull/2895) [`ccba2f33`](https://github.com/graphql/graphiql/commit/ccba2f33b67a03f492222f7afde1354cfd033b42) Thanks [@TheMightyPenguin](https://github.com/TheMightyPenguin)! - Add user facing setting for persisting headers\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2964](https://github.com/graphql/graphiql/pull/2964) [`cec3fb2a`](https://github.com/graphql/graphiql/commit/cec3fb2a493c4a0c40df7dfad04e1a95ed35e786) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-export-from` rule\n\n- [#2932](https://github.com/graphql/graphiql/pull/2932) [`11e6ad11`](https://github.com/graphql/graphiql/commit/11e6ad11e745c671eb320731697887bb8d7177b7) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `compose.ts` with `clsx` for class concatenation\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- [#2933](https://github.com/graphql/graphiql/pull/2933) [`d502a33b`](https://github.com/graphql/graphiql/commit/d502a33b4332f1025e947c02d7cfdc5799365c8d) Thanks [@B2o5T](https://github.com/B2o5T)! - enable @typescript-eslint/no-unused-expressions\n\n- [#2965](https://github.com/graphql/graphiql/pull/2965) [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-optional-catch-binding` rule\n\n- [#2963](https://github.com/graphql/graphiql/pull/2963) [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `prefer-destructuring` rule\n\n- [#2942](https://github.com/graphql/graphiql/pull/2942) [`4ff2794c`](https://github.com/graphql/graphiql/commit/4ff2794c8b6032168e27252096cb276ce712878e) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `sonarjs/no-redundant-jump` rule\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de), [`695100bd`](https://github.com/graphql/graphiql/commit/695100bd317940ff3ffd8f56b54248c1dba1ac04), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171)]:\n  - codemirror-graphql@2.0.3\n  - @graphiql/toolkit@0.8.1\n  - graphql-language-service@5.1.1\n\n## 0.15.0\n\n### Minor Changes\n\n- [#2908](https://github.com/graphql/graphiql/pull/2908) [`3340fd74`](https://github.com/graphql/graphiql/commit/3340fd745e181ba8f1f5a6ed002a04d253a78d4a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Deprecate the `initialTabs` prop and add a `defaultTabs` props that supersedes it\n\n- [#2907](https://github.com/graphql/graphiql/pull/2907) [`3a7d0007`](https://github.com/graphql/graphiql/commit/3a7d00071922e2005777c92daf6ad0c1ce3e2816) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Clearly separate the fetching and subscription states for multipart requests (like subscriptions) and show the stop-button as long as the subscription is running\n\n### Patch Changes\n\n- [#2910](https://github.com/graphql/graphiql/pull/2910) [`16174a05`](https://github.com/graphql/graphiql/commit/16174a053ed89fb9554d096395ab7bf69c8f6911) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix autocomplete styles for field type and description on the right\n\n- [#2919](https://github.com/graphql/graphiql/pull/2919) [`f6cae4ea`](https://github.com/graphql/graphiql/commit/f6cae4eaa0258ea7fcde97ba6368830955f0abf4) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix overflow when there are lots of tabs that don't fit into the tab bar at once\n\n- [#2905](https://github.com/graphql/graphiql/pull/2905) [`0851d5f9`](https://github.com/graphql/graphiql/commit/0851d5f9ecf709597d0a698609d88f99c4395665) Thanks [@ccbrown](https://github.com/ccbrown)! - Fix: prevent default event for graphiql-doc-explorer-back link\n\n- [#2912](https://github.com/graphql/graphiql/pull/2912) [`83364b28`](https://github.com/graphql/graphiql/commit/83364b28020b5946ed58908d6d977f1de766e75d) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add missing effect dependency to make sure updates to the `defaultHeaders` prop have the desired effect\n\n## 0.14.0\n\n### Minor Changes\n\n- [#2821](https://github.com/graphql/graphiql/pull/2821) [`29630c22`](https://github.com/graphql/graphiql/commit/29630c2219bca8b825ab0897840864364a9de2e8) Thanks [@avaly](https://github.com/avaly)! - Initial tabs support\n\n### Patch Changes\n\n- [#2885](https://github.com/graphql/graphiql/pull/2885) [`8f926489`](https://github.com/graphql/graphiql/commit/8f9264896e9971951853463a283a90ba3d1310ef) Thanks [@simhnna](https://github.com/simhnna)! - Fix stop execution button showing a dropdown\n\n- [#2886](https://github.com/graphql/graphiql/pull/2886) [`2ba2f620`](https://github.com/graphql/graphiql/commit/2ba2f620b6e7de3ae6b5ea641f33e600f7f44e08) Thanks [@B2o5T](https://github.com/B2o5T)! - feat: add `defaultHeaders` prop\n\n## 0.13.7\n\n### Patch Changes\n\n- Updated dependencies [[`20869583`](https://github.com/graphql/graphiql/commit/20869583eff563f5d6494e93302a835f0e034f4b)]:\n  - codemirror-graphql@2.0.2\n\n## 0.13.6\n\n### Patch Changes\n\n- Updated dependencies [[`353f434e`](https://github.com/graphql/graphiql/commit/353f434e5f6bfd1bf6f8ee97d4ae8ce4f897085f)]:\n  - codemirror-graphql@2.0.1\n\n## 0.13.5\n\n### Patch Changes\n\n- [#2839](https://github.com/graphql/graphiql/pull/2839) [`682ad06e`](https://github.com/graphql/graphiql/commit/682ad06e58ded2f82fa973e8e6613dd654417fe2) Thanks [@ClemensSahs](https://github.com/ClemensSahs)! - Export the `PluginContextProvider` component\n\n## 0.13.4\n\n### Patch Changes\n\n- [#2824](https://github.com/graphql/graphiql/pull/2824) [`4e2f7ff9`](https://github.com/graphql/graphiql/commit/4e2f7ff99c578ceae54a1ae17c02088bd91b89c3) Thanks [@TheMightyPenguin](https://github.com/TheMightyPenguin)! - fix: prevent key down events when pressing escape to close autocomplete dialogs\n\n## 0.13.3\n\n### Patch Changes\n\n- [#2791](https://github.com/graphql/graphiql/pull/2791) [`42700076`](https://github.com/graphql/graphiql/commit/4270007671ce52f6c2250739916083611748b657) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Make sure that the info overlay in editors is shown above the vertical scrollbar\n\n* [#2792](https://github.com/graphql/graphiql/pull/2792) [`36839800`](https://github.com/graphql/graphiql/commit/36839800de128b05d11c262036c8240390c72a14) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Avoid resetting visible plugin state when explorer or history context changes\n\n- [#2778](https://github.com/graphql/graphiql/pull/2778) [`905f2e5e`](https://github.com/graphql/graphiql/commit/905f2e5ea3f0b304d27ea583e250ed4baff5016e) Thanks [@jonathanawesome](https://github.com/jonathanawesome)! - Adds a box-model reset for all children of the `.graphiql-container` class. This change facilitated another change to the `--sidebar-width` variable.\n\n## 0.13.2\n\n### Patch Changes\n\n- [#2653](https://github.com/graphql/graphiql/pull/2653) [`39b4668d`](https://github.com/graphql/graphiql/commit/39b4668d43176526d37ecf07d8c86901d53e0d80) Thanks [@dylanowen](https://github.com/dylanowen)! - Fix `fetchError` not being cleared when a new `fetcher` is used\n\n## 0.13.1\n\n### Patch Changes\n\n- Updated dependencies [[`e244b782`](https://github.com/graphql/graphiql/commit/e244b78291c2e2bb02d5753db82437926ebb4df4)]:\n  - @graphiql/toolkit@0.8.0\n\n## 0.13.0\n\n### Minor Changes\n\n- [#2735](https://github.com/graphql/graphiql/pull/2735) [`ca067d88`](https://github.com/graphql/graphiql/commit/ca067d88148c5d221d196790a997ad599038fad1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add CSS variables for color alpha values:\n  - `--alpha-secondary`: A color for supplementary text that should be read but not be the main focus\n  - `--alpha-tertiary`: A color for supplementary text which is optional to read, i.e. the UI would function without the user reading this text\n  - `--alpha-background-light`, `--alpha-background-medium` and `--alpha-background-heavy`: Three alpha values used for backgrounds and borders that have different intensity\n\n### Patch Changes\n\n- [#2757](https://github.com/graphql/graphiql/pull/2757) [`32a70065`](https://github.com/graphql/graphiql/commit/32a70065434eaa7733e28cda0ea0e7d51952e62a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Use different colors for field names and argument names\n\n- Updated dependencies [[`674bf3f8`](https://github.com/graphql/graphiql/commit/674bf3f8ff321dfb8471b0f6e5419bb77ddc94af)]:\n  - @graphiql/toolkit@0.7.3\n\n## 0.12.1\n\n### Patch Changes\n\n- Updated dependencies [[`bfa90f24`](https://github.com/graphql/graphiql/commit/bfa90f249be4f68049c1bb81abfb524ae623313f), [`8ab5fcd0`](https://github.com/graphql/graphiql/commit/8ab5fcd0a8399a0f8eb1b569751dd0e8390b9679)]:\n  - @graphiql/toolkit@0.7.2\n\n## 0.12.0\n\n### Minor Changes\n\n- [#2739](https://github.com/graphql/graphiql/pull/2739) [`98e14155`](https://github.com/graphql/graphiql/commit/98e14155c650ee7c5ac639e594eb47f0052b7fa9) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add `DocsFilledIcon` component and use show that icon in the sidebar when the docs plugin is visible\n\n### Patch Changes\n\n- [#2740](https://github.com/graphql/graphiql/pull/2740) [`7dfea94a`](https://github.com/graphql/graphiql/commit/7dfea94afc0cfe79b5080f10d840bfdce53f02d7) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Make SVG icon `stroke-width` consistent\n\n* [#2734](https://github.com/graphql/graphiql/pull/2734) [`3aa1f39f`](https://github.com/graphql/graphiql/commit/3aa1f39f6df559b54f703937ed510c8ba1f21058) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Stop propagating keyboard events too far upwards in the search component for the docs\n\n- [#2741](https://github.com/graphql/graphiql/pull/2741) [`0219eef3`](https://github.com/graphql/graphiql/commit/0219eef39146495749aca2487112db52fa3bb8fd) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add hover styles for buttons\n\n- Updated dependencies [[`48872a87`](https://github.com/graphql/graphiql/commit/48872a87e6edec0c301102baaf669ffcce043a13)]:\n  - @graphiql/toolkit@0.7.1\n\n## 0.11.1\n\n### Patch Changes\n\n- [#2712](https://github.com/graphql/graphiql/pull/2712) [`d65f00ea`](https://github.com/graphql/graphiql/commit/d65f00ea2d158cf532d1c71844630c5d9ec13410) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Make sure the back link and title are hidden when focussing the input field for searching the docs\n\n* [#2708](https://github.com/graphql/graphiql/pull/2708) [`f15ee38d`](https://github.com/graphql/graphiql/commit/f15ee38d56e4f749c145e0a17f0ed8e9a6096ac2) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix computing the initial state for editor values and tabs to avoid duplicating tabs on page reload\n\n- [#2712](https://github.com/graphql/graphiql/pull/2712) [`d65f00ea`](https://github.com/graphql/graphiql/commit/d65f00ea2d158cf532d1c71844630c5d9ec13410) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Make sure hidden editors don't overflow\n\n## 0.11.0\n\n### Minor Changes\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The `onHasCompletion` export has been removed as it is only meant to be used internally.\n\n* [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - Add new components:\n  - UI components (`Button`, `ButtonGroup`, `Dialog`, `Menu`, `Spinner`, `Tab`, `Tabs`, `Tooltip`, `UnStyledButton` and lots of icon components)\n  - Editor components (`QueryEditor`, `VariableEditor`, `HeaderEditor` and `ResponseEditor`)\n  - Toolbar components (`ExecuteButton`, `ToolbarButton`, `ToolbarMenu` and `ToolbarSelect`)\n  - Docs components (`Argument`, `DefaultValue`, `DeprecationReason`, `Directive`, `DocExplorer`, `ExplorerSection`, `FieldDocumentation`, `FieldLink`, `SchemaDocumentation`, `Search`, `TypeDocumentation` and `TypeLink`)\n  - `History` component\n  - A `GraphiQLProvider` component that renders all other existing provider components from `@graphiql/react` for ease of use\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: Add a new context provider for plugins. This induces changes to the following other contexts and their provider components:\n  - The property `isVisible` and the methods `hide` and `show` of the `ExplorerContext` have been removed. Also, the property `isVisible` and the methods `hide`, `show` and `toggle` of the `HistoryContext` have been removed. Visibility state of plugins is now part of the `PluginContext` using the `visiblePlugin` property. The visibility state can be altered using the `setVisiblePlugin` method of the `PluginContext`.\n  - The `isVisible` prop of the `ExplorerContextProvider` has been removed. For controlling the visibility state of plugins you can now use the `visiblePlugin` prop of the `PluginContextProvider`.\n  - The `onToggle` prop of the `HistoryContextProvider` and the `onToggleVisibility` prop of the `ExplorerContextProvider` have been removed. For listening on visibility changes for any plugin you can now use the `onTogglePluginVisibility` prop of the `PluginContextProvider`.\n\n* [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: The `ResponseTooltip` prop of the `ResponseEditor` has been renamed to `responseTooltip`\n\n### Patch Changes\n\n- Updated dependencies [[`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279), [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279)]:\n  - codemirror-graphql@2.0.0\n  - @graphiql/toolkit@0.7.0\n\n## 0.10.1\n\n### Patch Changes\n\n- Updated dependencies [[`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782)]:\n  - graphql-language-service@5.1.0\n  - codemirror-graphql@1.3.3\n\n## 0.10.0\n\n### Minor Changes\n\n- [#2651](https://github.com/graphql/graphiql/pull/2651) [`85d5af25`](https://github.com/graphql/graphiql/commit/85d5af25d77c29b7d02da90a431c8c15f610c22a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - BREAKING: The following context properties have been removed as they are only meant for internal use:\n  - The `subscription` property of the `ExecutionContext`\n  - The `setSchema` method of the `SchemaContext`\n  - The `setFetchError` method of the `SchemaContext`\n\n* [#2652](https://github.com/graphql/graphiql/pull/2652) [`6ff0bab9`](https://github.com/graphql/graphiql/commit/6ff0bab978d63778b8ab4ba6e79fceb36c2db87f) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - BREAKING: The `validationErrors` property of the `SchemaContext` is now always non-null. If the schema is valid then it will contain an empty list.\n\n- [#2644](https://github.com/graphql/graphiql/pull/2644) [`0aff68a6`](https://github.com/graphql/graphiql/commit/0aff68a645cceb6b9689e0f394e8bece01710efc) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - BREAKING: The `ResponseEditor` component no longer accepts the prop `value`. Instead you can now pass the prop `response` to the `EditorContextProvider`. This aligns it with the API design of the other editor components.\n\n## 0.9.0\n\n### Minor Changes\n\n- [#2642](https://github.com/graphql/graphiql/pull/2642) [`100af928`](https://github.com/graphql/graphiql/commit/100af9284de18ca89524c646e86854313c5d067b) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a new prop `operationName` to the `ExecutionContextProvider` component that controls the operation sent with the request\n\n* [#2642](https://github.com/graphql/graphiql/pull/2642) [`100af928`](https://github.com/graphql/graphiql/commit/100af9284de18ca89524c646e86854313c5d067b) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - BREAKING: The `ExecutionContextProvider` and `QueryEditor` components no longer accepts the `onEditOperationName` prop. Instead you can now pass this prop to the `EditorContextProvider` component.\n\n## 0.8.0\n\n### Minor Changes\n\n- [#2636](https://github.com/graphql/graphiql/pull/2636) [`62317e0b`](https://github.com/graphql/graphiql/commit/62317e0bae6d4ccf89d9e1e6607fd8feeb100078) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - BREAKING:\n  - The `ExecutionContextProvider` and `QueryEditor` components no longer accept the `externalFragments` prop. Instead the prop can now be passed to the `EditorContextProvider` component. The provider component will normalize the prop value and provide a map of type `Map<string, FragmentDefinitionNode>` (using the fragment names as keys) as part of the value of the `EditorContext`.\n  - The `QueryEditor` component no longer accept the `validationRules` prop. Instead the prop can now be passed to the `EditorContextProvider` component. The provider component will provide the list of validation rules (empty if there are none) as part of the value of the `EditorContext`.\n  - The `ExecutionContextProvider` and `HeaderEditor` components no longer accept the `shouldPersistHeaders` prop. Instead the `EditorContextProvider` component now provides the value of its equally named prop as part of the value of the `EditorContext`.\n\n## 0.7.1\n\n### Patch Changes\n\n- Updated dependencies [[`ea732ea8`](https://github.com/graphql/graphiql/commit/ea732ea8e12272c998f1467af8b3b88b6b508e12)]:\n  - @graphiql/toolkit@0.6.1\n\n## 0.7.0\n\n### Minor Changes\n\n- [#2618](https://github.com/graphql/graphiql/pull/2618) [`4c814506`](https://github.com/graphql/graphiql/commit/4c814506183579b78731659d871cd4b0ba93305a) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a method `introspect` to the schema context and provide a short key (`Shift-Ctrl-R`) for triggering introspection\n\n## 0.6.0\n\n### Minor Changes\n\n- [#2574](https://github.com/graphql/graphiql/pull/2574) [`0c98fa59`](https://github.com/graphql/graphiql/commit/0c98fa5924eadaee33713ccd8a9be6419d50cab1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Allow passing introspection data to the `schema` prop of the `SchemaContextProvider` component\n\n### Patch Changes\n\n- [#2574](https://github.com/graphql/graphiql/pull/2574) [`0c98fa59`](https://github.com/graphql/graphiql/commit/0c98fa5924eadaee33713ccd8a9be6419d50cab1) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Set the schema correctly after refetching introspection (e.g. when the `fetcher` prop changes)\n\n## 0.5.2\n\n### Patch Changes\n\n- [#2565](https://github.com/graphql/graphiql/pull/2565) [`f581b437`](https://github.com/graphql/graphiql/commit/f581b437e5bdab6f3ad817d230ee6d1b410bb591) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Don't invoke editor change callbacks when manually signaling \"empty\" changes.\n\n## 0.5.1\n\n### Patch Changes\n\n- [#2561](https://github.com/graphql/graphiql/pull/2561) [`08346cba`](https://github.com/graphql/graphiql/commit/08346cba136825341881f9dfefc62a60d748e0ee) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add missing effect dependencies to make sure editors are recreated when changing the `keyMap` prop\n\n## 0.5.0\n\n### Minor Changes\n\n- [#2541](https://github.com/graphql/graphiql/pull/2541) [`788d84ef`](https://github.com/graphql/graphiql/commit/788d84ef2784188981f1b4cfb78fba24153bf0cb) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add `onSchemaChange` callback prop to the `SchemaContextProvider` component\n\n### Patch Changes\n\n- [#2545](https://github.com/graphql/graphiql/pull/2545) [`8ce5b483`](https://github.com/graphql/graphiql/commit/8ce5b483ee190b5f5dd84eaf42e5d1359ce185e6) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Avoid top-level dynamic imports from `codemirror` that break importing the package in non-browser environments\n\n## 0.4.3\n\n### Patch Changes\n\n- [#2526](https://github.com/graphql/graphiql/pull/2526) [`26e44120`](https://github.com/graphql/graphiql/commit/26e44120a18d49af451c97619fe3386a65579e05) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add missing `caller` arguments to hook calls so that the error message printed when a context provider is missing is more accurate about the component or hook that caused the error\n\n## 0.4.2\n\n### Patch Changes\n\n- [#2501](https://github.com/graphql/graphiql/pull/2501) [`5437ee61`](https://github.com/graphql/graphiql/commit/5437ee61e1ba6cd28ccc1cb3543df1ea788278f4) Thanks [@acao](https://github.com/acao)! - Allow Codemirror 5 `keyMap` to be defined, default `vim` or `emacs` allowed in addition to the original default of `sublime`.\n\n- Updated dependencies [[`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - graphql-language-service@5.0.6\n  - codemirror-graphql@1.3.2\n\n## 0.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service@5.0.5\n  - codemirror-graphql@1.3.1\n\n## 0.4.0\n\n### Minor Changes\n\n- [#2461](https://github.com/graphql/graphiql/pull/2461) [`7dfe3ece`](https://github.com/graphql/graphiql/commit/7dfe3ece4e8ab6b3400888f7f357e394db63439d) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add `useDragResize` utility hook\n\n## 0.3.0\n\n### Minor Changes\n\n- [#2453](https://github.com/graphql/graphiql/pull/2453) [`1b41e33c`](https://github.com/graphql/graphiql/commit/1b41e33c4a871a345836de58f415b7c461ced1f8) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add execution context to `@graphiql/react` and move over the logic from `graphiql`\n\n* [#2452](https://github.com/graphql/graphiql/pull/2452) [`ee0fd8bf`](https://github.com/graphql/graphiql/commit/ee0fd8bf4042053ec647080b83656dc5e54a7239) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move tab state from `graphiql` into editor context from `@graphiql/react`\n\n- [#2449](https://github.com/graphql/graphiql/pull/2449) [`a0b02eda`](https://github.com/graphql/graphiql/commit/a0b02edaa629c6113c1c5518fd3aa05b355a1921) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Assume all context values are nullable and create hooks to consume individual contexts\n\n* [#2450](https://github.com/graphql/graphiql/pull/2450) [`1e6fc68b`](https://github.com/graphql/graphiql/commit/1e6fc68b73941544ee64e0499e459f9c7d39aa14) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Extract the `copy`, `merge`, `prettify`, and `autoCompleteLeafs` functions into hooks and remove these functions from the editor context value\n\n### Patch Changes\n\n- [#2451](https://github.com/graphql/graphiql/pull/2451) [`0659e96e`](https://github.com/graphql/graphiql/commit/0659e96e07f98d532619f29f52cba59e2d528327) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Always use the current value of the headers for the introspection request\n\n## 0.2.1\n\n### Patch Changes\n\n- [#2435](https://github.com/graphql/graphiql/pull/2435) [`89f0244f`](https://github.com/graphql/graphiql/commit/89f0244f7b7cdf01c168638a09f5137788401995) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix deriving default values for editors from storage\n\n* [#2437](https://github.com/graphql/graphiql/pull/2437) [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move prettify query functionality to editor context in `@graphiql/react`\n\n- [#2435](https://github.com/graphql/graphiql/pull/2435) [`89f0244f`](https://github.com/graphql/graphiql/commit/89f0244f7b7cdf01c168638a09f5137788401995) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic for deriving operation facts from the current query to `@graphiql/react` and store these facts as properties on the query editor instance\n\n* [#2448](https://github.com/graphql/graphiql/pull/2448) [`3dae62fc`](https://github.com/graphql/graphiql/commit/3dae62fc871385e148a799cde55a52a5e6b41d19) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - don't introspect the schema if it's provided via props\n\n- [#2437](https://github.com/graphql/graphiql/pull/2437) [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move copy query functionality to editor context in `@graphiql/react`\n\n* [#2437](https://github.com/graphql/graphiql/pull/2437) [`1f933505`](https://github.com/graphql/graphiql/commit/1f9335051fffc9e6a6f950b6f8060ed521b56789) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move merge query functionality to editor context in `@graphiql/react`\n\n- [#2436](https://github.com/graphql/graphiql/pull/2436) [`3e5295f0`](https://github.com/graphql/graphiql/commit/3e5295f0fd3b5f999643ea97e6cee706554f0b50) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Inline logic for clicking a reference to open the docs and remove the `onClickReference` and `onHintInformationRender` props of the editor components and hooks\n\n* [#2436](https://github.com/graphql/graphiql/pull/2436) [`3e5295f0`](https://github.com/graphql/graphiql/commit/3e5295f0fd3b5f999643ea97e6cee706554f0b50) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move visibility state for doc explorer from `graphiql` to the explorer context in `@graphiql/react`\n\n## 0.2.0\n\n### Minor Changes\n\n- [#2413](https://github.com/graphql/graphiql/pull/2413) [`8be164b1`](https://github.com/graphql/graphiql/commit/8be164b1e158d00752d6d3f30630a797d07d08c9) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a `StorageContext` and a `HistoryContext` to `@graphiql/react` that replaces the logic in the `graphiql` package\n\n* [#2420](https://github.com/graphql/graphiql/pull/2420) [`3467cd33`](https://github.com/graphql/graphiql/commit/3467cd33264e0766a0a43cf53e52ec371df26962) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a `SchemaContext` to `@graphiql/react` that replaces the logic for fetching and validating the schema in the `graphiql` package\n\n### Patch Changes\n\n- Updated dependencies [[`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e), [`8be164b1`](https://github.com/graphql/graphiql/commit/8be164b1e158d00752d6d3f30630a797d07d08c9), [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e), [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e)]:\n  - @graphiql/toolkit@0.6.0\n\n## 0.1.2\n\n### Patch Changes\n\n- [#2427](https://github.com/graphql/graphiql/pull/2427) [`ebc864f0`](https://github.com/graphql/graphiql/commit/ebc864f0ab05000758cb2898daaa73a2f15255ec) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Mark `graphql` as external dependency to avoid importing multiple instances\n\n* [#2427](https://github.com/graphql/graphiql/pull/2427) [`ebc864f0`](https://github.com/graphql/graphiql/commit/ebc864f0ab05000758cb2898daaa73a2f15255ec) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix linting by also updating the options object in the internal codemirror state\n\n## 0.1.1\n\n### Patch Changes\n\n- [#2423](https://github.com/graphql/graphiql/pull/2423) [`838e58da`](https://github.com/graphql/graphiql/commit/838e58dad652d8f5559af7b88d049b1c62348f2f) Thanks [@chentsulin](https://github.com/chentsulin)! - Fix peer dependency declaration by using `||` instead of `|` to link multiple major versions\n\n## 0.1.0\n\n### Minor Changes\n\n- [#2409](https://github.com/graphql/graphiql/pull/2409) [`f2025ba0`](https://github.com/graphql/graphiql/commit/f2025ba06c5aa8e8ac68d29538ff135f3efc8e46) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic of the variable editor from the `graphiql` package into a hook `useVariableEditor` provided by `@graphiql/react`\n\n* [#2408](https://github.com/graphql/graphiql/pull/2408) [`d825bb75`](https://github.com/graphql/graphiql/commit/d825bb7569ca6b1ebbe534b893354645c790e003) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic of the query editor from the `graphiql` package into a hook `useQueryEditor` provided by `@graphiql/react`\n\n- [#2411](https://github.com/graphql/graphiql/pull/2411) [`ad448693`](https://github.com/graphql/graphiql/commit/ad4486934ba69247efd33ee500e30f8236ecd079) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the logic of the result viewer from the `graphiql` package into a hook `useResponseEditor` provided by `@graphiql/react`\n\n* [#2404](https://github.com/graphql/graphiql/pull/2404) [`029ddf82`](https://github.com/graphql/graphiql/commit/029ddf82c29754ab8518ae7df66f9b25361a8247) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a context provider for editors and move the logic of the headers editor from the `graphiql` package into a hook `useHeaderEditor` provided by `@graphiql/react`\n\n### Patch Changes\n\n- [#2370](https://github.com/graphql/graphiql/pull/2370) [`7f695b10`](https://github.com/graphql/graphiql/commit/7f695b104f9b25ba8c6d36f7827c475b297b7482) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Add a context with provider component and hooks that manages the state related to the docs/explorer.\n"
  },
  {
    "path": "packages/graphiql-react/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/graphiql-react/README.md",
    "content": "[Changelog](https://github.com/graphql/graphiql/blob/main/packages/graphiql-react/CHANGELOG.md)\n|\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html)\n| [NPM](https://www.npmjs.com/package/@graphiql/react)\n\n# `@graphiql/react`\n\nA React SDK for building integrated GraphQL developer experiences for the web.\n\n## Purpose\n\nThis package contains a set of building blocks that allow its users to build\nGraphQL IDEs with ease. It's the set of components that make up Graph*i*QL, the\nfirst and official GraphQL IDE, owned and maintained by the GraphQL Foundation.\n\nThere are two kinds of building blocks that this package provides: Stateful\ncontext providers for state management and simple UI components.\n\n## Getting started\n\nAll the state for your GraphQL IDE lives in multiple contexts. The easiest way\nto get started is by using the `GraphiQLProvider` component that renders all the\nindividual providers.\n\nThere is one required prop called `fetcher`. This is a function that performs\nGraphQL request against a given endpoint. You can easily create a fetcher using\nthe method `createGraphiQLFetcher` from the `@graphiql/toolkit` package.\n\n```jsx\nimport { GraphiQLProvider } from '@graphiql/react';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst fetcher = createGraphiQLFetcher({\n  url: 'https://my.graphql.api/graphql',\n});\n\nfunction MyGraphQLIDE() {\n  return (\n    <GraphiQLProvider fetcher={fetcher}>\n      <div className=\"graphiql-container\">Hello GraphQL</div>\n    </GraphiQLProvider>\n  );\n}\n```\n\nInside the provider you can now use any UI component provided by\n`@graphiql/react`. For example, you can render an operation editor like this:\n\n```jsx\nimport { QueryEditor } from '@graphiql/react';\n\nfunction MyGraphQLIDE() {\n  return (\n    <GraphiQLProvider fetcher={fetcher}>\n      <div className=\"graphiql-container\">\n        <QueryEditor />\n      </div>\n    </GraphiQLProvider>\n  );\n}\n```\n\nThe package also ships the necessary CSS that all its UI components need. You\ncan import them from `@graphiql/react/style.css`.\n\n> **Note**: In order for these styles to apply, the UI components need to be\n> rendered inside an element that has a class name `graphiql-container`.\n\nBy default, the UI components will try to use the\n[Roboto](https://fonts.google.com/specimen/Roboto) font for regular text and the\n[Fira Code](https://fonts.google.com/specimen/Fira+Code) font for mono-space\ntext. If you want to use the default fonts you can load them using these files:\n\n- `@graphiql/react/font/roboto.css`\n- `@graphiql/react/font/fira-code.css`.\n\nYou can, of course, use any other method to load these fonts (for example, loading\nthem from Google Fonts).\n\nFurther details on how to use `@graphiql/react` can be found in the reference\nimplementation of a GraphQL IDE - Graph*i*QL - in the\n[`graphiql` package](https://github.com/graphql/graphiql/blob/main/packages/graphiql/src/components/GraphiQL.tsx).\n\n## Available Stores\n\nGraphiQL uses a set of state management stores, each responsible for a specific part of the IDE's\nbehavior. These stores contain all logic related to state management and can be accessed via custom\nReact hooks.\n\n### Core Hooks\n\n- **`useMonaco`**: Access `monaco-editor` exports and the `monaco-graphql` instance. Designed for safe use in SSR environments.\n- **`useGraphiQL`**: Access the current state.\n- **`useGraphiQLActions`**: Trigger actions that mutate the state. This hook **never** rerenders.\n\nThe `useGraphiQLActions` hook **exposes all actions** across store slices.\nThe `useGraphiQL` hook **provides access to the following store slices**:\n\n| Store Slice                              | Responsibilities                                                                                          |\n| ---------------------------------------- | --------------------------------------------------------------------------------------------------------- |\n| [`storage`](./src/stores/storage.ts)     | Provides a storage API that can be used to persist state in the browser (by default using `localStorage`) |\n| [`editor`](./src/stores/editor.ts)       | Manages **query**, **variables**, **headers**, and **response** editors and tabs                          |\n| [`execution`](./src/stores/execution.ts) | Handles the execution of GraphQL requests                                                                 |\n| [`plugin`](./src/stores/plugin.ts)       | Manages plugins and the currently active plugin                                                           |\n| [`schema`](./src/stores/schema.ts)       | Fetches, validates, and stores the GraphQL schema                                                         |\n| [`theme`](./src/stores/theme.ts)         | Manages the current theme and provides a method to update it                                              |\n\n### Usage Example\n\n```js\nimport { useGraphiQL, useGraphiQLActions } from '@graphiql/react';\n\n// Get an action to fetch the schema and an action to change theme\nconst { introspect, setTheme } = useGraphiQLActions();\n\n// Use a selector to access specific parts of the state like current schema and theme\nconst { schema, theme } = useGraphiQL(state => ({\n  schema: state.schema,\n  theme: state.theme,\n}));\n```\n\nAll store properties are documented using TSDoc comments. If you're using an\nIDE like VSCode for development, these descriptions will show up in auto-complete\ntooltips. All these descriptions can also be found in the\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql_react.html).\n\n## Theming\n\nAll the components from `@graphiql/react` have been designed with customization\nin mind. We achieve this using CSS variables.\n\nAll variables that are available for customization can be found in the\n[`root.css` file](https://github.com/graphql/graphiql/blob/main/packages/graphiql-react/src/style/root.css).\n\n### Colors\n\nColors are defined using the\n[HSL format](https://en.wikipedia.org/wiki/HSL_and_HSV). All CSS variables for\ncolors are defined as a list of the three values that make up HSL (hue,\nsaturation and lightness).\n\nThis approach allows `@graphiql/react` to use transparent colors by passing the\nvalue of the CSS variable in the `hsla` function. This enables us to provide\ntruly reusable UI elements where good contrasts are preserved regardless of the\nelements background.\n\n## Development\n\nIf you want to develop with `@graphiql/react` locally - in particular when\nworking on the `graphiql` package - all you need to do is run `yarn dev` in the\npackage folder in a separate terminal. This will build the package using Vite.\nWhen using it in combination with `yarn dev:graphiql` (running in the repo\nroot) this will give you auto-reloading when working on `graphiql` and\n`@graphiql/react` simultaneously.\n"
  },
  {
    "path": "packages/graphiql-react/font/fira-code.css",
    "content": "@font-face {\n  font-family: Fira Code;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff;base64,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)\n    format('woff');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F,\n    U+FE2E-FE2F;\n}\n@font-face {\n  font-family: Fira Code;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff;base64,d09GRgABAAAAAB4cAA8AAAAAKSgAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAADYAAABAAdsBp0dQT1MAAAGQAAAAIAAAACBEdkx1R1NVQgAAAbAAAABAAAAAQodMa01PUy8yAAAB8AAAAFYAAABgc4zF9lNUQVQAAAJIAAAAKgAAAC55kWzdY21hcAAAAnQAAAC/AAABEGjeCRlnYXNwAAADNAAAAAgAAAAIAAAAEGdseWYAAAM8AAAXagAAINJZlxASaGVhZAAAGqgAAAA2AAAANhL1JvtoaGVhAAAa4AAAAB8AAAAkAzn9jmhtdHgAABsAAAAAxwAAARIsXijQbG9jYQAAG8gAAAESAAABElQQS61tYXhwAAAc3AAAABwAAAAgAPYCg25hbWUAABz4AAABCwAAAkgzWFNlcG9zdAAAHgQAAAAWAAAAIP+fADN42mNgZGBi4GOAAAMgm5VBisEGKGrH4AYkPRh8gaQ/Qx6QLGCoBZJA9UCVPCAMZDMAAGrQA4MAAAABAAAACgAcAB4AAURGTFQACAAEAAAAAP//AAAAAAAAeNpjYGRgYOBisGNwYGBzcfMJYVBLrizKYTBIL0rNZjDISSzJYzCoyszLAJKVlZUMBgwsDEDw/z8DHAAAwqUNgnjaY2Bh2ck4gYGVgYHlC8skBgaGSRCaaTWDEVMFkObm4GQFUgwsIAIIOBigwDnExYnhAAuDohj7nr81QIkS5hcJDAzz718HmiXLmghUosDACgDVgg+uAAB42mNgBEIOIGZgEAGTMgxM5ekZJSAmAxMDM4hkZGKcAKT2MDAAADlQA1MAAHjaHchDQgVQFAbgr7rzbBvTbL1su0bZ9h5qDWFcK2ohuc75jWjEIOlXo/49+ECCuN8lOmSEwtAQOsNKuA+v+Snf3wQhMxSFxhAJd+Hlf/MR98sC4G1DlAREsOfRMyhQqF+ODu0iunRr1aZHhTJVGmXIlCVbnnxFipUoVa5ajTq16jVo1qJJp159Bg0ZNmLchGkzZs1ZsG7Dlk3bduw7sOfUlWuTptwYdeLYmXMXDh25tGjeml25xgy4/QFZryhCAAABAAH//wAPeNp9WQdck0naf+ctiRUMVURwYwQsSAshqHQp0jtSBI2KDRCRjiAi0rFgd7HRsWH5LHv23ns/D/vd7a6eu+7ZhQzf805CxGs/JclM3uf/1HnmPxOKpUK61rNTuPMUQwmp4ZQ9RYWLRWIzkViE9ASSoeYymYODzN5cMlQgJEN7BwepnYGBvp5AyNjzH/XJYyHsgI63TGPnZdT6g47ukGQ/a/8h1oO0+xoMco6yiFJYxCTmDDc1Hc7/cee/3J7FJXytp1mDQYMMWgVeweOC+/YVGOsaSwa4z3aanaGNP/KPDhk1iqKpERTFlnEKsK4PRbmLGQmSIgkSM8w05dO5O9DJJ+jkQeVmdOEFmozrOMXXLeh3+hl4cwrk5CDXl9LjMdztzc0lEpHUzoVm7FWfHHT1tGgJeGtnSoMXAqEpzSwKLQ15/VI6J04urym49iSv+LeYNYcm42UoPG5XVYRvpkdgTQIqnpVmiYV69pPpC5nTsEcK5uatj7XgFOLg0sSYBX7a/byqKApRhV2/sqlcNmUC2u0MDIXmfBQF+noGBqBbbiiAuA2jZfY6w+irZQfDFO41wWknM1OPZ2askce6Xl7Vgv/YXIf6c9meHmly66RPd659nus9er5zTCNy/vkX5FTP6+gAL415L0GHSKwvVv0J0TaEMU3P73zGaOmxd7DNcmxYxSmWgUQLSPRWSSggyxAIkRj+mEnKz7t20b120UuV6ZxCeZj2/rqF13CdopgXag0qfBm8ypgX+Dqy6/wHssPXOUVVx4GqKta/Cp6v6fqVeQ7P6/IWQYChOCzkxGUZL/Z8dNLB8sQzYYGxq51X1OJZnKJzVtSOqgg353RHi5/qGIq30RlsBCMoA8DQlTBWtL2MkTCmNNScRFeqq8uaBbWMYgT0L21fEI0Yxqwh6J9P7/HJp2/4rq1MNu2UMVdM0patcVNag4JQZjcFlRQP+QiHfGhTxoCrR/N1y8efr2Id4QCwlBYN0JHa6bDhaS9aW16mpb1saX2RdnBdW9u6jdva1tG7b+ITB/Yil3u3kMehffjkfaSLhuFH+A38e47EvI6fwfJYsLwPZdCj5hwc5FBf8FECxcYyWyNWJlw4qVgddbji7cY9bWjKR2TC/JRUIFfulxVn152OxohT3IA4TASLbcHi0YAFAJpQkiVpbmFFk+X4fW0ZmtKsbdazunUfJs6ccLggYmWs/ZKs8gsp8y8VL78TNcNve7R/gb/b+uKkQ/NQQdahmZMiMsYHy9Mmjk/wlQxPXJ0yc2tcaECax7jRMV7jonwshsSTKggBvyaTVQhZBS9kYiG9YxcOY7V12Ksd9uzVNWvgKRd4ar6qVsKlCMF/Cf9/2gVkhayP4lx08ALehpuOoD1QYb/TImWp0oieq1xJP+FjVwHeilgpNYQaSVGJesQrC4G660il6i5kQTzWR7CERDAGl5kjIy1HeM4wHLN95uaD+G1tSZZ9dZilYnvguXM4MGiZ1fq25Yl/dx2rldXby9vXf9+qhrbo+ZONTAqHmR7apKwM9kbaOYlTE3kvD4EFvcGCwaC/e4mam38XZBJjuim4YmyY1+n4TY8zMh9vTtzrFza+zLt8T+jSPPvhc8d5ln1o2tyxwtl5nrX11VvVe8N57zYBtj5gD6LEEENTWqpR8F1TReCi2NwcBXIRlaGhxV7BfsembXiYNv96dcnJmTSNYzM39aXNmGXoTl6tr4116liPyk8NWz8vK/h5q7G1Drrf3LZtB2izgFX7K3eP4kAfv27FMqlcpIocpI9EUiCET/QZ3IYP1re6HIj/cVlrdIJTctTgVs62tLRR+VN4eONKJUN/mTzRIWSkEnFnAPcPyLBQ0IfqTekDrqYboO59AFyhn6ARna+QFz6H4h3Hj3eUeXqyJp2zSkoY3RL0xtNW6uUltfWkkAqLNQGsHkjfpDVCfPRO4GgmD/T2p4xIXxGwQgsXWvYvqpm8zfjuvcEb35ZhP3TK0dPT0cHDA3Cq97xZMWzxoFkHltJfe9pAU6sgKyasVN0TVDnQ5MSQZBsSBaVHx665lDjr0urVl2fOurK6vKqivLyinJWWfWyp+7y0/FNTw+eqikt3b16+fPv2JcC9hKMJroga0hPXQiQUSQ0JslBkoIY2p7dWt/jF7K/YNbt1udbYOvnEklEjCvyLl9jPYaUAveXLsjzcR587tyo0umy2m/Kjs8/FO5WH4viKBfuZ16BnFKnY/9gV1E1B/1sDoa1zl0qS56XUxSTuzy485uHntGJG/ixpXtLMDVGLrqQtv+Q5xaUuIy7AxttxsLHP/LiYIq/xtvNHyAKdrZxtTYwD8qfOq3INH5cqdQULUiGL7qwJ2U9gtUN3Vi1765OoBO+48P7TSbwTLbmOn9GW6A+cg8qxgfIaOguSC3AMKwNJbYgQ0qL5hMr53R2xMrzMLO1A1aCUhb6DHfGK/dA+RrImHe1J+zK1SnX8MkIhp9OYTV1d3exAIAA8io87jJ05BdTJQEAViqH5ssRz4DOkE5MYMVdEymOwdwyp+GMjrkcZ589PWR0VuZpTrMA5px9tOhoB7SlBed0qP2NGrgy0EC5BtNCgBaEBvM+ghVPpkIhYdx3lsl2cYn0HTzm6ulRPCPUE5vzuTwmoJTPBOtWsoIRiVDUvFOmqpbdv5+UFJbhdDznidhUMS1H4ETub7Ca6UPdDiIwYwqQj1+XEsP8JoFcAACORi6WG8MYyXp1vokZKzS1M7WkarzUdaDZirBUdhQwqTUb164w/39/SpJJTdNjU1IxI3ofE7ah6Fe64iX85kDYS+yLzmhr8CKzvZhXgL0tpxkJj8EZMvCkepZkV3IdZlswuhiJEfNzZ9ZyC9AcwSZeR6kqBX8ArowtjkYTum3+j9cPDlgN5P+Ydanr4Yee1vB950kH/mS7naQf5y1Fa8HOA5w0rdAzsgdbf1pGwRzVrFpFEIu9Or3qboG1X3U0PKgqKWpdQ+Lpx5ZfYpNCjqXV7I2smvde7HVgeGVwamb4zcOqMv3HZsfVzIhf49hWG1iQtOJs2I2GKd8C6ovh0h1XW04P9ptr4uMyKjOzBnSCP6eATbwqS8v1UR45adgq0eqP3T3fq9sVaUD8T8vavCWQvAiX502bUK6FjPESMyAtZiJg5iVgZRWlmjTWzxYiP4zGYXQO6+vFxJDRNSjZUus+WtrZ61HwU26CPt+kqZSYoO0p78iHj0YgcqbwRqsqz5NFMu14Ry3XU+zcUD1lxjFyX7b0LL7UZaOPoGekQMNTJ0WFQEM+k2Kt41gncsS3F36xosGfR2wt0AqATZkYqo9c328mYI2M1x4IxVHiPiAm72aZYxTSZqezlDgdeDy9FWBNB6UNQ1MwZxgwZq9kHjPsRVBl8X87ngXQOpkfnKMdxw8LnbUwZNGtxlIUXHrsfVaIZQAGFUcXx47SqtB1nT2T+3lnJZAEqQRF8gEhJSaRKIDgMNajrPLuWq4XObUR2an0DHdEAWqgvkZnz9FAuM9Si9YGc6IpUxUbv+vIWv97+D+XbL3RSteea5ubmNZ7VXG2GDr6IH+Ib+EK/3NzeaCyYNxw56mR8YKY92K98rcX83Gmk9Vq5/8E03kPCnIiH/UkfS1THTaTaZ8kuJAfNZGsigUS6S4ty6uz1PXMKQ3MPTGcaof0oOyqLwx0rHDx/SDy4gNb7ugUQaKoFusgSkgPATlfzfTlpGy0841/ANwfoCtbsra9bakgfgBjHgwXhat5PJFR/bHhnnwbUZyPqwyeP7yXsTf6P59eg5wbpiiLYjQi+bk/JG5Umlv39usVVitib34GorCWeM7zmRCkjQWoEmtpjsATX8BaH4zJk3m0xRZOaDya28qz7P/d8NOfGF2RS8bYWL0arf/77pFVRkTWcAtOXnm49Ew2hy1Hut12cm7RQDngI8Ko0u0gPPImsJ2L93c/IpPyPWpz/T7rm7btJKyIiVmog2UvrldnKgzaAWSCnGA037kPp8FaGi8jZmdUYKRuAIKu/Lez4iPFrOFu516xaug5d2wOA1KOrz/4CJuYr2yqa0DB6CUks2MnAqoYHKENSqSIekJwyGC1Gtba/WUuf//Chq/3wUSttMzsPy1hDC/Hgfk70kCGmMQXuS3mjr7b/do29raw99LzQb+h8I/fUw6vo35ULlHvsFuduLea1AY0l2nSowbw2BxWnkWgOkbrwZqBSdu7T+4y7Ncfwy+3bkcmVH36IzvcAJcpH6NTtjUfC6MNKb35EmyujlTeRZX52bTasAXLaIau+L1nl6TCeDp3/h+/Oz0Jgiqb0v56gT5UcDonxXhsya392f3qKcmOv9J/S0tfbTXK9tnonfr+hnj9He7klSW3ib+6tOfhitt/otLHxmoM0oiJAl6z7rE6J9Ogeu4suMFNas6kM+oKGln/ZXv4saLZP7ZQDp/sp6+kEreONGbWuU4Luc9m4FTe+xYcbFcHT3cZ/Rr1XIu5hiHSmZyJ4qD5Lg4cCiuoekx1UoNpBET9LTtDkKSEfh65PEPcUkmXCNr5n8UJyGmPG6uAT8qUJB3a3Tc+Nz7Zow8d5MjNO5nHjAtZFz5cX+AxTLmRvreg+B5eCr3rUMBJZHX3+7GtOW6i3GR0dQ/VZUsOXeq9o9tl7dXmTD1Pa2lreb+dZv9jhI2L8vGMsR8Vy2XX47Gs419W0oFEXlAshs3vQCOS8bM6Xe/e+JsHr/S9JvN7x6p7Wn6xS3m4kQTzTHgbkRUW1pfxmdA23n0aeObmoT9ex21tql5V9Iif7EcoHdKj8zMJTDyoXV1eXksjgP0hkCDNSxwVqkhwNeoZHLEQ/y2tiD+wOq02xjI6XdMeIGa/D3sLjbL0hSrer9qaYVUtCMmPRUE24SLyswe4i0te0us9ShgCL+BMusxd34eCzb/Zg4LspKG0/XVBaOkf5hhYxIcogeh/ks/tcC/nUInW9DsaGXDtlC2jQ0oWwWA3BeXWwSY1baA6EmksKuQvNKPwksZlBbtN8R/cRLsv1zfYtSPRckiKhLU+Vp++cMv/KksLLWe6tGwJTJ3Htxfq29iaGTlO35vV+ffyaa9OGkxudK9J35demP1i37XVeAepzqx1Zn5YZW9qCj0/BxxGsFNa2hYZnCdUGiEXqA0s304IAkE+0V/HJ2bF55UvyLuXi+eH/N9UpwuZFaWlInhvu/DIrfyErdcuNCcsc0r8wZ26FG6utrV8qEHT+HBEbGGi8xCs+ypvn0k6g2Yg14fmDAnIlFKO/ttKP9ZRPWZOlED3V94KxsEaCyRopCoWcqGY5i24mLRUhIsuk7FReUYsL0Q/4Y8dLHoal7GFXsSJnTR3o6aYaJs0TaT4BYhWBRmTXYp5HKf3jbFxH9h+IlLi2X2/jEa5W9KhO/ErgY1LNfK0y9ebgBJJcUTEy78lxFFFxouZcUfjQCvwI7cahyLwC7O4+70PWB1CascAM/AgnfizS18xyP8PsADJbqA8x4XPAVoC1MFCI/hOJpvvPu9n8/tn2n+atnXes6dn7HTeS0RusS8vQLzgC7SR/A5VX+DkeLxm09FGdEt1J6qDKehTZfyTUEgkqPD4nb3FO8K4JISHtczOPzcudNCE/oOBBZe1f/EL89mfX1JQvuUsnRXtHhNhYJY7zdC2cEpNqLHSaFZC6LmCiU7LMdU7MxAjQz5/KmJ/VJz2+cTnIEd9pQDFifm7t1we7XW3t1xsdgTPeS/Rm5okJnU2sCdabccGFmchHicgLekGUokmUSvG3WTPN7CKyuu7w+yzoAqaYriHNoO5O6x1kcwxvRhuu4MabAB+FtpMYvcYkE0SO1Fmcqs6GU2RfeMV0AppI3bE0OyvT2YqzBva3cJns7WM21lrST8wbz9TgV3sel0daJBuOST69BW3nMSIBOQ4w9FS3mebmcgkD/ww0t5naAXUjBBzd61brL71YljPd4vf4xS0ejmYi989RjqPPRZ2LVH5lTZS29I2e8fzXO1xXbNfaiq63ont4FHjogY53vOR9I7ccpBb1qZ7yPVg5kWVMmVWdKbxmEl8crZYyIBVMbsfIWJugFINfYwiK+hQslrFj9HBZKy5kTao7U5maapBSn/JByoigkDHJpVF3LmEVjwFd2dwj4DFW1Di+L4q+64D8vcm/XMZ1383IRebm4p7XKXS/9ZbTZLMzbT2K4q0nDV8/XGEVX+gmy5ttP2nUGp8JE3ws3UYMd0GbbL2HD3Oz9A1y4x7pY1YuLf/Y1PypUj4G6+nTaIy88lNz08dya7npiWfPTtnb0flWNjY2ylJb2emnz06AH+Teg/g1kEQDUs3chmjoqiqFWCuDpKiNZG63Ou2ctmFja0xCQJMNKfTjDu4Nq9BWnDE7zs0RPeR5LHSpAhLR/oCiJs6cqidJWztfQG6RX5WJD8fLsyYQYlW7QZSCZ8Ag+a9sPbhTZzPquxH11UjU8H+gSwG6noDEf2PrT3g9cd3iFUQRs/o7EHLP9YivpB5sXQ1A2DoaoTIa+Do3XiUKMp1g6yiyQsnZhqS5J12HHKLGG42nwjN+momno4yrz+eUp0I574+pS15YFwCfbPBYxeK0+YDlAVjjAUsLsvA9Vk+qjv6Wv+ZBVsGfq3F7By1dsTxkkd8agDngs3FRRZ0XU7sY2+IxZtMnL5jO12I+YNqTWOpTRmpUNdXV/QbJM4DBPrd+T71U9svvwYEROW5FtFs9oG5vOLSIWDkajxmROCknEd3hXeejJQS+vhU+DqTEBPe/EHZSxfeNr/z1l3Mn7vYXmrlPcXcZLLMU9zKkHYYNz1yYBeA7mg4c3s+sw693Pq2Ks0gb6DT3RC1qxlbYUVGRMwN0QXrYZtJ1TNW6/hNfVx8O2o1LTs1OOlF4Gnc2NyP2rMTMf65TDqjJcF+WnVfjRusrX/MjVK38iOcZRUVnRqj7CvOadARDquf9uWkPxk4IO1mbPa+76Zbp+wJCvIv983bro+fYpN//FQUVewX5norc8jQz4wkrdXRKth7Z0lJyZNto62QXF9WN+r/rMPh+35ID1/t2/2NZf2dW6sOtU0/6hrlXBpa29sNa6K325iL/Ze4hE06z0tJ3TU0d1W7OqTY2246U7GgYbTd3nDP41X3LDX7pUJox2aV1Vbs0w8+SO2nylB55Sn3nDmMROcOngqXzwFIDatj3d8vdRNuFNhzak2czqKAhOLB+Uc6PQYLS5uZSYdiP6ckBpiF+AeGm4ay0+OOOxs+VRU+qsSXkYvyK22mVl28X/jRt2p8W3bwM+maD/isk4wMJb1B1SIi+BYm5VAyE25BhJE/ScpNzEYObE1OTn55CizthiTf9k1k7cWpiXInRyA1Jm7dCd/qLBQ4gXATH8V5RZjz3BTANz9aie/BsQrQlMqkMpaEw3Oa6H35OsAhKD3T1jrWcOJn8qlBfz91rLMW/BvA/K8jnrpvpPzTvhwmFGfSZqbHkBwZ2R+lKPm7psBc4gx8s3wUT9YFu6qrINhIx+bdxxR2csg/JkbQNp6woK1NeRJeYzs5GZlInCxaDlCO8LOfySBzIL9rufHczZfgzEzAoe/4GBekD6v+67o9/9KgXEvYSFLY/6NW3L92ADd4r0m3t5isUGXbSjClOo0Y5OY+0JBdlG3pPqqwPVfrChYSib+WDAvpgx6jqava3uefLFl+cl3KhdPHFtPSmhqYG+N9E0ciYEzGruJ+pvuRER364UHUCcY/PqMLGxcVmtKsrSrVycbGydnXlRE5W1s7O1lZO3e8UQmlsO+MkMKMYQDKTcwyHk2P5ycPL/wHfZnMUEygYS7415CzoriCcYC8Yu2J7LM+sBwkoZqXgPiukCqF6f4fnU7mfGRehMXmeE5qhayhNiqcLjR/FNsK3SfDteKGeBu1TAI4cLdRbsSmW5/HW3BumWPCB0iY+aRYkHHDoqICisF4Z+hN9vBP0M3pFFnNvnJImGI3z8xtnNCHJicj2B9le/13WIEotu5jrbz/dz8hdLnc38ptuD15YCnozi4QseFHahanO/wexyY1KAAAAAQAAAAUAg4V762hfDzz1AAMH0AAAAADbCS13AAAAAN1Vrr7yK/wYCVAJYAAAAAYAAgAAAAAAAHjaY2BkYGDf87eGgYEz4ZP2tw2cAUARVMAIAJK+BcUAeNpi2QAoeQ4gGgqjKAB/vxBAgCwCmBGDomhDEYDRMjCEkOLJEBZDYIDnITAAjwDggckADwYBIMAABMKi7sznHFwXjp6WhYm10lKuY2hloKdrqjLT9B0+FOpIZqyltkh7G1gL9l0pBfNwqKM0jKxM9JyEhq47cQ3xJenacW1gpG8Z8r8fQ5fRbVNvvtL5hmMzQdOjWvAZ+m7UCnWovBqHM5l3c7eh9uvCi125QhW2O5oy99Ejp+kgPaXn1EhZekjtcPQPfPVGPwAAAABQAGwArQDfAPgBEAEoAUoBdQGnAc4CEwImAkUChgK0AusDFwM9A1MDfwOrA98EIAQ9BF8EZwSSBJoEqwS2BM4FCgUSBR0FKAVQBZYFtgXBBcwF6AXzBhcGHwYnBi8GQgZKBlIGWgZ9BogGwwbLBvEHDAclB0gHYgeKB7QH3ggVCEUITQiDCLYIvgjJCNEI+Qk1CV4JkQmxCbkKAwpAClAKWwpzCqwKtAq/CsoK8gsyC1ILXQtoC4QLjwuxC9oL8gv6DA0MFQwdDDAMOAxDDJwMpAzGDOMM/A0fDTkNXw2JDbYN7A4eDiYOWA6KDpIOnQ6lDq0O5Q8QD0kPaQ+5D98P7g/9EAYQFRAkEEIQYBBpAAB42mNgZGBg6GBiY0hgqGDgAvMQgJmBBQAitQF8eNqUkMVZhDEQQB/uXHHIDXd354Lrdd3ldxwKoJatgQKogG6QfIPrRl8yPkAl1xRRUFwB5EC4gFZywoXUcidcxAL3wsX0FdQLl9BYsCZcSleBX7iWkYIbNBdAdcGtsPbJMgYmZ9gkiBHHRTHEAIOM0MsT6a04IE4ExRoJbAIobRnWfzvYGCSfOKTtF/FwiWNg46Do0H5dTBym6KefGAmt4RGkjxAGGfpxMcjikOKMfiTSa5zOb2NvvOa9R+SJPNIEsBmljwGd/TTLHLDC0hN99vlm3fvJ/vdY6pP2ERFsHBK6AvUWPY+I0iPpkEMImwQmLg592neaPgxsYvSzzRobPC6cIRVmHgCRt1ftAHjaY2BmAIP/cxiMgBQjAxoAACqUAdIAAA==)\n    format('woff');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n@font-face {\n  font-family: Fira Code;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff;base64,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)\n    format('woff');\n  unicode-range: U+1F00-1FFF;\n}\n@font-face {\n  font-family: Fira Code;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff;base64,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)\n    format('woff');\n  unicode-range: U+0370-03FF;\n}\n@font-face {\n  font-family: Fira Code;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff;base64,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)\n    format('woff');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,\n    U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n@font-face {\n  font-family: Fira Code;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff;base64,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)\n    format('woff');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,\n    U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,\n    U+FEFF, U+FFFD;\n}\n"
  },
  {
    "path": "packages/graphiql-react/font/roboto.css",
    "content": "@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F,\n    U+FE2E-FE2F;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,d09GMgABAAAAAAMwAA4AAAAABZgAAALdAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoI4ghsLEAABNgIkAxwEIAWDCgcgG3YEyI7DdHsjE9IUV+CFDh74vPL9/MmgO0un0soqjWt7En2kQoCMtXsRxyxkMqP9iO6NfSiUaLJuoRIKnhI0+ImbcWOB5XOAFVmCgxZQQmuBJRhZtsUCXm/492Dyuk2YZJdkdApZeOzyEQgKOwDgRjASBEEBVmAlgACtOHEhpjLyyrACMAB0vaLa6cAw5bc5bvhA2uwO7zXAyKPmkYNnAJgBxLEMDxFLqVBPI6EQ/daTr/QOAgfCngRoZc4UZiL623qCkf/oHVsfRCOuAIbJyF4ajQQKQLmQhNBAA4aygH9b19Xw4iAC8DkKM6WrYw/ABMAOWEAamA7sgBWACgAUSlc3SCmlc95o45idYD92Qt/+5gF19v3FALtB9+7dq/h6/Ljyu/zzYfnngwdlHxO+k39nOcO/e7nPf2vCoo3HVlmNTdnWwW3JZffuVU6cQX14kb3qUGOOJ+mjP9iMeb1Nivq5gXpJUWm+cmVK56e6PjI2uce23hHlG48vyDvym5/5q+wbkjq90rN+z53D6zXqmVUPVshZoVtrZgc4vleS1NNrni6VR8I/vTrpzpPwu1+1Pel4xBIzK16W3KcLNnVGl2RGZHbPXBAvhw4M02Ci/t0BBfw/p79XS9V7CKAMF0++DK9rtI/7MXvGATjz0TEA4K4oef476t9dS555BAoLBYCA6ei/FSzVgvg/cIR45gpTaLWeLiB+oa4xJuTks7r7/xwCmCzlpoJKALCDQmkyEsCsN0mELUADghGsGgAF6c9IXkabDYyqg6WMkZd9z7BT5gaphhhqnOH66aOvkTQhggQLpsk0xBB9DNSLJttgPQTQJBtoIE0JEY2wb+1lhF6GG62XngKUGKLFECMNkW2kZgP10+M31GZUwfojwkU0uAcQkISKFNtqGMlau3vIjjRUjMANjYkDNKeouYh7CRBmuD4CHQgHG6GXET8oT7ZU6QqUStddiABBJPSv6P315AAA)\n    format('woff2');\n  unicode-range: U+1F00-1FFF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0370-03FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,\n    U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,\n    U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,\n    U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,\n    U+FEFF, U+FFFD;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F,\n    U+FE2E-FE2F;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,d09GMgABAAAAAB0wAA4AAAAAN9AAABzZAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmobmnocNgZgAIIEEQwKw1i2CQuCEAABNgIkA4QcBCAFgzIHIBv6LhXc9d0OQlLmtmQkQtg4gChsLYqSwfiU/X+9wI0hUv/ESljasdKOLTGMi44Ndgq6GqWg9LAyZSaQ1p2jO4gS3GO52RdM1zk/kVej1lvvb916njBD4+ETR2hyip0e/N39agQ2E4uSVEGghOwN6WYXpPWQqgRRjyha0wCtB/EaOgzLb9Pfu/Z2gDPJbgFAHz8PpANbQIyq/SvsAQrZCnUkaTL5UDx0hBQuWtrOtqcReJzBYjAGoQxOv0HSnf+5Fg+TUohWeR0q3kQ9Xiap+ObpzxX5eZrb+/dvcVuzkW1i0QoGPSIFiZZMqRKkVCpMjGZmYBZmYCEg1jDBJrQZ7OWgjSirppuMh67lD7df+KNVl3LJKjTepvzfWpntSoeoAgjCbWLjo3T1r05N/66uAe7XIZoFwNkwKiChowYCfEDgLutynkDoGHfenroNPE9TZ/PasmSEjKyMd5djvg7F/LDlMaaaXgSHm8Ya4L+51R3vQjmWFlJe/PwkCLK2ZIrao1UIT8JdOgs824sX1UVVRHw3Xqt23FhdSz4iQYIXwkPStQfxtJicUREbHtUNErA+XstdorxXhhhYQOwU4mZQLz8NoimLpbwszcvTK/f00Rv9MAVWD5hHoyHg/hM1M9mJs0WgvXv1d53w1MtvE76H5udu0FuuqwYoqA48EAPIkMRoo5z23dR7BEQaIAEAVZTcQn6kRdCesSro1vQjrGf0cVbFR8pNZlYwpjHK3tsuxjHGKNOAac5cyeYw1zNllJg1TkmoWGotdWCWP0W9omQsyZkZz0Hy2iDHMg8yr2S1szaynrEG2UqsHxJkyzkrwXcDIFjt7g8ZEAZmHbOmP2gzIzaOXD+slZWIT+mkOqGroajYAWm/ra+8xcyPglVJPHNXew50oO5nsx6bFd1Xn1ybYF0feLpL2M+nnkqOI256UcjrotQawk89RYYtoDPxnjgioWbbyctYjKeoqus0jPMfLCe7mjK6GPfaEguW1wYE0h7Qbq/1DexBJhQjoq4WpHG9Lg76FngorPD9NMndQbWkG59P0aJ3oPoW/emn6fuKrU5LX8A1xfdc12PaN2Daeic32Tp53hfEBkd25/b3slLKr9Cs2aqBqhosGijCdXnIbTxH821ua0erQbGbl06BWv7/hiiUipqGlo6egZGJmYWNnYOTi5uHl49fQFBIWBwGR6AxOLyMgqIz567duvPgkaCk4sWrNx9EVTV1TS0dPX0DYwg0iCaIIY8lnT2aJ0QkE9Yzrm9COjFINU8nQTfTIME02CG0cap8msYZspjzWVLY43m6FgoSCxIPkgySCpIOgvWOAAoajoxF6xdSiI2rZmlAi75/MDmatlr0YIKGdww5LGmyr26E+pRuzI0bSVKkC9YDAimg4chQ7BfSiE2o5mhEW2Sd9t0/YdI3bck2tAsaa3t6FooWI06SFOmCBRAiBTQcGYqKPRtii2mHHTrhYDHJuhAWBAwkBAYz/2EYhmE+wTAMwzB/Fn7BMP9hGK5/a9tW+ijKJCoIDY3eOvMq2C42YWsSktIUIEq+Vf00Rd5PAxah2YbAXvDC5YkKjpitlIq1ZaMStsFqD/TWysvgZfCuRQuFwDs+D1uVoIAlIpNw3i5QECwqrarrOk7l4QK0SRpbswXC9M5wJ1xonZ0sxTrpkVs+A7HcechSxdN40ccwLM3WtiRLpCgooJhZPR1N4zJg4GCg4YacYVILdUGFSYIsVBpDfD7NtSGUWX1oiGSJLeNCkhRpsbOEQEkDR4aiDWjZ7dHnj4myxpGH23bDN7BcojIurIu5cSFJinTB0hFAQklTmL5wmIEiDVr0+WMyPgvPkqdemj1qYw/Gz5eFe5IIL3CVsLCmNSJXMMmbjkU9BoynswKz2cRKkgZ3lLVpvPmyHYCPWLjc5A3TEc58tHC2LraxB2PlxXoAmXkmnUKdKTlYtT19MCecCf8okavYgh918qA6QHkiVS1tyG5GwLpRqVICNE6SCoR7fH0sm6dvg8eq4BbU27poGDYgW/V0vzqPIbN+eLrv8FJ/gSkucoHOe1X6yn+NTx9WYIvCuXz8YraAHLvTopyXSkJvA5ONt+3AlpvdVZxwGZxsooCrplZqYYAdetlhgE709NZDpK42lEtTHNhaPZTgUQiGdGKInZxNdZCsmJAniuVL/xHv4lqGI11JSAR+XBM9deUC929Y1sDT2/6fb9hW1X3DocK5fkpFsHH3A2qZ9TsItY/6IRthOn9VIHQddHGHEN5mAyiQQ3Lq4FLAulOKCBDtOvlRARAACPCAA1ygAQMAMNBBiAl8YOSbXjLphIFsXVhbFCYQECUAPVMREXYpmADBkjObjYEHmAIgJVgRIEBAonQafVPWJUI0cIqYFDGBDXROQhYhYAAnCLAkbGAAFA1QV139DHQNXUfXOVcHqKQw0VZMlo6tsDnQOmsOQJqzW8V3RE8AIP6TL/M9O3xlCIBI0H6nwzhA9OmcoAWtAwCkZUn/qBasCAhSLB9mlIRRKQfqyyBI/cyIXdwTmobs/VhPTAASSIPMjH08sjrSZugfZfkQwN9Lf/3LFCBs8wMAlN2pVCBtQXQEG9w8I0SxH/OqAq0SndVRr+b5YcmzB2bjq/c3z8Jqf3GO+MbqIqJiGuISklKa0lsGYoq44lgxp03zvnz78but5TvxZ2Lg1ONGHTfMiaxEqiggnlb9CEYfvBugRJBPux9NErA6DMgUC+F8jXRo+8/ovis1ZsGEVYfsNKnpcG4JjInf2oImukkG3hA5lR8mTwN8MaP0XJSCjW66AZlb18JeVmpEPvD+tscCG3PkbP2Xee8h1lYOBSluu0ocK8FDDtm9vN2Y72q2SJe7bivwfL4PXuBgwhQh/j9lNpchGJubnL707o1fp98RIwhiCy+ZkUPeK1Kd3MfQnwylwQY2w3rG3rsd/TD8Y9aoUPiufU7DihXZsOibVZ/0uAixK2Kx8+wb0SgBMcWKM2fqGh0PRsxhNWkf7IZK3tzHTshyS3DLSYM4AEJd7zM1Rz5oQ9/6udmdzSpyF87GmLCZ5V9WnukFDqUnAvqHe+/LCQMKKeWMLKdEnhTNtCQEXDxtJabVw3fU9lmDtK85hKC9V4l6fqVq2Ifb1mRIkR+ab7GNU6G3NadUxKih1UTbnAzVotmsxScIO+H+B39qgO68ZbdJZN4bu4upZc9TL8MD+GBCzDI2+sYV6Jy0OzxnT9hQumEV0wu0CqpQv1AS3tjJpNpK+PaIrYBonpXLUBOd6EuYiBTvvYE0zPTIRx+EUfHux/uMNDHsGxx2bCPTSXInDG3892+2OXkBV3Aa1unZgpiGVheZV7yBw7ZSCrCsRsfKhiCP7LVqOq53R5QYgmZG4ED/Pj8gciKpbFaB3JrG1exAceodolPsYsVEmkGY/hGrkteC680JxFcNIxctBiie7RSMgLjRFRvSF7UFsQigOhR6BooNbcEJqKyDBAoPwWm5R8WEXiHpKx08IEqDmhbf4W9WK5ElmJs769CAG7aHXSfK2BumZn0tQ991pkTauqMt1ccOiI+Y4bwNhe+6XdDI63ZCTwub+A8Fw2y0GYipqISboN2Z7EFAVTixA25TvgaQ2HYXDmfcqthuYF1/FZsB98gghDlwzcFdvnImQnDToJUWsH/7HqSYdXyb/GW2gHe2UeL2lHFKv8qxiod4c4CmAg5tbr8I6Z7ldudzykvuZ2sLKfy2NljsiY77yaD5wOZOM3+rdgSlxq/7C5DqTnTQXmmG73k627EPRnpi9T+HCKBDIwMCWQeACBfx7pYeIwLv8tEnSHREjGzD3mPRihpLVIKyfQJ07CBdddMElCETWZsCNyNm6yYje1ZcftBJyL1AuZIovkzKiBcumSouOeyw3ese9F7veVMd9/ImgfgRMk34ZWtG+afXQgubvTtpF9Plvt7rN/d1Dzjp3GDRCkQJPAEff7T8/JCxrzYGmvAkTpYzmn4zfUQB3eWrgIsCo+9UFSozAe7SM2jlxDM4fX/tqDzG8/a5z+fNxYz1Im6zI5x7lo0kzz1Bo4hwdf5eImBj32Fq9Vlaa5uNQFDQyTMFsBX3FzYA2Dj88grrOS7ebdJwJ7KkOsVZk7+WmZERoZbZNf7Ki3y8DwwswY6ioGx1sI0gi0TsSJSHokjiOtRxRQbhuuqB9bD7qgRbh02kyKawhIOBE8Z0zDRMmoZOot9RY6fxa+fUVOStpGDXK5qRht8wN6411LC30jfdpPNAk57HUUFAYwjL7LK/sJe93YBR8AoUjMHsjrf2bi/WLH3pC+Fm6a+vh+0R/mDIvy89BZ9h6Cp3v7B/NN5fM3w7PYt7Se/D6K7VbhcJyOrJ5yVwo/0zYjDj2BvI68jgRigdu08HAPSGp3pv3XmjuIa4XZg1Sm+jpdmsOGOmtGYn8Qj/YzI+/iS7cmqyiY3k0+/6H0UVzChG9LQDaSF+hALLbRpYza6xdT29RefKGv4FaZvutXV2DXZQI0upzE6pHOPfl47FBWfHBo/BVNngC5OB6UGpjPX2v0a/2thtfA0/+ERd/AncgdM4Eq9cLs6F2emXDrkcR/o8M7vb1/78H65ardykKQb9d1KuT4B+ZoAt/4JU5jNUEqJf4bKP+yMpoMPjLt2eBb6ieuJB6TIZo5teYOnaKhfru6v+DX6IQZsto+WbL6jhRPvv7eL2KDHjaImzjmSHBRCF+GxLzizqPXWo/E453kW+4ur8gHy1YDXm/y9hAP8SXBf2m/z6i1xTQZU7qgS53OTkyhRyDkBmYOAIt3lAxt00cFD3WgRMmdOTy5mi98zqrtxTcbl46syPphcFoL/0zsEHRuPQdFhteUEnrkNHpLQqxg7Fc0MdiOvk6ylKyCOcUboHx2YI0SOLW/u9s5AUX7gu2Oj1h+E/RRG92C1BxY5X9K6nQuW6pSw/xiKJC/yOryNuVkV8Zq+eJNzUTf9UtYK4iq/qK33mxmxnluSuiUftZEn1skKbsOfx6PvG47Rg/hkwTgpk2ft7AmeYfd5y+KrYzMG1r8FFYmohcWoodXUENWNLTmaH/Nbj+1rRV3uB6PQTg2LlZk5zi5rY0kGy97vBjua91XlO9uCoJVjbjr/UN+AadGVV0G9uO39nJ2O0rhFXo8srg39xWj5nkLFLi/yJXGJTn3grLbwkqiEMt2G/duMgbg7DGxZ4KYs2VDCuVxYR23BYRhgxIrB78giEKfmVO3A0tEV7nCOWcb5ak45ESUB9AFqOw4u830zLqcZZxPqT0DpVEKHjYn/Dj76fbBg/tRftRI9Ooo5BQJLFPhLknuq6khugam+jfsGXfoSMLmi/45FFSNHHK2jNACDfSH9fWJLpCOP4eLj8Gs1R5V+tqVSqeMeMj9QvOBzs/ZQ+Sfxz+USe8LQVio73LCZS7PUl5ilsH0MZiC/cMLVbNGuOne1CcxubMBuHZTkm9ou0L3LmY95Fi0DVF9TnGt0EvpXfH5he+EBVHO2oxOVobXtJL5C1OTbOrifAsWKgNngq8i9Iy6BSdlaJ15+tP7j+GHjhUldnkIxeoJ/fkCvCR2aj/yG5UzV44wpeLicprSQHJxENmll1Y/D5c3WvuYGk4anWGw/+lxReIHuE3kFLzdhnrrpmG/EQ/2WwBqvnfE1eTRbRQvbfnTf4HXSvfGCG03oKj+TjGtrBVt1G8MIbBFCN+7OirrFKBXctyR/a3OaBPaks9YZFM/8I+shA+Sszi5gbXkySySVXtzYUPQ5gC1ER6m0SFvCSUqtiMah62yUkxMvCpv+F1/Dfgs/yb1j8/4Em5SYk5Wq1W/Z8zOdD8zmXoN21vHRuTGp+PAY38cAru6hS1eXoEx78ofhAcmnM+XJxirj+JC2S2KNasN8s2RN0ry0EOX3pGHfT+0QA0bl5q3XM2OZ1ngCHewM188L+wxv4ZwjO8W+Z//+hMmjRzDe/Fg8zWngVL5sbm5LzLbi/jv5sFbXeOmokYMZSIt1rzWxTbpVPIbf5/YEF68kQzM5U6Ux6J1joYwNuizJ7kjJkzX3XXMxYpF8umt6t+jF0TVyorHr2aw6FWujtM/2nC4YZTkXrl7Hj2MEFKYkoGm1IEYT9AGZ2/dGx2Fr0khx7yD0iuEksi5geuJOewD5mMDjAXnAHwXv6qW+AI0tzolAhPlPCTVI5f1tp9gHQuQQO96UTuac6W3d8lvf4+HnmBLkg9cs6Y0Eb47/8s2jJisJC+vr+yV/kS/+VoPXw2jH1qcY7vTv7yorQjAV0hUumr5IXJdjkyzUrELDggt76wYa5pfNrBdv5PXt4NW7dSw4Qqw1PDRue3j7Uls7lrxFsP6Jk2LUDpJMvvjfCeqJtNVcaGGeoOUKFrejts1XPKZFQWHmzIRQLq3jJtUVJeAxhmGdnxpS380L44LtZ1M8i3qpj6i78Dn35pvTU+bLM+Qq/OLSURrsxOX8raP+Ucpvf7waATHZACbcihxflX5C+ycc9MLI5TfPxvODQBe9fLKyD0qzQaf/gFYyrvAv82+b/ZSj3wHCJyHjxsBBK9qzmZXOiE/MSMaiJyn0DDHrC8rFJ9MehH6jTV438tqfBosf0zsKqfKKJvHHf4vMf0L02wogk1pYdLMTVuLdDp+kHGL6TiAZxPdFfmDPKbKMts687YSTq3kI8xwTJGIBFo+I3JJ5L0Y/EBvH9aU5bucvg9Yj3bpvkqfnE79ZLw8sQTSpFU16aHL3A7zyVzaprvf4/fu1H4N+X6ka+5qXGV6bjUVgywahyVw1Mfjt+FN8UCR/Iy4xmvcQ1+GJ9wC9+ixhTkpnuOvXvZwULG9XEUX2MSM/iDq9J5qd6FrSuaSs+54YKXFxqWQF0Jwt6ZHi6H5FJrOsVrxNzaqLXgQ77vOUaaMLhU3ocmdupdbc8vJXCctFisunj5mvEtetGnO8QRiQ7MRe02y/yJL7uOQj35EurXawjiasA3sjsS1RPdtF8tQdh5qm4sJIRje2uJU+pnpwGfzxktnDd5lV+DSBiiGactYVhwrJmw/yv+8ud9w1X98uw2jfrkvXgH1HPtkynbcPVsx5jvm3mLv7YZCWYG6lCOgVnRc120LItwG5kbH7rA48Cohc9OYFbPyHb8MUefjk+LAdx5SbyMGjs6QIfFO3ItEl2s7eVoHQX3oIhYDf9OnAYpaNep8AVYGJr+aOw78jv4/Ydq8DDnUWSneX+e5H0hiT2mr4SzjHUBdtmS/YByxGqJ9sg4pzxu2vX14KX/OXZAYz0Vo09PM/QG7Bnmmo/1wince7RpqMbNz8ufkyhvD7UjjgfaN3gyFXjEbezba5nR6COCLYBePI8Z4B1ZK4PtT93mOrJ9dQ+0wTaFR42yFbN7+aw/107LQfUhtaOwm2+n43CxvIvx9NSCTdw0PTcMey55ZF94/pHxGG2b4Dy/hJ8qvCIFTOAST5aRddml12ON3j/157pO4PaX0VPjSm/Zqn9AFtGA9fHcoTan9NO9eQcPq/VicRjswUKsHTYLj5APrwP3Xwqd9zYecTEJdSOndNA8yLSFMI4w/8qDEi0BziMhQ41qOYu9oCdC6oH3vAnvDYuZCjDgUTisfkCz9vAnr/QwOP1fejFN/uY61nb8O1rL6me7Bna59SCVOYFPYRAlB/M8WK5OC9xxrASCuzZyaKKyxIJ7ld30J6A/PGAzrk6b1QQy/d4AcyEst4bYWlQhU/U+o7xWqYI17ag4bp6vAPfeknb9wLIAN8sD3yRFjjZE9S32jAKgxqhpPK4/ROt0dO4Bp+rDfrHb5OX371fUGcdOS2XKCTOF0Q8YJReBbdzAr0LFyPfqURseLE/kU1uP6O0kx5WEbYyFOcQW65Se2DhUssv/puHbOv69etI16Pu01xayABqPaPvwmBsr6urDfoGJmZXIRAVhcC087uJ2Z8q63fgdtR6V+50rkzxwOXzmxehhXyNM+5TizX78kckxpzcMqICRZUzM+jDnB+7O9R3dKhtHVHfSsLArsWoLFrk9QJY8eV77kWmErX4VPViGb9NpIZmmDyn9eIbr9D+5+GBaV44hmisndbhB+pbnTjFIY1gQ1ouyLkPe8mbh5jtrE0T76532DfNl/iYTrk8uplcKr68KJCR3KLeLVwaeiPP0tT6ISxBBYEcN2HVRgry1rbZd44sRK7P7IGLN156PWvd8DRwtSzNvv48glBeCMt5nZOLBwlG4oNq079W1u/EHaj5vtyJjMPDWcckenxlo8tRzJ255MEq9e1VqutHNNYr2xFMDGwVF1pFjVhH2c0c4DgwzGA2c5sHzi5arpkX+h7MbLKfbmw9/pmp+RBk3On2VGn2UJ0uWHv3Yiuux5vOsjroTvyt/eeb8Srcc45q3YkYobax9siFiEvkRVA+jBCbeAfkjmJTucGaZNhEqVvMXioe4d+Xjot8FNmZikNglbInIeX0qFcTF1lIRVrHnF8+qATGfUXyq/bZeai/djv5kLmSkd9+4ndUHVFF9KemXMYlP4Gell6YQWSi9WncMFHRSUeJyoDnwWesViqv/tCfyFa0Ej5m5d8mK2TAyK9eXoKWofVx8GGXDyqLFnq9BFZ8Re+t8FSiBp2r9Zfx2nQE3c3jn6tX4V5859WBF8EBWYtxDV73nfaczgGLRvKWP/7lj8+rby8UlBO0673HezW0dYkCeAH3HdcNO6y7rL59I9XfMBT1N/bv+EF5w2Yg0nUDDABggKpRZBUm0Sy1cXTTgYJkUkdvbwZr0SEgajbx2jxMA9OXxpCnQIrmpTkRg+6pBPzgwIQrLQ8POnwEyEnEkvOH7nZRQBEVKfsQbTqo/qw0l9zVXERJYm91fRXSv+SbXqCsbNsJlUZ/fOPqwqHrqQFlKTp1y5vufenFp/+qPfG/XwDAEJDHDguMALnrWDEBxKSSzj7gaYcFeEJMeEkZAVr+KwzvtGOq66S8QHkfvd40mNxjQE5wjnWhOka1Cirgh9FvYhVVE1os7brM2a8cSW8Y1VJxaZd0i6YT6ls0B3gF5TNYz+Jhbg+GID0pA9KxnrDojzGMVz/ewXBpuH/tIhfLPppZIkxqmHYDc17cXt+p9ad1Ph5mSFG0R3RG89d1sTn3c4yH28nS+sYRrQ8ahh0rx4orSofSBt8+AgBC9+1R/P4N5c/7Y+UHAADOv4qtAAD3h9frT+L/PpXzZCCAAgIAABAAI/FyACizZNCNuATQfv2lqlarpV4D+g1oxr0pXxiWqqgk+YPrGc65TOIPkyMM9/39ZSZaQgEY5ozufO9zs8bVWNGJsbmTBprjX3OSxSKx/Rg2qK2vfXTd6YMr053Z4PIU01kJxslgRrWKUT3RUJZiHo9+efwYbWPrq5p+PtOtN11x0no+x2lUFcNa0S8Z1rXN+dZ9+hXrwkkw9Vw0tX6q3jcYZZBuzeJ+DMzO05Ymik2y6SwJpTzp5dut14NAIcWU40snpX1ZL+mkiHIry3rNu6SsciQ+2E3qjqa8+8jlD/ftWEEPe5A+3R1EL0v6IP64UnHu3trn+2gdUwFezSvnWkV4ftMtFhihBL1bc5QeToGUx7UR0CTQA4U7VYVb1SMHVA7URqAX2Hk5gdxTYY7bGBAH3VAHqA2gh/qAbkiLEr78N3bBhvWbDwQAVVZR4IsWSNhbMSXmEDZkQjQMiKTW2BAwF4GKkLkEcCBnLoZJKgqSc2lgYBeh97PLv6qwov9Sr1iQXr4XT541HXO+uIGOiUSC4om+Ky9M+SSwYmIj74F8hmwEWHZmbl1bsVTCfBMfjTS9Y1yElVMtHyh1H7yHQxUI+x+/yVNebCwm8lMisZa5+IQE7+9jOiRLOZBrjFRVkO3WO2hNRlc9rFxmJap7Msle2acybJCNRUnB8AqPtIj4neykQB5QlZI+AAA=)\n    format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,d09GMgABAAAAAANUAA4AAAAABbwAAAMBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoI0ghgLEAABNgIkAxwEIAWDMgcgG5sECK4GbGM62A+KOMNGmZWUwcdhKI9l4Sh/WwYP/3af9w0W4ERa2bOg405uoSptTooGKkF8HniO5b+Iojvye4dReBbNtVHwcLQTG2gBzQfYOqjJ/XYU/jItwgxa4I3czM4Fj9LAAnlHz+dzgSO71Jqn2QML8H66dROj0qAFLYnRhtm0b89/erW/v8l/LA6we9gCizDBtQzSf4EtkcwDT6RtmgYEQXnDKGQslZyX/CkQSFgBAE4ERggEAgmwACwQgADMsONAJKVkFWEBgAJgwMz1NlLWec3G+jtZu+rXO1i7rx/sZi0AEwB5WVY28FUE1CORQAjvtSPftAwCQQjGAbTUfm4qwrvbNmDEf5pjR4JoxElAiYiMWjQyIAEy4EBGAA4UNKCgIMC7a5Cej2sCAA+SMEEyYA2AMQBWgCmQAObACrAAQAUAJCSDMEDmo7CztfXoRGu7SUeVdbvosOq6N6PHnZ2yf9l3eXPj/q2qXdkjBL+qrix1cYsqzItOvXfRPaMXkUvPeFWoxr7tZB8gfxIhMauBapmSUhO8d3O8wUt0MoI7UAxLzt0/zhCwJnVHrsPYXenm8suPeLYORWqn/3wwK6Qp+frDiYGvxHSXFzoXfpihfmlODl9oFbOqKa8nXbZgd6axNivh4JS8xEZKChij/nuDBPx/MrxQA/WBACCtK44947xa66g/k0YcALjxaesDuBuQP/7x/3bTwmQACVMkAAQYd/7HYBqK1H97hriqWIzlN7cD8Qu1mY6Ql7eR9v8qAcCY/apKqAgArEBCCmOEAExoJiOUENTgBAI3NSBhwSjIbLboV0Blo3PIiN06hxVFfmrr0WtMvzYtWg3SBPDjz58mVY8eLTrpNOm6NfKhidepk6ZAbgbym+oG6PoN0zXxUaBHgx6Demiy6Zq0GdIl3aB6ndo04r7WvSV0/Qa0Nd2+yKcNFCrSvh/6dNKO3xV33aBeEXxNZKTyQUaverfOR49+LZno1XUboBt4oSzpEiXLUSjZDgF8+JHBMIY0KQAA)\n    format('woff2');\n  unicode-range: U+1F00-1FFF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,d09GMgABAAAAABU0AA4AAAAAJLgAABTeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbi3YcNgZgAIFkEQwKrkSlZwuBSAABNgIkA4MMBCAFgzIHIBueHrOiVpNataT4nwk2nboHhRIwDgpKyhjHLyLzQxmFwTYyDE5esZ3+2EabADRB2gAnegV3sg2h4vmn/cH/ujNn5kEfUoTVzJCo7tDcxAh1qBL7aK6c2RAfYY5oH5jywGzfVxj2dQKMqiNV1SGa2/3fsqgYgzZIg4jcRiiRIlUD6TaSLHVGBGIUGIlSIiAWaB/Nlf92N3lGYYsKSKjZnfSTB8DmMi27e2FKIBTaKlRVsztJrgQ/v1ar83g3J/7Bm3pohA6p0P68Qebt32Vvzv+J+e5iNnizRruQrw0imsSTJfEmoUCohFIvESLYkJkG86bdWhrvEfNUcXTtnhaEruXzgVaEu0VRWgYqCFQSqCJQjUANMogmzaJVj+izItbskHExWMtGIeDVV4+zjD3+RFc+yF6RlRIHstekRMaC7I2haQkgC2+4KiUBmJDOA0pVozaXNfBR9QCXV2CAnZZ/Pa939bym2tY015bSKkq/1bW5rl2W3bLb9zSVW4Drhr5Xrw/3s6jw6wK1JMm+D+n/woA6vO4yKdplbgIyweLmY2gZzWw+oG+f+/mW70DuJgYtfT7LzTxPyqddT+nC3/NdfLWlUjfjXEzmQ/hpKLyQ98ii2GeJyRwXTdK9mWCse91WkQMY68rJFB88T8t35mpaolV7x53YfELcGYe/k5e+Q8OkBTnHYqOSF4OEEujtXNjCIqJi4hKSUjJyiiqq1KhTr1m7bj36DRk1YdKUaTPmrFizRZJMikLoKiGpjpWa4NUnWmPomkLTHApWNF+toulu2I0Yi3nKgC9LYMKUrGeVRDIh1kjzTns2qSeP9MP0pJk8NMecFu5MvKMmX6zA/fX9Q5TOL5OXchlXyJRSLinno0o+qMoi3UyrVXFduLL6vNeQVxpzV1Mea84LjsgLhbwUIlcyZi3jNgFs8XbW2ZDJIg2tfzlzKEN1ZtUKbMD8DXNXQz5pzDQnsB/gtQLeJN4m5izUdKksg2nSRk5D9WyKQs/IZRNpGuhaSpjhGY1WObToSmatUWx1JnL5ZiO7F4xkJqXyAGWpz01EMiOaMnHN14SjHwXF8xU3i1ZZWLxpN73ceAqTchLyIBv2QRYchjzI1TkEbetj5cxPxG81MA2TYoHqf182swq5rkjT+39QyZjqzKjJ6TL4ACPwvPgGZpVcE6wV0i7YziJlYTFgz06wSoJTcyZeux6CfnM0C5WIWhExayJu64faUNggA4GImLpCRlmSyTJArnQhQdaTUlJopaw1sgZU7ypr6OEVYGgoYhCPTOddtBvLdjIHMufBjQi9q30D8MqGOGCoW0HhivaBxX30m1mMYRKTOyZX24T8t6yqO5dvKWY8MQzAsmM2BOifOGgAttxzR98dn3SWhwPAfk8fm+A/AFev2NuADZ8FqEOHuBI2prgBmrIZBgrWtzvfgonB94d6Td/a27u4n+rD/W5/2MfyH/R7xOPX9W29sx/qp/ut/qDq9O/Rf48AgdPYjW7/N/rfSMgHsINW4FzQnGsrQe1COnTqEn7aIocMixoxWnLsMePiJtgmJT7+OJkeb0rarDmOeQsWLVlGrVpTZUW1GrXq1GvQaP2LmZ7EKSRh4BXwgf9FYOwMVr0KLHcx4+QVV2Bww8AOyAZgR0TFTAKBMZhV3EvUu2AsNqQDS9LuB4/kVg9nIEAakUChYKh0Etsk91wOkcQ08QqFo2oYDIWCw0AMCzosvVYEqoQgyKYVaV4v0TbyETaLINHkqBSblnAxWVLyxFhZiRT0Sioxaa/G0+vRiXi6Zpzgqf6qMzwKSFfUSjihado5YLh79B8qKJo+FF/xdsZkMlr6To3QREwg/1Z5syFRpJPGSR1WRZchQqfBxXCvElCFwlTFk8zNkqOywH1Jozx2tXrde299rYZi3F/j8hyYUCJzj+MouoariaLpw5/zWB0WCylI6bQBtlJsuLccTCwFl1fCy8BJ66uZzMLZRmjB7AZshWCpiXFLqMjZ+pax70kYJ4g3vdADAy+STlWm6dCBArat+kIJvSkOqDI74f6iAA6NRLZV66doUoUfq975RbXQxEgnLi0r3ZerpoaNaNtv8/mYTGpIneZ0iko225hRgGG6ATv8jFaUUQFVCVL6ZPgE2AwMokMDZTmtsllFK0U39mkUrSheCG2eXAF9/PgHgEJfotR+I+o9dmaSuSLeJiIkgrGO+A9EKvYluMiT4dFRQ3pTajHWl9veBQLEMja6I+NcAZBPIQSUPOluNyL7529e9N4yW178bFRuj4sN7tkVOYyfugKg5w2paeMcad1xefLsQSWpM09kB4uLqzoNTXGmScx8wUOVlR8LTv706zKwnzRrdE29H0sexg7yeBbE9/nzNc3zNHXCm5409hjYGLDVoJ4MDuqTFBLMiY5L9ryuwp4SXqdQ+CuWGi42IIFQY6ro8cALgu77TvsSb6Jv7b9xxbjOkP/JQkGGdIzmAxbccBfRMaV17ab6OH+KR4NEzlTuvmgg55yjyo/ZiaWA7KO3jerpxRvkVdVjPk97M9g1R7fFn8Gek9FO5zVe6ONDwK8lVlcLslVyp3v09KACk89xQwUmt85+2eYA7GhJolY3o2BkbMODdnNr+lhgpjFOnbr1/OBYib21aZpysKN9OmVax6cxd/D5qSIpSPpukN+4CIbSDC6CzbQR2F1wtTFvzdtHjnInQ2MDSg0NJmd5k/L2KvwzFd3KPmtoB3g3lJ0pTcCObzcF8NQLDplpnvYEQRGUjJ/cURmn3HTKPmjU7Tj7EwD/mL8sMJCeAvsFbj96Z4hwh008elN4nYEWhV/w3sBFhqVETU68vNhzRDiiRwVkDedsHC0ISHPeZnOxPwqyNFzQ6a9AyDljFvXSpX5nd/S4c/VY4TBr5xSNeX+M7yuGg+ZVgBVfhZEbARbPLLLL+EQWvW+HSGAFEgjB2gc+3P3eJD018Wtmt/jHZ8XdYf5Agz4qPg8+grlb1CPMR4sx/kqh/bh06g3V6cWhBvfrKEjvzKbFUqP8UzdB/Ol3YMueVGqY9OlRHADQoV9l63ahR2W4mX5NvIs30mrXaAeqlhLLMhLLlumj4uXNgRnRgctAZ4k+Kl4C+ik3jrueOf4g05p2t3z/a1reILNNiQPUJsVUfoBaWoAt/Zp4iT9XEKRW4nqY+i0+YI/nQ4NoUPlJPo1N5rMPVs8bKEWOkFoCQnYtOlYoWsI34XKM3XayooVDte/gEwi45CVs9jrLKkqU/6F91E5pwmZsnN7JjJAANBde3pGpR5wiHi9+UAyHMG+pKt9AtnygvLe/DTABfzBuMx8Z/fjNGJFFygbKGVnUhISyRIwBAFMTEyep2yeWqF0Tx3gjYUDboDOLoq360uwh6wWnmKOjO7PmOgOk/D9zUFGT1x1A+hGsyk6txoL1w3O8YQXFg+seG97ljQCFQeCozGjZDT/VNsIqZLh+40/qbvrgXvxizVZYidysC/xB2fExFRMdkeePZqFdlzi92NCCyMYQuAv67jbcSM3E+4BTayTC4V8u3/guJcJ4AXCu3VljZ61nYGdrtc7GJsTGQZRpZG/NBUpX+DitrYH8Y+PIeDxfCtNUgu6C/tmETvY8+ajxE5pgU3w1Eue1TnB5jmH3HDRfM3N1a7/k5r7OxM31ULubE7g1mOo8OEe+ajznfNCx4eCaH9K2ynJANsrq3RXfnUBr7ODMYa1d3nq6Ng6hTCcrQ2hnw2U6W9no3xzdUNfWwUvPwQY4lkxU7+IfiX5NXARWHRPPsyXEgkWQNTxMTj0F1qNZx1QuHZUM96hDR4uylvFNuJT1ni3Kqf69hQfxT2viFZmz4s4U3SyCBzDjLO4c0R4fXd33EtiFG/+f+wtWTlhxj1oxVx0Tf6IbiQFIDfeoDPfSbdzGVa6Nw2KtfJWRAlC2dBaKm9m/P/5A7/CD+7gWleEPcu1K1r5m0jXXeSNV2v+A2dU/90j/OJiHq2mt/b8la/sxvP5l3sAb8v+S9z2tfQhI1/VCtcPLvTOsxpzBUkrhoT3EK+cMdWuZO7MGS2gF4iby2dPAkGVRKjtwVXoPf2lZ8Ffrh7n2d0mHjCWHjBeKzy3lp70Xl3w+5+pgQsPK/KSI7+O/gfw7deoD+sprsO4GJNpdfD3m3HOzYjQdU+95wFNa6d6c6q37SBtVlUnZKHPiiBqzpRM2wTedkVxOL0VoGEq8fx/ybr0HNobG+T/DZdihtMvY466f3ZBAH4qzifM2v3BkD3LkOe7oig2qnMEq1khpPjoE+dt1SwwcvPFIuF+qF1KMhlZ53FxVkQczMc0PJY6BlceunoBPHlP6qJdfpAWuDDyFTyOWlN5/nlCMNsFUL+HwHD29j57ReGU8TjI2GilMJUUTfH3jPWEw0pDPjCQcUXHyaECSO+roydQIv2pfTDGQOQFumkX//qfCUXQ7O+/9igz/zgEO5x1u++yQGIlFdutyrhSv3Yy4xljupLkmrjlSOqhexWM37f65UF4PK+GVsg2L1G3Mc8//NcvRHdRdS3E1fG10U1iOEM1AO8/KnaHmRZ4OVshCu05J9YNVmsTjk94X3eMQB8weyv478BDm+aGGGWAd4eDuh5R6EG1YmWLsfaA4dAQkFPMJTnlRbhtQf6SWT3VaIMQU7nvpkYtchh/7gR1WLLfvw9L4V9xTNHAj76Cpn7JjCHQkdr3qzIo5YO7Qv9NNLo3HCJCjUCv7tcSH2DQV7mUgyzdhl1TuOwrb4PZHrAvko4J58lW+izo1vxQthxE5hG2sBfJVYzDNPgGvYJBZF4K94oiulYLja8xJeAmCKeBMsOe+NDCWtuF0eg1zirwwCy24p3jnwBZ9NIwD5yyfQjd0lOwWDhSPGhMMyCtXO6MaN+nnnCSckWxkSwelgmAgCWR2/DwBV3fRSkzzRg1ZgHJ5l3YQkhwpHxMNN1+n8DgKKy/0NrW3tVFPvAbmE8+3qPnl7Aogu8keoCElQOVaLhh6uJtZS9oYUhQsV6z6us8EX4/xEvXFuuZvfmvlUBM609Kqb6XyLJkDiDUnbg2s9dEIroC++P2K117UlK8ELtty9oW5aLKxlk6o+gzjnC3H02FEZaivJfFIzjz7P6yXe24DSDOjJwTcdHCs33YPcxDemCFcR21xthRvnddLy2JMHwxJD8EsxJw3SCiCaWjzYU4LKW0FPokf64bGILXnpduBhqH7EXjzLf7IK4AJ58f7wBS07YJEh77c3LwwTr3VFFeHem4ZiHXNjKm2dqrTdWi9bXYesq6w5RFdQ+DEy0DQogHGdTV6w465hZJKWIVcqff7Td+uxP2lq/zaGKxDVwvkYXxwthBJQJsG5boSfGQwkYEZfFSEth4DluyswAhPKWcLcJVzxEs7CMlGsgaoO0IcnbgXtwG5b8Zx2zEuiItxUOF27OVUKg9boJwzDtb3kcZov/auX27bDfvQE2PEC2rxDeCnnldJ7t+0T/oNq3UvoTSgfEfSpngyOYcYllQaLJNUQk3r3roFKUPu10d+o9bIfPVcRZER3p0PbBjiDS8iA2hBVL0A63MMrJ8wJhmUNXLPH7ehkgcIuSqiV4h2OjFP8czC274WsrTwzrzwwVvuUxulJa+Zea+PBKvVaExUbZAciVcMVErWe+1y3243jRahGdZbLgdgc1pZuw3tvhvYEZyVZem7klEBzOyT629lFJILyQUrssdRAxG5kPUyuWfycSfcjOwSSUWUTD7EtcPBGWQs+JU2cFQRFjmTWGmqb6V/38DmomcyA8Zo+atUppDValRReG0IOowzUGInHNe5xaGeZp1/cb8F7oJtT5lDBobJUjRl5ttTLmvXrknyQQqdfEiuQDWVyJoyz6wMFiLtntKGl9UsUR3bXR1+cClQsafCLQXYMq6csDwAzW+ByM5iEUA7kUoTVdELcVwCGoPsE0lFl84+w+2CbbPYl/D/471khHss2BIU+gNPnJe+LupQYTKGzSZ9T8QG4HJ3SDXxZr5x3+EdVYmHCtCt0EhTdiegTziEIqVZmg2GI5ojf15NJok75AT9RUXrr+vo+WJFNZpN6187/P1vu2UCU6TcbSw34otto71ytIVMPtD2wAJT4G0AvLEi539dOSQgXGeK402BSFU3E7Mg1bwStUPpa/WtGCt+wfDyseGwgCOHPFoooIgSyqigihrqaO5o+Gv0pH8xQ3HmBL9wDWYmBRZ7YBaQYZZQFirGdFd/bLBBB7f5SuhHF3rD7iKaer/sXCd6bi9V57pCqtkg0PwS15zTpP/Xh53uZEOSf74EPNOsl0NdkC6gnptWCcrgFSMqadxvxPi0vaaNQKaHEWQ/0XjRFSVY01PJr91+7jWZMMQ0Qq8F45WkTAZ+gGRqUcAorIBw2zQNMD+E++aMzfTgjptQ3ESwC7QbZyTlSvAks5q+3wqS6LsC6sxsGUwreQJ0kvV/aOHuz0W+ta1zhcVMltnswAX1aBlryUxplHde/b9VfMh7BOt4vGjkv3HS6XXwojp3WsGXahpyMjEZUx8CbddNNpTrsksM098IMisB4L3fFgXAF+j946+e/0ZXZa5MRUgIwAJW3Pg/BcCqgzRJ/4cdAfBl7TxX9J0inGb5Cxj7p6s+yVU8Sxy1HZqJhlqok+Yo14TGKKcDqO70ovf1NVfqmi91PJOVrqWP2+tpvrPteVV87I+VL9EEy6pS8xMOB4HoaM7ACLAxZHO4RGA8blWJ8nKMmB2V0ocpqW7QWYOZ7D+JKlFzOcoX1kElsqpcXGuTUN7p6/+Y1xPrlZiR4morkeaSclGOFsd++qOXxYzl1B6eFe58Oltc5e+IT9CoTVQzSczYIjC04jc8RVsb8i7Q6rZqJ4hoN0hJgFZArskxuSVHtBu0S7Q79k7pzzmlQFdLpIzcToRA93ckLeCQ8oHQjByMh+dd6QADaxVwMQCmoZCNaYTqaRoj721xdhon6yvw5o871Tn+ARuXrjy7cezQkTu2WtVquom2IZeWKM7szzriwi7KPRjOwrOl6hbxfiaZvvGQ9B6K9aUdgrti24TU+di9cyON3naGdndX67WTWpiAb4EkdeEWaHudJm3evU2Wu1eZmJx3vnOlVVWHj0w1o65s632U9I3DYJdZWF2skW+D37gRfQZMmuOq4ucnVWNAvgGJsacFAA==)\n    format('woff2');\n  unicode-range: U+0370-03FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,\n    U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,\n    U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: italic;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,\n    U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,\n    U+FEFF, U+FFFD;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F,\n    U+FE2E-FE2F;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,d09GMgABAAAAAALsAA4AAAAABWAAAAKbAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoIYgXsLEAABNgIkAxwEIAWCdAcgG0AEAB6HcYyyEjO2Dy0eKLv4XvfsrGs+wIhEBOHOERRRTI2158fc/aln0WYmSJq8uTRSIgUyIVMqpfa/7uYHCqzWDuHREj0f5UuuL+ZAokTaYgiIs5sF5aUutjO7QhBlgMaYvCAIIqqoCggoq0+HjRlX70MGclDLyR3Z8fb0q/ectzCv30obmLesvO5hBhRhcp7kToaLpaRXpL0htKmb5C3rIgzUIwA1fnqrhHSbqXhA3v+sK1wRtcWuhdyg9E5tGXERkaAhroCGeNqCnJxAm6m1Sb58SICvFhXFWnVAAWQoYRjYADJUQQqIYm0uSZKkfpYv1sv21dm9b7kWbV6i3BQ2Z/sOf/hl+ezXH88LRz75pnLuq4/MO/Zx+eyHc3x9VDn3yfx9n1ILyusq3ps75y90fVZ657PJ2iXgF+odHbvzv7Lrm+uTsPR0WJqYcelN7180rHDDnbeWbrx0QHht49uXjCzffOsd5RsvGvHe4yF5o+Ej97/ZMP62+Z+3Wz/08CtZ/FezhpdvG/nb6PMhC9vNvHFx3Du9X47etewROuONg4L0v2eI+L9X7dt0evq+gNihfvWttiuWK4f8VmxWBM/+WK8b8F6Y9evfLf57r9SjuA2URBAobPm/Smni3y3+n1TqgQEACsl5awAI/5AetjNp65A+/38vDAUXaayPL4CMKHYkEFC0DlfIlbAMegyqlmGU2eSTO58TTHX2xLyWvlczc/wY7eDo5WxlYenKyMvNg9Go5MAatqis2Jty2oytLaPupFxOlsgFObsjM05dBxMHVwcMbeFma4xFh8jZxUr2e62Th09I7Bd96I2RI3gzYzqKcsHjqZzGjsamlojTwdmCy9bKFNm7IBcudRU5BU09BQ5eTm5coMaMAw==)\n    format('woff2');\n  unicode-range: U+1F00-1FFF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0370-03FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,\n    U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,\n    U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,\n    U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,\n    U+FEFF, U+FFFD;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F,\n    U+FE2E-FE2F;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,d09GMgABAAAAAAMAAA4AAAAABWwAAAKuAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoIYgXkLEAABNgIkAxwEIAWDAAcgG0oEAB6D426JQgSiDJGrY+EepR5ejwf4/fWd+/C1EBKYZDS7sRFxHTf9uCJn/m9Of4qsOwRQBbqEex0QSbKziM9Pj42dA85/tYTLU84Cj+f+PIAlq3AtV5GCrQWUqr11TNFedSEUjKs7rSju46fX7RWCSHFAeYQcQRBEKIqiAgIKlGZBdO5a3w4akEBWj6orkgSzThrq5iF0WjfiKGe7e/0dAHkwOR8nW+GblHR72hyEGmzEl02NcDPu9oBKt35NVVBcoyEuIJNhau72SE3EHkhapkdqCiZGhBhliQWUJVETSCQCNfr8o/boWoBjI3miLHqQC4ojH22AaUBxFAUpIBJlJeIVGIvLFI6PlFi4hGYVs0brZ4ZZlT0rbz1SLT+50xlW3X269vh2x+CpO/n7bw02ebvIys0wMkpteMHUIq4PGfxCRBdKjxXGaDRIc42rK+a/qgeebsfBvjGMiQ14cnJjW8fSe6fHlr2NIrgbeH2jS+k9X+md9WJP/5IvZ8LRg1cQ3gz+dJMePnr2/6ZSiy3c9rHc87Zj4tqOx0WLe1U0VR2OOEt9kq4gV/r/NBEyVbPvpL70poCoTunu3LVVZ4nW3xWV8gAKP5VqBMD10Pruq+7/52x5c4B8EQjkzs5oyJ/1JzxT0mgEACA3XjUZACFDut7UuAEqPZepikCuTcprJBVAcSJREzIBeaYSC4kSGAs2BJU5IFLcQjt+sxNAqr55kwOx947iBrvVCRYwpBuDQusVLFWyFCmCVcEwCg8JVsPPK1GwEjxesNZJv6dyHtID6dYP8UnUCvPAemHBGiA+jD6CVgilD8+tWyfSPRiYXwVJDNNkydPUzvrRmeBZvFdArqSTDSCJ3ALcvDp0JBHWjTK8pb0Qvx7N35CkXo0yFRq1qZAgVaJkYiA7H3AA)\n    format('woff2');\n  unicode-range: U+1F00-1FFF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0370-03FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,\n    U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB,\n    U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n@font-face {\n  font-family: Roboto;\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(data:font/woff2;base64,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)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,\n    U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,\n    U+FEFF, U+FFFD;\n}\n"
  },
  {
    "path": "packages/graphiql-react/package.json",
    "content": "{\n  \"name\": \"@graphiql/react\",\n  \"version\": \"0.37.3\",\n  \"sideEffects\": [\n    \"dist/setup-workers/*\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql-react\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/master/packages/graphiql-react#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:@graphiql/react\"\n  },\n  \"license\": \"MIT\",\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./style.css\": \"./dist/style.css\",\n    \"./font/*\": \"./font/*\",\n    \".\": \"./dist/index.js\",\n    \"./setup-workers/*\": {\n      \"types\": \"./dist/setup-workers/*.d.ts\",\n      \"import\": \"./dist/setup-workers/*.js\"\n    }\n  },\n  \"types\": \"dist/index.d.ts\",\n  \"keywords\": [\n    \"react\",\n    \"graphql\",\n    \"sdk\",\n    \"monaco-editor\",\n    \"monaco-graphql\",\n    \"monaco\"\n  ],\n  \"files\": [\n    \"dist\",\n    \"font\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"dev\": \"vite build --watch --emptyOutDir=false\",\n    \"build\": \"vite build\",\n    \"test\": \"vitest --typecheck\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\",\n    \"react\": \"^18 || ^19\",\n    \"react-compiler-runtime\": \"19.1.0-rc.1\",\n    \"react-dom\": \"^18 || ^19\"\n  },\n  \"dependencies\": {\n    \"@graphiql/toolkit\": \"^0.11.3\",\n    \"@radix-ui/react-dialog\": \"^1.1\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1\",\n    \"@radix-ui/react-tooltip\": \"^1.2\",\n    \"@radix-ui/react-visually-hidden\": \"^1.2\",\n    \"clsx\": \"^1.2.1\",\n    \"framer-motion\": \"^12.12\",\n    \"get-value\": \"^3.0.1\",\n    \"graphql-language-service\": \"^5.5.0\",\n    \"jsonc-parser\": \"^3.3.1\",\n    \"markdown-it\": \"^14.1.0\",\n    \"monaco-editor\": \"0.52.2\",\n    \"monaco-graphql\": \"^1.7.3\",\n    \"prettier\": \"^3.5.3\",\n    \"set-value\": \"^4.1.0\",\n    \"zustand\": \"^5\"\n  },\n  \"devDependencies\": {\n    \"@babel/helper-string-parser\": \"^7.19.4\",\n    \"@types/get-value\": \"^3.0.5\",\n    \"@types/markdown-it\": \"^14.1.2\",\n    \"@types/react-dom\": \"^19.1.2\",\n    \"@types/set-value\": \"^4.0.1\",\n    \"@vitejs/plugin-react\": \"^4.4.1\",\n    \"babel-plugin-react-compiler\": \"19.1.0-rc.1\",\n    \"graphql\": \"^16.9.0\",\n    \"react\": \"^19.1.0\",\n    \"react-dom\": \"^19.1.0\",\n    \"typescript\": \"^4.6.3\",\n    \"vite\": \"^6.3.4\",\n    \"vite-plugin-dts\": \"^4.5.3\",\n    \"vite-plugin-svgr\": \"^4.3.0\"\n  },\n  \"browser\": {\n    \"//\": \"Prevents esm.sh from injecting Node.js globals like `process`, which can break browser features (e.g., Mac `Cmd` key) when loading from CDN.\",\n    \"buffer\": false,\n    \"process\": false\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/setup-files.ts",
    "content": "// to make it works like Jest (auto-mocking)\nvi.mock('monaco-editor');\n\nexport {};\n"
  },
  {
    "path": "packages/graphiql-react/src/components/button/index.css",
    "content": ".graphiql-un-styled {\n  all: unset;\n  border-radius: var(--border-radius-4);\n  cursor: pointer;\n\n  &:hover {\n    background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  }\n\n  &:active {\n    background-color: hsla(\n      var(--color-neutral),\n      var(--alpha-background-medium)\n    );\n  }\n\n  &:focus {\n    outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px;\n  }\n}\n\n.graphiql-button,\nbutton.graphiql-button {\n  background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  border: none;\n  border-radius: var(--border-radius-4);\n  color: hsl(var(--color-neutral));\n  cursor: pointer;\n  font-size: var(--font-size-body);\n  padding: var(--px-8) var(--px-12);\n\n  &:hover,\n  &:active {\n    background-color: hsla(\n      var(--color-neutral),\n      var(--alpha-background-medium)\n    );\n  }\n\n  &:focus {\n    outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px;\n  }\n\n  &.graphiql-button-success {\n    background-color: hsla(var(--color-success), var(--alpha-background-heavy));\n  }\n  &.graphiql-button-error {\n    background-color: hsla(var(--color-error), var(--alpha-background-heavy));\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/button/index.tsx",
    "content": "import { ComponentPropsWithoutRef, forwardRef } from 'react';\nimport { cn } from '../../utility';\nimport './index.css';\n\ntype UnStyledButtonProps = ComponentPropsWithoutRef<'button'>;\n\nexport const UnStyledButton = forwardRef<\n  HTMLButtonElement,\n  UnStyledButtonProps\n>((props, ref) => (\n  <button\n    {...props}\n    ref={ref}\n    className={cn('graphiql-un-styled', props.className)}\n  />\n));\nUnStyledButton.displayName = 'UnStyledButton';\n\ninterface ButtonProps extends UnStyledButtonProps {\n  state?: 'success' | 'error';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n  (props, ref) => (\n    <button\n      {...props}\n      ref={ref}\n      className={cn(\n        'graphiql-button',\n        {\n          success: 'graphiql-button-success',\n          error: 'graphiql-button-error',\n        }[props.state!],\n        props.className,\n      )}\n    />\n  ),\n);\nButton.displayName = 'Button';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/button-group/index.css",
    "content": ".graphiql-button-group {\n  background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n  /* Border radius of button plus padding */\n  border-radius: calc(var(--border-radius-4) + var(--px-4));\n  display: flex;\n  padding: var(--px-4);\n\n  & > button.graphiql-button {\n    background-color: transparent;\n    &:hover {\n      background-color: hsla(\n        var(--color-neutral),\n        var(--alpha-background-light)\n      );\n    }\n    &.active {\n      background-color: hsl(var(--color-base));\n      cursor: default;\n    }\n  }\n\n  & > * + * {\n    margin-left: var(--px-8);\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/button-group/index.tsx",
    "content": "import { ComponentPropsWithoutRef, forwardRef } from 'react';\nimport { cn } from '../../utility';\nimport './index.css';\n\nexport const ButtonGroup = forwardRef<\n  HTMLDivElement,\n  ComponentPropsWithoutRef<'div'>\n>((props, ref) => (\n  <div\n    {...props}\n    ref={ref}\n    className={cn('graphiql-button-group', props.className)}\n  />\n));\nButtonGroup.displayName = 'ButtonGroup';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/dialog/index.css",
    "content": ".graphiql-dialog-overlay {\n  position: fixed;\n  inset: 0;\n  background-color: hsla(var(--color-neutral), var(--alpha-background-heavy));\n  /**\n   * CodeMirror has a `z-index` set for the container of the scrollbar of the\n   * editor, so we have to add one here to make sure that the dialog is shown\n   * above the editor scrollbar (if they are visible).\n   */\n  z-index: 10;\n}\n\n.graphiql-dialog {\n  background-color: hsl(var(--color-base));\n  border: var(--popover-border);\n  border-radius: var(--border-radius-12);\n  box-shadow: var(--popover-box-shadow);\n  margin: 0;\n  max-height: 80vh;\n  max-width: 80vw;\n  overflow: auto;\n  padding: 0;\n  width: unset;\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n  position: fixed;\n  z-index: 10;\n}\n\n.graphiql-dialog-close > svg {\n  color: hsla(var(--color-neutral), var(--alpha-secondary));\n  display: block;\n  height: var(--px-12);\n  padding: var(--px-12);\n  width: var(--px-12);\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/dialog/index.tsx",
    "content": "import { cn } from '../../utility';\nimport { forwardRef, FC, ComponentPropsWithoutRef } from 'react';\nimport { CloseIcon } from '../../icons';\nimport { UnStyledButton } from '../button';\nimport * as D from '@radix-ui/react-dialog';\nimport { Root as VisuallyHidden } from '@radix-ui/react-visually-hidden';\n\nimport './index.css';\n\nconst DialogClose = forwardRef<\n  HTMLButtonElement,\n  ComponentPropsWithoutRef<'button'>\n>((props, ref) => (\n  <D.Close asChild>\n    <UnStyledButton\n      {...props}\n      ref={ref}\n      type=\"button\"\n      className={cn('graphiql-dialog-close', props.className)}\n    >\n      <VisuallyHidden>Close dialog</VisuallyHidden>\n      <CloseIcon />\n    </UnStyledButton>\n  </D.Close>\n));\nDialogClose.displayName = 'Dialog.Close';\n\nconst DialogRoot: FC<D.DialogProps> = ({ children, ...props }) => {\n  return (\n    <D.Root {...props}>\n      <D.Portal>\n        <D.Overlay className=\"graphiql-dialog-overlay\" />\n        <D.Content className=\"graphiql-dialog\">{children}</D.Content>\n      </D.Portal>\n    </D.Root>\n  );\n};\n\nexport const Dialog = Object.assign(DialogRoot, {\n  Close: DialogClose,\n  Title: D.Title,\n  Trigger: D.Trigger,\n  Description: D.Description,\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/components/dropdown-menu/index.css",
    "content": ".graphiql-dropdown-content {\n  background-color: hsl(var(--color-base));\n  border: var(--popover-border);\n  border-radius: var(--border-radius-8);\n  box-shadow: var(--popover-box-shadow);\n  font-size: inherit;\n  max-width: 250px;\n  padding: var(--px-4);\n  font-family: var(--font-family);\n  color: hsl(var(--color-neutral));\n  max-height: min(\n    calc(var(--radix-dropdown-menu-content-available-height) - 10px),\n    400px\n  );\n  overflow-y: auto;\n}\n\n.graphiql-dropdown-item {\n  border-radius: var(--border-radius-4);\n  font-size: inherit;\n  margin: var(--px-4);\n  overflow: hidden;\n  padding: var(--px-6) var(--px-8);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  outline: none;\n  cursor: pointer;\n  line-height: var(--line-height);\n\n  &[data-selected],\n  &[data-current-nav],\n  &:hover {\n    background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n    color: inherit;\n  }\n\n  &:not(:first-child) {\n    margin-top: 0;\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/dropdown-menu/index.tsx",
    "content": "import { ComponentProps, FC, forwardRef } from 'react';\nimport { cn } from '../../utility';\nimport {\n  Trigger,\n  Portal,\n  Content as RadixContent,\n  Item as RadixItem,\n  DropdownMenuContentProps,\n  DropdownMenuItemProps,\n  Root,\n} from '@radix-ui/react-dropdown-menu';\nimport './index.css';\n\nconst Button = forwardRef<HTMLButtonElement, ComponentProps<'button'>>(\n  (props, ref) => (\n    <Trigger asChild>\n      <button\n        {...props}\n        ref={ref}\n        className={cn('graphiql-un-styled', props.className)}\n      />\n    </Trigger>\n  ),\n);\nButton.displayName = 'DropdownMenuButton';\n\nconst Content: FC<DropdownMenuContentProps> = ({\n  children,\n  align = 'start',\n  sideOffset = 5,\n  className,\n  ...props\n}) => {\n  return (\n    <Portal>\n      <RadixContent\n        align={align}\n        sideOffset={sideOffset}\n        className={cn('graphiql-dropdown-content', className)}\n        {...props}\n      >\n        {children}\n      </RadixContent>\n    </Portal>\n  );\n};\n\nconst Item: FC<DropdownMenuItemProps> = ({ className, children, ...props }) => (\n  <RadixItem className={cn('graphiql-dropdown-item', className)} {...props}>\n    {children}\n  </RadixItem>\n);\n\nexport const DropdownMenu = Object.assign(Root, {\n  Button,\n  Item,\n  Content,\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/components/execute-button/index.css",
    "content": "button.graphiql-execute-button {\n  background-color: hsl(var(--color-primary));\n  border: none;\n  border-radius: var(--border-radius-8);\n  cursor: pointer;\n  height: var(--toolbar-width);\n  padding: 0;\n  width: var(--toolbar-width);\n\n  &:hover {\n    background-color: hsla(var(--color-primary), 0.9);\n  }\n\n  &:active {\n    background-color: hsla(var(--color-primary), 0.8);\n  }\n\n  &:focus {\n    outline: hsla(var(--color-primary), 0.8) auto 1px;\n  }\n\n  & > svg {\n    color: white;\n    display: block;\n    height: var(--px-16);\n    margin: auto;\n    width: var(--px-16);\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/execute-button/index.tsx",
    "content": "import type { FC } from 'react';\nimport { useGraphiQL, useGraphiQLActions } from '../provider';\nimport { PlayIcon, StopIcon } from '../../icons';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { Tooltip } from '../tooltip';\nimport { KEY_MAP, formatShortcutForOS } from '../../constants';\nimport { pick } from '../../utility';\nimport './index.css';\n\nexport const ExecuteButton: FC = () => {\n  const { setOperationName, run, stop } = useGraphiQLActions();\n  const {\n    operations = [],\n    operationName,\n    isFetching,\n    overrideOperationName,\n  } = useGraphiQL(\n    pick('operations', 'operationName', 'isFetching', 'overrideOperationName'),\n  );\n  const isSubscribed = useGraphiQL(state => Boolean(state.subscription));\n  const hasOptions =\n    operations.length > 1 && typeof overrideOperationName !== 'string';\n  const isRunning = isFetching || isSubscribed;\n\n  const label = `${isRunning ? 'Stop' : 'Execute'} query (${formatShortcutForOS(KEY_MAP.runQuery.key, 'Cmd')})`;\n  const buttonProps = {\n    type: 'button' as const,\n    className: 'graphiql-execute-button',\n    children: isRunning ? <StopIcon /> : <PlayIcon />,\n    'aria-label': label,\n  };\n\n  return hasOptions && !isRunning ? (\n    <DropdownMenu>\n      <Tooltip label={label}>\n        <DropdownMenu.Button {...buttonProps} />\n      </Tooltip>\n\n      <DropdownMenu.Content>\n        {operations.map((operation, i) => {\n          const opName = operation.name\n            ? operation.name.value\n            : `<Unnamed ${operation.operation}>`;\n          return (\n            <DropdownMenu.Item\n              key={`${opName}-${i}`}\n              onSelect={() => {\n                const selectedOperationName = operation.name?.value;\n                if (\n                  selectedOperationName &&\n                  selectedOperationName !== operationName\n                ) {\n                  setOperationName(selectedOperationName);\n                }\n                run();\n              }}\n            >\n              {opName}\n            </DropdownMenu.Item>\n          );\n        })}\n      </DropdownMenu.Content>\n    </DropdownMenu>\n  ) : (\n    <Tooltip label={label}>\n      <button {...buttonProps} onClick={isRunning ? stop : run} />\n    </Tooltip>\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/components/image-preview.tsx",
    "content": "import { FC, useEffect, useRef, useState } from 'react';\n\ninterface ImagePreviewProps {\n  path: string;\n}\n\ninterface Dimensions {\n  width: number | null;\n  height: number | null;\n}\n\nconst ImagePreview_: FC<ImagePreviewProps> = ({ path }) => {\n  const [{ width, height }, setDimensions] = useState<Dimensions>({\n    width: null,\n    height: null,\n  });\n  const [mime, setMime] = useState<string | null>(null);\n  const ref = useRef<HTMLImageElement>(null!);\n  const src = pathToURL(path)?.href;\n\n  useEffect(() => {\n    if (!src) {\n      setDimensions({ width: null, height: null });\n      setMime(null);\n      return;\n    }\n\n    fetch(src, { method: 'HEAD' })\n      .then(response => {\n        setMime(response.headers.get('Content-Type'));\n      })\n      .catch(() => {\n        setMime(null);\n      });\n  }, [src]);\n\n  return (\n    <div>\n      <img\n        alt=\"\"\n        onLoad={() => {\n          setDimensions({\n            width: ref.current.naturalWidth,\n            height: ref.current.naturalHeight,\n          });\n        }}\n        ref={ref}\n        src={src}\n      />\n      {width !== null && height !== null && (\n        <div>\n          {width}x{height}\n          {mime && ' ' + mime}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport const ImagePreview = Object.assign(ImagePreview_, {\n  shouldRender(path: string) {\n    const url = pathToURL(path);\n    return url ? /\\.(bmp|gif|jpe?g|png|svg|webp)$/.test(url.pathname) : false;\n  },\n});\n\nfunction pathToURL(path: string) {\n  const value = path.slice(1).trim();\n  try {\n    return new URL(value, location.protocol + '//' + location.host);\n  } catch {}\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/index.ts",
    "content": "export { ExecuteButton } from './execute-button';\nexport { ToolbarButton } from './toolbar-button';\nexport { ToolbarMenu } from './toolbar-menu';\n\nexport { RequestHeadersEditor as HeaderEditor } from './request-headers-editor';\nexport { ImagePreview } from './image-preview';\nexport { GraphiQLProvider, useGraphiQL, useGraphiQLActions } from './provider';\nexport { OperationEditor as QueryEditor } from './operation-editor';\nexport { ResponseEditor } from './response-editor';\nexport { VariablesEditor as VariableEditor } from './variables-editor';\n\nexport { Button, UnStyledButton } from './button';\nexport { ButtonGroup } from './button-group';\nexport { Dialog } from './dialog';\nexport { DropdownMenu } from './dropdown-menu';\nexport { MarkdownContent } from './markdown-content';\nexport { Spinner } from './spinner';\nexport { Tabs, Tab } from './tabs';\nexport { Tooltip } from './tooltip';\nexport { Root as VisuallyHidden } from '@radix-ui/react-visually-hidden';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/markdown-content/index.css",
    "content": "/**\n * We render markdown in the following places:\n * - In the hint tooltip when typing in the operation editor (field description\n *   and, optionally, deprecation reason).\n * - In the info tooltip when hovering over a field in the operation editor\n *   (field description and, optionally, deprecation reason).\n */\n\n.graphiql-markdown-description,\n.graphiql-markdown-deprecation {\n  & blockquote {\n    margin-left: 0;\n    margin-right: 0;\n    padding-left: var(--px-8);\n  }\n\n  & code,\n  & pre {\n    border-radius: var(--border-radius-4);\n    font-family: var(--font-family-mono);\n    font-size: var(--font-size-inline-code);\n  }\n\n  & code {\n    padding: var(--px-2);\n  }\n\n  & pre {\n    overflow: auto;\n    padding: var(--px-6) var(--px-8);\n  }\n\n  & pre code {\n    background-color: initial;\n    border-radius: 0;\n    padding: 0;\n  }\n\n  & ol,\n  & ul {\n    padding-left: var(--px-16);\n  }\n\n  & ol {\n    list-style-type: decimal;\n  }\n\n  & ul {\n    list-style-type: disc;\n  }\n\n  & img {\n    border-radius: var(--border-radius-4);\n    max-height: 120px;\n    max-width: 100%;\n  }\n\n  & > :first-child {\n    margin-top: 0;\n  }\n\n  & > :last-child {\n    margin-bottom: 0;\n  }\n}\n\n.graphiql-markdown-description {\n  & a {\n    color: hsl(var(--color-primary));\n    text-decoration: none;\n\n    &:hover {\n      text-decoration: underline;\n    }\n  }\n\n  & blockquote {\n    border-left: 1.5px solid hsla(var(--color-neutral), var(--alpha-tertiary));\n  }\n\n  & code,\n  & pre {\n    background-color: hsla(var(--color-neutral), var(--alpha-background-light));\n    color: hsl(var(--color-neutral));\n  }\n\n  & > * {\n    margin: var(--px-12) 0;\n  }\n}\n\n.graphiql-markdown-deprecation {\n  & a {\n    color: hsl(var(--color-warning));\n    text-decoration: underline;\n  }\n\n  & blockquote {\n    border-left: 1.5px solid hsl(var(--color-warning));\n  }\n\n  & code,\n  & pre {\n    background-color: hsla(var(--color-warning), var(--alpha-background-heavy));\n  }\n\n  & > * {\n    margin: var(--px-8) 0;\n  }\n}\n\n.graphiql-markdown-preview > :not(:first-child) {\n  display: none;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/markdown-content/index.tsx",
    "content": "import { ComponentPropsWithoutRef, forwardRef } from 'react';\nimport { cn, markdown } from '../../utility';\nimport './index.css';\n\ninterface MarkdownContentProps\n  extends Omit<ComponentPropsWithoutRef<'div'>, 'children'> {\n  children: string;\n  onlyShowFirstChild?: boolean;\n  type: 'description' | 'deprecation';\n}\n\nexport const MarkdownContent = forwardRef<HTMLDivElement, MarkdownContentProps>(\n  ({ children, onlyShowFirstChild, type, ...props }, ref) => (\n    <div\n      {...props}\n      ref={ref}\n      className={cn(\n        `graphiql-markdown-${type}`,\n        onlyShowFirstChild && 'graphiql-markdown-preview',\n        props.className,\n      )}\n      dangerouslySetInnerHTML={{ __html: markdown.render(children) }}\n    />\n  ),\n);\nMarkdownContent.displayName = 'MarkdownContent';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/operation-editor.tsx",
    "content": "import { getSelectedOperationName } from '@graphiql/toolkit';\nimport type { DocumentNode } from 'graphql';\nimport {\n  getOperationFacts,\n  getContextAtPosition,\n} from 'graphql-language-service';\nimport { FC, useEffect, useRef } from 'react';\nimport { useMonaco } from '../stores';\nimport { useGraphiQL, useGraphiQLActions } from './provider';\nimport {\n  debounce,\n  getOrCreateModel,\n  createEditor,\n  onEditorContainerKeyDown,\n  pick,\n  cleanupDisposables,\n  cn,\n  Uri,\n  Range,\n} from '../utility';\nimport type { MonacoEditor, EditorProps, SchemaReference } from '../types';\nimport {\n  KEY_BINDINGS,\n  URI_NAME,\n  STORAGE_KEY,\n  MONACO_GRAPHQL_DIAGNOSTIC_SETTINGS,\n} from '../constants';\nimport type * as monaco from 'monaco-editor';\nimport { toGraphQLPosition } from 'monaco-graphql/esm/utils.js';\n\ninterface OperationEditorProps extends EditorProps {\n  /**\n   * Invoked when a reference to the GraphQL schema (type or field) is clicked\n   * as part of the editor or one of its tooltips.\n   * @param reference - The reference that has been clicked.\n   */\n  onClickReference?(reference: SchemaReference): void;\n\n  /**\n   * Invoked when the contents of the operation editor change.\n   * @param value - The new contents of the editor.\n   * @param documentAST - The editor contents parsed into a GraphQL document.\n   */\n  onEdit?(value: string, documentAST?: DocumentNode): void;\n}\n\nexport const OperationEditor: FC<OperationEditorProps> = ({\n  onClickReference,\n  onEdit,\n  ...props\n}) => {\n  const {\n    setOperationName,\n    setEditor,\n    updateActiveTabValues,\n    setVisiblePlugin,\n    setSchemaReference,\n    run,\n    setOperationFacts,\n    copyQuery,\n    prettifyEditors,\n    mergeQuery,\n  } = useGraphiQLActions();\n  const {\n    initialQuery,\n    schema,\n    referencePlugin,\n    operations,\n    operationName,\n    externalFragments,\n    uriInstanceId,\n    storage,\n    monacoTheme,\n  } = useGraphiQL(\n    pick(\n      'initialQuery',\n      'schema',\n      'referencePlugin',\n      'operations',\n      'operationName',\n      'externalFragments',\n      'uriInstanceId',\n      'storage',\n      'monacoTheme',\n    ),\n  );\n  const ref = useRef<HTMLDivElement>(null!);\n  const onClickReferenceRef = useRef<OperationEditorProps['onClickReference']>(\n    null!,\n  );\n  useEffect(() => {\n    onClickReferenceRef.current = onClickReference;\n  }, [onClickReference]);\n\n  /*\n  useEffect(() => {\n    void importCodeMirrorImports().then(CodeMirror => {\n      const container = ref.current;\n      const newEditor = CodeMirror(container, {\n        hintOptions: {\n          closeOnUnfocus: false,\n          completeSingle: false,\n          autocompleteOptions: {\n            // for the operation editor, restrict to executable type definitions\n            mode: GraphQLDocumentMode.EXECUTABLE,\n          },\n        },\n        info: {\n          renderDescription: (text: string) => markdown.render(text),\n          onClick(reference: SchemaReference) {\n            onClickReferenceRef(reference);\n          },\n        },\n        jump: {\n          onClick(reference: SchemaReference) {\n            onClickReferenceRef(reference);\n          },\n        },\n      });\n\n      function showHint() {\n        newEditor.showHint({ completeSingle: true, container });\n      }\n\n      newEditor.addKeyMap({\n        'Cmd-Space': showHint,\n        'Ctrl-Space': showHint,\n        'Alt-Space': showHint,\n        'Shift-Space': showHint,\n        'Shift-Alt-Space': showHint,\n      });\n\n      let showingHints = false;\n\n      // fired whenever a hint dialog opens\n      newEditor.on('startCompletion', () => {\n        showingHints = true;\n      });\n\n      // the codemirror hint extension fires this anytime the dialog is closed\n      // via any method (e.g., focus blur, escape key, ...)\n      newEditor.on('endCompletion', () => {\n        showingHints = false;\n      });\n\n      newEditor.on('keydown', (editorInstance, event) => {\n        if (event.key === 'Escape' && showingHints) {\n          event.stopPropagation();\n        }\n      });\n\n      newEditor.on('beforeChange', (editorInstance, change) => {\n        // The update function is only present on non-redo, non-undo events.\n        if (change.origin === 'paste') {\n          const text = change.text.map(normalizeWhitespace);\n          change.update?.(change.from, change.to, text);\n        }\n      });\n    });\n  }, []);\n    */\n\n  function getAndUpdateOperationFacts(editorInstance: MonacoEditor) {\n    const operationFacts = getOperationFacts(schema, editorInstance.getValue());\n    // Update the operation name should any query names change.\n    const newOperationName = getSelectedOperationName(\n      operations,\n      operationName,\n      operationFacts?.operations,\n    );\n    setOperationFacts({\n      documentAST: operationFacts?.documentAST,\n      operationName: newOperationName,\n      operations: operationFacts?.operations,\n    });\n\n    return operationFacts\n      ? { ...operationFacts, operationName: newOperationName }\n      : null;\n  }\n\n  const runAtCursorRef = useRef<monaco.editor.IActionDescriptor['run']>(null!);\n\n  useEffect(() => {\n    runAtCursorRef.current = editor => {\n      if (!operations) {\n        run();\n        return;\n      }\n      const position = editor.getPosition()!;\n      const cursorIndex = editor.getModel()!.getOffsetAt(position);\n\n      // Loop through all operations to see if one contains the cursor.\n      let newOperationName: string | undefined;\n      for (const operation of operations) {\n        if (\n          operation.loc &&\n          operation.loc.start <= cursorIndex &&\n          operation.loc.end >= cursorIndex\n        ) {\n          newOperationName = operation.name?.value;\n        }\n      }\n\n      if (newOperationName && newOperationName !== operationName) {\n        setOperationName(newOperationName);\n      }\n      run();\n    };\n  }, [operationName, operations, run, setOperationName]);\n\n  const { monacoGraphQL, monaco } = useMonaco();\n\n  useEffect(() => {\n    if (!monaco || !monacoGraphQL) {\n      return;\n    }\n    const operationUri = Uri.file(`${uriInstanceId}${URI_NAME.operation}`);\n    const variablesUri = Uri.file(`${uriInstanceId}${URI_NAME.variables}`);\n    /**\n     * Mutate the global `validateVariablesJSON` object to setup which operation editor is validated\n     * by which variables editor. Since we can have multiple GraphiQL instances on the same page.\n     */\n    const { validateVariablesJSON } = MONACO_GRAPHQL_DIAGNOSTIC_SETTINGS;\n    validateVariablesJSON![operationUri.toString()] = [variablesUri.toString()];\n    monacoGraphQL.setDiagnosticSettings(MONACO_GRAPHQL_DIAGNOSTIC_SETTINGS);\n    const model = getOrCreateModel({\n      uri: operationUri.path.replace('/', ''),\n      value: initialQuery,\n    });\n    const editor = createEditor(ref, {\n      model,\n      theme: monacoTheme,\n    });\n    setEditor({ queryEditor: editor });\n\n    // We don't use the generic `useChangeHandler` hook here because we want to\n    // have additional logic that updates the operation facts that we save in `editorStore`\n    const handleChange = debounce(100, () => {\n      const query = editor.getValue();\n      storage.set(STORAGE_KEY.query, query);\n\n      const operationFacts = getAndUpdateOperationFacts(editor);\n      // Invoke callback props only after the operation facts have been updated\n      onEdit?.(query, operationFacts?.documentAST);\n      if (\n        operationFacts?.operationName &&\n        operationName !== operationFacts.operationName\n      ) {\n        setOperationName(operationFacts.operationName);\n      }\n\n      updateActiveTabValues({\n        query,\n        operationName: operationFacts?.operationName ?? null,\n      });\n    });\n    // Call once to initially update the values\n    getAndUpdateOperationFacts(editor);\n\n    const disposables = [\n      model.onDidChangeContent(handleChange),\n      editor.addAction({\n        ...KEY_BINDINGS.runQuery,\n        run: (...args) => runAtCursorRef.current(...args),\n      }),\n      editor.addAction({ ...KEY_BINDINGS.copyQuery, run: copyQuery }),\n      editor.addAction({ ...KEY_BINDINGS.prettify, run: prettifyEditors }),\n      editor.addAction({ ...KEY_BINDINGS.mergeFragments, run: mergeQuery }),\n      editor,\n      model,\n    ];\n    return cleanupDisposables(disposables);\n  }, [monaco, monacoGraphQL]); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n  useEffect(() => {\n    if (!schema || !monaco || !monacoGraphQL) {\n      return;\n    }\n    monacoGraphQL.setSchemaConfig([\n      { uri: `${uriInstanceId}${URI_NAME.schema}`, schema },\n    ]);\n    monacoGraphQL.setExternalFragmentDefinitions([\n      ...externalFragments.values(),\n    ]);\n    if (!referencePlugin) {\n      return;\n    }\n\n    let currentSchemaReference: SchemaReference | null = null;\n\n    const disposables = [\n      monaco.languages.registerDefinitionProvider('graphql', {\n        provideDefinition(model, position, _token) {\n          const graphQLPosition = toGraphQLPosition(position);\n          const context = getContextAtPosition(\n            model.getValue(),\n            graphQLPosition,\n            schema,\n          );\n          if (!context) {\n            return;\n          }\n          const { typeInfo, token } = context;\n          const { kind, step } = token.state;\n\n          if (\n            (kind === 'Field' && step === 0 && typeInfo.fieldDef) ||\n            (kind === 'AliasedField' && step === 2 && typeInfo.fieldDef) ||\n            (kind === 'ObjectField' && step === 0 && typeInfo.fieldDef) ||\n            (kind === 'Directive' && step === 1 && typeInfo.directiveDef) ||\n            (kind === 'Variable' && typeInfo.type) ||\n            (kind === 'Argument' && step === 0 && typeInfo.argDef) ||\n            (kind === 'EnumValue' &&\n              typeInfo.enumValue &&\n              'description' in typeInfo.enumValue) ||\n            (kind === 'NamedType' &&\n              typeInfo.type &&\n              'description' in typeInfo.type)\n          ) {\n            currentSchemaReference = { kind, typeInfo };\n            const { lineNumber, column } = position;\n            const range = new Range(lineNumber, column, lineNumber, column);\n            return [{ uri: model.uri, range }];\n          }\n          currentSchemaReference = null;\n        },\n      }),\n      monaco.languages.registerReferenceProvider('graphql', {\n        provideReferences(model, { lineNumber, column }, _context, _token) {\n          if (!currentSchemaReference) {\n            return;\n          }\n          setVisiblePlugin(referencePlugin);\n          setSchemaReference(currentSchemaReference);\n          onClickReferenceRef.current?.(currentSchemaReference);\n\n          const range = new Range(lineNumber, column, lineNumber, column);\n          return [{ uri: model.uri, range }];\n        },\n      }),\n    ];\n    return cleanupDisposables(disposables);\n  }, [\n    schema,\n    referencePlugin,\n    setSchemaReference,\n    setVisiblePlugin,\n    externalFragments,\n    uriInstanceId,\n    monacoGraphQL,\n    monaco,\n  ]);\n\n  return (\n    <div\n      ref={ref}\n      tabIndex={0}\n      onKeyDown={onEditorContainerKeyDown}\n      {...props}\n      className={cn('graphiql-editor', props.className)}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/components/provider.tsx",
    "content": "/* eslint sort-keys: \"error\" */\nimport type { FC, ReactNode, RefObject } from 'react';\nimport {\n  createContext,\n  useContext,\n  useRef,\n  useEffect,\n  useId,\n  useState,\n} from 'react';\nimport { create, useStore, UseBoundStore, StoreApi } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport { StorageAPI } from '@graphiql/toolkit';\nimport {\n  createEditorSlice,\n  createExecutionSlice,\n  createPluginSlice,\n  createSchemaSlice,\n  createThemeSlice,\n  createStorageSlice,\n  EditorProps,\n  ExecutionProps,\n  PluginProps,\n  SchemaProps,\n  ThemeProps,\n  StorageProps,\n  useMonaco,\n} from '../stores';\nimport type { SlicesWithActions } from '../types';\nimport { useDidUpdate } from '../utility';\nimport {\n  FragmentDefinitionNode,\n  parse,\n  visit,\n  isSchema,\n  validateSchema,\n} from 'graphql';\nimport {\n  DEFAULT_PRETTIFY_QUERY,\n  DEFAULT_QUERY,\n  MONACO_THEME_NAME,\n  STORAGE_KEY,\n} from '../constants';\nimport { getDefaultTabState } from '../utility/tabs';\n\ninterface GraphiQLProviderProps\n  extends EditorProps,\n    ExecutionProps,\n    PluginProps,\n    SchemaProps,\n    ThemeProps,\n    StorageProps {\n  children: ReactNode;\n}\n\ntype GraphiQLStore = UseBoundStore<StoreApi<SlicesWithActions>>;\n\nconst GraphiQLContext = createContext<RefObject<GraphiQLStore> | null>(null);\n\nexport const GraphiQLProvider: FC<GraphiQLProviderProps> = props => {\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime check\n  if (!props.fetcher) {\n    throw new TypeError(\n      'The `GraphiQLProvider` component requires a `fetcher` function to be passed as prop.',\n    );\n  }\n  // @ts-expect-error -- runtime check\n  if (props.validationRules) {\n    throw new TypeError(\n      'The `validationRules` prop has been removed. Use custom GraphQL worker, see https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql#custom-webworker-for-passing-non-static-config-to-worker.',\n    );\n  }\n  // @ts-expect-error -- runtime check\n  if (props.query) {\n    throw new TypeError(\n      'The `query` prop has been removed. Use `initialQuery` prop instead, or set value programmatically using:\\n' +\n        `\nconst queryEditor = useGraphiQL(state => state.queryEditor)\n\nuseEffect(() => {\n  queryEditor.setValue(query)\n}, [query])`,\n    );\n  }\n  // @ts-expect-error -- runtime check\n  if (props.variables) {\n    throw new TypeError(\n      'The `variables` prop has been removed. Use `initialVariables` prop instead, or set value programmatically using:\\n' +\n        `\nconst variableEditor = useGraphiQL(state => state.variableEditor)\n\nuseEffect(() => {\n  variableEditor.setValue(variables)\n}, [variables])`,\n    );\n  }\n  // @ts-expect-error -- runtime check\n  if (props.headers) {\n    throw new TypeError(\n      'The `headers` prop has been removed. Use `initialHeaders` prop instead, or set value programmatically using:\\n' +\n        `\nconst headerEditor = useGraphiQL(state => state.headerEditor)\n\nuseEffect(() => {\n  headerEditor.setValue(headers)\n}, [headers])`,\n    );\n  }\n  // @ts-expect-error -- runtime check\n  if (props.response) {\n    throw new TypeError(\n      'The `response` prop has been removed. Set value programmatically using:\\n' +\n        `\nconst responseEditor = useGraphiQL(state => state.responseEditor)\n\nuseEffect(() => {\n  responseEditor.setValue(response)\n}, [response])`,\n    );\n  }\n  const { actions } = useMonaco();\n  const [mounted, setMounted] = useState(false);\n\n  useEffect(() => {\n    void actions.initialize();\n    setMounted(true);\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // This check due hydration issues, it can be removed after setup zustand persist\n  if (!mounted) {\n    return null;\n  }\n\n  return <InnerGraphiQLProvider {...props} />;\n};\n\nconst InnerGraphiQLProvider: FC<GraphiQLProviderProps> = ({\n  defaultHeaders,\n  defaultQuery = DEFAULT_QUERY,\n  defaultTabs,\n  externalFragments,\n  onEditOperationName,\n  onTabChange,\n  shouldPersistHeaders = false,\n  onCopyQuery,\n  onPrettifyQuery = DEFAULT_PRETTIFY_QUERY,\n\n  dangerouslyAssumeSchemaIsValid = false,\n  fetcher,\n  inputValueDeprecation = false,\n  introspectionQueryName = 'IntrospectionQuery',\n  onSchemaChange,\n  schema,\n  schemaDescription = false,\n\n  getDefaultFieldNames,\n  operationName = null,\n\n  onTogglePluginVisibility,\n  plugins = [],\n  referencePlugin,\n  visiblePlugin,\n  children,\n\n  defaultTheme = null,\n  editorTheme = MONACO_THEME_NAME,\n\n  storage: $storage,\n\n  ...props\n}) => {\n  const storeRef = useRef<GraphiQLStore>(null!);\n  const uriInstanceId = useId();\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- false positive\n  if (storeRef.current === null) {\n    const storage = new StorageAPI($storage);\n\n    function getInitialVisiblePlugin() {\n      const storedValue = storage.get(STORAGE_KEY.visiblePlugin);\n      const pluginForStoredValue = plugins.find(\n        plugin => plugin.title === storedValue,\n      );\n      if (pluginForStoredValue) {\n        return pluginForStoredValue;\n      }\n      if (storedValue) {\n        storage.set(STORAGE_KEY.visiblePlugin, '');\n      }\n      return visiblePlugin;\n    }\n\n    function getInitialTheme() {\n      const stored = storage.get(STORAGE_KEY.theme);\n      switch (stored) {\n        case 'light':\n          return 'light';\n        case 'dark':\n          return 'dark';\n        default:\n          if (typeof stored === 'string') {\n            // Remove the invalid stored value\n            storage.set(STORAGE_KEY.theme, '');\n          }\n          return defaultTheme;\n      }\n    }\n\n    function getInitialState() {\n      // We only need to compute it lazily during the initial render.\n      const query = props.initialQuery ?? storage.get(STORAGE_KEY.query);\n      const variables =\n        props.initialVariables ?? storage.get(STORAGE_KEY.variables);\n      const headers = props.initialHeaders ?? storage.get(STORAGE_KEY.headers);\n\n      const { tabs, activeTabIndex } = getDefaultTabState({\n        defaultHeaders,\n        defaultQuery,\n        defaultTabs,\n        headers,\n        query,\n        shouldPersistHeaders,\n        storage,\n        variables,\n      });\n\n      const isStored = storage.get(STORAGE_KEY.persistHeaders) !== null;\n\n      const $shouldPersistHeaders =\n        shouldPersistHeaders !== false && isStored\n          ? storage.get(STORAGE_KEY.persistHeaders) === 'true'\n          : shouldPersistHeaders;\n\n      const store = create<SlicesWithActions>((...args) => {\n        const storageSlice = createStorageSlice({ storage })(...args);\n        const editorSlice = createEditorSlice({\n          activeTabIndex,\n          defaultHeaders,\n          defaultQuery,\n          externalFragments: getExternalFragments(externalFragments),\n          initialHeaders: headers ?? defaultHeaders ?? '',\n          initialQuery:\n            query ?? (activeTabIndex === 0 ? tabs[0]!.query : null) ?? '',\n          initialVariables: variables ?? '',\n          onCopyQuery,\n          onEditOperationName,\n          onPrettifyQuery,\n          onTabChange,\n          shouldPersistHeaders: $shouldPersistHeaders,\n          tabs,\n          /**\n           * Strip colons (React 18) and arrows (React 19) because it breaks monaco-editor\n           * variables autocomplete\n           */\n          uriInstanceId: uriInstanceId.replaceAll(/[:«»]/g, '') + '-',\n        })(...args);\n        const executionSlice = createExecutionSlice({\n          fetcher,\n          getDefaultFieldNames,\n          overrideOperationName: operationName,\n        })(...args);\n        const pluginSlice = createPluginSlice({\n          onTogglePluginVisibility,\n          referencePlugin,\n        })(...args);\n        const schemaSlice = createSchemaSlice({\n          inputValueDeprecation,\n          introspectionQueryName,\n          onSchemaChange,\n          schemaDescription,\n        })(...args);\n        const themeSlice = createThemeSlice({ editorTheme })(...args);\n        return {\n          ...storageSlice,\n          ...editorSlice,\n          ...executionSlice,\n          ...pluginSlice,\n          ...schemaSlice,\n          ...themeSlice,\n          actions: {\n            ...editorSlice.actions,\n            ...executionSlice.actions,\n            ...pluginSlice.actions,\n            ...schemaSlice.actions,\n            ...themeSlice.actions,\n          },\n        };\n      });\n      const { actions } = store.getState();\n      actions.storeTabs({ activeTabIndex, tabs });\n      actions.setPlugins(plugins);\n      actions.setVisiblePlugin(getInitialVisiblePlugin());\n      actions.setTheme(getInitialTheme());\n\n      return store;\n    }\n\n    storeRef.current = getInitialState();\n  }\n  // TODO:\n  // const lastShouldPersistHeadersProp = useRef<boolean | undefined>(undefined);\n  // useEffect(() => {\n  //   const propValue = shouldPersistHeaders;\n  //   if (lastShouldPersistHeadersProp.current !== propValue) {\n  //     editorStore.getState().setShouldPersistHeaders(propValue);\n  //     lastShouldPersistHeadersProp.current = propValue;\n  //   }\n  // }, [shouldPersistHeaders]);\n\n  // Execution sync\n  useDidUpdate(() => {\n    storeRef.current.setState({ fetcher });\n  }, [fetcher]);\n\n  // Plugin sync\n  useDidUpdate(() => {\n    const { actions } = storeRef.current.getState();\n    actions.setPlugins(plugins);\n    actions.setVisiblePlugin(visiblePlugin);\n  }, [plugins, visiblePlugin]);\n\n  /**\n   * Synchronize prop changes with state\n   */\n  useEffect(() => {\n    const newSchema = isSchema(schema) || schema == null ? schema : undefined;\n\n    const validationErrors =\n      !newSchema || dangerouslyAssumeSchemaIsValid\n        ? []\n        : validateSchema(newSchema);\n    const store = storeRef.current;\n    store.setState(({ requestCounter }) => ({\n      /**\n       * Increment the counter so that in-flight introspection requests don't\n       * override this change.\n       */\n      requestCounter: requestCounter + 1,\n      schema: newSchema,\n      shouldIntrospect: !isSchema(schema) && schema !== null,\n      validationErrors,\n    }));\n\n    // Trigger introspection\n    const { actions } = store.getState();\n    void actions.introspect();\n  }, [\n    schema,\n    dangerouslyAssumeSchemaIsValid,\n    fetcher, // should refresh schema with a new fetcher after a fetchError\n  ]);\n\n  /**\n   * Trigger introspection manually via a short key\n   */\n  useEffect(() => {\n    function runIntrospection(event: KeyboardEvent) {\n      if (event.ctrlKey && event.key === 'R') {\n        const { actions } = storeRef.current.getState();\n        void actions.introspect();\n      }\n    }\n\n    window.addEventListener('keydown', runIntrospection);\n    return () => {\n      window.removeEventListener('keydown', runIntrospection);\n    };\n  }, []);\n\n  return (\n    <GraphiQLContext.Provider value={storeRef}>\n      {children}\n    </GraphiQLContext.Provider>\n  );\n};\n\nexport function useGraphiQL<T>(selector: (state: SlicesWithActions) => T): T {\n  const store = useContext(GraphiQLContext);\n  if (!store) {\n    throw new Error(\n      `\"useGraphiQL\" hook must be used within a <GraphiQLProvider> component.\nIt looks like you are trying to use the hook outside the GraphiQL provider tree.`,\n    );\n  }\n  return useStore(store.current, useShallow(selector));\n}\n\n/**\n * Actions are functions used to update values in your store. They are static and never change.\n * @see https://tkdodo.eu/blog/working-with-zustand#separate-actions-from-state\n */\nexport const useGraphiQLActions = () => useGraphiQL(state => state.actions);\n\nfunction getExternalFragments(\n  externalFragments: GraphiQLProviderProps['externalFragments'],\n) {\n  const map = new Map<string, FragmentDefinitionNode>();\n  if (externalFragments) {\n    if (Array.isArray(externalFragments)) {\n      for (const fragment of externalFragments) {\n        map.set(fragment.name.value, fragment);\n      }\n    } else if (typeof externalFragments === 'string') {\n      visit(parse(externalFragments), {\n        FragmentDefinition(fragment) {\n          map.set(fragment.name.value, fragment);\n        },\n      });\n    } else {\n      throw new TypeError(\n        'The `externalFragments` prop must either be a string that contains the fragment definitions in SDL or a list of `FragmentDefinitionNode` objects.',\n      );\n    }\n  }\n  return map;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/request-headers-editor.tsx",
    "content": "import { FC, useEffect, useRef } from 'react';\nimport { useGraphiQL, useGraphiQLActions } from './provider';\nimport type { EditorProps } from '../types';\nimport { URI_NAME, KEY_BINDINGS, STORAGE_KEY } from '../constants';\nimport {\n  getOrCreateModel,\n  createEditor,\n  useChangeHandler,\n  onEditorContainerKeyDown,\n  pick,\n  cleanupDisposables,\n  cn,\n} from '../utility';\nimport { useMonaco } from '../stores';\n\ninterface RequestHeadersEditorProps extends EditorProps {\n  /**\n   * Invoked when the contents of the request headers editor change.\n   * @param value - The new contents of the editor.\n   */\n  onEdit?(value: string): void;\n}\n\nexport const RequestHeadersEditor: FC<RequestHeadersEditorProps> = ({\n  onEdit,\n  ...props\n}) => {\n  const { setEditor, run, prettifyEditors, mergeQuery } = useGraphiQLActions();\n  const { initialHeaders, shouldPersistHeaders, uriInstanceId } = useGraphiQL(\n    pick('initialHeaders', 'shouldPersistHeaders', 'uriInstanceId'),\n  );\n  const ref = useRef<HTMLDivElement>(null!);\n  const monaco = useMonaco(state => state.monaco);\n  useChangeHandler(\n    onEdit,\n    shouldPersistHeaders ? STORAGE_KEY.headers : null,\n    'headers',\n  );\n  useEffect(() => {\n    if (!monaco) {\n      return;\n    }\n    const model = getOrCreateModel({\n      uri: `${uriInstanceId}${URI_NAME.requestHeaders}`,\n      value: initialHeaders,\n    });\n    const editor = createEditor(ref, { model });\n    setEditor({ headerEditor: editor });\n    const disposables = [\n      editor.addAction({ ...KEY_BINDINGS.runQuery, run }),\n      editor.addAction({ ...KEY_BINDINGS.prettify, run: prettifyEditors }),\n      editor.addAction({ ...KEY_BINDINGS.mergeFragments, run: mergeQuery }),\n      editor,\n      model,\n    ];\n    return cleanupDisposables(disposables);\n  }, [monaco]); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n  return (\n    <div\n      ref={ref}\n      tabIndex={0}\n      onKeyDown={onEditorContainerKeyDown}\n      {...props}\n      className={cn('graphiql-editor', props.className)}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/components/response-editor.tsx",
    "content": "import { formatError } from '@graphiql/toolkit';\nimport { ComponentType, FC, useEffect, useRef } from 'react';\nimport { createRoot, Root } from 'react-dom/client';\nimport { useGraphiQL, useGraphiQLActions } from './provider';\nimport { ImagePreview } from './image-preview';\nimport {\n  getOrCreateModel,\n  createEditor,\n  onEditorContainerKeyDown,\n  pick,\n  cleanupDisposables,\n  cn,\n  Range,\n} from '../utility';\nimport { KEY_BINDINGS, URI_NAME } from '../constants';\nimport type { EditorProps } from '../types';\nimport type * as monaco from 'monaco-editor';\nimport { useMonaco } from '../stores';\n\ntype ResponseTooltipType = ComponentType<{\n  /**\n   * A position in the editor.\n   */\n  position: monaco.Position;\n  /**\n   * Word that has been hovered over.\n   */\n  word: monaco.editor.IWordAtPosition;\n}>;\n\ninterface ResponseEditorProps extends EditorProps {\n  /**\n   * Customize the tooltip when hovering over properties in the response editor.\n   */\n  responseTooltip?: ResponseTooltipType;\n}\n\nexport const ResponseEditor: FC<ResponseEditorProps> = ({\n  responseTooltip: ResponseTooltip,\n  ...props\n}) => {\n  const { setEditor, run } = useGraphiQLActions();\n  const { fetchError, validationErrors, responseEditor, uriInstanceId } =\n    useGraphiQL(\n      pick('fetchError', 'validationErrors', 'responseEditor', 'uriInstanceId'),\n    );\n  const ref = useRef<HTMLDivElement>(null!);\n  const monaco = useMonaco(state => state.monaco);\n  useEffect(() => {\n    if (fetchError) {\n      responseEditor?.setValue(fetchError);\n    }\n    if (validationErrors.length) {\n      responseEditor?.setValue(formatError(validationErrors));\n    }\n  }, [responseEditor, fetchError, validationErrors]);\n\n  useEffect(() => {\n    if (!monaco) {\n      return;\n    }\n    const model = getOrCreateModel({\n      uri: `${uriInstanceId}${URI_NAME.response}`,\n      value: '',\n    });\n    const editor = createEditor(ref, {\n      model,\n      readOnly: true,\n      lineNumbers: 'off',\n      wordWrap: 'on', // Toggle word wrap on resizing editors\n      contextmenu: false, // Disable the right-click context menu\n    });\n    setEditor({ responseEditor: editor });\n\n    let lastRoot: Root | undefined;\n    let timerId: ReturnType<typeof setTimeout> | undefined;\n\n    const provideHover: monaco.languages.HoverProvider['provideHover'] = (\n      $model,\n      position,\n    ) => {\n      const sameModel = $model.uri === model.uri;\n      if (!sameModel) {\n        return null; // Ignore for other editors\n      }\n      const wordAtPosition = $model.getWordAtPosition(position);\n      if (!wordAtPosition?.word.startsWith('/')) {\n        return null;\n      }\n      const shouldRender = ImagePreview.shouldRender(wordAtPosition.word);\n      if (!shouldRender) {\n        return null;\n      }\n\n      // Return a placeholder content with a unique ID for now\n      const hoverId = `hover-${position.lineNumber}-${position.column}`;\n      if (timerId) {\n        clearTimeout(timerId);\n      }\n      timerId = setTimeout(() => {\n        const el = document.querySelector<HTMLDivElement>(\n          `[data-id=\"${hoverId}\"]`,\n        );\n        if (!el) {\n          return;\n        }\n        lastRoot?.unmount();\n        lastRoot = createRoot(el);\n        lastRoot.render(\n          // Handle image tooltips and custom tooltips\n          <>\n            {ResponseTooltip && (\n              <ResponseTooltip position={position} word={wordAtPosition} />\n            )}\n            <ImagePreview path={wordAtPosition.word} />\n          </>,\n        );\n      }, 500);\n\n      return {\n        range: new Range(\n          position.lineNumber,\n          wordAtPosition.startColumn,\n          position.lineNumber,\n          wordAtPosition.endColumn,\n        ),\n        contents: [\n          {\n            value: `<div data-id=\"${hoverId}\">Loading...</div>`,\n            supportHtml: true,\n          },\n        ],\n      };\n    };\n    const languageId = model.getLanguageId();\n    const disposables = [\n      monaco.languages.registerHoverProvider(languageId, { provideHover }),\n      editor.addAction({ ...KEY_BINDINGS.runQuery, run }),\n      editor,\n      model,\n    ];\n    return cleanupDisposables(disposables);\n  }, [monaco]); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n  return (\n    <section\n      ref={ref}\n      aria-label=\"Result Window\"\n      aria-live=\"polite\"\n      aria-atomic=\"true\"\n      tabIndex={0}\n      onKeyDown={onEditorContainerKeyDown}\n      {...props}\n      className={cn('result-window', props.className)}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/components/spinner/index.css",
    "content": ".graphiql-spinner {\n  height: 56px;\n  margin: auto;\n  margin-top: var(--px-16);\n  width: 56px;\n\n  &::after {\n    animation: rotation 0.8s linear 0s infinite;\n    border: 4px solid transparent;\n    border-radius: 100%;\n    border-top: 4px solid hsla(var(--color-neutral), var(--alpha-tertiary));\n    content: '';\n    display: inline-block;\n    height: 46px;\n    vertical-align: middle;\n    width: 46px;\n  }\n}\n\n@keyframes rotation {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/spinner/index.tsx",
    "content": "import { ComponentPropsWithoutRef, forwardRef } from 'react';\nimport { cn } from '../../utility';\nimport './index.css';\n\nexport const Spinner = forwardRef<\n  HTMLDivElement,\n  ComponentPropsWithoutRef<'div'>\n>((props, ref) => (\n  <div\n    {...props}\n    ref={ref}\n    className={cn('graphiql-spinner', props.className)}\n  />\n));\nSpinner.displayName = 'Spinner';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/tabs/index.css",
    "content": ".graphiql-tabs {\n  --bg: hsl(var(--color-base));\n\n  display: flex;\n  align-items: center;\n  gap: var(--px-8);\n  /* reset browser defaults */\n  padding: 2px 0; /* Set to 2px to avoid being overflowed by focus ring */\n  margin: 0;\n  list-style: none;\n  overflow: auto;\n  border-top-left-radius: var(--border-radius-8);\n}\n\n/* Hide scrollbar */\n.no-scrollbar {\n  scrollbar-width: none; /* Firefox */\n  -ms-overflow-style: none; /* IE and Edge */\n\n  &::-webkit-scrollbar {\n    display: none; /* Chrome, Safari and Opera */\n  }\n}\n\n/* trick to shrink multiple tabs, instead of overflow container */\n.graphiql-tabs,\n.graphiql-tab {\n  min-width: 0;\n}\n\n.graphiql-tab {\n  border-radius: var(--border-radius-8) var(--border-radius-8) 0 0;\n  background: hsla(var(--color-neutral), var(--alpha-background-light));\n  position: relative;\n  display: flex;\n  flex-shrink: 0;\n\n  /* disable shrinking while changing the operation name */\n  &:not(:focus-within) {\n    transform: none !important;\n  }\n\n  &:hover,\n  &:focus-within,\n  &.graphiql-tab-active {\n    background: var(--bg);\n    color: hsl(var(--color-neutral));\n\n    .graphiql-tab-close {\n      display: block;\n    }\n  }\n\n  .graphiql-tab-button {\n    border-radius: var(--border-radius-12) var(--border-radius-12) 0 0;\n    padding: var(--px-4) 28px var(--px-4) var(--px-8);\n\n    &:hover {\n      background: none;\n    }\n  }\n\n  .graphiql-tab-close {\n    position: absolute;\n    right: min(var(--px-4), 5%);\n    top: 50%;\n    transform: translateY(-50%);\n    display: none;\n    background: var(--bg);\n    padding: var(--px-6);\n    line-height: 0;\n\n    & > svg {\n      height: var(--px-8);\n      width: var(--px-8);\n    }\n\n    &:hover {\n      background: var(--bg);\n      color: hsl(var(--color-neutral));\n      overflow: hidden; /* bg in `:before` will not overflow from radius area */\n\n      /* trick to add 2nd bg with opacity */\n      &:before {\n        content: '';\n        position: absolute;\n        inset: 0;\n        z-index: -1;\n        background: hsla(var(--color-neutral), 0.3);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/tabs/index.tsx",
    "content": "import { ComponentPropsWithoutRef, forwardRef, ReactNode } from 'react';\nimport { cn } from '../../utility';\nimport { Reorder } from 'framer-motion';\nimport { CloseIcon } from '../../icons';\nimport { UnStyledButton } from '../button';\nimport './index.css';\n\ninterface TabProps extends ComponentPropsWithoutRef<typeof Reorder.Item> {\n  isActive?: boolean;\n}\n\nconst TabRoot = forwardRef<HTMLLIElement, TabProps>(\n  ({ isActive, value, children, className, ...props }, ref) => (\n    <Reorder.Item\n      {...props}\n      ref={ref}\n      value={value}\n      aria-selected={isActive}\n      dragElastic={false} // Prevent over scrolling of container\n      role=\"tab\"\n      className={cn(\n        'graphiql-tab',\n        isActive && 'graphiql-tab-active',\n        className,\n      )}\n    >\n      {children}\n    </Reorder.Item>\n  ),\n);\nTabRoot.displayName = 'Tab';\n\nconst TabButton = forwardRef<\n  HTMLButtonElement,\n  ComponentPropsWithoutRef<'button'>\n>(({ children, className, ...props }, ref) => (\n  <UnStyledButton\n    {...props}\n    ref={ref}\n    type=\"button\"\n    className={cn('graphiql-tab-button', className)}\n  >\n    {children}\n  </UnStyledButton>\n));\nTabButton.displayName = 'Tab.Button';\n\nconst TabClose = forwardRef<\n  HTMLButtonElement,\n  ComponentPropsWithoutRef<'button'>\n>((props, ref) => (\n  <UnStyledButton\n    aria-label=\"Close Tab\"\n    {...props}\n    ref={ref}\n    type=\"button\"\n    className={cn('graphiql-tab-close', props.className)}\n  >\n    <CloseIcon />\n  </UnStyledButton>\n));\nTabClose.displayName = 'Tab.Close';\n\nexport const Tab = Object.assign(TabRoot, {\n  Button: TabButton,\n  Close: TabClose,\n});\n\ninterface TabsProps {\n  values: object[];\n  onReorder: (newOrder: any[]) => void;\n  className?: string;\n  children: ReactNode;\n}\n\nexport const Tabs = forwardRef<HTMLUListElement, TabsProps>(\n  ({ values, onReorder, children, className, ...props }, ref) => (\n    <Reorder.Group\n      {...props}\n      ref={ref}\n      values={values}\n      onReorder={onReorder}\n      axis=\"x\"\n      role=\"tablist\"\n      className={cn('graphiql-tabs', className)}\n    >\n      {children}\n    </Reorder.Group>\n  ),\n);\nTabs.displayName = 'Tabs';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/toolbar-button/index.css",
    "content": "button.graphiql-toolbar-button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: var(--toolbar-width);\n  width: var(--toolbar-width);\n\n  &.error {\n    background: hsla(var(--color-error), var(--alpha-background-heavy));\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/toolbar-button/index.tsx",
    "content": "import {\n  forwardRef,\n  MouseEventHandler,\n  useState,\n  ComponentPropsWithoutRef,\n} from 'react';\nimport { cn } from '../../utility';\nimport { Tooltip } from '../tooltip';\nimport { UnStyledButton } from '../button';\nimport './index.css';\n\ninterface ToolbarButtonProps extends ComponentPropsWithoutRef<'button'> {\n  label: string;\n}\n\nexport const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n  ({ label, onClick, ...props }, ref) => {\n    const [error, setError] = useState<Error | null>(null);\n    const handleClick: MouseEventHandler<HTMLButtonElement> = event => {\n      try {\n        // Optional chaining inside try-catch isn't supported yet by react-compiler\n        if (onClick) {\n          onClick(event);\n        }\n        setError(null);\n      } catch (err) {\n        setError(\n          err instanceof Error\n            ? err\n            : new Error(`Toolbar button click failed: ${err}`),\n        );\n      }\n    };\n\n    return (\n      <Tooltip label={label}>\n        <UnStyledButton\n          {...props}\n          ref={ref}\n          type=\"button\"\n          className={cn(\n            'graphiql-toolbar-button',\n            error && 'error',\n            props.className,\n          )}\n          onClick={handleClick}\n          aria-label={error ? error.message : label}\n          aria-invalid={error ? 'true' : props['aria-invalid']}\n        />\n      </Tooltip>\n    );\n  },\n);\nToolbarButton.displayName = 'ToolbarButton';\n"
  },
  {
    "path": "packages/graphiql-react/src/components/toolbar-menu/index.tsx",
    "content": "import type { FC, ReactNode } from 'react';\nimport { Trigger, type DropdownMenuProps } from '@radix-ui/react-dropdown-menu';\nimport { DropdownMenu } from '../dropdown-menu';\n\ninterface ToolbarMenuProps extends DropdownMenuProps {\n  button: ReactNode;\n}\n\nconst ToolbarMenuRoot: FC<ToolbarMenuProps> = ({\n  button,\n  children,\n  ...props\n}) => {\n  return (\n    <DropdownMenu {...props}>\n      <Trigger asChild>{button}</Trigger>\n      <DropdownMenu.Content>{children}</DropdownMenu.Content>\n    </DropdownMenu>\n  );\n};\n\nexport const ToolbarMenu = Object.assign(ToolbarMenuRoot, {\n  Item: DropdownMenu.Item,\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/components/tooltip/index.css",
    "content": ".graphiql-tooltip {\n  background: hsl(var(--color-base));\n  border: var(--popover-border);\n  border-radius: var(--border-radius-4);\n  box-shadow: var(--popover-box-shadow);\n  color: hsl(var(--color-neutral));\n  font-size: inherit;\n  padding: var(--px-4) var(--px-6);\n  font-family: var(--font-family);\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/components/tooltip/index.tsx",
    "content": "import type { FC, ReactNode } from 'react';\nimport * as T from '@radix-ui/react-tooltip';\nimport './index.css';\n\nexport const TooltipRoot: FC<T.TooltipContentProps & { label: ReactNode }> = ({\n  children,\n  align = 'start',\n  side = 'bottom',\n  sideOffset = 5,\n  label,\n}) => {\n  return (\n    <T.Root>\n      <T.Trigger asChild>{children}</T.Trigger>\n      <T.Portal>\n        <T.Content\n          className=\"graphiql-tooltip\"\n          align={align}\n          side={side}\n          sideOffset={sideOffset}\n        >\n          {label}\n        </T.Content>\n      </T.Portal>\n    </T.Root>\n  );\n};\n\nexport const Tooltip = Object.assign(TooltipRoot, {\n  Provider: T.Provider,\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/components/variables-editor.tsx",
    "content": "import { FC, useEffect, useRef } from 'react';\nimport { useGraphiQL, useGraphiQLActions } from './provider';\nimport type { EditorProps } from '../types';\nimport { KEY_BINDINGS, STORAGE_KEY, URI_NAME } from '../constants';\nimport {\n  getOrCreateModel,\n  createEditor,\n  useChangeHandler,\n  onEditorContainerKeyDown,\n  cleanupDisposables,\n  cn,\n  pick,\n} from '../utility';\nimport { useMonaco } from '../stores';\n\ninterface VariablesEditorProps extends EditorProps {\n  /**\n   * Invoked when the contents of the variables' editor change.\n   * @param value - The new contents of the editor.\n   */\n  onEdit?(value: string): void;\n}\n\nexport const VariablesEditor: FC<VariablesEditorProps> = ({\n  onEdit,\n  ...props\n}) => {\n  const { setEditor, run, prettifyEditors, mergeQuery } = useGraphiQLActions();\n  const { initialVariables, uriInstanceId } = useGraphiQL(\n    pick('initialVariables', 'uriInstanceId'),\n  );\n  const ref = useRef<HTMLDivElement>(null!);\n  const monaco = useMonaco(state => state.monaco);\n  useChangeHandler(onEdit, STORAGE_KEY.variables, 'variables');\n  useEffect(() => {\n    if (!monaco) {\n      return;\n    }\n    const model = getOrCreateModel({\n      uri: `${uriInstanceId}${URI_NAME.variables}`,\n      value: initialVariables,\n    });\n    const editor = createEditor(ref, { model });\n    setEditor({ variableEditor: editor });\n    const disposables = [\n      editor.addAction({ ...KEY_BINDINGS.runQuery, run }),\n      editor.addAction({ ...KEY_BINDINGS.prettify, run: prettifyEditors }),\n      editor.addAction({ ...KEY_BINDINGS.mergeFragments, run: mergeQuery }),\n      editor,\n      model,\n    ];\n    return cleanupDisposables(disposables);\n  }, [monaco]); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n  return (\n    <div\n      ref={ref}\n      tabIndex={0}\n      onKeyDown={onEditorContainerKeyDown}\n      {...props}\n      className={cn('graphiql-editor', props.className)}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/constants.ts",
    "content": "/* eslint-disable no-bitwise */\nimport type { DiagnosticSettings } from 'monaco-graphql';\nimport type * as monaco from 'monaco-editor';\nimport { KeyCode, KeyMod } from './utility';\nimport type { EditorSlice } from './stores';\n\nexport const isMacOs =\n  typeof navigator !== 'undefined' && navigator.userAgent.includes('Mac');\n\nexport function formatShortcutForOS(key: string, replaced = '⌘') {\n  return isMacOs ? key.replace('Ctrl', replaced) : key;\n}\n\nexport const KEY_MAP = Object.freeze({\n  prettify: {\n    key: 'Shift-Ctrl-P',\n    keybindings: [KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KeyP],\n  },\n  mergeFragments: {\n    key: 'Shift-Ctrl-M',\n    keybindings: [KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KeyM],\n  },\n  runQuery: {\n    key: 'Ctrl-Enter',\n    keybindings: [KeyMod.CtrlCmd | KeyCode.Enter],\n  },\n  autoComplete: {\n    key: 'Space',\n  },\n  copyQuery: {\n    key: 'Shift-Ctrl-C',\n    keybindings: [KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KeyC],\n  },\n  refetchSchema: {\n    key: 'Shift-Ctrl-R',\n  },\n  searchInEditor: {\n    key: 'Ctrl-F',\n  },\n  searchInDocs: {\n    key: 'Ctrl-Alt-K',\n  },\n});\n\nexport const STORAGE_KEY = {\n  headers: 'headers',\n  visiblePlugin: 'visiblePlugin',\n  query: 'query',\n  variables: 'variables',\n  tabs: 'tabState',\n  persistHeaders: 'shouldPersistHeaders',\n  theme: 'theme',\n} as const;\n\nexport const DEFAULT_QUERY = `# Welcome to GraphiQL\n#\n# GraphiQL is an in-browser tool for writing, validating, and testing\n# GraphQL queries.\n#\n# Type queries into this side of the screen, and you will see intelligent\n# typeaheads aware of the current GraphQL type schema and live syntax and\n# validation errors highlighted within the text.\n#\n# GraphQL queries typically start with a \"{\" character. Lines that start\n# with a # are ignored.\n#\n# An example GraphQL query might look like:\n#\n#     {\n#       field(arg: \"value\") {\n#         subField\n#       }\n#     }\n#\n# Keyboard shortcuts:\n#\n#   Prettify query:  ${KEY_MAP.prettify.key} (or press the prettify button)\n#\n#  Merge fragments:  ${KEY_MAP.mergeFragments.key} (or press the merge button)\n#\n#        Run Query:  ${formatShortcutForOS(KEY_MAP.runQuery.key, 'Cmd')} (or press the play button)\n#\n#    Auto Complete:  ${KEY_MAP.autoComplete.key} (or just start typing)\n#\n\n`;\n\nexport const KEY_BINDINGS = {\n  prettify: {\n    id: 'graphql-prettify',\n    label: 'Prettify Editors',\n    contextMenuGroupId: 'graphql',\n    keybindings: KEY_MAP.prettify.keybindings,\n  },\n  mergeFragments: {\n    id: 'graphql-merge',\n    label: 'Merge Fragments into Query',\n    contextMenuGroupId: 'graphql',\n    keybindings: KEY_MAP.mergeFragments.keybindings,\n  },\n  runQuery: {\n    id: 'graphql-run',\n    label: 'Run Operation',\n    contextMenuGroupId: 'graphql',\n    keybindings: KEY_MAP.runQuery.keybindings,\n  },\n  copyQuery: {\n    id: 'graphql-copy',\n    label: 'Copy Query',\n    contextMenuGroupId: 'graphql',\n    keybindings: KEY_MAP.copyQuery.keybindings,\n  },\n} as const;\n\nexport const URI_NAME = {\n  operation: 'operation.graphql',\n  schema: 'schema.graphql',\n\n  variables: 'variables.json',\n  requestHeaders: 'request-headers.json',\n  response: 'response.json',\n} as const;\n\n// set these early on so that initial variables with comments don't flash an error\nexport const JSON_DIAGNOSTIC_OPTIONS: monaco.languages.json.DiagnosticsOptions =\n  {\n    // Fixes Comments are not permitted in JSON.(521)\n    allowComments: true,\n    // Fixes Trailing comma json(519)\n    trailingCommas: 'ignore',\n  };\n\nexport const MONACO_GRAPHQL_DIAGNOSTIC_SETTINGS: DiagnosticSettings = {\n  validateVariablesJSON: {},\n  jsonDiagnosticSettings: {\n    validate: true,\n    schemaValidation: 'error',\n    // Set these again, because we are entirely re-setting them here\n    ...JSON_DIAGNOSTIC_OPTIONS,\n  },\n};\n\nexport const DEFAULT_PRETTIFY_QUERY: EditorSlice['onPrettifyQuery'] =\n  async query => {\n    // We don't need to load Prettier initially; it's only used when the 'Format Query' button or shortcut is triggered\n    const [\n      prettier,\n      // @ts-expect-error – no types\n      { printers },\n      { parsers },\n    ] = await Promise.all([\n      import('prettier/standalone'),\n      import('prettier/plugins/graphql'),\n      import('prettier/parser-graphql'),\n    ]);\n\n    return prettier.format(query, {\n      parser: 'graphql',\n      plugins: [\n        // Fix: Couldn't find plugin for AST format \"graphql\"\n        { printers },\n        // @ts-expect-error -- Fix: Couldn't resolve parser \"graphql\"\n        { parsers },\n      ],\n    });\n  };\n\nexport const MONACO_THEME_NAME = {\n  dark: 'graphiql-DARK',\n  light: 'graphiql-LIGHT',\n} as const;\n\nconst colors = {\n  transparent: '#ffffff00',\n  bg: {\n    dark: '#212a3b',\n    light: '#ffffffff',\n  },\n  primary: {\n    dark: '#ff5794',\n    light: '#d60590',\n  },\n  primaryBg: {\n    dark: '#ff579419',\n    light: '#d6059019',\n  },\n  secondary: {\n    dark: '#b7c2d711',\n    light: '#3b4b6811',\n  },\n};\n\nconst getBaseColors = (\n  theme: 'dark' | 'light',\n): monaco.editor.IStandaloneThemeData['colors'] => ({\n  'editor.background': colors.transparent, // white with a 00 alpha value\n  'scrollbar.shadow': colors.transparent, // Scrollbar shadow to indicate that the view is scrolled\n  'textLink.foreground': colors.primary[theme], // Foreground color for links in text\n  'textLink.activeForeground': colors.primary[theme], // Foreground color for active links in text\n  'editorLink.activeForeground': colors.primary[theme], // Color of active links\n  'editorHoverWidget.background': colors.bg[theme], // Background color of the editor hover\n  'list.hoverBackground': colors.primaryBg[theme], // List/Tree background when hovering over items using the mouse\n  'list.highlightForeground': colors.primary[theme],\n  'list.focusHighlightForeground': colors.primary[theme],\n  'menu.background': colors.bg[theme], // Background color of the context menu\n\n  'editorSuggestWidget.background': colors.bg[theme], // Background color of the suggest widget\n  'editorSuggestWidget.selectedBackground': colors.primaryBg[theme], // Background color of the selected entry in the suggest widget\n  'editorSuggestWidget.selectedForeground': colors.primary[theme], // Foreground color of the selected entry in the suggest widget\n  'quickInput.background': colors.bg[theme],\n  'quickInputList.focusForeground': theme === 'dark' ? '#ffffff' : '#444444',\n  'highlighted.label': colors.primary[theme],\n  'quickInput.widget': colors.primary[theme],\n  highlight: colors.primary[theme],\n  'editorWidget.background': colors.bg[theme], // Background color of editor widgets, such as find/replace\n  'input.background': colors.secondary[theme], // Input box background\n  focusBorder: colors.primary[theme], // Overall border color for focused elements. This color is only used if not overridden by a component\n  'toolbar.hoverBackground': colors.primaryBg[theme],\n  'inputOption.hoverBackground': colors.primaryBg[theme],\n  'quickInputList.focusBackground': colors.primaryBg[theme],\n  'editorWidget.resizeBorder': colors.primary[theme],\n  'pickerGroup.foreground': colors.primary[theme], // Quick picker color for grouping labels\n\n  'menu.selectionBackground': colors.primaryBg[theme], // hover background\n  'menu.selectionForeground': colors.primary[theme], // hover text color\n});\n\nexport const MONACO_THEME_DATA: Record<\n  'dark' | 'light',\n  monaco.editor.IStandaloneThemeData\n> = {\n  dark: {\n    base: 'vs-dark',\n    inherit: true,\n    colors: getBaseColors('dark'),\n    rules: [\n      {\n        token: 'argument.identifier.gql',\n        foreground: '#908aff',\n      },\n    ],\n  },\n  light: {\n    base: 'vs',\n    inherit: true,\n    colors: getBaseColors('light'),\n    rules: [\n      {\n        token: 'argument.identifier.gql',\n        foreground: '#6c69ce',\n      },\n    ],\n  },\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/deprecated.ts",
    "content": "/* eslint-disable @typescript-eslint/no-deprecated */\n\nimport { useGraphiQL, useGraphiQLActions } from './components';\nimport { pick } from './utility';\nimport type { MonacoEditor } from './types';\n\n/**\n * @deprecated Use `const { prettifyEditors } = useGraphiQLActions()` instead.\n */\nexport function usePrettifyEditors() {\n  const { prettifyEditors } = useGraphiQLActions();\n  return prettifyEditors;\n}\n\n/**\n * @deprecated Use `const { copyQuery } = useGraphiQLActions()` instead.\n */\nexport function useCopyQuery() {\n  const { copyQuery } = useGraphiQLActions();\n  return copyQuery;\n}\n\n/**\n * @deprecated Use `const { mergeQuery } = useGraphiQLActions()` instead.\n */\nexport function useMergeQuery() {\n  const { mergeQuery } = useGraphiQLActions();\n  return mergeQuery;\n}\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport function useEditorContext() {\n  const {\n    addTab,\n    changeTab,\n    moveTab,\n    closeTab,\n    updateActiveTabValues,\n    setEditor,\n    setOperationName,\n    setShouldPersistHeaders,\n  } = useGraphiQLActions();\n\n  const setHeaderEditor = (headerEditor: MonacoEditor) =>\n    setEditor({ headerEditor });\n  const setQueryEditor = (queryEditor: MonacoEditor) =>\n    setEditor({ queryEditor });\n  const setResponseEditor = (responseEditor: MonacoEditor) =>\n    setEditor({ responseEditor });\n  const setVariableEditor = (variableEditor: MonacoEditor) =>\n    setEditor({ variableEditor });\n\n  const values = useGraphiQL(\n    pick(\n      'headerEditor',\n      'queryEditor',\n      'responseEditor',\n      'variableEditor',\n      'initialHeaders',\n      'initialQuery',\n      'initialVariables',\n      'externalFragments',\n      'shouldPersistHeaders',\n    ),\n  );\n  return {\n    addTab,\n    changeTab,\n    moveTab,\n    closeTab,\n    updateActiveTabValues,\n    setHeaderEditor,\n    setQueryEditor,\n    setResponseEditor,\n    setVariableEditor,\n    setOperationName,\n    setShouldPersistHeaders,\n    ...values,\n  };\n}\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport function useExecutionContext() {\n  const { run, stop } = useGraphiQLActions();\n  const values = useGraphiQL(state => ({\n    isFetching: state.isFetching,\n    isSubscribed: Boolean(state.subscription),\n    operationName: state.operationName,\n  }));\n  return {\n    run,\n    stop,\n    ...values,\n  };\n}\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport function usePluginContext() {\n  const { setVisiblePlugin } = useGraphiQLActions();\n  const values = useGraphiQL(pick('plugins', 'visiblePlugin'));\n  return {\n    setVisiblePlugin,\n    ...values,\n  };\n}\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport function useSchemaContext() {\n  const { introspect } = useGraphiQLActions();\n  const values = useGraphiQL(state => ({\n    isFetching: state.isIntrospecting,\n    fetchError: state.fetchError,\n    schema: state.schema,\n    validationErrors: state.validationErrors,\n  }));\n  return {\n    introspect,\n    ...values,\n  };\n}\n\n/**\n * @deprecated Use `const storage = useGraphiQL(state => state.storage)` instead.\n */\nexport const useStorage = () => useGraphiQL(state => state.storage);\n\n/**\n * @deprecated Use `const storage = useGraphiQL(state => state.storage)` instead.\n */\nexport const useStorageContext = useStorage;\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport function useTheme() {\n  const { setTheme } = useGraphiQLActions();\n  const theme = useGraphiQL(state => state.theme);\n  return {\n    setTheme,\n    theme,\n  };\n}\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport const useEditorStore = useEditorContext;\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport const useExecutionStore = useExecutionContext;\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport const usePluginStore = usePluginContext;\n\n/**\n * @deprecated Use `useGraphiQLActions` and `useGraphiQL` hooks instead.\n */\nexport const useSchemaStore = useSchemaContext;\n"
  },
  {
    "path": "packages/graphiql-react/src/env.d.ts",
    "content": "declare namespace globalThis {\n  import type * as monaco from 'monaco-editor';\n  var MonacoEnvironment: monaco.Environment;\n  // Needs for cypress\n  var __MONACO = monaco;\n}\n\ndeclare module 'monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js' {\n  export { KeyCode } from 'monaco-graphql/esm/monaco-editor';\n}\n\ndeclare module 'monaco-editor/esm/vs/editor/common/services/editorBaseApi.js' {\n  export { KeyMod } from 'monaco-graphql/esm/monaco-editor';\n}\n\ndeclare module 'monaco-editor/esm/vs/base/common/uri.js' {\n  export { Uri as URI } from 'monaco-graphql/esm/monaco-editor';\n}\n\ndeclare module 'monaco-editor/esm/vs/editor/common/core/range.js' {\n  export { Range } from 'monaco-graphql/esm/monaco-editor';\n}\n\ndeclare module 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker&deps=monaco-editor@0.52.2' {\n  type WorkerCtor = typeof import('*?worker').default; // reuse type from vite/client\n\n  const workerConstructor: WorkerCtor;\n  export default workerConstructor;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/icons/index.tsx",
    "content": "import type { ComponentProps, FC, SVGProps } from 'react';\n\nimport _ArgumentIcon from './argument.svg?react';\nimport _ChevronDownIcon from './chevron-down.svg?react';\nimport _ChevronLeftIcon from './chevron-left.svg?react';\nimport _ChevronUpIcon from './chevron-up.svg?react';\nimport _CloseIcon from './close.svg?react';\nimport _CopyIcon from './copy.svg?react';\nimport _DeprecatedArgumentIcon from './deprecated-argument.svg?react';\nimport _DeprecatedEnumValueIcon from './deprecated-enum-value.svg?react';\nimport _DeprecatedFieldIcon from './deprecated-field.svg?react';\nimport _DirectiveIcon from './directive.svg?react';\nimport _DocsFilledIcon from './docs-filled.svg?react';\nimport _DocsIcon from './docs.svg?react';\nimport _EnumValueIcon from './enum-value.svg?react';\nimport _FieldIcon from './field.svg?react';\nimport _HistoryIcon from './history.svg?react';\nimport _ImplementsIcon from './implements.svg?react';\nimport _KeyboardShortcutIcon from './keyboard-shortcut.svg?react';\nimport _MagnifyingGlassIcon from './magnifying-glass.svg?react';\nimport _MergeIcon from './merge.svg?react';\nimport _PenIcon from './pen.svg?react';\nimport _PlayIcon from './play.svg?react';\nimport _PlusIcon from './plus.svg?react';\nimport _PrettifyIcon from './prettify.svg?react';\nimport _ReloadIcon from './reload.svg?react';\nimport _RootTypeIcon from './root-type.svg?react';\nimport _SettingsIcon from './settings.svg?react';\nimport _StarFilledIcon from './star-filled.svg?react';\nimport _StarIcon from './star.svg?react';\nimport _StopIcon from './stop.svg?react';\nimport _TrashIcon from './trash.svg?react';\nimport _TypeIcon from './type.svg?react';\n\nexport const ArgumentIcon = generateIcon(_ArgumentIcon);\nexport const ChevronDownIcon = generateIcon(_ChevronDownIcon);\nexport const ChevronLeftIcon = generateIcon(_ChevronLeftIcon);\nexport const ChevronUpIcon = generateIcon(_ChevronUpIcon);\nexport const CloseIcon = generateIcon(_CloseIcon);\nexport const CopyIcon = generateIcon(_CopyIcon);\nexport const DeprecatedArgumentIcon = generateIcon(_DeprecatedArgumentIcon);\nexport const DeprecatedEnumValueIcon = generateIcon(_DeprecatedEnumValueIcon);\nexport const DeprecatedFieldIcon = generateIcon(_DeprecatedFieldIcon);\nexport const DirectiveIcon = generateIcon(_DirectiveIcon);\nexport const DocsFilledIcon = generateIcon(_DocsFilledIcon);\nexport const DocsIcon = generateIcon(_DocsIcon);\nexport const EnumValueIcon = generateIcon(_EnumValueIcon);\nexport const FieldIcon = generateIcon(_FieldIcon);\nexport const HistoryIcon = generateIcon(_HistoryIcon);\nexport const ImplementsIcon = generateIcon(_ImplementsIcon);\nexport const KeyboardShortcutIcon = generateIcon(_KeyboardShortcutIcon);\nexport const MagnifyingGlassIcon = generateIcon(_MagnifyingGlassIcon);\nexport const MergeIcon = generateIcon(_MergeIcon);\nexport const PenIcon = generateIcon(_PenIcon);\nexport const PlayIcon = generateIcon(_PlayIcon);\nexport const PlusIcon = generateIcon(_PlusIcon);\nexport const PrettifyIcon = generateIcon(_PrettifyIcon);\nexport const ReloadIcon = generateIcon(_ReloadIcon);\nexport const RootTypeIcon = generateIcon(_RootTypeIcon);\nexport const SettingsIcon = generateIcon(_SettingsIcon);\nexport const StarFilledIcon = generateIcon(_StarFilledIcon);\nexport const StarIcon = generateIcon(_StarIcon);\nexport const StopIcon = generateIcon(_StopIcon);\nexport const TrashIcon = generateIcon(_TrashIcon);\nexport const TypeIcon = generateIcon(_TypeIcon);\n\nfunction generateIcon(\n  RawComponent: FC<SVGProps<SVGSVGElement> & { title?: string }>,\n): FC<ComponentProps<'svg'>> {\n  const title =\n    RawComponent.name\n      // Icon component name starts with `Svg${CamelCaseFilename without .svg}`\n      .replace('Svg', '')\n      // Insert a space before all caps\n      .replaceAll(/([A-Z])/g, ' $1')\n      .trimStart()\n      .toLowerCase() + ' icon';\n\n  const IconComponent: FC<ComponentProps<'svg'>> = props => {\n    return <RawComponent title={title} {...props} />;\n  };\n\n  IconComponent.displayName = RawComponent.name;\n  return IconComponent;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/index.ts",
    "content": "import './style/root.css';\n\nexport { useMonaco } from './stores';\nexport * from './utility';\nexport type { TabsState } from './utility/tabs';\nexport * from './icons';\nexport * from './components';\n\nexport type {\n  EditorProps,\n  SchemaReference,\n  SlicesWithActions,\n  MonacoEditor,\n  Theme,\n} from './types';\nexport type { GraphiQLPlugin } from './stores/plugin';\nexport { KEY_MAP, formatShortcutForOS, isMacOs } from './constants';\nexport * from './deprecated';\n"
  },
  {
    "path": "packages/graphiql-react/src/setup-workers/esm.sh.ts",
    "content": "/* eslint-disable import-x/no-unresolved */\nimport JsonWorker from 'https://esm.sh/monaco-editor@0.52.2/esm/vs/language/json/json.worker.js?worker';\nimport GraphQLWorker from 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker&deps=monaco-editor@0.52.2';\nimport EditorWorker from 'https://esm.sh/monaco-editor@0.52.2/esm/vs/editor/editor.worker.js?worker';\n\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    // eslint-disable-next-line no-console\n    console.info('setup-workers/esm.sh', { label });\n    switch (label) {\n      case 'json':\n        return new JsonWorker();\n      case 'graphql':\n        return new GraphQLWorker();\n    }\n    return new EditorWorker();\n  },\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/setup-workers/vite.ts",
    "content": "/* eslint-disable import-x/default -- false positive */\nimport JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker.js?worker';\nimport GraphQLWorker from 'monaco-graphql/esm/graphql.worker.js?worker';\nimport EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker';\n\n/**\n * Setup Monaco Editor workers for Vite.\n * Vite needs to know ahead of time that you are loading a web worker.\n * Vite doesn’t support instantiating web workers directly from bare module imports like:\n *\n * ```js\n * new Worker(new URL('monaco-editor/esm/vs/language/json/json.worker.js', import.meta.url))\n * ```\n */\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    // eslint-disable-next-line no-console\n    console.info('setup-workers/vite', { label });\n    switch (label) {\n      case 'json':\n        return new JsonWorker();\n      case 'graphql':\n        return new GraphQLWorker();\n    }\n    return new EditorWorker();\n  },\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/setup-workers/webpack.ts",
    "content": "/**\n * Setup Monaco Editor workers for Webpack/Turbopack projects like Next.js.\n */\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    // eslint-disable-next-line no-console\n    console.info('setup-workers/webpack', { label });\n    switch (label) {\n      case 'json':\n        return new Worker(\n          new URL(\n            'monaco-editor/esm/vs/language/json/json.worker.js',\n            import.meta.url,\n          ),\n        );\n      case 'graphql':\n        return new Worker(\n          new URL('monaco-graphql/esm/graphql.worker.js', import.meta.url),\n        );\n    }\n    return new Worker(\n      new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url),\n    );\n  },\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/editor.ts",
    "content": "import type { StateCreator } from 'zustand';\nimport type {\n  FragmentDefinitionNode,\n  OperationDefinitionNode,\n  DocumentNode,\n} from 'graphql';\nimport type { OperationFacts } from 'graphql-language-service';\nimport { MaybePromise, mergeAst } from '@graphiql/toolkit';\nimport { print } from 'graphql';\nimport {\n  createTab,\n  setPropertiesInActiveTab,\n  TabDefinition,\n  TabsState,\n  TabState,\n  clearHeadersFromTabs,\n  serializeTabState,\n} from '../utility/tabs';\nimport type { SlicesWithActions, MonacoEditor } from '../types';\nimport { debounce, formatJSONC } from '../utility';\nimport { STORAGE_KEY } from '../constants';\n\nexport interface EditorSlice extends TabsState {\n  /**\n   * Unique ID of the GraphiQL instance, which will be suffixed to the URIs for operations,\n   * variables, headers, and response editors.\n   *\n   * @see https://github.com/microsoft/monaco-editor#uris\n   */\n  uriInstanceId: string;\n  /**\n   * The Monaco Editor instance used in the request headers editor, used to edit HTTP headers.\n   */\n  headerEditor?: MonacoEditor;\n\n  /**\n   * The Monaco Editor instance used in the operation editor.\n   */\n  queryEditor?: MonacoEditor;\n\n  /**\n   * The Monaco Editor instance used in the response editor.\n   */\n  responseEditor?: MonacoEditor;\n\n  /**\n   * The Monaco Editor instance used in the variables editor.\n   */\n  variableEditor?: MonacoEditor;\n\n  /**\n   * The contents of the request headers editor when initially rendering the provider\n   * component.\n   */\n  initialHeaders: string;\n\n  /**\n   * The contents of the operation editor when initially rendering the provider\n   * component.\n   */\n  initialQuery: string;\n\n  /**\n   * The contents of the variables editor when initially rendering the provider\n   * component.\n   */\n  initialVariables: string;\n\n  /**\n   * A map of fragment definitions using the fragment name as a key which are\n   * made available to include in the query.\n   */\n  externalFragments: Map<string, FragmentDefinitionNode>;\n\n  /**\n   * If the contents of the request headers editor are persisted in storage.\n   */\n  shouldPersistHeaders: boolean;\n\n  /**\n   * The initial content of the operation editor when loading GraphiQL and there is\n   * no saved query in storage and no `initialQuery` prop.\n   *\n   * This value is used only for the first tab. Additional tabs will open with\n   * an empty operation editor.\n   *\n   * @default \"# Welcome to GraphiQL...\"\n   */\n  defaultQuery?: string;\n\n  /**\n   * Invoked when the operation name changes. Possible triggers are:\n   * - Editing the contents of the operation editor\n   * - Selecting an operation for execution in a document that contains multiple\n   *   operation definitions\n   * @param operationName - The operation name after it has been changed.\n   */\n  onEditOperationName?(operationName: string): void;\n\n  /**\n   * Invoked when the state of the tabs changes. Possible triggers are:\n   * - Updating any editor contents inside the currently active tab\n   * - Adding a tab\n   * - Switching to a different tab\n   * - Closing a tab\n   * @param tabState - The tab state after it has been updated.\n   */\n  onTabChange?(tabState: TabsState): void;\n\n  /**\n   * Headers to be set when opening a new tab.\n   */\n  defaultHeaders?: string;\n\n  /**\n   * Invoked when the current contents of the operation editor are copied to the\n   * clipboard.\n   * @param query - The content that has been copied.\n   */\n  onCopyQuery?: (query: string) => void;\n\n  /**\n   * Invoked when the prettify callback is invoked.\n   * @param query - The current value of the operation editor.\n   * @default\n   * import prettier from 'prettier/standalone'\n   *\n   * prettier.format(query, { parser: 'graphql' })\n   * @returns The formatted query.\n   */\n  onPrettifyQuery: (query: string) => MaybePromise<string>;\n\n  // Operation facts that are derived from the operation editor.\n\n  /**\n   * @remarks from graphiql 5\n   */\n  documentAST?: OperationFacts['documentAST'];\n\n  /**\n   * @remarks from graphiql 5\n   */\n  operationName?: string;\n\n  /**\n   * @remarks from graphiql 5\n   */\n  operations?: OperationFacts['operations'];\n}\n\nexport interface EditorActions {\n  /**\n   * Add a new tab.\n   */\n  addTab(): void;\n\n  /**\n   * Switch to a different tab.\n   * @param index - The index of the tab that should be switched to.\n   */\n  changeTab(index: number): void;\n\n  /**\n   * Move a tab to a new spot.\n   * @param newOrder - The new order for the tabs.\n   */\n  moveTab(newOrder: TabState[]): void;\n\n  /**\n   * Close a tab. If the currently active tab is closed, the tab before it will\n   * become active. If there is no tab before the closed one, the tab after it\n   * will become active.\n   * @param index - The index of the tab that should be closed.\n   */\n  closeTab(index: number): void;\n\n  /**\n   * Update the state for the tab that is currently active. This will be\n   * reflected in the `tabs` object and the state will be persisted in storage\n   * (if available).\n   * @param partialTab - A partial tab state object that will override the\n   * current values. The properties `id`, `hash` and `title` cannot be changed.\n   */\n  updateActiveTabValues(\n    partialTab: Partial<Omit<TabState, 'id' | 'hash' | 'title'>>,\n  ): void;\n\n  /**\n   * Set the Monaco Editor instance used in the specified editor.\n   */\n  setEditor(\n    state: Pick<\n      EditorSlice,\n      'headerEditor' | 'queryEditor' | 'responseEditor' | 'variableEditor'\n    >,\n  ): void;\n\n  /**\n   * Changes the operation name and invokes the `onEditOperationName` callback.\n   */\n  setOperationName(operationName: string): void;\n\n  /**\n   * Changes if headers should be persisted.\n   */\n  setShouldPersistHeaders(persist: boolean): void;\n\n  storeTabs(tabsState: TabsState): void;\n\n  setOperationFacts(facts: {\n    documentAST?: DocumentNode;\n    operationName?: string;\n    operations?: OperationDefinitionNode[];\n  }): void;\n\n  /**\n   * Copy a query to clipboard.\n   */\n  copyQuery: () => Promise<void>;\n\n  /**\n   * Merge fragments definitions into operation definition.\n   */\n  mergeQuery: () => void;\n\n  /**\n   * Prettify query, variables and request headers editors.\n   */\n  prettifyEditors: () => Promise<void>;\n}\n\nexport interface EditorProps\n  extends Pick<\n    EditorSlice,\n    | 'onTabChange'\n    | 'onEditOperationName'\n    | 'defaultHeaders'\n    | 'defaultQuery'\n    | 'onCopyQuery'\n  > {\n  /**\n   * With this prop you can pass so-called \"external\" fragments that will be\n   * included in the query document (depending on usage). You can either pass\n   * the fragments using SDL (passing a string) or you can pass a list of\n   * `FragmentDefinitionNode` objects.\n   */\n  externalFragments?: string | FragmentDefinitionNode[];\n\n  /**\n   * This prop can be used to define the default set of tabs, with their\n   * queries, variables, and headers. It will be used as default only if\n   * there is no tab state persisted in storage.\n   *\n   * @example\n   * ```tsx\n   * <GraphiQL\n   *   defaultTabs={[\n   *     { query: 'query myExampleQuery {}' },\n   *     { query: '{ id }' }\n   *   ]}\n   * />\n   *```\n   */\n  defaultTabs?: TabDefinition[];\n\n  /**\n   * This prop toggles if the contents of the request headers editor are persisted in\n   * storage.\n   * @default false\n   */\n  shouldPersistHeaders?: boolean;\n\n  onPrettifyQuery?: EditorSlice['onPrettifyQuery'];\n  initialQuery?: EditorSlice['initialQuery'];\n  initialVariables?: EditorSlice['initialVariables'];\n  initialHeaders?: EditorSlice['initialHeaders'];\n}\n\ntype CreateEditorSlice = (\n  initial: Pick<\n    EditorSlice,\n    | 'shouldPersistHeaders'\n    | 'tabs'\n    | 'activeTabIndex'\n    | 'initialQuery'\n    | 'initialVariables'\n    | 'initialHeaders'\n    | 'onEditOperationName'\n    | 'externalFragments'\n    | 'onTabChange'\n    | 'defaultQuery'\n    | 'defaultHeaders'\n    | 'onPrettifyQuery'\n    | 'onCopyQuery'\n    | 'uriInstanceId'\n  >,\n) => StateCreator<\n  SlicesWithActions,\n  [],\n  [],\n  EditorSlice & { actions: EditorActions }\n>;\n\nexport const createEditorSlice: CreateEditorSlice = initial => (set, get) => {\n  function setEditorValues({\n    query,\n    variables,\n    headers,\n    response,\n  }: {\n    query: string | null;\n    variables?: string | null;\n    headers?: string | null;\n    response: string | null;\n  }) {\n    const {\n      queryEditor,\n      variableEditor,\n      headerEditor,\n      responseEditor,\n      defaultHeaders,\n    } = get();\n    queryEditor?.setValue(query ?? '');\n    variableEditor?.setValue(variables ?? '');\n    headerEditor?.setValue(headers ?? defaultHeaders ?? '');\n    responseEditor?.setValue(response ?? '');\n  }\n\n  function synchronizeActiveTabValues(tabsState: TabsState): TabsState {\n    const {\n      queryEditor,\n      variableEditor,\n      headerEditor,\n      responseEditor,\n      operationName,\n    } = get();\n    return setPropertiesInActiveTab(tabsState, {\n      query: queryEditor?.getValue() ?? null,\n      variables: variableEditor?.getValue() ?? null,\n      headers: headerEditor?.getValue() ?? null,\n      response: responseEditor?.getValue() ?? null,\n      operationName: operationName ?? null,\n    });\n  }\n\n  const $actions: EditorActions = {\n    addTab() {\n      set(({ defaultHeaders, onTabChange, tabs, activeTabIndex, actions }) => {\n        // Make sure the current tab stores the latest values\n        const updatedValues = synchronizeActiveTabValues({\n          tabs,\n          activeTabIndex,\n        });\n        const updated = {\n          tabs: [...updatedValues.tabs, createTab({ headers: defaultHeaders })],\n          activeTabIndex: updatedValues.tabs.length,\n        };\n        actions.storeTabs(updated);\n        setEditorValues(updated.tabs[updated.activeTabIndex]!);\n        onTabChange?.(updated);\n        return updated;\n      });\n    },\n    changeTab(index) {\n      set(({ actions, onTabChange, tabs }) => {\n        actions.stop();\n        const updated = {\n          tabs,\n          activeTabIndex: index,\n        };\n        actions.storeTabs(updated);\n        setEditorValues(updated.tabs[updated.activeTabIndex]!);\n        onTabChange?.(updated);\n        return updated;\n      });\n    },\n    moveTab(newOrder) {\n      set(({ onTabChange, actions, tabs, activeTabIndex }) => {\n        const activeTab = tabs[activeTabIndex]!;\n        const updated = {\n          tabs: newOrder,\n          activeTabIndex: newOrder.indexOf(activeTab),\n        };\n        actions.storeTabs(updated);\n        setEditorValues(updated.tabs[updated.activeTabIndex]!);\n        onTabChange?.(updated);\n        return updated;\n      });\n    },\n    closeTab(index) {\n      set(({ activeTabIndex, onTabChange, actions, tabs }) => {\n        if (activeTabIndex === index) {\n          actions.stop();\n        }\n        const updated = {\n          tabs: tabs.filter((_tab, i) => index !== i),\n          activeTabIndex: Math.max(activeTabIndex - 1, 0),\n        };\n        actions.storeTabs(updated);\n        setEditorValues(updated.tabs[updated.activeTabIndex]!);\n        onTabChange?.(updated);\n        return updated;\n      });\n    },\n    updateActiveTabValues(partialTab) {\n      set(({ activeTabIndex, tabs, onTabChange, actions }) => {\n        const updated = setPropertiesInActiveTab(\n          { tabs, activeTabIndex },\n          partialTab,\n        );\n        actions.storeTabs(updated);\n        onTabChange?.(updated);\n        return updated;\n      });\n    },\n    setEditor({ headerEditor, queryEditor, responseEditor, variableEditor }) {\n      const entries = Object.entries({\n        headerEditor,\n        queryEditor,\n        responseEditor,\n        variableEditor,\n      }).filter(([_key, value]) => value);\n      const newState = Object.fromEntries(entries);\n      set(newState);\n    },\n    setOperationName(operationName) {\n      set(({ onEditOperationName, actions }) => {\n        actions.updateActiveTabValues({ operationName });\n        onEditOperationName?.(operationName);\n        return { operationName };\n      });\n    },\n    setShouldPersistHeaders(persist) {\n      const { headerEditor, tabs, activeTabIndex, storage } = get();\n      if (persist) {\n        storage.set(STORAGE_KEY.headers, headerEditor?.getValue() ?? '');\n        const serializedTabs = serializeTabState(\n          { tabs, activeTabIndex },\n          true,\n        );\n        storage.set(STORAGE_KEY.tabs, serializedTabs);\n      } else {\n        storage.set(STORAGE_KEY.headers, '');\n        clearHeadersFromTabs(storage);\n      }\n      storage.set(STORAGE_KEY.persistHeaders, persist.toString());\n      set({ shouldPersistHeaders: persist });\n    },\n    storeTabs({ tabs, activeTabIndex }) {\n      const { shouldPersistHeaders, storage } = get();\n      const store = debounce(500, (value: string) => {\n        storage.set(STORAGE_KEY.tabs, value);\n      });\n      store(serializeTabState({ tabs, activeTabIndex }, shouldPersistHeaders));\n    },\n    setOperationFacts({ documentAST, operationName, operations }) {\n      set({\n        documentAST,\n        operationName,\n        operations,\n      });\n    },\n    async copyQuery() {\n      const { queryEditor, onCopyQuery } = get();\n      if (!queryEditor) {\n        return;\n      }\n\n      const query = queryEditor.getValue();\n      onCopyQuery?.(query);\n      try {\n        await navigator.clipboard.writeText(query);\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.warn('Failed to copy query!', error);\n      }\n    },\n    async prettifyEditors() {\n      const { queryEditor, headerEditor, variableEditor, onPrettifyQuery } =\n        get();\n\n      if (variableEditor) {\n        try {\n          const content = variableEditor.getValue();\n          const formatted = await formatJSONC(content);\n          if (formatted !== content) {\n            variableEditor.setValue(formatted);\n          }\n        } catch (error) {\n          // eslint-disable-next-line no-console\n          console.warn(\n            'Parsing variables JSON failed, skip prettification.',\n            error,\n          );\n        }\n      }\n\n      if (headerEditor) {\n        try {\n          const content = headerEditor.getValue();\n          const formatted = await formatJSONC(content);\n          if (formatted !== content) {\n            headerEditor.setValue(formatted);\n          }\n        } catch (error) {\n          // eslint-disable-next-line no-console\n          console.warn(\n            'Parsing headers JSON failed, skip prettification.',\n            error,\n          );\n        }\n      }\n\n      if (!queryEditor) {\n        return;\n      }\n      try {\n        const content = queryEditor.getValue();\n        const formatted = await onPrettifyQuery(content);\n        if (formatted !== content) {\n          queryEditor.setValue(formatted);\n        }\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.warn('Parsing query failed, skip prettification.', error);\n      }\n    },\n    mergeQuery() {\n      const { queryEditor, documentAST, schema } = get();\n      const query = queryEditor?.getValue();\n      if (!documentAST || !query) {\n        return;\n      }\n      queryEditor!.setValue(print(mergeAst(documentAST, schema)));\n    },\n  };\n  return {\n    ...initial,\n    actions: $actions,\n  };\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/execution.ts",
    "content": "import {\n  Fetcher,\n  fillLeafs,\n  formatError,\n  formatResult,\n  GetDefaultFieldNamesFn,\n  isAsyncIterable,\n  isObservable,\n  Unsubscribable,\n} from '@graphiql/toolkit';\nimport { ExecutionResult, GraphQLError, print } from 'graphql';\nimport { getFragmentDependenciesForAST } from 'graphql-language-service';\nimport setValue from 'set-value';\nimport getValue from 'get-value';\n\nimport type { StateCreator } from 'zustand';\nimport { tryParseJSONC, Range } from '../utility';\nimport type { SlicesWithActions, MonacoEditor } from '../types';\n\nexport interface ExecutionSlice {\n  /**\n   * If there is currently a GraphQL request in-flight. For multipart\n   * requests like subscriptions, this will be `true` while fetching the\n   * first partial response and `false` while fetching subsequent batches.\n   * @default false\n   */\n  isFetching: boolean;\n\n  /**\n   * Represents an active GraphQL subscription.\n   *\n   * For multipart operations such as subscriptions, this\n   * will hold an `Unsubscribable` object while the request is in-flight. It\n   * remains non-null until the operation completes or is manually unsubscribed.\n   *\n   * @remarks Use `subscription?.unsubscribe()` to cancel the request.\n   * @default null\n   */\n  subscription: Unsubscribable | null;\n\n  /**\n   * The operation name that will be sent with all GraphQL requests.\n   * @default null\n   */\n  overrideOperationName: string | null;\n\n  /**\n   * A function to determine which field leafs are automatically added when\n   * trying to execute a query with missing selection sets. It will be called\n   * with the `GraphQLType` for which fields need to be added.\n   */\n  getDefaultFieldNames?: GetDefaultFieldNamesFn;\n\n  /**\n   * @default 0\n   */\n  queryId: number;\n\n  /**\n   * A function which accepts GraphQL HTTP parameters and returns a `Promise`,\n   * `Observable` or `AsyncIterable` that returns the GraphQL response in\n   * parsed JSON format.\n   *\n   * We suggest using the `createGraphiQLFetcher` utility from `@graphiql/toolkit`\n   * to create these fetcher functions.\n   *\n   * @see {@link https://graphiql-test.netlify.app/typedoc/modules/graphiql_toolkit.html#creategraphiqlfetcher-2|`createGraphiQLFetcher`}\n   */\n  fetcher: Fetcher;\n}\n\nexport interface ExecutionActions {\n  /**\n   * Start a GraphQL request based on the current editor contents.\n   */\n  run(): void;\n\n  /**\n   * Stop the GraphQL request that is currently in-flight.\n   */\n  stop(): void;\n}\n\nexport interface ExecutionProps\n  extends Pick<ExecutionSlice, 'getDefaultFieldNames' | 'fetcher'> {\n  /**\n   * This prop sets the operation name that is passed with a GraphQL request.\n   */\n  operationName?: string;\n}\n\ntype CreateExecutionSlice = (\n  initial: Pick<\n    ExecutionSlice,\n    'overrideOperationName' | 'getDefaultFieldNames' | 'fetcher'\n  >,\n) => StateCreator<\n  SlicesWithActions,\n  [],\n  [],\n  ExecutionSlice & {\n    actions: ExecutionActions;\n  }\n>;\n\nexport const createExecutionSlice: CreateExecutionSlice =\n  initial => (set, get) => {\n    function getAutoCompleteLeafs() {\n      const { queryEditor, schema, getDefaultFieldNames } = get();\n      if (!queryEditor) {\n        return;\n      }\n      const query = queryEditor.getValue();\n      const { insertions, result = '' } = fillLeafs(\n        schema,\n        query,\n        getDefaultFieldNames,\n      );\n      if (!insertions.length) {\n        return result;\n      }\n      const model = queryEditor.getModel()!;\n\n      // Save the current cursor position as an offset\n      const selection = queryEditor.getSelection()!;\n      const cursorIndex = model.getOffsetAt(selection.getPosition());\n\n      // Replace entire content\n      model.setValue(result);\n\n      let added = 0;\n      const decorations = insertions.map(({ index, string }) => {\n        const start = model.getPositionAt(index + added);\n        const end = model.getPositionAt(index + (added += string.length));\n        return {\n          range: new Range(\n            start.lineNumber,\n            start.column,\n            end.lineNumber,\n            end.column,\n          ),\n          options: {\n            className: 'auto-inserted-leaf',\n            hoverMessage: { value: 'Automatically added leaf fields' },\n            isWholeLine: false,\n          },\n        };\n      });\n\n      // Create a decoration collection (initially empty)\n      const decorationCollection = queryEditor.createDecorationsCollection([]);\n\n      // Apply decorations\n      decorationCollection.set(decorations);\n\n      // Clear decorations after 7 seconds\n      setTimeout(() => {\n        decorationCollection.clear();\n      }, 7000);\n\n      // Adjust the cursor position based on insertions\n      let newCursorIndex = cursorIndex;\n      for (const { index, string } of insertions) {\n        if (index < cursorIndex) {\n          newCursorIndex += string.length;\n        }\n      }\n\n      const newCursorPosition = model.getPositionAt(newCursorIndex);\n      queryEditor.setPosition(newCursorPosition);\n\n      return result;\n    }\n\n    return {\n      ...initial,\n      isFetching: false,\n      subscription: null,\n      queryId: 0,\n      actions: {\n        stop() {\n          set(({ subscription }) => {\n            subscription?.unsubscribe();\n            return { isFetching: false, subscription: null };\n          });\n        },\n        async run() {\n          const {\n            externalFragments,\n            headerEditor,\n            queryEditor,\n            responseEditor,\n            variableEditor,\n            actions,\n            operationName,\n            documentAST,\n            subscription,\n            overrideOperationName,\n            queryId,\n            fetcher,\n          } = get();\n          if (!queryEditor || !responseEditor) {\n            return;\n          }\n          // If there's an active subscription, unsubscribe it and return\n          if (subscription) {\n            actions.stop();\n            return;\n          }\n\n          function setResponse(value: string): void {\n            responseEditor?.setValue(value);\n            actions.updateActiveTabValues({ response: value });\n          }\n\n          function setError(error: Error, editor?: MonacoEditor): void {\n            if (!editor) {\n              return;\n            }\n            const name =\n              editor === variableEditor ? 'Variables' : 'Request headers';\n            // Need to format since the response editor uses `json` language\n            setResponse(formatError({ message: `${name} ${error.message}` }));\n          }\n\n          const newQueryId = queryId + 1;\n          set({ queryId: newQueryId });\n\n          // Use the edited query after autoCompleteLeafs() runs or,\n          // in case autoCompletion fails (the function returns undefined),\n          // the current query from the editor.\n          let query = getAutoCompleteLeafs() || queryEditor.getValue();\n\n          let variables: Record<string, unknown> | undefined;\n          try {\n            variables = tryParseJSONC(variableEditor?.getValue());\n          } catch (error) {\n            setError(error as Error, variableEditor);\n            return;\n          }\n          let headers: Record<string, unknown> | undefined;\n          try {\n            headers = tryParseJSONC(headerEditor?.getValue());\n          } catch (error) {\n            setError(error as Error, headerEditor);\n            return;\n          }\n          const fragmentDependencies = documentAST\n            ? getFragmentDependenciesForAST(documentAST, externalFragments)\n            : [];\n          if (fragmentDependencies.length) {\n            query +=\n              '\\n' + fragmentDependencies.map(node => print(node)).join('\\n');\n          }\n\n          setResponse('');\n          set({ isFetching: true });\n          try {\n            const fullResponse: ExecutionResult = {};\n            const handleResponse = (result: ExecutionResult) => {\n              // A different query was dispatched in the meantime, so don't\n              // show the results of this one.\n              if (newQueryId !== get().queryId) {\n                return;\n              }\n\n              let maybeMultipart = Array.isArray(result) ? result : false;\n              if (\n                !maybeMultipart &&\n                typeof result === 'object' &&\n                'hasNext' in result\n              ) {\n                maybeMultipart = [result];\n              }\n\n              if (maybeMultipart) {\n                for (const part of maybeMultipart) {\n                  mergeIncrementalResult(fullResponse, part);\n                }\n\n                set({ isFetching: false });\n                setResponse(formatResult(fullResponse));\n              } else {\n                set({ isFetching: false });\n                setResponse(formatResult(result));\n              }\n            };\n            const opName = overrideOperationName ?? operationName;\n            const fetch = fetcher(\n              { query, variables, operationName: opName },\n              { headers, documentAST },\n            );\n\n            const value = await fetch;\n            if (isObservable(value)) {\n              // If the fetcher returned an Observable, then subscribe to it, calling\n              // the callback on each next value and handling both errors and the\n              // completion of the Observable.\n              const newSubscription = value.subscribe({\n                next(result) {\n                  handleResponse(result);\n                },\n                error(error: Error) {\n                  set({ isFetching: false });\n                  setResponse(formatError(error));\n                  set({ subscription: null });\n                },\n                complete() {\n                  set({ isFetching: false, subscription: null });\n                },\n              });\n              set({ subscription: newSubscription });\n            } else if (isAsyncIterable(value)) {\n              const newSubscription = {\n                unsubscribe: () => value[Symbol.asyncIterator]().return?.(),\n              };\n              set({ subscription: newSubscription });\n              for await (const result of value) {\n                handleResponse(result);\n              }\n              set({ isFetching: false, subscription: null });\n            } else {\n              handleResponse(value);\n            }\n          } catch (error) {\n            set({ isFetching: false });\n            setResponse(formatError(error));\n            set({ subscription: null });\n          }\n        },\n      },\n    };\n  };\n\ninterface IncrementalResult {\n  data?: Record<string, unknown> | null;\n  errors?: ReadonlyArray<GraphQLError>;\n  extensions?: Record<string, unknown>;\n  hasNext?: boolean;\n  path?: ReadonlyArray<string | number>;\n  incremental?: ReadonlyArray<IncrementalResult>;\n  label?: string;\n  items?: ReadonlyArray<Record<string, unknown>> | null;\n  pending?: ReadonlyArray<{ id: string; path: ReadonlyArray<string | number> }>;\n  completed?: ReadonlyArray<{\n    id: string;\n    errors?: ReadonlyArray<GraphQLError>;\n  }>;\n  id?: string;\n  subPath?: ReadonlyArray<string | number>;\n}\n\nconst pathsMap = new WeakMap<\n  ExecutionResult,\n  Map<string, ReadonlyArray<string | number>>\n>();\n\n/**\n * @param executionResult - The complete execution result object which will be\n * mutated by merging the contents of the incremental result.\n * @param incrementalResult - The incremental result that will be merged into the\n * complete execution result.\n */\nfunction mergeIncrementalResult(\n  executionResult: IncrementalResult,\n  incrementalResult: IncrementalResult,\n): void {\n  let path: ReadonlyArray<string | number> | undefined = [\n    'data',\n    ...(incrementalResult.path ?? []),\n  ];\n\n  for (const result of [executionResult, incrementalResult]) {\n    if (result.pending) {\n      let paths = pathsMap.get(executionResult);\n      if (paths === undefined) {\n        paths = new Map();\n        pathsMap.set(executionResult, paths);\n      }\n\n      for (const { id, path: pendingPath } of result.pending) {\n        paths.set(id, ['data', ...pendingPath]);\n      }\n    }\n  }\n\n  const { items, data, id } = incrementalResult;\n  if (items) {\n    if (id) {\n      path = pathsMap.get(executionResult)?.get(id);\n      if (path === undefined) {\n        throw new Error('Invalid incremental delivery format.');\n      }\n\n      const list = getValue(executionResult, path.join('.'));\n      list.push(...items);\n    } else {\n      path = ['data', ...(incrementalResult.path ?? [])];\n      for (const item of items) {\n        setValue(executionResult, path.join('.'), item);\n        // Increment the last path segment (the array index) to merge the next item at the next index\n        // @ts-expect-error -- (path[path.length - 1] as number)++ breaks react compiler\n        path[path.length - 1]++;\n      }\n    }\n  }\n  if (data) {\n    if (id) {\n      path = pathsMap.get(executionResult)?.get(id);\n      if (path === undefined) {\n        throw new Error('Invalid incremental delivery format.');\n      }\n      const { subPath } = incrementalResult;\n      if (subPath !== undefined) {\n        path = [...path, ...subPath];\n      }\n    }\n    setValue(executionResult, path.join('.'), data, {\n      merge: true,\n    });\n  }\n\n  if (incrementalResult.errors) {\n    executionResult.errors ||= [];\n    (executionResult.errors as GraphQLError[]).push(\n      ...incrementalResult.errors,\n    );\n  }\n\n  if (incrementalResult.extensions) {\n    setValue(executionResult, 'extensions', incrementalResult.extensions, {\n      merge: true,\n    });\n  }\n\n  if (incrementalResult.incremental) {\n    for (const incrementalSubResult of incrementalResult.incremental) {\n      mergeIncrementalResult(executionResult, incrementalSubResult);\n    }\n  }\n\n  if (incrementalResult.completed) {\n    // Remove tracking and add additional errors\n    for (const { id: completedId, errors } of incrementalResult.completed) {\n      pathsMap.get(executionResult)?.delete(completedId);\n      if (errors) {\n        executionResult.errors ||= [];\n        (executionResult.errors as GraphQLError[]).push(...errors);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/index.ts",
    "content": "export {\n  createEditorSlice,\n  type EditorSlice,\n  type EditorActions,\n  type EditorProps,\n} from './editor';\nexport {\n  createExecutionSlice,\n  type ExecutionSlice,\n  type ExecutionActions,\n  type ExecutionProps,\n} from './execution';\nexport {\n  createPluginSlice,\n  type PluginSlice,\n  type PluginActions,\n  type PluginProps,\n} from './plugin';\nexport {\n  createSchemaSlice,\n  type SchemaSlice,\n  type SchemaActions,\n  type SchemaProps,\n} from './schema';\nexport { monacoStore, useMonaco } from './monaco';\nexport {\n  createStorageSlice,\n  type StorageSlice,\n  type StorageProps,\n} from './storage';\nexport {\n  createThemeSlice,\n  type ThemeSlice,\n  type ThemeActions,\n  type ThemeProps,\n} from './theme';\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/monaco.ts",
    "content": "import { createStore } from 'zustand';\nimport type { MonacoGraphQLAPI } from 'monaco-graphql';\nimport { createBoundedUseStore } from '../utility';\nimport {\n  JSON_DIAGNOSTIC_OPTIONS,\n  MONACO_GRAPHQL_DIAGNOSTIC_SETTINGS,\n  MONACO_THEME_NAME,\n  MONACO_THEME_DATA,\n} from '../constants';\n\ninterface MonacoStoreType {\n  monaco?: typeof import('monaco-editor');\n  monacoGraphQL?: MonacoGraphQLAPI;\n  actions: {\n    initialize: () => Promise<void>;\n  };\n}\n\n/**\n * Patch for Firefox compatibility:\n *\n * Fixes:\n *    Uncaught Error: can't access property \"offsetNode\", hitResult is null\n *\n * Related issues:\n * - https://github.com/graphql/graphiql/issues/4041\n * - https://github.com/microsoft/monaco-editor/issues/4679\n * - https://github.com/microsoft/monaco-editor/issues/4527\n *\n * The suggested patch https://github.com/microsoft/monaco-editor/issues/4679#issuecomment-2406284453\n * no longer works in Mozilla Firefox\n */\nasync function patchFirefox() {\n  const { MouseTargetFactory } = await import(\n    // @ts-expect-error -- no types\n    'monaco-editor/esm/vs/editor/browser/controller/mouseTarget.js'\n  );\n  const originalFn = MouseTargetFactory._doHitTestWithCaretPositionFromPoint;\n\n  MouseTargetFactory._doHitTestWithCaretPositionFromPoint = (\n    ...args: any[]\n  ) => {\n    const [ctx, coords] = args;\n    const hitResult = ctx.viewDomNode.ownerDocument.caretPositionFromPoint(\n      coords.clientX,\n      coords.clientY,\n    );\n    if (hitResult) {\n      // Delegate to the original function if hitResult is valid\n      const result = originalFn(...args);\n      return result;\n    }\n    // We must return an object with `type: 0` to avoid the following error:\n    // Uncaught Error: can't access property \"type\", result is undefined\n    return { type: 0 };\n  };\n}\n\n/**\n * Dynamically load `monaco-editor` and `monaco-graphql` in `useEffect` after component renders.\n *\n * **Do not convert these to static `import` statements.**\n * In SSR (e.g., Next.js), static imports run on the server\n * where `window` is undefined and trigger an error.\n */\nexport const monacoStore = createStore<MonacoStoreType>((set, get) => ({\n  actions: {\n    async initialize() {\n      const isInitialized = Boolean(get().monaco);\n      if (isInitialized) {\n        return;\n      }\n      const [monaco, { initializeMode }] = await Promise.all([\n        import('monaco-graphql/esm/monaco-editor.js'),\n        import('monaco-graphql/esm/lite.js'),\n      ]);\n      globalThis.__MONACO = monaco;\n      monaco.languages.json.jsonDefaults.setDiagnosticsOptions(\n        JSON_DIAGNOSTIC_OPTIONS,\n      );\n      monaco.editor.defineTheme(MONACO_THEME_NAME.dark, MONACO_THEME_DATA.dark);\n      monaco.editor.defineTheme(\n        MONACO_THEME_NAME.light,\n        MONACO_THEME_DATA.light,\n      );\n      if (navigator.userAgent.includes('Firefox/')) {\n        void patchFirefox();\n      }\n      const monacoGraphQL = initializeMode({\n        diagnosticSettings: MONACO_GRAPHQL_DIAGNOSTIC_SETTINGS,\n      });\n      set({ monaco, monacoGraphQL });\n    },\n  },\n}));\n\nexport const useMonaco = createBoundedUseStore(monacoStore);\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/plugin.ts",
    "content": "import type { ComponentType } from 'react';\nimport type { StateCreator } from 'zustand';\nimport type { SlicesWithActions } from '../types';\nimport { STORAGE_KEY } from '../constants';\n\nexport interface GraphiQLPlugin {\n  /**\n   * A component that renders content into the plugin pane.\n   */\n  content: ComponentType;\n\n  /**\n   * A component that renders an icon that will be shown inside a button that\n   * toggles the plugin visibility.\n   */\n  icon: ComponentType;\n\n  /**\n   * The unique title of the plugin. If two plugins are present with the same\n   * title, the provider component will throw an error.\n   */\n  title: string;\n}\n\nexport interface PluginSlice {\n  /**\n   * A list of all current plugins, including the built-in ones (the doc\n   * explorer and the history).\n   * @default []\n   */\n  plugins: GraphiQLPlugin[];\n\n  /**\n   * The plugin which is currently visible.\n   */\n  visiblePlugin: GraphiQLPlugin | null;\n\n  /**\n   * The plugin which is used to display the reference documentation when selecting a type.\n   * Pass `null` to remove plugin.\n   */\n  referencePlugin?: GraphiQLPlugin | null;\n\n  /**\n   * Invoked when the visibility state of any plugin changes.\n   * @param visiblePlugin - The plugin object that is now visible. If no plugin\n   * is visible, the function will be invoked with `null`.\n   */\n  onTogglePluginVisibility?(visiblePlugin: GraphiQLPlugin | null): void;\n}\n\nexport interface PluginActions {\n  /**\n   * Defines the plugin which is currently visible.\n   * @param plugin - The plugin that should become visible. You can either pass\n   * the plugin object (has to be referentially equal to the one passed as\n   * prop) or the plugin title as string. If `null` is passed, no plugin will\n   * be visible.\n   */\n  setVisiblePlugin(plugin?: GraphiQLPlugin | string | null): void;\n\n  setPlugins(plugins: GraphiQLPlugin[]): void;\n}\n\nexport interface PluginProps\n  extends Pick<PluginSlice, 'referencePlugin' | 'onTogglePluginVisibility'> {\n  /**\n   * This prop accepts a list of plugins that will be shown in addition to the\n   * built-in ones (the doc explorer and the history).\n   * @default []\n   */\n  plugins?: GraphiQLPlugin[];\n\n  /**\n   * This prop can be used to set the visibility state of plugins. Every time\n   * this prop changes, the visibility state will be overridden. Note that the\n   * visibility state can change in between these updates, for example, by\n   * calling the `setVisiblePlugin` function provided by the context.\n   */\n  visiblePlugin?: GraphiQLPlugin | string;\n}\n\ntype CreatePluginSlice = (\n  initial: Pick<PluginSlice, 'onTogglePluginVisibility' | 'referencePlugin'>,\n) => StateCreator<\n  SlicesWithActions,\n  [],\n  [],\n  PluginSlice & {\n    actions: PluginActions;\n  }\n>;\n\nexport const createPluginSlice: CreatePluginSlice = initial => set => ({\n  plugins: [],\n  visiblePlugin: null,\n  ...initial,\n  actions: {\n    setVisiblePlugin(plugin = null) {\n      set(current => {\n        const {\n          visiblePlugin: currentVisiblePlugin,\n          plugins,\n          onTogglePluginVisibility,\n          storage,\n        } = current;\n        const byTitle = typeof plugin === 'string';\n        const newVisiblePlugin: PluginSlice['visiblePlugin'] =\n          (plugin && plugins.find(p => (byTitle ? p.title : p) === plugin)) ||\n          null;\n        if (newVisiblePlugin === currentVisiblePlugin) {\n          return current;\n        }\n        onTogglePluginVisibility?.(newVisiblePlugin);\n        storage.set(STORAGE_KEY.visiblePlugin, newVisiblePlugin?.title ?? '');\n        return { visiblePlugin: newVisiblePlugin };\n      });\n    },\n    setPlugins(plugins) {\n      const seenTitles = new Set<string>();\n      const msg = 'All GraphiQL plugins must have a unique title';\n      for (const { title } of plugins) {\n        if (typeof title !== 'string' || !title) {\n          throw new Error(msg);\n        }\n        if (seenTitles.has(title)) {\n          throw new Error(\n            `${msg}, found two plugins with the title '${title}'`,\n          );\n        }\n        seenTitles.add(title);\n      }\n      set({ plugins });\n    },\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/schema.ts",
    "content": "import {\n  FetcherOpts,\n  fetcherReturnToPromise,\n  formatError,\n  formatResult,\n  isPromise,\n} from '@graphiql/toolkit';\nimport {\n  buildClientSchema,\n  getIntrospectionQuery,\n  GraphQLError,\n  GraphQLSchema,\n  IntrospectionQuery,\n} from 'graphql';\nimport type { Dispatch } from 'react';\nimport type { StateCreator } from 'zustand';\nimport type { SlicesWithActions, SchemaReference } from '../types';\nimport { tryParseJSONC } from '../utility';\n\ntype MaybeGraphQLSchema = GraphQLSchema | null | undefined;\n\ntype CreateSchemaSlice = (\n  initial: Pick<\n    SchemaSlice,\n    | 'inputValueDeprecation'\n    | 'introspectionQueryName'\n    | 'onSchemaChange'\n    | 'schemaDescription'\n  >,\n) => StateCreator<\n  SlicesWithActions,\n  [],\n  [],\n  SchemaSlice & {\n    actions: SchemaActions;\n  }\n>;\n\nexport const createSchemaSlice: CreateSchemaSlice = initial => (set, get) => ({\n  ...initial,\n\n  fetchError: null,\n  isIntrospecting: false,\n  schema: null,\n  /**\n   * Derive validation errors from the schema\n   */\n  validationErrors: [],\n  schemaReference: null,\n  requestCounter: 0,\n  shouldIntrospect: true,\n  actions: {\n    setSchemaReference(schemaReference) {\n      set({ schemaReference });\n    },\n    async introspect() {\n      const {\n        requestCounter,\n        shouldIntrospect,\n        onSchemaChange,\n        headerEditor,\n        fetcher,\n        inputValueDeprecation,\n        introspectionQueryName,\n        schemaDescription,\n      } = get();\n\n      /**\n       * Only introspect if there is no schema provided via props. If the\n       * prop is passed an introspection result, we do continue but skip the\n       * introspection request.\n       */\n      if (!shouldIntrospect) {\n        return;\n      }\n      const counter = requestCounter + 1;\n      set({ requestCounter: counter, isIntrospecting: true, fetchError: null });\n      try {\n        let headers: Record<string, unknown> | undefined;\n        try {\n          headers = tryParseJSONC(headerEditor?.getValue());\n        } catch (error) {\n          throw new Error(\n            `Introspection failed. Request headers ${error instanceof Error ? error.message : error}`,\n          );\n        }\n\n        const fetcherOpts: FetcherOpts = headers ? { headers } : {};\n        /**\n         * Get an introspection query for settings given via props\n         */\n        const introspectionQuery = getIntrospectionQuery({\n          inputValueDeprecation,\n          schemaDescription,\n        });\n\n        function doIntrospection(query: string) {\n          const fetch = fetcherReturnToPromise(\n            fetcher(\n              { query, operationName: introspectionQueryName },\n              fetcherOpts,\n            ),\n          );\n          if (!isPromise(fetch)) {\n            throw new TypeError(\n              'Fetcher did not return a Promise for introspection.',\n            );\n          }\n          return fetch;\n        }\n\n        const normalizedQuery =\n          introspectionQueryName === 'IntrospectionQuery'\n            ? introspectionQuery\n            : introspectionQuery.replace(\n                'query IntrospectionQuery',\n                `query ${introspectionQueryName}`,\n              );\n        let result = await doIntrospection(normalizedQuery);\n\n        if (typeof result !== 'object' || !('data' in result)) {\n          // Try the stock introspection query first, falling back on the\n          // sans-subscriptions query for services which do not yet support it.\n          result = await doIntrospection(\n            introspectionQuery.replace('subscriptionType { name }', ''),\n          );\n        }\n        set({ isIntrospecting: false });\n        let introspectionData: IntrospectionQuery | undefined;\n        if (result.data && '__schema' in result.data) {\n          introspectionData = result.data as IntrospectionQuery;\n        } else {\n          // handle as if it were an error if the fetcher response is not a string or response.data is not present\n          const responseString =\n            typeof result === 'string' ? result : formatResult(result);\n          set({ fetchError: responseString });\n        }\n        /**\n         * Don't continue if another introspection request has been started in\n         * the meantime or if there is no introspection data.\n         */\n        if (counter !== get().requestCounter || !introspectionData) {\n          return;\n        }\n        const newSchema = buildClientSchema(introspectionData);\n        set({ schema: newSchema });\n        onSchemaChange?.(newSchema);\n      } catch (error) {\n        /**\n         * Don't continue if another introspection request has been started in\n         * the meantime.\n         */\n        if (counter !== get().requestCounter) {\n          return;\n        }\n        if (error instanceof Error) {\n          delete error.stack;\n        }\n        set({\n          isIntrospecting: false,\n          fetchError: formatError(error),\n        });\n      }\n    },\n  },\n});\n\nexport interface SchemaSlice\n  extends Pick<\n    SchemaProps,\n    | 'inputValueDeprecation'\n    | 'introspectionQueryName'\n    | 'schemaDescription'\n    | 'onSchemaChange'\n  > {\n  /**\n   * Stores an error raised during introspecting or building the GraphQL schema\n   * from the introspection result.\n   */\n  fetchError: string | null;\n\n  /**\n   * If there currently is an introspection request in-flight.\n   */\n  isIntrospecting: boolean;\n\n  /**\n   * The current GraphQL schema.\n   */\n  schema: MaybeGraphQLSchema;\n\n  /**\n   * A list of errors from validating the current GraphQL schema. The schema is\n   * valid if and only if this list is empty.\n   */\n  validationErrors: readonly GraphQLError[];\n\n  /**\n   * The last type selected by the user.\n   */\n  schemaReference: SchemaReference | null;\n\n  /**\n   * A counter that is incremented each time introspection is triggered or the\n   * schema state is updated.\n   */\n  requestCounter: number;\n\n  /**\n   * `false` when `schema` is provided via `props` as `GraphQLSchema | null`\n   */\n  shouldIntrospect: boolean;\n}\n\nexport interface SchemaActions {\n  /**\n   * Trigger building the GraphQL schema. This might trigger an introspection\n   * request if no schema is passed via props and if using a schema is not\n   * explicitly disabled by passing `null` as value for the `schema` prop. If\n   * there is a schema (either fetched using introspection or passed via props)\n   * it will be validated, unless this is explicitly skipped using the\n   * `dangerouslyAssumeSchemaIsValid` prop.\n   */\n  introspect(): Promise<void>;\n\n  /**\n   * Set the current selected type.\n   */\n  setSchemaReference: Dispatch<SchemaReference>;\n}\n\nexport interface SchemaProps {\n  /**\n   * This prop can be used to skip validating the GraphQL schema. This applies\n   * to both schemas fetched via introspection and schemas explicitly passed\n   * via the `schema` prop.\n   *\n   * IMPORTANT NOTE: Without validating the schema, GraphiQL and its components\n   * are vulnerable to numerous exploits and might break. Only use this prop if\n   * you have full control over the schema passed to GraphiQL.\n   *\n   * @default false\n   */\n  dangerouslyAssumeSchemaIsValid?: boolean;\n\n  /**\n   * Invoked after a new GraphQL schema was built. This includes both fetching\n   * the schema via introspection and passing the schema using the `schema`\n   * prop.\n   * @param schema - The GraphQL schema that is now used for GraphiQL.\n   */\n  onSchemaChange?(schema: GraphQLSchema): void;\n\n  /**\n   * Explicitly provide the GraphiQL schema that shall be used for GraphiQL.\n   * If this props is...\n   * - ...passed and the value is a GraphQL schema, it will be validated and\n   *   then used for GraphiQL if it is valid.\n   * - ...passed and the value is the result of an introspection query, a\n   *   GraphQL schema will be built from this introspection data, it will be\n   *   validated, and then used for GraphiQL if it is valid.\n   * - ...set to `null`, no introspection request will be triggered and\n   *   GraphiQL will run without a schema.\n   * - ...set to `undefined` or not set at all, an introspection request will\n   *   be triggered. If this request succeeds, a GraphQL schema will be built\n   *   from the returned introspection data, it will be validated, and then\n   *   used for GraphiQL if it is valid. If this request fails, GraphiQL will\n   *   run without a schema.\n   */\n  schema?: GraphQLSchema | IntrospectionQuery | null;\n\n  /**\n   * Can be used to set the equally named option for introspecting a GraphQL\n   * server.\n   * @default false\n   * @see {@link https://github.com/graphql/graphql-js/blob/main/src/utilities/getIntrospectionQuery.ts|Utility for creating the introspection query}\n   */\n  inputValueDeprecation?: boolean;\n\n  /**\n   * Can be used to set a custom operation name for the introspection query.\n   * @default 'IntrospectionQuery'\n   */\n  introspectionQueryName?: string;\n\n  /**\n   * Can be used to set the equally named option for introspecting a GraphQL\n   * server.\n   * @default false\n   * @see {@link https://github.com/graphql/graphql-js/blob/main/src/utilities/getIntrospectionQuery.ts|Utility for creating the introspection query}\n   */\n  schemaDescription?: boolean;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/storage.ts",
    "content": "import type { Storage, StorageAPI } from '@graphiql/toolkit';\nimport type { StateCreator } from 'zustand';\nimport type { SlicesWithActions } from '../types';\n\nexport interface StorageSlice {\n  storage: StorageAPI;\n}\n\nexport interface StorageProps {\n  /**\n   * Provide a custom storage API.\n   * @default localStorage\n   * @see {@link https://graphiql-test.netlify.app/typedoc/modules/graphiql_toolkit.html#storage-2|API docs}\n   * for details on the required interface.\n   */\n  storage?: Storage;\n}\n\ntype CreateStorageSlice = (\n  initial: StorageSlice,\n) => StateCreator<SlicesWithActions, [], [], StorageSlice>;\n\nexport const createStorageSlice: CreateStorageSlice = initial => () => initial;\n"
  },
  {
    "path": "packages/graphiql-react/src/stores/theme.ts",
    "content": "import type * as monaco from 'monaco-editor';\nimport { STORAGE_KEY, MONACO_THEME_NAME } from '../constants';\nimport { monacoStore } from './monaco';\nimport type { StateCreator } from 'zustand';\nimport type { SlicesWithActions, Theme } from '../types';\n\ntype MonacoTheme =\n  | monaco.editor.BuiltinTheme\n  | (typeof MONACO_THEME_NAME)[keyof typeof MONACO_THEME_NAME]\n  | ({} & string);\n\nexport interface ThemeSlice {\n  theme: Theme;\n\n  monacoTheme?: MonacoTheme;\n}\n\nexport interface ThemeActions {\n  /**\n   * Set a new theme\n   */\n  setTheme: (newTheme: Theme) => void;\n}\n\nexport interface ThemeProps {\n  /**\n   * @default null\n   */\n  defaultTheme?: Theme;\n\n  /**\n   * Sets the color theme for the monaco editors.\n   * @default { dark: 'graphiql-DARK', light: 'graphiql-LIGHT' }\n   */\n  editorTheme?: {\n    dark: MonacoTheme;\n    light: MonacoTheme;\n  };\n}\n\ntype CreateThemeSlice = (\n  initial: Pick<ThemeProps, 'editorTheme'>,\n) => StateCreator<\n  SlicesWithActions,\n  [],\n  [],\n  ThemeSlice & {\n    actions: ThemeActions;\n  }\n>;\n\nexport const createThemeSlice: CreateThemeSlice =\n  ({ editorTheme }) =>\n  (set, get) => ({\n    theme: null,\n    actions: {\n      setTheme(theme) {\n        const { storage } = get();\n        storage.set(STORAGE_KEY.theme, theme ?? '');\n        document.body.classList.remove('graphiql-light', 'graphiql-dark');\n        if (theme) {\n          document.body.classList.add(`graphiql-${theme}`);\n        }\n        const { monaco } = monacoStore.getState();\n        const resolvedTheme = theme ?? getSystemTheme();\n        const monacoTheme = editorTheme![resolvedTheme];\n        monaco?.editor.setTheme(monacoTheme);\n        set({ theme, monacoTheme });\n      },\n    },\n  });\n\n/**\n * Get the resolved theme - dark or light\n * @see https://github.com/pacocoursey/next-themes/blob/c89d0191ce0f19215d7ddfa9eb28e1e4f94d37e5/next-themes/src/index.tsx#L255\n */\nfunction getSystemTheme() {\n  const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n  const isDark = mediaQueryList.matches;\n  const systemTheme = isDark ? 'dark' : 'light';\n  return systemTheme;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/style/auto-insertion.css",
    "content": ".auto-inserted-leaf {\n  animation-duration: 6s;\n  animation-name: insertionFade;\n  border-radius: var(--border-radius-4);\n  padding: var(--px-2);\n}\n\n@keyframes insertionFade {\n  from,\n  to {\n    background-color: transparent;\n  }\n\n  15%,\n  85% {\n    background-color: hsla(var(--color-warning), var(--alpha-background-light));\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/style/editor.css",
    "content": ".graphiql-editor {\n  height: 100%;\n  width: 100%;\n\n  &.hidden {\n    display: none;\n  }\n}\n\n.monaco-editor {\n  /* otherwise editor couldn't be resized */\n  position: absolute !important;\n  /**\n   * Monaco-editor from v0.52 shows some blue lines for all editors\n   * @see https://github.com/microsoft/monaco-editor/issues/4455\n   */\n  outline-width: 0 !important;\n\n  .highlight {\n    color: hsl(var(--color-primary)) !important;\n  }\n\n  input:focus-visible {\n    outline-color: hsl(var(--color-primary));\n  }\n\n  /* Command pallet F1 styles */\n  .overflow-guard {\n    overflow: unset !important;\n  }\n\n  .quick-input-widget {\n    min-width: min(500px, 70vw) !important;\n    box-shadow: none !important;\n    /* Make quick input widget border same as editor hover widget  */\n    --vscode-widget-border: var(--vscode-editorHoverWidget-border);\n  }\n}\n\n/* Make hover contents be dynamic */\n.monaco-hover,\n.monaco-hover-content {\n  width: auto !important;\n  height: auto !important;\n  max-width: none !important;\n  max-height: none !important;\n}\n\n.monaco-editor\n  .suggest-widget\n  .monaco-list\n  .monaco-list-row\n  > .contents\n  > .main {\n  & > .left {\n    flex-grow: 0;\n  }\n\n  /* Align type autocomplete suggestion on right */\n  & > .right {\n    flex-grow: 1;\n    margin-right: auto;\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/style/root.css",
    "content": "@import 'auto-insertion.css';\n@import 'editor.css';\n\n/* a very simple box-model reset, intentionally does not include pseudo elements */\n.graphiql-container * {\n  box-sizing: border-box;\n  font-variant-ligatures: none;\n}\n\n.graphiql-container,\n.graphiql-dialog,\n.graphiql-dialog-overlay,\n.graphiql-tooltip,\n[data-radix-popper-content-wrapper] {\n  /* Colors */\n  --color-primary: 320, 95%, 43%;\n  --color-secondary: 242, 51%, 61%;\n  --color-tertiary: 188, 100%, 36%;\n  --color-info: 208, 100%, 46%;\n  --color-success: 158, 60%, 42%;\n  --color-warning: 36, 100%, 41%;\n  --color-error: 13, 93%, 58%;\n  --color-neutral: 219, 28%, 32%;\n  --color-base: 219, 28%, 100%;\n\n  /* Color alpha values */\n  --alpha-secondary: 0.76;\n  --alpha-tertiary: 0.5;\n  --alpha-background-heavy: 0.15;\n  --alpha-background-medium: 0.1;\n  --alpha-background-light: 0.07;\n\n  /* Font */\n  --font-family: 'Roboto', sans-serif;\n  --font-family-mono: 'Fira Code', monospace;\n  --font-size-hint: calc(12rem / 16);\n  --font-size-inline-code: calc(13rem / 16);\n  --font-size-body: calc(15rem / 16);\n  --font-size-h4: calc(18rem / 16);\n  --font-size-h3: calc(22rem / 16);\n  --font-size-h2: calc(29rem / 16);\n  --font-weight-regular: 400;\n  --font-weight-medium: 500;\n  --line-height: 1.5;\n\n  /* Spacing */\n  --px-2: 2px;\n  --px-4: 4px;\n  --px-6: 6px;\n  --px-8: 8px;\n  --px-10: 10px;\n  --px-12: 12px;\n  --px-16: 16px;\n  --px-20: 20px;\n  --px-24: 24px;\n\n  /* Border radius */\n  --border-radius-2: 2px;\n  --border-radius-4: 4px;\n  --border-radius-8: 8px;\n  --border-radius-12: 12px;\n\n  /* Popover styles (tooltip, dialog, etc) */\n  --popover-box-shadow: 0px 6px 20px rgba(59, 76, 106, 0.13),\n    0px 1.34018px 4.46726px rgba(59, 76, 106, 0.0774939),\n    0px 0.399006px 1.33002px rgba(59, 76, 106, 0.0525061);\n  --popover-border: none;\n\n  /* Layout */\n  --sidebar-width: 60px;\n  --toolbar-width: 40px;\n  --session-header-height: 38.5px;\n}\n\n@media (prefers-color-scheme: dark) {\n  body:not(.graphiql-light) .graphiql-container,\n  body:not(.graphiql-light) .graphiql-dialog,\n  body:not(.graphiql-light) .graphiql-dialog-overlay,\n  body:not(.graphiql-light) .graphiql-tooltip,\n  body:not(.graphiql-light) [data-radix-popper-content-wrapper] {\n    --color-primary: 338, 100%, 67%;\n    --color-secondary: 243, 100%, 77%;\n    --color-tertiary: 188, 100%, 44%;\n    --color-info: 208, 100%, 72%;\n    --color-success: 158, 100%, 42%;\n    --color-warning: 30, 100%, 80%;\n    --color-error: 13, 100%, 58%;\n    --color-neutral: 219, 29%, 78%;\n    --color-base: 219, 29%, 18%;\n\n    --popover-box-shadow: none;\n    --popover-border: 1px solid hsl(var(--color-neutral));\n  }\n}\n\nbody.graphiql-dark .graphiql-container,\nbody.graphiql-dark .graphiql-dialog,\nbody.graphiql-dark .graphiql-dialog-overlay,\nbody.graphiql-dark .graphiql-tooltip,\nbody.graphiql-dark [data-radix-popper-content-wrapper] {\n  --color-primary: 338, 100%, 67%;\n  --color-secondary: 243, 100%, 77%;\n  --color-tertiary: 188, 100%, 44%;\n  --color-info: 208, 100%, 72%;\n  --color-success: 158, 100%, 42%;\n  --color-warning: 30, 100%, 80%;\n  --color-error: 13, 100%, 58%;\n  --color-neutral: 219, 29%, 78%;\n  --color-base: 219, 29%, 18%;\n\n  --popover-box-shadow: none;\n  --popover-border: 1px solid hsl(var(--color-neutral));\n}\n\n.graphiql-container,\n.graphiql-dialog {\n  &,\n  &:is(button) {\n    color: hsl(var(--color-neutral));\n    font-family: var(--font-family);\n    font-size: var(--font-size-body);\n    font-weight: var(--font-weight-regular);\n    line-height: var(--line-height);\n  }\n\n  & input {\n    color: hsl(var(--color-neutral));\n    font-family: var(--font-family);\n    font-size: var(--font-size-caption);\n\n    &::placeholder {\n      color: hsla(var(--color-neutral), var(--alpha-secondary));\n    }\n  }\n\n  & a {\n    color: hsl(var(--color-primary));\n\n    &:focus {\n      outline: hsl(var(--color-primary)) auto 1px;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/types.test-d.ts",
    "content": "import type {\n  EditorSlice,\n  ExecutionSlice,\n  PluginSlice,\n  SchemaSlice,\n  ThemeSlice,\n  StorageSlice,\n  //\n  EditorActions,\n  ExecutionActions,\n  PluginActions,\n  SchemaActions,\n  ThemeActions,\n} from './stores';\nimport type { AllSlices, AllActions } from './types';\n\ndescribe('Should not have conflicting types', () => {\n  interface OverlapError<K extends PropertyKey> {\n    ERROR: 'Conflicting keys found';\n    CONFLICT_KEYS: K;\n  }\n\n  type MergeWithoutOverlap<A, B> = keyof A & keyof B extends never\n    ? A & B\n    : OverlapError<keyof A & keyof B>;\n\n  type MergeMany<T extends any[], Acc = unknown> = T extends [\n    infer Head,\n    ...infer Tail,\n  ]\n    ? MergeWithoutOverlap<Acc, Head> extends infer Merged\n      ? Merged extends OverlapError<any>\n        ? Merged\n        : MergeMany<Tail, Merged>\n      : never\n    : Acc;\n\n  it('AllSlices', () => {\n    type Actual = MergeMany<\n      [\n        EditorSlice,\n        ExecutionSlice,\n        PluginSlice,\n        SchemaSlice,\n        ThemeSlice,\n        StorageSlice,\n      ]\n    >;\n    // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n    expectTypeOf<Actual>().toEqualTypeOf<AllSlices>;\n  });\n\n  it('AllActions', () => {\n    type Actual = MergeMany<\n      [\n        EditorActions,\n        ExecutionActions,\n        PluginActions,\n        SchemaActions,\n        ThemeActions,\n      ]\n    >;\n    // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n    expectTypeOf<Actual>().toEqualTypeOf<AllActions>;\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/types.ts",
    "content": "import type { ComponentPropsWithoutRef } from 'react';\nimport type { AllTypeInfo } from 'graphql-language-service/esm/types';\nimport type * as monaco from 'monaco-editor';\nimport type {\n  EditorSlice,\n  ExecutionSlice,\n  PluginSlice,\n  SchemaSlice,\n  ThemeSlice,\n  StorageSlice,\n  //\n  EditorActions,\n  ExecutionActions,\n  PluginActions,\n  SchemaActions,\n  ThemeActions,\n} from './stores';\nimport type { RuleKind } from 'graphql-language-service';\n\nexport type EditorProps = ComponentPropsWithoutRef<'div'>;\n\nexport interface SchemaReference {\n  kind: RuleKind;\n  typeInfo: AllTypeInfo;\n}\n\nexport type MonacoEditor = monaco.editor.IStandaloneCodeEditor;\n\nexport type AllSlices = EditorSlice &\n  ExecutionSlice &\n  PluginSlice &\n  SchemaSlice &\n  ThemeSlice &\n  StorageSlice;\n\nexport type AllActions = EditorActions &\n  ExecutionActions &\n  PluginActions &\n  SchemaActions &\n  ThemeActions;\n\nexport interface SlicesWithActions extends AllSlices {\n  actions: AllActions;\n}\n\n/**\n * The value `null` semantically means that the user does not explicitly choose\n * any theme, so we use the system default.\n */\nexport type Theme = 'light' | 'dark' | null;\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/cleanup-disposables.ts",
    "content": "import type * as monaco from 'monaco-editor';\n\nexport function cleanupDisposables(disposables: monaco.IDisposable[]) {\n  return () => {\n    for (const disposable of disposables) {\n      disposable.dispose(); // remove the listener\n    }\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/create-bounded-use-store.ts",
    "content": "import { ExtractState, StoreApi, useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\n// https://zustand.docs.pmnd.rs/guides/typescript#bounded-usestore-hook-for-vanilla-stores\nexport const createBoundedUseStore = (store => selector => {\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- selector can be `undefined`\n  return useStore(store, selector && useShallow(selector));\n}) as <S extends StoreApi<unknown>>(\n  store: S,\n) => {\n  (): ExtractState<S>;\n  <T>(selector: (state: ExtractState<S>) => T): T;\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/create-editor.ts",
    "content": "import type { KeyboardEventHandler, RefObject } from 'react';\nimport type * as monaco from 'monaco-editor';\nimport type { MonacoEditor } from '../types';\nimport { monacoStore } from '../stores';\nimport { Uri } from '../utility';\n\nexport const onEditorContainerKeyDown: KeyboardEventHandler<\n  HTMLDivElement\n> = event => {\n  const el = event.currentTarget;\n  const isFocused = el === document.activeElement;\n  if (isFocused && event.code === 'Enter') {\n    event.preventDefault();\n    el.querySelector('textarea')?.focus();\n  }\n};\n\nexport function getOrCreateModel({\n  uri: $uri,\n  value,\n}: {\n  uri: string;\n  value: string;\n}) {\n  const { monaco } = monacoStore.getState();\n  if (!monaco) {\n    throw new Error('Monaco editor is not initialized');\n  }\n  const uri = Uri.file($uri);\n  const model = monaco.editor.getModel(uri);\n  const language = uri.path.split('.').at(-1)!;\n  return model ?? monaco.editor.createModel(value, language, uri);\n}\n\nexport function createEditor(\n  domElement: RefObject<HTMLDivElement>,\n  options: monaco.editor.IStandaloneEditorConstructionOptions,\n): MonacoEditor {\n  const { model } = options;\n  if (!model) {\n    throw new Error('options.model is required');\n  }\n  const language = model.uri.path.split('.').at(-1)!;\n  const { monaco } = monacoStore.getState();\n  if (!monaco) {\n    throw new Error('Monaco editor is not initialized');\n  }\n  return monaco.editor.create(domElement.current, {\n    language,\n    automaticLayout: true,\n    fontSize: 15,\n    minimap: { enabled: false }, // disable the minimap\n    tabSize: 2,\n    renderLineHighlight: 'none', // Remove a line selection border\n    stickyScroll: { enabled: false }, // Disable sticky scroll widget\n    overviewRulerLanes: 0, // remove unnecessary error highlight on the scroll\n    scrollbar: {\n      verticalScrollbarSize: 10,\n    },\n    scrollBeyondLastLine: false, // cleans up unnecessary \"padding-bottom\" on each editor\n    fontFamily: '\"Fira Code\"',\n    // Enable font ligatures and fix incorrect caret position on Windows\n    // See: https://github.com/graphql/graphiql/issues/4040\n    fontLigatures: true,\n    lineNumbersMinChars: 2, // reduce line numbers width on the left size\n    tabIndex: -1, // Do not allow tabbing into the editor, only via by pressing Enter or its container\n    ...options,\n  });\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/debounce.ts",
    "content": "'use no memo';\n\n/**\n * Provided a duration and a function, returns a new function which is called\n * `duration` milliseconds after the last call.\n */\nexport function debounce<F extends (...args: any[]) => any>(\n  duration: number,\n  fn: F,\n) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return function (...args) {\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(() => {\n      timeout = null;\n      fn(...args);\n    }, duration);\n  } as F;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/hooks.ts",
    "content": "import { useEffect, useRef, useState } from 'react';\nimport { debounce } from './debounce';\nimport type * as monaco from 'monaco-editor';\nimport { useGraphiQL, useGraphiQLActions } from '../components';\n\nexport function useChangeHandler(\n  callback: ((value: string) => void) | undefined,\n  storageKey: string | null,\n  tabProperty: 'variables' | 'headers',\n) {\n  const { updateActiveTabValues } = useGraphiQLActions();\n  const { editor, storage } = useGraphiQL(state => ({\n    editor:\n      state[tabProperty === 'variables' ? 'variableEditor' : 'headerEditor'],\n    storage: state.storage,\n  }));\n  useEffect(() => {\n    if (!editor) {\n      return;\n    }\n    const store = debounce(500, (value: string) => {\n      if (storageKey === null) {\n        return;\n      }\n      storage.set(storageKey, value);\n    });\n    const updateTab = debounce(100, (value: string) => {\n      updateActiveTabValues({ [tabProperty]: value });\n    });\n\n    const handleChange = (_event: monaco.editor.IModelContentChangedEvent) => {\n      const newValue = editor.getValue();\n      store(newValue);\n      updateTab(newValue);\n      callback?.(newValue);\n    };\n    const disposable = editor.getModel()!.onDidChangeContent(handleChange);\n    return () => {\n      disposable.dispose();\n    };\n  }, [\n    callback,\n    editor,\n    storageKey,\n    tabProperty,\n    updateActiveTabValues,\n    storage,\n  ]);\n}\n\n// https://react.dev/learn/you-might-not-need-an-effect\nexport const useEditorState = (\n  editor: 'query' | 'variable' | 'header',\n): [string, (val: string) => void] => {\n  const editorInstance = useGraphiQL(state => state[`${editor}Editor`]);\n  const [value, setValue] = useState('');\n  const model = editorInstance?.getModel();\n\n  useEffect(() => {\n    if (!model) {\n      return;\n    }\n\n    function onChange() {\n      setValue(model!.getValue());\n    }\n\n    const disposable = model.onDidChangeContent(onChange);\n    // Initialize the value\n    onChange();\n    return () => {\n      disposable.dispose();\n    };\n  }, [model]);\n\n  function handleChange(newValue: string) {\n    model!.setValue(newValue);\n  }\n\n  return [value, handleChange];\n};\n\n/**\n * useState-like hook for the current tab operations editor state\n */\nexport const useOperationsEditorState = (): [\n  operations: string,\n  setOperations: (content: string) => void,\n] => {\n  return useEditorState('query');\n};\n\n/**\n * useState-like hook for current tab variables editor state\n */\nexport const useVariablesEditorState = (): [\n  variables: string,\n  setVariables: (content: string) => void,\n] => {\n  return useEditorState('variable');\n};\n\n/**\n * useState-like hook for current tab variables editor state\n */\nexport const useHeadersEditorState = (): [\n  headers: string,\n  setHeaders: (content: string) => void,\n] => {\n  return useEditorState('header');\n};\n\n/**\n * Implements an optimistic caching strategy around a useState-like hook in\n * order to prevent loss of updates when the hook has an internal delay and the\n * update function is called again before the updated state is sent out.\n *\n * Use this as a wrapper around `useOperationsEditorState`,\n * `useVariablesEditorState`, or `useHeadersEditorState` if you anticipate\n * calling them with great frequency (due to, for instance, mouse, keyboard, or\n * network events).\n *\n * @example\n * ```ts\n * const [operationsString, handleEditOperations] =\n *   useOptimisticState(useOperationsEditorState());\n * ```\n */\nexport function useOptimisticState([\n  upstreamState,\n  upstreamSetState,\n]: ReturnType<typeof useEditorState>): ReturnType<typeof useEditorState> {\n  const lastStateRef = useRef({\n    /** The last thing that we sent upstream; we're expecting this back */\n    pending: null as string | null,\n    /** The last thing we received from upstream */\n    last: upstreamState,\n  });\n\n  const [state, setOperationsText] = useState(upstreamState);\n\n  useEffect(() => {\n    if (lastStateRef.current.last === upstreamState) {\n      // No change; ignore\n      return;\n    }\n    lastStateRef.current.last = upstreamState;\n    if (lastStateRef.current.pending === null) {\n      // Gracefully accept update from upstream\n      setOperationsText(upstreamState);\n      return;\n    }\n    if (lastStateRef.current.pending === upstreamState) {\n      // They received our update and sent it back to us - clear pending, and\n      // send next if appropriate\n      lastStateRef.current.pending = null;\n      if (upstreamState !== state) {\n        // Change has occurred; upstream it\n        lastStateRef.current.pending = state;\n        upstreamSetState(state);\n      }\n      return;\n    }\n    // They got a different update; overwrite our local state (!!)\n    lastStateRef.current.pending = null;\n    setOperationsText(upstreamState);\n  }, [upstreamState, state, upstreamSetState]);\n\n  const setState = (newState: string) => {\n    setOperationsText(newState);\n    if (\n      lastStateRef.current.pending === null &&\n      lastStateRef.current.last !== newState\n    ) {\n      // No pending updates and change has occurred... send it upstream\n      lastStateRef.current.pending = newState;\n      upstreamSetState(newState);\n    }\n  };\n\n  return [state, setState];\n}\n\n// https://github.com/mantinedev/mantine/blob/master/packages/@mantine/hooks/src/use-did-update/use-did-update.ts\nexport const useDidUpdate: typeof useEffect = (fn, dependencies) => {\n  const didMountRef = useRef(false);\n\n  // React Strict Mode intentionally mounts → unmounts → mounts the component during development.\n  useEffect(() => {\n    return () => {\n      didMountRef.current = false;\n    };\n  }, []);\n\n  useEffect(() => {\n    if (didMountRef.current) {\n      return fn();\n    }\n    didMountRef.current = true;\n  }, dependencies); // eslint-disable-line react-hooks/exhaustive-deps\n};\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/index.ts",
    "content": "export { cleanupDisposables } from './cleanup-disposables';\nexport { createBoundedUseStore } from './create-bounded-use-store';\nexport {\n  getOrCreateModel,\n  createEditor,\n  onEditorContainerKeyDown,\n} from './create-editor';\nexport { debounce } from './debounce';\nexport { formatJSONC, parseJSONC, tryParseJSONC } from './jsonc';\nexport { markdown } from './markdown';\nexport { Uri, KeyMod, KeyCode, Range } from './monaco-ssr';\nexport { pick } from './pick';\nexport { useDragResize } from './resize';\nexport { clsx as cn } from 'clsx';\nexport {\n  useOptimisticState,\n  useEditorState,\n  useOperationsEditorState,\n  useVariablesEditorState,\n  useHeadersEditorState,\n  useChangeHandler,\n  useDidUpdate,\n} from './hooks';\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/jsonc.ts",
    "content": "import {\n  parse as jsoncParse,\n  ParseError,\n  printParseErrorCode,\n} from 'jsonc-parser';\n\nexport async function formatJSONC(content: string): Promise<string> {\n  // We don't need to load Prettier initially; it's only used when the 'Format Query' button or shortcut is triggered\n  const [\n    prettier,\n    // @ts-expect-error – no types\n    { printers },\n    { parsers },\n  ] = await Promise.all([\n    import('prettier/standalone'),\n    import('prettier/plugins/estree'),\n    import('prettier/parser-babel'),\n  ]);\n\n  return prettier.format(content, {\n    parser: 'jsonc',\n    plugins: [\n      // Fix: Couldn't find plugin for AST format \"estree\"\n      { printers },\n      // @ts-expect-error -- Fix Couldn't resolve parser \"jsonc\"\n      { parsers },\n    ],\n    // always split into new lines, e.g. {\"foo\":true} => {\\n  \"foo\": true\\n}\n    printWidth: 0,\n  });\n}\n\nconst formatter = new Intl.ListFormat('en', {\n  style: 'long',\n  type: 'conjunction', // uses \"and\"\n});\n\nexport function parseJSONC(content: string) {\n  const errors: ParseError[] = [];\n\n  const parsed: undefined | Record<string, unknown> = jsoncParse(\n    content,\n    errors,\n    {\n      allowTrailingComma: true,\n      allowEmptyContent: true,\n    },\n  );\n  if (errors.length) {\n    const output = formatter.format(\n      errors.map(({ error }) => printParseErrorCode(error)),\n    );\n    throw new SyntaxError(output);\n  }\n  return parsed;\n}\n\nexport function tryParseJSONC(json = '') {\n  let parsed: Record<string, unknown> | undefined;\n  try {\n    parsed = parseJSONC(json);\n  } catch (error) {\n    throw new Error(\n      `are invalid JSON: ${error instanceof Error ? error.message : error}.`,\n    );\n  }\n  if (!parsed) {\n    return;\n  }\n  const isObject = typeof parsed === 'object' && !Array.isArray(parsed);\n  if (!isObject) {\n    throw new TypeError('are not a JSON object.');\n  }\n  return parsed;\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/markdown.ts",
    "content": "'use no memo';\n\nimport MarkdownIt from 'markdown-it';\n\nexport const markdown = new MarkdownIt({\n  // we don't want to convert \\n to <br> because in Markdown a single newline is not a line break\n  // https://github.com/graphql/graphiql/issues/3155\n  breaks: false,\n  linkify: true,\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/monaco-ssr.ts",
    "content": "/**\n * Re‑export Monaco Editor exports.\n * Importing directly from 'monaco-editor' causes a “window is not defined” error during SSR.\n */\nexport { KeyCode } from 'monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js';\nexport { KeyMod } from 'monaco-editor/esm/vs/editor/common/services/editorBaseApi.js';\nexport { URI as Uri } from 'monaco-editor/esm/vs/base/common/uri.js';\nexport { Range } from 'monaco-editor/esm/vs/editor/common/core/range.js';\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/pick.ts",
    "content": "/**\n * `pick`-like utility that extracts specific keys from an object.\n */\nexport function pick<T, K extends keyof T>(...keys: K[]) {\n  return (obj: T): Pick<T, K> => {\n    const result = Object.create(null);\n    for (const key of keys) {\n      result[key] = obj[key];\n    }\n    return result;\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/resize.ts",
    "content": "import { useEffect, useRef, useState } from 'react';\nimport { debounce } from './debounce';\nimport { useGraphiQL } from '../components';\n\ntype ResizableElement = 'first' | 'second';\n\ninterface UseDragResizeArgs {\n  /**\n   * Set the default sizes for the two resizable halves by passing their ratio\n   * (first divided by second).\n   * @default 1\n   */\n  defaultSizeRelation?: number;\n  /**\n   * The direction in which the two halves should be resizable.\n   */\n  direction: 'horizontal' | 'vertical';\n  /**\n   * Choose one of the two halves that should initially be hidden.\n   */\n  initiallyHidden?: ResizableElement;\n\n  /**\n   * Invoked when the visibility of one of the halves changes.\n   * @param hiddenElement - The element that is now hidden after the change\n   * (`null` if both are visible).\n   */\n  onHiddenElementChange?(hiddenElement: ResizableElement | null): void;\n\n  /**\n   * The minimum width in pixels for the first half. If it is resized to a\n   * width smaller than this threshold, the half will be hidden.\n   * @default 100\n   */\n  sizeThresholdFirst?: number;\n  /**\n   * The minimum width in pixels for the second half. If it is resized to a\n   * width smaller than this threshold, the half will be hidden.\n   * @default 100\n   */\n  sizeThresholdSecond?: number;\n  /**\n   * A key for which the state of resizing is persisted in storage (if storage\n   * is available).\n   */\n  storageKey?: string;\n}\n\nexport function useDragResize({\n  defaultSizeRelation = 1,\n  direction,\n  initiallyHidden,\n  onHiddenElementChange,\n  sizeThresholdFirst = 100,\n  sizeThresholdSecond = 100,\n  storageKey,\n}: UseDragResizeArgs) {\n  const storage = useGraphiQL(state => state.storage);\n\n  const [hiddenElement, setHiddenElement] = useState<ResizableElement | null>(\n    () => {\n      const storedValue = storageKey && storage.get(storageKey);\n      if (storedValue === HIDE_FIRST || initiallyHidden === 'first') {\n        return 'first';\n      }\n      if (storedValue === HIDE_SECOND || initiallyHidden === 'second') {\n        return 'second';\n      }\n      return null;\n    },\n  );\n\n  const firstRef = useRef<HTMLDivElement>(null);\n  const dragBarRef = useRef<HTMLDivElement>(null);\n  const secondRef = useRef<HTMLDivElement>(null);\n\n  const defaultFlexRef = useRef(`${defaultSizeRelation}`);\n\n  /**\n   * Set initial flex values\n   */\n  useEffect(() => {\n    const storedValue =\n      (storageKey && storage.get(storageKey)) || defaultFlexRef.current;\n\n    if (firstRef.current) {\n      firstRef.current.style.flex =\n        storedValue === HIDE_FIRST || storedValue === HIDE_SECOND\n          ? defaultFlexRef.current\n          : storedValue;\n    }\n\n    if (secondRef.current) {\n      secondRef.current.style.flex = '1';\n    }\n  }, [direction, storage, storageKey]);\n\n  /**\n   * Hide and show items when the state changes\n   */\n  useEffect(() => {\n    function hide(element: HTMLDivElement) {\n      element.style.left = '-1000px';\n      element.style.position = 'absolute';\n      element.style.opacity = '0';\n\n      // Make sure that the flex value of the first item is at least equal to one\n      // so that the entire space of the parent element is filled up\n      if (!firstRef.current) {\n        return;\n      }\n      const flex = parseFloat(firstRef.current.style.flex);\n      if (!Number.isFinite(flex) || flex < 1) {\n        firstRef.current.style.flex = '1';\n      }\n    }\n\n    function show(element: HTMLDivElement) {\n      element.style.left = '';\n      element.style.position = '';\n      element.style.opacity = '';\n\n      if (!storageKey) {\n        return;\n      }\n      const storedValue = storage.get(storageKey);\n      if (\n        firstRef.current &&\n        storedValue !== HIDE_FIRST &&\n        storedValue !== HIDE_SECOND\n      ) {\n        firstRef.current.style.flex = storedValue || defaultFlexRef.current;\n      }\n    }\n\n    for (const id of ['first', 'second'] as const) {\n      const element = (id === 'first' ? firstRef : secondRef).current;\n      if (element) {\n        if (id === hiddenElement) {\n          hide(element);\n        } else {\n          show(element);\n        }\n      }\n    }\n  }, [hiddenElement, storage, storageKey]);\n\n  useEffect(() => {\n    if (!dragBarRef.current || !firstRef.current || !secondRef.current) {\n      return;\n    }\n    const store = debounce(500, (value: string) => {\n      if (storageKey) {\n        storage.set(storageKey, value);\n      }\n    });\n\n    function setHiddenElementWithCallback(element: ResizableElement | null) {\n      setHiddenElement(prevHiddenElement => {\n        if (element === prevHiddenElement) {\n          return prevHiddenElement;\n        }\n        onHiddenElementChange?.(element);\n        return element;\n      });\n    }\n\n    const dragBarContainer = dragBarRef.current;\n    const firstContainer = firstRef.current;\n    const wrapper = firstContainer.parentElement!;\n    const isHorizontal = direction === 'horizontal';\n    const eventProperty = isHorizontal ? 'clientX' : 'clientY';\n    const rectProperty = isHorizontal ? 'left' : 'top';\n    const adjacentRectProperty = isHorizontal ? 'right' : 'bottom';\n    const sizeProperty = isHorizontal ? 'clientWidth' : 'clientHeight';\n\n    function handleMouseDown(downEvent: MouseEvent) {\n      const isClickOnCurrentElement =\n        downEvent.target === downEvent.currentTarget;\n      if (!isClickOnCurrentElement) {\n        return;\n      }\n\n      downEvent.preventDefault();\n\n      // Distance between the start of the drag bar and the exact point where\n      // the user clicked on the drag bar.\n      const offset =\n        downEvent[eventProperty] -\n        dragBarContainer.getBoundingClientRect()[rectProperty];\n\n      function handleMouseMove(moveEvent: MouseEvent) {\n        if (moveEvent.buttons === 0) {\n          return handleMouseUp();\n        }\n        const domRect = wrapper.getBoundingClientRect();\n        const firstSize =\n          moveEvent[eventProperty] - domRect[rectProperty] - offset;\n        const secondSize =\n          domRect[adjacentRectProperty] -\n          moveEvent[eventProperty] +\n          offset -\n          dragBarContainer[sizeProperty];\n\n        if (firstSize < sizeThresholdFirst) {\n          // Hide the first display\n          setHiddenElementWithCallback('first');\n          store(HIDE_FIRST);\n        } else if (secondSize < sizeThresholdSecond) {\n          // Hide the second display\n          setHiddenElementWithCallback('second');\n          store(HIDE_SECOND);\n        } else {\n          // Show both and adjust the flex value of the first one (the flex\n          // value for the second one is always `1`)\n          setHiddenElementWithCallback(null);\n          const newFlex = `${firstSize / secondSize}`;\n          firstContainer.style.flex = newFlex;\n          store(newFlex);\n        }\n      }\n\n      function handleMouseUp() {\n        document.removeEventListener('mousemove', handleMouseMove);\n        document.removeEventListener('mouseup', handleMouseUp);\n      }\n\n      document.addEventListener('mousemove', handleMouseMove);\n      document.addEventListener('mouseup', handleMouseUp);\n    }\n\n    dragBarContainer.addEventListener('mousedown', handleMouseDown);\n\n    function reset() {\n      if (firstRef.current) {\n        firstRef.current.style.flex = defaultFlexRef.current;\n      }\n      store(defaultFlexRef.current);\n      setHiddenElementWithCallback(null);\n    }\n\n    dragBarContainer.addEventListener('dblclick', reset);\n\n    return () => {\n      dragBarContainer.removeEventListener('mousedown', handleMouseDown);\n      dragBarContainer.removeEventListener('dblclick', reset);\n    };\n  }, [\n    direction,\n    onHiddenElementChange,\n    sizeThresholdFirst,\n    sizeThresholdSecond,\n    storage,\n    storageKey,\n  ]);\n\n  return {\n    dragBarRef,\n    hiddenElement,\n    firstRef,\n    setHiddenElement,\n    secondRef,\n  };\n}\n\nconst HIDE_FIRST = 'hide-first';\nconst HIDE_SECOND = 'hide-second';\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/tabs.spec.ts",
    "content": "import { StorageAPI } from '@graphiql/toolkit';\nimport {\n  createTab,\n  fuzzyExtractOperationName,\n  getDefaultTabState,\n  clearHeadersFromTabs,\n} from './tabs';\nimport { STORAGE_KEY } from '../constants';\n\ndescribe('createTab', () => {\n  it('creates with default title', () => {\n    expect(createTab({})).toEqual(\n      expect.objectContaining({\n        id: expect.any(String),\n        hash: expect.any(String),\n        title: '<untitled>',\n      }),\n    );\n  });\n\n  it('creates with title from query', () => {\n    expect(createTab({ query: 'query Foo {}' })).toEqual(\n      expect.objectContaining({\n        id: expect.any(String),\n        hash: expect.any(String),\n        title: 'Foo',\n      }),\n    );\n  });\n});\n\ndescribe('fuzzyExtractionOperationTitle', () => {\n  describe('without prefix', () => {\n    it('should extract query names', () => {\n      expect(fuzzyExtractOperationName('query MyExampleQuery() {}')).toEqual(\n        'MyExampleQuery',\n      );\n    });\n    it('should extract query names with special characters', () => {\n      expect(fuzzyExtractOperationName('query My_ExampleQuery() {}')).toEqual(\n        'My_ExampleQuery',\n      );\n    });\n    it('should extract query names with numbers', () => {\n      expect(fuzzyExtractOperationName('query My_3ExampleQuery() {}')).toEqual(\n        'My_3ExampleQuery',\n      );\n    });\n    it('should extract mutation names with numbers', () => {\n      expect(\n        fuzzyExtractOperationName('mutation My_3ExampleQuery() {}'),\n      ).toEqual('My_3ExampleQuery');\n    });\n  });\n  describe('with space prefix', () => {\n    it('should extract query names', () => {\n      expect(fuzzyExtractOperationName(' query MyExampleQuery() {}')).toEqual(\n        'MyExampleQuery',\n      );\n    });\n    it('should extract query names with special characters', () => {\n      expect(fuzzyExtractOperationName(' query My_ExampleQuery() {}')).toEqual(\n        'My_ExampleQuery',\n      );\n    });\n    it('should extract query names with numbers', () => {\n      expect(fuzzyExtractOperationName(' query My_3ExampleQuery() {}')).toEqual(\n        'My_3ExampleQuery',\n      );\n    });\n    it('should extract mutation names with numbers', () => {\n      expect(\n        fuzzyExtractOperationName(' mutation My_3ExampleQuery() {}'),\n      ).toEqual('My_3ExampleQuery');\n    });\n  });\n\n  it('should return null for anonymous queries', () => {\n    expect(fuzzyExtractOperationName('{}')).toBeNull();\n  });\n\n  describe('comment line handling', () => {\n    it('should not extract query names within commented out lines', () => {\n      expect(\n        fuzzyExtractOperationName('# query My_3ExampleQuery() {}'),\n      ).toBeNull();\n    });\n    it('should extract query names when there is a single leading comment line', () => {\n      expect(\n        fuzzyExtractOperationName(\n          '# comment line 1 \\n query MyExampleQueryWithSingleCommentLine() {}',\n        ),\n      ).toEqual('MyExampleQueryWithSingleCommentLine');\n    });\n    it('should extract query names when there are more than one leading comment lines', () => {\n      expect(\n        fuzzyExtractOperationName(\n          '# comment line 1 \\n # comment line 2 \\n query MyExampleQueryWithMultipleCommentLines() {}',\n        ),\n      ).toEqual('MyExampleQueryWithMultipleCommentLines');\n    });\n  });\n});\n\ndescribe('getDefaultTabState', () => {\n  it('returns default tab', () => {\n    expect(\n      getDefaultTabState({\n        defaultQuery: '# Default',\n        headers: null,\n        query: null,\n        variables: null,\n        storage: new StorageAPI(),\n      }),\n    ).toEqual({\n      activeTabIndex: 0,\n      tabs: [\n        expect.objectContaining({\n          query: '# Default',\n          title: '<untitled>',\n        }),\n      ],\n    });\n  });\n\n  it('returns initial tabs', () => {\n    expect(\n      getDefaultTabState({\n        defaultQuery: '# Default',\n        headers: null,\n        defaultTabs: [\n          {\n            headers: null,\n            query: 'query Person { person { name } }',\n            variables: '{\"id\":\"foo\"}',\n          },\n          {\n            headers: '{\"x-header\":\"foo\"}',\n            query: 'query Image { image }',\n            variables: null,\n          },\n        ],\n        query: null,\n        variables: null,\n        storage: new StorageAPI(),\n      }),\n    ).toEqual({\n      activeTabIndex: 0,\n      tabs: [\n        expect.objectContaining({\n          query: 'query Person { person { name } }',\n          title: 'Person',\n          variables: '{\"id\":\"foo\"}',\n        }),\n        expect.objectContaining({\n          headers: '{\"x-header\":\"foo\"}',\n          query: 'query Image { image }',\n          title: 'Image',\n        }),\n      ],\n    });\n  });\n});\n\ndescribe('clearHeadersFromTabs', () => {\n  it('preserves tab state except for headers', () => {\n    const storage = new StorageAPI();\n    const stateWithHeaders = {\n      operationName: 'test',\n      query: 'query test {\\n  test {\\n    id\\n  }\\n}',\n      test: {\n        a: 'test',\n      },\n      headers: '{ \"authorization\": \"secret\" }',\n    };\n    storage.set(STORAGE_KEY.tabs, JSON.stringify(stateWithHeaders));\n    clearHeadersFromTabs(storage);\n\n    expect(JSON.parse(storage.get(STORAGE_KEY.tabs)!)).toEqual({\n      ...stateWithHeaders,\n      headers: null,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/tabs.ts",
    "content": "'use no memo'; // can't figure why it isn't optimized\n\nimport { STORAGE_KEY } from '../constants';\nimport type { AllSlices } from '../types';\n\nexport interface TabDefinition {\n  /**\n   * The contents of the operation editor of this tab.\n   */\n  query: string | null;\n  /**\n   * The contents of the variables editor of this tab.\n   */\n  variables?: string | null;\n  /**\n   * The contents of the request headers editor of this tab.\n   */\n  headers?: string | null;\n}\n\n/**\n * This object describes the state of a single tab.\n */\nexport interface TabState extends TabDefinition {\n  /**\n   * A GUID value generated when the tab was created.\n   */\n  id: string;\n\n  /**\n   * A hash that is unique for a combination of the contents of the query\n   * editor, the variables editor and the request headers editor (i.e., all the editor\n   * where the contents are persisted in storage).\n   */\n  hash: string;\n\n  /**\n   * The title of the tab shown in the tab element.\n   */\n  title: string;\n\n  /**\n   * The operation name derived from the contents of the operation editor of this\n   * tab.\n   */\n  operationName: string | null;\n\n  /**\n   * The contents of the response editor of this tab.\n   */\n  response: string | null;\n}\n\n/**\n * This object describes the state of all tabs.\n */\nexport type TabsState = {\n  /**\n   * A list of state objects for each tab.\n   */\n  tabs: TabState[];\n  /**\n   * The index of the currently active tab with regards to the `tabs` list of\n   * this object.\n   */\n  activeTabIndex: number;\n};\n\nexport function getDefaultTabState({\n  defaultQuery,\n  defaultHeaders,\n  headers,\n  query,\n  variables,\n  defaultTabs = [\n    {\n      query: query ?? defaultQuery,\n      variables,\n      headers: headers ?? defaultHeaders,\n    },\n  ],\n  shouldPersistHeaders,\n  storage,\n}: {\n  defaultQuery: string;\n  defaultHeaders?: string;\n  headers: string | null;\n  defaultTabs?: TabDefinition[];\n  query: string | null;\n  variables: string | null;\n  shouldPersistHeaders?: boolean;\n  storage: AllSlices['storage'];\n}) {\n  const storedState = storage.get(STORAGE_KEY.tabs);\n  try {\n    if (!storedState) {\n      throw new Error('Storage for tabs is empty');\n    }\n    const parsed = JSON.parse(storedState);\n    // if headers are not persisted, do not derive the hash using default headers state\n    // or else you will get new tabs on every refresh\n    const headersForHash = shouldPersistHeaders ? headers : undefined;\n    if (isTabsState(parsed)) {\n      const expectedHash = hashFromTabContents({\n        query,\n        variables,\n        headers: headersForHash,\n      });\n      let matchingTabIndex = -1;\n\n      for (let index = 0; index < parsed.tabs.length; index++) {\n        const tab = parsed.tabs[index]!;\n        tab.hash = hashFromTabContents({\n          query: tab.query,\n          variables: tab.variables,\n          headers: tab.headers,\n        });\n        if (tab.hash === expectedHash) {\n          matchingTabIndex = index;\n        }\n      }\n\n      if (matchingTabIndex >= 0) {\n        parsed.activeTabIndex = matchingTabIndex;\n      } else {\n        const operationName = query ? fuzzyExtractOperationName(query) : null;\n        parsed.tabs.push({\n          id: guid(),\n          hash: expectedHash,\n          title: operationName || DEFAULT_TITLE,\n          query,\n          variables,\n          headers,\n          operationName,\n          response: null,\n        });\n        parsed.activeTabIndex = parsed.tabs.length - 1;\n      }\n\n      return parsed;\n    }\n    throw new Error('Storage for tabs is invalid');\n  } catch {\n    return {\n      activeTabIndex: 0,\n      tabs: defaultTabs.map(createTab),\n    };\n  }\n}\n\nfunction isTabsState(obj: any): obj is TabsState {\n  return (\n    obj &&\n    typeof obj === 'object' &&\n    !Array.isArray(obj) &&\n    hasNumberKey(obj, 'activeTabIndex') &&\n    'tabs' in obj &&\n    Array.isArray(obj.tabs) &&\n    obj.tabs.every(isTabState)\n  );\n}\n\nfunction isTabState(obj: any): obj is TabState {\n  // We don't persist the hash, so we skip the check here\n  return (\n    obj &&\n    typeof obj === 'object' &&\n    !Array.isArray(obj) &&\n    hasStringKey(obj, 'id') &&\n    hasStringKey(obj, 'title') &&\n    hasStringOrNullKey(obj, 'query') &&\n    hasStringOrNullKey(obj, 'variables') &&\n    hasStringOrNullKey(obj, 'headers') &&\n    hasStringOrNullKey(obj, 'operationName') &&\n    hasStringOrNullKey(obj, 'response')\n  );\n}\n\nfunction hasNumberKey(obj: Record<string, any>, key: string) {\n  return key in obj && typeof obj[key] === 'number';\n}\n\nfunction hasStringKey(obj: Record<string, any>, key: string) {\n  return key in obj && typeof obj[key] === 'string';\n}\n\nfunction hasStringOrNullKey(obj: Record<string, any>, key: string) {\n  return key in obj && (typeof obj[key] === 'string' || obj[key] === null);\n}\n\nexport function serializeTabState(\n  tabState: TabsState,\n  shouldPersistHeaders = false,\n) {\n  return JSON.stringify(tabState, (key, value) =>\n    key === 'hash' ||\n    key === 'response' ||\n    (!shouldPersistHeaders && key === 'headers')\n      ? null\n      : value,\n  );\n}\n\nexport function createTab({\n  query = null,\n  variables = null,\n  headers = null,\n}: Partial<TabDefinition> = {}): TabState {\n  const operationName = query ? fuzzyExtractOperationName(query) : null;\n  return {\n    id: guid(),\n    hash: hashFromTabContents({ query, variables, headers }),\n    title: operationName || DEFAULT_TITLE,\n    query,\n    variables,\n    headers,\n    operationName,\n    response: null,\n  };\n}\n\nexport function setPropertiesInActiveTab(\n  state: TabsState,\n  partialTab: Partial<Omit<TabState, 'id' | 'hash' | 'title'>>,\n): TabsState {\n  return {\n    ...state,\n    tabs: state.tabs.map((tab, index) => {\n      if (index !== state.activeTabIndex) {\n        return tab;\n      }\n      const newTab = { ...tab, ...partialTab };\n      return {\n        ...newTab,\n        hash: hashFromTabContents(newTab),\n        title:\n          newTab.operationName ||\n          (newTab.query\n            ? fuzzyExtractOperationName(newTab.query)\n            : undefined) ||\n          DEFAULT_TITLE,\n      };\n    }),\n  };\n}\n\nfunction guid(): string {\n  const s4 = () => {\n    return Math.floor((1 + Math.random()) * 0x10000)\n      .toString(16)\n      .slice(1);\n  };\n  // return id of format 'aaaaaaaa'-'aaaa'-'aaaa'-'aaaa'-'aaaaaaaaaaaa'\n  return `${s4()}${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\n}\n\nfunction hashFromTabContents(args: {\n  query: string | null;\n  variables?: string | null;\n  headers?: string | null;\n}): string {\n  return [args.query ?? '', args.variables ?? '', args.headers ?? ''].join('|');\n}\n\nexport function fuzzyExtractOperationName(str: string): string | null {\n  const regex = /^(?!#).*(query|subscription|mutation)\\s+([a-zA-Z0-9_]+)/m;\n\n  const match = regex.exec(str);\n\n  return match?.[2] ?? null;\n}\n\nexport function clearHeadersFromTabs(storage: AllSlices['storage']) {\n  const persistedTabs = storage.get(STORAGE_KEY.tabs);\n  if (persistedTabs) {\n    const parsedTabs = JSON.parse(persistedTabs);\n    storage.set(\n      STORAGE_KEY.tabs,\n      JSON.stringify(parsedTabs, (key, value) =>\n        key === 'headers' ? null : value,\n      ),\n    );\n  }\n}\n\nconst DEFAULT_TITLE = '<untitled>';\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/whitespace.spec.ts",
    "content": "import { invalidCharacters, normalizeWhitespace } from './whitespace';\n\ndescribe('normalizeWhitespace', () => {\n  it('removes unicode characters', () => {\n    const result = normalizeWhitespace(invalidCharacters.join(''));\n    expect(result).toEqual(' '.repeat(invalidCharacters.length));\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-react/src/utility/whitespace.ts",
    "content": "'use no memo';\n\n// Unicode whitespace characters that break the interface.\nexport const invalidCharacters = Array.from({ length: 11 }, (_, i) => {\n  // \\u2000 -> \\u200a\n  return String.fromCharCode(0x2000 + i);\n}).concat(['\\u2028', '\\u2029', '\\u202f', '\\u00a0']);\n\nconst sanitizeRegex = new RegExp('[' + invalidCharacters.join('') + ']', 'g');\n\nexport function normalizeWhitespace(line: string) {\n  return line.replace(sanitizeRegex, ' ');\n}\n"
  },
  {
    "path": "packages/graphiql-react/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite-plugin-svgr/client\" />\n/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "packages/graphiql-react/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\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\",\n    \"declaration\": true,\n    \"noUncheckedIndexedAccess\": true,\n    \"importsNotUsedAsValues\": \"error\",\n    \"types\": [\"vitest/globals\", \"@testing-library/jest-dom\"]\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-react/vite.config.mts",
    "content": "/* eslint-disable no-console */\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { defineConfig, PluginOption } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport svgr from 'vite-plugin-svgr';\nimport type { PluginOptions as ReactCompilerConfig } from 'babel-plugin-react-compiler';\nimport packageJSON from './package.json' assert { type: 'json' };\nimport dts from 'vite-plugin-dts';\n\nexport const reactCompilerConfig: Partial<ReactCompilerConfig> = {\n  target: '18',\n  sources(filename) {\n    if (filename.includes('__tests__')) {\n      return false;\n    }\n    return filename.includes('graphiql-react');\n  },\n  logger: {\n    logEvent(filename, result) {\n      if (result.kind === 'CompileSuccess') {\n        console.info('🚀 File', filename, 'was optimized with react-compiler');\n        return;\n      }\n      if (result.kind === 'CompileSkip') {\n        console.info(\n          '🚫 File',\n          filename,\n          'was skipped due to \"use no memo\" directive',\n        );\n        return;\n      }\n      console.error(\n        '❌ File',\n        filename,\n        'was not optimized with react-compiler',\n        result,\n      );\n      const isDev = process.argv.at(-1)! === '--watch';\n      if (!isDev) {\n        process.exit(1);\n      }\n    },\n  },\n};\n\nexport const plugins: PluginOption[] = [\n  react({\n    babel: {\n      plugins: [['babel-plugin-react-compiler', reactCompilerConfig]],\n    },\n  }),\n  svgr({\n    svgrOptions: {\n      titleProp: true,\n    },\n  }),\n  dts({\n    include: ['src/**'],\n    outDir: ['dist'],\n    exclude: ['**/*.spec.{ts,tsx}', '**/__tests__/'],\n  }),\n  {\n    name: 'copy-original-setup-workers-file',\n    async closeBundle() {\n      const source = './src/setup-workers';\n      const dest = './dist/setup-workers';\n      const types = 'export {};\\n';\n\n      await fs.mkdir(dest, { recursive: true });\n\n      const [esmSh, vite, webpack] = await Promise.all([\n        fs.readFile(path.join(source, 'esm.sh.ts')),\n        fs.readFile(path.join(source, 'vite.ts')),\n        fs.readFile(path.join(source, 'webpack.ts')),\n      ]);\n\n      function removeTypes(raw: Buffer) {\n        return raw.toString().replaceAll(': string', '');\n      }\n\n      await Promise.all([\n        fs.writeFile(path.join(dest, 'esm.sh.js'), removeTypes(esmSh)),\n        fs.writeFile(path.join(dest, 'esm.sh.d.ts'), types),\n        fs.writeFile(path.join(dest, 'vite.js'), removeTypes(vite)),\n        fs.writeFile(path.join(dest, 'vite.d.ts'), types),\n        fs.writeFile(path.join(dest, 'webpack.js'), removeTypes(webpack)),\n        fs.writeFile(path.join(dest, 'webpack.d.ts'), types),\n      ]);\n\n      console.info(`Build finished! Created \"${dest}\"...`);\n    },\n  },\n];\n\nexport default defineConfig({\n  plugins,\n  css: {\n    transformer: 'lightningcss',\n  },\n  build: {\n    minify: false,\n    sourcemap: true,\n    lib: {\n      entry: 'src/index.ts',\n      fileName(_format, entryName) {\n        const filePath = entryName.replace(/\\.svg$/, '');\n        return `${filePath}.js`;\n      },\n      formats: ['es'],\n      cssFileName: 'style',\n    },\n    rollupOptions: {\n      external: [\n        'react/jsx-runtime',\n        'react-dom/client',\n        // Exclude peer dependencies and dependencies from bundle\n        ...Object.keys({\n          ...packageJSON.peerDependencies,\n          ...packageJSON.dependencies,\n        }),\n        /monaco-graphql\\//,\n        /monaco-editor\\//,\n        /prettier\\//,\n        /graphql-language-service\\//,\n        /zustand\\//,\n      ],\n      output: {\n        // Separate chunks for all modules\n        preserveModules: true,\n      },\n    },\n  },\n  worker: {\n    format: 'es',\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-react/vitest.config.mts",
    "content": "import path from 'node:path';\nimport { defineConfig } from 'vitest/config';\nimport { plugins } from './vite.config.mjs';\n\nexport default defineConfig({\n  plugins,\n  test: {\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: ['./setup-files.ts'],\n    alias: [\n      {\n        // Fixes Error: Failed to resolve entry for package \"monaco-editor\". The package may have incorrect main/module/exports specified in its package.json.\n        find: /^monaco-editor$/,\n        replacement: path.resolve(\n          '../../node_modules/monaco-editor/esm/vs/editor/editor.api',\n        ),\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": "packages/graphiql-toolkit/CHANGELOG.md",
    "content": "# @graphiql/toolkit\n\n## 0.11.3\n\n### Patch Changes\n\n- [#3970](https://github.com/graphql/graphiql/pull/3970) [`7054591`](https://github.com/graphql/graphiql/commit/70545912d1b3bb9e0c45e766a5c89896a9c4dfb7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - revert https://github.com/graphql/graphiql/pull/3946 to have support multiple embedded graphiql instances on the same page\n\n## 0.11.2\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n## 0.11.1\n\n### Patch Changes\n\n- [#3811](https://github.com/graphql/graphiql/pull/3811) [`5f2c3a4`](https://github.com/graphql/graphiql/commit/5f2c3a45906c332e07200b0008d0e5bf329a8ffa) Thanks [@acao](https://github.com/acao)! - Fix type export to prevent build time bugs\n\n## 0.11.0\n\n### Minor Changes\n\n- [#3747](https://github.com/graphql/graphiql/pull/3747) [`21c4409`](https://github.com/graphql/graphiql/commit/21c44096c0c0b23cea955a574d1110cb19ab6405) Thanks [@dimaMachina](https://github.com/dimaMachina)! - do not include `require` statements in ESM build, include `import` in esm and `require` in cjs builds\n\n  make `getWsFetcher`, `createWebsocketsFetcherFromUrl` async\n\n- [#3746](https://github.com/graphql/graphiql/pull/3746) [`2ad4e75`](https://github.com/graphql/graphiql/commit/2ad4e7505385fefd252b9aa8ea2233cbaeca7f6a) Thanks [@dimaMachina](https://github.com/dimaMachina)! - compile with `tsup` instead of `tsc`\n\n## 0.10.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n## 0.9.2\n\n### Patch Changes\n\n- [#3646](https://github.com/graphql/graphiql/pull/3646) [`56c6f45`](https://github.com/graphql/graphiql/commit/56c6f4571dd0dfda307ed11c5afb8c837ad928b0) Thanks [@dimaMachina](https://github.com/dimaMachina)! - prefer `localStorage` over `window.localStorage`\n\n## 0.9.1\n\n### Patch Changes\n\n- [#3298](https://github.com/graphql/graphiql/pull/3298) [`4cbdf183`](https://github.com/graphql/graphiql/commit/4cbdf18385d34ef9bc095c376936f92a62eb9e9b) Thanks [@esquevin](https://github.com/esquevin)! - Prevent OOM on merging complex queries\n\n## 0.9.0\n\n### Minor Changes\n\n- [#3022](https://github.com/graphql/graphiql/pull/3022) [`ffb6486d`](https://github.com/graphql/graphiql/commit/ffb6486d1eab0be2bc8fdec366b5671a5d6504d1) Thanks [@heyacherry](https://github.com/heyacherry)! - Add a new utility function `createLocalStorage` that creates a local storage with support for custom namespaces\n\n## 0.8.4\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- [#3109](https://github.com/graphql/graphiql/pull/3109) [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-floating-promises` eslint rule\n\n- [#3120](https://github.com/graphql/graphiql/pull/3120) [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040) Thanks [@B2o5T](https://github.com/B2o5T)! - prefer await to then\n\n## 0.8.3\n\n### Patch Changes\n\n- [#3046](https://github.com/graphql/graphiql/pull/3046) [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer .at() method for index access\n\n- [#3042](https://github.com/graphql/graphiql/pull/3042) [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer String#slice() over String#substr() and String#substring()\n\n## 0.8.2\n\n### Patch Changes\n\n- [#2962](https://github.com/graphql/graphiql/pull/2962) [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d) Thanks [@B2o5T](https://github.com/B2o5T)! - clean all ESLint warnings, add `--max-warnings=0` and `--cache` flags\n\n## 0.8.1\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2923](https://github.com/graphql/graphiql/pull/2923) [`695100bd`](https://github.com/graphql/graphiql/commit/695100bd317940ff3ffd8f56b54248c1dba1ac04) Thanks [@TheMightyPenguin](https://github.com/TheMightyPenguin)! - Remove side-effect in StorageAPI that overrides localStorage.clear\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- [#2965](https://github.com/graphql/graphiql/pull/2965) [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-optional-catch-binding` rule\n\n- [#2936](https://github.com/graphql/graphiql/pull/2936) [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `lonely-if`/`unicorn/lonely-if` rules\n\n- [#2938](https://github.com/graphql/graphiql/pull/2938) [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/throw-new-error` rule\n\n## 0.8.0\n\n### Minor Changes\n\n- [#2719](https://github.com/graphql/graphiql/pull/2719) [`e244b782`](https://github.com/graphql/graphiql/commit/e244b78291c2e2bb02d5753db82437926ebb4df4) Thanks [@andreialecu](https://github.com/andreialecu)! - Allow passing Headers for subscriptions into connection_init payload\n\n## 0.7.3\n\n### Patch Changes\n\n- [#2755](https://github.com/graphql/graphiql/pull/2755) [`674bf3f8`](https://github.com/graphql/graphiql/commit/674bf3f8ff321dfb8471b0f6e5419bb77ddc94af) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Only remove namespaced items when clearing `localStorage`\n\n## 0.7.2\n\n### Patch Changes\n\n- [#2753](https://github.com/graphql/graphiql/pull/2753) [`bfa90f24`](https://github.com/graphql/graphiql/commit/bfa90f249be4f68049c1bb81abfb524ae623313f) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Mark the `graphql-ws` peer dependency as optional (as it's only needed when the fetcher needs to support subscriptions)\n\n* [#2751](https://github.com/graphql/graphiql/pull/2751) [`8ab5fcd0`](https://github.com/graphql/graphiql/commit/8ab5fcd0a8399a0f8eb1b569751dd0e8390b9679) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Correctly handle `null` in type-guard functions for `Promise` and `Observable`\n\n## 0.7.1\n\n### Patch Changes\n\n- [#2737](https://github.com/graphql/graphiql/pull/2737) [`48872a87`](https://github.com/graphql/graphiql/commit/48872a87e6edec0c301102baaf669ffcce043a13) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Handle execution when there is no document AST (because the query editor is empty or the query string contains syntax errors)\n\n## 0.7.0\n\n### Minor Changes\n\n- [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - BREAKING: Don't pass `shouldPersistHeaders` anymore when invoking the fetcher function. This value can be looked up by consuming the `EditorContext`:\n\n  ```js\n  import { useEditorContext } from '@graphiql/react';\n\n  function MyComponent() {\n    const { shouldPersistHeaders } = useEditorContext();\n    // Do things...\n  }\n  ```\n\n* [#2694](https://github.com/graphql/graphiql/pull/2694) [`e59ec32e`](https://github.com/graphql/graphiql/commit/e59ec32e7ccdf3f7f68656533555c63620826279) Thanks [@acao](https://github.com/acao)! - Add a `clear` method to `Storage` classes\n\n## 0.6.1\n\n### Patch Changes\n\n- [#2535](https://github.com/graphql/graphiql/pull/2535) [`ea732ea8`](https://github.com/graphql/graphiql/commit/ea732ea8e12272c998f1467af8b3b88b6b508e12) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Fix error formatting for websocket requests and make error formatting more generic in general\n\n## 0.6.0\n\n### Minor Changes\n\n- [#2419](https://github.com/graphql/graphiql/pull/2419) [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the `fillLeafs` utility function from `graphiql` into `@graphiql/toolkit` and deprecate the export from `graphiql`\n\n* [#2419](https://github.com/graphql/graphiql/pull/2419) [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the `mergeAst` utility function from `graphiql` into `@graphiql/toolkit` and deprecate the export from `graphiql`\n\n- [#2419](https://github.com/graphql/graphiql/pull/2419) [`84d8985b`](https://github.com/graphql/graphiql/commit/84d8985b87701133cc41fd424a24bb61c9b7272e) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move the `getSelectedOperationName` utility function from `graphiql` into `@graphiql/toolkit` and deprecate the export from `graphiql`\n\n### Patch Changes\n\n- [#2413](https://github.com/graphql/graphiql/pull/2413) [`8be164b1`](https://github.com/graphql/graphiql/commit/8be164b1e158d00752d6d3f30630a797d07d08c9) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Allow creating noop StorageAPI instances by passing `null` to the constructor\n\n## 0.5.0\n\n### Minor Changes\n\n- [#2412](https://github.com/graphql/graphiql/pull/2412) [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move QueryStore from `graphiql` package to `@graphiql/toolkit`\n\n* [#2412](https://github.com/graphql/graphiql/pull/2412) [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move HistoryStore from `graphiql` package to `@graphiql/toolkit`\n\n- [#2412](https://github.com/graphql/graphiql/pull/2412) [`c2e2f53d`](https://github.com/graphql/graphiql/commit/c2e2f53d3b2ae369feb68537f92c73bcfd962f29) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - Move StorageAPI from `graphiql` package to `@graphiql/toolkit`\n\n### Patch Changes\n\n- [#2407](https://github.com/graphql/graphiql/pull/2407) [`bc3dc64c`](https://github.com/graphql/graphiql/commit/bc3dc64c37478ba6170c49c25fb755b4f2e020b2) Thanks [@benjdlambert](https://github.com/benjdlambert)! - Move `graphql-ws` dependency to a dynamic import, and add a nice error message when it's not installed\n\n## 0.4.5\n\n### Patch Changes\n\n- [#2401](https://github.com/graphql/graphiql/pull/2401) [`60a744b1`](https://github.com/graphql/graphiql/commit/60a744b1d73d1021afb7abeea1573f26178102b5) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - move async helper functions and formatting functions over into the @graphiql/toolkit package\n\n* [#2401](https://github.com/graphql/graphiql/pull/2401) [`60a744b1`](https://github.com/graphql/graphiql/commit/60a744b1d73d1021afb7abeea1573f26178102b5) Thanks [@thomasheyenbrock](https://github.com/thomasheyenbrock)! - deprecate the unused `shouldPersistHeaders` property from fetcher options to be removed in the next major version\n\n## 0.4.4\n\n### Patch Changes\n\n- [#2373](https://github.com/graphql/graphiql/pull/2373) [`5b2c1b20`](https://github.com/graphql/graphiql/commit/5b2c1b2054a70e8dca173f380f44766438cb5597) Thanks [@benjie](https://github.com/benjie)! - Fix TypeScript definition of FetcherParams to reflect that operationName is optional\n\n## 0.4.3\n\n### Patch Changes\n\n- [#2274](https://github.com/graphql/graphiql/pull/2274) [`12950380`](https://github.com/graphql/graphiql/commit/12950380e92c38f6eec23499e7fca5dc9dcd8216) Thanks [@B2o5T](https://github.com/B2o5T)! - turn `valid-typeof` as `error`, SSR fix\n\n## 0.4.2\n\n### Patch Changes\n\n- [`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf) [#2045](https://github.com/graphql/graphiql/pull/2045) Thanks [@acao](https://github.com/acao)! - fix graphql-js peer dependencies - [#2044](https://github.com/graphql/graphiql/pull/2044)\n\n## 0.4.1\n\n### Patch Changes\n\n- [`dec207e7`](https://github.com/graphql/graphiql/commit/dec207e74f0506db069482cc30f8cd1f045d8107) [#2017](https://github.com/graphql/graphiql/pull/2017) Thanks [@acao](https://github.com/acao)! - graphql-ws is now a peerDependency. It supports ~4.5.0 to the latest graphql-ws@5.5.5 and beyond. we suggest using the latest version!\n\n## 0.4.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n## 0.3.2\n\n### Patch Changes\n\n- [`86795d5f`](https://github.com/graphql/graphiql/commit/86795d5ffa2d3e6c8aee74f761d02f054b428d46) Thanks [@acao](https://github.com/acao)! - Remove bad type definition from `subscriptions-transport-ws` #1992 closes #1989\n\n## 0.3.1\n\n### Patch Changes\n\n- [`62e786b5`](https://github.com/graphql/graphiql/commit/62e786b57cc5748eccac59814dfc8ecd0104c748) [#1990](https://github.com/graphql/graphiql/pull/1990) Thanks [@acao](https://github.com/acao)! - Remove type definition from `subscriptions-transport-ws`\n\n## 0.3.0\n\n### Minor Changes\n\n- [`6a459f4c`](https://github.com/graphql/graphiql/commit/6a459f4c235bb0d70725ae6ad7fc1cfa34f49dca) [#1968](https://github.com/graphql/graphiql/pull/1968) Thanks [@acao](https://github.com/acao)! - Remove `optionalDependencies` entirely, remove `subscriptions-transport-ws` which introduces vulnerabilities, upgrade `@n1ru4l/push-pull-async-iterable-iterator` to 3.0.0, upgrade `graphql-ws` several minor versions - the `graphql-ws@5.x` upgrade will come in a later minor release.\n\n## 0.2.2\n\n### Patch Changes\n\n- [`5b8a057d`](https://github.com/graphql/graphiql/commit/5b8a057dd64ebecc391be32176a2403bb9d9ff92) [#1838](https://github.com/graphql/graphiql/pull/1838) Thanks [@acao](https://github.com/acao)! - Set all cross-runtime build targets to es6\n\n## 0.2.1\n\n### Patch Changes\n\n- [`3f002710`](https://github.com/graphql/graphiql/commit/3f00271089cbc519e221976c9308f60b317cae80) [#1840](https://github.com/graphql/graphiql/pull/1840) Thanks [@enisdenjo](https://github.com/enisdenjo)! - Use provided `wsConnectionParams`\n\n* [`94f16957`](https://github.com/graphql/graphiql/commit/94f169572f643374ead829af690b6dcc2eb0b6a1) [#1841](https://github.com/graphql/graphiql/pull/1841) Thanks [@enisdenjo](https://github.com/enisdenjo)! - Subscriptions async iterator completes and better error handling\n\n## 0.2.0\n\n### Minor Changes\n\n- [`dd9397e4`](https://github.com/graphql/graphiql/commit/dd9397e4c693b5ceadbd26d6fa92aa6246aac9c3) [#1819](https://github.com/graphql/graphiql/pull/1819) Thanks [@acao](https://github.com/acao)! - `GraphiQL.createClient()` accepts custom `legacyClient`, exports typescript types, fixes #1800.\n\n  `createGraphiQLFetcher` now only attempts an `graphql-ws` connection when only `subscriptionUrl` is provided. In order to use `graphql-transport-ws`, you'll need to provide the `legacyClient` option only, and no `subscriptionUrl` or `wsClient` option.\n\n### Patch Changes\n\n- [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n## 0.1.1\n\n### Patch Changes\n\n- [`d3278556`](https://github.com/graphql/graphiql/commit/d3278556d050d948930c4b35a73039255f9a92b7) Thanks [@harshithpabbati](https://github.com/harshithpabbati)! - Move `@graphiql/create-fetcher` to `@graphiql/toolkit` because it doesn't need to be it's own package as @imolorhe pointed out\n\n## 0.1.0\n\n### Minor Changes\n\n- 1c119386: `@defer`, `@stream`, and `graphql-ws` support in a `createGraphiQLFetcher` utility (#1770)\n\n  - support for `@defer` and `@stream` in `GraphiQL` itself on fetcher execution and when handling stream payloads\n  - introduce `@graphiql/toolkit` for types and utilities used to compose `GraphiQL` and other related libraries\n  - introduce `@graphiql/create-fetcher` to accept simplified parameters to generate a `fetcher` that covers the most commonly used `graphql-over-http` transport spec proposals. using `meros` for multipart http, and `graphql-ws` for websockets subscriptions.\n  - use `graphql` and `graphql-express` `experimental-defer-stream` branch in development until it's merged\n  - add cypress e2e tests for `@stream` in different scenarios\n  - add some unit tests for `createGraphiQLFetcher`\n"
  },
  {
    "path": "packages/graphiql-toolkit/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/graphiql-toolkit/README.md",
    "content": "[Changelog](https://github.com/graphql/graphiql/blob/main/packages/graphql-toolkit/CHANGELOG.md)\n|\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphiql_toolkit.html)\n| [NPM](https://www.npmjs.com/package/@graphiql/toolkit) |\n[Discord](https://discord.gg/NP5vbPeUFp)\n\n# `@graphiql/toolkit`\n\nThis is a general purpose library for building GraphQL IDEs. It's being used by\nother packages like `graphiql` and `@graphiql/react` and also provides utilities\nthat are useful when working with these packages.\n\n## Docs\n\n- **[`createFetcher`](./docs/create-fetcher.md)** : a utility for creating a\n  `fetcher` prop implementation for HTTP GET, POST including multipart,\n  websockets fetcher\n- more to come!\n"
  },
  {
    "path": "packages/graphiql-toolkit/docs/create-fetcher.md",
    "content": "# `createGraphiQLFetcher`\n\nA utility for generating a full-featured `fetcher` for GraphiQL including\n`@stream`, `@defer` `IncrementalDelivery`and `multipart` and subscriptions using\n`graphql-ws` or the legacy websockets protocol.\n\nUnder the hood, it uses [`graphql-ws`](https://www.npmjs.com/package/graphql-ws)\nclient and [`meros`](https://www.npmjs.com/package/meros) which act as client\nreference implementations of the\n[GraphQL over HTTP Working Group Spec](https://github.com/graphql/graphql-over-http)\nspecification, and the most popular transport spec proposals.\n\n## Setup\n\nYou can install `@graphiql/toolkit` using your favorite package manager:\n\n```bash\nnpm install @graphiql/toolkit\n```\n\n## Getting Started\n\nWe have a few flexible options to get you started with the client. It's meant to\ncover the majority of common use cases with a simple encapsulation.\n\n### Default HTTP/Multipart IncrementalDelivery Usage\n\nHere's a simple example. In this case, a websocket client isn't even\ninitialized, only http (with multipart `@stream` and `@defer` Incremental\nDelivery support of course!).\n\n```jsx\nimport * as React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { GraphiQL } from 'graphiql';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst url = 'https://my-schema.com/graphql';\n\nconst fetcher = createGraphiQLFetcher({ url });\n\nexport const App = () => <GraphiQL fetcher={fetcher} />;\n\nconst root = createRoot(document.getElementById('graphiql'));\nroot.render(<App />);\n```\n\n### Adding `graphql-ws` websockets subscriptions\n\nFirst you'll need to install `graphql-ws` as a peer dependency:\n\n```bash\nnpm install graphql-ws\n```\n\nJust by providing the `subscriptionUrl`, you can also generate a `graphql-ws`\nclient. This client now supports both HTTP/Multipart Incremental Delivery for\n`@defer` and `@stream`, _and_ websockets subscriptions.\n\n```jsx\nimport * as React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { GraphiQL } from 'graphiql';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst url = 'https://my-schema.com/graphql';\n\nconst subscriptionUrl = 'wss://my-schema.com/graphql';\n\nconst fetcher = createGraphiQLFetcher({ url, subscriptionUrl });\n\nexport const App = () => <GraphiQL fetcher={fetcher} />;\n\nconst root = createRoot(document.getElementById('graphiql'));\nroot.render(<App />);\n```\n\nYou can further customize the `graphql-ws` implementation by creating a custom\nclient instance and providing it as the `wsClient` parameter.\n\n## Options\n\n### `url` (_required_)\n\nThis is url used for all `HTTP` requests, and for schema introspection.\n\n### `subscriptionUrl`\n\nThis generates a `graphql-ws` client using the provided url. Note that a server\nmust be compatible with the new `graphql-ws` subscriptions spec for this to\nwork.\n\n### `wsClient`\n\nProvide your own subscriptions client. Using this option bypasses\n`subscriptionUrl`. In theory, this could be any client using any transport, as\nlong as it matches `graphql-ws` `Client` signature.\n\n## `wsConnectionParams`\n\nProvide your initial connection params.\n\n```jsx\nconst fetcher = createGraphiQLFetcher({\n  url: 'https://localhost:3000',\n  subscriptionUrl: 'https://localhost:3001',\n  wsConnectionParams: { Authorization: 'token 1234' },\n});\n\nconst App = () => {\n  return <GraphiQL fetcher={fetcher} />;\n};\n```\n\n### `legacyWsClient` or `legacyClient`\n\nProvide a legacy subscriptions client using `subscriptions-transport-ws`\nprotocol. Using this option bypasses `subscriptionUrl`. In theory, this could be\nany client using any transport, as long as it matches\n`subscriptions-transport-ws` `Client` signature.\n\n### `headers`\n\nSpecify headers that will be passed to all requests.\n\n### `fetch`\n\nPass a custom fetch implementation such as `isomorphic-fetch`.\n\n## Customization Examples\n\n### Custom `wsClient` Example using `graphql-ws`\n\nThis example passes a `graphql-ws` client to the `wsClient` option:\n\n```jsx\nimport * as React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { GraphiQL } from 'graphiql';\nimport { createClient } from 'graphql-ws';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst url = 'https://my-schema.com/graphql';\n\nconst subscriptionUrl = 'wss://my-schema.com/graphql';\n\nconst fetcher = createGraphiQLFetcher({\n  url,\n  wsClient: createClient({\n    url: subscriptionUrl,\n    keepAlive: 2000,\n  }),\n});\n\nexport const App = () => <GraphiQL fetcher={fetcher} />;\n\nconst root = createRoot(document.getElementById('graphiql'));\nroot.render(<App />);\n```\n\n### Custom `legacyClient` Example\n\n(not recommended)\n\nBy providing the `legacyClient` you can support a `subscriptions-transport-ws`\nclient implementation, or equivalent:\n\n```jsx\nimport * as React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { GraphiQL } from 'graphiql';\nimport { SubscriptionClient } from 'subscriptions-transport-ws';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst url = 'https://my-schema.com/graphql';\n\nconst subscriptionUrl = 'wss://my-schema.com/graphql';\n\nconst fetcher = createGraphiQLFetcher({\n  url,\n  legacyWsClient: new SubscriptionClient(subscriptionUrl),\n});\n\nexport const App = () => <GraphiQL fetcher={fetcher} />;\n\nconst root = createRoot(document.getElementById('graphiql'));\nroot.render(<App />);\n```\n\nNote that you will need to install the client separately:\n\n```bash\nnpm install subscriptions-transport-ws\n```\n\n### Custom `fetcher` Example\n\nFor SSR, we might want to use something like `isomorphic-fetch`:\n\n```jsx\nimport * as React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { GraphiQL } from 'graphiql';\nimport { fetch } from 'isomorphic-fetch';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\n\nconst url = 'https://my-schema.com/graphql';\n\nconst fetcher = createGraphiQLFetcher({ url, fetch });\n\nexport const App = () => <GraphiQL fetcher={fetcher} />;\n\nconst root = createRoot(document.getElementById('graphiql'));\nroot.render(<App />);\n```\n\n## Credits\n\nThis is originally inspired by `graphql-subscriptions-fetcher` created by @Urigo\n"
  },
  {
    "path": "packages/graphiql-toolkit/package.json",
    "content": "{\n  \"name\": \"@graphiql/toolkit\",\n  \"version\": \"0.11.3\",\n  \"description\": \"Utility to build a fetcher for GraphiQL\",\n  \"contributors\": [\n    \"Rikki Schulte <rikki.schulte@gmail.com> (https://rikki.dev)\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphiql-toolkit\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/master/packages/graphiql-toolkit#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:@graphiql/toolkit\"\n  },\n  \"license\": \"MIT\",\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"typings\": \"dist/esm/index.d.mts\",\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"build\": \"tsup\",\n    \"dev\": \"tsup --watch\",\n    \"test\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@n1ru4l/push-pull-async-iterable-iterator\": \"^3.1.0\",\n    \"meros\": \"^1.1.4\"\n  },\n  \"devDependencies\": {\n    \"graphql\": \"^16.9.0\",\n    \"graphql-ws\": \"^5.5.5\",\n    \"isomorphic-fetch\": \"^3.0.0\",\n    \"subscriptions-transport-ws\": \"0.11.0\",\n    \"tsup\": \"^8.2.4\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\",\n    \"graphql-ws\": \">= 4.5.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"graphql-ws\": {\n      \"optional\": true\n    }\n  },\n  \"keywords\": [\n    \"graphql\",\n    \"graphiql\"\n  ]\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/async-helpers/index.ts",
    "content": "import {\n  FetcherResult,\n  FetcherReturnType,\n  Observable,\n} from '../create-fetcher';\n\n// Duck-type promise detection.\nexport function isPromise<T>(value: Promise<T> | any): value is Promise<T> {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof value.then === 'function'\n  );\n}\n\n// Duck-type Observable.take(1).toPromise()\nfunction observableToPromise<T>(observable: Observable<T>): Promise<T> {\n  return new Promise((resolve, reject) => {\n    const subscription = observable.subscribe({\n      next(v) {\n        resolve(v);\n        subscription.unsubscribe();\n      },\n      error: reject,\n      complete() {\n        reject(new Error('no value resolved'));\n      },\n    });\n  });\n}\n\n// Duck-type observable detection.\nexport function isObservable<T>(value: any): value is Observable<T> {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'subscribe' in value &&\n    typeof value.subscribe === 'function'\n  );\n}\n\nexport function isAsyncIterable(\n  input: unknown,\n): input is AsyncIterable<unknown> {\n  return (\n    typeof input === 'object' &&\n    input !== null &&\n    // Some browsers still don't have Symbol.asyncIterator implemented (iOS Safari)\n    // That means every custom AsyncIterable must be built using a AsyncGeneratorFunction (async function * () {})\n    ((input as any)[Symbol.toStringTag] === 'AsyncGenerator' ||\n      Symbol.asyncIterator in input)\n  );\n}\n\nasync function asyncIterableToPromise<T>(\n  input: AsyncIterable<T> | AsyncIterableIterator<T>,\n): Promise<T> {\n  // Also support AsyncGenerator on Safari iOS.\n  // As mentioned in the isAsyncIterable function, there is no Symbol.asyncIterator available,\n  // so every AsyncIterable must be implemented using AsyncGenerator.\n  const iteratorReturn = (\n    'return' in input ? input : input[Symbol.asyncIterator]()\n  ).return?.bind(input);\n  const iteratorNext = (\n    'next' in input ? input : input[Symbol.asyncIterator]()\n  ).next.bind(input);\n\n  const result = await iteratorNext();\n  // ensure cleanup\n  // eslint-disable-next-line sonarjs/void-use -- conflicts with @typescript-eslint/no-floating-promises\n  void iteratorReturn?.();\n  return result.value;\n}\n\nexport async function fetcherReturnToPromise(\n  fetcherResult: FetcherReturnType,\n): Promise<FetcherResult> {\n  const result = await fetcherResult;\n  if (isAsyncIterable(result)) {\n    return asyncIterableToPromise(result);\n  }\n  if (isObservable(result)) {\n    return observableToPromise(result);\n  }\n  return result;\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/create-fetcher/__tests__/buildFetcher.spec.ts",
    "content": "import { Mock } from 'vitest';\nimport { parse, getIntrospectionQuery } from 'graphql';\nimport { createGraphiQLFetcher } from '../createFetcher';\n\nimport 'isomorphic-fetch';\n\nvi.mock('../lib');\n\nvi.mock('graphql-ws');\n\nvi.mock('subscriptions-transport-ws');\n\nimport {\n  createWebsocketsFetcherFromUrl as _createWebsocketsFetcherFromUrl,\n  createMultipartFetcher as _createMultipartFetcher,\n  createSimpleFetcher as _createSimpleFetcher,\n  createWebsocketsFetcherFromClient as _createWebsocketsFetcherFromClient,\n  createLegacyWebsocketsFetcher as _createLegacyWebsocketsFetcher,\n} from '../lib';\nimport { createClient as _createClient } from 'graphql-ws';\nimport { SubscriptionClient } from 'subscriptions-transport-ws';\n\nconst serverURL = 'http://localhost:3000/graphql';\nconst wssURL = 'ws://localhost:3000/graphql';\n\nconst exampleIntrospectionDocument = parse(getIntrospectionQuery());\n\nconst createWebsocketsFetcherFromUrl = _createWebsocketsFetcherFromUrl as Mock<\n  typeof _createWebsocketsFetcherFromUrl\n>;\nconst createMultipartFetcher = _createMultipartFetcher as Mock<\n  typeof _createMultipartFetcher\n>;\nconst createSimpleFetcher = _createSimpleFetcher as Mock<\n  typeof _createSimpleFetcher\n>;\nconst createClient = _createClient as Mock<typeof _createClient>;\nconst createWebsocketsFetcherFromClient =\n  _createWebsocketsFetcherFromClient as Mock<\n    typeof _createWebsocketsFetcherFromClient\n  >;\nconst createLegacyWebsocketsFetcher = _createLegacyWebsocketsFetcher as Mock<\n  typeof _createLegacyWebsocketsFetcher\n>;\n\ndescribe('createGraphiQLFetcher', () => {\n  afterEach(() => {\n    vi.resetAllMocks();\n  });\n  it('returns fetcher without websocket client by default', () => {\n    // @ts-expect-error\n    createWebsocketsFetcherFromUrl.mockReturnValue(true);\n    createGraphiQLFetcher({ url: serverURL });\n    expect(createWebsocketsFetcherFromUrl.mock.calls).toEqual([]);\n    expect(createMultipartFetcher.mock.calls).toEqual([\n      [{ enableIncrementalDelivery: true, url: serverURL }, fetch],\n    ]);\n  });\n\n  it('returns simple fetcher for introspection', async () => {\n    // @ts-expect-error\n    createSimpleFetcher.mockReturnValue(async () => 'hey!');\n    const fetcher = createGraphiQLFetcher({ url: serverURL });\n    expect(createWebsocketsFetcherFromUrl.mock.calls).toEqual([]);\n    expect(createMultipartFetcher.mock.calls).toEqual([\n      [{ enableIncrementalDelivery: true, url: serverURL }, fetch],\n    ]);\n    expect(createSimpleFetcher.mock.calls).toEqual([\n      [{ enableIncrementalDelivery: true, url: serverURL }, fetch],\n    ]);\n    const res = await fetcher(\n      { query: getIntrospectionQuery(), operationName: 'IntrospectionQuery' },\n      { documentAST: exampleIntrospectionDocument },\n    );\n    expect(res).toEqual('hey!');\n  });\n  it('returns fetcher without websocket client or multipart', () => {\n    // @ts-expect-error\n    createWebsocketsFetcherFromUrl.mockReturnValue(true);\n    createGraphiQLFetcher({ url: serverURL, enableIncrementalDelivery: false });\n    expect(createWebsocketsFetcherFromUrl.mock.calls).toEqual([]);\n    expect(createMultipartFetcher.mock.calls).toEqual([]);\n    expect(createSimpleFetcher.mock.calls).toEqual([\n      [{ enableIncrementalDelivery: false, url: serverURL }, fetch],\n    ]);\n  });\n  it('returns fetcher with websocket client', () => {\n    // @ts-expect-error\n    createWebsocketsFetcherFromUrl.mockReturnValue('Client1');\n\n    const args = {\n      url: serverURL,\n      subscriptionUrl: wssURL,\n      enableIncrementalDelivery: true,\n    };\n\n    createGraphiQLFetcher(args);\n\n    expect(createMultipartFetcher.mock.calls).toEqual([[args, fetch]]);\n  });\n\n  it('returns fetcher with custom wsClient', () => {\n    // @ts-expect-error\n    createClient.mockReturnValue('WSClient');\n    // @ts-expect-error\n    createWebsocketsFetcherFromUrl.mockReturnValue('CustomWSSFetcher');\n\n    const wsClient = createClient({ url: wssURL });\n    const args = {\n      url: serverURL,\n      wsClient,\n      enableIncrementalDelivery: true,\n    };\n\n    createGraphiQLFetcher(args);\n\n    expect(createMultipartFetcher.mock.calls).toEqual([[args, fetch]]);\n    expect(createWebsocketsFetcherFromUrl.mock.calls).toEqual([]);\n  });\n\n  it('returns fetcher with custom legacyClient', () => {\n    // @ts-expect-error\n    createClient.mockReturnValue('WSClient');\n    // @ts-expect-error\n    createLegacyWebsocketsFetcher.mockReturnValue('CustomWSSFetcher');\n\n    const legacyClient = new SubscriptionClient(wssURL);\n    const args = {\n      url: serverURL,\n      legacyClient,\n      enableIncrementalDelivery: true,\n    };\n\n    createGraphiQLFetcher(args);\n\n    expect(createMultipartFetcher.mock.calls).toEqual([[args, fetch]]);\n    expect(createWebsocketsFetcherFromUrl.mock.calls).toEqual([]);\n    expect(createWebsocketsFetcherFromClient.mock.calls).toEqual([]);\n    expect(createLegacyWebsocketsFetcher.mock.calls).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/create-fetcher/__tests__/lib.spec.ts",
    "content": "import { Mock } from 'vitest';\nimport { parse } from 'graphql';\nimport {\n  isSubscriptionWithName,\n  createWebsocketsFetcherFromUrl,\n  getWsFetcher,\n} from '../lib';\n\nimport 'isomorphic-fetch';\n\nvi.mock('graphql-ws');\n\nvi.mock('subscriptions-transport-ws');\n\nimport { createClient as _createClient } from 'graphql-ws';\n\nimport { SubscriptionClient as _SubscriptionClient } from 'subscriptions-transport-ws';\n\nconst createClient = _createClient as Mock<typeof _createClient>;\nconst SubscriptionClient = _SubscriptionClient as Mock;\n\nconst exampleWithSubscription = parse(/* GraphQL */ `\n  subscription Example {\n    example\n  }\n  query SomethingElse {\n    example\n  }\n`);\n\ndescribe('isSubscriptionWithName', () => {\n  it('detects when the subscription is present', () => {\n    expect(\n      isSubscriptionWithName(exampleWithSubscription, 'Example'),\n    ).toBeTruthy();\n  });\n  it('detects when the specified operation is not a subscription', () => {\n    expect(\n      isSubscriptionWithName(exampleWithSubscription, 'SomethingElse'),\n    ).toBeFalsy();\n  });\n  it('detects when the operation is not present', () => {\n    expect(\n      isSubscriptionWithName(exampleWithSubscription, 'NotPresent'),\n    ).toBeFalsy();\n  });\n});\n\ndescribe('createWebsocketsFetcherFromUrl', () => {\n  afterEach(() => {\n    vi.resetAllMocks();\n  });\n\n  it('creates a websockets client using provided url', async () => {\n    // @ts-expect-error\n    createClient.mockReturnValue(true);\n    await createWebsocketsFetcherFromUrl('wss://example.com');\n    expect(createClient.mock.calls[0][0]).toEqual({ url: 'wss://example.com' });\n  });\n\n  it('creates a websockets client using provided url that fails', async () => {\n    // @ts-expect-error\n    createClient.mockReturnValue(false);\n    expect(await createWebsocketsFetcherFromUrl('wss://example.com')).toThrow();\n    expect(createClient.mock.calls[0][0]).toEqual({ url: 'wss://example.com' });\n  });\n});\n\ndescribe('getWsFetcher', () => {\n  afterEach(() => {\n    vi.resetAllMocks();\n  });\n  it('provides an observable wsClient when custom wsClient option is provided', async () => {\n    // @ts-expect-error\n    createClient.mockReturnValue(true);\n    // @ts-expect-error\n    await getWsFetcher({ url: '', wsClient: true });\n    expect(createClient.mock.calls).toHaveLength(0);\n  });\n  it('creates a subscriptions-transports-ws observable when custom legacyClient option is provided', async () => {\n    // @ts-expect-error\n    createClient.mockReturnValue(true);\n    await getWsFetcher({ url: '', legacyClient: true });\n    expect(createClient.mock.calls).toHaveLength(0);\n    expect(SubscriptionClient.mock.calls).toHaveLength(0);\n  });\n\n  it('if subscriptionsUrl is provided, create a client on the fly', async () => {\n    // @ts-expect-error\n    createClient.mockReturnValue(true);\n    await getWsFetcher({ url: '', subscriptionUrl: 'wss://example' });\n    expect(createClient.mock.calls[0]).toEqual([\n      { connectionParams: {}, url: 'wss://example' },\n    ]);\n    expect(SubscriptionClient.mock.calls).toHaveLength(0);\n  });\n});\n\ndescribe('missing `graphql-ws` dependency', () => {\n  it('should throw a nice error', async () => {\n    vi.resetModules();\n    vi.doMock('graphql-ws', () => {\n      // While throwing an error directly inside this callback `code` is attached in `cause`\n      // property e.g. `Error.cause.code`, so I throw an error on calling `createClient` instead\n\n      return {\n        createClient: vi.fn().mockImplementation(() => {\n          // eslint-disable-next-line no-throw-literal\n          throw { code: 'MODULE_NOT_FOUND' };\n        }),\n      };\n    });\n\n    await expect(\n      createWebsocketsFetcherFromUrl('wss://example.com'),\n    ).rejects.toThrow(\n      /You need to install the 'graphql-ws' package to use websockets when passing a 'subscriptionUrl'/,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/create-fetcher/createFetcher.ts",
    "content": "import type { Fetcher, CreateFetcherOptions } from './types';\n\nimport {\n  createMultipartFetcher,\n  createSimpleFetcher,\n  isSubscriptionWithName,\n  getWsFetcher,\n} from './lib';\n\n/**\n * build a GraphiQL fetcher that is:\n * - backwards compatible\n * - optionally supports graphql-ws or `\n */\nexport function createGraphiQLFetcher(options: CreateFetcherOptions): Fetcher {\n  const httpFetch =\n    options.fetch || (typeof window !== 'undefined' && window.fetch);\n  if (!httpFetch) {\n    throw new Error('No valid fetcher implementation available');\n  }\n  options.enableIncrementalDelivery =\n    options.enableIncrementalDelivery !== false;\n  // simpler fetcher for schema requests\n  const simpleFetcher = createSimpleFetcher(options, httpFetch);\n\n  const httpFetcher = options.enableIncrementalDelivery\n    ? createMultipartFetcher(options, httpFetch)\n    : simpleFetcher;\n\n  return async (graphQLParams, fetcherOpts) => {\n    if (graphQLParams.operationName === 'IntrospectionQuery') {\n      return (options.schemaFetcher || simpleFetcher)(\n        graphQLParams,\n        fetcherOpts,\n      );\n    }\n    const isSubscription = fetcherOpts?.documentAST\n      ? isSubscriptionWithName(\n          fetcherOpts.documentAST,\n          graphQLParams.operationName || undefined,\n        )\n      : false;\n    if (isSubscription) {\n      const wsFetcher = await getWsFetcher(options, fetcherOpts);\n\n      if (!wsFetcher) {\n        throw new Error(\n          `Your GraphiQL createFetcher is not properly configured for websocket subscriptions yet. ${\n            options.subscriptionUrl\n              ? `Provided URL ${options.subscriptionUrl} failed`\n              : 'Please provide subscriptionUrl, wsClient or legacyClient option first.'\n          }`,\n        );\n      }\n      return wsFetcher(graphQLParams);\n    }\n    return httpFetcher(graphQLParams, fetcherOpts);\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/create-fetcher/index.ts",
    "content": "export * from './types';\nexport { createGraphiQLFetcher } from './createFetcher';\n\n// TODO: move the most useful utilities from graphiql to here\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/create-fetcher/lib.ts",
    "content": "import { DocumentNode, visit } from 'graphql';\nimport { meros } from 'meros';\nimport type {\n  Client,\n  ClientOptions,\n  ExecutionResult,\n  createClient as createClientType,\n} from 'graphql-ws';\n\nimport {\n  isAsyncIterable,\n  makeAsyncIterableIteratorFromSink,\n} from '@n1ru4l/push-pull-async-iterable-iterator';\n\nimport type {\n  Fetcher,\n  FetcherParams,\n  FetcherOpts,\n  ExecutionResultPayload,\n  CreateFetcherOptions,\n} from './types';\n\nconst errorHasCode = (err: unknown): err is { code: string } => {\n  return typeof err === 'object' && err !== null && 'code' in err;\n};\n\n/**\n * Returns true if the name matches a subscription in the AST\n *\n * @param document {DocumentNode}\n * @param name the operation name to lookup\n * @returns {boolean}\n */\nexport const isSubscriptionWithName = (\n  document: DocumentNode,\n  name?: string,\n): boolean => {\n  let isSubscription = false;\n  visit(document, {\n    OperationDefinition(node) {\n      if (name === node.name?.value && node.operation === 'subscription') {\n        isSubscription = true;\n      }\n    },\n  });\n  return isSubscription;\n};\n\n/**\n * create a simple HTTP/S fetcher using a fetch implementation where\n * multipart is not needed\n *\n * @param options {CreateFetcherOptions}\n * @param httpFetch {typeof fetch}\n * @returns {Fetcher}\n */\nexport const createSimpleFetcher =\n  (options: CreateFetcherOptions, httpFetch: typeof fetch): Fetcher =>\n  async (graphQLParams: FetcherParams, fetcherOpts?: FetcherOpts) => {\n    const data = await httpFetch(options.url, {\n      method: 'POST',\n      body: JSON.stringify(graphQLParams),\n      headers: {\n        'content-type': 'application/json',\n        ...options.headers,\n        ...fetcherOpts?.headers,\n      },\n    });\n    return data.json();\n  };\n\nexport async function createWebsocketsFetcherFromUrl(\n  url: string,\n  connectionParams?: ClientOptions['connectionParams'],\n): Promise<Fetcher | void> {\n  let wsClient;\n  try {\n    const { createClient } =\n      process.env.USE_IMPORT === 'false'\n        ? (require('graphql-ws') as { createClient: typeof createClientType })\n        : await import('graphql-ws');\n\n    // TODO: defaults?\n    wsClient = createClient({ url, connectionParams });\n    return createWebsocketsFetcherFromClient(wsClient);\n  } catch (err) {\n    if (errorHasCode(err) && err.code === 'MODULE_NOT_FOUND') {\n      throw new Error(\n        \"You need to install the 'graphql-ws' package to use websockets when passing a 'subscriptionUrl'\",\n      );\n    }\n    // eslint-disable-next-line no-console\n    console.error(`Error creating websocket client for ${url}`, err);\n  }\n}\n\n/**\n * Create ws/s fetcher using provided wsClient implementation\n */\nexport const createWebsocketsFetcherFromClient =\n  (wsClient: Client): Fetcher =>\n  (graphQLParams: FetcherParams) =>\n    makeAsyncIterableIteratorFromSink<ExecutionResult>(sink =>\n      wsClient.subscribe(graphQLParams, {\n        ...sink,\n        error(err) {\n          if (err instanceof CloseEvent) {\n            sink.error(\n              new Error(\n                `Socket closed with event ${err.code} ${\n                  err.reason || ''\n                }`.trim(),\n              ),\n            );\n          } else {\n            sink.error(err);\n          }\n        },\n      }),\n    );\n\n/**\n * Allow legacy websockets protocol client, but no definitions for it,\n * as the library is deprecated and has security issues\n */\nexport const createLegacyWebsocketsFetcher =\n  (legacyWsClient: { request: (params: FetcherParams) => unknown }): Fetcher =>\n  (graphQLParams: FetcherParams) => {\n    const observable = legacyWsClient.request(graphQLParams);\n    return makeAsyncIterableIteratorFromSink<ExecutionResult>(\n      // @ts-ignore\n      sink => observable.subscribe(sink).unsubscribe,\n    );\n  };\n/**\n * Create a fetcher with the `IncrementalDelivery` HTTP/S spec for\n * `@stream` and `@defer` support using `fetch-multipart-graphql`\n */\nexport const createMultipartFetcher = (\n  options: CreateFetcherOptions,\n  httpFetch: typeof fetch,\n): Fetcher =>\n  async function* (graphQLParams: FetcherParams, fetcherOpts?: FetcherOpts) {\n    const response = await httpFetch(options.url, {\n      method: 'POST',\n      body: JSON.stringify(graphQLParams),\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json, multipart/mixed',\n        ...options.headers,\n        // allow user-defined headers to override\n        // the static provided headers\n        ...fetcherOpts?.headers,\n      },\n    }).then(r =>\n      meros<Extract<ExecutionResultPayload, { hasNext: boolean }>>(r, {\n        multiple: true,\n      }),\n    );\n\n    // Follows the same as createSimpleFetcher above, in that we simply return it as json.\n    if (!isAsyncIterable(response)) {\n      return yield response.json();\n    }\n\n    for await (const chunk of response) {\n      if (chunk.some(part => !part.json)) {\n        const message = chunk.map(\n          part => `Headers::\\n${part.headers}\\n\\nBody::\\n${part.body}`,\n        );\n        throw new Error(\n          `Expected multipart chunks to be of json type. got:\\n${message}`,\n        );\n      }\n      yield chunk.map(part => part.body);\n    }\n  };\n\n/**\n * If `wsClient` or `legacyClient` are provided, then `subscriptionUrl` is overridden.\n */\nexport async function getWsFetcher(\n  options: CreateFetcherOptions,\n  fetcherOpts?: FetcherOpts,\n): Promise<Fetcher | void> {\n  if (options.wsClient) {\n    return createWebsocketsFetcherFromClient(options.wsClient);\n  }\n  if (options.subscriptionUrl) {\n    return createWebsocketsFetcherFromUrl(options.subscriptionUrl, {\n      ...options.wsConnectionParams,\n      ...fetcherOpts?.headers,\n    });\n  }\n  const legacyWebsocketsClient = options.legacyClient || options.legacyWsClient;\n  if (legacyWebsocketsClient) {\n    return createLegacyWebsocketsFetcher(legacyWebsocketsClient);\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/create-fetcher/types.ts",
    "content": "import type { DocumentNode, IntrospectionQuery } from 'graphql';\nimport type { Client, ClientOptions, ExecutionResult } from 'graphql-ws';\n\nexport type Observable<T> = {\n  subscribe(opts: {\n    next: (value: T) => void;\n    error: (error: any) => void;\n    complete: () => void;\n  }): Unsubscribable;\n  subscribe(\n    next: (value: T) => void,\n    error: null | undefined,\n    complete: () => void,\n  ): Unsubscribable;\n  subscribe(\n    next?: (value: T) => void,\n    error?: (error: any) => void,\n    complete?: () => void,\n  ): Unsubscribable;\n};\n\n// This type just taken from https://github.com/ReactiveX/rxjs/blob/master/src/internal/types.ts#L41\nexport type Unsubscribable = {\n  unsubscribe: () => void;\n};\n\nexport type FetcherParams = {\n  query: string;\n  operationName?: string | null;\n  variables?: any;\n};\n\nexport type FetcherOpts = {\n  headers?: { [key: string]: any };\n  documentAST?: DocumentNode;\n};\n\nexport type ExecutionResultPayload =\n  | {\n      data: IntrospectionQuery;\n      errors?: Array<any>;\n    }\n  // normal result payloads\n  | { data?: any; errors?: Array<any> }\n  // for the initial Stream/Defer payload\n  | { data?: any; errors?: Array<any>; hasNext: boolean }\n  // for successive Stream/Defer payloads\n  | {\n      data?: any;\n      errors?: any[];\n      path: (string | number)[];\n      hasNext: boolean;\n    };\n\nexport type FetcherResultPayload = ExecutionResultPayload;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type FetcherResult = ExecutionResult | { data: IntrospectionQuery };\n\nexport type SyncExecutionResult =\n  | ExecutionResult\n  | Observable<ExecutionResult>\n  | AsyncIterable<ExecutionResult>;\n\nexport type SyncFetcherResult = SyncExecutionResult;\n\nexport type FetcherReturnType = MaybePromise<SyncExecutionResult>;\n\nexport type Fetcher = (\n  graphQLParams: FetcherParams,\n  opts?: FetcherOpts,\n) => FetcherReturnType;\n\n/**\n * Options for creating a simple, spec-compliant GraphiQL fetcher\n */\nexport interface CreateFetcherOptions {\n  /**\n   * url for HTTP(S) requests. required!\n   */\n  url: string;\n  /**\n   * url for websocket subscription requests\n   */\n  subscriptionUrl?: string;\n  /**\n   * `wsClient` implementation that matches `ws-graphql` signature,\n   * whether via `createClient()` itself or another client.\n   */\n  wsClient?: Client;\n  /**\n   * `legacyWsClient` implementation that matches `subscriptions-transport-ws` signature,\n   * whether via `new SubscriptionsClient()` itself or another client with a similar signature.\n   */\n  legacyWsClient?: any;\n  /**\n   * alias for `legacyWsClient`\n   */\n  legacyClient?: any;\n  /**\n   * Request headers you can provide statically.\n   *\n   * If you enable the request headers editor and the user provides\n   * A header you set statically here, it will be overridden by their value.\n   */\n  headers?: Record<string, string>;\n  /**\n   * Websockets connection params used when you provide subscriptionUrl. graphql-ws `ClientOptions.connectionParams`\n   */\n  wsConnectionParams?: ClientOptions['connectionParams'];\n  /**\n   * You can disable the usage of the `fetch-multipart-graphql` library\n   * entirely, defaulting to a simple fetch POST implementation.\n   */\n  enableIncrementalDelivery?: boolean;\n  /**\n   * The fetch implementation, in case the user needs to override this for SSR\n   * or other purposes. this does not override the `fetch-multipart-graphql`\n   * default fetch behavior yet.\n   */\n  fetch?: typeof fetch;\n  /**\n   * An optional custom fetcher specifically for your schema. For most cases\n   * the `url` and `headers` property should have you covered.\n   */\n  schemaFetcher?: Fetcher;\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/format/index.ts",
    "content": "function stringify(obj: unknown): string {\n  return JSON.stringify(obj, null, 2);\n}\n\nfunction formatSingleError(error: Error): Error {\n  return {\n    ...error,\n    // Raise these details even if they're non-enumerable\n    message: error.message,\n    stack: error.stack,\n  };\n}\n\nfunction handleSingleError(error: unknown) {\n  if (error instanceof Error) {\n    return formatSingleError(error);\n  }\n  return error;\n}\n\nexport function formatError(error: unknown): string {\n  if (Array.isArray(error)) {\n    return stringify({\n      errors: error.map(e => handleSingleError(e)),\n    });\n  }\n  return stringify({ errors: [handleSingleError(error)] });\n}\n\nexport function formatResult(result: any): string {\n  return stringify(result);\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/__tests__/__queries__/mergedQuery.graphql",
    "content": "query NBAHomepageQuery {\n  currentUser {\n    slug\n    ... on CurrentUser {\n      id\n      slug\n      ... on CurrentUser {\n        id\n        slug\n        nickname\n        __typename\n      }\n      nbaCardCounts {\n        ... on CardCountsByRarity {\n          ... on CardCountsByRarity {\n            uniqueCount\n            superRareCount\n            rareCount\n            limitedCount\n            commonCount\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    ... on CurrentUser {\n      slug\n      nbaMostRecentlyPlayedPastFixture {\n        slug\n        ... on NBAFixture {\n          slug\n          gameWeek\n          leaderboards {\n            slug\n            ... on LeaderboardInterface {\n              slug\n              leaderboardRarity\n              __typename\n            }\n            ... on NBALeaderboard {\n              slug\n              isTraining\n              ... on NBALeaderboard {\n                slug\n                fixture {\n                  slug\n                  fixtureState\n                  __typename\n                }\n                isUserEligible\n                lineupsCount\n                iconImageUrl\n                monochromeIconImageUrl\n                requirements {\n                  ... on NBALeaderboardRequirements {\n                    allowedConference\n                    ... on NBALeaderboardRequirements {\n                      allowedConference\n                      ... on LeaderboardRequirementsInterface {\n                        allowedRarities\n                        minRarity {\n                          minCount\n                          rarity\n                          __typename\n                        }\n                        playerAgeRequirements {\n                          minAge\n                          maxAge\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LeaderboardRequirementsInterface {\n                    allowedRarities\n                    minRarity {\n                      minCount\n                      rarity\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LeaderboardInterface {\n                  slug\n                  fixture {\n                    slug\n                    fixtureState\n                    __typename\n                  }\n                  isUserEligible\n                  lineupsCount\n                  iconImageUrl\n                  monochromeIconImageUrl\n                  ... on LeaderboardInterface {\n                    slug\n                    displayName\n                    fixture {\n                      slug\n                      ... on FixtureInterface {\n                        slug\n                        startDate\n                        endDate\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  requirements {\n                    ... on LeaderboardRequirementsInterface {\n                      allowedRarities\n                      minRarity {\n                        minCount\n                        rarity\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    fixture {\n                      slug\n                      fixtureState\n                      __typename\n                    }\n                    ... on LeaderboardInterface {\n                      slug\n                      prizePool {\n                        uniqueCardsCount\n                        superRareCardsCount\n                        rareCardsCount\n                        limitedCardsCount\n                        commonCardsMaxThreshold\n                        commonCardsCount\n                        __typename\n                      }\n                      __typename\n                    }\n                    ... on LeaderboardInterface {\n                      slug\n                      prizePool {\n                        amountUSDCents\n                        __typename\n                      }\n                      __typename\n                    }\n                    ... on LeaderboardInterface {\n                      slug\n                      displayName\n                      fixture {\n                        id\n                        slug\n                        gameWeek\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              myLineups {\n                ... on NBALineup {\n                  id\n                  rank\n                  score\n                  cards {\n                    ... on NBACardInLineup {\n                      score\n                      isMvp\n                      card {\n                        slug\n                        ... on CardInterface {\n                          id\n                          slug\n                          fullImageUrl\n                          player {\n                            slug\n                            displayName\n                            __typename\n                          }\n                          __typename\n                        }\n                        __typename\n                      }\n                      playerInFixture {\n                        status {\n                          statusIconType\n                          upcomingGames {\n                            id\n                            __typename\n                          }\n                          inGame\n                          isScoreFinal\n                          __typename\n                        }\n                        __typename\n                      }\n                      ... on NBACardInLineup {\n                        score\n                        card {\n                          slug\n                          totalBonus\n                          __typename\n                        }\n                        playerInFixture {\n                          status {\n                            statusIconType\n                            hasTBDGames\n                            upcomingGames {\n                              id\n                              __typename\n                            }\n                            gameStats {\n                              score\n                              game {\n                                id\n                                status\n                                __typename\n                              }\n                              __typename\n                            }\n                            inGame\n                            isScoreFinal\n                            __typename\n                          }\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LineupInterface {\n                    id\n                    rank\n                    score\n                    cards {\n                      card {\n                        slug\n                        __typename\n                      }\n                      __typename\n                    }\n                    ... on LineupInterface {\n                      id\n                      projectedReward {\n                        ... on ProjectedReward {\n                          ... on ProjectedReward {\n                            tier\n                            rarity\n                            amountUSDCents\n                            __typename\n                          }\n                          __typename\n                        }\n                        __typename\n                      }\n                      reward {\n                        id\n                        ... on RewardInterface {\n                          id\n                          ... on RewardInterface {\n                            id\n                            tier\n                            card {\n                              slug\n                              rarity\n                              player {\n                                slug\n                                displayName\n                                __typename\n                              }\n                              __typename\n                            }\n                            state\n                            __typename\n                          }\n                          __typename\n                        }\n                        __typename\n                      }\n                      accoladeString\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        leaderboards {\n          slug\n          ... on LeaderboardInterface {\n            slug\n            leaderboardRarity\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      ... on CurrentUser {\n        slug\n        ... on CurrentUser {\n          slug\n          nbaRecommendedStarterBundles(first: 3) {\n            id\n            ... on CardBundleOffer {\n              id\n              ... on CardBundleOffer {\n                id\n                rank\n                leaderboard {\n                  slug\n                  displayName\n                  lineupsCount\n                  fixture {\n                    slug\n                    gameWeek\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  nbaLiveFixture {\n    slug\n    ... on NBAFixture {\n      slug\n      ... on NBAFixture {\n        slug\n        games {\n          ... on NBAGame {\n            id\n            quarter\n            isHalftime\n            ... on GameInterface {\n              id\n              status\n              startDate\n              ... on GameInterface {\n                id\n                status\n                startDate\n                homeScore\n                awayScore\n                homeTeam {\n                  slug\n                  name\n                  abbreviation\n                  svgUrl\n                  __typename\n                }\n                awayTeam {\n                  slug\n                  name\n                  abbreviation\n                  svgUrl\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        leaderboards {\n          slug\n          ... on NBALeaderboard {\n            slug\n            isTraining\n            ... on NBALeaderboard {\n              slug\n              fixture {\n                slug\n                fixtureState\n                __typename\n              }\n              isUserEligible\n              lineupsCount\n              iconImageUrl\n              monochromeIconImageUrl\n              requirements {\n                ... on NBALeaderboardRequirements {\n                  allowedConference\n                  ... on NBALeaderboardRequirements {\n                    allowedConference\n                    ... on LeaderboardRequirementsInterface {\n                      allowedRarities\n                      minRarity {\n                        minCount\n                        rarity\n                        __typename\n                      }\n                      playerAgeRequirements {\n                        minAge\n                        maxAge\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LeaderboardRequirementsInterface {\n                  allowedRarities\n                  minRarity {\n                    minCount\n                    rarity\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              ... on LeaderboardInterface {\n                slug\n                fixture {\n                  slug\n                  fixtureState\n                  __typename\n                }\n                isUserEligible\n                lineupsCount\n                iconImageUrl\n                monochromeIconImageUrl\n                ... on LeaderboardInterface {\n                  slug\n                  displayName\n                  fixture {\n                    slug\n                    ... on FixtureInterface {\n                      slug\n                      startDate\n                      endDate\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                requirements {\n                  ... on LeaderboardRequirementsInterface {\n                    allowedRarities\n                    minRarity {\n                      minCount\n                      rarity\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LeaderboardInterface {\n                  slug\n                  fixture {\n                    slug\n                    fixtureState\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    prizePool {\n                      uniqueCardsCount\n                      superRareCardsCount\n                      rareCardsCount\n                      limitedCardsCount\n                      commonCardsMaxThreshold\n                      commonCardsCount\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    prizePool {\n                      amountUSDCents\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    displayName\n                    fixture {\n                      id\n                      slug\n                      gameWeek\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            myLineups {\n              ... on NBALineup {\n                id\n                rank\n                score\n                cards {\n                  ... on NBACardInLineup {\n                    score\n                    isMvp\n                    card {\n                      slug\n                      ... on CardInterface {\n                        id\n                        slug\n                        fullImageUrl\n                        player {\n                          slug\n                          displayName\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    playerInFixture {\n                      status {\n                        statusIconType\n                        upcomingGames {\n                          id\n                          __typename\n                        }\n                        inGame\n                        isScoreFinal\n                        __typename\n                      }\n                      __typename\n                    }\n                    ... on NBACardInLineup {\n                      score\n                      card {\n                        slug\n                        totalBonus\n                        __typename\n                      }\n                      playerInFixture {\n                        status {\n                          statusIconType\n                          hasTBDGames\n                          upcomingGames {\n                            id\n                            __typename\n                          }\n                          gameStats {\n                            score\n                            game {\n                              id\n                              status\n                              __typename\n                            }\n                            __typename\n                          }\n                          inGame\n                          isScoreFinal\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LineupInterface {\n                  id\n                  rank\n                  score\n                  cards {\n                    card {\n                      slug\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LineupInterface {\n                    id\n                    projectedReward {\n                      ... on ProjectedReward {\n                        ... on ProjectedReward {\n                          tier\n                          rarity\n                          amountUSDCents\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    reward {\n                      id\n                      ... on RewardInterface {\n                        id\n                        ... on RewardInterface {\n                          id\n                          tier\n                          card {\n                            slug\n                            rarity\n                            player {\n                              slug\n                              displayName\n                              __typename\n                            }\n                            __typename\n                          }\n                          state\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    accoladeString\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          ... on NBALeaderboard {\n            slug\n            myLineups {\n              id\n              games {\n                ... on GameWithCardInLineupInterface {\n                  game {\n                    id\n                    __typename\n                  }\n                  homeCardsInLineups {\n                    card {\n                      slug\n                      __typename\n                    }\n                    __typename\n                  }\n                  awayCardsInLineups {\n                    card {\n                      slug\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      leaderboards {\n        slug\n        ... on LeaderboardInterface {\n          slug\n          leaderboardRarity\n          __typename\n        }\n        ... on LeaderboardInterface {\n          slug\n          leaderboardRarity\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  nbaOpenFixture {\n    slug\n    ... on NBAFixture {\n      slug\n      ... on NBAFixture {\n        slug\n        gameWeek\n        ... on FixtureInterface {\n          slug\n          gameWeek\n          startDate\n          __typename\n        }\n        games {\n          ... on NBAGame {\n            id\n            quarter\n            isHalftime\n            ... on GameInterface {\n              id\n              status\n              startDate\n              ... on GameInterface {\n                id\n                status\n                startDate\n                homeScore\n                awayScore\n                homeTeam {\n                  slug\n                  name\n                  abbreviation\n                  svgUrl\n                  __typename\n                }\n                awayTeam {\n                  slug\n                  name\n                  abbreviation\n                  svgUrl\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        leaderboards {\n          slug\n          displayName\n          leaderboardRarity\n          isUserEligible\n          ... on NBALeaderboard {\n            slug\n            myLineups {\n              id\n              games {\n                ... on GameWithCardInLineupInterface {\n                  game {\n                    id\n                    __typename\n                  }\n                  homeCardsInLineups {\n                    card {\n                      slug\n                      __typename\n                    }\n                    __typename\n                  }\n                  awayCardsInLineups {\n                    card {\n                      slug\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          ... on NBALeaderboard {\n            slug\n            isTraining\n            ... on NBALeaderboard {\n              slug\n              fixture {\n                slug\n                fixtureState\n                __typename\n              }\n              isUserEligible\n              lineupsCount\n              iconImageUrl\n              monochromeIconImageUrl\n              requirements {\n                ... on NBALeaderboardRequirements {\n                  allowedConference\n                  ... on NBALeaderboardRequirements {\n                    allowedConference\n                    ... on LeaderboardRequirementsInterface {\n                      allowedRarities\n                      minRarity {\n                        minCount\n                        rarity\n                        __typename\n                      }\n                      playerAgeRequirements {\n                        minAge\n                        maxAge\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LeaderboardRequirementsInterface {\n                  allowedRarities\n                  minRarity {\n                    minCount\n                    rarity\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              ... on LeaderboardInterface {\n                slug\n                fixture {\n                  slug\n                  fixtureState\n                  __typename\n                }\n                isUserEligible\n                lineupsCount\n                iconImageUrl\n                monochromeIconImageUrl\n                ... on LeaderboardInterface {\n                  slug\n                  displayName\n                  fixture {\n                    slug\n                    ... on FixtureInterface {\n                      slug\n                      startDate\n                      endDate\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                requirements {\n                  ... on LeaderboardRequirementsInterface {\n                    allowedRarities\n                    minRarity {\n                      minCount\n                      rarity\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LeaderboardInterface {\n                  slug\n                  fixture {\n                    slug\n                    fixtureState\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    prizePool {\n                      uniqueCardsCount\n                      superRareCardsCount\n                      rareCardsCount\n                      limitedCardsCount\n                      commonCardsMaxThreshold\n                      commonCardsCount\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    prizePool {\n                      amountUSDCents\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LeaderboardInterface {\n                    slug\n                    displayName\n                    fixture {\n                      id\n                      slug\n                      gameWeek\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            myLineups {\n              ... on NBALineup {\n                id\n                rank\n                score\n                cards {\n                  ... on NBACardInLineup {\n                    score\n                    isMvp\n                    card {\n                      slug\n                      ... on CardInterface {\n                        id\n                        slug\n                        fullImageUrl\n                        player {\n                          slug\n                          displayName\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    playerInFixture {\n                      status {\n                        statusIconType\n                        upcomingGames {\n                          id\n                          __typename\n                        }\n                        inGame\n                        isScoreFinal\n                        __typename\n                      }\n                      __typename\n                    }\n                    ... on NBACardInLineup {\n                      score\n                      card {\n                        slug\n                        totalBonus\n                        __typename\n                      }\n                      playerInFixture {\n                        status {\n                          statusIconType\n                          hasTBDGames\n                          upcomingGames {\n                            id\n                            __typename\n                          }\n                          gameStats {\n                            score\n                            game {\n                              id\n                              status\n                              __typename\n                            }\n                            __typename\n                          }\n                          inGame\n                          isScoreFinal\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    __typename\n                  }\n                  __typename\n                }\n                ... on LineupInterface {\n                  id\n                  rank\n                  score\n                  cards {\n                    card {\n                      slug\n                      __typename\n                    }\n                    __typename\n                  }\n                  ... on LineupInterface {\n                    id\n                    projectedReward {\n                      ... on ProjectedReward {\n                        ... on ProjectedReward {\n                          tier\n                          rarity\n                          amountUSDCents\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    reward {\n                      id\n                      ... on RewardInterface {\n                        id\n                        ... on RewardInterface {\n                          id\n                          tier\n                          card {\n                            slug\n                            rarity\n                            player {\n                              slug\n                              displayName\n                              __typename\n                            }\n                            __typename\n                          }\n                          state\n                          __typename\n                        }\n                        __typename\n                      }\n                      __typename\n                    }\n                    accoladeString\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      ... on NBAFixture {\n        slug\n        leaderboards {\n          slug\n          __typename\n        }\n        myRecommendedLeaderboards(first: 5) {\n          slug\n          __typename\n        }\n        __typename\n      }\n      leaderboards {\n        slug\n        ... on LeaderboardInterface {\n          slug\n          leaderboardRarity\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  nbaPastFixtures(first: 1) {\n    ... on NBAFixtureConnection {\n      ... on NBAFixtureConnection {\n        nodes {\n          slug\n          gameWeek\n          ... on NBAFixture {\n            slug\n            playerFixtureStats(\n              first: 15\n              order: SCORE\n              hideUnownedPlayers: false\n            ) {\n              nodes {\n                player {\n                  slug\n                  team {\n                    slug\n                    __typename\n                  }\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  cumulativeLeaderboards(sport: NBA) {\n    slug\n    ... on CumulativeLeaderboard {\n      slug\n      currentCumulativeGameWeek\n      ... on CumulativeLeaderboard {\n        slug\n        displayName\n        ... on CumulativeLeaderboard {\n          slug\n          startGameWeek\n          endGameWeek\n          currentCumulativeGameWeek\n          myCumulativeLeaderboardRank {\n            id\n            projectedPrizeCredits\n            __typename\n          }\n          __typename\n        }\n        ... on CumulativeLeaderboard {\n          slug\n          ... on CumulativeLeaderboard {\n            slug\n            displayName\n            iconImageUrl\n            startGameWeek\n            endGameWeek\n            participantsCount\n            leaderboardRarity\n            myCumulativeLeaderboardRank {\n              id\n              score\n              rank\n              projectedPrizeCredits\n              __typename\n            }\n            __typename\n          }\n          myCumulativeLeaderboardRank {\n            id\n            cumulativeLeaderboard {\n              slug\n              ... on CumulativeLeaderboard {\n                slug\n                displayName\n                iconImageUrl\n                startGameWeek\n                endGameWeek\n                participantsCount\n                leaderboardRarity\n                myCumulativeLeaderboardRank {\n                  id\n                  score\n                  rank\n                  projectedPrizeCredits\n                  __typename\n                }\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/__tests__/__queries__/mergedQueryWithSchema.graphql",
    "content": "query NBAHomepageQuery {\n  currentUser {\n    slug\n    id\n    nickname\n    __typename\n    nbaCardCounts {\n      uniqueCount\n      superRareCount\n      rareCount\n      limitedCount\n      commonCount\n      __typename\n    }\n    nbaMostRecentlyPlayedPastFixture {\n      slug\n      gameWeek\n      leaderboards {\n        slug\n        ... on LeaderboardInterface {\n          slug\n          leaderboardRarity\n          __typename\n        }\n        isTraining\n        fixture {\n          slug\n          fixtureState\n          __typename\n        }\n        isUserEligible\n        lineupsCount\n        iconImageUrl\n        monochromeIconImageUrl\n        requirements {\n          allowedConference\n          ... on LeaderboardRequirementsInterface {\n            allowedRarities\n            minRarity {\n              minCount\n              rarity\n              __typename\n            }\n            playerAgeRequirements {\n              minAge\n              maxAge\n              __typename\n            }\n            __typename\n          }\n          __typename\n          ... on LeaderboardRequirementsInterface {\n            allowedRarities\n            minRarity {\n              minCount\n              rarity\n              __typename\n            }\n            __typename\n          }\n        }\n        ... on LeaderboardInterface {\n          slug\n          fixture {\n            slug\n            fixtureState\n            __typename\n            startDate\n            endDate\n            id\n            gameWeek\n          }\n          isUserEligible\n          lineupsCount\n          iconImageUrl\n          monochromeIconImageUrl\n          displayName\n          __typename\n          requirements {\n            allowedRarities\n            minRarity {\n              minCount\n              rarity\n              __typename\n            }\n            __typename\n          }\n          prizePool {\n            uniqueCardsCount\n            superRareCardsCount\n            rareCardsCount\n            limitedCardsCount\n            commonCardsMaxThreshold\n            commonCardsCount\n            __typename\n            amountUSDCents\n          }\n        }\n        __typename\n        myLineups {\n          id\n          rank\n          score\n          cards {\n            score\n            isMvp\n            card {\n              slug\n              ... on CardInterface {\n                id\n                slug\n                fullImageUrl\n                player {\n                  slug\n                  displayName\n                  __typename\n                }\n                __typename\n              }\n              __typename\n              totalBonus\n            }\n            playerInFixture {\n              status {\n                statusIconType\n                upcomingGames {\n                  id\n                  __typename\n                }\n                inGame\n                isScoreFinal\n                __typename\n                hasTBDGames\n                gameStats {\n                  score\n                  game {\n                    id\n                    status\n                    __typename\n                  }\n                  __typename\n                }\n              }\n              __typename\n            }\n            __typename\n          }\n          ... on LineupInterface {\n            id\n            rank\n            score\n            cards {\n              card {\n                slug\n                __typename\n              }\n              __typename\n            }\n            projectedReward {\n              tier\n              rarity\n              amountUSDCents\n              __typename\n            }\n            reward {\n              id\n              tier\n              card {\n                slug\n                rarity\n                player {\n                  slug\n                  displayName\n                  __typename\n                }\n                __typename\n              }\n              state\n              __typename\n            }\n            accoladeString\n            __typename\n          }\n          __typename\n        }\n        ... on LeaderboardInterface {\n          slug\n          leaderboardRarity\n          __typename\n        }\n      }\n      __typename\n    }\n    nbaRecommendedStarterBundles(first: 3) {\n      id\n      ... on CardBundleOffer {\n        id\n        rank\n        leaderboard {\n          slug\n          displayName\n          lineupsCount\n          fixture {\n            slug\n            gameWeek\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n  }\n  nbaLiveFixture {\n    slug\n    games {\n      id\n      quarter\n      isHalftime\n      ... on GameInterface {\n        id\n        status\n        startDate\n        homeScore\n        awayScore\n        homeTeam {\n          slug\n          name\n          abbreviation\n          svgUrl\n          __typename\n        }\n        awayTeam {\n          slug\n          name\n          abbreviation\n          svgUrl\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    leaderboards {\n      slug\n      isTraining\n      fixture {\n        slug\n        fixtureState\n        __typename\n      }\n      isUserEligible\n      lineupsCount\n      iconImageUrl\n      monochromeIconImageUrl\n      requirements {\n        allowedConference\n        ... on LeaderboardRequirementsInterface {\n          allowedRarities\n          minRarity {\n            minCount\n            rarity\n            __typename\n          }\n          playerAgeRequirements {\n            minAge\n            maxAge\n            __typename\n          }\n          __typename\n        }\n        __typename\n        ... on LeaderboardRequirementsInterface {\n          allowedRarities\n          minRarity {\n            minCount\n            rarity\n            __typename\n          }\n          __typename\n        }\n      }\n      ... on LeaderboardInterface {\n        slug\n        fixture {\n          slug\n          fixtureState\n          __typename\n          startDate\n          endDate\n          id\n          gameWeek\n        }\n        isUserEligible\n        lineupsCount\n        iconImageUrl\n        monochromeIconImageUrl\n        displayName\n        __typename\n        requirements {\n          allowedRarities\n          minRarity {\n            minCount\n            rarity\n            __typename\n          }\n          __typename\n        }\n        prizePool {\n          uniqueCardsCount\n          superRareCardsCount\n          rareCardsCount\n          limitedCardsCount\n          commonCardsMaxThreshold\n          commonCardsCount\n          __typename\n          amountUSDCents\n        }\n      }\n      __typename\n      myLineups {\n        id\n        rank\n        score\n        cards {\n          score\n          isMvp\n          card {\n            slug\n            ... on CardInterface {\n              id\n              slug\n              fullImageUrl\n              player {\n                slug\n                displayName\n                __typename\n              }\n              __typename\n            }\n            __typename\n            totalBonus\n          }\n          playerInFixture {\n            status {\n              statusIconType\n              upcomingGames {\n                id\n                __typename\n              }\n              inGame\n              isScoreFinal\n              __typename\n              hasTBDGames\n              gameStats {\n                score\n                game {\n                  id\n                  status\n                  __typename\n                }\n                __typename\n              }\n            }\n            __typename\n          }\n          __typename\n        }\n        ... on LineupInterface {\n          id\n          rank\n          score\n          cards {\n            card {\n              slug\n              __typename\n            }\n            __typename\n          }\n          projectedReward {\n            tier\n            rarity\n            amountUSDCents\n            __typename\n          }\n          reward {\n            id\n            tier\n            card {\n              slug\n              rarity\n              player {\n                slug\n                displayName\n                __typename\n              }\n              __typename\n            }\n            state\n            __typename\n          }\n          accoladeString\n          __typename\n        }\n        __typename\n        games {\n          ... on GameWithCardInLineupInterface {\n            game {\n              id\n              __typename\n            }\n            homeCardsInLineups {\n              card {\n                slug\n                __typename\n              }\n              __typename\n            }\n            awayCardsInLineups {\n              card {\n                slug\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n      }\n      ... on LeaderboardInterface {\n        slug\n        leaderboardRarity\n        __typename\n      }\n      ... on LeaderboardInterface {\n        slug\n        leaderboardRarity\n        __typename\n      }\n    }\n    __typename\n  }\n  nbaOpenFixture {\n    slug\n    gameWeek\n    ... on FixtureInterface {\n      slug\n      gameWeek\n      startDate\n      __typename\n    }\n    games {\n      id\n      quarter\n      isHalftime\n      ... on GameInterface {\n        id\n        status\n        startDate\n        homeScore\n        awayScore\n        homeTeam {\n          slug\n          name\n          abbreviation\n          svgUrl\n          __typename\n        }\n        awayTeam {\n          slug\n          name\n          abbreviation\n          svgUrl\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    leaderboards {\n      slug\n      displayName\n      leaderboardRarity\n      isUserEligible\n      myLineups {\n        id\n        games {\n          ... on GameWithCardInLineupInterface {\n            game {\n              id\n              __typename\n            }\n            homeCardsInLineups {\n              card {\n                slug\n                __typename\n              }\n              __typename\n            }\n            awayCardsInLineups {\n              card {\n                slug\n                __typename\n              }\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n        rank\n        score\n        cards {\n          score\n          isMvp\n          card {\n            slug\n            ... on CardInterface {\n              id\n              slug\n              fullImageUrl\n              player {\n                slug\n                displayName\n                __typename\n              }\n              __typename\n            }\n            __typename\n            totalBonus\n          }\n          playerInFixture {\n            status {\n              statusIconType\n              upcomingGames {\n                id\n                __typename\n              }\n              inGame\n              isScoreFinal\n              __typename\n              hasTBDGames\n              gameStats {\n                score\n                game {\n                  id\n                  status\n                  __typename\n                }\n                __typename\n              }\n            }\n            __typename\n          }\n          __typename\n        }\n        ... on LineupInterface {\n          id\n          rank\n          score\n          cards {\n            card {\n              slug\n              __typename\n            }\n            __typename\n          }\n          projectedReward {\n            tier\n            rarity\n            amountUSDCents\n            __typename\n          }\n          reward {\n            id\n            tier\n            card {\n              slug\n              rarity\n              player {\n                slug\n                displayName\n                __typename\n              }\n              __typename\n            }\n            state\n            __typename\n          }\n          accoladeString\n          __typename\n        }\n      }\n      __typename\n      isTraining\n      fixture {\n        slug\n        fixtureState\n        __typename\n      }\n      lineupsCount\n      iconImageUrl\n      monochromeIconImageUrl\n      requirements {\n        allowedConference\n        ... on LeaderboardRequirementsInterface {\n          allowedRarities\n          minRarity {\n            minCount\n            rarity\n            __typename\n          }\n          playerAgeRequirements {\n            minAge\n            maxAge\n            __typename\n          }\n          __typename\n        }\n        __typename\n        ... on LeaderboardRequirementsInterface {\n          allowedRarities\n          minRarity {\n            minCount\n            rarity\n            __typename\n          }\n          __typename\n        }\n      }\n      ... on LeaderboardInterface {\n        slug\n        fixture {\n          slug\n          fixtureState\n          __typename\n          startDate\n          endDate\n          id\n          gameWeek\n        }\n        isUserEligible\n        lineupsCount\n        iconImageUrl\n        monochromeIconImageUrl\n        displayName\n        __typename\n        requirements {\n          allowedRarities\n          minRarity {\n            minCount\n            rarity\n            __typename\n          }\n          __typename\n        }\n        prizePool {\n          uniqueCardsCount\n          superRareCardsCount\n          rareCardsCount\n          limitedCardsCount\n          commonCardsMaxThreshold\n          commonCardsCount\n          __typename\n          amountUSDCents\n        }\n      }\n      ... on LeaderboardInterface {\n        slug\n        leaderboardRarity\n        __typename\n      }\n    }\n    __typename\n    myRecommendedLeaderboards(first: 5) {\n      slug\n      __typename\n    }\n  }\n  nbaPastFixtures(first: 1) {\n    nodes {\n      slug\n      gameWeek\n      playerFixtureStats(first: 15, order: SCORE, hideUnownedPlayers: false) {\n        nodes {\n          player {\n            slug\n            team {\n              slug\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  cumulativeLeaderboards(sport: NBA) {\n    slug\n    currentCumulativeGameWeek\n    displayName\n    startGameWeek\n    endGameWeek\n    myCumulativeLeaderboardRank {\n      id\n      projectedPrizeCredits\n      __typename\n      score\n      rank\n      cumulativeLeaderboard {\n        slug\n        displayName\n        iconImageUrl\n        startGameWeek\n        endGameWeek\n        participantsCount\n        leaderboardRarity\n        myCumulativeLeaderboardRank {\n          id\n          score\n          rank\n          projectedPrizeCredits\n          __typename\n        }\n        __typename\n      }\n    }\n    __typename\n    iconImageUrl\n    participantsCount\n    leaderboardRarity\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/__tests__/__queries__/testQuery.graphql",
    "content": "query NBAHomepageQuery {\n  currentUser {\n    slug\n    ...NBAHomepageHeader_currentUser\n    ...NBAHomepageOverview_currentUser\n    __typename\n  }\n  nbaLiveFixture {\n    slug\n    ...NBAHomepageOverview_nbaLiveFixture\n    __typename\n  }\n  nbaOpenFixture {\n    slug\n    ...NBAHomepageOverview_nbaOpenFixture\n    __typename\n  }\n  nbaPastFixtures(first: 1) {\n    ...NBAHomepageOverview_nbaPastFixtures\n    __typename\n  }\n  cumulativeLeaderboards(sport: NBA) {\n    slug\n    ...NBAHomepageOverview_CumulativeLeaderboard\n    __typename\n  }\n}\n\nfragment NBAHomepageHeader_currentUser on CurrentUser {\n  id\n  slug\n  ...HomepageHeader_currentUser\n  nbaCardCounts {\n    ...HomepageHeader_CardCountsByRarity\n    __typename\n  }\n  __typename\n}\n\nfragment HomepageHeader_currentUser on CurrentUser {\n  id\n  slug\n  nickname\n  __typename\n}\n\nfragment HomepageHeader_CardCountsByRarity on CardCountsByRarity {\n  ...CardCounts_CardCountsByRarity\n  __typename\n}\n\nfragment CardCounts_CardCountsByRarity on CardCountsByRarity {\n  uniqueCount\n  superRareCount\n  rareCount\n  limitedCount\n  commonCount\n  __typename\n}\n\nfragment NBAHomepageOverview_CumulativeLeaderboard on CumulativeLeaderboard {\n  slug\n  currentCumulativeGameWeek\n  ...PostseasonLeadup_CumulativeLeaderboard\n  __typename\n}\n\nfragment PostseasonLeadup_CumulativeLeaderboard on CumulativeLeaderboard {\n  slug\n  displayName\n  ...PostseasonHeader_CumulativeLeaderboard\n  ...CumulativeLeaderboards_CumulativeLeaderboard\n  __typename\n}\n\nfragment PostseasonHeader_CumulativeLeaderboard on CumulativeLeaderboard {\n  slug\n  startGameWeek\n  endGameWeek\n  currentCumulativeGameWeek\n  myCumulativeLeaderboardRank {\n    id\n    projectedPrizeCredits\n    __typename\n  }\n  __typename\n}\n\nfragment CumulativeLeaderboards_CumulativeLeaderboard on CumulativeLeaderboard {\n  slug\n  ...CumulativeLeaderboardRank_CumulativeLeaderboard\n  myCumulativeLeaderboardRank {\n    id\n    cumulativeLeaderboard {\n      slug\n      ...CumulativeLeaderboardRank_CumulativeLeaderboard\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment CumulativeLeaderboardRank_CumulativeLeaderboard on CumulativeLeaderboard {\n  slug\n  displayName\n  iconImageUrl\n  startGameWeek\n  endGameWeek\n  participantsCount\n  leaderboardRarity\n  myCumulativeLeaderboardRank {\n    id\n    score\n    rank\n    projectedPrizeCredits\n    __typename\n  }\n  __typename\n}\n\nfragment NBAHomepageOverview_currentUser on CurrentUser {\n  slug\n  nbaMostRecentlyPlayedPastFixture {\n    slug\n    ...Past_NBAFixture\n    leaderboards {\n      slug\n      ...getLeaderboardScarcity_LeaderboardInterface\n      __typename\n    }\n    __typename\n  }\n  ...Upcoming_currentUser\n  __typename\n}\n\nfragment Past_NBAFixture on NBAFixture {\n  slug\n  gameWeek\n  leaderboards {\n    slug\n    ...getLeaderboardScarcity_LeaderboardInterface\n    ...Lineups_NBALeaderboard\n    __typename\n  }\n  __typename\n}\n\nfragment getLeaderboardScarcity_LeaderboardInterface on LeaderboardInterface {\n  slug\n  leaderboardRarity\n  __typename\n}\n\nfragment Lineups_NBALeaderboard on NBALeaderboard {\n  slug\n  isTraining\n  ...Lineup_NBALeaderboard\n  myLineups {\n    ...Homepage_Lineup_NBALineup\n    __typename\n  }\n  __typename\n}\n\nfragment Lineup_NBALeaderboard on NBALeaderboard {\n  slug\n  fixture {\n    slug\n    fixtureState\n    __typename\n  }\n  isUserEligible\n  lineupsCount\n  iconImageUrl\n  monochromeIconImageUrl\n  requirements {\n    ...getUnlockLink_NBALeaderboardRequirements\n    ...getCardScarcity_LeaderboardRequirementsInterface\n    __typename\n  }\n  ...Lineup_LeaderboardInterface\n  __typename\n}\n\nfragment getUnlockLink_NBALeaderboardRequirements on NBALeaderboardRequirements {\n  allowedConference\n  ...getAlgoliaFiltersForRequirements_NBALeaderboardRequirements\n  __typename\n}\n\nfragment getAlgoliaFiltersForRequirements_NBALeaderboardRequirements on NBALeaderboardRequirements {\n  allowedConference\n  ...getAlgoliaFiltersForRequirements_LeaderboardRequirementsInterface\n  __typename\n}\n\nfragment getAlgoliaFiltersForRequirements_LeaderboardRequirementsInterface on LeaderboardRequirementsInterface {\n  allowedRarities\n  minRarity {\n    minCount\n    rarity\n    __typename\n  }\n  playerAgeRequirements {\n    minAge\n    maxAge\n    __typename\n  }\n  __typename\n}\n\nfragment getCardScarcity_LeaderboardRequirementsInterface on LeaderboardRequirementsInterface {\n  allowedRarities\n  minRarity {\n    minCount\n    rarity\n    __typename\n  }\n  __typename\n}\n\nfragment Lineup_LeaderboardInterface on LeaderboardInterface {\n  slug\n  fixture {\n    slug\n    fixtureState\n    __typename\n  }\n  isUserEligible\n  lineupsCount\n  iconImageUrl\n  monochromeIconImageUrl\n  ...LineupHeader_LeaderboardInterface\n  requirements {\n    ...getCardScarcity_LeaderboardRequirementsInterface\n    __typename\n  }\n  ...LineupFooter_LeaderboardInterface\n  __typename\n}\n\nfragment LineupHeader_LeaderboardInterface on LeaderboardInterface {\n  slug\n  displayName\n  fixture {\n    slug\n    ...LineupDate_FixtureInterface\n    __typename\n  }\n  __typename\n}\n\nfragment LineupDate_FixtureInterface on FixtureInterface {\n  slug\n  startDate\n  endDate\n  __typename\n}\n\nfragment LineupFooter_LeaderboardInterface on LeaderboardInterface {\n  slug\n  fixture {\n    slug\n    fixtureState\n    __typename\n  }\n  ...formatCardRewards_LeaderboardInterface\n  ...formatFiatRewards_LeaderboardInterface\n  ...getLeaderboardIRLPrize_LeaderboardInterface\n  __typename\n}\n\nfragment formatCardRewards_LeaderboardInterface on LeaderboardInterface {\n  slug\n  prizePool {\n    uniqueCardsCount\n    superRareCardsCount\n    rareCardsCount\n    limitedCardsCount\n    commonCardsMaxThreshold\n    commonCardsCount\n    __typename\n  }\n  __typename\n}\n\nfragment formatFiatRewards_LeaderboardInterface on LeaderboardInterface {\n  slug\n  prizePool {\n    amountUSDCents\n    __typename\n  }\n  __typename\n}\n\nfragment getLeaderboardIRLPrize_LeaderboardInterface on LeaderboardInterface {\n  slug\n  displayName\n  fixture {\n    id\n    slug\n    gameWeek\n    __typename\n  }\n  __typename\n}\n\nfragment Homepage_Lineup_NBALineup on NBALineup {\n  id\n  rank\n  score\n  cards {\n    ...PlayerCard_NBACardInLineup\n    __typename\n  }\n  ...Homepage_Lineup_LineupInterface\n  __typename\n}\n\nfragment PlayerCard_NBACardInLineup on NBACardInLineup {\n  score\n  isMvp\n  card {\n    slug\n    ...Card_CardInterface\n    __typename\n  }\n  playerInFixture {\n    status {\n      statusIconType\n      upcomingGames {\n        id\n        __typename\n      }\n      inGame\n      isScoreFinal\n      __typename\n    }\n    __typename\n  }\n  ...PlayerCardScore_NBACardInLineup\n  __typename\n}\n\nfragment Card_CardInterface on CardInterface {\n  id\n  slug\n  fullImageUrl\n  player {\n    slug\n    displayName\n    __typename\n  }\n  __typename\n}\n\nfragment PlayerCardScore_NBACardInLineup on NBACardInLineup {\n  score\n  card {\n    slug\n    totalBonus\n    __typename\n  }\n  playerInFixture {\n    status {\n      statusIconType\n      hasTBDGames\n      upcomingGames {\n        id\n        __typename\n      }\n      gameStats {\n        score\n        game {\n          id\n          status\n          __typename\n        }\n        __typename\n      }\n      inGame\n      isScoreFinal\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment Homepage_Lineup_LineupInterface on LineupInterface {\n  id\n  rank\n  score\n  cards {\n    card {\n      slug\n      __typename\n    }\n    __typename\n  }\n  ...LineupFooter_LineupInterface\n  __typename\n}\n\nfragment LineupFooter_LineupInterface on LineupInterface {\n  id\n  projectedReward {\n    ...LineupFooterDumb_ProjectedReward\n    __typename\n  }\n  reward {\n    id\n    ...LineupFooterDumb_RewardInterface\n    __typename\n  }\n  accoladeString\n  __typename\n}\n\nfragment LineupFooterDumb_ProjectedReward on ProjectedReward {\n  ...RewardDescription_ProjectedReward\n  __typename\n}\n\nfragment RewardDescription_ProjectedReward on ProjectedReward {\n  tier\n  rarity\n  amountUSDCents\n  __typename\n}\n\nfragment LineupFooterDumb_RewardInterface on RewardInterface {\n  id\n  ...RewardDescription_RewardInterface\n  __typename\n}\n\nfragment RewardDescription_RewardInterface on RewardInterface {\n  id\n  tier\n  card {\n    slug\n    rarity\n    player {\n      slug\n      displayName\n      __typename\n    }\n    __typename\n  }\n  state\n  __typename\n}\n\nfragment Upcoming_currentUser on CurrentUser {\n  slug\n  ...CompetitionWithStarterPacks_currentUser\n  __typename\n}\n\nfragment CompetitionWithStarterPacks_currentUser on CurrentUser {\n  slug\n  nbaRecommendedStarterBundles(first: 3) {\n    id\n    ...StarterPack_CardBundleOffer\n    __typename\n  }\n  __typename\n}\n\nfragment StarterPack_CardBundleOffer on CardBundleOffer {\n  id\n  ...StarterBundleProjection_CardBundleOffer\n  __typename\n}\n\nfragment StarterBundleProjection_CardBundleOffer on CardBundleOffer {\n  id\n  rank\n  leaderboard {\n    slug\n    displayName\n    lineupsCount\n    fixture {\n      slug\n      gameWeek\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment NBAHomepageOverview_nbaLiveFixture on NBAFixture {\n  slug\n  ...Live_NBAFixture\n  leaderboards {\n    slug\n    ...getLeaderboardScarcity_LeaderboardInterface\n    ...getCardRarityToPromote_LeaderboardInterface\n    __typename\n  }\n  __typename\n}\n\nfragment Live_NBAFixture on NBAFixture {\n  slug\n  games {\n    ...Scoreboard_NBAGame\n    __typename\n  }\n  leaderboards {\n    slug\n    ...Lineups_NBALeaderboard\n    ...Scoreboard_NBALeaderboard\n    __typename\n  }\n  __typename\n}\n\nfragment Scoreboard_NBAGame on NBAGame {\n  id\n  quarter\n  isHalftime\n  ...Scoreboard_GameInterface\n  __typename\n}\n\nfragment Scoreboard_GameInterface on GameInterface {\n  id\n  status\n  startDate\n  ...ScoreboardGame_GameInterface\n  __typename\n}\n\nfragment ScoreboardGame_GameInterface on GameInterface {\n  id\n  status\n  startDate\n  homeScore\n  awayScore\n  homeTeam {\n    slug\n    name\n    abbreviation\n    svgUrl\n    __typename\n  }\n  awayTeam {\n    slug\n    name\n    abbreviation\n    svgUrl\n    __typename\n  }\n  __typename\n}\n\nfragment Scoreboard_NBALeaderboard on NBALeaderboard {\n  slug\n  myLineups {\n    id\n    games {\n      ...Scoreboard_GameWithCardInLineupInterface\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment Scoreboard_GameWithCardInLineupInterface on GameWithCardInLineupInterface {\n  game {\n    id\n    __typename\n  }\n  homeCardsInLineups {\n    card {\n      slug\n      __typename\n    }\n    __typename\n  }\n  awayCardsInLineups {\n    card {\n      slug\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment getCardRarityToPromote_LeaderboardInterface on LeaderboardInterface {\n  slug\n  leaderboardRarity\n  __typename\n}\n\nfragment NBAHomepageOverview_nbaOpenFixture on NBAFixture {\n  slug\n  ...Upcoming_NBAFixture\n  ...getRecommendedLeaderboards_NBAFixture\n  leaderboards {\n    slug\n    ...getCardRarityToPromote_LeaderboardInterface\n    __typename\n  }\n  __typename\n}\n\nfragment Upcoming_NBAFixture on NBAFixture {\n  slug\n  gameWeek\n  ...TimeUntilNextFixture_FixtureInterface\n  games {\n    ...Scoreboard_NBAGame\n    __typename\n  }\n  leaderboards {\n    slug\n    displayName\n    leaderboardRarity\n    isUserEligible\n    ...Scoreboard_NBALeaderboard\n    ...Lineups_NBALeaderboard\n    __typename\n  }\n  __typename\n}\n\nfragment TimeUntilNextFixture_FixtureInterface on FixtureInterface {\n  slug\n  gameWeek\n  startDate\n  __typename\n}\n\nfragment getRecommendedLeaderboards_NBAFixture on NBAFixture {\n  slug\n  leaderboards {\n    slug\n    __typename\n  }\n  myRecommendedLeaderboards(first: 5) {\n    slug\n    __typename\n  }\n  __typename\n}\n\nfragment NBAHomepageOverview_nbaPastFixtures on NBAFixtureConnection {\n  ...Upcoming_nbaPastFixtures\n  __typename\n}\n\nfragment Upcoming_nbaPastFixtures on NBAFixtureConnection {\n  nodes {\n    slug\n    gameWeek\n    ...PromotedPlayers_NBAFixture\n    __typename\n  }\n  __typename\n}\n\nfragment PromotedPlayers_NBAFixture on NBAFixture {\n  slug\n  playerFixtureStats(first: 15, order: SCORE, hideUnownedPlayers: false) {\n    nodes {\n      player {\n        slug\n        team {\n          slug\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/__tests__/__schema__/sorareSchema.graphql",
    "content": "schema {\n  query: Query\n  mutation: Mutation\n}\nscalar BaseballISO8601DateTime\nscalar HexColorCode\nscalar NBAISO8601DateTime\nscalar Time\nscalar UUID\nscalar _Any\nscalar _FieldSet\ntype BaseballBoostItem implements UserItem {\n  title: String!\n  description: String!\n  imageURL: String!\n  id: UUID!\n  state: UserItemState!\n  cardRarity: CardRarity!\n  percentBonus: Int!\n}\ntype BaseballBuyShopItemResponse {\n  itemID: UUID!\n  remainingCoinBalance: Int!\n  error: BaseballBuyShopItemError\n}\ntype BaseballCard implements SportsNode & CardInterface {\n  id: UUID!\n  slug: String!\n  assetId: ID!\n  owner: User\n  player: BaseballPlayer!\n  team: BaseballTeam\n  rarity: CardRarity!\n  season: String!\n  serialNumber: Int!\n  positions: [BaseballPlayerPosition!]!\n  fullImageUrl: String!\n  avatarImageUrl: String!\n  cardLevel: Int!\n  xpThresholdForCurrentCardLevel: Int!\n  xpThresholdForNextCardLevel: Int\n  xp: Int!\n  seasonBonus: Float!\n  rarityBonus: Float!\n  xpBonus: Float!\n  totalBonus: Float!\n  bonusLossAfterTransfer: Float!\n  energy: Int\n  dhMVP: Boolean!\n}\ntype BaseballCardBundleOffer implements CardBundleOffer {\n  id: String!\n  priceUSDCents: Int!\n  cards: [BaseballCard!]!\n  expiresAt: Time!\n  leaderboard: BaseballLeaderboard\n  rewardPlayerName: String!\n  rank: Int!\n}\ntype BaseballCardConnection {\n  nodes: [BaseballCard!]!\n  pageInfo: PageInfo!\n}\ntype BaseballCardCountsByLineupPosition {\n  startingPitcherCount: Int!\n  reliefPitcherCount: Int!\n  cornerInfielderCount: Int!\n  middleInfielderCount: Int!\n  outfielderCount: Int!\n}\ntype BaseballCardForComposeLineup {\n  card: BaseballCard!\n  usedInOtherLineup: BaseballLineup\n  totalBonusInLineup: Float!\n}\ntype BaseballCardForComposeLineupConnection {\n  nodes: [BaseballCardForComposeLineup!]!\n  pageInfo: PageInfo!\n}\ntype BaseballCardInLineup implements CardInLineupInterface {\n  lineup: BaseballLineup!\n  indexInLineup: Int!\n  card: BaseballCard!\n  playerInFixture: BaseballPlayerInFixture!\n  score: Float!\n  totalBonus: Float!\n  gameScores: [BaseballCardInLineupGameScore!]\n}\ntype BaseballCardInLineupGameScore implements CardInLineupGameScoreInterface {\n  score: BaseballScore!\n  gameStats: BaseballPlayerGameStats!\n  detailedPitchingGameScore: BaseballPlayerGameDetailedPitchingScores\n  detailedBattingGameScore: BaseballPlayerGameDetailedBattingScores\n}\ntype BaseballCardSampleInDailyLineup implements CardSampleInDailyLineupInterface {\n  lineup: BaseballDailyLineup!\n  indexInLineup: Int!\n  cardSample: BaseballCommonCardSample!\n  score: Float!\n  gameScore: BaseballCardInLineupGameScore!\n}\ntype BaseballCardSamplesForCommonDraftConnection {\n  nodes: [BaseballCommonCardSample!]!\n  pageInfo: PageInfo!\n}\ntype BaseballCardTrade implements CardTradeInterface {\n  id: UUID!\n  expiresAfter: Time\n  userGiveCard: BaseballCard!\n  userGiveCardUsedInLineup: BaseballLineup\n  userReceiveCardChoices: [BaseballCommonCardSample!]!\n  userReceiveCard: BaseballCard\n  isComplete: Boolean!\n}\ntype BaseballCardTradeItem implements UserItem {\n  title: String!\n  description: String!\n  imageURL: String!\n  id: UUID!\n  state: UserItemState!\n}\ntype BaseballCardsPaginated {\n  currentPage: Int!\n  pages: Int!\n  cards: [BaseballCard!]!\n}\ntype BaseballCollection implements CollectionInterface {\n  slug: String!\n  isComplete: Boolean!\n  slots: [BaseballCollectionSlot!]!\n  slotsCount: Int!\n  filledSlots: Int!\n  team: BaseballTeam\n  season: String\n}\ntype BaseballCollectionSlot implements CollectionSlotInterface {\n  requiredPlayer: BaseballPlayer!\n  ownedCards: [BaseballCard!]\n  displayCard: BaseballCard\n}\ntype BaseballCommonCardSample implements CommonCardSampleInterface {\n  id: UUID!\n  player: BaseballPlayer!\n  commonCardImageUrl: String!\n}\ntype BaseballCommonDraftAutofillSuggestionsResponse {\n  autofilledCardSamples: [BaseballCommonCardSample!]!\n  autofillError: BaseballCommonDraftAutofillSuggestionsError\n}\ntype BaseballCommonDraftConfig {\n  baseballCommonDraftCardSamples(\n    selectionIndex: Int!\n    first: Int! = 20\n    after: String\n    teamSlugs: [String!]!\n    minCost: Int\n    maxCost: Int\n    query: String\n  ): BaseballCardSamplesForCommonDraftConnection!\n  commonDraftInitialSuggestions: [BaseballCommonCardSample]!\n  commonDraftAutofillSuggestions(\n    selectedPlayerSlugs: [String!]!\n  ): BaseballCommonDraftAutofillSuggestionsResponse!\n  maxTotalCost: Int!\n  eligibleTeams: [BaseballTeam!]!\n}\ntype BaseballCreateOrUpdateDailyLineupResponse {\n  createdLineup: BaseballDailyLineup\n  lineupValidationErrors: [BaseballCreateOrUpdateLineupValidationError!]!\n}\ntype BaseballCreateOrUpdateLineupResponse {\n  createdLineup: BaseballLineup\n  lineupValidationErrors: [BaseballCreateOrUpdateLineupValidationError!]!\n}\ntype BaseballCurrentUserData {\n  onboarding: BaseballOnboarding!\n  isDraftComplete: Boolean!\n  canDraft: Boolean!\n}\ntype BaseballDailyGame implements DailyGameInterface {\n  game: BaseballGame!\n  status: DailyGameStatus!\n  lineupsCount: Int!\n  myLineup: BaseballDailyLineup\n  lineups(\n    first: Int! = 20\n    after: String\n    userId: ID\n  ): BaseballDailyLineupConnection!\n  myComposeLineupCardSamples(\n    query: String\n    dailyLineupId: UUID\n    includeOverTotalLimit: Boolean\n    indexInLineup: Int!\n    playersInDailyLineupPartial: [ID!]!\n    scoreSortOrder: BaseballComposeLineupCardsScoreSortOrder\n  ): [BaseballCommonCardSample!]!\n}\ntype BaseballDailyGameConnection {\n  nodes: [BaseballDailyGame!]!\n  pageInfo: PageInfo!\n}\ntype BaseballDailyLineup implements DailyLineupInterface {\n  id: UUID!\n  game: BaseballDailyGame!\n  cardSamples: [BaseballCardSampleInDailyLineup!]!\n  score: Float!\n  rank: Int!\n  user: User!\n}\ntype BaseballDailyLineupConnection {\n  nodes: [BaseballDailyLineup!]!\n  pageInfo: PageInfo!\n}\ntype BaseballFixture implements SportsNode & FixtureInterface {\n  id: UUID!\n  slug: String!\n  fixtureState: FixtureState!\n  gameWeek: Int!\n  startDate: Time!\n  endDate: Time!\n  games: [BaseballGame!]!\n  leaderboards(includeTraining: Boolean): [BaseballLeaderboard!]!\n  myEligibleGames: [BaseballGame!]!\n  myLiveLineupGames: [BaseballGameWithCardInLineup!]!\n  myLineups: [BaseballLineup!]!\n  myRecommendedLeaderboards(first: Int! = 3): [BaseballLeaderboard!]!\n  myNextProgressionLeaderboards: [BaseballLeaderboard!]!\n  playerFixtureStats(\n    input: BaseballPlayerFixtureStatsInput!\n  ): BaseballPlayerFixtureStatsConnection!\n  rewardPool(\n    rarity: BaseballCardRarity\n    cardRarity: CardRarity\n    tier: Int!\n  ): [BaseballPlayer!]!\n  nextFixture: BaseballFixture\n  previousFixture: BaseballFixture\n  rewardPoolCardExamples(\n    cardRarity: CardRarity!\n    tier: Int\n    limit: Int!\n  ): [BaseballCard!]!\n}\ntype BaseballFixtureConnection {\n  nodes: [BaseballFixture!]!\n  pageInfo: PageInfo!\n}\ntype BaseballGame implements SportsNode & GameInterface {\n  id: UUID!\n  status: GameStatus!\n  startDate: Time!\n  homeTeam: BaseballTeam!\n  awayTeam: BaseballTeam!\n  homeScore: Int!\n  awayScore: Int!\n  inning: BaseballInning\n  homeProbableStartingPitcher: BaseballPlayer\n  awayProbableStartingPitcher: BaseballPlayer\n  pastPlayerPerformance(\n    playerSlug: String!\n    last: Int! = 5\n  ): [BaseballPlayerGameStats!]!\n  gameWeek: Int!\n}\ntype BaseballGameWithCardInLineup implements GameWithCardInLineupInterface {\n  game: BaseballGame!\n  homeCardsInLineups: [BaseballCardInLineup!]!\n  awayCardsInLineups: [BaseballCardInLineup!]!\n}\ntype BaseballInning {\n  half: BaseballInningHalf!\n  number: Int!\n}\ntype BaseballLeaderboard implements SportsNode & LeaderboardInterface {\n  id: UUID!\n  slug: String!\n  displayName: String!\n  displayNameWithoutRarity: String!\n  descriptions: [String]!\n  lineups(\n    first: Int! = 20\n    after: String\n    userId: ID\n  ): BaseballLineupConnection!\n  myLineups: [BaseballLineup!]!\n  myRecentLineup: BaseballLineup\n  lineupsCount: Int!\n  fixture: BaseballFixture!\n  prizePool: LeaderboardPrizePool!\n  requirements: BaseballLeaderboardRequirements!\n  leaderboardRarity: LeaderboardRarity!\n  isUserEligible: Boolean!\n  isTraining: Boolean!\n  beginnerLeaderboardDetails: BeginnerLeaderboardDetails\n  iconImageUrl: String!\n  monochromeIconImageUrl: String!\n  myComposeLineupCards(\n    query: String\n    lineupId: UUID\n    first: Int! = 20\n    after: String\n    includeUsed: Boolean!\n    indexInLineup: Int!\n    cardsInLineupPartial: [ID!]!\n    scoreSortOrder: BaseballComposeLineupCardsScoreSortOrder\n  ): BaseballCardForComposeLineupConnection!\n  scoringStrategy: String!\n  inLeague(slug: String!): BaseballLeagueLeaderboard! @deprecated\n  league(slug: String!): LeagueLeaderboard!\n  cumulativeLeaderboard: CumulativeLeaderboard\n  isUltimate: Boolean!\n}\ntype BaseballLeaderboardRequirements implements LeaderboardRequirementsInterface {\n  allowedRarities: [CardRarity!]!\n  minRarity: LeaderboardRulesMinimumRarityRequirement\n  minRookieCount: Int!\n  playerAgeRequirements: PlayerAgeRequirements\n  allowedConference: BaseballConference\n  marketplaceQueryParameters: String\n}\ntype BaseballLeague implements LeagueInterface {\n  id: String!\n  slug: String!\n  name: String!\n  members: [User!]!\n}\ntype BaseballLeagueLeaderboard implements LeagueLeaderboardInterface {\n  league: BaseballLeague!\n  leaderboard: BaseballLeaderboard!\n  lineupCount: Int!\n  lineups: [BaseballLeagueLineup!]!\n  participants: [User!]!\n}\ntype BaseballLeagueLineup implements LeagueLineupInterface {\n  rank: Int!\n  lineup: BaseballLineup!\n  leaderboard: BaseballLeagueLeaderboard!\n}\ntype BaseballLineup implements SportsNode & LineupInterface {\n  id: UUID!\n  leaderboard: BaseballLeaderboard!\n  cards: [BaseballCardInLineup!]!\n  games: [BaseballGameWithCardInLineup!]!\n  score: Float!\n  rank: Int!\n  user: User!\n  xpScore: Float! @deprecated\n  projectedReward: ProjectedReward\n  reward: BaseballReward\n  accoladeString: String\n}\ntype BaseballLineupConnection {\n  nodes: [BaseballLineup!]!\n  pageInfo: PageInfo!\n}\ntype BaseballOnboarding {\n  selectCardOptions: [BaseballOnboardingCardOption!]!\n  state: BaseballOnboardingState!\n}\ntype BaseballOnboardingCardOption {\n  player: BaseballPlayer!\n  commonCardImageUrl: String!\n}\ntype BaseballPlayer implements SportsNode & PlayerInterface {\n  id: UUID!\n  slug: String!\n  birthPlaceCountry: String!\n  birthDate: Time!\n  age: Int!\n  displayName: String!\n  firstName: String!\n  lastName: String!\n  shirtNumber: Int!\n  positions: [BaseballPlayerPosition!]!\n  team: BaseballTeam\n  avatarImageUrl: String!\n  latestFinalGameStats(last: Int!): [BaseballPlayerGameStats!]!\n  latestFixtureStats(last: Int!): [BaseballPlayerInFixture!]!\n  fixtureGames(fixtureSlug: String!): [BaseballGame!]!\n    @deprecated(reason: \"use PlayerInFixture.upcomingGames\")\n  upcomingGames(next: Int!): [BaseballGame!]!\n  inFixture(fixtureSlug: String!): BaseballPlayerInFixture\n  currentSeasonAverageScore: BaseballScore!\n  last15AverageScore: BaseballScore!\n    @deprecated(reason: \"use BaseballPlayer.last15AverageGameStats.score\")\n  last15AverageGameStats: BaseballPlayerAverageGameStats!\n  isActive: Boolean!\n  commonDraftCost: Int!\n  playerInjury: PlayerInjury\n  cards(\n    first: Int! = 100\n    after: String\n    positions: [BaseballPlayerPosition!]\n    rarities: [CardRarity!]\n  ): BaseballCardConnection!\n  croppedPictureUrl: String!\n}\ntype BaseballPlayerAverageGameBattingStats {\n  runs: Float\n  rbi: Float\n  singles: Float\n  doubles: Float\n  triples: Float\n  homeRuns: Float\n  walks: Float\n  strikeouts: Float\n  stolenBases: Float\n  hitByPitch: Float\n  stealsCaught: Float!\n}\ntype BaseballPlayerAverageGamePitchingStats {\n  outs: Float\n  strikeouts: Float\n  hitsAllowed: Float\n  earnedRuns: Float\n  walks: Float\n  hitBatsmen: Float\n  win: Float\n  loss: Float\n  save: Float\n  hold: Float\n  reliefAppearance: Float!\n}\ntype BaseballPlayerAverageGameStats {\n  score: BaseballScore!\n  pitching: BaseballPlayerAverageGamePitchingStats\n  batting: BaseballPlayerAverageGameBattingStats\n  detailedPitchingScores: BaseballPlayerGameDetailedPitchingScores\n  detailedBattingScores: BaseballPlayerGameDetailedBattingScores\n}\ntype BaseballPlayerFixtureStatsConnection {\n  nodes: [BaseballPlayerInFixture!]!\n  pageInfo: PageInfo!\n}\ntype BaseballPlayerGameBattingStats {\n  runs: Int\n  rbi: Int\n  singles: Int\n  doubles: Int\n  triples: Int\n  homeRuns: Int\n  walks: Int\n  strikeouts: Int\n  stolenBases: Int\n  hitByPitch: Int\n  stealsCaught: Int!\n}\ntype BaseballPlayerGameDetailedBattingScores {\n  runs: Float\n  rbi: Float\n  singles: Float\n  doubles: Float\n  triples: Float\n  homeRuns: Float\n  walks: Float\n  strikeouts: Float\n  stolenBases: Float\n  hitByPitch: Float\n  stealsCaught: Float!\n}\ntype BaseballPlayerGameDetailedPitchingScores {\n  outs: Float\n  strikeouts: Float\n  hitsAllowed: Float\n  earnedRuns: Float\n  walks: Float\n  hitBatsmen: Float\n  win: Float\n  loss: Float\n  save: Float\n  hold: Float\n  reliefAppearance: Float!\n}\ntype BaseballPlayerGamePitchingStats {\n  outs: Int\n  strikeouts: Int\n  hitsAllowed: Int\n  earnedRuns: Int\n  walks: Int\n  hitBatsmen: Int\n  win: Int\n  loss: Int\n  save: Int\n  hold: Int\n  reliefAppearance: Int!\n}\ntype BaseballPlayerGameStats implements PlayerGameStatsInterface {\n  score: BaseballScore!\n  playedInGame: Boolean!\n  pitching: BaseballPlayerGamePitchingStats\n  batting: BaseballPlayerGameBattingStats\n  detailedPitchingScores: BaseballPlayerGameDetailedPitchingScores\n  detailedBattingScores: BaseballPlayerGameDetailedBattingScores\n  game: BaseballGame!\n  team: BaseballTeam!\n  againstTeam: BaseballTeam!\n}\ntype BaseballPlayerInFixture implements PlayerInFixtureInterface {\n  fixture: BaseballFixture!\n  player: BaseballPlayer!\n  score: BaseballScore!\n  status: BaseballPlayerInFixtureStatus!\n}\ntype BaseballPlayerInFixtureStatus implements PlayerInFixtureStatusInterface {\n  gameStats: [BaseballPlayerGameStats!]!\n  upcomingGames: [BaseballGame!]!\n  inGame: Boolean!\n  isScoreFinal: Boolean!\n  statusIconType: PlayerInFixtureStatusIconType!\n  hasTBDGames: Boolean!\n  probablePitcherGames: [BaseballGame!]!\n}\ntype BaseballReferralReward implements SportsNode & ReferralRewardInterface {\n  id: UUID!\n  card: BaseballCard!\n  state: RewardState!\n}\ntype BaseballReward implements SportsNode & RewardInterface {\n  id: UUID!\n  card: BaseballCard!\n  backImageUrl: String!\n  tier: Int!\n  lineup: BaseballLineup!\n  state: RewardState!\n}\ntype BaseballScore {\n  pitching: Float!\n  batting: Float!\n}\ntype BaseballScoutingMission {\n  slug: String!\n  displayName: String!\n  description: String!\n  endDate: Time!\n  minPlayersRequired: Int!\n  isComplete: Boolean!\n  slots: [BaseballScoutingMissionSlot!]!\n}\ntype BaseballScoutingMissionSlot {\n  requiredPlayer: BaseballPlayer!\n  ownedCard: BaseballCard\n}\ntype BaseballShop {\n  shopItems(\n    first: Int! = 20\n    after: String\n    category: BaseballItemCategory\n  ): BaseballShopItemConnection!\n}\ntype BaseballShopItem {\n  title: String!\n  description: String!\n  imageUrl: String!\n  price: Int!\n  quantity: Int\n  slug: String!\n}\ntype BaseballShopItemConnection {\n  nodes: [BaseballShopItem!]!\n  pageInfo: PageInfo!\n}\ntype BaseballSubmitCommonDraftResponse {\n  draftedCommonCards: [BaseballCard!]!\n  commonDraftValidationErrors: [BaseballSubmitCommonDraftValidationError!]!\n}\ntype BaseballTeam implements SportsTeamInterface {\n  id: UUID!\n  name: String!\n  market: String!\n  fullName: String!\n  slug: String!\n  abbreviation: String!\n  svgUrl: String!\n  monochromeSvgUrl: String!\n  teamStyleGuidePrimaryColor: HexColorCode!\n  teamStyleGuideSecondaryColor: HexColorCode!\n  players: [BaseballPlayer!]!\n  dhSPBackgroundPngUrl: String!\n}\ntype BaseballUserItemConnection {\n  nodes: [UserItem!]!\n  pageInfo: PageInfo!\n}\ntype BeginnerLeaderboardDetails {\n  progressionRankPercentageThreshold: Int!\n  progressOnReward: CardRarity\n  isCompleted: Boolean!\n  isVisible: Boolean!\n}\ntype CardCountsByRarity {\n  uniqueCount: Int!\n  superRareCount: Int!\n  rareCount: Int!\n  limitedCount: Int!\n  commonCount: Int!\n}\ntype CardInNoCardLineup {\n  card: CardInterface!\n  bonus: Float!\n}\ntype CardReward {\n  id: UUID!\n  card: CardInterface!\n  backImageUrl: String!\n  tier: Int!\n  lineup: LineupInterface!\n  state: RewardState!\n}\ntype CashReward {\n  id: UUID!\n  amountUSDCents: Int!\n  amountWei: String!\n  lineup: LineupInterface!\n  state: RewardState!\n}\ntype CumulativeLeaderboard {\n  slug: String!\n  displayName: String!\n  displayNameWithoutRarity: String!\n  iconImageUrl: String!\n  startGameWeek: Int!\n  endGameWeek: Int!\n  currentCumulativeGameWeek: Int!\n  cumulativeLeaderboardRanks(\n    first: Int! = 20\n    after: String\n  ): CumulativeLeaderboardRankConnection!\n  myCumulativeLeaderboardRank: CumulativeLeaderboardRank\n  prizeLevels: [PrizeCreditsLevel!]!\n  participantsCount: Int!\n  leaderboardRarity: LeaderboardRarity!\n  myLineups: [LineupInterface!]!\n  webUrl: String\n}\ntype CumulativeLeaderboardRank {\n  id: UUID!\n  user: User!\n  score: Float!\n  rank: Int!\n  lineups: [LineupInterface]!\n  cumulativeLeaderboard: CumulativeLeaderboard!\n  projectedPrizeCredits: Int\n}\ntype CumulativeLeaderboardRankConnection {\n  nodes: [CumulativeLeaderboardRank!]!\n  pageInfo: PageInfo!\n}\ntype CurrentNBAUser {\n  id: UUID!\n  nbaCurrentUserData: NBACurrentUserData!\n  nbaCards(first: Int! = 100, after: String): NBACardConnection!\n  unclaimedRewards: [NBAReward!]\n}\ntype CurrentSportsUser implements UserInterface {\n  id: ID!\n  slug: String!\n  nickname: String!\n  leagues(sport: GoSport): [League!]!\n  unclaimedCashRewards(sport: GoSport): [CashReward!]!\n  unclaimedCardRewards(sport: GoSport): [CardReward!]!\n  noCardRouteInfo(sport: GoSport!): NoCardRouteInfo!\n  cumulativeLeaderboardRanks(sport: GoSport!): [CumulativeLeaderboardRank!]!\n    @deprecated(reason: \"use cumulativeLeaderboards instead\")\n  nbaCards(\n    first: Int = 100\n    after: String\n    positions: [NBAPlayerPosition!]\n    rarities: [CardRarity!]\n  ): NBACardConnection!\n  nbaCurrentUserData: NBACurrentUserData!\n  nbaUnclaimedLineupRewards: [NBAReward!]!\n  nbaCardCounts: CardCountsByRarity!\n  nbaLast30DaysLineupsCount: Int!\n  nbaLineupsCount: Int!\n  nextNBACardTradeAvailableAfter: Time\n  latestNBACardTrade: NBACardTrade\n  nextCommonCardDropAvailableAfter: Time\n  nbaCommonCardDrop: NBACommonCardDrop\n  nbaStarterBundleOffer: [NBACardBundleOffer!]!\n  nbaRecommendedStarterBundles(first: Int!): [NBACardBundleOffer!]!\n  nbaLeagues: [NBALeague!]!\n  nbaCollections(slugsFilter: [String!]): [NBACollection!]!\n  nbaMostRecentlyPlayedPastFixture: NBAFixture\n  baseballCards(\n    first: Int! = 100\n    after: String\n    positions: [BaseballPlayerPosition!]\n    rarities: [CardRarity!]\n  ): BaseballCardConnection!\n  baseballCardCounts: CardCountsByRarity!\n  baseballCardCountsByLineupPosition(\n    rarities: [CardRarity!]\n  ): BaseballCardCountsByLineupPosition!\n  baseballCurrentUserData: BaseballCurrentUserData!\n  baseballUnclaimedLineupRewards: [BaseballReward!]!\n  baseballLast30DaysLineupsCount: Int!\n  baseballLineupsCount: Int!\n  nextBaseballCardTradeAvailableAfter: Time\n  latestBaseballCardTrade: BaseballCardTrade\n  baseballScoutingMissions: [BaseballScoutingMission!]!\n    @deprecated(reason: \"unsupported\")\n  baseballCollections(slugsFilter: [String!]): [BaseballCollection!]!\n  baseballLeagues: [BaseballLeague!]! @deprecated\n  baseballMostRecentlyPlayedPastFixture: BaseballFixture\n  baseballStarterBundleOffer: [BaseballCardBundleOffer!]!\n  baseballRecommendedStarterBundles(first: Int!): [BaseballCardBundleOffer!]!\n  dhDeck: DHDeck\n  dhNBAOnboarding: DHNBAOnboarding!\n  dhBaseballOnboarding: DHBaseballOnboarding!\n  dhCoins: Int!\n  dhUnclaimedCoinRewards: [DHCoinReward!]!\n  dhChallenges: [DHChallenge!]!\n  dhPlayStreak: Int!\n  dhPlayStreakUnclaimedRewards: [DHReward!]!\n}\ntype CurrentUser implements UserInterface {\n  id: ID!\n  slug: String!\n  nickname: String!\n  leagues(sport: Sport): [League!]!\n  unclaimedCashRewards(sport: Sport): [CashReward!]!\n    @deprecated(\n      reason: \"use CurrentUser.baseballUnclaimedCashRewards or CurrentUser.nbaUnclaimedCashRewards\"\n    )\n  unclaimedCardRewards(sport: Sport): [CardReward!]!\n    @deprecated(\n      reason: \"use CurrentUser.baseballUnclaimedCardRewards or CurrentUser.nbaUnclaimedCardRewards\"\n    )\n  noCardRouteInfo(sport: Sport!): NoCardRouteInfo!\n    @deprecated(\n      reason: \"use CurrentUser.baseballNoCardRouteInfo or CurrentUser.nbaNoCardRouteInfo\"\n    )\n  nbaCards(\n    first: Int! = 100\n    after: String\n    positions: [NBAPlayerPosition!]\n    rarities: [CardRarity!]\n  ): NBACardConnection!\n  nbaCurrentUserData: NBACurrentUserData!\n  nbaUnclaimedLineupRewards: [NBAReward!]!\n  nbaCardCounts: CardCountsByRarity!\n  nbaLast30DaysLineupsCount: Int!\n  nbaLineupsCount: Int!\n  nextNBACardTradeAvailableAfter: Time\n  latestNBACardTrade: NBACardTrade\n  nextCommonCardDropAvailableAfter: Time\n  nbaCommonCardDrop: NBACommonCardDrop\n  nbaStarterBundleOffer: [NBACardBundleOffer!]!\n  nbaRecommendedStarterBundles(first: Int!): [NBACardBundleOffer!]!\n  nbaLeagues: [NBALeague!]!\n  nbaCollections(slugsFilter: [String!]): [NBACollection!]!\n  nbaMostRecentlyPlayedPastFixture: NBAFixture\n  nbaUnclaimedCashRewards: [CashReward!]!\n  nbaUnclaimedCardRewards: [CardReward!]!\n  nbaNoCardRouteInfo: NoCardRouteInfo!\n  baseballCards(\n    first: Int! = 100\n    after: String\n    positions: [BaseballPlayerPosition!]\n    rarities: [CardRarity!]\n  ): BaseballCardConnection!\n  baseballCardCounts: CardCountsByRarity!\n  baseballCardCountsByLineupPosition(\n    rarities: [CardRarity!]\n  ): BaseballCardCountsByLineupPosition!\n  baseballCurrentUserData: BaseballCurrentUserData!\n  baseballUnclaimedLineupRewards: [BaseballReward!]!\n  baseballLast30DaysLineupsCount: Int!\n  baseballLineupsCount: Int!\n  nextBaseballCardTradeAvailableAfter: Time\n  latestBaseballCardTrade: BaseballCardTrade\n  baseballScoutingMissions: [BaseballScoutingMission!]!\n    @deprecated(reason: \"unsupported\")\n  baseballCollections(slugsFilter: [String!]): [BaseballCollection!]!\n  baseballLeagues: [BaseballLeague!]! @deprecated\n  baseballMostRecentlyPlayedPastFixture: BaseballFixture\n  baseballStarterBundleOffer: [BaseballCardBundleOffer!]!\n  baseballRecommendedStarterBundles(first: Int!): [BaseballCardBundleOffer!]!\n  baseballUnclaimedCashRewards: [CashReward!]!\n  baseballUnclaimedCardRewards: [CardReward!]!\n  baseballNoCardRouteInfo: NoCardRouteInfo!\n  baseballCoinBalance: Int!\n  baseballMyItems(\n    first: Int! = 20\n    after: String\n    category: BaseballItemCategory\n  ): BaseballUserItemConnection!\n}\ntype DHBaseballFixture implements DHFixtureInterface {\n  id: String!\n  state: DHFixtureState!\n  games: [GameInterface!]!\n  startDate: Time!\n  endDate: Time!\n  leaderboard: DHLeaderboard\n  probablePitchers: [DHBaseballProbablePitcher!]!\n}\ntype DHBaseballLineup implements DHLineupInterface {\n  id: ID!\n  owner: User!\n  cards: [DHCardInLineup!]!\n  boost: DHBoostInLineup!\n  leaderboard: DHLeaderboard!\n  rank: Int!\n  score: Float!\n  baseFantasyScore: Float!\n  reward: DHLineupReward\n}\ntype DHBaseballOnboarding {\n  nextTask: DHOnboardingTask!\n  mvpCardOptions: [DHMVPCardOption!]!\n}\ntype DHBaseballProbablePitcher {\n  card: BaseballCard!\n  coinCost: Int!\n}\ntype DHBoost {\n  type: DHBoostType!\n  target: DHBoostTarget!\n  levels: [DHBoostLevel!]!\n}\ntype DHBoostInLineup {\n  cardSlug: String!\n  boost: DHBoost!\n}\ntype DHBoostLevel {\n  description: String!\n  statName: String!\n  threshold: Float!\n  percentScoreIncrease: Int!\n  status: DHBoostLevelStatus\n}\ntype DHBoostLevelStatus {\n  value: Int!\n  thresholdReached: Boolean!\n}\ntype DHCardInLineup {\n  card: CardInterface!\n  game: GameInterface\n  score: Float!\n}\ntype DHChallenge {\n  id: String!\n  shortDescription: String!\n  amountCoins: Int!\n  mvpCard: Boolean!\n  state: DHChallengeState!\n}\ntype DHCoinReward {\n  id: String!\n  amountCoins: Int!\n}\ntype DHCommonCardPack {\n  packType: String!\n  cardPool: [DHMVPCardOption!]!\n}\ntype DHCompleteOnboardingTaskResponse {\n  currentSportsUser: CurrentSportsUser\n    @deprecated(reason: \"use DHCompleteOnboardingTaskResponse.currentUser\")\n  currentUser: CurrentUser\n}\ntype DHDeck {\n  cards: [CardInterface!]!\n  trickPlays: [DHTrickPlay!]!\n  boosts: [DHBoost!]!\n}\ntype DHEligibleCard {\n  card: CardInterface!\n  game: GameInterface\n  locked: Boolean!\n}\ntype DHGameWeek {\n  id: String!\n  gameWeek: Int!\n  state: DHFixtureState!\n  previousFixture: DHFixtureInterface\n  liveFixture: DHFixtureInterface\n  standings: [DHGameWeekParticipant!]!\n  startDate: Time!\n  endDate: Time!\n}\ntype DHGameWeekParticipant {\n  user: UserInterface!\n  score: Float!\n}\ntype DHLeaderboard {\n  id: String!\n  name: String!\n  fixture: DHFixtureInterface!\n  lineups: [DHLineupInterface!]!\n  myLineup: DHLineupInterface\n  myEligibleCards(\n    slotIndex: Int\n    selectedCardSlugs: [String!]!\n  ): [DHEligibleCard!]!\n  myEligibleTrickPlays(playerCardSlug: String): [DHTrickPlay!]!\n}\ntype DHLineupReward {\n  coins: Int!\n}\ntype DHMVPCardOption {\n  player: PlayerInterface!\n  commonCardImageUrl: String!\n}\ntype DHNBAFixture implements DHFixtureInterface {\n  id: String!\n  state: DHFixtureState!\n  games: [GameInterface!]!\n  startDate: Time!\n  endDate: Time!\n  leaderboard: DHLeaderboard\n}\ntype DHNBALineup implements DHLineupInterface {\n  id: ID!\n  owner: User!\n  cards: [DHCardInLineup!]!\n  trickPlay: DHTrickPlayInLineup\n  leaderboard: DHLeaderboard!\n  rank: Int!\n  score: Float!\n  baseFantasyScore: Float!\n  trickPlayBonus: Float!\n  trickPlaySubtraction: Float!\n  trickPlayImpactsOnOthers: [DHTrickPlayImpact!]!\n  trickPlayImpactsFromOthers: [DHTrickPlayImpact!]!\n  reward: DHLineupReward\n}\ntype DHNBAOnboarding {\n  nextTask: DHOnboardingTask!\n  mvpCardOptions: [DHMVPCardOption!]!\n}\ntype DHPurchaseListingResponse {\n  isSuccess: Boolean!\n  remainingCoinBalance: Int!\n  purchasedCards: [CardInterface!]!\n  dhDeck: DHDeck\n}\ntype DHReward {\n  id: String!\n  amountCoins: Int\n  card: CardInterface\n}\ntype DHShop {\n  listings: [DHShopListing!]!\n}\ntype DHShopListing {\n  id: String!\n  coinCost: Int!\n  item: DHShopItem!\n}\ntype DHSubmitLineupResponse {\n  submittedLineup: DHLineupInterface\n  lineupValidationErrors: [DHSubmitLineupValidationError!]!\n}\ntype DHTrickPlay {\n  type: String!\n  description: String!\n  imageUrl: String!\n  styleOptions: [DHTrickPlayStyleOption!]!\n  sport: GoSport!\n}\ntype DHTrickPlayImpact {\n  sourceUser: User!\n  targetUser: User!\n  trickPlayInLineup: DHTrickPlayInLineup!\n  subtraction: Float!\n}\ntype DHTrickPlayInLineup {\n  trickPlay: DHTrickPlay!\n  trickPlayStyle: DHTrickPlayStyle\n  status: DHTrickPlayInLineupStatus\n}\ntype DHTrickPlayInLineupStatus {\n  progress: [DHTrickPlayProgress!]!\n  thresholdReached: Boolean!\n}\ntype DHTrickPlayPack {\n  trickPlayType: String!\n  imageURL: String!\n}\ntype DHTrickPlayProgress {\n  statName: String!\n  value: Float!\n  threshold: Float!\n}\ntype DHTrickPlayStyleOption {\n  headline: String!\n  body: [String!]!\n  style: DHTrickPlayStyle!\n}\ntype Entity {\n  findBaseballCardByAssetID(assetID: ID!): BaseballCard!\n  findCurrentUserByID(id: ID!): CurrentUser!\n  findNBACardByAssetID(assetID: ID!): NBACard!\n  findUserByID(id: ID!): User!\n}\ntype IRLPrize {\n  headlineText: String!\n  detailText: String\n  type: IRLPrizeType!\n}\ntype LeaderboardPrizePool {\n  commonCardsMaxThreshold: Int\n  commonCardsCount: Int!\n  limitedCardsCount: Int!\n  rareCardsCount: Int!\n  superRareCardsCount: Int!\n  uniqueCardsCount: Int!\n  amountUSDCents: Int!\n  podium: [PrizePoolPodiumPrize!]!\n  participation: [PrizeLevel!]!\n}\ntype LeaderboardRulesMinimumRarityRequirement {\n  rarity: CardRarity!\n  minCount: Int!\n}\ntype League {\n  id: String!\n  slug: String!\n  name: String!\n  sport: GoSport\n  memberCount: Int!\n  members(offset: Int! = 0, limit: Int! = 100): [User!]!\n  affiliate: User\n  leaderboardsInFixture(fixtureSlug: String!): [LeagueLeaderboard!]!\n  leagueType: LeagueType!\n}\ntype LeagueLeaderboard {\n  league: League!\n  leaderboard: LeaderboardInterface!\n  lineupCount: Int!\n  lineups(offset: Int! = 0, limit: Int! = 100): [LeagueLineup!]!\n  affiliateLeagueLineup: LeagueLineup\n  myLineup: LeagueLineup\n}\ntype LeagueLineup {\n  rank: Int!\n  lineup: LineupInterface!\n  leaderboard: LeagueLeaderboard!\n}\ntype Mutation {\n  deleteLineup(input: BaseballDeleteLineupInput, id: UUID): Boolean\n    @deprecated(reason: \"use deleteBaseballLineup\")\n  createLeague(name: String!, sport: GoSport!): League!\n  joinLeague(slug: String!): League!\n  leaveLeague(slug: String!): Boolean\n  claimCashRewards(ids: [UUID!]!): [CashReward!]\n  claimCardRewards(ids: [UUID!]!): [CardReward!]\n  generateNoCardLineup(\n    userID: UUID!\n    fixtureID: UUID!\n    token: String!\n  ): NoCardLineup!\n  declineNoCardLineup(userID: UUID!, id: UUID!): NoCardLineup!\n  confirmNoCardLineup(userID: UUID!, id: UUID!): NoCardLineup!\n  confirmNoCardLineupLeaderboard(\n    userID: UUID!\n    lineupID: UUID!\n    leaderboardID: UUID!\n  ): NoCardLineup!\n  claimNBARewards(ids: [UUID!]!): [NBAReward!]\n  claimNBAReferralRewards(referralIDs: [UUID!]!): [NBAReferralReward!]!\n  completeNBAOnboardingTask(\n    input: NBACompleteOnboardingTaskInput!\n  ): NBACompleteOnboardingTaskResponse!\n  createOrUpdateNBALineup(\n    input: NBACreateOrUpdateLineupInput!\n  ): NBACreateOrUpdateLineupResponse!\n  deleteNBALineup(id: UUID!): Boolean\n  startNBACardTrade(userGiveCardSlug: String!): NBACardTrade!\n  completeNBACardTrade(id: UUID!, userReceiveCardSampleId: UUID): NBACardTrade!\n  claimNBACommonCardDrop(\n    nbaCommonCardDropID: UUID!\n    claimedCardSampleID: UUID!\n  ): NBACommonCardDrop!\n  createNBALeague(name: String!): NBALeague!\n  joinNBALeague(slug: String!): NBALeague!\n  leaveNBALeague(slug: String!): Boolean\n  claimBaseballRewards(ids: [UUID!]!): [BaseballReward!]\n  claimBaseballReferralRewards(referralIDs: [UUID!]!): [BaseballReferralReward!]\n  startBaseballCardTrade(\n    userGiveCardSlug: String!\n    position: BaseballPlayerLineupPosition\n    cardTradeItemID: UUID\n  ): BaseballCardTrade!\n  completeBaseballCardTrade(\n    id: UUID!\n    userReceiveCardSampleId: UUID\n  ): BaseballCardTrade!\n  createBaseballLeague(name: String!): BaseballLeague! @deprecated\n  joinBaseballLeague(slug: String!): BaseballLeague! @deprecated\n  leaveBaseballLeague(slug: String!): Boolean @deprecated\n  createOrUpdateBaseballLineup(\n    input: BaseballCreateOrUpdateLineupInput!\n  ): BaseballCreateOrUpdateLineupResponse!\n  deleteBaseballLineup(id: UUID!): Boolean\n  submitBaseballCommonDraft(\n    input: BaseballSubmitCommonDraftInput!\n  ): BaseballSubmitCommonDraftResponse!\n  submitOnboardingPlayerSelection(selectedCardPlayerID: UUID!): Boolean\n  createOrUpdateBaseballDailyLineup(\n    input: BaseballCreateOrUpdateDailyLineupInput!\n  ): BaseballCreateOrUpdateDailyLineupResponse\n  deleteBaseballDailyLineup(id: UUID!): Boolean\n  buyBaseballShopItem(slug: String!): BaseballBuyShopItemResponse!\n  completeDHNBAOnboardingTask(\n    input: DHNBACompleteOnboardingTaskInput!\n  ): DHCompleteOnboardingTaskResponse!\n  completeDHBaseballOnboardingTask(\n    input: DHBaseballCompleteOnboardingTaskInput!\n  ): DHCompleteOnboardingTaskResponse!\n  dhNBASubmitLineup(input: DHNBASubmitLineupInput!): DHSubmitLineupResponse!\n  dhBaseballSubmitLineup(\n    input: DHBaseballSubmitLineupInput!\n  ): DHSubmitLineupResponse!\n  dhDeleteLineup(lineupID: String!): Boolean!\n  dhPurchaseListing(id: String!): DHPurchaseListingResponse!\n  dhClaimCoinRewards(ids: [String!]!): Boolean!\n  dhClaimChallenge(id: String!): [DHChallenge!]!\n  dhClaimPlayStreakReward(id: String!): Boolean!\n}\ntype NBACard implements CardInterface {\n  id: UUID!\n  slug: String!\n  assetId: ID!\n  owner: User\n  player: NBAPlayer!\n  team: NBATeam\n  rarity: CardRarity!\n  season: String!\n  serialNumber: Int!\n  positions: [NBAPlayerPosition!]!\n  fullImageUrl: String!\n  avatarImageUrl: String!\n  cardLevel: Int!\n  xpThresholdForCurrentCardLevel: Int!\n  xpThresholdForNextCardLevel: Int\n  xp: Int!\n  seasonBonus: Float!\n  rarityBonus: Float!\n  xpBonus: Float!\n  totalBonus: Float!\n  bonusLossAfterTransfer: Float!\n  energy: Int\n  dhMVP: Boolean!\n}\ntype NBACardBundleOffer implements CardBundleOffer {\n  id: String!\n  priceUSDCents: Int!\n  cards: [NBACard!]!\n  expiresAt: Time!\n  leaderboard: NBALeaderboard\n  rewardPlayerName: String!\n  rank: Int!\n}\ntype NBACardConnection {\n  nodes: [NBACard!]!\n  pageInfo: PageInfo!\n}\ntype NBACardForComposeLineup {\n  card: NBACard!\n  usedInOtherLineup: NBALineup\n  tenGameAverageForComposeLineup: Int!\n  totalBonusInLineup: Float!\n}\ntype NBACardForComposeLineupConnection {\n  nodes: [NBACardForComposeLineup!]!\n  pageInfo: PageInfo!\n}\ntype NBACardInLineup implements CardInLineupInterface {\n  lineup: NBALineup!\n  card: NBACard!\n  playerInFixture: NBAPlayerInFixture!\n  score: Float!\n  totalBonus: Float!\n  isMvp: Boolean!\n  gameScores: [NBACardInLineupGameScore!]\n}\ntype NBACardInLineupGameScore implements CardInLineupGameScoreInterface {\n  score: Float!\n  gameStats: NBAPlayerGameStats!\n  detailedGameScores: NBAPlayerGameDetailedScores!\n}\ntype NBACardTrade implements CardTradeInterface {\n  id: UUID!\n  expiresAfter: Time\n  userGiveCard: NBACard!\n  userGiveCardUsedInLineup: NBALineup\n  userReceiveCardChoices: [NBACommonCardSample!]!\n  userReceiveCard: NBACard\n  isComplete: Boolean!\n}\ntype NBACardsPaginated {\n  currentPage: Int!\n  pages: Int!\n  cards: [NBACard!]!\n}\ntype NBACollection implements CollectionInterface {\n  slug: String!\n  isComplete: Boolean!\n  slots: [NBACollectionSlot!]!\n  slotsCount: Int!\n  filledSlots: Int!\n  team: NBATeam\n  season: String\n}\ntype NBACollectionSlot implements CollectionSlotInterface {\n  requiredPlayer: NBAPlayer!\n  ownedCards: [NBACard!]\n  displayCard: NBACard\n}\ntype NBACommonCardDrop {\n  id: UUID!\n  cardChoices: [NBACommonCardSample!]!\n  claimedCard: NBACard\n}\ntype NBACommonCardSample implements CommonCardSampleInterface {\n  id: UUID!\n  player: NBAPlayer!\n  commonCardImageUrl: String!\n}\ntype NBACompleteOnboardingTaskResponse {\n  currentSportsUser: CurrentSportsUser\n    @deprecated(reason: \"use NBACompleteOnboardingTaskResponse.currentUser\")\n  currentUser: CurrentUser\n}\ntype NBACreateOrUpdateLineupResponse {\n  createdLineup: NBALineup\n  lineupValidationErrors: [NBACreateOrUpdateLineupValidationError!]!\n}\ntype NBACurrentUserData {\n  onboardingState: NBAOnboarding!\n}\ntype NBAFixture implements FixtureInterface {\n  id: UUID!\n  slug: String!\n  fixtureState: FixtureState!\n  gameWeek: Int!\n  startDate: Time!\n  endDate: Time!\n  games: [NBAGame!]!\n  leaderboards(includeTraining: Boolean): [NBALeaderboard!]!\n  myEligibleGames: [NBAGame!]!\n  myLiveLineupGames: [NBAGameWithCardInLineup!]!\n  myLineups: [NBALineup!]!\n  myRecommendedLeaderboards(first: Int! = 3): [NBALeaderboard!]!\n  myNextProgressionLeaderboards: [NBALeaderboard!]!\n  playerFixtureStats(\n    first: Int! = 20\n    after: String\n    hideUnownedPlayers: Boolean\n    playerOwnershipFilter: PlayerOwnershipFilter\n    order: PlayerFixtureStatsSortOrder\n  ): NBAPlayerFixtureStatsConnection!\n  rewardPool(\n    rarity: BaseballCardRarity\n    cardRarity: CardRarity\n    tier: Int!\n  ): [NBAPlayer!]!\n  nextFixture: NBAFixture\n  previousFixture: NBAFixture\n  cumulativeLeaderboards: [CumulativeLeaderboard]!\n  rewardPoolCardExamples(\n    cardRarity: CardRarity!\n    tier: Int\n    limit: Int!\n  ): [NBACard!]!\n}\ntype NBAFixtureConnection {\n  nodes: [NBAFixture!]!\n  pageInfo: PageInfo!\n}\ntype NBAGame implements GameInterface {\n  id: UUID!\n  status: GameStatus!\n  startDate: Time!\n  homeTeam: NBATeam!\n  awayTeam: NBATeam!\n  homeScore: Int!\n  awayScore: Int!\n  quarter: Int!\n  isHalftime: Boolean!\n  pastPlayerPerformance(\n    playerSlug: String!\n    last: Int! = 5\n  ): [NBAPlayerGameStats!]!\n  gameWeek: Int!\n}\ntype NBAGameWithCardInLineup implements GameWithCardInLineupInterface {\n  game: NBAGame!\n  homeCardsInLineups: [NBACardInLineup!]!\n  awayCardsInLineups: [NBACardInLineup!]!\n}\ntype NBALeaderboard implements SportsNode & LeaderboardInterface {\n  id: UUID!\n  slug: String!\n  displayName: String!\n  displayNameWithoutRarity: String!\n  descriptions: [String]!\n  lineups(first: Int! = 20, after: String, userId: ID): NBALineupConnection!\n  myLineups: [NBALineup!]!\n  myRecentLineup: NBALineup\n  lineupsCount: Int!\n  fixture: NBAFixture!\n  prizePool: LeaderboardPrizePool!\n  requirements: NBALeaderboardRequirements!\n  leaderboardRarity: LeaderboardRarity!\n  isUserEligible: Boolean!\n  isTraining: Boolean!\n  beginnerLeaderboardDetails: BeginnerLeaderboardDetails\n  iconImageUrl: String!\n  monochromeIconImageUrl: String!\n  myComposeLineupCards(\n    query: String\n    lineupId: UUID\n    first: Int! = 20\n    after: String\n    includeUsed: Boolean!\n    includeOverTenGameAverageTotalLimit: Boolean\n    indexInLineup: Int!\n    cardsInLineupPartial: [ID!]!\n  ): NBACardForComposeLineupConnection!\n  inLeague(slug: String!): NBALeagueLeaderboard!\n  league(slug: String!): LeagueLeaderboard!\n  scoringStrategy: String!\n  cumulativeLeaderboard: CumulativeLeaderboard\n  isUltimate: Boolean!\n}\ntype NBALeaderboardRequirements implements LeaderboardRequirementsInterface {\n  allowedRarities: [CardRarity!]!\n  minRarity: LeaderboardRulesMinimumRarityRequirement\n  minRookieCount: Int!\n  tenGameAverageTotalLimit: Int!\n  allowMVP: Boolean!\n  allowedConference: NBAConference\n  playerAgeRequirements: PlayerAgeRequirements\n  marketplaceQueryParameters: String\n}\ntype NBALeaderboardRuleRange {\n  min: Int!\n  max: Int!\n}\ntype NBALeaderboardRulesRarityRange {\n  common: NBALeaderboardRuleRange\n  limited: NBALeaderboardRuleRange\n  rare: NBALeaderboardRuleRange\n  superRare: NBALeaderboardRuleRange\n  unique: NBALeaderboardRuleRange\n}\ntype NBALeague implements LeagueInterface {\n  id: String!\n  slug: String!\n  name: String!\n  members: [User!]!\n}\ntype NBALeagueLeaderboard implements LeagueLeaderboardInterface {\n  league: NBALeague!\n  leaderboard: NBALeaderboard!\n  lineupCount: Int!\n  lineups: [NBALeagueLineup!]!\n  participants: [User!]!\n}\ntype NBALeagueLineup implements LeagueLineupInterface {\n  rank: Int!\n  lineup: NBALineup!\n  leaderboard: NBALeagueLeaderboard!\n}\ntype NBALineup implements LineupInterface {\n  id: UUID!\n  leaderboard: NBALeaderboard!\n  cards: [NBACardInLineup!]!\n  games: [NBAGameWithCardInLineup!]!\n  score: Float!\n  rank: Int!\n  user: User!\n  xpScore: Float! @deprecated\n  projectedReward: ProjectedReward\n  reward: NBAReward\n  accoladeString: String\n}\ntype NBALineupConnection {\n  nodes: [NBALineup!]!\n  pageInfo: PageInfo!\n}\ntype NBAOnboarding {\n  nextTask: NBAOnboardingTask!\n  selectCardOptions: [NBAOnboardingCardOption!]!\n  leaderboard: NBALeaderboard\n  gradualOnboardingPhase: GradualOnboardingPhase!\n}\ntype NBAOnboardingCardOption {\n  player: NBAPlayer!\n  commonCardImageUrl: String!\n}\ntype NBAPlayer implements PlayerInterface {\n  id: UUID!\n  slug: String!\n  birthDate: Time!\n  age: Int!\n  birthPlaceCountry: String!\n  displayName: String!\n  firstName: String!\n  lastName: String!\n  shirtNumber: Int!\n  positions: [NBAPlayerPosition!]!\n  team: NBATeam\n  avatarImageUrl: String!\n  latestFinalGameStats(last: Int!): [NBAPlayerGameStats!]!\n  latestFinalFixtureStats(last: Int!): [NBAPlayerInFixture!]!\n    @deprecated(reason: \"use latestFixtureStats\")\n  latestFixtureStats(last: Int!): [NBAPlayerInFixture!]!\n  fixtureGames(fixtureSlug: String!): [NBAGame!]!\n    @deprecated(reason: \"use PlayerInFixture.upcomingGames\")\n  upcomingGames(next: Int!): [NBAGame!]!\n  inFixture(fixtureSlug: String!): NBAPlayerInFixture\n  tenGameAverage: Int!\n    @deprecated(reason: \"use NBAPlayer.tenGameAverageGameStats.score\")\n  tenGameAverageGameStats: NBAPlayerAverageGameStats!\n  isActive: Boolean!\n  playerInjury: PlayerInjury\n  cards(\n    first: Int! = 100\n    after: String\n    positions: [NBAPlayerPosition!]\n    rarities: [CardRarity!]\n  ): NBACardConnection!\n  croppedPictureUrl: String!\n}\ntype NBAPlayerAverageGameDetailedStats {\n  points: Float!\n  rebounds: Float!\n  assists: Float!\n  blocks: Float!\n  steals: Float!\n  turnovers: Float!\n  made3PointFGs: Float!\n  doubleDoubles: Float!\n  tripleDoubles: Float!\n  secondsPlayed: Float!\n}\ntype NBAPlayerAverageGameStats {\n  score: Float!\n  detailedStats: NBAPlayerAverageGameDetailedStats\n  detailedScores: NBAPlayerGameDetailedScores\n}\ntype NBAPlayerFixtureStatsConnection {\n  nodes: [NBAPlayerInFixture!]!\n  pageInfo: PageInfo!\n}\ntype NBAPlayerGameDetailedScores {\n  points: Float!\n  rebounds: Float!\n  assists: Float!\n  blocks: Float!\n  steals: Float!\n  turnovers: Float!\n  fieldGoalAttempts: Float!\n  freeThrowAttempts: Float!\n  made3PointFGs: Float!\n  doubleDoubles: Float!\n  tripleDoubles: Float!\n}\ntype NBAPlayerGameDetailedStats {\n  points: Int!\n  rebounds: Int!\n  assists: Int!\n  blocks: Int!\n  steals: Int!\n  turnovers: Int!\n  made3PointFGs: Int!\n  doubleDoubles: Int!\n  tripleDoubles: Int!\n  minutes: String @deprecated(reason: \"use secondsPlayed\")\n  secondsPlayed: Int!\n}\ntype NBAPlayerGameStats implements PlayerGameStatsInterface {\n  score: Float!\n  playedInGame: Boolean!\n  detailedStats: NBAPlayerGameDetailedStats\n  detailedScores: NBAPlayerGameDetailedScores\n  game: NBAGame!\n  team: NBATeam!\n  againstTeam: NBATeam!\n  scoreForScoringStrategy(strategy: String): Float!\n}\ntype NBAPlayerInFixture implements PlayerInFixtureInterface {\n  fixture: NBAFixture!\n  player: NBAPlayer!\n  score: Float!\n  status: NBAPlayerInFixtureStatus!\n  tenGameAverage: Int!\n}\ntype NBAPlayerInFixtureStatus implements PlayerInFixtureStatusInterface {\n  gameStats: [NBAPlayerGameStats!]!\n  upcomingGames: [NBAGame!]!\n  inGame: Boolean!\n  isScoreFinal: Boolean!\n  statusIconType: PlayerInFixtureStatusIconType!\n  hasTBDGames: Boolean!\n}\ntype NBAReferralReward implements SportsNode & ReferralRewardInterface {\n  id: UUID!\n  card: NBACard!\n  state: RewardState!\n}\ntype NBAReward implements RewardInterface {\n  id: UUID!\n  card: NBACard!\n  backImageUrl: String!\n  tier: Int!\n  lineup: NBALineup!\n  state: RewardState!\n}\ntype NBATeam implements SportsTeamInterface {\n  id: UUID!\n  name: String!\n  market: String!\n  fullName: String!\n  slug: String!\n  svgUrl: String!\n  monochromeSvgUrl: String!\n  teamStyleGuidePrimaryColor: HexColorCode!\n  players: [NBAPlayer!]!\n  abbreviation: String!\n}\ntype NoCardLineup {\n  id: UUID!\n  leaderboard: LeaderboardInterface\n  cards: [CardInNoCardLineup!]!\n  score: Float!\n  rank: Int!\n  user: User!\n}\ntype NoCardRouteInfo {\n  emailAddress: String!\n  isRouteOpen: Boolean!\n  maxLineupsPerUser: Int!\n  gameWeek: Int!\n  cardCountsByRarity: CardCountsByRarity!\n}\ntype NoCardRouteLeaderboard {\n  id: UUID!\n  name: String!\n}\ntype PageInfo {\n  endCursor: String!\n  startCursor: String!\n  hasNextPage: Boolean!\n  hasPreviousPage: Boolean!\n}\ntype PlayerAgeRequirements {\n  minAge: Int\n  maxAge: Int\n}\ntype PlayerInjury {\n  status: String!\n  description: String!\n  comment: String!\n  startDate: String!\n  updateDate: String! @deprecated(reason: \"use updateDateTime\")\n  updateDateTime: Time\n}\ntype PrizeCreditsLevel {\n  from: PrizePoolPrizeLevelBoundary!\n  to: PrizePoolPrizeLevelBoundary!\n  fromLineup: CumulativeLeaderboardRank\n  toLineup: CumulativeLeaderboardRank\n  prizeCredits: Int!\n  irlPrizes: [IRLPrize!]!\n}\ntype PrizeLevel {\n  from: PrizePoolPrizeLevelBoundary!\n  to: PrizePoolPrizeLevelBoundary!\n  rarity: CardRarity! @deprecated(reason: \"use cardRarity\")\n  cardRarity: CardRarity\n  tier: Int! @deprecated(reason: \"use cardTier\")\n  cardTier: Int\n  amountUSDCents: Int!\n  fromLineup: LineupInterface\n  toLineup: LineupInterface\n  cashRewardOnly: Boolean!\n}\ntype PrizePoolPodiumPrize {\n  rank: Int!\n  rarity: CardRarity! @deprecated(reason: \"use cardRarity\")\n  cardRarity: CardRarity\n  tier: Int! @deprecated(reason: \"use cardTier\")\n  cardTier: Int\n  amountUSDCents: Int!\n  lineup: LineupInterface\n  irlPrize: IRLPrize\n  cashRewardOnly: Boolean!\n}\ntype PrizePoolPrizeLevelBoundary {\n  rank: Int!\n  isPercent: Boolean!\n}\ntype ProjectedReward {\n  rarity: CardRarity!\n  tier: Int!\n  amountUSDCents: Int!\n}\ntype Query {\n  currentSportsUser: CurrentSportsUser @deprecated(reason: \"use currentUser\")\n  sportsUser(id: UUID!): User\n  currentUser: CurrentUser\n  league(slug: String!): League\n  openCumulativeLeaderboards(sport: GoSport!): [CumulativeLeaderboard!]!\n    @deprecated(reason: \"use cumulativeLeaderboards\")\n  cumulativeLeaderboards(sport: GoSport!): [CumulativeLeaderboard!]!\n  cumulativeLeaderboardRank(id: UUID!): CumulativeLeaderboardRank\n  requestLeaderboardsNoCardLineup(\n    userID: UUID!\n    id: UUID!\n  ): [NoCardRouteLeaderboard]\n  currentNBAUser: CurrentNBAUser @deprecated(reason: \"use currentSportsUser\")\n  nbaCard(slug: String!): NBACard\n  nbaCards(\n    ids: [ID!]\n    assetIds: [ID!]\n    input: NBACardsInput\n    slugs: [String!]\n  ): [NBACard!]!\n  nbaFixture(slug: String!): NBAFixture\n  nbaLeaderboard(slug: String!): NBALeaderboard\n  nbaLineup(id: UUID!): NBALineup\n  nbaLiveFixture: NBAFixture\n  nbaOpenFixture: NBAFixture\n  nbaPastFixtures(first: Int! = 100, after: String): NBAFixtureConnection!\n  nbaPlayer(slug: String!): NBAPlayer\n  nbaPlayers(slugs: [String!]): [NBAPlayer!]!\n  nbaReferralRewards(referralIDs: [UUID!]!): [NBAReferralReward!]!\n  nbaTeam(slug: String!): NBATeam\n  nbaLeague(slug: String!): NBALeague\n  nbaStarterBundles(ids: [UUID!]!): [NBACardBundleOffer!]!\n  nbaCumulativeLeaderboard(slug: String!): CumulativeLeaderboard\n  baseballCard(slug: String!): BaseballCard\n  baseballCards(\n    slugs: [String!]\n    ids: [String!]\n    assetIds: [String!]\n  ): [BaseballCard!]!\n  baseballFixture(slug: String!): BaseballFixture\n  baseballLeaderboard(slug: String!): BaseballLeaderboard\n  baseballLiveFixture: BaseballFixture\n  baseballOpenFixture: BaseballFixture\n  baseballPastFixtures(\n    first: Int! = 100\n    after: String\n  ): BaseballFixtureConnection!\n  baseballPlayer(slug: String!): BaseballPlayer\n  baseballPlayers(slugs: [String!]): [BaseballPlayer!]!\n  baseballReferralRewards(referralIDs: [UUID!]!): [BaseballReferralReward!]\n  baseballTeam(slug: String!): BaseballTeam\n  baseballLeague(slug: String!): BaseballLeague @deprecated\n  baseballLineup(id: UUID!): BaseballLineup\n  baseballCommonDraftConfig: BaseballCommonDraftConfig!\n  baseballStarterBundles(ids: [UUID!]!): [BaseballCardBundleOffer!]!\n  baseballDailyGames(\n    first: Int! = 100\n    after: String\n    status: DailyGameStatus!\n    day: Time\n  ): BaseballDailyGameConnection!\n  baseballShop: BaseballShop!\n  dhNBALiveGameWeek: DHGameWeek\n  dhBaseballLiveGameWeek: DHGameWeek\n  dhShop: DHShop\n  _entities(representations: [_Any!]!): [_Entity]!\n  _service: _Service!\n}\ntype User implements UserInterface {\n  id: ID!\n  slug: String!\n  nickname: String!\n  avatarUrl: String!\n  suspended: Boolean!\n  nbaCollections(slugsFilter: [String!]): [NBACollection!]!\n  nbaCards(\n    first: Int! = 100\n    after: String\n    positions: [NBAPlayerPosition!]\n    rarities: [CardRarity!]\n  ): NBACardConnection!\n  baseballScoutingMissions: [BaseballScoutingMission!]!\n    @deprecated(reason: \"unsupported\")\n  baseballCollections(slugsFilter: [String!]): [BaseballCollection!]!\n  baseballCards(\n    first: Int! = 100\n    after: String\n    positions: [BaseballPlayerPosition!]\n    rarities: [CardRarity!]\n  ): BaseballCardConnection!\n}\ntype _Service {\n  sdl: String\n}\ninterface CardBundleOffer {\n  id: String!\n  priceUSDCents: Int!\n  cards: [CardInterface!]!\n  expiresAt: Time!\n  leaderboard: LeaderboardInterface\n  rewardPlayerName: String!\n  rank: Int!\n}\ninterface CardInLineupGameScoreInterface {\n  gameStats: PlayerGameStatsInterface!\n}\ninterface CardInLineupInterface {\n  lineup: LineupInterface!\n  card: CardInterface!\n  playerInFixture: PlayerInFixtureInterface!\n  score: Float!\n  totalBonus: Float!\n  gameScores: [CardInLineupGameScoreInterface!]\n}\ninterface CardInterface {\n  id: UUID!\n  slug: String!\n  assetId: ID!\n  owner: User\n  rarity: CardRarity!\n  season: String!\n  serialNumber: Int!\n  fullImageUrl: String!\n  avatarImageUrl: String!\n  player: PlayerInterface!\n  team: SportsTeamInterface\n  cardLevel: Int!\n  xpThresholdForCurrentCardLevel: Int!\n  xpThresholdForNextCardLevel: Int\n  xp: Int!\n  seasonBonus: Float!\n  rarityBonus: Float!\n  xpBonus: Float!\n  totalBonus: Float!\n  bonusLossAfterTransfer: Float!\n  energy: Int\n}\ninterface CardSampleInDailyLineupInterface {\n  lineup: DailyLineupInterface!\n  indexInLineup: Int!\n  cardSample: CommonCardSampleInterface!\n  score: Float!\n  gameScore: CardInLineupGameScoreInterface!\n}\ninterface CardTradeInterface {\n  id: UUID!\n  expiresAfter: Time\n  userGiveCard: CardInterface!\n  userGiveCardUsedInLineup: LineupInterface\n  userReceiveCardChoices: [CommonCardSampleInterface!]!\n  userReceiveCard: CardInterface\n  isComplete: Boolean!\n}\ninterface CollectionInterface {\n  slug: String!\n  isComplete: Boolean!\n  slots: [CollectionSlotInterface!]!\n  slotsCount: Int!\n  filledSlots: Int!\n  team: SportsTeamInterface\n  season: String\n}\ninterface CollectionSlotInterface {\n  requiredPlayer: PlayerInterface!\n  ownedCards: [CardInterface!]\n  displayCard: CardInterface\n}\ninterface CommonCardSampleInterface {\n  id: UUID!\n  player: PlayerInterface!\n  commonCardImageUrl: String!\n}\ninterface DHFixtureInterface {\n  id: String!\n  state: DHFixtureState!\n  games: [GameInterface!]!\n  startDate: Time!\n  endDate: Time!\n  leaderboard: DHLeaderboard\n}\ninterface DHLineupInterface {\n  id: ID!\n  owner: User!\n  cards: [DHCardInLineup!]!\n  leaderboard: DHLeaderboard!\n  rank: Int!\n  score: Float!\n  baseFantasyScore: Float!\n  reward: DHLineupReward\n}\ninterface DailyGameInterface {\n  game: GameInterface!\n  status: DailyGameStatus!\n  lineupsCount: Int!\n  myLineup: DailyLineupInterface\n}\ninterface DailyLineupInterface {\n  id: UUID!\n  cardSamples: [CardSampleInDailyLineupInterface!]!\n  score: Float!\n  rank: Int!\n  user: User!\n}\ninterface FixtureInterface {\n  id: UUID!\n  slug: String!\n  fixtureState: FixtureState!\n  gameWeek: Int!\n  startDate: Time!\n  endDate: Time!\n  games: [GameInterface!]!\n  leaderboards(includeTraining: Boolean): [LeaderboardInterface!]!\n  myEligibleGames: [GameInterface!]!\n  myLiveLineupGames: [GameWithCardInLineupInterface!]!\n  myLineups: [LineupInterface!]!\n  myRecommendedLeaderboards(first: Int! = 3): [LeaderboardInterface!]!\n  myNextProgressionLeaderboards: [LeaderboardInterface!]!\n  nextFixture: FixtureInterface\n  previousFixture: FixtureInterface\n  rewardPool(\n    rarity: BaseballCardRarity\n    cardRarity: CardRarity\n    tier: Int!\n  ): [PlayerInterface!]!\n  rewardPoolCardExamples(\n    cardRarity: CardRarity!\n    tier: Int\n    limit: Int!\n  ): [CardInterface!]!\n}\ninterface GameInterface {\n  id: UUID!\n  status: GameStatus!\n  startDate: Time!\n  homeTeam: SportsTeamInterface!\n  awayTeam: SportsTeamInterface!\n  homeScore: Int!\n  awayScore: Int!\n  gameWeek: Int!\n}\ninterface GameWithCardInLineupInterface {\n  game: GameInterface!\n  homeCardsInLineups: [CardInLineupInterface!]!\n  awayCardsInLineups: [CardInLineupInterface!]!\n}\ninterface LeaderboardInterface {\n  id: UUID!\n  slug: String!\n  displayName: String!\n  descriptions: [String]!\n  displayNameWithoutRarity: String!\n  lineupsCount: Int!\n  myRecentLineup: LineupInterface\n  prizePool: LeaderboardPrizePool!\n  isUserEligible: Boolean!\n  isTraining: Boolean!\n  iconImageUrl: String!\n  monochromeIconImageUrl: String!\n  fixture: FixtureInterface!\n  requirements: LeaderboardRequirementsInterface!\n  leaderboardRarity: LeaderboardRarity!\n  beginnerLeaderboardDetails: BeginnerLeaderboardDetails\n  scoringStrategy: String!\n  inLeague(slug: String!): LeagueLeaderboardInterface!\n  league(slug: String!): LeagueLeaderboard!\n  cumulativeLeaderboard: CumulativeLeaderboard\n  isUltimate: Boolean!\n}\ninterface LeaderboardRequirementsInterface {\n  allowedRarities: [CardRarity!]!\n  minRarity: LeaderboardRulesMinimumRarityRequirement\n  minRookieCount: Int!\n  playerAgeRequirements: PlayerAgeRequirements\n  marketplaceQueryParameters: String\n}\ninterface LeagueInterface {\n  id: String!\n  slug: String!\n  name: String!\n  members: [User!]!\n}\ninterface LeagueLeaderboardInterface {\n  league: LeagueInterface!\n  leaderboard: LeaderboardInterface!\n  lineupCount: Int!\n  lineups: [LeagueLineupInterface!]!\n  participants: [User!]!\n}\ninterface LeagueLineupInterface {\n  rank: Int!\n  lineup: LineupInterface!\n  leaderboard: LeagueLeaderboardInterface!\n}\ninterface LineupInterface {\n  id: UUID!\n  leaderboard: LeaderboardInterface!\n  cards: [CardInLineupInterface!]!\n  games: [GameWithCardInLineupInterface!]!\n  score: Float!\n  rank: Int!\n  user: User!\n  xpScore: Float! @deprecated\n  projectedReward: ProjectedReward\n  reward: RewardInterface\n  accoladeString: String\n}\ninterface PlayerGameStatsInterface {\n  playedInGame: Boolean!\n  game: GameInterface!\n  team: SportsTeamInterface!\n  againstTeam: SportsTeamInterface!\n}\ninterface PlayerInFixtureInterface {\n  fixture: FixtureInterface!\n  player: PlayerInterface!\n  status: PlayerInFixtureStatusInterface!\n}\ninterface PlayerInFixtureStatusInterface {\n  gameStats: [PlayerGameStatsInterface!]!\n  upcomingGames: [GameInterface!]!\n  inGame: Boolean!\n  isScoreFinal: Boolean!\n  statusIconType: PlayerInFixtureStatusIconType!\n  hasTBDGames: Boolean!\n}\ninterface PlayerInterface {\n  id: UUID!\n  slug: String!\n  birthDate: Time!\n  age: Int!\n  displayName: String!\n  firstName: String!\n  lastName: String!\n  avatarImageUrl: String!\n  team: SportsTeamInterface\n  birthPlaceCountry: String!\n  shirtNumber: Int!\n  isActive: Boolean!\n  playerInjury: PlayerInjury\n  croppedPictureUrl: String!\n}\ninterface ReferralRewardInterface {\n  id: UUID!\n  card: CardInterface!\n  state: RewardState!\n}\ninterface RewardInterface {\n  id: UUID!\n  card: CardInterface!\n  backImageUrl: String!\n  tier: Int!\n  lineup: LineupInterface!\n  state: RewardState!\n}\ninterface SportsNode {\n  id: UUID!\n}\ninterface SportsTeamInterface {\n  id: UUID!\n  name: String!\n  market: String!\n  fullName: String!\n  abbreviation: String!\n  slug: String!\n  svgUrl: String!\n  monochromeSvgUrl: String!\n  teamStyleGuidePrimaryColor: HexColorCode!\n  players: [PlayerInterface!]!\n}\ninterface UserInterface {\n  id: ID!\n  slug: String!\n  nickname: String!\n}\ninterface UserItem {\n  title: String!\n  description: String!\n  imageURL: String!\n  id: UUID!\n  state: UserItemState!\n}\nunion DHShopItem = DHMVPCardOption | DHTrickPlayPack | DHCommonCardPack\nunion _Entity = BaseballCard | CurrentUser | NBACard | User\nenum BaseballBuyShopItemError {\n  INSUFFICIENT_COINS\n  ITEM_UNAVAILABLE\n}\nenum BaseballCardRarity {\n  unique\n  super_rare\n  rare\n  limited\n  common\n}\nenum BaseballCommonDraftAutofillSuggestionsError {\n  NOT_ENOUGH_BUDGET\n}\nenum BaseballComposeLineupCardsScoreSortOrder {\n  SEASON_AVERAGE_SCORE\n  LAST_15_AVERAGE_SCORE\n}\nenum BaseballConference {\n  AMERICAN\n  NATIONAL\n}\nenum BaseballCreateOrUpdateLineupValidationError {\n  MISSING_PITCHER_AT_REQUIRED_RARITY\n  ALLOWED_RARITIES_VIOLATION\n  MIN_RARITY_VIOLATION\n}\nenum BaseballInningHalf {\n  TOP\n  BOTTOM\n}\nenum BaseballItemCategory {\n  BOOST\n  CARD_TRADE\n}\nenum BaseballOnboardingState {\n  SIGNED_UP\n  RECEIVED_ONBOARDING_CARDS\n  COMPOSED_FIRST_LINEUP\n  CLAIMED_FIRST_REWARD\n  COMPOSED_SECOND_LINEUP\n  ONBOARDED\n}\nenum BaseballPlayerFixtureStatsPosition {\n  STARTING_PITCHER\n  RELIEF_PITCHER\n  CORNER_INFIELDER\n  MIDDLE_INFIELDER\n  OUTFIELDER\n}\nenum BaseballPlayerLineupPosition {\n  STARTING_PITCHER\n  RELIEF_PITCHER\n  CORNER_INFIELDER\n  MIDDLE_INFIELDER\n  OUTFIELDER\n}\nenum BaseballPlayerPosition {\n  STARTING_PITCHER\n  RELIEF_PITCHER\n  FIRST_BASE\n  THIRD_BASE\n  DESIGNATED_HITTER\n  CATCHER\n  SECOND_BASE\n  SHORTSTOP\n  OUTFIELD\n}\nenum BaseballSubmitCommonDraftValidationError {\n  INVALID_POSITION_SELECTION\n  OVER_MAX_TOTAL_COST\n  OVER_SAME_TEAM_LIMIT\n  DUPLICATE_PLAYER\n  INELIGIBLE_PLAYER\n}\nenum CardRarity {\n  unique\n  super_rare\n  rare\n  limited\n  common\n}\nenum DHBoostTarget {\n  HITTER\n  STARTING_PITCHER\n}\nenum DHBoostType {\n  SLUGGER\n  THIEF\n  WORKHORSE\n  STRIKEOUT_ARTIST\n}\nenum DHChallengeState {\n  CLAIMED\n  AVAILABLE\n  LOCKED\n}\nenum DHFixtureState {\n  LIVE\n  CLOSED\n}\nenum DHOnboardingTask {\n  NO_TASK\n  SELECT_MVP\n}\nenum DHSubmitLineupValidationError {\n  INSUFFICIENT_COIN_BALANCE\n}\nenum DHTrickPlayStyle {\n  AGGRESSIVE\n  BALANCED\n  CONSERVATIVE\n}\nenum DailyGameStatus {\n  UPCOMING\n  LIVE\n  PAST\n}\nenum FixtureState {\n  opened\n  started\n  closed\n}\nenum GameStatus {\n  scheduled\n  playing\n  played\n  canceled\n  delayed\n  postponed\n  suspended\n}\nenum GoSport {\n  NBA @deprecated(reason: \"use Sport.NBA instead\")\n  BASEBALL @deprecated(reason: \"use Sport.BASEBALL instead\")\n}\nenum GradualOnboardingPhase {\n  NONE\n  CLAIM_FIRST_COMMON_CARDS\n  FIRST_OPEN_FIXTURE\n  FIRST_LIVE_FIXTURE\n  SECOND_OPEN_FIXTURE\n  SECOND_LIVE_FIXTURE\n  FIRST_LIMITED_LEADERBOARD\n}\nenum IRLPrizeType {\n  TICKETS\n  GIFT_CARD\n  JERSEY\n  MEMORABILIA\n  TV_SUBSCRIPTION\n}\nenum LeaderboardRarity {\n  COMMON\n  LIMITED\n  RARE\n  SUPER_RARE\n  UNIQUE\n  MIXED\n}\nenum LeagueType {\n  PRIVATE\n  AFFILIATE\n  SMALL\n}\nenum NBAConference {\n  EASTERN\n  WESTERN\n}\nenum NBACreateOrUpdateLineupValidationError {\n  ALLOWED_RARITIES_VIOLATION\n  MIN_RARITY_VIOLATION\n}\nenum NBAOnboardingTask {\n  NO_TASK\n  SELECT_STARTER_CARD\n}\nenum NBAPlayerPosition {\n  NBA_GUARD\n  NBA_FORWARD\n  NBA_CENTER\n}\nenum PlayerFixtureStatsSortOrder {\n  SCORE\n  OUTPERFORMANCE\n}\nenum PlayerInFixtureStatusIconType {\n  FINAL_SCORE\n  IN_PROGRESS_SCORE\n  PENDING\n  NO_GAME\n  DID_NOT_PLAY\n  INACTIVE\n  TBD\n}\nenum PlayerOwnershipFilterType {\n  UNOWNED\n  OWNED\n}\nenum RewardState {\n  CLAIMED\n  UNCLAIMED\n}\nenum Sport {\n  FOOTBALL\n  BASEBALL\n  NBA\n}\nenum UserItemState {\n  AVAILABLE\n  APPLIED\n  CONSUMED\n}\ninput BaseballCardsInput {\n  ids: [UUID!]\n  assetIds: [ID!]\n}\ninput BaseballCreateOrUpdateDailyLineupInput {\n  lineupId: UUID\n  gameId: UUID!\n  playerSlugs: [String!]!\n}\ninput BaseballCreateOrUpdateLineupInput {\n  lineupId: UUID\n  leaderboardSlug: String!\n  cardSlugs: [String!]!\n}\ninput BaseballDeleteLineupInput {\n  lineupId: UUID!\n}\ninput BaseballPlayerFixtureStatsInput {\n  position: BaseballPlayerFixtureStatsPosition!\n  first: Int! = 100\n  after: String\n  playerOwnershipFilter: PlayerOwnershipFilter\n}\ninput BaseballSubmitCommonDraftInput {\n  selectedPlayerSlugs: [String!]!\n}\ninput DHBaseballCompleteOnboardingTaskInput {\n  task: DHOnboardingTask!\n  selectedMVPPlayerID: UUID\n}\ninput DHBaseballSubmitLineupInput {\n  leaderboardID: String!\n  cardSlugs: [String!]!\n  boost: DHBoostSubmission!\n}\ninput DHBoostSubmission {\n  type: DHBoostType!\n}\ninput DHNBACompleteOnboardingTaskInput {\n  task: DHOnboardingTask!\n  selectedMVPPlayerID: UUID\n}\ninput DHNBASubmitLineupInput {\n  leaderboardID: String!\n  cardSlugs: [String!]!\n  trickPlay: DHTrickPlaySubmission!\n}\ninput DHTrickPlaySubmission {\n  type: String!\n  style: DHTrickPlayStyle!\n}\ninput NBACardsInput {\n  ids: [UUID!]\n  assetIds: [ID!]\n}\ninput NBACompleteOnboardingTaskInput {\n  task: NBAOnboardingTask!\n  selectedCardPlayerId: UUID\n}\ninput NBACreateOrUpdateLineupInput {\n  lineupId: UUID\n  leaderboardSlug: String!\n  cardSlugs: [String!]!\n}\ninput NBADeleteLineupInput {\n  lineupId: UUID!\n}\ninput PlayerOwnershipFilter {\n  rarity: CardRarity!\n  filterType: PlayerOwnershipFilterType!\n}\ndirective @authRequired on FIELD_DEFINITION\ndirective @complexity(multipliers: [String!], fixed: Int) on FIELD_DEFINITION\ndirective @extends on OBJECT | INTERFACE\ndirective @external on FIELD_DEFINITION\ndirective @featureFlag(flag: String) on FIELD_DEFINITION\ndirective @hidden on FIELD_DEFINITION | OBJECT | ENUM | INPUT_OBJECT | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION | UNION | INTERFACE\ndirective @inaccessible on SCALAR | OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | INTERFACE | UNION | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION\ndirective @key(\n  fields: _FieldSet!\n  resolvable: Boolean = true\n) on OBJECT | INTERFACE\ndirective @link(import: [String!], url: String!) on SCHEMA\ndirective @nestingAllowed on FIELD_DEFINITION\ndirective @notProd on FIELD_DEFINITION\ndirective @override(from: String!) on FIELD_DEFINITION\ndirective @provides(fields: _FieldSet!) on FIELD_DEFINITION\ndirective @requires(fields: _FieldSet!) on FIELD_DEFINITION\ndirective @shareable on OBJECT | FIELD_DEFINITION\n\"The @specifiedBy built-in directive is used within the type system definition language to provide a scalar specification URL for specifying the behavior of custom scalar types.\"\ndirective @specifiedBy(url: String!) on SCALAR\ndirective @tag(\n  name: String!\n) on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/__tests__/merge-ast.spec.ts",
    "content": "import {\n  GraphQLInt,\n  GraphQLObjectType,\n  GraphQLSchema,\n  buildSchema,\n  parse,\n  print,\n} from 'graphql';\n\nimport { mergeAst } from '../merge-ast';\nimport fs from 'node:fs';\nimport path from 'node:path';\nconst schema = new GraphQLSchema({\n  query: new GraphQLObjectType({\n    name: 'Test',\n    fields: {\n      id: {\n        type: GraphQLInt,\n      },\n    },\n  }),\n});\n\ndescribe('MergeAst', () => {\n  it('does not modify query with no fragments', () => {\n    const query = /* GraphQL */ `\n      query Test {\n        id\n      }\n    `;\n    const mergedQuery = stripWhitespace(/* GraphQL */ `\n      query Test {\n        id\n      }\n    `);\n    expect(parseMergeAndPrint(query)).toBe(mergedQuery);\n    expect(parseMergeAndPrint(query, schema)).toBe(mergedQuery);\n  });\n\n  it('does inline simple nested fragment', () => {\n    const query = /* GraphQL */ `\n      query Test {\n        ...Fragment1\n      }\n\n      fragment Fragment1 on Test {\n        id\n      }\n    `;\n    const mergedQuery = stripWhitespace(/* GraphQL */ `\n      query Test {\n        ... on Test {\n          id\n        }\n      }\n    `);\n    const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `\n      query Test {\n        id\n      }\n    `);\n    expect(parseMergeAndPrint(query)).toBe(mergedQuery);\n    expect(parseMergeAndPrint(query, schema)).toBe(mergedQueryWithSchema);\n  });\n\n  it('does inline triple nested fragment', () => {\n    const query = /* GraphQL */ `\n      query Test {\n        ...Fragment1\n      }\n\n      fragment Fragment1 on Test {\n        ...Fragment2\n      }\n\n      fragment Fragment2 on Test {\n        ...Fragment3\n      }\n\n      fragment Fragment3 on Test {\n        id\n      }\n    `;\n    const mergedQuery = stripWhitespace(/* GraphQL */ `\n      query Test {\n        ... on Test {\n          ... on Test {\n            ... on Test {\n              id\n            }\n          }\n        }\n      }\n    `);\n    const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `\n      query Test {\n        id\n      }\n    `);\n    expect(parseMergeAndPrint(query)).toBe(mergedQuery);\n    expect(parseMergeAndPrint(query, schema)).toBe(mergedQueryWithSchema);\n  });\n\n  it('does inline multiple fragments', () => {\n    const query = /* GraphQL */ `\n      query Test {\n        ...Fragment1\n        ...Fragment2\n        ...Fragment3\n      }\n\n      fragment Fragment1 on Test {\n        id\n      }\n\n      fragment Fragment2 on Test {\n        id\n      }\n\n      fragment Fragment3 on Test {\n        id\n      }\n    `;\n    const mergedQuery = stripWhitespace(/* GraphQL */ `\n      query Test {\n        ... on Test {\n          id\n        }\n        ... on Test {\n          id\n        }\n        ... on Test {\n          id\n        }\n      }\n    `);\n    const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `\n      query Test {\n        id\n      }\n    `);\n    expect(parseMergeAndPrint(query)).toBe(mergedQuery);\n    expect(parseMergeAndPrint(query, schema)).toBe(mergedQueryWithSchema);\n  });\n\n  it('removes duplicate fragment spreads', () => {\n    const query = /* GraphQL */ `\n      query Test {\n        ...Fragment1\n        ...Fragment1\n      }\n\n      fragment Fragment1 on Test {\n        id\n      }\n    `;\n    const mergedQuery = stripWhitespace(/* GraphQL */ `\n      query Test {\n        ... on Test {\n          id\n        }\n      }\n    `);\n    const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `\n      query Test {\n        id\n      }\n    `);\n    expect(parseMergeAndPrint(query)).toBe(mergedQuery);\n    expect(parseMergeAndPrint(query, schema)).toBe(mergedQueryWithSchema);\n  });\n\n  it('handles very complex query without crashing', async () => {\n    // graphQLVersion = pkg.version;\n    const schemaIDL = fs.readFileSync(\n      path.join(__dirname, '__schema__/sorareSchema.graphql'),\n      'utf8',\n    );\n\n    const sorareSchema = buildSchema(schemaIDL);\n\n    // graphQLVersion = pkg.version;\n    const query = fs.readFileSync(\n      path.join(__dirname, '__queries__/testQuery.graphql'),\n      'utf8',\n    );\n    // graphQLVersion = pkg.version;\n    const mergedQuery = stripWhitespace(\n      fs.readFileSync(\n        path.join(__dirname, '__queries__/mergedQuery.graphql'),\n        'utf8',\n      ),\n    );\n    // graphQLVersion = pkg.version;\n    const mergedQueryWithSchema = stripWhitespace(\n      fs.readFileSync(\n        path.join(__dirname, '__queries__/mergedQueryWithSchema.graphql'),\n        'utf8',\n      ),\n    );\n\n    expect(removeParametersCommas(parseMergeAndPrint(query))).toBe(mergedQuery);\n    expect(parseMergeAndPrint(query, sorareSchema)).toBe(mergedQueryWithSchema);\n  });\n});\n\nfunction parseMergeAndPrint(query: string, maybeSchema?: GraphQLSchema) {\n  return stripWhitespace(print(mergeAst(parse(query), maybeSchema)));\n}\n\nfunction stripWhitespace(str: string) {\n  return str.replaceAll(/\\s/g, '');\n}\n\nfunction removeParametersCommas(str: string) {\n  return str.replaceAll(',', '');\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/auto-complete.ts",
    "content": "import {\n  DocumentNode,\n  getNamedType,\n  GraphQLOutputType,\n  GraphQLSchema,\n  GraphQLType,\n  isLeafType,\n  Kind,\n  parse,\n  print,\n  SelectionSetNode,\n  TypeInfo,\n  visit,\n} from 'graphql';\n\ntype Insertion = {\n  index: number;\n  string: string;\n};\n\nexport type GetDefaultFieldNamesFn = (type: GraphQLType) => string[];\n\n/**\n * Given a document string which may not be valid due to terminal fields not\n * representing leaf values (Spec Section: \"Leaf Field Selections\"), and a\n * function which provides reasonable default field names for a given type,\n * this function will attempt to produce a schema which is valid after filling\n * in selection sets for the invalid fields.\n *\n * Note that there is no guarantee that the result will be a valid query, this\n * utility represents a \"best effort\" which may be useful within IDE tools.\n */\nexport function fillLeafs(\n  schema?: GraphQLSchema | null,\n  docString?: string,\n  getDefaultFieldNames?: GetDefaultFieldNamesFn,\n) {\n  const insertions: Insertion[] = [];\n\n  if (!schema || !docString) {\n    return { insertions, result: docString };\n  }\n\n  let ast: DocumentNode;\n  try {\n    ast = parse(docString);\n  } catch {\n    return { insertions, result: docString };\n  }\n\n  const fieldNameFn = getDefaultFieldNames || defaultGetDefaultFieldNames;\n  const typeInfo = new TypeInfo(schema);\n  visit(ast, {\n    leave(node) {\n      typeInfo.leave(node);\n    },\n    enter(node) {\n      typeInfo.enter(node);\n      if (node.kind === 'Field' && !node.selectionSet) {\n        const fieldType = typeInfo.getType();\n        const selectionSet = buildSelectionSet(\n          isFieldType(fieldType) as GraphQLOutputType,\n          fieldNameFn,\n        );\n        if (selectionSet && node.loc) {\n          const indent = getIndentation(docString, node.loc.start);\n          insertions.push({\n            index: node.loc.end,\n            string: ' ' + print(selectionSet).replaceAll('\\n', '\\n' + indent),\n          });\n        }\n      }\n    },\n  });\n\n  // Apply the insertions, but also return the insertions metadata.\n  return {\n    insertions,\n    result: withInsertions(docString, insertions),\n  };\n}\n\n// The default function to use for producing the default fields from a type.\n// This function first looks for some common patterns, and falls back to\n// including all leaf-type fields.\nfunction defaultGetDefaultFieldNames(type: GraphQLType) {\n  // If this type cannot access fields, then return an empty set.\n  // if (!type.getFields) {\n  if (!('getFields' in type)) {\n    return [];\n  }\n\n  const fields = type.getFields();\n\n  // Is there an `id` field?\n  if (fields.id) {\n    return ['id'];\n  }\n\n  // Is there an `edges` field?\n  if (fields.edges) {\n    return ['edges'];\n  }\n\n  // Is there an `node` field?\n  if (fields.node) {\n    return ['node'];\n  }\n\n  // Include all leaf-type fields.\n  const leafFieldNames: Array<string> = [];\n  for (const fieldName of Object.keys(fields)) {\n    if (isLeafType(fields[fieldName].type)) {\n      leafFieldNames.push(fieldName);\n    }\n  }\n  return leafFieldNames;\n}\n\n// Given a GraphQL type, and a function which produces field names, recursively\n// generate a SelectionSet which includes default fields.\nfunction buildSelectionSet(\n  type: GraphQLOutputType,\n  getDefaultFieldNames: GetDefaultFieldNamesFn,\n): SelectionSetNode | undefined {\n  // Unwrap any non-null or list types.\n  const namedType = getNamedType(type);\n\n  // Unknown types and leaf types do not have selection sets.\n  if (!type || isLeafType(type)) {\n    return;\n  }\n\n  // Get an array of field names to use.\n  const fieldNames = getDefaultFieldNames(namedType);\n\n  // If there are no field names to use, return no selection set.\n  if (\n    !Array.isArray(fieldNames) ||\n    fieldNames.length === 0 ||\n    !('getFields' in namedType)\n  ) {\n    return;\n  }\n\n  // Build a selection set of each field, calling buildSelectionSet recursively.\n  return {\n    kind: Kind.SELECTION_SET,\n    selections: fieldNames.map(fieldName => {\n      const fieldDef = namedType.getFields()[fieldName];\n      const fieldType = fieldDef ? fieldDef.type : null;\n      return {\n        kind: Kind.FIELD,\n        name: {\n          kind: Kind.NAME,\n          value: fieldName,\n        },\n        // we can use as here, because we already know that fieldType\n        // comes from an origin parameter\n        selectionSet: buildSelectionSet(fieldType!, getDefaultFieldNames),\n      };\n    }),\n  };\n}\n\n// Given an initial string, and a list of \"insertion\" { index, string } objects,\n// return a new string with these insertions applied.\nfunction withInsertions(initial: string, insertions: Insertion[]) {\n  if (insertions.length === 0) {\n    return initial;\n  }\n  let edited = '';\n  let prevIndex = 0;\n  for (const { index, string } of insertions) {\n    edited += initial.slice(prevIndex, index) + string;\n    prevIndex = index;\n  }\n  edited += initial.slice(prevIndex);\n  return edited;\n}\n\n// Given a string and an index, look backwards to find the string of whitespace\n// following the next previous line break.\nfunction getIndentation(str: string, index: number) {\n  let indentStart = index;\n  let indentEnd = index;\n  while (indentStart) {\n    const c = str.charCodeAt(indentStart - 1);\n    // line break\n    if (c === 10 || c === 13 || c === 0x2028 || c === 0x2029) {\n      break;\n    }\n    indentStart--;\n    // not white space\n    if (c !== 9 && c !== 11 && c !== 12 && c !== 32 && c !== 160) {\n      indentEnd = indentStart;\n    }\n  }\n  return str.slice(indentStart, indentEnd);\n}\n\nfunction isFieldType(\n  fieldType?: GraphQLOutputType | null,\n): GraphQLOutputType | void {\n  if (fieldType) {\n    return fieldType;\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/index.ts",
    "content": "export * from './auto-complete';\nexport * from './merge-ast';\nexport * from './operation-name';\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/merge-ast.ts",
    "content": "import {\n  DocumentNode,\n  FieldNode,\n  FragmentDefinitionNode,\n  GraphQLOutputType,\n  GraphQLSchema,\n  SelectionNode,\n  TypeInfo,\n  getNamedType,\n  visit,\n  visitWithTypeInfo,\n  ASTVisitor,\n  Kind,\n} from 'graphql';\n\nfunction uniqueBy<T>(\n  array: readonly SelectionNode[],\n  iteratee: (item: FieldNode) => T,\n) {\n  const FilteredMap = new Map<T, FieldNode>();\n  const result: SelectionNode[] = [];\n  for (const item of array) {\n    if (item.kind === 'Field') {\n      const uniqueValue = iteratee(item);\n      const existing = FilteredMap.get(uniqueValue);\n      if (item.directives?.length) {\n        // Cannot inline fields with directives (yet)\n        const itemClone = { ...item };\n        result.push(itemClone);\n      } else if (existing?.selectionSet && item.selectionSet) {\n        // Merge the selection sets\n        existing.selectionSet.selections = [\n          ...existing.selectionSet.selections,\n          ...item.selectionSet.selections,\n        ];\n      } else if (!existing) {\n        const itemClone = { ...item };\n        FilteredMap.set(uniqueValue, itemClone);\n        result.push(itemClone);\n      }\n    } else {\n      result.push(item);\n    }\n  }\n  return result;\n}\n\nfunction inlineRelevantFragmentSpreads(\n  fragmentDefinitions: {\n    [key: string]: FragmentDefinitionNode | undefined;\n  },\n  selections: readonly SelectionNode[],\n  selectionSetType?: GraphQLOutputType | null,\n): readonly SelectionNode[] {\n  const selectionSetTypeName = selectionSetType\n    ? getNamedType(selectionSetType).name\n    : null;\n  const outputSelections = [];\n  const seenSpreads: string[] = [];\n  for (let selection of selections) {\n    if (selection.kind === 'FragmentSpread') {\n      const fragmentName = selection.name.value;\n      if (!selection.directives || selection.directives.length === 0) {\n        if (seenSpreads.includes(fragmentName)) {\n          /* It's a duplicate - skip it! */\n          continue;\n        } else {\n          seenSpreads.push(fragmentName);\n        }\n      }\n      const fragmentDefinition = fragmentDefinitions[selection.name.value];\n      if (fragmentDefinition) {\n        const { typeCondition, directives, selectionSet } = fragmentDefinition;\n        selection = {\n          kind: Kind.INLINE_FRAGMENT,\n          typeCondition,\n          directives,\n          selectionSet,\n        };\n      }\n    }\n    if (\n      selection.kind === Kind.INLINE_FRAGMENT &&\n      // Cannot inline if there are directives\n      (!selection.directives || selection.directives?.length === 0)\n    ) {\n      const fragmentTypeName = selection.typeCondition\n        ? selection.typeCondition.name.value\n        : null;\n      if (!fragmentTypeName || fragmentTypeName === selectionSetTypeName) {\n        outputSelections.push(\n          ...inlineRelevantFragmentSpreads(\n            fragmentDefinitions,\n            selection.selectionSet.selections,\n            selectionSetType,\n          ),\n        );\n        continue;\n      }\n    }\n    outputSelections.push(selection);\n  }\n  return outputSelections;\n}\n\n/**\n * Given a document AST, inline all named fragment definitions.\n */\nexport function mergeAst(\n  documentAST: DocumentNode,\n  schema?: GraphQLSchema | null,\n): DocumentNode {\n  // If we're given the schema, we can simplify even further by resolving object\n  // types vs unions/interfaces\n  const typeInfo = schema ? new TypeInfo(schema) : null;\n\n  const fragmentDefinitions: {\n    [key: string]: FragmentDefinitionNode | undefined;\n  } = Object.create(null);\n\n  for (const definition of documentAST.definitions) {\n    if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n      fragmentDefinitions[definition.name.value] = definition;\n    }\n  }\n\n  const flattenVisitors: ASTVisitor = {\n    SelectionSet(node: any) {\n      const selectionSetType = typeInfo ? typeInfo.getParentType() : null;\n      let { selections } = node;\n\n      selections = inlineRelevantFragmentSpreads(\n        fragmentDefinitions,\n        selections,\n        selectionSetType,\n      );\n\n      return {\n        ...node,\n        selections,\n      };\n    },\n    FragmentDefinition() {\n      return null;\n    },\n  };\n\n  const flattenedAST = visit(\n    documentAST,\n    typeInfo ? visitWithTypeInfo(typeInfo, flattenVisitors) : flattenVisitors,\n  );\n\n  const deduplicateVisitors: ASTVisitor = {\n    SelectionSet(node: any) {\n      let { selections } = node;\n\n      selections = uniqueBy(selections, selection =>\n        selection.alias ? selection.alias.value : selection.name.value,\n      );\n\n      return {\n        ...node,\n        selections,\n      };\n    },\n    FragmentDefinition() {\n      return null;\n    },\n  };\n\n  return visit(flattenedAST, deduplicateVisitors);\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/graphql-helpers/operation-name.ts",
    "content": "import { OperationDefinitionNode } from 'graphql';\n\n/**\n * Provided optional previous operations and selected name, and a next list of\n * operations, determine what the next selected operation should be.\n */\nexport function getSelectedOperationName(\n  prevOperations?: OperationDefinitionNode[],\n  prevSelectedOperationName?: string,\n  operations?: OperationDefinitionNode[],\n) {\n  // If there are not enough operations to bother with, return nothing.\n  if (!operations || operations.length < 1) {\n    return;\n  }\n\n  // If a previous selection still exists, continue to use it.\n  const names = operations.map(op => op.name?.value);\n  if (prevSelectedOperationName && names.includes(prevSelectedOperationName)) {\n    return prevSelectedOperationName;\n  }\n\n  // If a previous selection was the Nth operation, use the same Nth.\n  if (prevSelectedOperationName && prevOperations) {\n    const prevNames = prevOperations.map(op => op.name?.value);\n    const prevIndex = prevNames.indexOf(prevSelectedOperationName);\n    if (prevIndex !== -1 && prevIndex < names.length) {\n      return names[prevIndex];\n    }\n  }\n\n  // Use the first operation.\n  return names[0];\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/index.ts",
    "content": "export * from './async-helpers';\nexport * from './create-fetcher';\nexport * from './format';\nexport * from './graphql-helpers';\nexport * from './storage';\n// TODO: move the most useful utilities from graphiql to here\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/__tests__/base.spec.ts",
    "content": "import { StorageAPI } from '../base';\n\ndescribe('StorageAPI', () => {\n  let storage = new StorageAPI();\n\n  beforeEach(() => {\n    storage = new StorageAPI();\n  });\n\n  it('returns nothing if no value set', () => {\n    const result = storage.get('key1');\n    expect(result).toBeNull();\n  });\n\n  it('sets and gets a value correctly', () => {\n    const result = storage.set('key2', 'value');\n    expect(result).toEqual({\n      error: null,\n      isQuotaError: false,\n    });\n\n    const newResult = storage.get('key2');\n    expect(newResult).toEqual('value');\n  });\n\n  it('sets and removes a value correctly', () => {\n    let result = storage.set('key3', 'value');\n    expect(result).toEqual({\n      error: null,\n      isQuotaError: false,\n    });\n\n    result = storage.set('key3', '');\n    expect(result).toEqual({\n      error: null,\n      isQuotaError: false,\n    });\n\n    const getResult = storage.get('key3');\n    expect(getResult).toBeNull();\n  });\n\n  it('sets and overrides a value correctly', () => {\n    let result = storage.set('key4', 'value');\n    expect(result).toEqual({\n      error: null,\n      isQuotaError: false,\n    });\n\n    result = storage.set('key4', 'value2');\n    expect(result).toEqual({\n      error: null,\n      isQuotaError: false,\n    });\n\n    const getResult = storage.get('key4');\n    expect(getResult).toEqual('value2');\n  });\n\n  it('cleans up `null` value', () => {\n    storage.set('key5', 'null');\n    const result = storage.get('key5');\n    expect(result).toBeNull();\n  });\n\n  it('cleans up `undefined` value', () => {\n    storage.set('key6', 'undefined');\n    const result = storage.get('key6');\n    expect(result).toBeNull();\n  });\n\n  it('returns any error while setting a value', () => {\n    // @ts-expect-error\n    const throwingStorage = new StorageAPI({\n      setItem() {\n        throw new DOMException('Terrible Error');\n      },\n      length: 1,\n    });\n    const result = throwingStorage.set('key', 'value');\n\n    expect(result.error!.message).toEqual('Error: Terrible Error');\n    expect(result.isQuotaError).toBe(false);\n  });\n\n  it('returns isQuotaError to true if isQuotaError is thrown', () => {\n    // @ts-expect-error\n    const throwingStorage = new StorageAPI({\n      setItem() {\n        throw new DOMException('Terrible Error', 'QuotaExceededError');\n      },\n      length: 1,\n    });\n    const result = throwingStorage.set('key', 'value');\n\n    expect(result.error!.message).toEqual('QuotaExceededError: Terrible Error');\n    expect(result.isQuotaError).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/__tests__/query.spec.ts",
    "content": "import { StorageAPI } from '../base';\nimport { QueryStore } from '../query';\n\nclass StorageMock {\n  shouldThrow: () => boolean;\n  // @ts-expect-error\n  count: number;\n  map = {};\n  // @ts-expect-error\n  storage: Storage;\n\n  constructor(shouldThrow: () => boolean) {\n    this.shouldThrow = shouldThrow;\n  }\n\n  set(key: string, value: string) {\n    this.count++;\n\n    if (this.shouldThrow()) {\n      return {\n        error: new Error('boom'),\n        isQuotaError: true,\n      };\n    }\n    // @ts-expect-error\n    this.map[key] = value;\n\n    return {\n      error: null,\n      isQuotaError: false,\n    };\n  }\n\n  get(key: string) {\n    // @ts-expect-error\n    return this.map[key] || null;\n  }\n}\n\ndescribe('QueryStore', () => {\n  describe('with no max items', () => {\n    it('can push multiple items', () => {\n      const store = new QueryStore('normal', new StorageAPI());\n\n      for (let i = 0; i < 100; i++) {\n        store.push({ query: `item${i}` });\n      }\n\n      expect(store.items.length).toBe(100);\n    });\n\n    it('will fail silently on quota error', () => {\n      let i = 0;\n      // @ts-expect-error\n      const store = new QueryStore('normal', new StorageMock(() => i > 4));\n\n      for (; i < 10; i++) {\n        store.push({ query: `item${i}` });\n      }\n\n      expect(store.items.length).toBe(5);\n      expect(store.items[0].query).toBe('item0');\n      expect(store.items[4].query).toBe('item4');\n    });\n  });\n\n  describe('with max items', () => {\n    it('can push a limited number of items', () => {\n      const store = new QueryStore('limited', new StorageAPI(), 20);\n\n      for (let i = 0; i < 100; i++) {\n        store.push({ query: `item${i}` });\n      }\n\n      expect(store.items.length).toBe(20);\n      // keeps the more recent items\n      expect(store.items[0].query).toBe('item80');\n      expect(store.items[19].query).toBe('item99');\n    });\n\n    it('tries to remove on quota error until it succeeds', () => {\n      let shouldThrow: () => boolean;\n      let retryCounter = 0;\n      const store = new QueryStore(\n        'normal',\n        // @ts-expect-error\n        new StorageMock(() => {\n          retryCounter++;\n          return shouldThrow();\n        }),\n        10,\n      );\n\n      for (let i = 0; i < 20; i++) {\n        shouldThrow = () => false;\n        store.push({ query: `item${i}` });\n      }\n\n      expect(store.items.length).toBe(10);\n      // keeps the more recent items\n      expect(store.items[0].query).toBe('item10');\n      expect(store.items[9].query).toBe('item19');\n\n      // tries to add an item, succeeds on 3rd try\n      retryCounter = 0;\n      shouldThrow = () => retryCounter < 3;\n      store.push({ query: 'finalItem' });\n\n      expect(store.items.length).toBe(8);\n      expect(store.items[0].query).toBe('item13');\n      expect(store.items[7].query).toBe('finalItem');\n    });\n\n    it('tries to remove a maximum of 5 times', () => {\n      let shouldThrow: () => boolean;\n      let retryCounter = 0;\n      const store = new QueryStore(\n        'normal',\n        // @ts-expect-error\n        new StorageMock(() => {\n          retryCounter++;\n          return shouldThrow();\n        }),\n        10,\n      );\n\n      for (let i = 0; i < 20; i++) {\n        shouldThrow = () => false;\n        store.push({ query: `item${i}` });\n      }\n\n      expect(store.items.length).toBe(10);\n      // keeps the more recent items\n      expect(store.items[0].query).toBe('item10');\n      expect(store.items[9].query).toBe('item19');\n\n      // tries to add an item, keeps failing\n      retryCounter = 0;\n      shouldThrow = () => true;\n      store.push({ query: 'finalItem' });\n\n      expect(store.items.length).toBe(10);\n      // kept the items\n      expect(store.items[0].query).toBe('item10');\n      expect(store.items[9].query).toBe('item19');\n      // retried 5 times\n      expect(retryCounter).toBe(5);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/base.ts",
    "content": "/**\n * This describes the attributes and methods that a store has to support in\n * order to be used with GraphiQL. It closely resembles the `localStorage`\n * API as it is the default storage used in GraphiQL.\n */\nexport type Storage = {\n  /**\n   * Retrieve an item from the store by its key.\n   * @param key The key of the item to retrieve.\n   * @returns {?string} The stored value for the given key if it exists, `null`\n   * otherwise.\n   */\n  getItem(key: string): string | null;\n  /**\n   * Add a value to the store for a given key. If there already exists a value\n   * for the given key, this method will override the value.\n   * @param key The key to store the value for.\n   * @param value The value to store.\n   */\n  setItem(key: string, value: string): void;\n  /**\n   * Remove the value for a given key from the store. If there is no value for\n   * the given key this method does nothing.\n   * @param key The key to remove the value from the store.\n   */\n  removeItem(key: string): void;\n  /**\n   * Remove all items from the store.\n   */\n  clear(): void;\n  /**\n   * The number of items that are currently stored.\n   */\n  length: number;\n};\n\nfunction isQuotaError(storage: Storage, e: unknown) {\n  return (\n    e instanceof DOMException &&\n    // everything except Firefox\n    (e.code === 22 ||\n      // Firefox\n      e.code === 1014 ||\n      // test name field too, because code might not be present\n      // everything except Firefox\n      e.name === 'QuotaExceededError' ||\n      // Firefox\n      e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\n    // acknowledge QuotaExceededError only if there's something already stored\n    storage.length !== 0\n  );\n}\n\nexport class StorageAPI {\n  storage: Storage | null;\n\n  constructor(storage?: Storage | null) {\n    if (storage) {\n      this.storage = storage;\n    } else if (storage === null) {\n      // Passing `null` creates a noop storage\n      this.storage = null;\n    } else if (typeof window === 'undefined') {\n      this.storage = null;\n    } else {\n      this.storage = {\n        getItem: localStorage.getItem.bind(localStorage),\n        setItem: localStorage.setItem.bind(localStorage),\n        removeItem: localStorage.removeItem.bind(localStorage),\n\n        get length() {\n          let keys = 0;\n          for (const key in localStorage) {\n            if (key.indexOf(`${STORAGE_NAMESPACE}:`) === 0) {\n              keys += 1;\n            }\n          }\n          return keys;\n        },\n\n        clear() {\n          // We only want to clear the namespaced items\n          for (const key in localStorage) {\n            if (key.indexOf(`${STORAGE_NAMESPACE}:`) === 0) {\n              localStorage.removeItem(key);\n            }\n          }\n        },\n      };\n    }\n  }\n\n  get(name: string): string | null {\n    if (!this.storage) {\n      return null;\n    }\n\n    const key = `${STORAGE_NAMESPACE}:${name}`;\n    const value = this.storage.getItem(key);\n    // Clean up any inadvertently saved null/undefined values.\n    if (value === 'null' || value === 'undefined') {\n      this.storage.removeItem(key);\n      return null;\n    }\n\n    return value || null;\n  }\n\n  set(\n    name: string,\n    value: string,\n  ): { isQuotaError: boolean; error: Error | null } {\n    let quotaError = false;\n    let error: Error | null = null;\n\n    if (this.storage) {\n      const key = `${STORAGE_NAMESPACE}:${name}`;\n      if (value) {\n        try {\n          this.storage.setItem(key, value);\n        } catch (e) {\n          error = e instanceof Error ? e : new Error(`${e}`);\n          quotaError = isQuotaError(this.storage, e);\n        }\n      } else {\n        // Clean up by removing the item if there's no value to set\n        this.storage.removeItem(key);\n      }\n    }\n\n    return { isQuotaError: quotaError, error };\n  }\n\n  clear() {\n    if (this.storage) {\n      this.storage.clear();\n    }\n  }\n}\n\nconst STORAGE_NAMESPACE = 'graphiql';\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/custom.ts",
    "content": "/**\n * This function enables a custom namespace for localStorage\n */\n\nimport { Storage } from './base';\n\nexport type CreateLocalStorageOptions = {\n  /**\n   * specify a different storage namespace prefix from the default of 'graphiql'\n   */\n  namespace?: string;\n};\n/**\n * generate a custom local storage adapter for GraphiQL `storage` prop.\n */\nexport function createLocalStorage({\n  namespace,\n}: CreateLocalStorageOptions): Storage {\n  const storageKeyPrefix = `${namespace}:`;\n  const getStorageKey = (key: string) => `${storageKeyPrefix}${key}`;\n\n  const storage: Storage = {\n    setItem: (key, value) => localStorage.setItem(getStorageKey(key), value),\n    getItem: key => localStorage.getItem(getStorageKey(key)),\n    removeItem: key => localStorage.removeItem(getStorageKey(key)),\n    get length() {\n      let keys = 0;\n      for (const key in localStorage) {\n        if (key.indexOf(storageKeyPrefix) === 0) {\n          keys += 1;\n        }\n      }\n      return keys;\n    },\n\n    clear() {\n      // We only want to clear the namespaced items\n      for (const key in localStorage) {\n        if (key.indexOf(storageKeyPrefix) === 0) {\n          localStorage.removeItem(key);\n        }\n      }\n    },\n  };\n\n  return storage;\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/history.ts",
    "content": "import { parse } from 'graphql';\n\nimport { StorageAPI } from './base';\nimport { QueryStore, QueryStoreItem } from './query';\n\nconst MAX_QUERY_SIZE = 100000;\n\nexport class HistoryStore {\n  queries: QueryStoreItem[];\n  history: QueryStore;\n  favorite: QueryStore;\n\n  constructor(\n    private storage: StorageAPI,\n    private maxHistoryLength: number,\n  ) {\n    this.history = new QueryStore(\n      'queries',\n      this.storage,\n      this.maxHistoryLength,\n    );\n    // favorites are not automatically deleted, so there's no need for a max length\n    this.favorite = new QueryStore('favorites', this.storage, null);\n\n    this.queries = [...this.history.fetchAll(), ...this.favorite.fetchAll()];\n  }\n\n  private shouldSaveQuery(\n    query?: string,\n    variables?: string,\n    headers?: string,\n    lastQuerySaved?: QueryStoreItem,\n  ) {\n    if (!query) {\n      return false;\n    }\n\n    try {\n      parse(query);\n    } catch {\n      return false;\n    }\n\n    // Don't try to save giant queries\n    if (query.length > MAX_QUERY_SIZE) {\n      return false;\n    }\n    if (!lastQuerySaved) {\n      return true;\n    }\n    if (JSON.stringify(query) === JSON.stringify(lastQuerySaved.query)) {\n      if (\n        JSON.stringify(variables) === JSON.stringify(lastQuerySaved.variables)\n      ) {\n        if (\n          JSON.stringify(headers) === JSON.stringify(lastQuerySaved.headers)\n        ) {\n          return false;\n        }\n        if (headers && !lastQuerySaved.headers) {\n          return false;\n        }\n      }\n      if (variables && !lastQuerySaved.variables) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  updateHistory = ({\n    query,\n    variables,\n    headers,\n    operationName,\n  }: QueryStoreItem) => {\n    if (\n      !this.shouldSaveQuery(\n        query,\n        variables,\n        headers,\n        this.history.fetchRecent(),\n      )\n    ) {\n      return;\n    }\n    this.history.push({\n      query,\n      variables,\n      headers,\n      operationName,\n    });\n    const historyQueries = this.history.items;\n    const favoriteQueries = this.favorite.items;\n    this.queries = historyQueries.concat(favoriteQueries);\n  };\n\n  toggleFavorite({\n    query,\n    variables,\n    headers,\n    operationName,\n    label,\n    favorite,\n  }: QueryStoreItem) {\n    const item: QueryStoreItem = {\n      query,\n      variables,\n      headers,\n      operationName,\n      label,\n    };\n    if (favorite) {\n      item.favorite = false;\n      this.favorite.delete(item);\n      this.history.push(item);\n    } else {\n      item.favorite = true;\n      this.favorite.push(item);\n      this.history.delete(item);\n    }\n    this.queries = [...this.history.items, ...this.favorite.items];\n  }\n\n  editLabel(\n    {\n      query,\n      variables,\n      headers,\n      operationName,\n      label,\n      favorite,\n    }: QueryStoreItem,\n    index?: number,\n  ) {\n    const item = {\n      query,\n      variables,\n      headers,\n      operationName,\n      label,\n    };\n    if (favorite) {\n      this.favorite.edit({ ...item, favorite }, index);\n    } else {\n      this.history.edit(item, index);\n    }\n    this.queries = [...this.history.items, ...this.favorite.items];\n  }\n\n  deleteHistory = (\n    { query, variables, headers, operationName, favorite }: QueryStoreItem,\n    clearFavorites = false,\n  ) => {\n    function deleteFromStore(store: QueryStore) {\n      const found = store.items.find(\n        x =>\n          x.query === query &&\n          x.variables === variables &&\n          x.headers === headers &&\n          x.operationName === operationName,\n      );\n      if (found) {\n        store.delete(found);\n      }\n    }\n\n    if (favorite || clearFavorites) {\n      deleteFromStore(this.favorite);\n    }\n    if (!favorite || clearFavorites) {\n      deleteFromStore(this.history);\n    }\n\n    this.queries = [...this.history.items, ...this.favorite.items];\n  };\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/index.ts",
    "content": "export * from './base';\nexport * from './history';\nexport * from './query';\nexport * from './custom';\n"
  },
  {
    "path": "packages/graphiql-toolkit/src/storage/query.ts",
    "content": "import { StorageAPI } from './base';\n\nexport type QueryStoreItem = {\n  query?: string;\n  variables?: string;\n  headers?: string;\n  operationName?: string;\n  label?: string;\n  favorite?: boolean;\n};\n\nexport class QueryStore {\n  items: Array<QueryStoreItem>;\n\n  constructor(\n    private key: string,\n    private storage: StorageAPI,\n    private maxSize: number | null = null,\n  ) {\n    this.items = this.fetchAll();\n  }\n\n  get length() {\n    return this.items.length;\n  }\n\n  contains(item: QueryStoreItem) {\n    return this.items.some(\n      x =>\n        x.query === item.query &&\n        x.variables === item.variables &&\n        x.headers === item.headers &&\n        x.operationName === item.operationName,\n    );\n  }\n\n  edit(item: QueryStoreItem, index?: number) {\n    if (typeof index === 'number' && this.items[index]) {\n      const found = this.items[index];\n      if (\n        found.query === item.query &&\n        found.variables === item.variables &&\n        found.headers === item.headers &&\n        found.operationName === item.operationName\n      ) {\n        this.items.splice(index, 1, item);\n        this.save();\n        return;\n      }\n    }\n\n    const itemIndex = this.items.findIndex(\n      x =>\n        x.query === item.query &&\n        x.variables === item.variables &&\n        x.headers === item.headers &&\n        x.operationName === item.operationName,\n    );\n    if (itemIndex !== -1) {\n      this.items.splice(itemIndex, 1, item);\n      this.save();\n    }\n  }\n\n  delete(item: QueryStoreItem) {\n    const itemIndex = this.items.findIndex(\n      x =>\n        x.query === item.query &&\n        x.variables === item.variables &&\n        x.headers === item.headers &&\n        x.operationName === item.operationName,\n    );\n    if (itemIndex !== -1) {\n      this.items.splice(itemIndex, 1);\n      this.save();\n    }\n  }\n\n  fetchRecent() {\n    return this.items.at(-1);\n  }\n\n  fetchAll() {\n    const raw = this.storage.get(this.key);\n    if (raw) {\n      return JSON.parse(raw)[this.key] as Array<QueryStoreItem>;\n    }\n    return [];\n  }\n\n  push(item: QueryStoreItem) {\n    const items = [...this.items, item];\n\n    if (this.maxSize && items.length > this.maxSize) {\n      items.shift();\n    }\n\n    for (let attempts = 0; attempts < 5; attempts++) {\n      const response = this.storage.set(\n        this.key,\n        JSON.stringify({ [this.key]: items }),\n      );\n      if (!response?.error) {\n        this.items = items;\n      } else if (response.isQuotaError && this.maxSize) {\n        // Only try to delete last items on LRU stores\n        items.shift();\n      } else {\n        return; // We don't know what happened in this case, so just bailing out\n      }\n    }\n  }\n\n  save() {\n    this.storage.set(this.key, JSON.stringify({ [this.key]: this.items }));\n  }\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2017\",\n    \"module\": \"ESNext\",\n    \"declaration\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"allowJs\": true,\n    \"lib\": [\"es2022\", \"dom\"],\n    \"moduleResolution\": \"node\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"include\": [\"src\", \"tsup.config.ts\"]\n}\n"
  },
  {
    "path": "packages/graphiql-toolkit/tsup.config.ts",
    "content": "import { defineConfig, Options } from 'tsup';\n\nconst opts: Options = {\n  entry: ['src/**/*.ts', '!**/__tests__'],\n  bundle: false,\n  clean: true,\n  dts: true,\n  minifySyntax: true,\n};\n\nexport default defineConfig([\n  {\n    ...opts,\n    format: 'esm',\n    outDir: 'dist/esm',\n    outExtension: () => ({ js: '.js' }),\n    env: {\n      USE_IMPORT: 'true',\n    },\n  },\n  {\n    ...opts,\n    format: 'cjs',\n    outDir: 'dist/cjs',\n    env: {\n      USE_IMPORT: 'false',\n    },\n  },\n]);\n"
  },
  {
    "path": "packages/graphiql-toolkit/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n    environment: 'jsdom',\n  },\n});\n"
  },
  {
    "path": "packages/graphql-language-service/CHANGELOG.md",
    "content": "# graphql-language-service\n\n## 5.5.0\n\n### Minor Changes\n\n- [#4071](https://github.com/graphql/graphiql/pull/4071) [`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(graphql-language-service): export `getContextAtPosition`\n  feat(graphiql): dynamically import `monaco-editor` and `monaco-graphql`\n\n  When using GraphiQL in Next.js app, you no longer need to use `next/dynamic`:\n\n  ```diff\n  -import dynamic from 'next/dynamic'\n  -const GraphiQL = dynamic(() => import('graphiql').then(mod => mod.GraphiQL), {\n  -  ssr: false\n  -})\n  +import { GraphiQL } from 'graphiql'\n  ```\n\n## 5.4.0\n\n### Minor Changes\n\n- [#3982](https://github.com/graphql/graphiql/pull/3982) [`9498dee`](https://github.com/graphql/graphiql/commit/9498deea7636fd82602f230b6b21c743ca5705a7) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat: set `additionalProperties: false` to report unused variables\n\n## 5.3.1\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n## 5.3.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n## 5.2.2\n\n### Patch Changes\n\n- [#3637](https://github.com/graphql/graphiql/pull/3637) [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update eslint plugins and fix errors\n\n## 5.2.1\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n## 5.2.0\n\n### Minor Changes\n\n- [#3376](https://github.com/graphql/graphiql/pull/3376) [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c) Thanks [@bboure](https://github.com/bboure)! - Add support for custom scalars\n\n### Patch Changes\n\n- [#3376](https://github.com/graphql/graphiql/pull/3376) [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c) Thanks [@bboure](https://github.com/bboure)! - Fix Variables JSON Schema for null values\n\n## 5.1.7\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- [#3149](https://github.com/graphql/graphiql/pull/3149) [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5) Thanks [@mskelton](https://github.com/mskelton)! - Fix hover docs being off by one position.\n\n## 5.1.7-alpha.0\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- [#3149](https://github.com/graphql/graphiql/pull/3149) [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5) Thanks [@mskelton](https://github.com/mskelton)! - Fix hover docs being off by one position.\n\n## 5.1.6\n\n### Patch Changes\n\n- [#3148](https://github.com/graphql/graphiql/pull/3148) [`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939) Thanks [@mskelton](https://github.com/mskelton)! - Use native LSP logger instead of manual file based logging. This fixes errors in Neovim when using the GraphQL LSP.\n\n## 5.1.5\n\n### Patch Changes\n\n- [#3150](https://github.com/graphql/graphiql/pull/3150) [`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284) Thanks [@AaronMoat](https://github.com/AaronMoat)! - fix(graphql-language-service-server): allow getDefinition to work for unions\n\n  Fixes the issue where a schema like the one below won't allow you to click through to X.\n\n  ```graphql\n  union X = A | B\n  type A {\n    x: String\n  }\n  type B {\n    x: String\n  }\n  type Query {\n    a: X\n  }\n  ```\n\n## 5.1.4\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n## 5.1.3\n\n### Patch Changes\n\n- [#3046](https://github.com/graphql/graphiql/pull/3046) [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer .at() method for index access\n\n- [#3042](https://github.com/graphql/graphiql/pull/3042) [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer String#slice() over String#substr() and String#substring()\n\n## 5.1.2\n\n### Patch Changes\n\n- [#2986](https://github.com/graphql/graphiql/pull/2986) [`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c) Thanks [@bboure](https://github.com/bboure)! - Fix JSON schema for custom scalars validation\n\n- [#2917](https://github.com/graphql/graphiql/pull/2917) [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b) Thanks [@woodensail](https://github.com/woodensail)! - Fix infinite recursiveness in getVariablesJSONSchema when the schema contains types that reference themselves\n\n- [#2993](https://github.com/graphql/graphiql/pull/2993) [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4) Thanks [@B2o5T](https://github.com/B2o5T)! - add `unicorn/consistent-destructuring` rule\n\n- [#2962](https://github.com/graphql/graphiql/pull/2962) [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d) Thanks [@B2o5T](https://github.com/B2o5T)! - clean all ESLint warnings, add `--max-warnings=0` and `--cache` flags\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n## 5.1.1\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2941](https://github.com/graphql/graphiql/pull/2941) [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-logical-operator-over-ternary` rule\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- [#2930](https://github.com/graphql/graphiql/pull/2930) [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9) Thanks [@B2o5T](https://github.com/B2o5T)! - remove `mapCat()` in favor of `Array#flatMap()`\n\n- [#2965](https://github.com/graphql/graphiql/pull/2965) [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-optional-catch-binding` rule\n\n- [#2936](https://github.com/graphql/graphiql/pull/2936) [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `lonely-if`/`unicorn/lonely-if` rules\n\n- [#2963](https://github.com/graphql/graphiql/pull/2963) [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `prefer-destructuring` rule\n\n- [#2938](https://github.com/graphql/graphiql/pull/2938) [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/throw-new-error` rule\n\n## 5.1.0\n\n### Minor Changes\n\n- [#2654](https://github.com/graphql/graphiql/pull/2654) [`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782) Thanks [@cshaver](https://github.com/cshaver)! - Provide autocomplete suggestions for documents with type definitions\n\n## 5.0.6\n\n### Patch Changes\n\n- [#2506](https://github.com/graphql/graphiql/pull/2506) [`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c) Thanks [@acao](https://github.com/acao)! - Remove redundant check, trigger LSP release\n\n## 5.0.5\n\n### Patch Changes\n\n- [#2486](https://github.com/graphql/graphiql/pull/2486) [`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa) Thanks [@stonexer](https://github.com/stonexer)! - definition support for operation fields ✨\n\n  you can now jump to the applicable object type definition for query/mutation/subscription fields!\n\n## 5.0.4\n\n### Patch Changes\n\n- [#2378](https://github.com/graphql/graphiql/pull/2378) [`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2) Thanks [@acao](https://github.com/acao)! - Trap all graphql parsing exceptions from (relatively) newly added logic. This should clear up bugs that have been plaguing users for two years now, sorry!\n\n## 5.0.3\n\n### Patch Changes\n\n- [#2291](https://github.com/graphql/graphiql/pull/2291) [`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902) Thanks [@retrodaredevil](https://github.com/retrodaredevil)! - Target es6 for the languages services\n\n## 5.0.2\n\n### Patch Changes\n\n- [`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f) Thanks [@acao](https://github.com/acao)! - - upgrade `graphql-config` to latest in server\n  - remove `graphql-config` dependency from `vscode-graphql` and `graphql-language-service`\n  - fix `vscode-graphql` esbuild bundling bug in `vscode-graphql` [#2269](https://github.com/graphql/graphiql/issues/2269) by fixing `esbuild` version\n\n## 5.0.1\n\n### Patch Changes\n\n- [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa) Thanks [@acao](https://github.com/acao)! - fix lockfile and imports from LSP merge\n\n* [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa) Thanks [@acao](https://github.com/acao)! - default to es6 target across the language services, fix #2240\n\n## 5.0.0\n\n### Major Changes\n\n- [#2209](https://github.com/graphql/graphiql/pull/2209) [`2502a364`](https://github.com/graphql/graphiql/commit/2502a364b74dc754d92baa1579b536cf42139958) Thanks [@acao](https://github.com/acao)! - Retire parser, interface, utils and types packages, combine with graphql-language-service\n\n## 4.1.5\n\n### Patch Changes\n\n- [#2161](https://github.com/graphql/graphiql/pull/2161) [`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f) Thanks [@orta](https://github.com/orta)! - Do not log errors when a JS/TS file has no embedded graphql tags\n\n* [#2176](https://github.com/graphql/graphiql/pull/2176) [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c) Thanks [@orta](https://github.com/orta)! - Update babel parser in the graphql language server\n\n- [#2175](https://github.com/graphql/graphiql/pull/2175) [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5) Thanks [@orta](https://github.com/orta)! - Better handling of unparsable babel JS/TS files\n\n## 4.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`d5fca9db`](https://github.com/graphql/graphiql/commit/d5fca9db067927446087717b84e0b2a3ff94bbe9)]:\n  - graphql-language-service-interface@2.10.2\n\n## 4.1.3\n\n### Patch Changes\n\n- [#2103](https://github.com/graphql/graphiql/pull/2103) [`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8) Thanks [@acao](https://github.com/acao)! - LanguageService should not be imported by `codemirror-graphql`, and thus `picomatch` should not be imported.\n\n## 4.1.2\n\n### Patch Changes\n\n- [#2101](https://github.com/graphql/graphiql/pull/2101) [`e20760fb`](https://github.com/graphql/graphiql/commit/e20760fbd95c13d6d549cba3faa15a59aee9a2c0) Thanks [@acao](https://github.com/acao)! - Fix picomatch bug by using a browser compatible fork\n\n## 4.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63)]:\n  - graphql-language-service-interface@2.10.1\n  - graphql-language-service-utils@2.7.1\n  - graphql-language-service-types@1.8.7\n  - graphql-language-service-parser@1.10.4\n\n## 4.1.0\n\n### Minor Changes\n\n- [#2086](https://github.com/graphql/graphiql/pull/2086) [`0f1f90ce`](https://github.com/graphql/graphiql/commit/0f1f90ce8f4a25ddebdaf7a9ddbe136214aa64a3) Thanks [@acao](https://github.com/acao)! - Export all modules & types explicitly from `graphql-language-service`\n\n## 4.0.0\n\n### Major Changes\n\n- [#1997](https://github.com/graphql/graphiql/pull/1997) [`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3) Thanks [@acao](https://github.com/acao)! - This introduces some big changes to `monaco-graphql`, and some exciting features, including multi-model support, multi-schema support, and variables json language feature support 🎉.\n\n  see [the readme](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql#monaco-graphql) to learn how to configure and use the new interface.\n\n  #### 🚨 BREAKING CHANGES!! 🚨\n\n  - `monaco-graphql` 🚨 **no longer loads schemas using `fetch` introspection** 🚨, you must specify the schema in one of many ways statically or dynamically. specifying just a schema `uri` no longer works. see [the readme](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql#monaco-graphql)\n  - when specifying the language to an editor or model, **use `graphql` as the language id instead of `graphqlDev`**\n    - the mode now extends the default basic language support from `monaco-editor` itself\n    - when bundling, for syntax highlighting and basic language features, you must specify `graphql` in languages for your webpack or vite monaco plugins\n  - The exported mode api for configuration been entirely rewritten. It is simple for now, but we will add more powerful methods to the `monaco.languages.api` over time :)\n\n  #### New Features\n\n  this introduces many improvements:\n\n  - json language support, by mapping from each graphql model uri to a set of json variable model uris\n    - we generate a json schema definition for the json variables on the fly\n    - it updates alongside editor validation as you type\n  - less redundant schema loading - schema is loaded in main process instead of in the webworker\n  - web worker stability has been improved by contributors in previous patches, but removing remote schema loading vastly simplifies worker creation\n  - the editor now supports multiple graphql models, configurable against multiple schema configurations\n\n  * You can now use `initializeMode()` to initialize the language mode & worker with the schema, but you can still lazily load it, and fall back on default monaco editor basic languages support\n\n### Patch Changes\n\n- Updated dependencies [[`581df6d8`](https://github.com/graphql/graphiql/commit/581df6d83f4bc145de94e5d730b00e5b025907da), [`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3), [`9b72af57`](https://github.com/graphql/graphiql/commit/9b72af57183f4435992c232e63506ad2f5a72576)]:\n  - graphql-language-service-interface@2.10.0\n  - graphql-language-service-utils@2.7.0\n\n## 3.2.5\n\n### Patch Changes\n\n- [`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1) [#2065](https://github.com/graphql/graphiql/pull/2065) Thanks [@acao](https://github.com/acao)! - Add an opt-in feature to generate markdown in hover elements, starting with highlighting type information. Enabled for the language server and also the language service and thus `monaco-graphql` as well.\n\n- Updated dependencies [[`989fca69`](https://github.com/graphql/graphiql/commit/989fca693385aa408bcfe18cde34934a5aea5dce), [`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1)]:\n  - graphql-language-service-interface@2.9.5\n\n## 3.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`a3782ff0`](https://github.com/graphql/graphiql/commit/a3782ff0ff0d7c321e6f70bea61b1969b1690f26)]:\n  - graphql-language-service-interface@2.9.4\n  - graphql-language-service-types@1.8.6\n  - graphql-language-service-parser@1.10.3\n  - graphql-language-service-utils@2.6.3\n\n## 3.2.3\n\n### Patch Changes\n\n- [`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf) [#2047](https://github.com/graphql/graphiql/pull/2047) Thanks [@willstott101](https://github.com/willstott101)! - Source code included in all packages to fix source maps. codemirror-graphql includes esm build in package.\n\n- Updated dependencies [[`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf)]:\n  - graphql-language-service-interface@2.9.3\n  - graphql-language-service-parser@1.10.2\n  - graphql-language-service-types@1.8.5\n  - graphql-language-service-utils@2.6.2\n\n## 3.2.2\n\n### Patch Changes\n\n- [`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf) [#2045](https://github.com/graphql/graphiql/pull/2045) Thanks [@acao](https://github.com/acao)! - fix graphql-js peer dependencies - [#2044](https://github.com/graphql/graphiql/pull/2044)\n\n- Updated dependencies [[`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf)]:\n  - graphql-language-service-interface@2.9.2\n  - graphql-language-service-parser@1.10.1\n  - graphql-language-service-types@1.8.4\n  - graphql-language-service-utils@2.6.1\n\n## 3.2.1\n\n### Patch Changes\n\n- [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce) [#2013](https://github.com/graphql/graphiql/pull/2013) Thanks [@PabloSzx](https://github.com/PabloSzx)! - Update utils\n\n- Updated dependencies [[`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce), [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce), [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce)]:\n  - graphql-language-service-utils@2.6.0\n  - graphql-language-service-types@1.8.3\n  - graphql-language-service-interface@2.9.1\n\n## 3.2.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n### Patch Changes\n\n- Updated dependencies [[`8869c4b1`](https://github.com/graphql/graphiql/commit/8869c4b18c900b9b35556255587ef5130a96a4d5), [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a)]:\n  - graphql-language-service-interface@2.9.0\n  - graphql-language-service-parser@1.10.0\n\n## 3.1.6\n\n### Patch Changes\n\n- [`0e2c1a02`](https://github.com/graphql/graphiql/commit/0e2c1a020cc2761155f7c9467d3ed4cb45941aeb) [#1979](https://github.com/graphql/graphiql/pull/1979) Thanks [@iahu](https://github.com/iahu)! - fix: export `monaco-graphql` esm with esm modules, also fix issues with worker manager, resolves #1706 & #1791\n\n* [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8) [#1777](https://github.com/graphql/graphiql/pull/1777) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - adopt block string parsing for variables in language parser\n\n* Updated dependencies [[`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8)]:\n  - graphql-language-service-parser@1.9.3\n\n## 3.1.5\n\n### Patch Changes\n\n- [`2fd5bf72`](https://github.com/graphql/graphiql/commit/2fd5bf7239edb78339e5ac7211f09c245e47c3bb) [#1941](https://github.com/graphql/graphiql/pull/1941) Thanks [@arcanis](https://github.com/arcanis)! - Adds support for `#graphql` and `/* GraphQL */` in the language server\n\n## 3.1.4\n\n### Patch Changes\n\n- [`5b8a057d`](https://github.com/graphql/graphiql/commit/5b8a057dd64ebecc391be32176a2403bb9d9ff92) [#1838](https://github.com/graphql/graphiql/pull/1838) Thanks [@acao](https://github.com/acao)! - Set all cross-runtime build targets to es6\n\n## 3.1.3\n\n### Patch Changes\n\n- [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n## [3.1.2](https://github.com/graphql/graphiql/compare/graphql-language-service@3.1.1...graphql-language-service@3.1.2) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.1.1](https://github.com/graphql/graphiql/compare/graphql-language-service@3.1.0...graphql-language-service@3.1.1) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.1.0](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.6...graphql-language-service@3.1.0) (2021-01-07)\n\n### Features\n\n- implied or external fragments, for [#612](https://github.com/graphql/graphiql/issues/612) ([#1750](https://github.com/graphql/graphiql/issues/1750)) ([cfed265](https://github.com/graphql/graphiql/commit/cfed265e3cf31875b39ea517781a217fcdfcadc2))\n\n## [3.0.6](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.5...graphql-language-service@3.0.6) (2021-01-03)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.5](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.4...graphql-language-service@3.0.5) (2020-12-28)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.4](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.3...graphql-language-service@3.0.4) (2020-12-08)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.3](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.2...graphql-language-service@3.0.3) (2020-11-28)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.2](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.2-alpha.3...graphql-language-service@3.0.2) (2020-09-18)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.2-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.2-alpha.2...graphql-language-service@3.0.2-alpha.3) (2020-09-11)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.2-alpha.2](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.2-alpha.1...graphql-language-service@3.0.2-alpha.2) (2020-08-22)\n\n### Bug Fixes\n\n- improve setSchema & schema loading, allow primitive schema ([#1648](https://github.com/graphql/graphiql/issues/1648)) ([975f29e](https://github.com/graphql/graphiql/commit/975f29ed6e21c7354c42ed778dfd1b52287f70c6))\n\n## [3.0.2-alpha.1](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.2-alpha.0...graphql-language-service@3.0.2-alpha.1) (2020-08-12)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.2-alpha.0](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.1...graphql-language-service@3.0.2-alpha.0) (2020-08-10)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.1](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.0...graphql-language-service@3.0.1) (2020-08-06)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.0](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.0-alpha.4...graphql-language-service@3.0.0) (2020-06-11)\n\n### Features\n\n- standalone monaco API ([#1575](https://github.com/graphql/graphiql/issues/1575)) ([954aa3d](https://github.com/graphql/graphiql/commit/954aa3d7159fd26bba9650824e0f668e417ca64f))\n\n## [3.0.0-alpha.4](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.0-alpha.3...graphql-language-service@3.0.0-alpha.4) (2020-06-04)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.0-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.0-alpha.2...graphql-language-service@3.0.0-alpha.3) (2020-06-04)\n\n### Bug Fixes\n\n- cleanup cache entry from lerna publish ([4a26218](https://github.com/graphql/graphiql/commit/4a2621808a1aea8b30d5d27b8d86a60bf2b44b01))\n\n## [3.0.0-alpha.2](https://github.com/graphql/graphiql/compare/graphql-language-service@3.0.0-alpha.1...graphql-language-service@3.0.0-alpha.2) (2020-05-28)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [3.0.0-alpha.1](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.8...graphql-language-service@3.0.0-alpha.1) (2020-05-19)\n\n**Note:** Version bump only for package graphql-language-service\n\n# 2.4.0-alpha.8 (2020-05-17)\n\n### Features\n\n- Monaco Mode - Phase 2 - Mode & Worker ([#1459](https://github.com/graphql/graphiql/issues/1459)) ([bc95fb4](https://github.com/graphql/graphiql/commit/bc95fb46459a4437ff9471ff43c98e1c5c50f51e))\n- monaco-graphql docs, api, improvements ([#1521](https://github.com/graphql/graphiql/issues/1521)) ([c79158c](https://github.com/graphql/graphiql/commit/c79158c72e976ab286e7ec3fded7f3e2d24e50d0))\n- new graphql-languageservice package ([#1485](https://github.com/graphql/graphiql/issues/1485)) ([6bb3ddd](https://github.com/graphql/graphiql/commit/6bb3dddf1f97db4bc193bb7fd9de1ada8d8c8ef9))\n"
  },
  {
    "path": "packages/graphql-language-service/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/graphql-language-service/README.md",
    "content": "# `graphql-language-service`\n\n[Changelog](https://github.com/graphql/graphiql/blob/main/packages/graphql-language-service/CHANGELOG.md)\n|\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphql_language_service.html)\n| [Discord](https://discord.gg/wkQCKwazxj)\n\n> **Note**: Still mostly experimental, however it depends mostly on stable\n> libraries. **Migration Note**: As of 3.0.0, the LSP Server command line\n> interface has been moved to\n> [`graphql-language-service-cli`](../graphql-language-service-cli)\n\n## Purpose\n\nThis package brings together all the dependencies for building out web or\ndesktop IDE services for the GraphQL Language.\n\nIt is named as such to match the convention of other vscode language services.\n\n## Interface\n\nLanguage Service Protocol (LSP) methods written in TypeScript used by\n[`graphql-language-service-server`](https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-server),\n[`monaco-graphql`](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql)\nand\n[`codemirror-graphql`](https://github.com/graphql/graphiql/tree/main/packages/codemirror-graphql).\n\nThe goal is to provide methods for creating\n[Language Server Protocol](https://langserver.org) compliant services to be used\nby an IDE plugin, a browser application or desktop application.\n\n## Parser\n\nA standalone online, immutable, dependency-free parser for\n[GraphQL](https://graphql.org), used by the LSP interface methods\n\n## Utils\n\nVarious utilities\n"
  },
  {
    "path": "packages/graphql-language-service/benchmark/fixtures/github.graphql",
    "content": "input AcceptTopicSuggestionInput {\n  repositoryId: ID!\n\n  name: String!\n\n  clientMutationId: String\n}\n\ntype AcceptTopicSuggestionPayload {\n  clientMutationId: String\n\n  topic: Topic\n}\n\ninterface Actor {\n  avatarUrl(size: Int): URI!\n\n  login: String!\n\n  resourcePath: URI!\n\n  url: URI!\n}\n\ninput AddAssigneesToAssignableInput {\n  assignableId: ID!\n\n  assigneeIds: [ID!]!\n\n  clientMutationId: String\n}\n\ntype AddAssigneesToAssignablePayload {\n  assignable: Assignable\n\n  clientMutationId: String\n}\n\ninput AddCommentInput {\n  subjectId: ID!\n\n  body: String!\n\n  clientMutationId: String\n}\n\ntype AddCommentPayload {\n  clientMutationId: String\n\n  commentEdge: IssueCommentEdge\n\n  subject: Node\n\n  timelineEdge: IssueTimelineItemEdge\n}\n\ntype AddedToProjectEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\ninput AddLabelsToLabelableInput {\n  labelableId: ID!\n\n  labelIds: [ID!]!\n\n  clientMutationId: String\n}\n\ntype AddLabelsToLabelablePayload {\n  clientMutationId: String\n\n  labelable: Labelable\n}\n\ninput AddProjectCardInput {\n  projectColumnId: ID!\n\n  contentId: ID\n\n  note: String\n\n  clientMutationId: String\n}\n\ntype AddProjectCardPayload {\n  cardEdge: ProjectCardEdge\n\n  clientMutationId: String\n\n  projectColumn: ProjectColumn\n}\n\ninput AddProjectColumnInput {\n  projectId: ID!\n\n  name: String!\n\n  clientMutationId: String\n}\n\ntype AddProjectColumnPayload {\n  clientMutationId: String\n\n  columnEdge: ProjectColumnEdge\n\n  project: Project\n}\n\ninput AddPullRequestReviewCommentInput {\n  pullRequestReviewId: ID!\n\n  commitOID: GitObjectID\n\n  body: String!\n\n  path: String\n\n  position: Int\n\n  inReplyTo: ID\n\n  clientMutationId: String\n}\n\ntype AddPullRequestReviewCommentPayload {\n  clientMutationId: String\n\n  comment: PullRequestReviewComment\n\n  commentEdge: PullRequestReviewCommentEdge\n}\n\ninput AddPullRequestReviewInput {\n  pullRequestId: ID!\n\n  commitOID: GitObjectID\n\n  body: String\n\n  event: PullRequestReviewEvent\n\n  comments: [DraftPullRequestReviewComment]\n\n  clientMutationId: String\n}\n\ntype AddPullRequestReviewPayload {\n  clientMutationId: String\n\n  pullRequestReview: PullRequestReview\n\n  reviewEdge: PullRequestReviewEdge\n}\n\ninput AddReactionInput {\n  subjectId: ID!\n\n  content: ReactionContent!\n\n  clientMutationId: String\n}\n\ntype AddReactionPayload {\n  clientMutationId: String\n\n  reaction: Reaction\n\n  subject: Reactable\n}\n\ninput AddStarInput {\n  starrableId: ID!\n\n  clientMutationId: String\n}\n\ntype AddStarPayload {\n  clientMutationId: String\n\n  starrable: Starrable\n}\n\ntype App implements Node {\n  createdAt: DateTime!\n\n  databaseId: Int\n\n  description: String\n  id: ID!\n\n  logoBackgroundColor: String!\n\n  logoUrl(size: Int): URI!\n\n  name: String!\n\n  slug: String!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype AppEdge {\n  cursor: String!\n\n  node: App\n}\n\ninterface Assignable {\n  assignees(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n}\n\ntype AssignedEvent implements Node {\n  actor: Actor\n\n  assignable: Assignable!\n\n  createdAt: DateTime!\n  id: ID!\n\n  user: User\n}\n\ntype BaseRefChangedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\ntype BaseRefForcePushedEvent implements Node {\n  actor: Actor\n\n  afterCommit: Commit\n\n  beforeCommit: Commit\n\n  createdAt: DateTime!\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  ref: Ref\n}\n\ntype Blame {\n  ranges: [BlameRange!]!\n}\n\ntype BlameRange {\n  age: Int!\n\n  commit: Commit!\n\n  endingLine: Int!\n\n  startingLine: Int!\n}\n\ntype Blob implements Node & GitObject {\n  abbreviatedOid: String!\n\n  byteSize: Int!\n\n  commitResourcePath: URI!\n\n  commitUrl: URI!\n  id: ID!\n\n  isBinary: Boolean!\n\n  isTruncated: Boolean!\n\n  oid: GitObjectID!\n\n  repository: Repository!\n\n  text: String\n}\n\ntype Bot implements Node & Actor & UniformResourceLocatable {\n  avatarUrl(size: Int): URI!\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n\n  login: String!\n\n  resourcePath: URI!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype BranchProtectionRule implements Node {\n  branchProtectionRuleConflicts(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): BranchProtectionRuleConflictConnection!\n\n  creator: Actor\n\n  databaseId: Int\n\n  dismissesStaleReviews: Boolean!\n  id: ID!\n\n  isAdminEnforced: Boolean!\n\n  matchingRefs(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RefConnection!\n\n  pattern: String!\n\n  pushAllowances(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PushAllowanceConnection!\n\n  repository: Repository\n\n  requiredApprovingReviewCount: Int\n\n  requiredStatusCheckContexts: [String]\n\n  requiresApprovingReviews: Boolean!\n\n  requiresCommitSignatures: Boolean!\n\n  requiresStatusChecks: Boolean!\n\n  requiresStrictStatusChecks: Boolean!\n\n  restrictsPushes: Boolean!\n\n  restrictsReviewDismissals: Boolean!\n\n  reviewDismissalAllowances(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ReviewDismissalAllowanceConnection!\n}\n\ntype BranchProtectionRuleConflict {\n  branchProtectionRule: BranchProtectionRule\n\n  conflictingBranchProtectionRule: BranchProtectionRule\n\n  ref: Ref\n}\n\ntype BranchProtectionRuleConflictConnection {\n  edges: [BranchProtectionRuleConflictEdge]\n\n  nodes: [BranchProtectionRuleConflict]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype BranchProtectionRuleConflictEdge {\n  cursor: String!\n\n  node: BranchProtectionRuleConflict\n}\n\ntype BranchProtectionRuleConnection {\n  edges: [BranchProtectionRuleEdge]\n\n  nodes: [BranchProtectionRule]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype BranchProtectionRuleEdge {\n  cursor: String!\n\n  node: BranchProtectionRule\n}\n\ninput ChangeUserStatusInput {\n  emoji: String\n\n  message: String\n\n  organizationId: ID\n\n  limitedAvailability: Boolean = false\n\n  clientMutationId: String\n}\n\ntype ChangeUserStatusPayload {\n  clientMutationId: String\n\n  status: UserStatus\n}\n\ninput ClearLabelsFromLabelableInput {\n  labelableId: ID!\n\n  clientMutationId: String\n}\n\ntype ClearLabelsFromLabelablePayload {\n  clientMutationId: String\n\n  labelable: Labelable\n}\n\ninput CloneProjectInput {\n  targetOwnerId: ID!\n\n  sourceId: ID!\n\n  includeWorkflows: Boolean!\n\n  name: String!\n\n  body: String\n\n  public: Boolean\n\n  clientMutationId: String\n}\n\ntype CloneProjectPayload {\n  clientMutationId: String\n\n  jobStatusId: String\n\n  project: Project\n}\n\ninterface Closable {\n  closed: Boolean!\n\n  closedAt: DateTime\n}\n\ntype ClosedEvent implements Node & UniformResourceLocatable {\n  actor: Actor\n\n  closable: Closable!\n\n  closer: Closer\n\n  createdAt: DateTime!\n  id: ID!\n\n  resourcePath: URI!\n\n  url: URI!\n}\n\ninput CloseIssueInput {\n  issueId: ID!\n\n  clientMutationId: String\n}\n\ntype CloseIssuePayload {\n  clientMutationId: String\n\n  issue: Issue\n}\n\ninput ClosePullRequestInput {\n  pullRequestId: ID!\n\n  clientMutationId: String\n}\n\ntype ClosePullRequestPayload {\n  clientMutationId: String\n\n  pullRequest: PullRequest\n}\n\nunion Closer = Commit | PullRequest\n\ntype CodeOfConduct implements Node {\n  body: String\n  id: ID!\n\n  key: String!\n\n  name: String!\n\n  resourcePath: URI\n\n  url: URI\n}\n\nenum CollaboratorAffiliation {\n  OUTSIDE\n\n  DIRECT\n\n  ALL\n}\n\nunion CollectionItemContent = Repository | Organization | User\n\ninterface Comment {\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  editor: Actor\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  lastEditedAt: DateTime\n\n  publishedAt: DateTime\n\n  updatedAt: DateTime!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerDidAuthor: Boolean!\n}\n\nenum CommentAuthorAssociation {\n  MEMBER\n\n  OWNER\n\n  COLLABORATOR\n\n  CONTRIBUTOR\n\n  FIRST_TIME_CONTRIBUTOR\n\n  FIRST_TIMER\n\n  NONE\n}\n\nenum CommentCannotUpdateReason {\n  INSUFFICIENT_ACCESS\n\n  LOCKED\n\n  LOGIN_REQUIRED\n\n  MAINTENANCE\n\n  VERIFIED_EMAIL_REQUIRED\n\n  DENIED\n}\n\ntype CommentDeletedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\ntype Commit implements Node & GitObject & Subscribable & UniformResourceLocatable {\n  abbreviatedOid: String!\n\n  additions: Int!\n\n  associatedPullRequests(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: PullRequestOrder\n  ): PullRequestConnection\n\n  author: GitActor\n\n  authoredByCommitter: Boolean!\n\n  authoredDate: DateTime!\n\n  blame(path: String!): Blame!\n\n  changedFiles: Int!\n\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): CommitCommentConnection!\n\n  commitResourcePath: URI!\n\n  commitUrl: URI!\n\n  committedDate: DateTime!\n\n  committedViaWeb: Boolean!\n\n  committer: GitActor\n\n  deletions: Int!\n\n  deployments(\n    environments: [String!]\n\n    orderBy: DeploymentOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): DeploymentConnection\n\n  history(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    path: String\n\n    author: CommitAuthor\n\n    since: GitTimestamp\n\n    until: GitTimestamp\n  ): CommitHistoryConnection!\n  id: ID!\n\n  message: String!\n\n  messageBody: String!\n\n  messageBodyHTML: HTML!\n\n  messageHeadline: String!\n\n  messageHeadlineHTML: HTML!\n\n  oid: GitObjectID!\n\n  parents(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): CommitConnection!\n\n  pushedDate: DateTime\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  signature: GitSignature\n\n  status: Status\n\n  tarballUrl: URI!\n\n  tree: Tree!\n\n  treeResourcePath: URI!\n\n  treeUrl: URI!\n\n  url: URI!\n\n  viewerCanSubscribe: Boolean!\n\n  viewerSubscription: SubscriptionState\n\n  zipballUrl: URI!\n}\n\ninput CommitAuthor {\n  id: ID\n\n  emails: [String!]\n}\n\ntype CommitComment implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode {\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  commit: Commit\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  editor: Actor\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  isMinimized: Boolean!\n\n  lastEditedAt: DateTime\n\n  minimizedReason: String\n\n  path: String\n\n  position: Int\n\n  publishedAt: DateTime\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanDelete: Boolean!\n\n  viewerCanMinimize: Boolean!\n\n  viewerCanReact: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n}\n\ntype CommitCommentConnection {\n  edges: [CommitCommentEdge]\n\n  nodes: [CommitComment]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype CommitCommentEdge {\n  cursor: String!\n\n  node: CommitComment\n}\n\ntype CommitCommentThread implements Node & RepositoryNode {\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): CommitCommentConnection!\n\n  commit: Commit!\n  id: ID!\n\n  path: String\n\n  position: Int\n\n  repository: Repository!\n}\n\ntype CommitConnection {\n  edges: [CommitEdge]\n\n  nodes: [Commit]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ninput CommitContributionOrder {\n  field: CommitContributionOrderField!\n\n  direction: OrderDirection!\n}\n\nenum CommitContributionOrderField {\n  OCCURRED_AT\n\n  COMMIT_COUNT\n}\n\ntype CommitContributionsByRepository {\n  contributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: CommitContributionOrder\n  ): CreatedCommitContributionConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  url: URI!\n}\n\ntype CommitEdge {\n  cursor: String!\n\n  node: Commit\n}\n\ntype CommitHistoryConnection {\n  edges: [CommitEdge]\n\n  nodes: [Commit]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ContentAttachment {\n  body: String!\n\n  contentReference: ContentReference!\n\n  databaseId: Int!\n  id: ID!\n\n  title: String!\n}\n\ntype ContentReference {\n  databaseId: Int!\n  id: ID!\n\n  reference: String!\n}\n\ninterface Contribution {\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype ContributionCalendar {\n  colors: [String!]!\n\n  isHalloween: Boolean!\n\n  months: [ContributionCalendarMonth!]!\n\n  totalContributions: Int!\n\n  weeks: [ContributionCalendarWeek!]!\n}\n\ntype ContributionCalendarDay {\n  color: String!\n\n  contributionCount: Int!\n\n  date: Date!\n\n  weekday: Int!\n}\n\ntype ContributionCalendarMonth {\n  firstDay: Date!\n\n  name: String!\n\n  totalWeeks: Int!\n\n  year: Int!\n}\n\ntype ContributionCalendarWeek {\n  contributionDays: [ContributionCalendarDay!]!\n\n  firstDay: Date!\n}\n\ninput ContributionOrder {\n  field: ContributionOrderField!\n\n  direction: OrderDirection!\n}\n\nenum ContributionOrderField {\n  OCCURRED_AT\n}\n\ntype ContributionsCollection {\n  commitContributionsByRepository(\n    maxRepositories: Int = 25\n  ): [CommitContributionsByRepository!]!\n\n  contributionCalendar: ContributionCalendar!\n\n  contributionYears: [Int!]!\n\n  doesEndInCurrentMonth: Boolean!\n\n  earliestRestrictedContributionDate: Date\n\n  endedAt: DateTime!\n\n  hasActivityInThePast: Boolean!\n\n  hasAnyContributions: Boolean!\n\n  hasAnyRestrictedContributions: Boolean!\n\n  isSingleDay: Boolean!\n\n  issueContributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n\n    orderBy: ContributionOrder\n  ): CreatedIssueContributionConnection!\n\n  issueContributionsByRepository(\n    maxRepositories: Int = 25\n\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n  ): [IssueContributionsByRepository!]!\n\n  latestRestrictedContributionDate: Date\n\n  mostRecentCollectionWithActivity: ContributionsCollection\n\n  mostRecentCollectionWithoutActivity: ContributionsCollection\n\n  popularIssueContribution: CreatedIssueContribution\n\n  popularPullRequestContribution: CreatedPullRequestContribution\n\n  pullRequestContributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n\n    orderBy: ContributionOrder\n  ): CreatedPullRequestContributionConnection!\n\n  pullRequestContributionsByRepository(\n    maxRepositories: Int = 25\n\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n  ): [PullRequestContributionsByRepository!]!\n\n  pullRequestReviewContributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: ContributionOrder\n  ): CreatedPullRequestReviewContributionConnection!\n\n  pullRequestReviewContributionsByRepository(\n    maxRepositories: Int = 25\n  ): [PullRequestReviewContributionsByRepository!]!\n\n  repositoryContributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    excludeFirst: Boolean = false\n\n    orderBy: ContributionOrder\n  ): CreatedRepositoryContributionConnection!\n\n  restrictedContributionsCount: Int!\n\n  startedAt: DateTime!\n\n  totalCommitContributions: Int!\n\n  totalIssueContributions(\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n  ): Int!\n\n  totalPullRequestContributions(\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n  ): Int!\n\n  totalPullRequestReviewContributions: Int!\n\n  totalRepositoriesWithContributedCommits: Int!\n\n  totalRepositoriesWithContributedIssues(\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n  ): Int!\n\n  totalRepositoriesWithContributedPullRequestReviews: Int!\n\n  totalRepositoriesWithContributedPullRequests(\n    excludeFirst: Boolean = false\n\n    excludePopular: Boolean = false\n  ): Int!\n\n  totalRepositoryContributions(excludeFirst: Boolean = false): Int!\n\n  user: User!\n}\n\ntype ConvertedNoteToIssueEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\ninput ConvertProjectCardNoteToIssueInput {\n  projectCardId: ID!\n\n  repositoryId: ID!\n\n  title: String\n\n  body: String\n\n  clientMutationId: String\n}\n\ntype ConvertProjectCardNoteToIssuePayload {\n  clientMutationId: String\n\n  projectCard: ProjectCard\n}\n\ninput CreateBranchProtectionRuleInput {\n  repositoryId: ID!\n\n  pattern: String!\n\n  requiresApprovingReviews: Boolean\n\n  requiredApprovingReviewCount: Int\n\n  requiresCommitSignatures: Boolean\n\n  isAdminEnforced: Boolean\n\n  requiresStatusChecks: Boolean\n\n  requiresStrictStatusChecks: Boolean\n\n  requiresCodeOwnerReviews: Boolean\n\n  dismissesStaleReviews: Boolean\n\n  restrictsReviewDismissals: Boolean\n\n  reviewDismissalActorIds: [ID!]\n\n  restrictsPushes: Boolean\n\n  pushActorIds: [ID!]\n\n  requiredStatusCheckContexts: [String!]\n\n  clientMutationId: String\n}\n\ntype CreateBranchProtectionRulePayload {\n  branchProtectionRule: BranchProtectionRule\n\n  clientMutationId: String\n}\n\ninput CreateContentAttachmentInput {\n  contentReferenceId: ID!\n\n  title: String!\n\n  body: String!\n\n  clientMutationId: String\n}\n\ntype CreatedCommitContribution implements Contribution {\n  commitCount: Int!\n\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype CreatedCommitContributionConnection {\n  edges: [CreatedCommitContributionEdge]\n\n  nodes: [CreatedCommitContribution]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype CreatedCommitContributionEdge {\n  cursor: String!\n\n  node: CreatedCommitContribution\n}\n\ntype CreatedIssueContribution implements Contribution {\n  isRestricted: Boolean!\n\n  issue: Issue!\n\n  occurredAt: DateTime!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype CreatedIssueContributionConnection {\n  edges: [CreatedIssueContributionEdge]\n\n  nodes: [CreatedIssueContribution]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype CreatedIssueContributionEdge {\n  cursor: String!\n\n  node: CreatedIssueContribution\n}\n\nunion CreatedIssueOrRestrictedContribution =\n  | CreatedIssueContribution\n  | RestrictedContribution\n\ntype CreatedPullRequestContribution implements Contribution {\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  pullRequest: PullRequest!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype CreatedPullRequestContributionConnection {\n  edges: [CreatedPullRequestContributionEdge]\n\n  nodes: [CreatedPullRequestContribution]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype CreatedPullRequestContributionEdge {\n  cursor: String!\n\n  node: CreatedPullRequestContribution\n}\n\nunion CreatedPullRequestOrRestrictedContribution =\n  | CreatedPullRequestContribution\n  | RestrictedContribution\n\ntype CreatedPullRequestReviewContribution implements Contribution {\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  pullRequest: PullRequest!\n\n  pullRequestReview: PullRequestReview!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype CreatedPullRequestReviewContributionConnection {\n  edges: [CreatedPullRequestReviewContributionEdge]\n\n  nodes: [CreatedPullRequestReviewContribution]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype CreatedPullRequestReviewContributionEdge {\n  cursor: String!\n\n  node: CreatedPullRequestReviewContribution\n}\n\ntype CreatedRepositoryContribution implements Contribution {\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype CreatedRepositoryContributionConnection {\n  edges: [CreatedRepositoryContributionEdge]\n\n  nodes: [CreatedRepositoryContribution]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype CreatedRepositoryContributionEdge {\n  cursor: String!\n\n  node: CreatedRepositoryContribution\n}\n\nunion CreatedRepositoryOrRestrictedContribution =\n  | CreatedRepositoryContribution\n  | RestrictedContribution\n\ninput CreateIssueInput {\n  repositoryId: ID!\n\n  title: String!\n\n  body: String\n\n  assigneeIds: [ID!]\n\n  milestoneId: ID\n\n  labelIds: [ID!]\n\n  projectIds: [ID!]\n\n  clientMutationId: String\n}\n\ntype CreateIssuePayload {\n  clientMutationId: String\n\n  issue: Issue\n}\n\ninput CreateProjectInput {\n  ownerId: ID!\n\n  name: String!\n\n  body: String\n\n  clientMutationId: String\n}\n\ntype CreateProjectPayload {\n  clientMutationId: String\n\n  project: Project\n}\n\ninput CreatePullRequestInput {\n  repositoryId: ID!\n\n  headRefName: String!\n\n  title: String!\n\n  body: String\n\n  maintainerCanModify: Boolean = true\n\n  clientMutationId: String\n}\n\ntype CreatePullRequestPayload {\n  clientMutationId: String\n\n  pullRequest: PullRequest\n}\n\ntype CrossReferencedEvent implements Node & UniformResourceLocatable {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  isCrossRepository: Boolean!\n\n  referencedAt: DateTime!\n\n  resourcePath: URI!\n\n  source: ReferencedSubject!\n\n  target: ReferencedSubject!\n\n  url: URI!\n\n  willCloseTarget: Boolean!\n}\n\nscalar Date\n\nscalar DateTime\n\ninput DeclineTopicSuggestionInput {\n  repositoryId: ID!\n\n  name: String!\n\n  reason: TopicSuggestionDeclineReason!\n\n  clientMutationId: String\n}\n\ntype DeclineTopicSuggestionPayload {\n  clientMutationId: String\n\n  topic: Topic\n}\n\nenum DefaultRepositoryPermissionField {\n  NONE\n\n  READ\n\n  WRITE\n\n  ADMIN\n}\n\ninterface Deletable {\n  viewerCanDelete: Boolean!\n}\n\ninput DeleteBranchProtectionRuleInput {\n  branchProtectionRuleId: ID!\n\n  clientMutationId: String\n}\n\ntype DeleteBranchProtectionRulePayload {\n  clientMutationId: String\n}\n\ninput DeleteIssueCommentInput {\n  id: ID!\n\n  clientMutationId: String\n}\n\ntype DeleteIssueCommentPayload {\n  clientMutationId: String\n}\n\ninput DeleteIssueInput {\n  issueId: ID!\n\n  clientMutationId: String\n}\n\ntype DeleteIssuePayload {\n  clientMutationId: String\n\n  repository: Repository\n}\n\ninput DeleteProjectCardInput {\n  cardId: ID!\n\n  clientMutationId: String\n}\n\ntype DeleteProjectCardPayload {\n  clientMutationId: String\n\n  column: ProjectColumn\n\n  deletedCardId: ID\n}\n\ninput DeleteProjectColumnInput {\n  columnId: ID!\n\n  clientMutationId: String\n}\n\ntype DeleteProjectColumnPayload {\n  clientMutationId: String\n\n  deletedColumnId: ID\n\n  project: Project\n}\n\ninput DeleteProjectInput {\n  projectId: ID!\n\n  clientMutationId: String\n}\n\ntype DeleteProjectPayload {\n  clientMutationId: String\n\n  owner: ProjectOwner\n}\n\ninput DeletePullRequestReviewCommentInput {\n  id: ID!\n\n  clientMutationId: String\n}\n\ntype DeletePullRequestReviewCommentPayload {\n  clientMutationId: String\n\n  pullRequestReview: PullRequestReview\n}\n\ninput DeletePullRequestReviewInput {\n  pullRequestReviewId: ID!\n\n  clientMutationId: String\n}\n\ntype DeletePullRequestReviewPayload {\n  clientMutationId: String\n\n  pullRequestReview: PullRequestReview\n}\n\ntype DemilestonedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  milestoneTitle: String!\n\n  subject: MilestoneItem!\n}\n\ntype DeployedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n\n  deployment: Deployment!\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  ref: Ref\n}\n\ntype DeployKey implements Node {\n  createdAt: DateTime!\n  id: ID!\n\n  key: String!\n\n  readOnly: Boolean!\n\n  title: String!\n\n  verified: Boolean!\n}\n\ntype DeployKeyConnection {\n  edges: [DeployKeyEdge]\n\n  nodes: [DeployKey]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype DeployKeyEdge {\n  cursor: String!\n\n  node: DeployKey\n}\n\ntype Deployment implements Node {\n  commit: Commit\n\n  commitOid: String!\n\n  createdAt: DateTime!\n\n  creator: Actor\n\n  databaseId: Int\n\n  description: String\n\n  environment: String\n  id: ID!\n\n  latestStatus: DeploymentStatus\n\n  payload: String\n\n  ref: Ref\n\n  repository: Repository!\n\n  state: DeploymentState\n\n  statuses(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): DeploymentStatusConnection\n\n  task: String\n\n  updatedAt: DateTime!\n}\n\ntype DeploymentConnection {\n  edges: [DeploymentEdge]\n\n  nodes: [Deployment]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype DeploymentEdge {\n  cursor: String!\n\n  node: Deployment\n}\n\ntype DeploymentEnvironmentChangedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  deploymentStatus: DeploymentStatus!\n  id: ID!\n\n  pullRequest: PullRequest!\n}\n\ninput DeploymentOrder {\n  field: DeploymentOrderField!\n\n  direction: OrderDirection!\n}\n\nenum DeploymentOrderField {\n  CREATED_AT\n}\n\nenum DeploymentState {\n  ABANDONED\n\n  ACTIVE\n\n  DESTROYED\n\n  ERROR\n\n  FAILURE\n\n  INACTIVE\n\n  PENDING\n\n  QUEUED\n\n  IN_PROGRESS\n}\n\ntype DeploymentStatus implements Node {\n  createdAt: DateTime!\n\n  creator: Actor\n\n  deployment: Deployment!\n\n  description: String\n\n  environmentUrl: URI\n  id: ID!\n\n  logUrl: URI\n\n  state: DeploymentStatusState!\n\n  updatedAt: DateTime!\n}\n\ntype DeploymentStatusConnection {\n  edges: [DeploymentStatusEdge]\n\n  nodes: [DeploymentStatus]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype DeploymentStatusEdge {\n  cursor: String!\n\n  node: DeploymentStatus\n}\n\nenum DeploymentStatusState {\n  PENDING\n\n  SUCCESS\n\n  FAILURE\n\n  INACTIVE\n\n  ERROR\n\n  QUEUED\n\n  IN_PROGRESS\n}\n\ninput DismissPullRequestReviewInput {\n  pullRequestReviewId: ID!\n\n  message: String!\n\n  clientMutationId: String\n}\n\ntype DismissPullRequestReviewPayload {\n  clientMutationId: String\n\n  pullRequestReview: PullRequestReview\n}\n\ninput DraftPullRequestReviewComment {\n  path: String!\n\n  position: Int!\n\n  body: String!\n}\n\ntype ExternalIdentity implements Node {\n  guid: String!\n  id: ID!\n\n  organizationInvitation: OrganizationInvitation\n\n  samlIdentity: ExternalIdentitySamlAttributes\n\n  scimIdentity: ExternalIdentityScimAttributes\n\n  user: User\n}\n\ntype ExternalIdentityConnection {\n  edges: [ExternalIdentityEdge]\n\n  nodes: [ExternalIdentity]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ExternalIdentityEdge {\n  cursor: String!\n\n  node: ExternalIdentity\n}\n\ntype ExternalIdentitySamlAttributes {\n  nameId: String\n}\n\ntype ExternalIdentityScimAttributes {\n  username: String\n}\n\ntype FollowerConnection {\n  edges: [UserEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype FollowingConnection {\n  edges: [UserEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype Gist implements Node & Starrable {\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): GistCommentConnection!\n\n  createdAt: DateTime!\n\n  description: String\n\n  files(limit: Int = 10): [GistFile]\n  id: ID!\n\n  isFork: Boolean!\n\n  isPublic: Boolean!\n\n  name: String!\n\n  owner: RepositoryOwner\n\n  pushedAt: DateTime\n\n  stargazers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: StarOrder\n  ): StargazerConnection!\n\n  updatedAt: DateTime!\n\n  viewerHasStarred: Boolean!\n}\n\ntype GistComment implements Node & Comment & Deletable & Updatable & UpdatableComment {\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  editor: Actor\n\n  gist: Gist!\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  isMinimized: Boolean!\n\n  lastEditedAt: DateTime\n\n  minimizedReason: String\n\n  publishedAt: DateTime\n\n  updatedAt: DateTime!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanDelete: Boolean!\n\n  viewerCanMinimize: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n}\n\ntype GistCommentConnection {\n  edges: [GistCommentEdge]\n\n  nodes: [GistComment]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype GistCommentEdge {\n  cursor: String!\n\n  node: GistComment\n}\n\ntype GistConnection {\n  edges: [GistEdge]\n\n  nodes: [Gist]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype GistEdge {\n  cursor: String!\n\n  node: Gist\n}\n\ntype GistFile {\n  encodedName: String\n\n  encoding: String\n\n  extension: String\n\n  isImage: Boolean!\n\n  isTruncated: Boolean!\n\n  language: Language\n\n  name: String\n\n  size: Int\n\n  text(truncate: Int): String\n}\n\ninput GistOrder {\n  field: GistOrderField!\n\n  direction: OrderDirection!\n}\n\nenum GistOrderField {\n  CREATED_AT\n\n  UPDATED_AT\n\n  PUSHED_AT\n}\n\nenum GistPrivacy {\n  PUBLIC\n\n  SECRET\n\n  ALL\n}\n\ntype GitActor {\n  avatarUrl(size: Int): URI!\n\n  date: GitTimestamp\n\n  email: String\n\n  name: String\n\n  user: User\n}\n\ntype GitHubMetadata {\n  gitHubServicesSha: GitObjectID!\n\n  gitIpAddresses: [String!]\n\n  hookIpAddresses: [String!]\n\n  importerIpAddresses: [String!]\n\n  isPasswordAuthenticationVerifiable: Boolean!\n\n  pagesIpAddresses: [String!]\n}\n\ninterface GitObject {\n  abbreviatedOid: String!\n\n  commitResourcePath: URI!\n\n  commitUrl: URI!\n  id: ID!\n\n  oid: GitObjectID!\n\n  repository: Repository!\n}\n\nscalar GitObjectID\n\ninterface GitSignature {\n  email: String!\n\n  isValid: Boolean!\n\n  payload: String!\n\n  signature: String!\n\n  signer: User\n\n  state: GitSignatureState!\n\n  wasSignedByGitHub: Boolean!\n}\n\nenum GitSignatureState {\n  VALID\n\n  INVALID\n\n  MALFORMED_SIG\n\n  UNKNOWN_KEY\n\n  BAD_EMAIL\n\n  UNVERIFIED_EMAIL\n\n  NO_USER\n\n  UNKNOWN_SIG_TYPE\n\n  UNSIGNED\n\n  GPGVERIFY_UNAVAILABLE\n\n  GPGVERIFY_ERROR\n\n  NOT_SIGNING_KEY\n\n  EXPIRED_KEY\n\n  OCSP_PENDING\n\n  OCSP_ERROR\n\n  BAD_CERT\n\n  OCSP_REVOKED\n}\n\nscalar GitSSHRemote\n\nscalar GitTimestamp\n\ntype GpgSignature implements GitSignature {\n  email: String!\n\n  isValid: Boolean!\n\n  keyId: String\n\n  payload: String!\n\n  signature: String!\n\n  signer: User\n\n  state: GitSignatureState!\n\n  wasSignedByGitHub: Boolean!\n}\n\ntype HeadRefDeletedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  headRef: Ref\n\n  headRefName: String!\n  id: ID!\n\n  pullRequest: PullRequest!\n}\n\ntype HeadRefForcePushedEvent implements Node {\n  actor: Actor\n\n  afterCommit: Commit\n\n  beforeCommit: Commit\n\n  createdAt: DateTime!\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  ref: Ref\n}\n\ntype HeadRefRestoredEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  pullRequest: PullRequest!\n}\n\nscalar HTML\n\nenum IdentityProviderConfigurationState {\n  ENFORCED\n\n  CONFIGURED\n\n  UNCONFIGURED\n}\n\ninput ImportProjectInput {\n  ownerName: String!\n\n  name: String!\n\n  body: String\n\n  public: Boolean = false\n\n  columnImports: [ProjectColumnImport!]!\n\n  clientMutationId: String\n}\n\ntype Issue implements Node & Assignable & Closable & Comment & Updatable & UpdatableComment & Labelable & Lockable & Reactable & RepositoryNode & Subscribable & UniformResourceLocatable {\n  activeLockReason: LockReason\n\n  assignees(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  closed: Boolean!\n\n  closedAt: DateTime\n\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueCommentConnection!\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  editor: Actor\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  labels(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): LabelConnection\n\n  lastEditedAt: DateTime\n\n  locked: Boolean!\n\n  milestone: Milestone\n\n  number: Int!\n\n  participants(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  projectCards(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    archivedStates: [ProjectCardArchivedState]\n  ): ProjectCardConnection!\n\n  publishedAt: DateTime\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  state: IssueState!\n\n  timeline(\n    since: DateTime\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueTimelineConnection!\n\n  timelineItems(\n    since: DateTime\n\n    skip: Int\n\n    itemTypes: [IssueTimelineItemsItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueTimelineItemsConnection!\n\n  title: String!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanReact: Boolean!\n\n  viewerCanSubscribe: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n\n  viewerSubscription: SubscriptionState\n}\n\ntype IssueComment implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode {\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  editor: Actor\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  isMinimized: Boolean!\n\n  issue: Issue!\n\n  lastEditedAt: DateTime\n\n  minimizedReason: String\n\n  publishedAt: DateTime\n\n  pullRequest: PullRequest\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanDelete: Boolean!\n\n  viewerCanMinimize: Boolean!\n\n  viewerCanReact: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n}\n\ntype IssueCommentConnection {\n  edges: [IssueCommentEdge]\n\n  nodes: [IssueComment]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype IssueCommentEdge {\n  cursor: String!\n\n  node: IssueComment\n}\n\ntype IssueConnection {\n  edges: [IssueEdge]\n\n  nodes: [Issue]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype IssueContributionsByRepository {\n  contributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: ContributionOrder\n  ): CreatedIssueContributionConnection!\n\n  repository: Repository!\n}\n\ntype IssueEdge {\n  cursor: String!\n\n  node: Issue\n}\n\ninput IssueFilters {\n  assignee: String\n\n  createdBy: String\n\n  labels: [String!]\n\n  mentioned: String\n\n  milestone: String\n\n  since: DateTime\n\n  states: [IssueState!]\n\n  viewerSubscribed: Boolean = false\n}\n\ninput IssueOrder {\n  field: IssueOrderField!\n\n  direction: OrderDirection!\n}\n\nenum IssueOrderField {\n  CREATED_AT\n\n  UPDATED_AT\n\n  COMMENTS\n}\n\nunion IssueOrPullRequest = Issue | PullRequest\n\nenum IssuePubSubTopic {\n  UPDATED\n\n  MARKASREAD\n\n  TIMELINE\n\n  STATE\n}\n\nenum IssueState {\n  OPEN\n\n  CLOSED\n}\n\ntype IssueTimelineConnection {\n  edges: [IssueTimelineItemEdge]\n\n  nodes: [IssueTimelineItem]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\nunion IssueTimelineItem =\n  | Commit\n  | IssueComment\n  | CrossReferencedEvent\n  | ClosedEvent\n  | ReopenedEvent\n  | SubscribedEvent\n  | UnsubscribedEvent\n  | ReferencedEvent\n  | AssignedEvent\n  | UnassignedEvent\n  | LabeledEvent\n  | UnlabeledEvent\n  | UserBlockedEvent\n  | MilestonedEvent\n  | DemilestonedEvent\n  | RenamedTitleEvent\n  | LockedEvent\n  | UnlockedEvent\n  | TransferredEvent\n\ntype IssueTimelineItemEdge {\n  cursor: String!\n\n  node: IssueTimelineItem\n}\n\nunion IssueTimelineItems =\n  | IssueComment\n  | CrossReferencedEvent\n  | AddedToProjectEvent\n  | AssignedEvent\n  | ClosedEvent\n  | CommentDeletedEvent\n  | ConvertedNoteToIssueEvent\n  | DemilestonedEvent\n  | LabeledEvent\n  | LockedEvent\n  | MentionedEvent\n  | MilestonedEvent\n  | MovedColumnsInProjectEvent\n  | PinnedEvent\n  | ReferencedEvent\n  | RemovedFromProjectEvent\n  | RenamedTitleEvent\n  | ReopenedEvent\n  | SubscribedEvent\n  | TransferredEvent\n  | UnassignedEvent\n  | UnlabeledEvent\n  | UnlockedEvent\n  | UserBlockedEvent\n  | UnpinnedEvent\n  | UnsubscribedEvent\n\ntype IssueTimelineItemsConnection {\n  edges: [IssueTimelineItemsEdge]\n\n  filteredCount: Int!\n\n  nodes: [IssueTimelineItems]\n\n  pageCount: Int!\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n\n  updatedAt: DateTime!\n}\n\ntype IssueTimelineItemsEdge {\n  cursor: String!\n\n  node: IssueTimelineItems\n}\n\nenum IssueTimelineItemsItemType {\n  ISSUE_COMMENT\n\n  CROSS_REFERENCED_EVENT\n\n  ADDED_TO_PROJECT_EVENT\n\n  ASSIGNED_EVENT\n\n  CLOSED_EVENT\n\n  COMMENT_DELETED_EVENT\n\n  CONVERTED_NOTE_TO_ISSUE_EVENT\n\n  DEMILESTONED_EVENT\n\n  LABELED_EVENT\n\n  LOCKED_EVENT\n\n  MENTIONED_EVENT\n\n  MILESTONED_EVENT\n\n  MOVED_COLUMNS_IN_PROJECT_EVENT\n\n  PINNED_EVENT\n\n  REFERENCED_EVENT\n\n  REMOVED_FROM_PROJECT_EVENT\n\n  RENAMED_TITLE_EVENT\n\n  REOPENED_EVENT\n\n  SUBSCRIBED_EVENT\n\n  TRANSFERRED_EVENT\n\n  UNASSIGNED_EVENT\n\n  UNLABELED_EVENT\n\n  UNLOCKED_EVENT\n\n  USER_BLOCKED_EVENT\n\n  UNPINNED_EVENT\n\n  UNSUBSCRIBED_EVENT\n}\n\ntype JoinedGitHubContribution implements Contribution {\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype Label implements Node {\n  color: String!\n\n  createdAt: DateTime\n\n  description: String\n  id: ID!\n\n  isDefault: Boolean!\n\n  issues(\n    orderBy: IssueOrder\n\n    labels: [String!]\n\n    states: [IssueState!]\n\n    filterBy: IssueFilters\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueConnection!\n\n  name: String!\n\n  pullRequests(\n    states: [PullRequestState!]\n\n    labels: [String!]\n\n    headRefName: String\n\n    baseRefName: String\n\n    orderBy: IssueOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  updatedAt: DateTime\n\n  url: URI!\n}\n\ninterface Labelable {\n  labels(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): LabelConnection\n}\n\ntype LabelConnection {\n  edges: [LabelEdge]\n\n  nodes: [Label]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype LabeledEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  label: Label!\n\n  labelable: Labelable!\n}\n\ntype LabelEdge {\n  cursor: String!\n\n  node: Label\n}\n\ntype Language implements Node {\n  color: String\n  id: ID!\n\n  name: String!\n}\n\ntype LanguageConnection {\n  edges: [LanguageEdge]\n\n  nodes: [Language]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n\n  totalSize: Int!\n}\n\ntype LanguageEdge {\n  cursor: String!\n  node: Language!\n\n  size: Int!\n}\n\ninput LanguageOrder {\n  field: LanguageOrderField!\n\n  direction: OrderDirection!\n}\n\nenum LanguageOrderField {\n  SIZE\n}\n\ntype License implements Node {\n  body: String!\n\n  conditions: [LicenseRule]!\n\n  description: String\n\n  featured: Boolean!\n\n  hidden: Boolean!\n  id: ID!\n\n  implementation: String\n\n  key: String!\n\n  limitations: [LicenseRule]!\n\n  name: String!\n\n  nickname: String\n\n  permissions: [LicenseRule]!\n\n  pseudoLicense: Boolean!\n\n  spdxId: String\n\n  url: URI\n}\n\ntype LicenseRule {\n  description: String!\n\n  key: String!\n\n  label: String!\n}\n\ninterface Lockable {\n  activeLockReason: LockReason\n\n  locked: Boolean!\n}\n\ntype LockedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  lockReason: LockReason\n\n  lockable: Lockable!\n}\n\ninput LockLockableInput {\n  lockableId: ID!\n\n  lockReason: LockReason\n\n  clientMutationId: String\n}\n\ntype LockLockablePayload {\n  clientMutationId: String\n\n  lockedRecord: Lockable\n}\n\nenum LockReason {\n  OFF_TOPIC\n\n  TOO_HEATED\n\n  RESOLVED\n\n  SPAM\n}\n\ntype Mannequin implements Node & Actor & UniformResourceLocatable {\n  avatarUrl(size: Int): URI!\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n\n  login: String!\n\n  resourcePath: URI!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype MarketplaceCategory implements Node {\n  description: String\n\n  howItWorks: String\n  id: ID!\n\n  name: String!\n\n  primaryListingCount: Int!\n\n  resourcePath: URI!\n\n  secondaryListingCount: Int!\n\n  slug: String!\n\n  url: URI!\n}\n\ntype MarketplaceListing implements Node {\n  app: App\n\n  companyUrl: URI\n\n  configurationResourcePath: URI!\n\n  configurationUrl: URI!\n\n  documentationUrl: URI\n\n  extendedDescription: String\n\n  extendedDescriptionHTML: HTML!\n\n  fullDescription: String!\n\n  fullDescriptionHTML: HTML!\n\n  hasApprovalBeenRequested: Boolean!\n    @deprecated(\n      reason: \"`hasApprovalBeenRequested` will be removed. Use `isVerificationPendingFromDraft` instead. Removal on 2019-10-01 UTC.\"\n    )\n\n  hasPublishedFreeTrialPlans: Boolean!\n\n  hasTermsOfService: Boolean!\n\n  howItWorks: String\n\n  howItWorksHTML: HTML!\n  id: ID!\n\n  installationUrl: URI\n\n  installedForViewer: Boolean!\n\n  isApproved: Boolean!\n    @deprecated(\n      reason: \"`isApproved` will be removed. Use `isPublic` instead. Removal on 2019-10-01 UTC.\"\n    )\n\n  isArchived: Boolean!\n\n  isDelisted: Boolean!\n    @deprecated(\n      reason: \"`isDelisted` will be removed. Use `isArchived` instead. Removal on 2019-10-01 UTC.\"\n    )\n\n  isDraft: Boolean!\n\n  isPaid: Boolean!\n\n  isPublic: Boolean!\n\n  isRejected: Boolean!\n\n  isUnverified: Boolean!\n\n  isUnverifiedPending: Boolean!\n\n  isVerificationPendingFromDraft: Boolean!\n\n  isVerificationPendingFromUnverified: Boolean!\n\n  isVerified: Boolean!\n\n  logoBackgroundColor: String!\n\n  logoUrl(size: Int = 400): URI\n\n  name: String!\n\n  normalizedShortDescription: String!\n\n  pricingUrl: URI\n\n  primaryCategory: MarketplaceCategory!\n\n  privacyPolicyUrl: URI!\n\n  resourcePath: URI!\n\n  screenshotUrls: [String]!\n\n  secondaryCategory: MarketplaceCategory\n\n  shortDescription: String!\n\n  slug: String!\n\n  statusUrl: URI\n\n  supportEmail: String\n\n  supportUrl: URI!\n\n  termsOfServiceUrl: URI\n\n  url: URI!\n\n  viewerCanAddPlans: Boolean!\n\n  viewerCanApprove: Boolean!\n\n  viewerCanDelist: Boolean!\n\n  viewerCanEdit: Boolean!\n\n  viewerCanEditCategories: Boolean!\n\n  viewerCanEditPlans: Boolean!\n\n  viewerCanRedraft: Boolean!\n\n  viewerCanReject: Boolean!\n\n  viewerCanRequestApproval: Boolean!\n\n  viewerHasPurchased: Boolean!\n\n  viewerHasPurchasedForAllOrganizations: Boolean!\n\n  viewerIsListingAdmin: Boolean!\n}\n\ntype MarketplaceListingConnection {\n  edges: [MarketplaceListingEdge]\n\n  nodes: [MarketplaceListing]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype MarketplaceListingEdge {\n  cursor: String!\n\n  node: MarketplaceListing\n}\n\ninterface MemberStatusable {\n  memberStatuses(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: UserStatusOrder\n  ): UserStatusConnection!\n}\n\ntype MentionedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\nenum MergeableState {\n  MERGEABLE\n\n  CONFLICTING\n\n  UNKNOWN\n}\n\ntype MergedEvent implements Node & UniformResourceLocatable {\n  actor: Actor\n\n  commit: Commit\n\n  createdAt: DateTime!\n  id: ID!\n\n  mergeRef: Ref\n\n  mergeRefName: String!\n\n  pullRequest: PullRequest!\n\n  resourcePath: URI!\n\n  url: URI!\n}\n\ninput MergePullRequestInput {\n  pullRequestId: ID!\n\n  commitHeadline: String\n\n  commitBody: String\n\n  expectedHeadOid: GitObjectID\n\n  clientMutationId: String\n}\n\ntype MergePullRequestPayload {\n  clientMutationId: String\n\n  pullRequest: PullRequest\n}\n\ntype Milestone implements Node & Closable & UniformResourceLocatable {\n  closed: Boolean!\n\n  closedAt: DateTime\n\n  createdAt: DateTime!\n\n  creator: Actor\n\n  description: String\n\n  dueOn: DateTime\n  id: ID!\n\n  issues(\n    orderBy: IssueOrder\n\n    labels: [String!]\n\n    states: [IssueState!]\n\n    filterBy: IssueFilters\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueConnection!\n\n  number: Int!\n\n  pullRequests(\n    states: [PullRequestState!]\n\n    labels: [String!]\n\n    headRefName: String\n\n    baseRefName: String\n\n    orderBy: IssueOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  state: MilestoneState!\n\n  title: String!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype MilestoneConnection {\n  edges: [MilestoneEdge]\n\n  nodes: [Milestone]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype MilestonedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  milestoneTitle: String!\n\n  subject: MilestoneItem!\n}\n\ntype MilestoneEdge {\n  cursor: String!\n\n  node: Milestone\n}\n\nunion MilestoneItem = Issue | PullRequest\n\ninput MilestoneOrder {\n  field: MilestoneOrderField!\n\n  direction: OrderDirection!\n}\n\nenum MilestoneOrderField {\n  DUE_DATE\n\n  CREATED_AT\n\n  UPDATED_AT\n\n  NUMBER\n}\n\nenum MilestoneState {\n  OPEN\n\n  CLOSED\n}\n\ninput MinimizeCommentInput {\n  subjectId: ID!\n\n  classifier: ReportedContentClassifiers!\n\n  clientMutationId: String\n}\n\ntype MovedColumnsInProjectEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\ninput MoveProjectCardInput {\n  cardId: ID!\n\n  columnId: ID!\n\n  afterCardId: ID\n\n  clientMutationId: String\n}\n\ntype MoveProjectCardPayload {\n  cardEdge: ProjectCardEdge\n\n  clientMutationId: String\n}\n\ninput MoveProjectColumnInput {\n  columnId: ID!\n\n  afterColumnId: ID\n\n  clientMutationId: String\n}\n\ntype MoveProjectColumnPayload {\n  clientMutationId: String\n\n  columnEdge: ProjectColumnEdge\n}\n\ntype Mutation {\n  acceptTopicSuggestion(\n    input: AcceptTopicSuggestionInput!\n  ): AcceptTopicSuggestionPayload\n\n  addAssigneesToAssignable(\n    input: AddAssigneesToAssignableInput!\n  ): AddAssigneesToAssignablePayload\n\n  addComment(input: AddCommentInput!): AddCommentPayload\n\n  addLabelsToLabelable(\n    input: AddLabelsToLabelableInput!\n  ): AddLabelsToLabelablePayload\n\n  addProjectCard(input: AddProjectCardInput!): AddProjectCardPayload\n\n  addProjectColumn(input: AddProjectColumnInput!): AddProjectColumnPayload\n\n  addPullRequestReview(\n    input: AddPullRequestReviewInput!\n  ): AddPullRequestReviewPayload\n\n  addPullRequestReviewComment(\n    input: AddPullRequestReviewCommentInput!\n  ): AddPullRequestReviewCommentPayload\n\n  addReaction(input: AddReactionInput!): AddReactionPayload\n\n  addStar(input: AddStarInput!): AddStarPayload\n\n  changeUserStatus(input: ChangeUserStatusInput!): ChangeUserStatusPayload\n\n  clearLabelsFromLabelable(\n    input: ClearLabelsFromLabelableInput!\n  ): ClearLabelsFromLabelablePayload\n\n  cloneProject(input: CloneProjectInput!): CloneProjectPayload\n\n  closeIssue(input: CloseIssueInput!): CloseIssuePayload\n\n  closePullRequest(input: ClosePullRequestInput!): ClosePullRequestPayload\n\n  convertProjectCardNoteToIssue(\n    input: ConvertProjectCardNoteToIssueInput!\n  ): ConvertProjectCardNoteToIssuePayload\n\n  createBranchProtectionRule(\n    input: CreateBranchProtectionRuleInput!\n  ): CreateBranchProtectionRulePayload\n\n  createIssue(input: CreateIssueInput!): CreateIssuePayload\n\n  createProject(input: CreateProjectInput!): CreateProjectPayload\n\n  createPullRequest(input: CreatePullRequestInput!): CreatePullRequestPayload\n\n  declineTopicSuggestion(\n    input: DeclineTopicSuggestionInput!\n  ): DeclineTopicSuggestionPayload\n\n  deleteBranchProtectionRule(\n    input: DeleteBranchProtectionRuleInput!\n  ): DeleteBranchProtectionRulePayload\n\n  deleteIssue(input: DeleteIssueInput!): DeleteIssuePayload\n\n  deleteIssueComment(input: DeleteIssueCommentInput!): DeleteIssueCommentPayload\n\n  deleteProject(input: DeleteProjectInput!): DeleteProjectPayload\n\n  deleteProjectCard(input: DeleteProjectCardInput!): DeleteProjectCardPayload\n\n  deleteProjectColumn(\n    input: DeleteProjectColumnInput!\n  ): DeleteProjectColumnPayload\n\n  deletePullRequestReview(\n    input: DeletePullRequestReviewInput!\n  ): DeletePullRequestReviewPayload\n\n  deletePullRequestReviewComment(\n    input: DeletePullRequestReviewCommentInput!\n  ): DeletePullRequestReviewCommentPayload\n\n  dismissPullRequestReview(\n    input: DismissPullRequestReviewInput!\n  ): DismissPullRequestReviewPayload\n\n  lockLockable(input: LockLockableInput!): LockLockablePayload\n\n  mergePullRequest(input: MergePullRequestInput!): MergePullRequestPayload\n\n  moveProjectCard(input: MoveProjectCardInput!): MoveProjectCardPayload\n\n  moveProjectColumn(input: MoveProjectColumnInput!): MoveProjectColumnPayload\n\n  removeAssigneesFromAssignable(\n    input: RemoveAssigneesFromAssignableInput!\n  ): RemoveAssigneesFromAssignablePayload\n\n  removeLabelsFromLabelable(\n    input: RemoveLabelsFromLabelableInput!\n  ): RemoveLabelsFromLabelablePayload\n\n  removeOutsideCollaborator(\n    input: RemoveOutsideCollaboratorInput!\n  ): RemoveOutsideCollaboratorPayload\n\n  removeReaction(input: RemoveReactionInput!): RemoveReactionPayload\n\n  removeStar(input: RemoveStarInput!): RemoveStarPayload\n\n  reopenIssue(input: ReopenIssueInput!): ReopenIssuePayload\n\n  reopenPullRequest(input: ReopenPullRequestInput!): ReopenPullRequestPayload\n\n  requestReviews(input: RequestReviewsInput!): RequestReviewsPayload\n\n  resolveReviewThread(\n    input: ResolveReviewThreadInput!\n  ): ResolveReviewThreadPayload\n\n  submitPullRequestReview(\n    input: SubmitPullRequestReviewInput!\n  ): SubmitPullRequestReviewPayload\n\n  unlockLockable(input: UnlockLockableInput!): UnlockLockablePayload\n\n  unmarkIssueAsDuplicate(\n    input: UnmarkIssueAsDuplicateInput!\n  ): UnmarkIssueAsDuplicatePayload\n\n  unresolveReviewThread(\n    input: UnresolveReviewThreadInput!\n  ): UnresolveReviewThreadPayload\n\n  updateBranchProtectionRule(\n    input: UpdateBranchProtectionRuleInput!\n  ): UpdateBranchProtectionRulePayload\n\n  updateIssue(input: UpdateIssueInput!): UpdateIssuePayload\n\n  updateIssueComment(input: UpdateIssueCommentInput!): UpdateIssueCommentPayload\n\n  updateProject(input: UpdateProjectInput!): UpdateProjectPayload\n\n  updateProjectCard(input: UpdateProjectCardInput!): UpdateProjectCardPayload\n\n  updateProjectColumn(\n    input: UpdateProjectColumnInput!\n  ): UpdateProjectColumnPayload\n\n  updatePullRequest(input: UpdatePullRequestInput!): UpdatePullRequestPayload\n\n  updatePullRequestReview(\n    input: UpdatePullRequestReviewInput!\n  ): UpdatePullRequestReviewPayload\n\n  updatePullRequestReviewComment(\n    input: UpdatePullRequestReviewCommentInput!\n  ): UpdatePullRequestReviewCommentPayload\n\n  updateSubscription(input: UpdateSubscriptionInput!): UpdateSubscriptionPayload\n\n  updateTopics(input: UpdateTopicsInput!): UpdateTopicsPayload\n}\n\ninterface Node {\n  id: ID!\n}\n\nenum OrderDirection {\n  ASC\n\n  DESC\n}\n\ntype Organization implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch & ProjectOwner & RepositoryOwner & UniformResourceLocatable & MemberStatusable & ProfileOwner {\n  anyPinnableItems(type: PinnableItemType): Boolean!\n\n  avatarUrl(size: Int): URI!\n\n  databaseId: Int\n\n  description: String\n\n  email: String\n  id: ID!\n\n  isVerified: Boolean!\n\n  itemShowcase: ProfileItemShowcase!\n\n  location: String\n\n  login: String!\n\n  memberStatuses(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: UserStatusOrder\n  ): UserStatusConnection!\n\n  membersWithRole(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): OrganizationMemberConnection!\n\n  name: String\n\n  newTeamResourcePath: URI!\n\n  newTeamUrl: URI!\n\n  organizationBillingEmail: String\n\n  pendingMembers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  pinnableItems(\n    types: [PinnableItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PinnableItemConnection!\n\n  pinnedItems(\n    types: [PinnableItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PinnableItemConnection!\n\n  pinnedItemsRemaining: Int!\n\n  pinnedRepositories(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryConnection!\n    @deprecated(\n      reason: \"pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-07-01 UTC.\"\n    )\n\n  project(number: Int!): Project\n\n  projects(\n    orderBy: ProjectOrder\n\n    search: String\n\n    states: [ProjectState!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ProjectConnection!\n\n  projectsResourcePath: URI!\n\n  projectsUrl: URI!\n\n  repositories(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    isFork: Boolean\n  ): RepositoryConnection!\n\n  repository(name: String!): Repository\n\n  requiresTwoFactorAuthentication: Boolean\n\n  resourcePath: URI!\n\n  samlIdentityProvider: OrganizationIdentityProvider\n\n  team(slug: String!): Team\n\n  teams(\n    privacy: TeamPrivacy\n\n    role: TeamRole\n\n    query: String\n\n    userLogins: [String!]\n\n    orderBy: TeamOrder\n\n    ldapMapped: Boolean\n\n    rootTeamsOnly: Boolean = false\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): TeamConnection!\n\n  teamsResourcePath: URI!\n\n  teamsUrl: URI!\n\n  url: URI!\n\n  viewerCanAdminister: Boolean!\n\n  viewerCanChangePinnedItems: Boolean!\n\n  viewerCanCreateProjects: Boolean!\n\n  viewerCanCreateRepositories: Boolean!\n\n  viewerCanCreateTeams: Boolean!\n\n  viewerIsAMember: Boolean!\n\n  websiteUrl: URI\n}\n\ntype OrganizationConnection {\n  edges: [OrganizationEdge]\n\n  nodes: [Organization]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype OrganizationEdge {\n  cursor: String!\n\n  node: Organization\n}\n\ntype OrganizationIdentityProvider implements Node {\n  digestMethod: URI\n\n  externalIdentities(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ExternalIdentityConnection!\n  id: ID!\n\n  idpCertificate: X509Certificate\n\n  issuer: String\n\n  organization: Organization\n\n  signatureMethod: URI\n\n  ssoUrl: URI\n}\n\ntype OrganizationInvitation implements Node {\n  createdAt: DateTime!\n\n  email: String\n  id: ID!\n\n  invitationType: OrganizationInvitationType!\n\n  invitee: User\n\n  inviter: User!\n\n  organization: Organization!\n\n  role: OrganizationInvitationRole!\n}\n\ntype OrganizationInvitationConnection {\n  edges: [OrganizationInvitationEdge]\n\n  nodes: [OrganizationInvitation]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype OrganizationInvitationEdge {\n  cursor: String!\n\n  node: OrganizationInvitation\n}\n\nenum OrganizationInvitationRole {\n  DIRECT_MEMBER\n\n  ADMIN\n\n  BILLING_MANAGER\n\n  REINSTATE\n}\n\nenum OrganizationInvitationType {\n  USER\n\n  EMAIL\n}\n\ntype OrganizationMemberConnection {\n  edges: [OrganizationMemberEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype OrganizationMemberEdge {\n  cursor: String!\n\n  hasTwoFactorEnabled: Boolean\n\n  node: User\n\n  role: OrganizationMemberRole\n}\n\nenum OrganizationMemberRole {\n  MEMBER\n\n  ADMIN\n}\n\ntype PageInfo {\n  endCursor: String\n\n  hasNextPage: Boolean!\n\n  hasPreviousPage: Boolean!\n\n  startCursor: String\n}\n\nunion PermissionGranter = Organization | Repository | Team\n\ntype PermissionSource {\n  organization: Organization!\n\n  permission: DefaultRepositoryPermissionField!\n\n  source: PermissionGranter!\n}\n\ninput PinIssueInput {\n  issueId: ID!\n\n  clientMutationId: String\n}\n\nunion PinnableItem = Gist | Repository\n\ntype PinnableItemConnection {\n  edges: [PinnableItemEdge]\n\n  nodes: [PinnableItem]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PinnableItemEdge {\n  cursor: String!\n\n  node: PinnableItem\n}\n\nenum PinnableItemType {\n  REPOSITORY\n\n  GIST\n\n  ISSUE\n}\n\ninterface ProfileOwner {\n  anyPinnableItems(type: PinnableItemType): Boolean!\n\n  email: String\n  id: ID!\n\n  itemShowcase: ProfileItemShowcase!\n\n  location: String\n\n  login: String!\n\n  name: String\n\n  pinnableItems(\n    types: [PinnableItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PinnableItemConnection!\n\n  pinnedItems(\n    types: [PinnableItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PinnableItemConnection!\n\n  pinnedItemsRemaining: Int!\n\n  viewerCanChangePinnedItems: Boolean!\n\n  websiteUrl: URI\n}\n\ntype Project implements Node & Closable & Updatable {\n  body: String\n\n  bodyHTML: HTML!\n\n  closed: Boolean!\n\n  closedAt: DateTime\n\n  columns(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ProjectColumnConnection!\n\n  createdAt: DateTime!\n\n  creator: Actor\n\n  databaseId: Int\n  id: ID!\n\n  name: String!\n\n  number: Int!\n\n  owner: ProjectOwner!\n\n  pendingCards(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    archivedStates: [ProjectCardArchivedState]\n  ): ProjectCardConnection!\n\n  resourcePath: URI!\n\n  state: ProjectState!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  viewerCanUpdate: Boolean!\n}\n\ntype ProjectCard implements Node {\n  column: ProjectColumn\n\n  content: ProjectCardItem\n\n  createdAt: DateTime!\n\n  creator: Actor\n\n  databaseId: Int\n  id: ID!\n\n  isArchived: Boolean!\n\n  note: String\n\n  project: Project!\n\n  resourcePath: URI!\n\n  state: ProjectCardState\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\nenum ProjectCardArchivedState {\n  ARCHIVED\n\n  NOT_ARCHIVED\n}\n\ntype ProjectCardConnection {\n  edges: [ProjectCardEdge]\n\n  nodes: [ProjectCard]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ProjectCardEdge {\n  cursor: String!\n\n  node: ProjectCard\n}\n\ninput ProjectCardImport {\n  repository: String!\n\n  number: Int!\n}\n\nunion ProjectCardItem = Issue | PullRequest\n\nenum ProjectCardState {\n  CONTENT_ONLY\n\n  NOTE_ONLY\n\n  REDACTED\n}\n\ntype ProjectColumn implements Node {\n  cards(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    archivedStates: [ProjectCardArchivedState]\n  ): ProjectCardConnection!\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n\n  name: String!\n\n  project: Project!\n\n  purpose: ProjectColumnPurpose\n\n  resourcePath: URI!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype ProjectColumnConnection {\n  edges: [ProjectColumnEdge]\n\n  nodes: [ProjectColumn]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ProjectColumnEdge {\n  cursor: String!\n\n  node: ProjectColumn\n}\n\ninput ProjectColumnImport {\n  columnName: String!\n\n  position: Int!\n\n  issues: [ProjectCardImport!]\n}\n\nenum ProjectColumnPurpose {\n  TODO\n\n  IN_PROGRESS\n\n  DONE\n}\n\ntype ProjectConnection {\n  edges: [ProjectEdge]\n\n  nodes: [Project]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ProjectEdge {\n  cursor: String!\n\n  node: Project\n}\n\ninput ProjectOrder {\n  field: ProjectOrderField!\n\n  direction: OrderDirection!\n}\n\nenum ProjectOrderField {\n  CREATED_AT\n\n  UPDATED_AT\n\n  NAME\n}\n\ninterface ProjectOwner {\n  id: ID!\n\n  project(number: Int!): Project\n\n  projects(\n    orderBy: ProjectOrder\n\n    search: String\n\n    states: [ProjectState!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ProjectConnection!\n\n  projectsResourcePath: URI!\n\n  projectsUrl: URI!\n\n  viewerCanCreateProjects: Boolean!\n}\n\nenum ProjectState {\n  OPEN\n\n  CLOSED\n}\n\ntype PublicKey implements Node {\n  accessedAt: DateTime\n\n  createdAt: DateTime!\n\n  fingerprint: String\n  id: ID!\n\n  isReadOnly: Boolean!\n\n  key: String!\n\n  updatedAt: DateTime!\n}\n\ntype PublicKeyConnection {\n  edges: [PublicKeyEdge]\n\n  nodes: [PublicKey]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PublicKeyEdge {\n  cursor: String!\n\n  node: PublicKey\n}\n\ntype PullRequest implements Node & Assignable & Closable & Comment & Updatable & UpdatableComment & Labelable & Lockable & Reactable & RepositoryNode & Subscribable & UniformResourceLocatable {\n  activeLockReason: LockReason\n\n  additions: Int!\n\n  assignees(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  baseRef: Ref\n\n  baseRefName: String!\n\n  baseRefOid: GitObjectID!\n\n  baseRepository: Repository\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  changedFiles: Int!\n\n  closed: Boolean!\n\n  closedAt: DateTime\n\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueCommentConnection!\n\n  commits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestCommitConnection!\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  deletions: Int!\n\n  editor: Actor\n\n  files(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestChangedFileConnection\n\n  headRef: Ref\n\n  headRefName: String!\n\n  headRefOid: GitObjectID!\n\n  headRepository: Repository\n\n  headRepositoryOwner: RepositoryOwner\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  isCrossRepository: Boolean!\n\n  labels(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): LabelConnection\n\n  lastEditedAt: DateTime\n\n  locked: Boolean!\n\n  maintainerCanModify: Boolean!\n\n  mergeCommit: Commit\n\n  mergeable: MergeableState!\n\n  merged: Boolean!\n\n  mergedAt: DateTime\n\n  mergedBy: Actor\n\n  milestone: Milestone\n\n  number: Int!\n\n  participants(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  permalink: URI!\n\n  potentialMergeCommit: Commit\n\n  projectCards(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    archivedStates: [ProjectCardArchivedState]\n  ): ProjectCardConnection!\n\n  publishedAt: DateTime\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  revertResourcePath: URI!\n\n  revertUrl: URI!\n\n  reviewRequests(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ReviewRequestConnection\n\n  reviewThreads(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestReviewThreadConnection!\n\n  reviews(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    states: [PullRequestReviewState!]\n\n    author: String\n  ): PullRequestReviewConnection\n\n  state: PullRequestState!\n\n  suggestedReviewers: [SuggestedReviewer]!\n\n  timeline(\n    since: DateTime\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestTimelineConnection!\n\n  timelineItems(\n    since: DateTime\n\n    skip: Int\n\n    itemTypes: [PullRequestTimelineItemsItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestTimelineItemsConnection!\n\n  title: String!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanApplySuggestion: Boolean!\n\n  viewerCanReact: Boolean!\n\n  viewerCanSubscribe: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n\n  viewerSubscription: SubscriptionState\n}\n\ntype PullRequestChangedFile {\n  additions: Int!\n\n  deletions: Int!\n\n  path: String!\n}\n\ntype PullRequestChangedFileConnection {\n  edges: [PullRequestChangedFileEdge]\n\n  nodes: [PullRequestChangedFile]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PullRequestChangedFileEdge {\n  cursor: String!\n\n  node: PullRequestChangedFile\n}\n\ntype PullRequestCommit implements Node & UniformResourceLocatable {\n  commit: Commit!\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  resourcePath: URI!\n\n  url: URI!\n}\n\ntype PullRequestCommitCommentThread implements Node & RepositoryNode {\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): CommitCommentConnection!\n\n  commit: Commit!\n  id: ID!\n\n  path: String\n\n  position: Int\n\n  pullRequest: PullRequest!\n\n  repository: Repository!\n}\n\ntype PullRequestCommitConnection {\n  edges: [PullRequestCommitEdge]\n\n  nodes: [PullRequestCommit]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PullRequestCommitEdge {\n  cursor: String!\n\n  node: PullRequestCommit\n}\n\ntype PullRequestConnection {\n  edges: [PullRequestEdge]\n\n  nodes: [PullRequest]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PullRequestContributionsByRepository {\n  contributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: ContributionOrder\n  ): CreatedPullRequestContributionConnection!\n\n  repository: Repository!\n}\n\ntype PullRequestEdge {\n  cursor: String!\n\n  node: PullRequest\n}\n\ninput PullRequestOrder {\n  field: PullRequestOrderField!\n\n  direction: OrderDirection!\n}\n\nenum PullRequestOrderField {\n  CREATED_AT\n\n  UPDATED_AT\n}\n\nenum PullRequestPubSubTopic {\n  UPDATED\n\n  MARKASREAD\n\n  HEAD_REF\n\n  TIMELINE\n\n  STATE\n}\n\ntype PullRequestReview implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode {\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestReviewCommentConnection!\n\n  commit: Commit\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  editor: Actor\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  lastEditedAt: DateTime\n\n  onBehalfOf(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): TeamConnection!\n\n  publishedAt: DateTime\n\n  pullRequest: PullRequest!\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  state: PullRequestReviewState!\n\n  submittedAt: DateTime\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanDelete: Boolean!\n\n  viewerCanReact: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n}\n\ntype PullRequestReviewComment implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode {\n  author: Actor\n\n  authorAssociation: CommentAuthorAssociation!\n\n  body: String!\n\n  bodyHTML: HTML!\n\n  bodyText: String!\n\n  commit: Commit!\n\n  createdAt: DateTime!\n\n  createdViaEmail: Boolean!\n\n  databaseId: Int\n\n  diffHunk: String!\n\n  draftedAt: DateTime!\n\n  editor: Actor\n  id: ID!\n\n  includesCreatedEdit: Boolean!\n\n  isMinimized: Boolean!\n\n  lastEditedAt: DateTime\n\n  minimizedReason: String\n\n  originalCommit: Commit\n\n  originalPosition: Int!\n\n  outdated: Boolean!\n\n  path: String!\n\n  position: Int\n\n  publishedAt: DateTime\n\n  pullRequest: PullRequest!\n\n  pullRequestReview: PullRequestReview\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  replyTo: PullRequestReviewComment\n\n  repository: Repository!\n\n  resourcePath: URI!\n\n  state: PullRequestReviewCommentState!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  userContentEdits(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserContentEditConnection\n\n  viewerCanDelete: Boolean!\n\n  viewerCanMinimize: Boolean!\n\n  viewerCanReact: Boolean!\n\n  viewerCanUpdate: Boolean!\n\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n\n  viewerDidAuthor: Boolean!\n}\n\ntype PullRequestReviewCommentConnection {\n  edges: [PullRequestReviewCommentEdge]\n\n  nodes: [PullRequestReviewComment]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PullRequestReviewCommentEdge {\n  cursor: String!\n\n  node: PullRequestReviewComment\n}\n\nenum PullRequestReviewCommentState {\n  PENDING\n\n  SUBMITTED\n}\n\ntype PullRequestReviewConnection {\n  edges: [PullRequestReviewEdge]\n\n  nodes: [PullRequestReview]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PullRequestReviewContributionsByRepository {\n  contributions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: ContributionOrder\n  ): CreatedPullRequestReviewContributionConnection!\n\n  repository: Repository!\n}\n\ntype PullRequestReviewEdge {\n  cursor: String!\n\n  node: PullRequestReview\n}\n\nenum PullRequestReviewEvent {\n  COMMENT\n\n  APPROVE\n\n  REQUEST_CHANGES\n\n  DISMISS\n}\n\nenum PullRequestReviewState {\n  PENDING\n\n  COMMENTED\n\n  APPROVED\n\n  CHANGES_REQUESTED\n\n  DISMISSED\n}\n\ntype PullRequestReviewThread implements Node {\n  comments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestReviewCommentConnection!\n  id: ID!\n\n  isResolved: Boolean!\n\n  pullRequest: PullRequest!\n\n  repository: Repository!\n\n  resolvedBy: User\n\n  viewerCanResolve: Boolean!\n\n  viewerCanUnresolve: Boolean!\n}\n\ntype PullRequestReviewThreadConnection {\n  edges: [PullRequestReviewThreadEdge]\n\n  nodes: [PullRequestReviewThread]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PullRequestReviewThreadEdge {\n  cursor: String!\n\n  node: PullRequestReviewThread\n}\n\ntype PullRequestRevisionMarker {\n  createdAt: DateTime!\n\n  lastSeenCommit: Commit!\n\n  pullRequest: PullRequest!\n}\n\nenum PullRequestState {\n  OPEN\n\n  CLOSED\n\n  MERGED\n}\n\ntype PullRequestTimelineConnection {\n  edges: [PullRequestTimelineItemEdge]\n\n  nodes: [PullRequestTimelineItem]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\nunion PullRequestTimelineItem =\n  | Commit\n  | CommitCommentThread\n  | PullRequestReview\n  | PullRequestReviewThread\n  | PullRequestReviewComment\n  | IssueComment\n  | ClosedEvent\n  | ReopenedEvent\n  | SubscribedEvent\n  | UnsubscribedEvent\n  | MergedEvent\n  | ReferencedEvent\n  | CrossReferencedEvent\n  | AssignedEvent\n  | UnassignedEvent\n  | LabeledEvent\n  | UnlabeledEvent\n  | MilestonedEvent\n  | DemilestonedEvent\n  | RenamedTitleEvent\n  | LockedEvent\n  | UnlockedEvent\n  | DeployedEvent\n  | DeploymentEnvironmentChangedEvent\n  | HeadRefDeletedEvent\n  | HeadRefRestoredEvent\n  | HeadRefForcePushedEvent\n  | BaseRefForcePushedEvent\n  | ReviewRequestedEvent\n  | ReviewRequestRemovedEvent\n  | ReviewDismissedEvent\n  | UserBlockedEvent\n\ntype PullRequestTimelineItemEdge {\n  cursor: String!\n\n  node: PullRequestTimelineItem\n}\n\nunion PullRequestTimelineItems =\n  | PullRequestCommit\n  | PullRequestCommitCommentThread\n  | PullRequestReview\n  | PullRequestReviewThread\n  | PullRequestRevisionMarker\n  | BaseRefChangedEvent\n  | BaseRefForcePushedEvent\n  | DeployedEvent\n  | DeploymentEnvironmentChangedEvent\n  | HeadRefDeletedEvent\n  | HeadRefForcePushedEvent\n  | HeadRefRestoredEvent\n  | MergedEvent\n  | ReviewDismissedEvent\n  | ReviewRequestedEvent\n  | ReviewRequestRemovedEvent\n  | IssueComment\n  | CrossReferencedEvent\n  | AddedToProjectEvent\n  | AssignedEvent\n  | ClosedEvent\n  | CommentDeletedEvent\n  | ConvertedNoteToIssueEvent\n  | DemilestonedEvent\n  | LabeledEvent\n  | LockedEvent\n  | MentionedEvent\n  | MilestonedEvent\n  | MovedColumnsInProjectEvent\n  | PinnedEvent\n  | ReferencedEvent\n  | RemovedFromProjectEvent\n  | RenamedTitleEvent\n  | ReopenedEvent\n  | SubscribedEvent\n  | TransferredEvent\n  | UnassignedEvent\n  | UnlabeledEvent\n  | UnlockedEvent\n  | UserBlockedEvent\n  | UnpinnedEvent\n  | UnsubscribedEvent\n\ntype PullRequestTimelineItemsConnection {\n  edges: [PullRequestTimelineItemsEdge]\n\n  filteredCount: Int!\n\n  nodes: [PullRequestTimelineItems]\n\n  pageCount: Int!\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n\n  updatedAt: DateTime!\n}\n\ntype PullRequestTimelineItemsEdge {\n  cursor: String!\n\n  node: PullRequestTimelineItems\n}\n\nenum PullRequestTimelineItemsItemType {\n  PULL_REQUEST_COMMIT\n\n  PULL_REQUEST_COMMIT_COMMENT_THREAD\n\n  PULL_REQUEST_REVIEW\n\n  PULL_REQUEST_REVIEW_THREAD\n\n  PULL_REQUEST_REVISION_MARKER\n\n  BASE_REF_CHANGED_EVENT\n\n  BASE_REF_FORCE_PUSHED_EVENT\n\n  DEPLOYED_EVENT\n\n  DEPLOYMENT_ENVIRONMENT_CHANGED_EVENT\n\n  HEAD_REF_DELETED_EVENT\n\n  HEAD_REF_FORCE_PUSHED_EVENT\n\n  HEAD_REF_RESTORED_EVENT\n\n  MERGED_EVENT\n\n  REVIEW_DISMISSED_EVENT\n\n  REVIEW_REQUESTED_EVENT\n\n  REVIEW_REQUEST_REMOVED_EVENT\n\n  ISSUE_COMMENT\n\n  CROSS_REFERENCED_EVENT\n\n  ADDED_TO_PROJECT_EVENT\n\n  ASSIGNED_EVENT\n\n  CLOSED_EVENT\n\n  COMMENT_DELETED_EVENT\n\n  CONVERTED_NOTE_TO_ISSUE_EVENT\n\n  DEMILESTONED_EVENT\n\n  LABELED_EVENT\n\n  LOCKED_EVENT\n\n  MENTIONED_EVENT\n\n  MILESTONED_EVENT\n\n  MOVED_COLUMNS_IN_PROJECT_EVENT\n\n  PINNED_EVENT\n\n  REFERENCED_EVENT\n\n  REMOVED_FROM_PROJECT_EVENT\n\n  RENAMED_TITLE_EVENT\n\n  REOPENED_EVENT\n\n  SUBSCRIBED_EVENT\n\n  TRANSFERRED_EVENT\n\n  UNASSIGNED_EVENT\n\n  UNLABELED_EVENT\n\n  UNLOCKED_EVENT\n\n  USER_BLOCKED_EVENT\n\n  UNPINNED_EVENT\n\n  UNSUBSCRIBED_EVENT\n}\n\ntype PushAllowance implements Node {\n  actor: PushAllowanceActor\n\n  branchProtectionRule: BranchProtectionRule\n  id: ID!\n}\n\nunion PushAllowanceActor = User | Team\n\ntype PushAllowanceConnection {\n  edges: [PushAllowanceEdge]\n\n  nodes: [PushAllowance]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype PushAllowanceEdge {\n  cursor: String!\n\n  node: PushAllowance\n}\n\ntype Query {\n  codeOfConduct(key: String!): CodeOfConduct\n\n  codesOfConduct: [CodeOfConduct]\n\n  license(key: String!): License\n\n  licenses: [License]!\n\n  marketplaceCategories(\n    includeCategories: [String!]\n\n    excludeEmpty: Boolean\n\n    excludeSubcategories: Boolean\n  ): [MarketplaceCategory!]!\n\n  marketplaceCategory(\n    slug: String!\n\n    useTopicAliases: Boolean\n  ): MarketplaceCategory\n\n  marketplaceListing(slug: String!): MarketplaceListing\n\n  marketplaceListings(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    categorySlug: String\n\n    useTopicAliases: Boolean\n\n    viewerCanAdmin: Boolean\n\n    adminId: ID\n\n    organizationId: ID\n\n    allStates: Boolean\n\n    slugs: [String]\n\n    primaryCategoryOnly: Boolean = false\n\n    withFreeTrialsOnly: Boolean = false\n  ): MarketplaceListingConnection!\n\n  meta: GitHubMetadata!\n\n  node(id: ID!): Node\n\n  nodes(ids: [ID!]!): [Node]!\n\n  organization(login: String!): Organization\n\n  rateLimit(dryRun: Boolean = false): RateLimit\n\n  relay: Query!\n\n  repository(\n    owner: String!\n\n    name: String!\n  ): Repository\n\n  repositoryOwner(login: String!): RepositoryOwner\n\n  resource(url: URI!): UniformResourceLocatable\n\n  search(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    query: String!\n\n    type: SearchType!\n  ): SearchResultItemConnection!\n\n  securityAdvisories(\n    orderBy: SecurityAdvisoryOrder\n\n    identifier: SecurityAdvisoryIdentifierFilter\n\n    publishedSince: DateTime\n\n    updatedSince: DateTime\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): SecurityAdvisoryConnection!\n\n  securityAdvisory(ghsaId: String!): SecurityAdvisory\n\n  securityVulnerabilities(\n    orderBy: SecurityVulnerabilityOrder\n\n    ecosystem: SecurityAdvisoryEcosystem\n\n    package: String\n\n    severities: [SecurityAdvisorySeverity!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): SecurityVulnerabilityConnection!\n\n  topic(name: String!): Topic\n\n  user(login: String!): User\n\n  viewer: User!\n}\n\ntype RateLimit {\n  cost: Int!\n\n  limit: Int!\n\n  nodeCount: Int!\n\n  remaining: Int!\n\n  resetAt: DateTime!\n}\n\ninterface Reactable {\n  databaseId: Int\n  id: ID!\n\n  reactionGroups: [ReactionGroup!]\n\n  reactions(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    content: ReactionContent\n\n    orderBy: ReactionOrder\n  ): ReactionConnection!\n\n  viewerCanReact: Boolean!\n}\n\ntype ReactingUserConnection {\n  edges: [ReactingUserEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ReactingUserEdge {\n  cursor: String!\n  node: User!\n\n  reactedAt: DateTime!\n}\n\ntype Reaction implements Node {\n  content: ReactionContent!\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n\n  reactable: Reactable!\n\n  user: User\n}\n\ntype ReactionConnection {\n  edges: [ReactionEdge]\n\n  nodes: [Reaction]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n\n  viewerHasReacted: Boolean!\n}\n\nenum ReactionContent {\n  THUMBS_UP\n\n  THUMBS_DOWN\n\n  LAUGH\n\n  HOORAY\n\n  CONFUSED\n\n  HEART\n\n  ROCKET\n\n  EYES\n}\n\ntype ReactionEdge {\n  cursor: String!\n\n  node: Reaction\n}\n\ntype ReactionGroup {\n  content: ReactionContent!\n\n  createdAt: DateTime\n\n  subject: Reactable!\n\n  users(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ReactingUserConnection!\n\n  viewerHasReacted: Boolean!\n}\n\ninput ReactionOrder {\n  field: ReactionOrderField!\n\n  direction: OrderDirection!\n}\n\nenum ReactionOrderField {\n  CREATED_AT\n}\n\ntype Ref implements Node {\n  associatedPullRequests(\n    states: [PullRequestState!]\n\n    labels: [String!]\n\n    headRefName: String\n\n    baseRefName: String\n\n    orderBy: IssueOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestConnection!\n  id: ID!\n\n  name: String!\n\n  prefix: String!\n\n  repository: Repository!\n\n  target: GitObject!\n}\n\ntype RefConnection {\n  edges: [RefEdge]\n\n  nodes: [Ref]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype RefEdge {\n  cursor: String!\n\n  node: Ref\n}\n\ntype ReferencedEvent implements Node {\n  actor: Actor\n\n  commit: Commit\n\n  commitRepository: Repository!\n\n  createdAt: DateTime!\n  id: ID!\n\n  isCrossRepository: Boolean!\n\n  isDirectReference: Boolean!\n\n  subject: ReferencedSubject!\n}\n\nunion ReferencedSubject = Issue | PullRequest\n\ninput RefOrder {\n  field: RefOrderField!\n\n  direction: OrderDirection!\n}\n\nenum RefOrderField {\n  TAG_COMMIT_DATE\n\n  ALPHABETICAL\n}\n\ninterface RegistryPackageOwner {\n  id: ID!\n}\n\ninterface RegistryPackageSearch {\n  id: ID!\n}\n\ntype Release implements Node & UniformResourceLocatable {\n  author: User\n\n  createdAt: DateTime!\n\n  description: String\n  id: ID!\n\n  isDraft: Boolean!\n\n  isPrerelease: Boolean!\n\n  name: String\n\n  publishedAt: DateTime\n\n  releaseAssets(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    name: String\n  ): ReleaseAssetConnection!\n\n  resourcePath: URI!\n\n  tag: Ref\n\n  tagName: String!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype ReleaseAsset implements Node {\n  contentType: String!\n\n  createdAt: DateTime!\n\n  downloadCount: Int!\n\n  downloadUrl: URI!\n  id: ID!\n\n  name: String!\n\n  release: Release\n\n  size: Int!\n\n  updatedAt: DateTime!\n\n  uploadedBy: User!\n\n  url: URI!\n}\n\ntype ReleaseAssetConnection {\n  edges: [ReleaseAssetEdge]\n\n  nodes: [ReleaseAsset]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ReleaseAssetEdge {\n  cursor: String!\n\n  node: ReleaseAsset\n}\n\ntype ReleaseConnection {\n  edges: [ReleaseEdge]\n\n  nodes: [Release]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ReleaseEdge {\n  cursor: String!\n\n  node: Release\n}\n\ninput ReleaseOrder {\n  field: ReleaseOrderField!\n\n  direction: OrderDirection!\n}\n\nenum ReleaseOrderField {\n  CREATED_AT\n\n  NAME\n}\n\ninput RemoveAssigneesFromAssignableInput {\n  assignableId: ID!\n\n  assigneeIds: [ID!]!\n\n  clientMutationId: String\n}\n\ntype RemoveAssigneesFromAssignablePayload {\n  assignable: Assignable\n\n  clientMutationId: String\n}\n\ntype RemovedFromProjectEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n  id: ID!\n}\n\ninput RemoveLabelsFromLabelableInput {\n  labelableId: ID!\n\n  labelIds: [ID!]!\n\n  clientMutationId: String\n}\n\ntype RemoveLabelsFromLabelablePayload {\n  clientMutationId: String\n\n  labelable: Labelable\n}\n\ninput RemoveOutsideCollaboratorInput {\n  userId: ID!\n\n  organizationId: ID!\n\n  clientMutationId: String\n}\n\ntype RemoveOutsideCollaboratorPayload {\n  clientMutationId: String\n\n  removedUser: User\n}\n\ninput RemoveReactionInput {\n  subjectId: ID!\n\n  content: ReactionContent!\n\n  clientMutationId: String\n}\n\ntype RemoveReactionPayload {\n  clientMutationId: String\n\n  reaction: Reaction\n\n  subject: Reactable\n}\n\ninput RemoveStarInput {\n  starrableId: ID!\n\n  clientMutationId: String\n}\n\ntype RemoveStarPayload {\n  clientMutationId: String\n\n  starrable: Starrable\n}\n\ntype RenamedTitleEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  currentTitle: String!\n  id: ID!\n\n  previousTitle: String!\n\n  subject: RenamedTitleSubject!\n}\n\nunion RenamedTitleSubject = Issue | PullRequest\n\ntype ReopenedEvent implements Node {\n  actor: Actor\n\n  closable: Closable!\n\n  createdAt: DateTime!\n  id: ID!\n}\n\ninput ReopenIssueInput {\n  issueId: ID!\n\n  clientMutationId: String\n}\n\ntype ReopenIssuePayload {\n  clientMutationId: String\n\n  issue: Issue\n}\n\ninput ReopenPullRequestInput {\n  pullRequestId: ID!\n\n  clientMutationId: String\n}\n\ntype ReopenPullRequestPayload {\n  clientMutationId: String\n\n  pullRequest: PullRequest\n}\n\nenum ReportedContentClassifiers {\n  SPAM\n\n  ABUSE\n\n  OFF_TOPIC\n\n  OUTDATED\n\n  RESOLVED\n}\n\ntype Repository implements Node & ProjectOwner & RegistryPackageOwner & Subscribable & Starrable & UniformResourceLocatable & RepositoryInfo {\n  assignableUsers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  branchProtectionRules(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): BranchProtectionRuleConnection!\n\n  codeOfConduct: CodeOfConduct\n\n  collaborators(\n    affiliation: CollaboratorAffiliation\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryCollaboratorConnection\n\n  commitComments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): CommitCommentConnection!\n\n  createdAt: DateTime!\n\n  databaseId: Int\n\n  defaultBranchRef: Ref\n\n  deployKeys(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): DeployKeyConnection!\n\n  deployments(\n    environments: [String!]\n\n    orderBy: DeploymentOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): DeploymentConnection!\n\n  description: String\n\n  descriptionHTML: HTML!\n\n  diskUsage: Int\n\n  forkCount: Int!\n\n  forks(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryConnection!\n\n  hasIssuesEnabled: Boolean!\n\n  hasWikiEnabled: Boolean!\n\n  homepageUrl: URI\n  id: ID!\n\n  isArchived: Boolean!\n\n  isDisabled: Boolean!\n\n  isFork: Boolean!\n\n  isLocked: Boolean!\n\n  isMirror: Boolean!\n\n  isPrivate: Boolean!\n\n  issue(number: Int!): Issue\n\n  issueOrPullRequest(number: Int!): IssueOrPullRequest\n\n  issues(\n    orderBy: IssueOrder\n\n    labels: [String!]\n\n    states: [IssueState!]\n\n    filterBy: IssueFilters\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueConnection!\n\n  label(name: String!): Label\n\n  labels(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    query: String\n  ): LabelConnection\n\n  languages(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: LanguageOrder\n  ): LanguageConnection\n\n  licenseInfo: License\n\n  lockReason: RepositoryLockReason\n\n  mentionableUsers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n\n  mergeCommitAllowed: Boolean!\n\n  milestone(number: Int!): Milestone\n\n  milestones(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    states: [MilestoneState!]\n\n    orderBy: MilestoneOrder\n  ): MilestoneConnection\n\n  mirrorUrl: URI\n\n  name: String!\n\n  nameWithOwner: String!\n\n  object(\n    oid: GitObjectID\n\n    expression: String\n  ): GitObject\n\n  owner: RepositoryOwner!\n\n  parent: Repository\n\n  primaryLanguage: Language\n\n  project(number: Int!): Project\n\n  projects(\n    orderBy: ProjectOrder\n\n    search: String\n\n    states: [ProjectState!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ProjectConnection!\n\n  projectsResourcePath: URI!\n\n  projectsUrl: URI!\n\n  pullRequest(number: Int!): PullRequest\n\n  pullRequests(\n    states: [PullRequestState!]\n\n    labels: [String!]\n\n    headRefName: String\n\n    baseRefName: String\n\n    orderBy: IssueOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestConnection!\n\n  pushedAt: DateTime\n\n  rebaseMergeAllowed: Boolean!\n\n  ref(qualifiedName: String!): Ref\n\n  refs(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    refPrefix: String!\n\n    direction: OrderDirection\n\n    orderBy: RefOrder\n  ): RefConnection\n\n  release(tagName: String!): Release\n\n  releases(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: ReleaseOrder\n  ): ReleaseConnection!\n\n  repositoryTopics(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryTopicConnection!\n\n  resourcePath: URI!\n\n  shortDescriptionHTML(limit: Int = 200): HTML!\n\n  squashMergeAllowed: Boolean!\n\n  sshUrl: GitSSHRemote!\n\n  stargazers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: StarOrder\n  ): StargazerConnection!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  viewerCanAdminister: Boolean!\n\n  viewerCanCreateProjects: Boolean!\n\n  viewerCanSubscribe: Boolean!\n\n  viewerCanUpdateTopics: Boolean!\n\n  viewerHasStarred: Boolean!\n\n  viewerPermission: RepositoryPermission\n\n  viewerSubscription: SubscriptionState\n\n  watchers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): UserConnection!\n}\n\nenum RepositoryAffiliation {\n  OWNER\n\n  COLLABORATOR\n\n  ORGANIZATION_MEMBER\n}\n\nenum RepositoryCollaboratorAffiliation {\n  ALL\n\n  OUTSIDE\n}\n\ntype RepositoryCollaboratorConnection {\n  edges: [RepositoryCollaboratorEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype RepositoryCollaboratorEdge {\n  cursor: String!\n  node: User!\n\n  permission: RepositoryPermission!\n\n  permissionSources: [PermissionSource!]\n}\n\ntype RepositoryConnection {\n  edges: [RepositoryEdge]\n\n  nodes: [Repository]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n\n  totalDiskUsage: Int!\n}\n\nenum RepositoryContributionType {\n  COMMIT\n\n  ISSUE\n\n  PULL_REQUEST\n\n  REPOSITORY\n\n  PULL_REQUEST_REVIEW\n}\n\ntype RepositoryEdge {\n  cursor: String!\n\n  node: Repository\n}\n\ninterface RepositoryInfo {\n  createdAt: DateTime!\n\n  description: String\n\n  descriptionHTML: HTML!\n\n  forkCount: Int!\n\n  hasIssuesEnabled: Boolean!\n\n  hasWikiEnabled: Boolean!\n\n  homepageUrl: URI\n\n  isArchived: Boolean!\n\n  isFork: Boolean!\n\n  isLocked: Boolean!\n\n  isMirror: Boolean!\n\n  isPrivate: Boolean!\n\n  licenseInfo: License\n\n  lockReason: RepositoryLockReason\n\n  mirrorUrl: URI\n\n  name: String!\n\n  nameWithOwner: String!\n\n  owner: RepositoryOwner!\n\n  pushedAt: DateTime\n\n  resourcePath: URI!\n\n  shortDescriptionHTML(limit: Int = 200): HTML!\n\n  updatedAt: DateTime!\n\n  url: URI!\n}\n\ntype RepositoryInvitation implements Node {\n  id: ID!\n\n  invitee: User!\n\n  inviter: User!\n\n  permission: RepositoryPermission!\n\n  repository: RepositoryInfo\n}\n\ntype RepositoryInvitationEdge {\n  cursor: String!\n\n  node: RepositoryInvitation\n}\n\nenum RepositoryLockReason {\n  MOVING\n\n  BILLING\n\n  RENAME\n\n  MIGRATING\n}\n\ninterface RepositoryNode {\n  repository: Repository!\n}\n\ninput RepositoryOrder {\n  field: RepositoryOrderField!\n\n  direction: OrderDirection!\n}\n\nenum RepositoryOrderField {\n  CREATED_AT\n\n  UPDATED_AT\n\n  PUSHED_AT\n\n  NAME\n\n  STARGAZERS\n}\n\ninterface RepositoryOwner {\n  avatarUrl(size: Int): URI!\n  id: ID!\n\n  login: String!\n\n  pinnedRepositories(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryConnection!\n    @deprecated(\n      reason: \"pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-07-01 UTC.\"\n    )\n\n  repositories(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    isFork: Boolean\n  ): RepositoryConnection!\n\n  repository(name: String!): Repository\n\n  resourcePath: URI!\n\n  url: URI!\n}\n\nenum RepositoryPermission {\n  ADMIN\n\n  WRITE\n\n  READ\n}\n\nenum RepositoryPrivacy {\n  PUBLIC\n\n  PRIVATE\n}\n\ntype RepositoryTopic implements Node & UniformResourceLocatable {\n  id: ID!\n\n  resourcePath: URI!\n\n  topic: Topic!\n\n  url: URI!\n}\n\ntype RepositoryTopicConnection {\n  edges: [RepositoryTopicEdge]\n\n  nodes: [RepositoryTopic]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype RepositoryTopicEdge {\n  cursor: String!\n\n  node: RepositoryTopic\n}\n\nunion RequestedReviewer = User | Team | Mannequin\n\ninput RequestReviewsInput {\n  pullRequestId: ID!\n\n  userIds: [ID!]\n\n  teamIds: [ID!]\n\n  union: Boolean\n\n  clientMutationId: String\n}\n\ntype RequestReviewsPayload {\n  clientMutationId: String\n\n  pullRequest: PullRequest\n\n  requestedReviewersEdge: UserEdge\n}\n\ninput ResolveReviewThreadInput {\n  threadId: ID!\n\n  clientMutationId: String\n}\n\ntype ResolveReviewThreadPayload {\n  clientMutationId: String\n\n  thread: PullRequestReviewThread\n}\n\ntype RestrictedContribution implements Contribution {\n  isRestricted: Boolean!\n\n  occurredAt: DateTime!\n\n  resourcePath: URI!\n\n  url: URI!\n\n  user: User!\n}\n\ntype ReviewDismissalAllowance implements Node {\n  actor: ReviewDismissalAllowanceActor\n\n  branchProtectionRule: BranchProtectionRule\n  id: ID!\n}\n\nunion ReviewDismissalAllowanceActor = User | Team\n\ntype ReviewDismissalAllowanceConnection {\n  edges: [ReviewDismissalAllowanceEdge]\n\n  nodes: [ReviewDismissalAllowance]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ReviewDismissalAllowanceEdge {\n  cursor: String!\n\n  node: ReviewDismissalAllowance\n}\n\ntype ReviewDismissedEvent implements Node & UniformResourceLocatable {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  databaseId: Int\n\n  dismissalMessage: String\n\n  dismissalMessageHTML: String\n  id: ID!\n\n  message: String!\n    @deprecated(\n      reason: \"`message` is being removed because it not nullable, whereas the underlying field is optional. Use `dismissalMessage` instead. Removal on 2019-07-01 UTC.\"\n    )\n\n  messageHtml: HTML!\n    @deprecated(\n      reason: \"`messageHtml` is being removed because it not nullable, whereas the underlying field is optional. Use `dismissalMessageHTML` instead. Removal on 2019-07-01 UTC.\"\n    )\n\n  previousReviewState: PullRequestReviewState!\n\n  pullRequest: PullRequest!\n\n  pullRequestCommit: PullRequestCommit\n\n  resourcePath: URI!\n\n  review: PullRequestReview\n\n  url: URI!\n}\n\ntype ReviewRequest implements Node {\n  databaseId: Int\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  requestedReviewer: RequestedReviewer\n}\n\ntype ReviewRequestConnection {\n  edges: [ReviewRequestEdge]\n\n  nodes: [ReviewRequest]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype ReviewRequestedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  requestedReviewer: RequestedReviewer\n}\n\ntype ReviewRequestEdge {\n  cursor: String!\n\n  node: ReviewRequest\n}\n\ntype ReviewRequestRemovedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  pullRequest: PullRequest!\n\n  requestedReviewer: RequestedReviewer\n}\n\nunion SearchResultItem =\n  | Issue\n  | PullRequest\n  | Repository\n  | User\n  | Organization\n  | MarketplaceListing\n\ntype SearchResultItemConnection {\n  codeCount: Int!\n\n  edges: [SearchResultItemEdge]\n\n  issueCount: Int!\n\n  nodes: [SearchResultItem]\n\n  pageInfo: PageInfo!\n\n  repositoryCount: Int!\n\n  userCount: Int!\n\n  wikiCount: Int!\n}\n\ntype SearchResultItemEdge {\n  cursor: String!\n\n  node: SearchResultItem\n\n  textMatches: [TextMatch]\n}\n\nenum SearchType {\n  ISSUE\n\n  REPOSITORY\n\n  USER\n}\n\ntype SecurityAdvisory implements Node {\n  databaseId: Int\n\n  description: String!\n\n  ghsaId: String!\n  id: ID!\n\n  identifiers: [SecurityAdvisoryIdentifier!]!\n\n  origin: String!\n\n  publishedAt: DateTime!\n\n  references: [SecurityAdvisoryReference!]!\n\n  severity: SecurityAdvisorySeverity!\n\n  summary: String!\n\n  updatedAt: DateTime!\n\n  vulnerabilities(\n    orderBy: SecurityVulnerabilityOrder\n\n    ecosystem: SecurityAdvisoryEcosystem\n\n    package: String\n\n    severities: [SecurityAdvisorySeverity!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): SecurityVulnerabilityConnection!\n\n  withdrawnAt: DateTime\n}\n\ntype SecurityAdvisoryConnection {\n  edges: [SecurityAdvisoryEdge]\n\n  nodes: [SecurityAdvisory]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\nenum SecurityAdvisoryEcosystem {\n  RUBYGEMS\n\n  NPM\n\n  PIP\n\n  MAVEN\n\n  NUGET\n}\n\ntype SecurityAdvisoryEdge {\n  cursor: String!\n\n  node: SecurityAdvisory\n}\n\ntype SecurityAdvisoryIdentifier {\n  type: String!\n\n  value: String!\n}\n\ninput SecurityAdvisoryIdentifierFilter {\n  type: SecurityAdvisoryIdentifierType!\n\n  value: String!\n}\n\nenum SecurityAdvisoryIdentifierType {\n  CVE\n\n  GHSA\n}\n\ninput SecurityAdvisoryOrder {\n  field: SecurityAdvisoryOrderField!\n\n  direction: OrderDirection!\n}\n\nenum SecurityAdvisoryOrderField {\n  PUBLISHED_AT\n\n  UPDATED_AT\n}\n\ntype SecurityAdvisoryPackage {\n  ecosystem: SecurityAdvisoryEcosystem!\n\n  name: String!\n}\n\ntype SecurityAdvisoryPackageVersion {\n  identifier: String!\n}\n\ntype SecurityAdvisoryReference {\n  url: URI!\n}\n\nenum SecurityAdvisorySeverity {\n  LOW\n\n  MODERATE\n\n  HIGH\n\n  CRITICAL\n}\n\ntype SecurityVulnerability {\n  advisory: SecurityAdvisory!\n\n  firstPatchedVersion: SecurityAdvisoryPackageVersion\n\n  package: SecurityAdvisoryPackage!\n\n  severity: SecurityAdvisorySeverity!\n\n  updatedAt: DateTime!\n\n  vulnerableVersionRange: String!\n}\n\ntype SecurityVulnerabilityConnection {\n  edges: [SecurityVulnerabilityEdge]\n\n  nodes: [SecurityVulnerability]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype SecurityVulnerabilityEdge {\n  cursor: String!\n\n  node: SecurityVulnerability\n}\n\ninput SecurityVulnerabilityOrder {\n  field: SecurityVulnerabilityOrderField!\n\n  direction: OrderDirection!\n}\n\nenum SecurityVulnerabilityOrderField {\n  UPDATED_AT\n}\n\ntype SmimeSignature implements GitSignature {\n  email: String!\n\n  isValid: Boolean!\n\n  payload: String!\n\n  signature: String!\n\n  signer: User\n\n  state: GitSignatureState!\n\n  wasSignedByGitHub: Boolean!\n}\n\ntype StargazerConnection {\n  edges: [StargazerEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype StargazerEdge {\n  cursor: String!\n  node: User!\n\n  starredAt: DateTime!\n}\n\ninput StarOrder {\n  field: StarOrderField!\n\n  direction: OrderDirection!\n}\n\nenum StarOrderField {\n  STARRED_AT\n}\n\ninterface Starrable {\n  id: ID!\n\n  stargazers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: StarOrder\n  ): StargazerConnection!\n\n  viewerHasStarred: Boolean!\n}\n\ntype StarredRepositoryConnection {\n  edges: [StarredRepositoryEdge]\n\n  nodes: [Repository]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype StarredRepositoryEdge {\n  cursor: String!\n  node: Repository!\n\n  starredAt: DateTime!\n}\n\ntype Status implements Node {\n  commit: Commit\n\n  context(name: String!): StatusContext\n\n  contexts: [StatusContext!]!\n  id: ID!\n\n  state: StatusState!\n}\n\ntype StatusContext implements Node {\n  commit: Commit\n\n  context: String!\n\n  createdAt: DateTime!\n\n  creator: Actor\n\n  description: String\n  id: ID!\n\n  state: StatusState!\n\n  targetUrl: URI\n}\n\nenum StatusState {\n  EXPECTED\n\n  ERROR\n\n  FAILURE\n\n  PENDING\n\n  SUCCESS\n}\n\ninput SubmitPullRequestReviewInput {\n  pullRequestReviewId: ID!\n\n  event: PullRequestReviewEvent!\n\n  body: String\n\n  clientMutationId: String\n}\n\ntype SubmitPullRequestReviewPayload {\n  clientMutationId: String\n\n  pullRequestReview: PullRequestReview\n}\n\ninterface Subscribable {\n  id: ID!\n\n  viewerCanSubscribe: Boolean!\n\n  viewerSubscription: SubscriptionState\n}\n\ntype SubscribedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  subscribable: Subscribable!\n}\n\nenum SubscriptionState {\n  UNSUBSCRIBED\n\n  SUBSCRIBED\n\n  IGNORED\n}\n\ntype SuggestedReviewer {\n  isAuthor: Boolean!\n\n  isCommenter: Boolean!\n\n  reviewer: User!\n}\n\ntype Tag implements Node & GitObject {\n  abbreviatedOid: String!\n\n  commitResourcePath: URI!\n\n  commitUrl: URI!\n  id: ID!\n\n  message: String\n\n  name: String!\n\n  oid: GitObjectID!\n\n  repository: Repository!\n\n  tagger: GitActor\n\n  target: GitObject!\n}\n\ntype Team implements Node & Subscribable & MemberStatusable {\n  ancestors(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): TeamConnection!\n\n  avatarUrl(size: Int = 400): URI\n\n  childTeams(\n    orderBy: TeamOrder\n\n    userLogins: [String!]\n\n    immediateOnly: Boolean = true\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): TeamConnection!\n\n  combinedSlug: String!\n\n  createdAt: DateTime!\n\n  description: String\n\n  editTeamResourcePath: URI!\n\n  editTeamUrl: URI!\n  id: ID!\n\n  invitations(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): OrganizationInvitationConnection\n\n  memberStatuses(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: UserStatusOrder\n  ): UserStatusConnection!\n\n  members(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    query: String\n\n    membership: TeamMembershipType = ALL\n\n    role: TeamMemberRole\n\n    orderBy: TeamMemberOrder\n  ): TeamMemberConnection!\n\n  membersResourcePath: URI!\n\n  membersUrl: URI!\n\n  name: String!\n\n  newTeamResourcePath: URI!\n\n  newTeamUrl: URI!\n\n  organization: Organization!\n\n  parentTeam: Team\n\n  privacy: TeamPrivacy!\n\n  repositories(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    query: String\n\n    orderBy: TeamRepositoryOrder\n  ): TeamRepositoryConnection!\n\n  repositoriesResourcePath: URI!\n\n  repositoriesUrl: URI!\n\n  resourcePath: URI!\n\n  slug: String!\n\n  teamsResourcePath: URI!\n\n  teamsUrl: URI!\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  viewerCanAdminister: Boolean!\n\n  viewerCanSubscribe: Boolean!\n\n  viewerSubscription: SubscriptionState\n}\n\ntype TeamConnection {\n  edges: [TeamEdge]\n\n  nodes: [Team]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype TeamEdge {\n  cursor: String!\n\n  node: Team\n}\n\ntype TeamMemberConnection {\n  edges: [TeamMemberEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype TeamMemberEdge {\n  cursor: String!\n\n  memberAccessResourcePath: URI!\n\n  memberAccessUrl: URI!\n  node: User!\n\n  role: TeamMemberRole!\n}\n\ninput TeamMemberOrder {\n  field: TeamMemberOrderField!\n\n  direction: OrderDirection!\n}\n\nenum TeamMemberOrderField {\n  LOGIN\n\n  CREATED_AT\n}\n\nenum TeamMemberRole {\n  MAINTAINER\n\n  MEMBER\n}\n\nenum TeamMembershipType {\n  IMMEDIATE\n\n  CHILD_TEAM\n\n  ALL\n}\n\ninput TeamOrder {\n  field: TeamOrderField!\n\n  direction: OrderDirection!\n}\n\nenum TeamOrderField {\n  NAME\n}\n\nenum TeamPrivacy {\n  SECRET\n\n  VISIBLE\n}\n\ntype TeamRepositoryConnection {\n  edges: [TeamRepositoryEdge]\n\n  nodes: [Repository]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype TeamRepositoryEdge {\n  cursor: String!\n  node: Repository!\n\n  permission: RepositoryPermission!\n}\n\ninput TeamRepositoryOrder {\n  field: TeamRepositoryOrderField!\n\n  direction: OrderDirection!\n}\n\nenum TeamRepositoryOrderField {\n  CREATED_AT\n\n  UPDATED_AT\n\n  PUSHED_AT\n\n  NAME\n\n  PERMISSION\n\n  STARGAZERS\n}\n\nenum TeamRole {\n  ADMIN\n\n  MEMBER\n}\n\ntype TextMatch {\n  fragment: String!\n\n  highlights: [TextMatchHighlight!]!\n\n  property: String!\n}\n\ntype TextMatchHighlight {\n  beginIndice: Int!\n\n  endIndice: Int!\n\n  text: String!\n}\n\ntype Topic implements Node & Starrable {\n  id: ID!\n\n  name: String!\n\n  stargazers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    orderBy: StarOrder\n  ): StargazerConnection!\n\n  viewerHasStarred: Boolean!\n}\n\ntype TopicConnection {\n  edges: [TopicEdge]\n\n  nodes: [Topic]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype TopicEdge {\n  cursor: String!\n\n  node: Topic\n}\n\nenum TopicSuggestionDeclineReason {\n  NOT_RELEVANT\n\n  TOO_SPECIFIC\n\n  PERSONAL_PREFERENCE\n\n  TOO_GENERAL\n}\n\ntype TransferredEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n\n  fromRepository: Repository\n  id: ID!\n\n  issue: Issue!\n}\n\ntype Tree implements Node & GitObject {\n  abbreviatedOid: String!\n\n  commitResourcePath: URI!\n\n  commitUrl: URI!\n\n  entries: [TreeEntry!]\n  id: ID!\n\n  oid: GitObjectID!\n\n  repository: Repository!\n}\n\ntype TreeEntry {\n  mode: Int!\n\n  name: String!\n\n  object: GitObject\n\n  oid: GitObjectID!\n\n  repository: Repository!\n\n  type: String!\n}\n\ntype UnassignedEvent implements Node {\n  actor: Actor\n\n  assignable: Assignable!\n\n  createdAt: DateTime!\n  id: ID!\n\n  user: User\n}\n\ninterface UniformResourceLocatable {\n  resourcePath: URI!\n\n  url: URI!\n}\n\ntype UnknownSignature implements GitSignature {\n  email: String!\n\n  isValid: Boolean!\n\n  payload: String!\n\n  signature: String!\n\n  signer: User\n\n  state: GitSignatureState!\n\n  wasSignedByGitHub: Boolean!\n}\n\ntype UnlabeledEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  label: Label!\n\n  labelable: Labelable!\n}\n\ntype UnlockedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  lockable: Lockable!\n}\n\ninput UnlockLockableInput {\n  lockableId: ID!\n\n  clientMutationId: String\n}\n\ntype UnlockLockablePayload {\n  clientMutationId: String\n\n  unlockedRecord: Lockable\n}\n\ninput UnmarkIssueAsDuplicateInput {\n  duplicateId: ID!\n\n  canonicalId: ID!\n\n  clientMutationId: String\n}\n\ntype UnmarkIssueAsDuplicatePayload {\n  clientMutationId: String\n\n  duplicate: IssueOrPullRequest\n}\n\ninput UnminimizeCommentInput {\n  subjectId: ID!\n\n  clientMutationId: String\n}\n\ninput UnpinIssueInput {\n  issueId: ID!\n\n  clientMutationId: String\n}\n\ntype UnpinnedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  issue: Issue!\n}\n\ninput UnresolveReviewThreadInput {\n  threadId: ID!\n\n  clientMutationId: String\n}\n\ntype UnresolveReviewThreadPayload {\n  clientMutationId: String\n\n  thread: PullRequestReviewThread\n}\n\ntype UnsubscribedEvent implements Node {\n  actor: Actor\n\n  createdAt: DateTime!\n  id: ID!\n\n  subscribable: Subscribable!\n}\n\ninterface Updatable {\n  viewerCanUpdate: Boolean!\n}\n\ninterface UpdatableComment {\n  viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!\n}\n\ninput UpdateBranchProtectionRuleInput {\n  branchProtectionRuleId: ID!\n\n  pattern: String\n\n  requiresApprovingReviews: Boolean\n\n  requiredApprovingReviewCount: Int\n\n  requiresCommitSignatures: Boolean\n\n  isAdminEnforced: Boolean\n\n  requiresStatusChecks: Boolean\n\n  requiresStrictStatusChecks: Boolean\n\n  requiresCodeOwnerReviews: Boolean\n\n  dismissesStaleReviews: Boolean\n\n  restrictsReviewDismissals: Boolean\n\n  reviewDismissalActorIds: [ID!]\n\n  restrictsPushes: Boolean\n\n  pushActorIds: [ID!]\n\n  requiredStatusCheckContexts: [String!]\n\n  clientMutationId: String\n}\n\ntype UpdateBranchProtectionRulePayload {\n  branchProtectionRule: BranchProtectionRule\n\n  clientMutationId: String\n}\n\ninput UpdateIssueCommentInput {\n  id: ID!\n\n  body: String!\n\n  clientMutationId: String\n}\n\ntype UpdateIssueCommentPayload {\n  clientMutationId: String\n\n  issueComment: IssueComment\n}\n\ninput UpdateIssueInput {\n  id: ID!\n\n  title: String\n\n  body: String\n\n  assigneeIds: [ID!]\n\n  milestoneId: ID\n\n  labelIds: [ID!]\n\n  state: IssueState\n\n  projectIds: [ID!]\n\n  clientMutationId: String\n}\n\ntype UpdateIssuePayload {\n  clientMutationId: String\n\n  issue: Issue\n}\n\ninput UpdateProjectCardInput {\n  projectCardId: ID!\n\n  isArchived: Boolean\n\n  note: String\n\n  clientMutationId: String\n}\n\ntype UpdateProjectCardPayload {\n  clientMutationId: String\n\n  projectCard: ProjectCard\n}\n\ninput UpdateProjectColumnInput {\n  projectColumnId: ID!\n\n  name: String!\n\n  clientMutationId: String\n}\n\ntype UpdateProjectColumnPayload {\n  clientMutationId: String\n\n  projectColumn: ProjectColumn\n}\n\ninput UpdateProjectInput {\n  projectId: ID!\n\n  name: String\n\n  body: String\n\n  state: ProjectState\n\n  public: Boolean\n\n  clientMutationId: String\n}\n\ntype UpdateProjectPayload {\n  clientMutationId: String\n\n  project: Project\n}\n\ninput UpdatePullRequestInput {\n  pullRequestId: ID!\n\n  baseRefName: String\n\n  title: String\n\n  body: String\n\n  maintainerCanModify: Boolean\n\n  clientMutationId: String\n}\n\ntype UpdatePullRequestPayload {\n  clientMutationId: String\n\n  pullRequest: PullRequest\n}\n\ninput UpdatePullRequestReviewCommentInput {\n  pullRequestReviewCommentId: ID!\n\n  body: String!\n\n  clientMutationId: String\n}\n\ntype UpdatePullRequestReviewCommentPayload {\n  clientMutationId: String\n\n  pullRequestReviewComment: PullRequestReviewComment\n}\n\ninput UpdatePullRequestReviewInput {\n  pullRequestReviewId: ID!\n\n  body: String!\n\n  clientMutationId: String\n}\n\ntype UpdatePullRequestReviewPayload {\n  clientMutationId: String\n\n  pullRequestReview: PullRequestReview\n}\n\ninput UpdateSubscriptionInput {\n  subscribableId: ID!\n\n  state: SubscriptionState!\n\n  clientMutationId: String\n}\n\ntype UpdateSubscriptionPayload {\n  clientMutationId: String\n\n  subscribable: Subscribable\n}\n\ninput UpdateTopicsInput {\n  repositoryId: ID!\n\n  topicNames: [String!]!\n\n  clientMutationId: String\n}\n\ntype UpdateTopicsPayload {\n  clientMutationId: String\n\n  invalidTopicNames: [String!]\n\n  repository: Repository\n}\n\nscalar URI\n\ntype User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch & ProjectOwner & RepositoryOwner & UniformResourceLocatable & ProfileOwner {\n  anyPinnableItems(type: PinnableItemType): Boolean!\n\n  avatarUrl(size: Int): URI!\n\n  bio: String\n\n  bioHTML: HTML!\n\n  commitComments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): CommitCommentConnection!\n\n  company: String\n\n  companyHTML: HTML!\n\n  contributionsCollection(\n    organizationID: ID\n\n    from: DateTime\n\n    to: DateTime\n  ): ContributionsCollection!\n\n  createdAt: DateTime!\n\n  databaseId: Int\n\n  email: String!\n\n  followers(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): FollowerConnection!\n\n  following(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): FollowingConnection!\n\n  gist(name: String!): Gist\n\n  gistComments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): GistCommentConnection!\n\n  gists(\n    privacy: GistPrivacy\n\n    orderBy: GistOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): GistConnection!\n  id: ID!\n\n  isBountyHunter: Boolean!\n\n  isCampusExpert: Boolean!\n\n  isDeveloperProgramMember: Boolean!\n\n  isEmployee: Boolean!\n\n  isHireable: Boolean!\n\n  isSiteAdmin: Boolean!\n\n  isViewer: Boolean!\n\n  issueComments(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueCommentConnection!\n\n  issues(\n    orderBy: IssueOrder\n\n    labels: [String!]\n\n    states: [IssueState!]\n\n    filterBy: IssueFilters\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): IssueConnection!\n\n  itemShowcase: ProfileItemShowcase!\n\n  location: String\n\n  login: String!\n\n  name: String\n\n  organization(login: String!): Organization\n\n  organizations(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): OrganizationConnection!\n\n  pinnableItems(\n    types: [PinnableItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PinnableItemConnection!\n\n  pinnedItems(\n    types: [PinnableItemType!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PinnableItemConnection!\n\n  pinnedItemsRemaining: Int!\n\n  pinnedRepositories(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryConnection!\n    @deprecated(\n      reason: \"pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-07-01 UTC.\"\n    )\n\n  project(number: Int!): Project\n\n  projects(\n    orderBy: ProjectOrder\n\n    search: String\n\n    states: [ProjectState!]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): ProjectConnection!\n\n  projectsResourcePath: URI!\n\n  projectsUrl: URI!\n\n  publicKeys(\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PublicKeyConnection!\n\n  pullRequests(\n    states: [PullRequestState!]\n\n    labels: [String!]\n\n    headRefName: String\n\n    baseRefName: String\n\n    orderBy: IssueOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): PullRequestConnection!\n\n  repositories(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n\n    isFork: Boolean\n  ): RepositoryConnection!\n\n  repositoriesContributedTo(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    isLocked: Boolean\n\n    includeUserRepositories: Boolean\n\n    contributionTypes: [RepositoryContributionType]\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryConnection!\n\n  repository(name: String!): Repository\n\n  resourcePath: URI!\n\n  starredRepositories(\n    ownedByViewer: Boolean\n\n    orderBy: StarOrder\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): StarredRepositoryConnection!\n\n  status: UserStatus\n\n  updatedAt: DateTime!\n\n  url: URI!\n\n  viewerCanChangePinnedItems: Boolean!\n\n  viewerCanCreateProjects: Boolean!\n\n  viewerCanFollow: Boolean!\n\n  viewerIsFollowing: Boolean!\n\n  watching(\n    privacy: RepositoryPrivacy\n\n    orderBy: RepositoryOrder\n\n    affiliations: [RepositoryAffiliation]\n\n    ownerAffiliations: [RepositoryAffiliation]\n\n    isLocked: Boolean\n\n    after: String\n\n    before: String\n\n    first: Int\n\n    last: Int\n  ): RepositoryConnection!\n\n  websiteUrl: URI\n}\n\nenum UserBlockDuration {\n  ONE_DAY\n\n  THREE_DAYS\n\n  ONE_WEEK\n\n  ONE_MONTH\n\n  PERMANENT\n}\n\ntype UserBlockedEvent implements Node {\n  actor: Actor\n\n  blockDuration: UserBlockDuration!\n\n  createdAt: DateTime!\n  id: ID!\n\n  subject: User\n}\n\ntype UserConnection {\n  edges: [UserEdge]\n\n  nodes: [User]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype UserContentEdit implements Node {\n  createdAt: DateTime!\n\n  deletedAt: DateTime\n\n  deletedBy: Actor\n\n  diff: String\n\n  editedAt: DateTime!\n\n  editor: Actor\n  id: ID!\n\n  updatedAt: DateTime!\n}\n\ntype UserContentEditConnection {\n  edges: [UserContentEditEdge]\n\n  nodes: [UserContentEdit]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype UserContentEditEdge {\n  cursor: String!\n\n  node: UserContentEdit\n}\n\ntype UserEdge {\n  cursor: String!\n\n  node: User\n}\n\ntype UserStatus implements Node {\n  createdAt: DateTime!\n\n  emoji: String\n\n  id: ID!\n\n  indicatesLimitedAvailability: Boolean!\n\n  message: String\n\n  organization: Organization\n\n  updatedAt: DateTime!\n\n  user: User!\n}\n\ntype UserStatusConnection {\n  edges: [UserStatusEdge]\n\n  nodes: [UserStatus]\n\n  pageInfo: PageInfo!\n\n  totalCount: Int!\n}\n\ntype UserStatusEdge {\n  cursor: String!\n\n  node: UserStatus\n}\n\ninput UserStatusOrder {\n  field: UserStatusOrderField!\n\n  direction: OrderDirection!\n}\n\nenum UserStatusOrderField {\n  UPDATED_AT\n}\n\nscalar X509Certificate\n"
  },
  {
    "path": "packages/graphql-language-service/benchmark/fixtures/kitchen-sink.graphql",
    "content": "query queryName($foo: ComplexType, $site: Site = MOBILE) @onQuery {\n  whoever123is: node(id: [123, 456]) {\n    id\n    ... on User @onInlineFragment {\n      field2 {\n        id\n        alias: field1(first: 10, after: $foo) @include(if: $foo) {\n          id\n          ...frag @onFragmentSpread\n        }\n      }\n    }\n    ... @skip(unless: $foo) {\n      id\n    }\n    ... {\n      id\n    }\n  }\n}\n\nmutation likeStory @onMutation {\n  like(story: 123) @onField {\n    story {\n      id @onField\n    }\n  }\n}\n\nsubscription StoryLikeSubscription($input: StoryLikeSubscribeInput)\n@onSubscription {\n  storyLikeSubscribe(input: $input) {\n    story {\n      likers {\n        count\n      }\n      likeSentence {\n        text\n      }\n    }\n  }\n}\n\nfragment frag on Friend @onFragmentDefinition {\n  foo(size: $size, bar: $b, obj: { key: \"value\" })\n}\n\n{\n  unnamed(truthy: true, falsy: false, nullish: null)\n  query\n}\n\nquery {\n  __typename\n}\n"
  },
  {
    "path": "packages/graphql-language-service/benchmark/index.ts",
    "content": "/* eslint-disable no-console */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport Benchmark from 'benchmark';\nimport { parse } from 'graphql';\nimport { onlineParser, CharacterStream } from '../src';\n\ninterface IStats {\n  mean: number;\n  rme: number;\n  variance: number;\n}\n\nconst printResult = (stats: IStats, name: string, schema: string) => {\n  console.log({\n    name,\n    mean: `${1 / stats.mean} ops / sec`,\n    variance: stats.variance,\n    rme: `${stats.rme}%`,\n    lines: schema.split('\\n').length,\n  });\n\n  console.log(`Completed test suite: ${name}`);\n};\n\nconst runSplitTest = (name: string, schema: string) => {\n  const stats: IStats[] = [];\n\n  const suite = new Benchmark.Suite();\n  const parser = onlineParser();\n  let state: any = parser.startState();\n\n  for (const [index, line] of schema.split('\\n').entries()) {\n    let prevState: any;\n    let completeState: any;\n\n    suite.add({\n      maxTime: 0.1,\n      onStart() {\n        prevState = { ...state };\n      },\n      fn() {\n        const stream = new CharacterStream(line);\n\n        while (!stream.eol()) {\n          parser.token(stream, state);\n          if (state.kind === 'Invalid') {\n            console.log(state.kind, line, index);\n            throw new Error('Invalid');\n          }\n        }\n\n        completeState = state;\n        state = { ...prevState };\n      },\n      onError: console.log,\n      onComplete(e) {\n        state = completeState;\n        stats.push(e.target.stats);\n      },\n    });\n  }\n\n  console.log(`Started test suite: ${name}`);\n\n  suite.run();\n\n  const results = stats.reduce(\n    (result, stat) => {\n      result.mean += stat.mean / stats.length;\n      result.rme += stat.rme / stats.length;\n      result.variance += stat.variance / stats.length;\n\n      return result;\n    },\n    { mean: 0, variance: 0, rme: 0 },\n  );\n\n  printResult(results, name, schema);\n};\n\nconst runWholeTest = (name: string, schema: string) => {\n  const suite = new Benchmark.Suite('', {\n    onComplete: (e: any) => printResult(e.target.stats, name, schema),\n  });\n\n  const parser = onlineParser();\n  const state: any = parser.startState();\n\n  suite.add(() => {\n    const stream = new CharacterStream(schema);\n\n    while (!stream.eol()) {\n      parser.token(stream, state);\n      if (state.kind === 'Invalid') {\n        console.log(state.kind);\n        throw new Error('Invalid');\n      }\n    }\n  });\n\n  console.log(`Started test suite: ${name}`);\n  suite.run();\n};\n\nconst runGraphqlParserTest = (name: string, schema: string) => {\n  const suite = new Benchmark.Suite('', {\n    onComplete: (e: any) => printResult(e.target.stats, name, schema),\n  });\n\n  suite.add({\n    fn() {\n      try {\n        parse(schema);\n      } catch (err) {\n        console.log(err);\n        throw err;\n      }\n    },\n  });\n\n  console.log(`Started test suite: ${name}`);\n  suite.run();\n};\n\nconst kitchenSchema = fs.readFileSync(\n  path.resolve(__dirname, './fixtures/kitchen-sink.graphql'),\n  'utf8',\n);\nconst githubSchema = fs.readFileSync(\n  path.resolve(__dirname, './fixtures/github.graphql'),\n  'utf8',\n);\n\nrunWholeTest('kitchen-sink:whole', kitchenSchema);\nrunSplitTest('kitchen-sink:split', kitchenSchema);\n\nrunWholeTest('github:whole', githubSchema);\n\nrunGraphqlParserTest('kitchen-sink:graphql-js', kitchenSchema);\nrunGraphqlParserTest('github:graphql-js', githubSchema);\n"
  },
  {
    "path": "packages/graphql-language-service/package.json",
    "content": "{\n  \"name\": \"graphql-language-service\",\n  \"version\": \"5.5.0\",\n  \"description\": \"The official, runtime independent Language Service for GraphQL\",\n  \"contributors\": [\n    \"GraphQL Contributors\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphql-language-service\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:graphql-language-service\"\n  },\n  \"license\": \"MIT\",\n  \"files\": [\n    \"dist\",\n    \"esm\",\n    \"src\"\n  ],\n  \"keywords\": [\n    \"graphql\",\n    \"language service\",\n    \"LSP\"\n  ],\n  \"main\": \"dist/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"bin\": {\n    \"graphql\": \"./dist/temp-bin.js\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\"\n  },\n  \"dependencies\": {\n    \"debounce-promise\": \"^3.1.2\",\n    \"nullthrows\": \"^1.0.0\",\n    \"vscode-languageserver-types\": \"^3.17.1\"\n  },\n  \"devDependencies\": {\n    \"@types/benchmark\": \"^1.0.33\",\n    \"@types/debounce-promise\": \"^3.1.9\",\n    \"@types/json-schema\": \"7.0.9\",\n    \"@types/picomatch\": \"^2.3.0\",\n    \"benchmark\": \"^2.1.4\",\n    \"graphql\": \"^16.9.0\",\n    \"graphql-config\": \"5.0.3\",\n    \"lodash\": \"^4.17.15\",\n    \"platform\": \"^1.3.5\",\n    \"ts-node\": \"^8.10.2\",\n    \"typescript\": \"^4.6.3\"\n  },\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"benchmark\": \"ts-node benchmark/index.ts\",\n    \"test\": \"vitest\"\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/index.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * A simple LanguageService used by `monaco-graphql`'s webworker lives here.\n *\n * TODO: retire `graphql-language-service-{parser,interface,types,utils}` and merge with this workspace\n */\n/**\n * A whole bunch of the key language services\n */\nexport {\n  getAutocompleteSuggestions,\n  getDefinitionQueryResultForDefinitionNode,\n  getDefinitionQueryResultForFragmentSpread,\n  getDefinitionQueryResultForNamedType,\n  getDefinitionQueryResultForField,\n  getDefinitionQueryResultForArgument,\n  getDiagnostics,\n  getFragmentDefinitions,\n  getHoverInformation,\n  getOutline,\n  getRange,\n  getTypeInfo,\n  getVariableCompletions,\n  SEVERITY,\n  Severity,\n  HoverConfig,\n  SeverityEnum,\n  DIAGNOSTIC_SEVERITY,\n  DefinitionQueryResult,\n  DefinitionQueryResponse,\n  canUseDirective,\n  SuggestionCommand,\n  AutocompleteSuggestionOptions,\n  validateQuery,\n} from './interface';\n\n/**\n * The dependency-less streaming token parser used for getAutocompleteSuggestions, getHover and more\n */\nexport {\n  onlineParser,\n  ParseRules,\n  CharacterStream,\n  RuleKinds,\n  LexRules,\n  isIgnored,\n  p,\n  list,\n  t,\n  opt,\n  getTokenAtPosition,\n  GraphQLDocumentMode,\n  getDefinitionState,\n  getFieldDef,\n  getContextAtPosition,\n} from './parser';\n\nexport type {\n  RuleOrString,\n  ParserOptions,\n  ParseRule,\n  TokenPattern,\n  State,\n  CharacterStreamInterface,\n  RuleKindEnum,\n  Token,\n  ContextToken,\n  ContextTokenForCodeMirror,\n  ContextTokenUnion,\n  RuleKind,\n} from './parser';\n\n/**\n * Types and enums to use across projects\n */\nexport type {\n  CompletionItem,\n  GraphQLProjectConfig,\n  Maybe,\n  IPosition,\n  Diagnostic,\n  IRange,\n  Definition,\n  CachedContent,\n  GraphQLConfig,\n  GraphQLFileMetadata,\n  Uri,\n  ObjectTypeInfo,\n  Outline,\n  OutlineTree,\n  FragmentInfo,\n  GraphQLFileInfo,\n  FileChangeType,\n  GraphQLCache,\n  GraphQLExtensionDeclaration,\n} from './types';\n\nexport { CompletionItemKind, FileChangeTypeKind } from './types';\n\n/**\n * Utilities useful for language services across runtimes\n */\nexport {\n  JSONSchema6,\n  JSONSchema6TypeName,\n  JSONSchemaOptions,\n  getASTNodeAtPosition,\n  getFragmentDependencies,\n  getFragmentDependenciesForAST,\n  getOperationASTFacts,\n  getOperationFacts,\n  getQueryFacts,\n  getVariablesJSONSchema,\n  offsetToPosition,\n  OperationFacts,\n  pointToOffset,\n  Position,\n  collectVariables,\n  validateWithCustomRules,\n  VariableToType,\n  QueryFacts,\n  Range,\n} from './utils';\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/__queries__/testQuery.graphql",
    "content": ""
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/__schema__/HoverTestSchema.graphql",
    "content": "schema {\n  query: Query\n}\n\n\"\"\"\nThis is type documentation for Chicken\n\"\"\"\nscalar Chicken\n\n\"\"\"\ndocs for color\n\"\"\"\nenum Color {\n  RED\n  GREEN\n  BLUE\n}\n\nunion UnionType = String | Float | Boolean\n\ninterface TestInterface {\n  # hello\n  id: String!\n}\n\n\"\"\"\nThis is type documentation for TestType\n\"\"\"\ntype TestType implements TestInterface {\n  \"\"\"\n  This is field documentation for TestType.testField\n  \"\"\"\n  testField: String\n  testDeprecatedField: Float @deprecated(reason: \"deprecation reason\")\n  testEnumField: Color\n}\n\ntype Query {\n  \"\"\"\n  This is field documentation for Query.thing\n  \"\"\"\n  thing: TestType\n  listOfThing: [TestType!]\n  parameterizedField(id: String!, enum: Color): TestType\n  cluck: Chicken\n  unionField: UnionType\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/__schema__/StarWarsSchema.graphql",
    "content": "schema {\n  query: Query\n}\n\ndirective @test(testArg: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\ndirective @onArg on ARGUMENT_DEFINITION\ndirective @onAllDefs on SCHEMA | SCALAR | OBJECT | FIELD_DEFINITION | INTERFACE | UNION | ENUM_VALUE | INPUT_OBJECT | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\nenum Episode {\n  NEWHOPE\n  EMPIRE\n  JEDI\n}\n\ninterface Character {\n  id: String!\n  # hello\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Human implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Droid implements Character {\n  id: String!\n  # yes\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n  primaryFunction: String\n  instructions: [String]!\n}\n\ninput InputType {\n  key: String!\n  value: Int = 42\n  obj: InputType\n}\n\ninterface TestInterface {\n  \"\"\"\n  example\n  \"\"\"\n  testField: String!\n}\n\ninterface AnotherInterface implements TestInterface {\n  # hello\n  testField: String!\n}\n\ntype TestType implements TestInterface & AnotherInterface {\n  testField: String!\n}\n\ntype Query {\n  hero(episode: Episode): Character\n  human(id: String!): Human\n  droid(id: String!): Droid\n  inputTypeTest(args: InputType = { key: \"key\" }): TestType\n  deprecatedField: TestType @deprecated(reason: \"Use test instead.\")\n  union: TestUnion\n}\n\nunion TestUnion = Droid | TestType\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/getAutocompleteSuggestions.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  AutocompleteSuggestionOptions,\n  CompletionItem,\n} from 'graphql-language-service';\n\nimport fs from 'node:fs';\nimport {\n  buildSchema,\n  FragmentDefinitionNode,\n  GraphQLSchema,\n  parse,\n  version as graphQLVersion,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLBoolean,\n  GraphQLDeprecatedDirective,\n  GraphQLSkipDirective,\n  GraphQLIncludeDirective,\n} from 'graphql';\nimport { Position } from '../../utils';\nimport path from 'node:path';\n\nimport { getAutocompleteSuggestions } from '../getAutocompleteSuggestions';\n// import { InsertTextFormat } from 'vscode-languageserver-types';\n\nconst expectedResults = {\n  droid: {\n    label: 'droid',\n    detail: 'Droid',\n  },\n  hero: {\n    label: 'hero',\n    detail: 'Character',\n  },\n  human: {\n    label: 'human',\n    detail: 'Human',\n  },\n  inputTypeTest: {\n    label: 'inputTypeTest',\n    detail: 'TestType',\n  },\n  appearsIn: {\n    label: 'appearsIn',\n    detail: '[Episode]',\n  },\n  friends: {\n    label: 'friends',\n    detail: '[Character]',\n  },\n  union: {\n    label: 'union',\n    detail: 'TestUnion',\n  },\n  __typename: {\n    label: '__typename',\n    detail: 'String!',\n    documentation: 'The name of the current Object type at runtime.',\n  },\n};\n\nconst suggestionCommand = {\n  command: 'editor.action.triggerSuggest',\n  title: 'Suggestions',\n};\n\ndescribe('getAutocompleteSuggestions', () => {\n  let schema: GraphQLSchema;\n  beforeEach(async () => {\n    // graphQLVersion = pkg.version;\n    const schemaIDL = fs.readFileSync(\n      path.join(__dirname, '__schema__/StarWarsSchema.graphql'),\n      'utf8',\n    );\n\n    schema = buildSchema(schemaIDL);\n  });\n\n  // Returns a sorted autocomplete suggestions in an increasing order.\n  function testSuggestions(\n    query: string,\n    point: Position,\n    externalFragments?: FragmentDefinitionNode[],\n    options?: AutocompleteSuggestionOptions & { ignoreInsert?: boolean },\n  ): Array<CompletionItem> {\n    return getAutocompleteSuggestions(\n      schema,\n      query,\n      point,\n      undefined,\n      externalFragments,\n      options,\n    )\n      .filter(field => !['__schema', '__type'].includes(field.label))\n      .sort((a, b) => a.label.localeCompare(b.label))\n      .map(suggestion => {\n        // TODO: A PR where we do `const { type, ..rest} = suggestion; return rest;`\n        // and validate the entire completion object - kinds, documentation, etc\n        const response: CompletionItem = { label: suggestion.label };\n        if (suggestion.detail) {\n          response.detail = suggestion.detail;\n        }\n        if (!options?.ignoreInsert) {\n          if (suggestion.insertText) {\n            response.insertText = suggestion.insertText;\n          }\n          if (suggestion.insertTextFormat) {\n            response.insertTextFormat = suggestion.insertTextFormat;\n          }\n          if (suggestion.command) {\n            response.command = suggestion.command;\n          }\n          if (suggestion.labelDetails) {\n            response.labelDetails = suggestion.labelDetails;\n          }\n        }\n        if (suggestion.documentation?.length) {\n          response.documentation = suggestion.documentation;\n        }\n\n        return response;\n      });\n  }\n\n  describe('with Operation types', () => {\n    const expectedDirectiveSuggestions = [\n      { label: 'include', documentation: GraphQLIncludeDirective.description },\n      { label: 'skip', documentation: GraphQLSkipDirective.description },\n    ];\n\n    // TODO: remove this once defer and stream are merged to `graphql`\n    if (graphQLVersion.startsWith('16.0.0-experimental-stream-defer')) {\n      // @ts-expect-error\n      expectedDirectiveSuggestions.push({ label: 'stream' }, { label: 'test' });\n    } else {\n      // @ts-expect-error\n      expectedDirectiveSuggestions.push({ label: 'test' });\n    }\n\n    it('provides correct sortText response', () => {\n      const result = getAutocompleteSuggestions(\n        schema,\n        '{ h',\n        new Position(0, 3),\n      ).map(({ sortText, label, detail }) => ({ sortText, label, detail }));\n      expect(result).toEqual([\n        {\n          sortText: '0hero',\n          label: 'hero',\n          detail: 'Character',\n        },\n\n        {\n          sortText: '1human',\n          label: 'human',\n          detail: 'Human',\n        },\n\n        {\n          sortText: '7__schema',\n          label: '__schema',\n          detail: '__Schema!',\n        },\n      ]);\n    });\n\n    it('provides correct initial keywords', () => {\n      expect(testSuggestions('', new Position(0, 0))).toEqual([\n        { label: '{' },\n        { label: 'extend' },\n        { label: 'fragment' },\n        { label: 'input' },\n        { label: 'interface' },\n        { label: 'mutation' },\n        { label: 'query' },\n        { label: 'scalar' },\n        { label: 'schema' },\n        { label: 'subscription' },\n        { label: 'type' },\n        { label: 'union' },\n      ]);\n\n      expect(testSuggestions('q', new Position(0, 1))).toEqual([\n        { label: '{' },\n        { label: 'query' },\n      ]);\n    });\n\n    it('provides correct top level suggestions when a simple query is already present', () => {\n      // Below should provide initial keywords\n      expect(testSuggestions(' { id }', new Position(0, 0))).toEqual([\n        { label: '{' },\n        { label: 'fragment' },\n        { label: 'mutation' },\n        { label: 'query' },\n        { label: 'subscription' },\n      ]);\n\n      // Below should provide root field names\n      expect(\n        testSuggestions(' {}', new Position(0, 2), [], {\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        expectedResults.__typename,\n        expectedResults.droid,\n        expectedResults.hero,\n        expectedResults.human,\n        expectedResults.inputTypeTest,\n        expectedResults.union,\n      ]);\n\n      // Test for query text with empty lines\n      expect(\n        testSuggestions(\n          `\n  query name {\n    ...testFragment\n  }\n      `,\n          new Position(2, 0),\n          [],\n          {\n            ignoreInsert: true,\n          },\n        ),\n      ).toEqual([\n        expectedResults.__typename,\n        expectedResults.droid,\n        expectedResults.hero,\n        expectedResults.human,\n        expectedResults.inputTypeTest,\n        expectedResults.union,\n      ]);\n    });\n\n    it('provides correct field name suggestions', () => {\n      const result = testSuggestions('{ ', new Position(0, 2), [], {\n        ignoreInsert: true,\n      });\n      expect(result).toEqual([\n        expectedResults.__typename,\n        expectedResults.droid,\n        expectedResults.hero,\n        expectedResults.human,\n        expectedResults.inputTypeTest,\n        expectedResults.union,\n      ]);\n    });\n\n    it('provides correct field name suggestions after filtered', () => {\n      const result = testSuggestions('{ h ', new Position(0, 3), [], {\n        ignoreInsert: true,\n      });\n      expect(result).toEqual([expectedResults.hero, expectedResults.human]);\n    });\n\n    it('provides correct field name suggestions with alias', () => {\n      const result = testSuggestions(\n        '{ alias: human(id: \"1\") { ',\n        new Position(0, 26),\n        [],\n        {\n          ignoreInsert: true,\n        },\n      );\n\n      expect(result).toEqual([\n        expectedResults.__typename,\n        expectedResults.appearsIn,\n        expectedResults.friends,\n        { label: 'id', detail: 'String!' },\n        { label: 'name', detail: 'String' },\n        { label: 'secretBackstory', detail: 'String' },\n      ]);\n    });\n\n    it('provides correct field name suggestions with insertText', () => {\n      const result = testSuggestions('{ ', new Position(0, 2), [], {\n        ignoreInsert: false,\n        fillLeafsOnComplete: true,\n      });\n      expect(result).toEqual([\n        {\n          ...expectedResults.__typename,\n          command: suggestionCommand,\n          insertTextFormat: 2,\n          insertText: '__typename\\n',\n          labelDetails: { detail: ' String!' },\n        },\n        {\n          ...expectedResults.droid,\n          command: suggestionCommand,\n          insertTextFormat: 2,\n          insertText: 'droid(id: $1)  {\\n   $1\\n}',\n          labelDetails: { detail: ' Droid' },\n        },\n        {\n          ...expectedResults.hero,\n          command: suggestionCommand,\n          insertTextFormat: 2,\n          insertText: 'hero {\\n   $1\\n}',\n          labelDetails: { detail: ' Character' },\n        },\n        {\n          ...expectedResults.human,\n          command: suggestionCommand,\n          insertTextFormat: 2,\n          insertText: 'human(id: $1)  {\\n   $1\\n}',\n          labelDetails: { detail: ' Human' },\n        },\n        {\n          ...expectedResults.inputTypeTest,\n          command: suggestionCommand,\n          insertTextFormat: 2,\n          insertText: 'inputTypeTest {\\n   $1\\n}',\n          labelDetails: { detail: ' TestType' },\n        },\n        {\n          label: 'union',\n          insertTextFormat: 2,\n          insertText: 'union {\\n   $1\\n}',\n          detail: 'TestUnion',\n          command: suggestionCommand,\n          labelDetails: {\n            detail: ' TestUnion',\n          },\n        },\n      ]);\n    });\n    it('provides correct type suggestions for fragments', () => {\n      const result = testSuggestions('fragment test on ', new Position(0, 17));\n\n      expect(result).toEqual([\n        { label: 'AnotherInterface' },\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Human' },\n        { label: 'Query' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]);\n    });\n\n    it('provides correct field suggestions for fragments', () => {\n      const result = testSuggestions(\n        'fragment test on Human { ',\n        new Position(0, 25),\n        [],\n        {\n          ignoreInsert: true,\n        },\n      );\n\n      expect(result).toEqual([\n        expectedResults.__typename,\n        expectedResults.appearsIn,\n        expectedResults.friends,\n        { label: 'id', detail: 'String!' },\n        { label: 'name', detail: 'String' },\n        { label: 'secretBackstory', detail: 'String' },\n      ]);\n    });\n\n    it('provides correct argument suggestions', () => {\n      const result = testSuggestions('{ human (', new Position(0, 9));\n      expect(result).toEqual([\n        {\n          label: 'id',\n          insertText: 'id: ',\n          command: suggestionCommand,\n          insertTextFormat: 2,\n          labelDetails: { detail: ' String!' },\n        },\n      ]);\n    });\n\n    it('provides correct argument suggestions when using aliases', () => {\n      const result = testSuggestions(\n        '{ aliasTest: human( ',\n        new Position(0, 20),\n      );\n      expect(result).toEqual([\n        {\n          label: 'id',\n          command: suggestionCommand,\n          insertText: 'id: ',\n          insertTextFormat: 2,\n          labelDetails: { detail: ' String!' },\n        },\n      ]);\n    });\n    const metaArgs = [\n      {\n        label: '__DirectiveLocation',\n        documentation:\n          'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.',\n      },\n      {\n        label: '__TypeKind',\n        documentation:\n          'An enum describing what kind of type a given `__Type` is.',\n      },\n    ];\n    it('provides correct input type suggestions', () => {\n      const result = testSuggestions(\n        'query($exampleVariable: ) { ',\n        new Position(0, 24),\n      );\n      expect(result).toEqual([\n        ...metaArgs,\n        { label: 'Boolean', documentation: GraphQLBoolean.description },\n        { label: 'Episode' },\n        { label: 'InputType' },\n        { label: 'Int', documentation: GraphQLInt.description },\n        { label: 'String', documentation: GraphQLString.description },\n      ]);\n    });\n\n    it('provides filtered input type suggestions', () => {\n      const result = testSuggestions(\n        'query($exampleVariable: In) { ',\n        new Position(0, 26),\n      );\n      expect(result).toEqual([\n        ...metaArgs,\n\n        { label: 'InputType' },\n        { label: 'Int', documentation: GraphQLInt.description },\n        { label: 'String', documentation: GraphQLString.description },\n      ]);\n    });\n\n    it('provides correct typeCondition suggestions', () => {\n      const suggestionsOnQuery = testSuggestions(\n        '{ ... on ',\n        new Position(0, 9),\n      );\n      expect(\n        suggestionsOnQuery.filter(({ label }) => !label.startsWith('__')),\n      ).toEqual([{ label: 'Query' }]);\n\n      const suggestionsOnCompositeType = testSuggestions(\n        '{ hero(episode: JEDI) { ... on } }',\n        new Position(0, 31),\n      );\n\n      expect(suggestionsOnCompositeType).toEqual([\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Human' },\n      ]);\n\n      expect(\n        testSuggestions(\n          'fragment Foo on Character { ... on }',\n          new Position(0, 35),\n        ),\n      ).toEqual([\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Human' },\n      ]);\n    });\n\n    it('provides correct typeCondition suggestions on fragment', () => {\n      const result = testSuggestions('fragment Foo on {}', new Position(0, 16));\n      expect(result.filter(({ label }) => !label.startsWith('__'))).toEqual([\n        { label: 'AnotherInterface' },\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Human' },\n        { label: 'Query' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]);\n    });\n\n    it('provides correct enum suggestions', () => {\n      const result = testSuggestions('{ hero(episode: ', new Position(0, 16));\n      expect(result).toEqual([\n        { label: 'EMPIRE', detail: 'Episode' },\n        { label: 'JEDI', detail: 'Episode' },\n        { label: 'NEWHOPE', detail: 'Episode' },\n      ]);\n    });\n\n    it('provides correct suggestions for declared variables upon typing $', () => {\n      const result = testSuggestions(\n        'query($id: String, $ep: Episode!){ hero(episode: $ }',\n        new Position(0, 51),\n      );\n      expect(result).toEqual([\n        { label: '$ep', insertText: 'ep', detail: 'Episode' },\n      ]);\n    });\n\n    it('provides correct suggestions for variables based on argument context', () => {\n      const result = testSuggestions(\n        'query($id: String!, $episode: Episode!){ hero(episode: ',\n        new Position(0, 55),\n      );\n      expect(result).toEqual([\n        { label: '$episode', detail: 'Episode', insertText: '$episode' },\n        { label: 'EMPIRE', detail: 'Episode' },\n\n        { label: 'JEDI', detail: 'Episode' },\n        { label: 'NEWHOPE', detail: 'Episode' },\n        // no $id here, it's not compatible :P\n      ]);\n    });\n\n    it('provides fragment name suggestion', () => {\n      const fragmentDef = 'fragment Foo on Human { id }';\n\n      // Test on concrete types\n      expect(\n        testSuggestions(\n          `${fragmentDef} query { human(id: \"1\") { ...`,\n          new Position(0, 57),\n        ),\n      ).toEqual([\n        {\n          label: 'Foo',\n          detail: 'Human',\n          documentation: 'fragment Foo on Human',\n          labelDetails: { detail: 'fragment Foo on Human' },\n        },\n      ]);\n      expect(\n        testSuggestions(\n          `query { human(id: \"1\") { ... }} ${fragmentDef}`,\n          new Position(0, 28),\n        ),\n      ).toEqual([\n        {\n          label: 'Foo',\n          detail: 'Human',\n          documentation: 'fragment Foo on Human',\n          labelDetails: { detail: 'fragment Foo on Human' },\n        },\n      ]);\n\n      // Test on abstract type\n      expect(\n        testSuggestions(\n          `${fragmentDef} query { hero(episode: JEDI) { ...`,\n          new Position(0, 62),\n        ),\n      ).toEqual([\n        {\n          label: 'Foo',\n          detail: 'Human',\n          documentation: 'fragment Foo on Human',\n          labelDetails: { detail: 'fragment Foo on Human' },\n        },\n      ]);\n    });\n\n    it('provides correct fragment name suggestions for external fragments', () => {\n      const externalFragments = parse(`\n        fragment CharacterDetails on Human {\n          name\n        }\n        fragment CharacterDetails2 on Human {\n          name\n        }\n      `).definitions as FragmentDefinitionNode[];\n\n      const result = testSuggestions(\n        'query { human(id: \"1\") { ... }}',\n        new Position(0, 28),\n        externalFragments,\n      );\n\n      expect(result).toEqual([\n        {\n          label: 'CharacterDetails',\n          detail: 'Human',\n          documentation: 'fragment CharacterDetails on Human',\n          labelDetails: { detail: 'fragment CharacterDetails on Human' },\n        },\n        {\n          label: 'CharacterDetails2',\n          detail: 'Human',\n          documentation: 'fragment CharacterDetails2 on Human',\n          labelDetails: { detail: 'fragment CharacterDetails2 on Human' },\n        },\n      ]);\n    });\n\n    it('provides correct directive suggestions', () => {\n      expect(testSuggestions('{ test @ }', new Position(0, 8))).toEqual(\n        expectedDirectiveSuggestions,\n      );\n\n      expect(testSuggestions('{ test @', new Position(0, 8))).toEqual(\n        expectedDirectiveSuggestions,\n      );\n\n      expect(\n        testSuggestions('{ aliasTest: test @ }', new Position(0, 19)),\n      ).toEqual(expectedDirectiveSuggestions);\n\n      expect(testSuggestions('query @', new Position(0, 7))).toEqual([]);\n    });\n\n    it('provides correct directive field suggestions', () => {\n      expect(\n        testSuggestions('{ test @deprecated(', new Position(0, 19)),\n      ).toEqual([\n        {\n          command: suggestionCommand,\n          label: 'reason',\n          insertTextFormat: 2,\n          insertText: 'reason: ',\n          documentation: GraphQLDeprecatedDirective.args[0].description,\n          labelDetails: {\n            detail: ' String',\n          },\n        },\n      ]);\n    });\n    const inputArgs = [\n      {\n        label: 'key',\n        detail: 'String!',\n        insertText: 'key: ',\n        insertTextFormat: 2,\n        command: suggestionCommand,\n      },\n      {\n        detail: 'InputType',\n        label: 'obj',\n        insertText: 'obj:  {\\n   $1\\n}',\n        command: suggestionCommand,\n        insertTextFormat: 2,\n      },\n      {\n        label: 'value',\n        detail: 'Int',\n        insertText: 'value: ',\n        insertTextFormat: 2,\n        command: suggestionCommand,\n      },\n    ];\n    it('provides correct testInput type field suggestions', () => {\n      expect(\n        testSuggestions('{ inputTypeTest(args: {', new Position(0, 23)),\n      ).toEqual(inputArgs);\n    });\n\n    it('provides correct nested testInput type field suggestions', () => {\n      expect(\n        testSuggestions('{ inputTypeTest(args: { obj: {', new Position(0, 30)),\n      ).toEqual(inputArgs);\n    });\n\n    it('provides correct field name suggestion inside inline fragment', () => {\n      expect(\n        testSuggestions(\n          'fragment Foo on Character { ... on Human { }}',\n          new Position(0, 42),\n          [],\n          {\n            ignoreInsert: true,\n          },\n        ),\n      ).toEqual([\n        expectedResults.__typename,\n        expectedResults.appearsIn,\n        expectedResults.friends,\n        { label: 'id', detail: 'String!' },\n        { label: 'name', detail: 'String' },\n        { label: 'secretBackstory', detail: 'String' },\n      ]);\n\n      // Type-less inline fragment assumes the type automatically\n      expect(\n        testSuggestions(\n          'fragment Foo on Droid { ... { ',\n          new Position(0, 30),\n          [],\n          {\n            ignoreInsert: true,\n          },\n        ),\n      ).toEqual([\n        expectedResults.__typename,\n        expectedResults.appearsIn,\n        expectedResults.friends,\n        { label: 'id', detail: 'String!' },\n        { label: 'instructions', detail: '[String]!' },\n        { label: 'name', detail: 'String' },\n        { label: 'primaryFunction', detail: 'String' },\n        { label: 'secretBackstory', detail: 'String' },\n      ]);\n    });\n  });\n\n  describe('with SDL types', () => {\n    it('provides correct initial keywords w/ graphqls', () => {\n      expect(\n        testSuggestions('', new Position(0, 0), [], { uri: 'schema.graphqls' }),\n      ).toEqual([\n        { label: 'extend' },\n        { label: 'input' },\n        { label: 'interface' },\n        { label: 'scalar' },\n        { label: 'schema' },\n        { label: 'type' },\n        { label: 'union' },\n      ]);\n    });\n\n    it('provides correct initial keywords w/out graphqls', () => {\n      expect(\n        testSuggestions('', new Position(0, 0), [], { uri: 'schema.graphql' }),\n      ).toEqual([\n        { label: '{' },\n        { label: 'extend' },\n        { label: 'fragment' },\n        { label: 'input' },\n        { label: 'interface' },\n        { label: 'mutation' },\n        { label: 'query' },\n        { label: 'scalar' },\n        { label: 'schema' },\n        { label: 'subscription' },\n        { label: 'type' },\n        { label: 'union' },\n      ]);\n    });\n\n    it('provides correct initial definition keywords', () => {\n      expect(\n        testSuggestions('type Type { field: String }\\n\\n', new Position(0, 31)),\n      ).toEqual([\n        { label: 'extend' },\n        { label: 'input' },\n        { label: 'interface' },\n        { label: 'scalar' },\n        { label: 'schema' },\n        { label: 'type' },\n        { label: 'union' },\n      ]);\n    });\n\n    it('provides correct extension keywords', () => {\n      expect(testSuggestions('extend ', new Position(0, 7))).toEqual([\n        { label: 'input' },\n        { label: 'interface' },\n        { label: 'scalar' },\n        { label: 'schema' },\n        { label: 'type' },\n        { label: 'union' },\n      ]);\n    });\n\n    it('provides scalars to be extended', () => {\n      expect(testSuggestions('extend scalar ', new Position(0, 14))).toEqual([\n        { label: 'Boolean' },\n        { label: 'Int' },\n        { label: 'String' },\n      ]);\n    });\n\n    it('provides object types to be extended', () => {\n      expect(testSuggestions('extend type ', new Position(0, 12))).toEqual([\n        { label: 'Droid' },\n        { label: 'Human' },\n        { label: 'Query' },\n        { label: 'TestType' },\n      ]);\n    });\n\n    it('does not provide object type names once extending a type', () => {\n      expect(\n        testSuggestions('extend type Query {', new Position(0, 19)),\n      ).toEqual([]);\n    });\n\n    it('provides interfaces to be extended', () => {\n      expect(testSuggestions('extend interface ', new Position(0, 17))).toEqual(\n        [\n          { label: 'AnotherInterface' },\n          { label: 'Character' },\n          { label: 'TestInterface' },\n        ],\n      );\n    });\n\n    it('provides unions to be extended', () => {\n      expect(testSuggestions('extend union ', new Position(0, 13))).toEqual([\n        { label: 'TestUnion' },\n      ]);\n    });\n\n    it('provides enums to be extended', () => {\n      expect(testSuggestions('extend enum ', new Position(0, 12))).toEqual([\n        { label: 'Episode' },\n      ]);\n    });\n\n    it('provides input objects to be extended', () => {\n      expect(testSuggestions('extend input ', new Position(0, 13))).toEqual([\n        { label: 'InputType' },\n      ]);\n    });\n\n    it('provides correct directive suggestions on definitions', () =>\n      expect(testSuggestions('type Type @', new Position(0, 11))).toEqual([\n        { label: 'onAllDefs' },\n      ]));\n    it('provides correct suggestions on object field w/ .graphqls', () =>\n      expect(\n        testSuggestions('type Type {\\n  aField: s', new Position(0, 23), [], {\n          uri: 'schema.graphqls',\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        { label: 'Episode' },\n        { label: 'String' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]));\n\n    it('provides correct argument type suggestions on directive definitions', () =>\n      expect(\n        testSuggestions(\n          'directive @skip(if: ) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT',\n          new Position(0, 19),\n          [],\n          {\n            ignoreInsert: true,\n          },\n        ),\n      ).toEqual([\n        { label: 'Boolean' },\n        { label: 'Episode' },\n        { label: 'InputType' },\n        { label: 'Int' },\n        { label: 'String' },\n      ]));\n\n    it('provides correct suggestions on object fields', () =>\n      expect(\n        testSuggestions('type Type {\\n  aField: s', new Position(0, 23), [], {\n          uri: 'schema.graphql',\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        { label: 'Episode' },\n        { label: 'String' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]));\n    // TODO: shouldn't TestType and TestUnion be available here?\n    it('provides correct filtered suggestions on object fields in regular SDL files', () =>\n      expect(\n        testSuggestions('type Type {\\n  aField: s', new Position(0, 23), [], {\n          uri: 'schema.graphql',\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        { label: 'Episode' },\n        { label: 'String' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]));\n    it('provides correct unfiltered suggestions on object fields in regular SDL files', () =>\n      expect(\n        testSuggestions('type Type {\\n  aField: ', new Position(0, 22), [], {\n          uri: 'schema.graphql',\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        { label: 'AnotherInterface' },\n        { label: 'Boolean' },\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Episode' },\n        { label: 'Human' },\n        { label: 'Int' },\n        // TODO: maybe filter out types attached to top level schema?\n        { label: 'Query' },\n        { label: 'String' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]));\n    it('provides correct suggestions on object fields that are arrays', () =>\n      expect(\n        testSuggestions('type Type {\\n  aField: []', new Position(0, 25), [], {\n          uri: 'schema.graphqls',\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        { label: 'AnotherInterface' },\n        { label: 'Boolean' },\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Episode' },\n        { label: 'Human' },\n        { label: 'Int' },\n        { label: 'Query' },\n        { label: 'String' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]));\n    it('provides correct suggestions on object fields that are arrays in SDL context', () =>\n      expect(\n        testSuggestions('type Type {\\n  aField: []', new Position(0, 25), [], {\n          uri: 'schema.graphql',\n          ignoreInsert: true,\n        }),\n      ).toEqual([\n        { label: 'AnotherInterface' },\n        { label: 'Boolean' },\n        { label: 'Character' },\n        { label: 'Droid' },\n        { label: 'Episode' },\n        { label: 'Human' },\n        { label: 'Int' },\n        { label: 'Query' },\n        { label: 'String' },\n        { label: 'TestInterface' },\n        { label: 'TestType' },\n        { label: 'TestUnion' },\n      ]));\n    it('provides correct suggestions on input object fields', () =>\n      expect(\n        testSuggestions('input Type {\\n  aField: s', new Position(0, 23), [], {\n          uri: 'schema.graphqls',\n        }),\n      ).toEqual([\n        { label: 'Episode' },\n        { label: 'String', documentation: GraphQLString.description },\n      ]));\n    it('provides correct directive suggestions on args definitions', () =>\n      expect(\n        testSuggestions('type Type { field(arg: String @', new Position(0, 31)),\n      ).toEqual([\n        {\n          label: 'deprecated',\n          documentation: GraphQLDeprecatedDirective.description,\n        },\n        { label: 'onAllDefs' },\n        { label: 'onArg' },\n      ]));\n\n    it('provides correct interface suggestions when extending with an interface', () =>\n      expect(\n        testSuggestions('type Type implements ', new Position(0, 20)),\n      ).toEqual([\n        { label: 'AnotherInterface' },\n        { label: 'Character' },\n        { label: 'TestInterface' },\n      ]));\n\n    it('provides correct interface suggestions when extending a type with multiple interfaces', () =>\n      expect(\n        testSuggestions(\n          'type Type implements TestInterface & ',\n          new Position(0, 37),\n        ),\n      ).toEqual([{ label: 'AnotherInterface' }, { label: 'Character' }]));\n    it('provides correct interface suggestions when extending an interface with multiple interfaces', () =>\n      expect(\n        testSuggestions(\n          'interface IExample implements TestInterface & ',\n          new Position(0, 46),\n        ),\n      ).toEqual([{ label: 'AnotherInterface' }, { label: 'Character' }]));\n    it('provides filtered interface suggestions when extending an interface with multiple interfaces', () =>\n      expect(\n        testSuggestions(\n          'interface IExample implements TestInterface & Inter',\n          new Position(0, 48),\n        ),\n      ).toEqual([{ label: 'AnotherInterface' }]));\n    it('provides no interface suggestions when using implements and there are no & or { characters present', () =>\n      expect(\n        testSuggestions(\n          'interface IExample implements TestInterface ',\n          new Position(0, 44),\n        ),\n      ).toEqual([]));\n    it('provides fragment completion after a list of interfaces to extend', () =>\n      expect(\n        testSuggestions(\n          'interface IExample implements TestInterface & AnotherInterface @f',\n          new Position(0, 65),\n        ),\n      ).toEqual([{ label: 'onAllDefs' }]));\n    it('provides correct interface suggestions when extending an interface with an inline interface', () =>\n      expect(\n        testSuggestions(\n          'interface A { id: String }\\ninterface MyInterface implements ',\n          new Position(1, 33),\n        ),\n      ).toEqual([\n        { label: 'A' },\n        { label: 'AnotherInterface' },\n        { label: 'Character' },\n        { label: 'TestInterface' },\n      ]));\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/getDefinition.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { parse } from 'graphql';\nimport {\n  getDefinitionQueryResultForFragmentSpread,\n  getDefinitionQueryResultForNamedType,\n} from '../getDefinition';\n\ndescribe('getDefinition', () => {\n  describe('getDefinitionQueryResultForNamedType', () => {\n    it('returns correct Position', async () => {\n      const query = `type Query {\n        hero(episode: Episode): Character\n      }\n\n      type Episode {\n        id: ID!\n      }\n      `;\n      const parsedQuery = parse(query);\n      // @ts-ignore\n      const namedTypeDefinition = parsedQuery.definitions[0].fields[0].type;\n\n      const result = await getDefinitionQueryResultForNamedType(\n        query,\n        {\n          ...namedTypeDefinition,\n        },\n\n        [\n          {\n            // @ts-ignore\n            file: 'someFile',\n            content: query,\n            definition: {\n              ...namedTypeDefinition,\n            },\n          },\n        ],\n      );\n      expect(result.definitions.length).toEqual(1);\n      expect(result.definitions[0].position.line).toEqual(1);\n      expect(result.definitions[0].position.character).toEqual(32);\n    });\n  });\n\n  describe('getDefinitionQueryResultForNamedType for scalar', () => {\n    it('returns correct Position', async () => {\n      const query = `type Query {\n        hero(episode: Episode): Json\n      }\n\n      type Episode {\n        id: ID!\n      }\n\n      scalar Json\n      `;\n      const parsedQuery = parse(query);\n      // @ts-ignore\n      const namedTypeDefinition = parsedQuery.definitions[0].fields[0].type;\n\n      const result = await getDefinitionQueryResultForNamedType(\n        query,\n        {\n          ...namedTypeDefinition,\n        },\n\n        [\n          {\n            // @ts-ignore\n            file: 'someFile',\n            content: query,\n            definition: {\n              ...namedTypeDefinition,\n            },\n          },\n        ],\n      );\n      expect(result.definitions.length).toEqual(1);\n      expect(result.definitions[0].position.line).toEqual(1);\n      expect(result.definitions[0].position.character).toEqual(32);\n    });\n  });\n\n  describe('getDefinitionQueryResultForFragmentSpread', () => {\n    it('returns correct Position', async () => {\n      const query = `query A {\n        ...Duck\n      }`;\n      const fragment = `# Fragment goes here\n      fragment Duck on Duck {\n        quack\n      }`;\n      // @ts-ignore\n      const fragmentSpread =\n        parse(query).definitions[0].selectionSet.selections[0];\n      const fragmentDefinition = parse(fragment).definitions[0];\n      const result = await getDefinitionQueryResultForFragmentSpread(\n        query,\n        fragmentSpread,\n        [\n          {\n            file: 'someFile',\n            content: fragment,\n            // @ts-ignore\n            definition: fragmentDefinition,\n          },\n        ],\n      );\n      expect(result.definitions.length).toEqual(1);\n      expect(result.definitions[0].position.line).toEqual(1);\n      expect(result.definitions[0].position.character).toEqual(6);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/getDiagnostics.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport fs from 'node:fs';\nimport {\n  buildSchema,\n  parse,\n  GraphQLSchema,\n  GraphQLError,\n  ValidationContext,\n  ASTVisitor,\n  FragmentDefinitionNode,\n  version,\n} from 'graphql';\nimport path from 'node:path';\n\nimport {\n  getDiagnostics,\n  validateQuery,\n  DIAGNOSTIC_SEVERITY,\n} from '../getDiagnostics';\n\ndescribe('getDiagnostics', () => {\n  let schema: GraphQLSchema;\n  beforeEach(async () => {\n    const schemaIDL = fs.readFileSync(\n      path.join(__dirname, '__schema__/StarWarsSchema.graphql'),\n      'utf8',\n    );\n\n    schema = buildSchema(schemaIDL);\n  });\n\n  it('catches field validation errors', () => {\n    const error = validateQuery(parse('query queryName { title }'), schema)[0];\n    expect(error.message).toEqual(\n      'Cannot query field \"title\" on type \"Query\".',\n    );\n    expect(error.severity).toEqual(DIAGNOSTIC_SEVERITY.Error);\n    expect(error.source).toEqual('GraphQL: Validation');\n  });\n\n  it('catches with multiple highlighted nodes', () => {\n    const errors = validateQuery(\n      parse('{ hero(episode: $ep) { name } }'),\n      schema,\n    );\n    expect(errors).toMatchObject([\n      {\n        range: {\n          end: {\n            character: 20,\n            line: 0,\n          },\n          start: {\n            character: 16,\n            line: 0,\n          },\n        },\n      },\n      {\n        range: {\n          end: {\n            character: 32,\n            line: 0,\n          },\n          start: {\n            character: 0,\n            line: 0,\n          },\n        },\n      },\n    ]);\n  });\n\n  it('catches multi root validation errors without breaking (with a custom validation function that always throws errors)', () => {\n    const error = validateQuery(parse('{ hero { name } } { seq }'), schema, [\n      validationContext => {\n        return {\n          Document(node) {\n            for (const definition of node.definitions) {\n              // add a custom error to every definition\n              validationContext.reportError(\n                new GraphQLError(\n                  'This is a custom error.',\n                  // @ts-expect-error\n                  parseInt(version, 10) > 16\n                    ? { nodes: definition }\n                    : definition,\n                ),\n              );\n            }\n            return false;\n          },\n        };\n      },\n    ])[0];\n    expect(error.message).toEqual('This is a custom error.');\n    expect(error.severity).toEqual(DIAGNOSTIC_SEVERITY.Error);\n    expect(error.source).toEqual('GraphQL: Validation');\n  });\n\n  it('catches field deprecation errors', () => {\n    const error = getDiagnostics(\n      '{ deprecatedField { testField } }',\n      schema,\n    )[0];\n    expect(error.message).toEqual(\n      'The field Query.deprecatedField is deprecated. Use test instead.',\n    );\n    expect(error.severity).toEqual(DIAGNOSTIC_SEVERITY.Warning);\n    expect(error.source).toEqual('GraphQL: Deprecation');\n  });\n\n  it('returns no errors for valid query', () => {\n    const errors = getDiagnostics('query { hero { name } }', schema);\n    expect(errors.length).toEqual(0);\n  });\n\n  it('returns no errors for valid query with aliases', () => {\n    const errors = getDiagnostics(\n      'query { superHero: hero { superName: name } superHero2: hero { superName2: name } }',\n      schema,\n    );\n    expect(errors.length).toEqual(0);\n  });\n\n  it('catches a syntax error in the SDL', () => {\n    const errors = getDiagnostics(\n      `\n        type Human implements Character {\n          field_without_type_is_a_syntax_error\n          id: String!\n        }\n      `,\n      schema,\n    );\n    expect(errors.length).toEqual(1);\n    const error = errors[0];\n    expect(error.message).toEqual(\n      'Syntax Error: Expected \":\", found Name \"id\".',\n    );\n    expect(error.severity).toEqual(DIAGNOSTIC_SEVERITY.Error);\n    expect(error.source).toEqual('GraphQL: Syntax');\n  });\n  // TODO: change this kitchen sink to depend on the local schema\n  //       and then run diagnostics with the schema\n  it('returns no errors after parsing kitchen-sink query', () => {\n    const kitchenSink = fs.readFileSync(\n      path.join(__dirname, '/kitchen-sink.graphql'),\n      'utf8',\n    );\n    const errors = getDiagnostics(kitchenSink);\n    expect(errors).toHaveLength(0);\n  });\n\n  it('returns a error with a custom validation rule', () => {\n    const noQueryRule = (context: ValidationContext): ASTVisitor => ({\n      OperationDefinition(node) {\n        if (node.operation === 'query') {\n          context.reportError(\n            new GraphQLError(\n              'No query allowed.',\n              // @ts-expect-error\n              parseInt(version, 10) > 16 ? { nodes: node } : node,\n            ),\n          );\n        }\n      },\n    });\n    const errors = getDiagnostics('query hero { hero { id } }', schema, [\n      noQueryRule,\n    ]);\n    expect(errors).toHaveLength(1);\n    expect(errors[0].message).toEqual('No query allowed.');\n  });\n\n  it('validates with external fragments', () => {\n    const errors = getDiagnostics(\n      'query hero { hero { ...HeroGuy } }',\n      schema,\n      [],\n      false,\n      'fragment HeroGuy on Human { id }',\n    );\n    expect(errors).toHaveLength(0);\n  });\n  it('validates with external fragments as array', () => {\n    const externalFragments = parse(`\n      fragment Person on Human {\n        name\n      }\n      fragment Person2 on Human {\n        name\n      }\n    `).definitions as FragmentDefinitionNode[];\n    const errors = getDiagnostics(\n      'query hero { hero { ...Person ...Person2 } }',\n      schema,\n      [],\n      false,\n      externalFragments,\n    );\n    expect(errors).toHaveLength(0);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/getHoverInformation.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { Hover } from 'vscode-languageserver-types';\n\nimport fs from 'node:fs';\nimport { buildSchema, GraphQLSchema } from 'graphql';\nimport { Position } from 'graphql-language-service';\nimport path from 'node:path';\n\nimport { getHoverInformation } from '../getHoverInformation';\n\ndescribe('getHoverInformation', () => {\n  let schema: GraphQLSchema;\n  beforeEach(async () => {\n    const schemaIDL = fs.readFileSync(\n      path.join(__dirname, '__schema__/HoverTestSchema.graphql'),\n      'utf8',\n    );\n\n    schema = buildSchema(schemaIDL);\n  });\n\n  function testHover(query: string, point: Position): Hover['contents'] {\n    return getHoverInformation(schema, query, point);\n  }\n\n  it('provides leaf field information', () => {\n    const actual = testHover(\n      'query { thing { testField } }',\n      new Position(0, 20),\n    );\n    expect(actual).toEqual(\n      'TestType.testField: String\\n\\nThis is field documentation for TestType.testField',\n    );\n  });\n\n  it('provides aliased field information', () => {\n    const actual = testHover(\n      'query { thing { other: testField } }',\n      new Position(0, 25),\n    );\n    expect(actual).toEqual(\n      'TestType.testField: String\\n\\nThis is field documentation for TestType.testField',\n    );\n  });\n\n  it('provides intermediate field information', () => {\n    const actual = testHover(\n      'query { thing { testField } }',\n      new Position(0, 10),\n    );\n    expect(actual).toEqual(\n      'Query.thing: TestType\\n\\nThis is field documentation for Query.thing',\n    );\n  });\n\n  it('provides list field information', () => {\n    const actual = testHover(\n      'query { listOfThing { testField } }',\n      new Position(0, 10),\n    );\n    expect(actual).toEqual('Query.listOfThing: [TestType!]');\n  });\n\n  it('provides deprecated field information', () => {\n    const actual = testHover(\n      'query { thing { testDeprecatedField } }',\n      new Position(0, 20),\n    );\n    expect(actual).toEqual(\n      'TestType.testDeprecatedField: Float\\n\\nDeprecated: deprecation reason',\n    );\n  });\n\n  it('provides enum field information', () => {\n    const actual = testHover(\n      'query { thing { testEnumField } }',\n      new Position(0, 20),\n    );\n    expect(actual).toEqual('TestType.testEnumField: Color');\n  });\n\n  it('provides scalar field information', () => {\n    const actual = testHover('query { cluck }', new Position(0, 10));\n    expect(actual).toEqual('Query.cluck: Chicken');\n  });\n\n  it('provides parameter type information', () => {\n    const actual = testHover(\n      'query { parameterizedField(id: \"foo\") { testField } }',\n      new Position(0, 28),\n    );\n    expect(actual).toEqual('Query.parameterizedField(id: String!)');\n  });\n\n  it('provides enum parameter type information', () => {\n    const actual = testHover(\n      'query { parameterizedField(id: \"foo\", enum: GREEN) { testField } }',\n      new Position(0, 46),\n    );\n    expect(actual).toEqual('Color.GREEN');\n  });\n\n  it('provides variable type information', () => {\n    const actual = testHover(\n      'query($who: String!) { parameterizedField(id: $who) { testField } }',\n      new Position(0, 48),\n    );\n    expect(actual).toEqual('String!');\n  });\n\n  it('provides directive information', () => {\n    const actual = testHover(\n      'query { thing { testField @skip(if:true) } }',\n      new Position(0, 30),\n    );\n    expect(actual).toEqual(\n      '@skip\\n\\nDirects the executor to skip this field or fragment when the `if` argument is true.',\n    );\n  });\n\n  it('provides union information', () => {\n    const actual = testHover('query { unionField }', new Position(0, 12));\n    expect(actual).toEqual('Query.unionField: UnionType');\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/getOutline.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { getOutline } from '../getOutline';\n\ndescribe('getOutline()', () => {\n  it('returns outline trees correctly', () => {\n    const query = `query test {\n      name\n    }`;\n    // @ts-ignore\n    const tree = getOutline(query).outlineTrees;\n    expect(tree).not.toBeUndefined();\n    expect(tree.length).toEqual(1);\n    // @ts-ignore\n    expect(tree[0].startPosition.line).toEqual(0);\n    // @ts-ignore\n    expect(tree[0].startPosition.character).toEqual(0);\n    // @ts-ignore\n    expect(tree[0].endPosition.line).toEqual(2);\n    // @ts-ignore\n    expect(tree[0].endPosition.character).toEqual(5);\n    // @ts-ignore\n    expect(tree[0].representativeName).toEqual('test');\n    // @ts-ignore\n    expect(tree[0].tokenizedText.length).toEqual(3);\n    // @ts-ignore\n    expect(tree[0].tokenizedText[0]).toEqual({\n      kind: 'keyword',\n      value: 'query',\n    });\n    // @ts-ignore\n    expect(tree[0].tokenizedText[1]).toEqual({\n      kind: 'whitespace',\n      value: ' ',\n    });\n    // @ts-ignore\n    expect(tree[0].tokenizedText[2]).toEqual({\n      kind: 'class-name',\n      value: 'test',\n    });\n    // @ts-ignore\n    expect(tree[0].children.length).toEqual(1);\n    // @ts-ignore\n    expect(tree[0].children[0].children.length).toEqual(0);\n    // @ts-ignore\n    expect(tree[0].children[0].startPosition.line).toEqual(1);\n    // @ts-ignore\n    expect(tree[0].children[0].startPosition.character).toEqual(6);\n    // @ts-ignore\n    expect(tree[0].children[0].endPosition.line).toEqual(1);\n    // @ts-ignore\n    expect(tree[0].children[0].endPosition.character).toEqual(10);\n    // @ts-ignore\n    expect(tree[0].children[0].representativeName).toEqual('name');\n    // @ts-ignore\n    expect(tree[0].children[0].tokenizedText.length).toEqual(1);\n    // @ts-ignore\n    expect(tree[0].children[0].tokenizedText[0]).toEqual({\n      kind: 'plain',\n      value: 'name',\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/kitchen-sink.graphql",
    "content": "# Copyright (c) 2021 GraphQL Contributors\n# All rights reserved.\n#\n# This source code is licensed under the license found in the\n# LICENSE file in the root directory of this source tree.\n\nquery queryName($foo: TestInput, $site: TestEnum = RED) {\n  testAlias: hasArgs(string: \"testString\")\n  ... on Test {\n    hasArgs(\n      listEnum: [RED, GREEN, BLUE]\n      int: 1\n      listFloat: [1.23, 1.3e-1, -1.35384e+3]\n      boolean: true\n      id: 123\n      object: $foo\n      enum: $site\n    )\n  }\n  test @include(if: true) {\n    union {\n      __typename\n    }\n  }\n  ...frag\n  ... @skip(if: false) {\n    id\n  }\n  ... {\n    id\n  }\n}\n\nmutation mutationName {\n  setString(value: \"newString\")\n}\n\nsubscription subscriptionName {\n  subscribeToTest(id: \"anId\") {\n    ... on Test {\n      id\n    }\n  }\n}\n\nfragment frag on Test {\n  test @include(if: true) {\n    union {\n      __typename\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/queries/definitionQuery.graphql",
    "content": "type Query {\n  hero(episode: Episode): Character\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/__tests__/queries/testQuery.graphql",
    "content": ""
  },
  {
    "path": "packages/graphql-language-service/src/interface/autocompleteUtils.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  GraphQLField,\n  GraphQLType,\n  isListType,\n  isObjectType,\n  isInputObjectType,\n  getNamedType,\n  isAbstractType,\n} from 'graphql';\nimport { CompletionItemBase } from '../types';\nimport { ContextTokenUnion } from '../parser';\n\nexport function objectValues<T>(object: Record<string, T>): Array<T> {\n  const keys = Object.keys(object);\n  const len = keys.length;\n  const values = new Array(len);\n  for (let i = 0; i < len; ++i) {\n    values[i] = object[keys[i]];\n  }\n  return values;\n}\n\n// Create the expected hint response given a possible list and a token\nexport function hintList<T extends CompletionItemBase>(\n  token: ContextTokenUnion,\n  list: Array<T>,\n): Array<T> {\n  return filterAndSortList(list, normalizeText(token.string));\n}\n\n// Given a list of hint entries and currently typed text, sort and filter to\n// provide a concise list.\nfunction filterAndSortList<T extends CompletionItemBase>(\n  list: Array<T>,\n  text: string,\n): Array<T> {\n  if (\n    !text ||\n    text.trim() === '' ||\n    text.trim() === ':' ||\n    text.trim() === '{'\n  ) {\n    return filterNonEmpty<T>(list, entry => !entry.isDeprecated);\n  }\n\n  const byProximity = list.map(entry => ({\n    proximity: getProximity(normalizeText(entry.label), text),\n    entry,\n  }));\n\n  return filterNonEmpty(\n    filterNonEmpty(byProximity, pair => pair.proximity <= 2),\n    pair => !pair.entry.isDeprecated,\n  )\n    .sort(\n      (a, b) =>\n        (a.entry.isDeprecated ? 1 : 0) - (b.entry.isDeprecated ? 1 : 0) ||\n        a.proximity - b.proximity ||\n        a.entry.label.length - b.entry.label.length,\n    )\n    .map(pair => pair.entry);\n}\n\n// Filters the array by the predicate, unless it results in an empty array,\n// in which case return the original array.\nfunction filterNonEmpty<T>(\n  array: Array<T>,\n  predicate: (entry: T) => boolean,\n): Array<T> {\n  const filtered = array.filter(predicate);\n  return filtered.length === 0 ? array : filtered;\n}\n\nfunction normalizeText(text: string): string {\n  return text.toLowerCase().replaceAll(/\\W/g, '');\n}\n\n// Determine a numeric proximity for a suggestion based on current text.\nfunction getProximity(suggestion: string, text: string): number {\n  // start with lexical distance\n  let proximity = lexicalDistance(text, suggestion);\n  if (suggestion.length > text.length) {\n    // do not penalize long suggestions.\n    proximity -= suggestion.length - text.length - 1;\n    // penalize suggestions not starting with this phrase\n    proximity += suggestion.indexOf(text) === 0 ? 0 : 0.5;\n  }\n  return proximity;\n}\n\n/**\n * Computes the lexical distance between strings A and B.\n *\n * The \"distance\" between two strings is given by counting the minimum number\n * of edits needed to transform string A into string B. An edit can be an\n * insertion, deletion, or substitution of a single character, or a swap of two\n * adjacent characters.\n *\n * This distance can be useful for detecting typos in input or sorting\n *\n * @param {string} a\n * @param {string} b\n * @return {int} distance in number of edits\n */\nfunction lexicalDistance(a: string, b: string): number {\n  let i;\n  let j;\n  const d = [];\n  const aLength = a.length;\n  const bLength = b.length;\n\n  for (i = 0; i <= aLength; i++) {\n    d[i] = [i];\n  }\n\n  for (j = 1; j <= bLength; j++) {\n    d[0][j] = j;\n  }\n\n  for (i = 1; i <= aLength; i++) {\n    for (j = 1; j <= bLength; j++) {\n      const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\n      d[i][j] = Math.min(\n        d[i - 1][j] + 1,\n        d[i][j - 1] + 1,\n        d[i - 1][j - 1] + cost,\n      );\n\n      if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n        d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);\n      }\n    }\n  }\n\n  return d[aLength][bLength];\n}\n\nconst insertSuffix = (n?: number) => ` {\\n   $${n ?? 1}\\n}`;\n\nexport const getInsertText = (\n  prefix: string,\n  type?: GraphQLType,\n  fallback?: string,\n): string => {\n  if (!type) {\n    return fallback ?? prefix;\n  }\n\n  const namedType = getNamedType(type);\n  if (\n    isObjectType(namedType) ||\n    isInputObjectType(namedType) ||\n    isListType(namedType) ||\n    isAbstractType(namedType)\n  ) {\n    return prefix + insertSuffix();\n  }\n\n  return fallback ?? prefix;\n};\n\nexport const getInputInsertText = (\n  prefix: string,\n  type: GraphQLType,\n  fallback?: string,\n): string => {\n  // if (isScalarType(type) && type.name === GraphQLString.name) {\n  //   return prefix + '\"$1\"';\n  // }\n  if (isListType(type)) {\n    const baseType = getNamedType(type.ofType);\n    return prefix + `[${getInsertText('', baseType, '$1')}]`;\n  }\n  return getInsertText(prefix, type, fallback);\n};\n\n/**\n * generates a TextSnippet for a field with possible required arguments\n * that dynamically adjusts to the number of required arguments\n * @param field\n * @returns\n */\nexport const getFieldInsertText = (field: GraphQLField<null, null>) => {\n  const requiredArgs = field.args.filter(arg =>\n    arg.type.toString().endsWith('!'),\n  );\n  if (!requiredArgs.length) {\n    return;\n  }\n  return (\n    field.name +\n    `(${requiredArgs.map(\n      (arg, i) => `${arg.name}: $${i + 1}`,\n    )}) ${getInsertText('', field.type, '\\n')}`\n  );\n};\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/getAutocompleteSuggestions.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  FragmentDefinitionNode,\n  GraphQLDirective,\n  GraphQLSchema,\n  GraphQLType,\n  GraphQLCompositeType,\n  GraphQLEnumValue,\n  GraphQLField,\n  GraphQLFieldMap,\n  GraphQLNamedType,\n  isInterfaceType,\n  GraphQLInterfaceType,\n  GraphQLObjectType,\n  Kind,\n  DirectiveLocation,\n  GraphQLArgument,\n  // isNonNullType,\n  isScalarType,\n  isObjectType,\n  isUnionType,\n  isEnumType,\n  isInputObjectType,\n  isOutputType,\n  GraphQLBoolean,\n  GraphQLEnumType,\n  GraphQLInputObjectType,\n  SchemaMetaFieldDef,\n  TypeMetaFieldDef,\n  TypeNameMetaFieldDef,\n  assertAbstractType,\n  doTypesOverlap,\n  getNamedType,\n  isAbstractType,\n  isCompositeType,\n  isInputType,\n  visit,\n  parse,\n} from 'graphql';\n\nimport {\n  CompletionItem,\n  AllTypeInfo,\n  IPosition,\n  CompletionItemKind,\n  InsertTextFormat,\n} from '../types';\n\nimport type {\n  ContextToken,\n  State,\n  RuleKind,\n  ContextTokenForCodeMirror,\n} from '../parser';\nimport {\n  getTypeInfo,\n  runOnlineParser,\n  RuleKinds,\n  getContextAtPosition,\n  getDefinitionState,\n  GraphQLDocumentMode,\n} from '../parser';\nimport {\n  hintList,\n  objectValues,\n  getInputInsertText,\n  getFieldInsertText,\n  getInsertText,\n} from './autocompleteUtils';\n\nimport { InsertTextMode } from 'vscode-languageserver-types';\n\nexport { runOnlineParser, getTypeInfo };\n\nexport const SuggestionCommand = {\n  command: 'editor.action.triggerSuggest',\n  title: 'Suggestions',\n};\n\nconst collectFragmentDefs = (op: string | undefined) => {\n  const externalFragments: FragmentDefinitionNode[] = [];\n  if (op) {\n    try {\n      visit(parse(op), {\n        FragmentDefinition(def) {\n          externalFragments.push(def);\n        },\n      });\n    } catch {\n      return [];\n    }\n  }\n  return externalFragments;\n};\n\nexport type AutocompleteSuggestionOptions = {\n  /**\n   * EXPERIMENTAL: Automatically fill required leaf nodes recursively\n   * upon triggering code completion events.\n   *\n   *\n   * - [x] fills required nodes\n   * - [x] automatically expands relay-style node/edge fields\n   * - [ ] automatically jumps to first required argument field\n   *      - then, continues to prompt for required argument fields\n   *      - (fixing this will make it non-experimental)\n   *      - when it runs out of arguments, or you choose `{` as a completion option\n   *        that appears when all required arguments are supplied, the argument\n   *        selection closes `)` and the leaf field expands again `{ \\n| }`\n   */\n  fillLeafsOnComplete?: boolean;\n  uri?: string;\n  mode?: GraphQLDocumentMode;\n};\n\ntype InternalAutocompleteOptions = AutocompleteSuggestionOptions & {\n  schema?: GraphQLSchema;\n};\n\n/**\n * Given GraphQLSchema, queryText, and context of the current position within\n * the source text, provide a list of typeahead entries.\n */\nexport function getAutocompleteSuggestions(\n  schema: GraphQLSchema,\n  queryText: string,\n  cursor: IPosition,\n  contextToken?: ContextTokenForCodeMirror,\n  fragmentDefs?: FragmentDefinitionNode[] | string,\n  options?: AutocompleteSuggestionOptions,\n): Array<CompletionItem> {\n  const opts = {\n    ...options,\n    schema,\n  } as InternalAutocompleteOptions;\n\n  const context = getContextAtPosition(\n    queryText,\n    cursor,\n    schema,\n    contextToken,\n    options,\n  );\n  if (!context) {\n    return [];\n  }\n  const { state, typeInfo, mode, token } = context;\n\n  const { kind, step, prevState } = state;\n\n  // Definition kinds\n  if (kind === RuleKinds.DOCUMENT) {\n    if (mode === GraphQLDocumentMode.TYPE_SYSTEM) {\n      return getSuggestionsForTypeSystemDefinitions(token);\n    }\n    if (mode === GraphQLDocumentMode.EXECUTABLE) {\n      return getSuggestionsForExecutableDefinitions(token);\n    }\n    return getSuggestionsForUnknownDocumentMode(token);\n  }\n\n  if (kind === RuleKinds.EXTEND_DEF) {\n    return getSuggestionsForExtensionDefinitions(token);\n  }\n\n  if (\n    prevState?.prevState?.kind === RuleKinds.EXTENSION_DEFINITION &&\n    state.name\n  ) {\n    return hintList(token, []);\n  }\n\n  // extend scalar\n  if (prevState?.kind === Kind.SCALAR_TYPE_EXTENSION) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(isScalarType)\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n        })),\n    );\n  }\n\n  // extend object type\n  if (prevState?.kind === Kind.OBJECT_TYPE_EXTENSION) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(type => isObjectType(type) && !type.name.startsWith('__'))\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n        })),\n    );\n  }\n\n  // extend interface type\n  if (prevState?.kind === Kind.INTERFACE_TYPE_EXTENSION) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(isInterfaceType)\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n        })),\n    );\n  }\n\n  // extend union type\n  if (prevState?.kind === Kind.UNION_TYPE_EXTENSION) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(isUnionType)\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n        })),\n    );\n  }\n\n  // extend enum type\n  if (prevState?.kind === Kind.ENUM_TYPE_EXTENSION) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(type => isEnumType(type) && !type.name.startsWith('__'))\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n        })),\n    );\n  }\n\n  // extend input object type\n  if (prevState?.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(isInputObjectType)\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n        })),\n    );\n  }\n\n  if (\n    kind === RuleKinds.IMPLEMENTS ||\n    (kind === RuleKinds.NAMED_TYPE && prevState?.kind === RuleKinds.IMPLEMENTS)\n  ) {\n    return getSuggestionsForImplements(\n      token,\n      state,\n      schema,\n      queryText,\n      typeInfo,\n    );\n  }\n\n  // Field names\n  if (\n    kind === RuleKinds.SELECTION_SET ||\n    kind === RuleKinds.FIELD ||\n    kind === RuleKinds.ALIASED_FIELD\n  ) {\n    return getSuggestionsForFieldNames(token, typeInfo, opts);\n  }\n\n  // Argument names\n  if (\n    kind === RuleKinds.ARGUMENTS ||\n    (kind === RuleKinds.ARGUMENT && step === 0)\n  ) {\n    const { argDefs } = typeInfo;\n    if (argDefs) {\n      return hintList(\n        token,\n        argDefs.map(\n          (argDef: GraphQLArgument): CompletionItem => ({\n            label: argDef.name,\n            insertText: getInputInsertText(argDef.name + ': ', argDef.type),\n            insertTextMode: InsertTextMode.adjustIndentation,\n            insertTextFormat: InsertTextFormat.Snippet,\n            command: SuggestionCommand,\n            labelDetails: {\n              detail: ' ' + String(argDef.type),\n            },\n            documentation: argDef.description ?? undefined,\n            kind: CompletionItemKind.Variable,\n            type: argDef.type,\n          }),\n        ),\n      );\n    }\n  }\n\n  // Input Object fields\n  if (\n    (kind === RuleKinds.OBJECT_VALUE ||\n      (kind === RuleKinds.OBJECT_FIELD && step === 0)) &&\n    typeInfo.objectFieldDefs\n  ) {\n    const objectFields = objectValues(typeInfo.objectFieldDefs);\n    const completionKind =\n      kind === RuleKinds.OBJECT_VALUE\n        ? CompletionItemKind.Value\n        : CompletionItemKind.Field;\n    return hintList(\n      token,\n      objectFields.map(field => ({\n        label: field.name,\n        detail: String(field.type),\n        documentation: field?.description ?? undefined,\n        kind: completionKind,\n        type: field.type,\n        insertText: getInputInsertText(field.name + ': ', field.type),\n        insertTextMode: InsertTextMode.adjustIndentation,\n        insertTextFormat: InsertTextFormat.Snippet,\n        command: SuggestionCommand,\n      })),\n    );\n  }\n\n  // Input values: Enum and Boolean\n  if (\n    kind === RuleKinds.ENUM_VALUE ||\n    (kind === RuleKinds.LIST_VALUE && step === 1) ||\n    (kind === RuleKinds.OBJECT_FIELD && step === 2) ||\n    (kind === RuleKinds.ARGUMENT && step === 2)\n  ) {\n    return getSuggestionsForInputValues(token, typeInfo, queryText, schema);\n  }\n  // complete for all variables available in the query scoped to this\n  if (kind === RuleKinds.VARIABLE && step === 1) {\n    const namedInputType = getNamedType(typeInfo.inputType!);\n    const variableDefinitions = getVariableCompletions(\n      queryText,\n      schema,\n      token,\n    );\n    return hintList(\n      token,\n      variableDefinitions.filter(v => v.detail === namedInputType?.name),\n    );\n  }\n\n  // Fragment type conditions\n  if (\n    (kind === RuleKinds.TYPE_CONDITION && step === 1) ||\n    (kind === RuleKinds.NAMED_TYPE &&\n      prevState != null &&\n      prevState.kind === RuleKinds.TYPE_CONDITION)\n  ) {\n    return getSuggestionsForFragmentTypeConditions(\n      token,\n      typeInfo,\n      schema,\n      kind,\n    );\n  }\n\n  // Fragment spread names\n  if (kind === RuleKinds.FRAGMENT_SPREAD && step === 1) {\n    return getSuggestionsForFragmentSpread(\n      token,\n      typeInfo,\n      schema,\n      queryText,\n      Array.isArray(fragmentDefs)\n        ? fragmentDefs\n        : collectFragmentDefs(fragmentDefs),\n    );\n  }\n\n  const unwrappedState = unwrapType(state);\n\n  if (unwrappedState.kind === RuleKinds.FIELD_DEF) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(type => isOutputType(type) && !type.name.startsWith('__'))\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n          insertText: options?.fillLeafsOnComplete\n            ? type.name + '\\n'\n            : type.name,\n          insertTextMode: InsertTextMode.adjustIndentation,\n        })),\n    );\n  }\n  if (unwrappedState.kind === RuleKinds.INPUT_VALUE_DEF && step === 2) {\n    return hintList(\n      token,\n      Object.values(schema.getTypeMap())\n        .filter(type => isInputType(type) && !type.name.startsWith('__'))\n        .map(type => ({\n          label: type.name,\n          kind: CompletionItemKind.Function,\n          insertText: options?.fillLeafsOnComplete\n            ? type.name + '\\n$1'\n            : type.name,\n          insertTextMode: InsertTextMode.adjustIndentation,\n          insertTextFormat: InsertTextFormat.Snippet,\n        })),\n    );\n  }\n\n  // Variable definition types\n  if (\n    (kind === RuleKinds.VARIABLE_DEFINITION && step === 2) ||\n    (kind === RuleKinds.LIST_TYPE && step === 1) ||\n    (kind === RuleKinds.NAMED_TYPE &&\n      prevState &&\n      (prevState.kind === RuleKinds.VARIABLE_DEFINITION ||\n        prevState.kind === RuleKinds.LIST_TYPE ||\n        prevState.kind === RuleKinds.NON_NULL_TYPE))\n  ) {\n    return getSuggestionsForVariableDefinition(token, schema, kind);\n  }\n\n  // Directive names\n  if (kind === RuleKinds.DIRECTIVE) {\n    return getSuggestionsForDirective(token, state, schema, kind);\n  }\n  if (kind === RuleKinds.DIRECTIVE_DEF) {\n    return getSuggestionsForDirectiveArguments(token, state, schema, kind);\n  }\n\n  return [];\n}\n\nconst typeSystemCompletionItems: CompletionItem[] = [\n  { label: 'type', kind: CompletionItemKind.Function },\n  { label: 'interface', kind: CompletionItemKind.Function },\n  { label: 'union', kind: CompletionItemKind.Function },\n  { label: 'input', kind: CompletionItemKind.Function },\n  { label: 'scalar', kind: CompletionItemKind.Function },\n  { label: 'schema', kind: CompletionItemKind.Function },\n];\n\nconst executableCompletionItems: CompletionItem[] = [\n  { label: 'query', kind: CompletionItemKind.Function },\n  { label: 'mutation', kind: CompletionItemKind.Function },\n  { label: 'subscription', kind: CompletionItemKind.Function },\n  { label: 'fragment', kind: CompletionItemKind.Function },\n  { label: '{', kind: CompletionItemKind.Constructor },\n];\n\n// Helper functions to get suggestions for each kinds\nfunction getSuggestionsForTypeSystemDefinitions(\n  token: ContextToken,\n): CompletionItem[] {\n  return hintList(token, [\n    { label: 'extend', kind: CompletionItemKind.Function },\n    ...typeSystemCompletionItems,\n  ]);\n}\n\nfunction getSuggestionsForExecutableDefinitions(\n  token: ContextToken,\n): CompletionItem[] {\n  return hintList(token, executableCompletionItems);\n}\n\nfunction getSuggestionsForUnknownDocumentMode(\n  token: ContextToken,\n): CompletionItem[] {\n  return hintList(token, [\n    { label: 'extend', kind: CompletionItemKind.Function },\n    ...executableCompletionItems,\n    ...typeSystemCompletionItems,\n  ]);\n}\n\nfunction getSuggestionsForExtensionDefinitions(\n  token: ContextToken,\n): CompletionItem[] {\n  return hintList(token, typeSystemCompletionItems);\n}\n\nfunction getSuggestionsForFieldNames(\n  token: ContextToken,\n  typeInfo: AllTypeInfo,\n  options?: InternalAutocompleteOptions,\n): CompletionItem[] {\n  if (typeInfo.parentType) {\n    const { parentType } = typeInfo;\n    // const { parentType, fieldDef, argDefs } = typeInfo;\n    let fields: GraphQLField<null, null>[] = [];\n    if ('getFields' in parentType) {\n      fields = objectValues<GraphQLField<null, null>>(\n        // TODO: getFields returns `GraphQLFieldMap<any, any> | GraphQLInputFieldMap`\n        parentType.getFields() as GraphQLFieldMap<any, any>,\n      );\n    }\n\n    if (isCompositeType(parentType)) {\n      fields.push(TypeNameMetaFieldDef);\n    }\n    if (parentType === options?.schema?.getQueryType()) {\n      fields.push(SchemaMetaFieldDef, TypeMetaFieldDef);\n    }\n\n    return hintList(\n      token,\n      fields.map<CompletionItem>((field, index) => {\n        const suggestion: CompletionItem = {\n          // This will sort the fields in the same order they are listed in the schema\n          sortText: String(index) + field.name,\n          label: field.name,\n          detail: String(field.type),\n\n          documentation: field.description ?? undefined,\n          deprecated: Boolean(field.deprecationReason),\n          isDeprecated: Boolean(field.deprecationReason),\n          deprecationReason: field.deprecationReason,\n          kind: CompletionItemKind.Field,\n          labelDetails: {\n            detail: ' ' + field.type.toString(),\n          },\n\n          type: field.type,\n        };\n        if (options?.fillLeafsOnComplete) {\n          // const hasArgs =\n          //   // token.state.needsAdvance &&\n          //   // @ts-expect-error\n          //   parentType?._fields[field?.name];\n\n          suggestion.insertText = getFieldInsertText(field);\n\n          // eslint-disable-next-line logical-assignment-operators\n          if (!suggestion.insertText) {\n            suggestion.insertText = getInsertText(\n              field.name,\n              field.type,\n              // if we are replacing a field with arguments, we don't want the extra line\n              field.name + (token.state.needsAdvance ? '' : '\\n'),\n            );\n          }\n\n          if (suggestion.insertText) {\n            suggestion.insertTextFormat = InsertTextFormat.Snippet;\n            suggestion.insertTextMode = InsertTextMode.adjustIndentation;\n            suggestion.command = SuggestionCommand;\n          }\n        }\n\n        return suggestion;\n      }),\n    );\n  }\n  return [];\n}\n\nfunction getSuggestionsForInputValues(\n  token: ContextToken,\n  typeInfo: AllTypeInfo,\n  queryText: string,\n  schema: GraphQLSchema,\n): Array<CompletionItem> {\n  const namedInputType = getNamedType(typeInfo.inputType!);\n\n  const queryVariables: CompletionItem[] = getVariableCompletions(\n    queryText,\n    schema,\n    token,\n  ).filter(v => v.detail === namedInputType?.name);\n\n  if (namedInputType instanceof GraphQLEnumType) {\n    const values = namedInputType.getValues();\n    return hintList(\n      token,\n      values\n        .map<CompletionItem>((value: GraphQLEnumValue) => ({\n          label: value.name,\n          detail: String(namedInputType),\n          documentation: value.description ?? undefined,\n          deprecated: Boolean(value.deprecationReason),\n          isDeprecated: Boolean(value.deprecationReason),\n          deprecationReason: value.deprecationReason,\n          kind: CompletionItemKind.EnumMember,\n          type: namedInputType,\n        }))\n        .concat(queryVariables),\n    );\n  }\n  if (namedInputType === GraphQLBoolean) {\n    return hintList(\n      token,\n      queryVariables.concat([\n        {\n          label: 'true',\n          detail: String(GraphQLBoolean),\n          documentation: 'Not false.',\n          kind: CompletionItemKind.Variable,\n          type: GraphQLBoolean,\n        },\n        {\n          label: 'false',\n          detail: String(GraphQLBoolean),\n          documentation: 'Not true.',\n          kind: CompletionItemKind.Variable,\n          type: GraphQLBoolean,\n        },\n      ]),\n    );\n  }\n\n  return queryVariables;\n}\n\nfunction getSuggestionsForImplements(\n  token: ContextToken,\n  tokenState: State,\n  schema: GraphQLSchema,\n  documentText: string,\n  typeInfo: AllTypeInfo,\n): Array<CompletionItem> {\n  // exit empty if we need an &\n  if (tokenState.needsSeparator) {\n    return [];\n  }\n  const typeMap = schema.getTypeMap();\n\n  const schemaInterfaces = objectValues(typeMap).filter(isInterfaceType);\n  const schemaInterfaceNames = schemaInterfaces.map(({ name }) => name);\n  const inlineInterfaces: Set<string> = new Set();\n  runOnlineParser(documentText, (_, state: State) => {\n    if (state.name) {\n      // gather inline interface definitions\n      if (\n        state.kind === RuleKinds.INTERFACE_DEF &&\n        !schemaInterfaceNames.includes(state.name)\n      ) {\n        inlineInterfaces.add(state.name);\n      }\n      // gather the other interfaces the current type/interface definition implements\n      // so we can filter them out below\n      if (\n        state.kind === RuleKinds.NAMED_TYPE &&\n        state.prevState?.kind === RuleKinds.IMPLEMENTS\n      ) {\n        if (typeInfo.interfaceDef) {\n          const existingType = typeInfo.interfaceDef\n            ?.getInterfaces()\n            .find(({ name }) => name === state.name);\n          if (existingType) {\n            return;\n          }\n          const type = schema.getType(state.name);\n          const interfaceConfig = typeInfo.interfaceDef?.toConfig();\n          typeInfo.interfaceDef = new GraphQLInterfaceType({\n            ...interfaceConfig,\n            interfaces: [\n              ...interfaceConfig.interfaces,\n              (type as GraphQLInterfaceType) ||\n                new GraphQLInterfaceType({ name: state.name, fields: {} }),\n            ],\n          });\n        } else if (typeInfo.objectTypeDef) {\n          const existingType = typeInfo.objectTypeDef\n            ?.getInterfaces()\n            .find(({ name }) => name === state.name);\n          if (existingType) {\n            return;\n          }\n          const type = schema.getType(state.name);\n          const objectTypeConfig = typeInfo.objectTypeDef?.toConfig();\n          typeInfo.objectTypeDef = new GraphQLObjectType({\n            ...objectTypeConfig,\n            interfaces: [\n              ...objectTypeConfig.interfaces,\n              (type as GraphQLInterfaceType) ||\n                new GraphQLInterfaceType({ name: state.name, fields: {} }),\n            ],\n          });\n        }\n      }\n    }\n  });\n\n  const currentTypeToExtend = typeInfo.interfaceDef || typeInfo.objectTypeDef;\n\n  const siblingInterfaces = currentTypeToExtend?.getInterfaces() || [];\n  const siblingInterfaceNames = siblingInterfaces.map(({ name }) => name);\n\n  // TODO: we should be using schema.getPossibleTypes() here, but\n  const possibleInterfaces = schemaInterfaces\n    .concat(\n      [...inlineInterfaces].map(name => ({ name }) as GraphQLInterfaceType),\n    )\n    .filter(\n      ({ name }) =>\n        name !== currentTypeToExtend?.name &&\n        !siblingInterfaceNames.includes(name),\n    );\n\n  return hintList(\n    token,\n    possibleInterfaces.map(type => {\n      const result = {\n        label: type.name,\n        kind: CompletionItemKind.Interface,\n        type,\n      } as CompletionItem;\n      if (type?.description) {\n        result.documentation = type.description;\n      }\n      // TODO: should we report what an interface implements in CompletionItem.detail?\n      // result.detail = 'Interface'\n      // const interfaces = type.astNode?.interfaces;\n      // if (interfaces && interfaces.length > 0) {\n      //   result.detail += ` (implements ${interfaces\n      //     .map(i => i.name.value)\n      //     .join(' & ')})`;\n      // }\n\n      return result;\n    }),\n  );\n}\n\nfunction getSuggestionsForFragmentTypeConditions(\n  token: ContextToken,\n  typeInfo: AllTypeInfo,\n  schema: GraphQLSchema,\n  _kind: 'NamedType' | 'TypeCondition',\n): Array<CompletionItem> {\n  let possibleTypes: GraphQLType[];\n  if (typeInfo.parentType) {\n    if (isAbstractType(typeInfo.parentType)) {\n      const abstractType = assertAbstractType(typeInfo.parentType);\n      // Collect both the possible Object types as well as the interfaces\n      // they implement.\n      const possibleObjTypes = schema.getPossibleTypes(abstractType);\n      const possibleIfaceMap = Object.create(null);\n      for (const type of possibleObjTypes) {\n        for (const iface of type.getInterfaces()) {\n          possibleIfaceMap[iface.name] = iface;\n        }\n      }\n      possibleTypes = possibleObjTypes.concat(objectValues(possibleIfaceMap));\n    } else {\n      // The parent type is a non-abstract Object type, so the only possible\n      // type that can be used is that same type.\n      possibleTypes = [typeInfo.parentType];\n    }\n  } else {\n    const typeMap = schema.getTypeMap();\n    possibleTypes = objectValues(typeMap).filter(\n      type => isCompositeType(type) && !type.name.startsWith('__'),\n    );\n  }\n  return hintList(\n    token,\n    possibleTypes.map(type => {\n      const namedType = getNamedType(type);\n      return {\n        label: String(type),\n        documentation: (namedType?.description as string | undefined) || '',\n        kind: CompletionItemKind.Field,\n      };\n    }),\n  );\n}\n\nfunction getSuggestionsForFragmentSpread(\n  token: ContextToken,\n  typeInfo: AllTypeInfo,\n  schema: GraphQLSchema,\n  queryText: string,\n  fragmentDefs?: FragmentDefinitionNode[],\n): Array<CompletionItem> {\n  if (!queryText) {\n    return [];\n  }\n  const typeMap = schema.getTypeMap();\n  const defState = getDefinitionState(token.state);\n  const fragments = getFragmentDefinitions(queryText);\n\n  if (fragmentDefs && fragmentDefs.length > 0) {\n    fragments.push(...fragmentDefs);\n  }\n\n  // Filter down to only the fragments which may exist here.\n  const relevantFrags = fragments.filter(\n    frag =>\n      // Only include fragments with known types.\n      typeMap[frag.typeCondition.name.value] &&\n      // Only include fragments which are not cyclic.\n      !(\n        defState &&\n        defState.kind === RuleKinds.FRAGMENT_DEFINITION &&\n        defState.name === frag.name.value\n      ) &&\n      // Only include fragments which could possibly be spread here.\n      isCompositeType(typeInfo.parentType) &&\n      isCompositeType(typeMap[frag.typeCondition.name.value]) &&\n      doTypesOverlap(\n        schema,\n        typeInfo.parentType,\n        typeMap[frag.typeCondition.name.value] as GraphQLCompositeType,\n      ),\n  );\n\n  return hintList(\n    token,\n    relevantFrags.map(frag => ({\n      label: frag.name.value,\n      detail: String(typeMap[frag.typeCondition.name.value]),\n      documentation: `fragment ${frag.name.value} on ${frag.typeCondition.name.value}`,\n      labelDetails: {\n        detail: `fragment ${frag.name.value} on ${frag.typeCondition.name.value}`,\n      },\n      kind: CompletionItemKind.Field,\n      type: typeMap[frag.typeCondition.name.value],\n    })),\n  );\n}\n\n// TODO: should be using getTypeInfo() for this if we can\nconst getParentDefinition = (state: State, kind: RuleKind) => {\n  if (state.prevState?.kind === kind) {\n    return state.prevState;\n  }\n  if (state.prevState?.prevState?.kind === kind) {\n    return state.prevState.prevState;\n  }\n  if (state.prevState?.prevState?.prevState?.kind === kind) {\n    return state.prevState.prevState.prevState;\n  }\n  if (state.prevState?.prevState?.prevState?.prevState?.kind === kind) {\n    return state.prevState.prevState.prevState.prevState;\n  }\n};\n\nexport function getVariableCompletions(\n  queryText: string,\n  schema: GraphQLSchema,\n  token: ContextToken,\n): CompletionItem[] {\n  let variableName: null | string = null;\n  let variableType: GraphQLInputObjectType | undefined | null;\n  const definitions: Record<string, any> = Object.create({});\n\n  runOnlineParser(queryText, (_, state: State) => {\n    // TODO: gather this as part of `AllTypeInfo`, as I don't think it's optimal to re-run the parser like this\n    if (state?.kind === RuleKinds.VARIABLE && state.name) {\n      variableName = state.name;\n    }\n    if (state?.kind === RuleKinds.NAMED_TYPE && variableName) {\n      const parentDefinition = getParentDefinition(state, RuleKinds.TYPE);\n      if (parentDefinition?.type) {\n        variableType = schema.getType(\n          parentDefinition?.type,\n        ) as GraphQLInputObjectType;\n      }\n    }\n\n    if (variableName && variableType && !definitions[variableName]) {\n      // append `$` if the `token.string` is not already `$`, or describing a variable\n      // this appears to take care of it everywhere\n      const replaceString =\n        token.string === '$' || token?.state?.kind === 'Variable'\n          ? variableName\n          : '$' + variableName;\n      definitions[variableName] = {\n        detail: variableType.toString(),\n        insertText: replaceString,\n        label: '$' + variableName,\n        rawInsert: replaceString,\n        type: variableType,\n        kind: CompletionItemKind.Variable,\n      } as CompletionItem;\n\n      variableName = null;\n      variableType = null;\n    }\n  });\n\n  return objectValues(definitions);\n}\n\nexport function getFragmentDefinitions(\n  queryText: string,\n): Array<FragmentDefinitionNode> {\n  const fragmentDefs: FragmentDefinitionNode[] = [];\n  runOnlineParser(queryText, (_, state: State) => {\n    if (\n      state.kind === RuleKinds.FRAGMENT_DEFINITION &&\n      state.name &&\n      state.type\n    ) {\n      fragmentDefs.push({\n        kind: RuleKinds.FRAGMENT_DEFINITION,\n        name: {\n          kind: Kind.NAME,\n          value: state.name,\n        },\n\n        selectionSet: {\n          kind: RuleKinds.SELECTION_SET,\n          selections: [],\n        },\n\n        typeCondition: {\n          kind: RuleKinds.NAMED_TYPE,\n          name: {\n            kind: Kind.NAME,\n            value: state.type,\n          },\n        },\n      });\n    }\n  });\n\n  return fragmentDefs;\n}\n\nfunction getSuggestionsForVariableDefinition(\n  token: ContextToken,\n  schema: GraphQLSchema,\n  _kind: string,\n): Array<CompletionItem> {\n  const inputTypeMap = schema.getTypeMap();\n  const inputTypes = objectValues(inputTypeMap).filter(isInputType);\n  return hintList(\n    token,\n    // TODO: couldn't get Exclude<> working here\n    inputTypes.map((type: GraphQLNamedType) => ({\n      label: type.name,\n      documentation: type?.description || '',\n      kind: CompletionItemKind.Variable,\n    })),\n  );\n}\n\nfunction getSuggestionsForDirective(\n  token: ContextToken,\n  state: State,\n  schema: GraphQLSchema,\n  _kind: string,\n): Array<CompletionItem> {\n  if (state.prevState?.kind) {\n    const directives = schema\n      .getDirectives()\n      .filter(directive => canUseDirective(state.prevState, directive));\n    return hintList(\n      token,\n      directives.map(directive => ({\n        label: directive.name,\n        documentation: directive?.description || '',\n        kind: CompletionItemKind.Function,\n      })),\n    );\n  }\n  return [];\n}\n\n// I thought this added functionality somewhere, but I couldn't write any tests\n// to execute it. I think it's handled as Arguments\nfunction getSuggestionsForDirectiveArguments(\n  token: ContextToken,\n  state: State,\n  schema: GraphQLSchema,\n  _kind: string,\n): Array<CompletionItem> {\n  const directive = schema.getDirectives().find(d => d.name === state.name);\n  return hintList(\n    token,\n    directive?.args.map(arg => ({\n      label: arg.name,\n      documentation: arg.description || '',\n      kind: CompletionItemKind.Field,\n    })) || [],\n  );\n}\n\nexport function canUseDirective(\n  state: State['prevState'],\n  directive: GraphQLDirective,\n): boolean {\n  if (!state?.kind) {\n    return false;\n  }\n  const { kind, prevState } = state;\n  const { locations } = directive;\n  switch (kind) {\n    case RuleKinds.QUERY:\n      return locations.includes(DirectiveLocation.QUERY);\n    case RuleKinds.MUTATION:\n      return locations.includes(DirectiveLocation.MUTATION);\n    case RuleKinds.SUBSCRIPTION:\n      return locations.includes(DirectiveLocation.SUBSCRIPTION);\n    case RuleKinds.FIELD:\n    case RuleKinds.ALIASED_FIELD:\n      return locations.includes(DirectiveLocation.FIELD);\n    case RuleKinds.FRAGMENT_DEFINITION:\n      return locations.includes(DirectiveLocation.FRAGMENT_DEFINITION);\n    case RuleKinds.FRAGMENT_SPREAD:\n      return locations.includes(DirectiveLocation.FRAGMENT_SPREAD);\n    case RuleKinds.INLINE_FRAGMENT:\n      return locations.includes(DirectiveLocation.INLINE_FRAGMENT);\n\n    // Schema Definitions\n    case RuleKinds.SCHEMA_DEF:\n      return locations.includes(DirectiveLocation.SCHEMA);\n    case RuleKinds.SCALAR_DEF:\n      return locations.includes(DirectiveLocation.SCALAR);\n    case RuleKinds.OBJECT_TYPE_DEF:\n      return locations.includes(DirectiveLocation.OBJECT);\n    case RuleKinds.FIELD_DEF:\n      return locations.includes(DirectiveLocation.FIELD_DEFINITION);\n    case RuleKinds.INTERFACE_DEF:\n      return locations.includes(DirectiveLocation.INTERFACE);\n    case RuleKinds.UNION_DEF:\n      return locations.includes(DirectiveLocation.UNION);\n    case RuleKinds.ENUM_DEF:\n      return locations.includes(DirectiveLocation.ENUM);\n    case RuleKinds.ENUM_VALUE:\n      return locations.includes(DirectiveLocation.ENUM_VALUE);\n    case RuleKinds.INPUT_DEF:\n      return locations.includes(DirectiveLocation.INPUT_OBJECT);\n    case RuleKinds.INPUT_VALUE_DEF:\n      const prevStateKind = prevState?.kind;\n      switch (prevStateKind) {\n        case RuleKinds.ARGUMENTS_DEF:\n          return locations.includes(DirectiveLocation.ARGUMENT_DEFINITION);\n        case RuleKinds.INPUT_DEF:\n          return locations.includes(DirectiveLocation.INPUT_FIELD_DEFINITION);\n      }\n  }\n\n  return false;\n}\n\nfunction unwrapType(state: State): State {\n  if (\n    state.prevState &&\n    state.kind &&\n    (\n      [\n        RuleKinds.NAMED_TYPE,\n        RuleKinds.LIST_TYPE,\n        RuleKinds.TYPE,\n        RuleKinds.NON_NULL_TYPE,\n      ] as RuleKind[]\n    ).includes(state.kind)\n  ) {\n    return unwrapType(state.prevState);\n  }\n  return state;\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/getDefinition.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  ASTNode,\n  FragmentSpreadNode,\n  FragmentDefinitionNode,\n  OperationDefinitionNode,\n  NamedTypeNode,\n  TypeDefinitionNode,\n  ObjectTypeDefinitionNode,\n  FieldDefinitionNode,\n  // printType,\n  // isNamedType,\n  // ArgumentNode,\n  InputValueDefinitionNode,\n  GraphQLType,\n} from 'graphql';\n\nimport { Definition, FragmentInfo, Uri, ObjectTypeInfo } from '../types';\n\nimport { locToRange, offsetToPosition, Range, Position } from '../utils';\n// import { getTypeInfo } from './getAutocompleteSuggestions';\n\nexport type DefinitionQueryResult = {\n  queryRange: Range[];\n  definitions: Definition[];\n  printedName?: string;\n};\n\nexport type DefinitionQueryResponse = DefinitionQueryResult & {\n  node?: ASTNode | null;\n  type?: GraphQLType | null;\n};\n\nexport const LANGUAGE = 'GraphQL';\n\nfunction assert(value: any, message: string) {\n  if (!value) {\n    throw new Error(message);\n  }\n}\n\nfunction getRange(text: string, node: ASTNode): Range {\n  const location = node.loc!;\n  assert(location, 'Expected ASTNode to have a location.');\n  return locToRange(text, location);\n}\n\nfunction getPosition(text: string, node: ASTNode): Position {\n  const location = node.loc!;\n  assert(location, 'Expected ASTNode to have a location.');\n  return offsetToPosition(text, location.start);\n}\n\nexport async function getDefinitionQueryResultForNamedType(\n  text: string,\n  node: NamedTypeNode,\n  dependencies: Array<ObjectTypeInfo>,\n): Promise<DefinitionQueryResult> {\n  const name = node.name.value;\n  const defNodes = dependencies.filter(\n    ({ definition }) => definition.name && definition.name.value === name,\n  );\n\n  if (defNodes.length === 0) {\n    throw new Error(`Definition not found for GraphQL type ${name}`);\n  }\n  const definitions: Array<Definition> = defNodes.map(\n    ({ filePath, content, definition }) =>\n      getDefinitionForNodeDefinition(filePath || '', content, definition),\n  );\n\n  return {\n    definitions,\n    queryRange: definitions.map(_ => getRange(text, node)),\n    printedName: name,\n  };\n}\n\nexport async function getDefinitionQueryResultForField(\n  fieldName: string,\n  typeName: string,\n  dependencies: Array<ObjectTypeInfo>,\n): Promise<DefinitionQueryResult> {\n  const defNodes = dependencies.filter(\n    ({ definition }) => definition.name && definition.name.value === typeName,\n  );\n\n  if (defNodes.length === 0) {\n    throw new Error(`Definition not found for GraphQL type ${typeName}`);\n  }\n\n  const definitions: Array<Definition> = [];\n\n  for (const { filePath, content, definition } of defNodes) {\n    const fieldDefinition = (\n      definition as ObjectTypeDefinitionNode\n    ).fields?.find(item => item.name.value === fieldName);\n\n    if (fieldDefinition == null) {\n      continue;\n    }\n\n    definitions.push(\n      getDefinitionForFieldDefinition(filePath || '', content, fieldDefinition),\n    );\n  }\n\n  return {\n    definitions,\n    // TODO: seems like it's not using\n    queryRange: [],\n    printedName: [typeName, fieldName].join('.'),\n  };\n}\n\nexport async function getDefinitionQueryResultForArgument(\n  argumentName: string,\n  fieldName: string,\n  typeName: string,\n  dependencies: Array<ObjectTypeInfo>,\n): Promise<DefinitionQueryResult> {\n  const definitions: Array<Definition> = [];\n\n  for (const { filePath, content, definition } of dependencies) {\n    const argDefinition = (definition as ObjectTypeDefinitionNode).fields\n      ?.find(item => item.name.value === fieldName)\n      ?.arguments?.find(item => item.name.value === argumentName);\n    if (argDefinition == null) {\n      continue;\n    }\n\n    definitions.push(\n      getDefinitionForArgumentDefinition(\n        filePath || '',\n        content,\n        argDefinition,\n      ),\n    );\n  }\n  return {\n    definitions,\n    // TODO: seems like it's not using\n    queryRange: [],\n    printedName: `${[typeName, fieldName].join('.')}(${argumentName})`,\n  };\n}\n\nexport async function getDefinitionQueryResultForFragmentSpread(\n  text: string,\n  fragment: FragmentSpreadNode,\n  dependencies: Array<FragmentInfo>,\n): Promise<DefinitionQueryResult> {\n  const name = fragment.name.value;\n  const defNodes = dependencies.filter(\n    ({ definition }) => definition.name.value === name,\n  );\n\n  if (defNodes.length === 0) {\n    throw new Error(`Definition not found for GraphQL fragment ${name}`);\n  }\n  const definitions: Array<Definition> = defNodes.map(\n    ({ filePath, content, definition }) =>\n      getDefinitionForFragmentDefinition(filePath || '', content, definition),\n  );\n  return {\n    definitions,\n    queryRange: definitions.map(_ => getRange(text, fragment)),\n    printedName: name,\n  };\n}\n\nexport function getDefinitionQueryResultForDefinitionNode(\n  path: Uri,\n  text: string,\n  definition: FragmentDefinitionNode | OperationDefinitionNode,\n): DefinitionQueryResult {\n  return {\n    definitions: [getDefinitionForFragmentDefinition(path, text, definition)],\n    queryRange: definition.name ? [getRange(text, definition.name)] : [],\n    printedName: definition.name?.value,\n  };\n}\n\nfunction getDefinitionForFragmentDefinition(\n  path: Uri,\n  text: string,\n  definition: FragmentDefinitionNode | OperationDefinitionNode,\n): Definition {\n  const { name } = definition;\n  if (!name) {\n    throw new Error('Expected ASTNode to have a Name.');\n  }\n\n  return {\n    path,\n    position: getPosition(text, definition),\n    range: getRange(text, definition),\n    // TODO: doesn't seem to pick up the inference\n    // from assert() exception logic\n    name: name.value || '',\n    language: LANGUAGE,\n    // This is a file inside the project root, good enough for now\n    projectRoot: path,\n  };\n}\n\nfunction getDefinitionForNodeDefinition(\n  path: Uri,\n  text: string,\n  definition: TypeDefinitionNode,\n): Definition {\n  const { name } = definition;\n  assert(name, 'Expected ASTNode to have a Name.');\n  return {\n    path,\n    position: getPosition(text, definition),\n    range: getRange(text, definition),\n    name: name.value || '',\n    language: LANGUAGE,\n    // This is a file inside the project root, good enough for now\n    projectRoot: path,\n  };\n}\n\n// eslint-disable-next-line sonarjs/no-identical-functions\nfunction getDefinitionForFieldDefinition(\n  path: Uri,\n  text: string,\n  definition: FieldDefinitionNode,\n): Definition {\n  const { name } = definition;\n  assert(name, 'Expected ASTNode to have a Name.');\n  return {\n    path,\n    position: getPosition(text, definition),\n    range: getRange(text, definition),\n    name: name.value || '',\n    language: LANGUAGE,\n    // This is a file inside the project root, good enough for now\n    projectRoot: path,\n  };\n}\n// GraphQLString,\n// eslint-disable-next-line sonarjs/no-identical-functions\nfunction getDefinitionForArgumentDefinition(\n  path: Uri,\n  text: string,\n  definition: InputValueDefinitionNode,\n): Definition {\n  const { name } = definition;\n  assert(name, 'Expected ASTNode to have a Name.');\n  return {\n    path,\n    position: getPosition(text, definition),\n    range: getRange(text, definition),\n    name: name.value || '',\n    language: LANGUAGE,\n    // This is a file inside the project root, good enough for now\n    projectRoot: path,\n  };\n}\n// GraphQLString,\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/getDiagnostics.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  ASTNode,\n  DocumentNode,\n  FragmentDefinitionNode,\n  GraphQLError,\n  GraphQLSchema,\n  Location,\n  SourceLocation,\n  ValidationRule,\n  print,\n  validate,\n  NoDeprecatedCustomRule,\n  parse,\n} from 'graphql';\n\nimport { CharacterStream, onlineParser } from '../parser';\n\nimport { Range, validateWithCustomRules, Position } from '../utils';\n\nimport { DiagnosticSeverity, Diagnostic } from 'vscode-languageserver-types';\n\nimport { IRange } from '../types';\n\n// this doesn't work without the 'as', kinda goofy\n\nexport const SEVERITY = {\n  Error: 'Error',\n  Warning: 'Warning',\n  Information: 'Information',\n  Hint: 'Hint',\n} as const;\n\nexport type Severity = typeof SEVERITY;\n\nexport type SeverityEnum = keyof Severity;\n\nexport const DIAGNOSTIC_SEVERITY = {\n  [SEVERITY.Error]: 1 as DiagnosticSeverity,\n  [SEVERITY.Warning]: 2 as DiagnosticSeverity,\n  [SEVERITY.Information]: 3 as DiagnosticSeverity,\n  [SEVERITY.Hint]: 4 as DiagnosticSeverity,\n};\n\nconst invariant = (condition: any, message: string) => {\n  if (!condition) {\n    throw new Error(message);\n  }\n};\n\nexport function getDiagnostics(\n  query: string,\n  schema: GraphQLSchema | null | undefined = null,\n  customRules?: Array<ValidationRule>,\n  isRelayCompatMode?: boolean,\n  externalFragments?: FragmentDefinitionNode[] | string,\n): Array<Diagnostic> {\n  let ast = null;\n  let fragments = '';\n  if (externalFragments) {\n    fragments =\n      typeof externalFragments === 'string'\n        ? externalFragments\n        : externalFragments.reduce(\n            (acc, node) => acc + print(node) + '\\n\\n',\n            '',\n          );\n  }\n  const enhancedQuery = fragments ? `${query}\\n\\n${fragments}` : query;\n  try {\n    ast = parse(enhancedQuery);\n  } catch (error) {\n    if (error instanceof GraphQLError) {\n      const range = getRange(\n        error.locations?.[0] ?? { line: 0, column: 0 },\n        enhancedQuery,\n      );\n\n      return [\n        {\n          severity: DIAGNOSTIC_SEVERITY.Error,\n          message: error.message,\n          source: 'GraphQL: Syntax',\n          range,\n        },\n      ];\n    }\n    throw error;\n  }\n\n  return validateQuery(ast, schema, customRules, isRelayCompatMode);\n}\n\nexport function validateQuery(\n  ast: DocumentNode,\n  schema: GraphQLSchema | null | undefined = null,\n  customRules?: Array<ValidationRule> | null,\n  isRelayCompatMode?: boolean,\n): Array<Diagnostic> {\n  // We cannot validate the query unless a schema is provided.\n  if (!schema) {\n    return [];\n  }\n\n  const validationErrorAnnotations = validateWithCustomRules(\n    schema,\n    ast,\n    customRules,\n    isRelayCompatMode,\n  ).flatMap(error =>\n    annotations(error, DIAGNOSTIC_SEVERITY.Error, 'Validation'),\n  );\n\n  // TODO: detect if > graphql@15.2.0, and use the new rule for this.\n  const deprecationWarningAnnotations = validate(schema, ast, [\n    NoDeprecatedCustomRule,\n  ]).flatMap(error =>\n    annotations(error, DIAGNOSTIC_SEVERITY.Warning, 'Deprecation'),\n  );\n  return validationErrorAnnotations.concat(deprecationWarningAnnotations);\n}\n\nfunction annotations(\n  error: GraphQLError,\n  severity: DiagnosticSeverity,\n  type: string,\n): Diagnostic[] {\n  if (!error.nodes) {\n    return [];\n  }\n  const highlightedNodes: Diagnostic[] = [];\n  for (const [i, node] of error.nodes.entries()) {\n    const highlightNode =\n      node.kind !== 'Variable' && 'name' in node && node.name !== undefined\n        ? node.name\n        : 'variable' in node && node.variable !== undefined\n          ? node.variable\n          : node;\n    if (highlightNode) {\n      invariant(\n        error.locations,\n        'GraphQL validation error requires locations.',\n      );\n\n      // @ts-ignore\n      // https://github.com/microsoft/TypeScript/pull/32695\n      const loc = error.locations[i];\n      const highlightLoc = getLocation(highlightNode);\n      const end = loc.column + (highlightLoc.end - highlightLoc.start);\n      highlightedNodes.push({\n        source: `GraphQL: ${type}`,\n        message: error.message,\n        severity,\n        range: new Range(\n          new Position(loc.line - 1, loc.column - 1),\n          new Position(loc.line - 1, end),\n        ),\n      });\n    }\n  }\n  return highlightedNodes;\n}\n\nexport function getRange(location: SourceLocation, queryText: string): IRange {\n  const parser = onlineParser();\n  const state = parser.startState();\n  const lines = queryText.split('\\n');\n\n  invariant(\n    lines.length >= location.line,\n    'Query text must have more lines than where the error happened',\n  );\n\n  let stream = null;\n\n  for (let i = 0; i < location.line; i++) {\n    stream = new CharacterStream(lines[i]);\n    while (!stream.eol()) {\n      const style = parser.token(stream, state);\n      if (style === 'invalidchar') {\n        break;\n      }\n    }\n  }\n\n  invariant(stream, 'Expected Parser stream to be available.');\n  const line = location.line - 1;\n  // @ts-expect-error -- https://github.com/microsoft/TypeScript/pull/32695\n  const start = stream.getStartOfToken();\n  // @ts-expect-error -- https://github.com/microsoft/TypeScript/pull/32695\n  const end = stream.getCurrentPosition();\n  return new Range(new Position(line, start), new Position(line, end));\n}\n\n/**\n * Get location info from a node in a type-safe way.\n *\n * The only way a node could not have a location is if we initialized the parser\n * (and therefore the lexer) with the `noLocation` option, but we always\n * call `parse` without options above.\n */\nfunction getLocation(node: any): Location {\n  const typeCastedNode = node as ASTNode;\n  const location = typeCastedNode.loc;\n  invariant(location, 'Expected ASTNode to have a location.');\n  // @ts-ignore\n  // https://github.com/microsoft/TypeScript/pull/32695\n  return location;\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/getHoverInformation.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Ported from codemirror-graphql\n * https://github.com/graphql/blob/main/packages/codemirror-graphql/src/info.js\n */\n\nimport {\n  GraphQLSchema,\n  GraphQLNonNull,\n  GraphQLList,\n  GraphQLType,\n  GraphQLField,\n  GraphQLFieldConfig,\n} from 'graphql';\nimport type { ContextToken } from '../parser';\nimport { AllTypeInfo, IPosition } from '../types';\n\nimport { Hover } from 'vscode-languageserver-types';\nimport { getContextAtPosition } from '../parser';\n\nexport type HoverConfig = { useMarkdown?: boolean };\n\nexport function getHoverInformation(\n  schema: GraphQLSchema,\n  queryText: string,\n  cursor: IPosition,\n  contextToken?: ContextToken,\n  config?: HoverConfig,\n): Hover['contents'] {\n  const options = { ...config, schema };\n  const context = getContextAtPosition(queryText, cursor, schema, contextToken);\n  if (!context) {\n    return '';\n  }\n  const { typeInfo, token } = context;\n  const { kind, step } = token.state;\n\n  // Given a Schema and a Token, produce the contents of an info tooltip.\n  // To do this, create a div element that we will render \"into\" and then pass\n  // it to various rendering functions.\n  if (\n    (kind === 'Field' && step === 0 && typeInfo.fieldDef) ||\n    (kind === 'AliasedField' && step === 2 && typeInfo.fieldDef) ||\n    (kind === 'ObjectField' && step === 0 && typeInfo.fieldDef)\n  ) {\n    const into: string[] = [];\n    renderMdCodeStart(into, options);\n    renderField(into, typeInfo, options);\n    renderMdCodeEnd(into, options);\n    renderDescription(into, options, typeInfo.fieldDef);\n    return into.join('').trim();\n  }\n  if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) {\n    const into: string[] = [];\n    renderMdCodeStart(into, options);\n    renderDirective(into, typeInfo, options);\n    renderMdCodeEnd(into, options);\n    renderDescription(into, options, typeInfo.directiveDef);\n    return into.join('').trim();\n  }\n  if (kind === 'Variable' && typeInfo.type) {\n    const into: string[] = [];\n    renderMdCodeStart(into, options);\n    renderType(into, typeInfo, options, typeInfo.type);\n    renderMdCodeEnd(into, options);\n    renderDescription(into, options, typeInfo.type);\n    return into.join('').trim();\n  }\n  if (kind === 'Argument' && step === 0 && typeInfo.argDef) {\n    const into: string[] = [];\n    renderMdCodeStart(into, options);\n    renderArg(into, typeInfo, options);\n    renderMdCodeEnd(into, options);\n    renderDescription(into, options, typeInfo.argDef);\n    return into.join('').trim();\n  }\n  if (\n    kind === 'EnumValue' &&\n    typeInfo.enumValue &&\n    'description' in typeInfo.enumValue\n  ) {\n    const into: string[] = [];\n    renderMdCodeStart(into, options);\n    renderEnumValue(into, typeInfo, options);\n    renderMdCodeEnd(into, options);\n    renderDescription(into, options, typeInfo.enumValue);\n    return into.join('').trim();\n  }\n  if (kind === 'NamedType' && typeInfo.type && 'description' in typeInfo.type) {\n    const into: string[] = [];\n    renderMdCodeStart(into, options);\n    renderType(into, typeInfo, options, typeInfo.type);\n    renderMdCodeEnd(into, options);\n    renderDescription(into, options, typeInfo.type);\n    return into.join('').trim();\n  }\n  return '';\n}\n\nfunction renderMdCodeStart(into: string[], options: HoverConfig) {\n  if (options.useMarkdown) {\n    text(into, '```graphql\\n');\n  }\n}\nfunction renderMdCodeEnd(into: string[], options: any) {\n  if (options.useMarkdown) {\n    text(into, '\\n```');\n  }\n}\n\nexport function renderField(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  options: HoverConfig,\n) {\n  renderQualifiedField(into, typeInfo, options);\n  renderTypeAnnotation(into, typeInfo, options, typeInfo.type!);\n}\n\nfunction renderQualifiedField(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  options: HoverConfig,\n) {\n  if (!typeInfo.fieldDef) {\n    return;\n  }\n  const fieldName = typeInfo.fieldDef.name;\n  if (fieldName.slice(0, 2) !== '__') {\n    renderType(into, typeInfo, options, typeInfo.parentType!);\n    text(into, '.');\n  }\n  text(into, fieldName);\n}\n\nexport function renderDirective(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  _options: HoverConfig,\n) {\n  if (!typeInfo.directiveDef) {\n    return;\n  }\n  const name = '@' + typeInfo.directiveDef.name;\n  text(into, name);\n}\n\nexport function renderArg(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  options: HoverConfig,\n) {\n  if (typeInfo.directiveDef) {\n    renderDirective(into, typeInfo, options);\n  } else if (typeInfo.fieldDef) {\n    renderQualifiedField(into, typeInfo, options);\n  }\n\n  if (!typeInfo.argDef) {\n    return;\n  }\n\n  const { name } = typeInfo.argDef;\n  text(into, '(');\n  text(into, name);\n  renderTypeAnnotation(into, typeInfo, options, typeInfo.inputType!);\n  text(into, ')');\n}\n\nfunction renderTypeAnnotation(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  options: HoverConfig,\n  t: GraphQLType,\n) {\n  text(into, ': ');\n  renderType(into, typeInfo, options, t);\n}\n\nexport function renderEnumValue(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  options: HoverConfig,\n) {\n  if (!typeInfo.enumValue) {\n    return;\n  }\n  const { name } = typeInfo.enumValue;\n  renderType(into, typeInfo, options, typeInfo.inputType!);\n  text(into, '.');\n  text(into, name);\n}\n\nexport function renderType(\n  into: string[],\n  typeInfo: AllTypeInfo,\n  options: HoverConfig,\n  t: GraphQLType,\n) {\n  if (!t) {\n    return;\n  }\n\n  if (t instanceof GraphQLNonNull) {\n    renderType(into, typeInfo, options, t.ofType);\n    text(into, '!');\n  } else if (t instanceof GraphQLList) {\n    text(into, '[');\n    renderType(into, typeInfo, options, t.ofType);\n    text(into, ']');\n  } else {\n    text(into, t.name);\n  }\n}\n\nfunction renderDescription(\n  into: string[],\n  options: HoverConfig,\n  // TODO: Figure out the right type for this one\n  def: any,\n) {\n  if (!def) {\n    return;\n  }\n  const description =\n    typeof def.description === 'string' ? def.description : null;\n  if (description) {\n    text(into, '\\n\\n');\n    text(into, description);\n  }\n  renderDeprecation(into, options, def);\n}\n\nfunction renderDeprecation(\n  into: string[],\n  _options: HoverConfig,\n  def: GraphQLField<unknown, unknown> | GraphQLFieldConfig<unknown, unknown>,\n) {\n  if (!def) {\n    return;\n  }\n\n  const reason = def.deprecationReason;\n  if (!reason) {\n    return;\n  }\n  text(into, '\\n\\n');\n  text(into, 'Deprecated: ');\n  text(into, reason);\n}\n\nfunction text(into: string[], content: string) {\n  into.push(content);\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/getOutline.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  Outline,\n  TextToken,\n  TokenKind,\n  IPosition,\n  OutlineTree,\n} from '../types';\n\nimport {\n  Kind,\n  parse,\n  visit,\n  FieldNode,\n  InlineFragmentNode,\n  DocumentNode,\n  FragmentSpreadNode,\n  OperationDefinitionNode,\n  NameNode,\n  FragmentDefinitionNode,\n  SelectionSetNode,\n  SelectionNode,\n  InterfaceTypeDefinitionNode,\n  ObjectTypeDefinitionNode,\n  EnumTypeDefinitionNode,\n  DefinitionNode,\n  InputValueDefinitionNode,\n  FieldDefinitionNode,\n  EnumValueDefinitionNode,\n} from 'graphql';\n\nimport { offsetToPosition } from '../utils';\n\nexport type OutlineableKinds =\n  | 'Field'\n  | 'OperationDefinition'\n  | 'Document'\n  | 'SelectionSet'\n  | 'Name'\n  | 'FragmentDefinition'\n  | 'FragmentSpread'\n  | 'InlineFragment'\n  | 'ObjectTypeDefinition'\n  | 'InputObjectTypeDefinition'\n  | 'InterfaceTypeDefinition'\n  | 'EnumTypeDefinition'\n  | 'EnumValueDefinition'\n  | 'InputValueDefinition'\n  | 'FieldDefinition';\n\ntype OutlineTreeResult =\n  | {\n      representativeName: string;\n      startPosition: IPosition;\n      endPosition: IPosition;\n      children: SelectionSetNode[] | [];\n      tokenizedText: TextToken[];\n    }\n  | string\n  | readonly DefinitionNode[]\n  | readonly SelectionNode[]\n  | FieldNode[]\n  | SelectionSetNode;\n\ntype OutlineTreeConverterType = Partial<{\n  [key in OutlineableKinds]: (node: any) => OutlineTreeResult;\n}>;\n\nexport function getOutline(documentText: string): Outline | null {\n  let ast;\n  try {\n    ast = parse(documentText);\n  } catch {\n    return null;\n  }\n\n  const visitorFns = outlineTreeConverter(documentText);\n  const outlineTrees = visit(ast, {\n    leave(node) {\n      if (visitorFns !== undefined && node.kind in visitorFns) {\n        // @ts-ignore\n        return visitorFns[node.kind](node);\n      }\n      return null;\n    },\n  }) as unknown as OutlineTree[];\n\n  return { outlineTrees };\n}\n\nfunction outlineTreeConverter(docText: string): OutlineTreeConverterType {\n  // TODO: couldn't find a type that would work for all cases here,\n  // however the inference is not broken by this at least\n  const meta = (node: any) => {\n    return {\n      representativeName: node.name,\n      startPosition: offsetToPosition(docText, node.loc.start),\n      endPosition: offsetToPosition(docText, node.loc.end),\n      kind: node.kind,\n      children:\n        node.selectionSet || node.fields || node.values || node.arguments || [],\n    };\n  };\n\n  return {\n    Field(node: FieldNode) {\n      const tokenizedText = node.alias\n        ? [buildToken('plain', node.alias), buildToken('plain', ': ')]\n        : [];\n      tokenizedText.push(buildToken('plain', node.name));\n      return { tokenizedText, ...meta(node) };\n    },\n    OperationDefinition: (node: OperationDefinitionNode) => ({\n      tokenizedText: [\n        buildToken('keyword', node.operation),\n        buildToken('whitespace', ' '),\n        buildToken('class-name', node.name as unknown as string),\n      ],\n      ...meta(node),\n    }),\n\n    Document: (node: DocumentNode) => node.definitions,\n    SelectionSet: (node: SelectionSetNode) =>\n      concatMap<SelectionNode>(node.selections, (child: SelectionNode) => {\n        return child.kind === Kind.INLINE_FRAGMENT ? child.selectionSet : child;\n      }),\n    Name: (node: NameNode) => node.value,\n    FragmentDefinition: (node: FragmentDefinitionNode) => ({\n      tokenizedText: [\n        buildToken('keyword', 'fragment'),\n        buildToken('whitespace', ' '),\n        buildToken('class-name', node.name),\n      ],\n      ...meta(node),\n    }),\n    InterfaceTypeDefinition: (node: InterfaceTypeDefinitionNode) => ({\n      tokenizedText: [\n        buildToken('keyword', 'interface'),\n        buildToken('whitespace', ' '),\n        buildToken('class-name', node.name),\n      ],\n      ...meta(node),\n    }),\n    EnumTypeDefinition: (node: EnumTypeDefinitionNode) => ({\n      tokenizedText: [\n        buildToken('keyword', 'enum'),\n        buildToken('whitespace', ' '),\n        buildToken('class-name', node.name),\n      ],\n      ...meta(node),\n    }),\n    EnumValueDefinition: (node: EnumValueDefinitionNode) => ({\n      tokenizedText: [buildToken('plain', node.name)],\n      ...meta(node),\n    }),\n    ObjectTypeDefinition: (node: ObjectTypeDefinitionNode) => ({\n      tokenizedText: [\n        buildToken('keyword', 'type'),\n        buildToken('whitespace', ' '),\n        buildToken('class-name', node.name),\n      ],\n      ...meta(node),\n    }),\n    InputObjectTypeDefinition: (node: ObjectTypeDefinitionNode) => ({\n      tokenizedText: [\n        buildToken('keyword', 'input'),\n        buildToken('whitespace', ' '),\n        buildToken('class-name', node.name),\n      ],\n      ...meta(node),\n    }),\n    FragmentSpread: (node: FragmentSpreadNode) => ({\n      tokenizedText: [\n        buildToken('plain', '...'),\n        buildToken('class-name', node.name),\n      ],\n      ...meta(node),\n    }),\n    InputValueDefinition(node: InputValueDefinitionNode) {\n      return {\n        tokenizedText: [buildToken('plain', node.name)],\n        ...meta(node),\n      };\n    },\n    FieldDefinition(node: FieldDefinitionNode) {\n      return {\n        tokenizedText: [buildToken('plain', node.name)],\n        ...meta(node),\n      };\n    },\n    InlineFragment: (node: InlineFragmentNode) => node.selectionSet,\n  };\n}\n\nfunction buildToken(kind: TokenKind, value: string | NameNode): TextToken {\n  return { kind, value };\n}\n\nfunction concatMap<V>(arr: Readonly<V[]>, fn: Function): Readonly<V[]> {\n  const res = [];\n  for (let i = 0; i < arr.length; i++) {\n    const x = fn(arr[i], i);\n    if (Array.isArray(x)) {\n      res.push(...x);\n    } else {\n      res.push(x);\n    }\n  }\n  return res;\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/interface/index.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nexport * from './autocompleteUtils';\n\nexport * from './getAutocompleteSuggestions';\n\nexport * from './getDefinition';\n\nexport * from './getDiagnostics';\n\nexport { getOutline } from './getOutline';\nexport { getHoverInformation, HoverConfig } from './getHoverInformation';\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/CharacterStream.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * CharacterStream implements a stream of character tokens given a source text.\n * The API design follows that of CodeMirror.StringStream.\n *\n * Required:\n *\n *      sourceText: (string), A raw GraphQL source text. Works best if a line\n *        is supplied.\n *\n */\nimport { TokenPattern, CharacterStreamInterface } from './types';\n\nexport default class CharacterStream implements CharacterStreamInterface {\n  private _start = 0;\n  private _pos = 0;\n  private _sourceText: string;\n\n  constructor(sourceText: string) {\n    this._sourceText = sourceText;\n  }\n\n  public getStartOfToken = (): number => this._start;\n\n  public getCurrentPosition = (): number => this._pos;\n\n  private _testNextCharacter(pattern: TokenPattern): boolean {\n    const character = this._sourceText.charAt(this._pos);\n    let isMatched = false;\n    if (typeof pattern === 'string') {\n      isMatched = character === pattern;\n    } else {\n      isMatched =\n        pattern instanceof RegExp\n          ? pattern.test(character)\n          : pattern(character);\n    }\n    return isMatched;\n  }\n\n  public eol = (): boolean => this._sourceText.length === this._pos;\n\n  public sol = (): boolean => this._pos === 0;\n\n  public peek = (): string | null => {\n    return this._sourceText.charAt(this._pos) || null;\n  };\n\n  public next = (): string => {\n    const char = this._sourceText.charAt(this._pos);\n    this._pos++;\n    return char;\n  };\n\n  public eat = (pattern: TokenPattern): string | undefined => {\n    const isMatched = this._testNextCharacter(pattern);\n    if (isMatched) {\n      this._start = this._pos;\n      this._pos++;\n      return this._sourceText.charAt(this._pos - 1);\n    }\n    return undefined;\n  };\n\n  public eatWhile = (match: TokenPattern): boolean => {\n    let isMatched = this._testNextCharacter(match);\n    let didEat = false;\n\n    // If a match, treat the total upcoming matches as one token\n    if (isMatched) {\n      didEat = isMatched;\n      this._start = this._pos;\n    }\n\n    while (isMatched) {\n      this._pos++;\n      isMatched = this._testNextCharacter(match);\n      didEat = true;\n    }\n\n    return didEat;\n  };\n\n  public eatSpace = (): boolean => this.eatWhile(/[\\s\\u00a0]/);\n\n  public skipToEnd = (): void => {\n    this._pos = this._sourceText.length;\n  };\n\n  public skipTo = (position: number): void => {\n    this._pos = position;\n  };\n\n  public match = (\n    pattern: TokenPattern,\n    consume: boolean | null | undefined = true,\n    caseFold: boolean | null | undefined = false,\n  ): Array<string> | boolean => {\n    let token = null;\n    let match = null;\n\n    if (typeof pattern === 'string') {\n      const regex = new RegExp(pattern, caseFold ? 'i' : 'g');\n      match = regex.test(\n        this._sourceText.slice(this._pos, this._pos + pattern.length),\n      );\n      token = pattern;\n    } else if (pattern instanceof RegExp) {\n      match = this._sourceText.slice(this._pos).match(pattern);\n      token = match?.[0];\n    }\n\n    if (\n      match != null &&\n      (typeof pattern === 'string' ||\n        (match instanceof Array &&\n          // String.match returns 'index' property, which flow fails to detect\n          // for some reason. The below is a workaround, but an easier solution\n          // is just checking if `match.index === 0`\n          this._sourceText.startsWith(match[0], this._pos)))\n    ) {\n      if (consume) {\n        this._start = this._pos;\n        // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- otherwise has type issue\n        if (token && token.length) {\n          this._pos += token.length;\n        }\n      }\n      return match;\n    }\n\n    // No match available.\n    return false;\n  };\n\n  public backUp = (num: number): void => {\n    this._pos -= num;\n  };\n\n  public column = (): number => this._pos;\n\n  public indentation = (): number => {\n    const match = this._sourceText.match(/\\s*/);\n    let indent = 0;\n    if (match && match.length !== 0) {\n      const whiteSpaces = match[0];\n      let pos = 0;\n      while (whiteSpaces.length > pos) {\n        if (whiteSpaces.charCodeAt(pos) === 9) {\n          indent += 2;\n        } else {\n          indent++;\n        }\n        pos++;\n      }\n    }\n\n    return indent;\n  };\n\n  public current = (): string => this._sourceText.slice(this._start, this._pos);\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/RuleHelpers.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\n// These functions help build matching rules for ParseRules.\n\nimport { Rule, Token } from './types';\n\n// An optional rule.\nexport function opt(ofRule: Rule | string): Rule {\n  return { ofRule };\n}\n\n// A list of another rule.\nexport function list(ofRule: Rule | string, separator?: string | Rule): Rule {\n  return { ofRule, isList: true, separator };\n}\n\n// A constraint described as `but not` in the GraphQL spec.\nexport function butNot(rule: Rule, exclusions: Array<Rule>) {\n  const ruleMatch = rule.match;\n  rule.match = token => {\n    let check = false;\n    if (ruleMatch) {\n      check = ruleMatch(token);\n    }\n    return (\n      check &&\n      // eslint-disable-next-line unicorn/prefer-regexp-test -- false positive exclusion is not string\n      exclusions.every(exclusion => exclusion.match && !exclusion.match(token))\n    );\n  };\n  return rule;\n}\n\n// Token of a kind\nexport function t(kind: string, style: string) {\n  return { style, match: (token: Token) => token.kind === kind };\n}\n\n// Punctuator\nexport function p(value: string, style?: string): Rule {\n  return {\n    style: style || 'punctuation',\n    match: (token: Token) =>\n      token.kind === 'Punctuation' && token.value === value,\n  };\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/Rules.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { State, Token, Rule, RuleKind, ParseRule } from './types';\nimport CharacterStream from './CharacterStream';\nimport { opt, list, butNot, t, p } from './RuleHelpers';\nimport { Kind } from 'graphql';\n\n/**\n * Whitespace tokens defined in GraphQL spec.\n */\nexport const isIgnored = (ch: string) =>\n  ch === ' ' ||\n  ch === '\\t' ||\n  ch === ',' ||\n  ch === '\\n' ||\n  ch === '\\r' ||\n  ch === '\\uFEFF' ||\n  ch === '\\u00A0';\n\n/**\n * The lexer rules. These are exactly as described by the spec.\n */\nexport const LexRules = {\n  // The Name token.\n  Name: /^[_A-Za-z][_0-9A-Za-z]*/,\n\n  // All Punctuation used in GraphQL\n  Punctuation: /^(?:!|\\$|\\(|\\)|\\.\\.\\.|:|=|&|@|\\[|]|\\{|\\||\\})/,\n\n  // Combines the IntValue and FloatValue tokens.\n  Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/,\n\n  // Note the closing quote is made optional as an IDE experience improvement.\n  String:\n    /^(?:\"\"\"(?:\\\\\"\"\"|[^\"]|\"[^\"]|\"\"[^\"])*(?:\"\"\")?|\"(?:[^\"\\\\]|\\\\(?:\"|\\/|\\\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*\"?)/,\n\n  // Comments consume entire lines.\n  Comment: /^#.*/,\n};\n\n/**\n * The parser rules. These are very close to, but not exactly the same as the\n * spec. Minor deviations allow for a simpler implementation. The resulting\n * parser can parse everything the spec declares possible.\n */\nexport const ParseRules: { [name: string]: ParseRule } = {\n  Document: [list('Definition')],\n  Definition(token: Token): RuleKind | void {\n    switch (token.value) {\n      case '{':\n        return 'ShortQuery';\n      case 'query':\n        return 'Query';\n      case 'mutation':\n        return 'Mutation';\n      case 'subscription':\n        return 'Subscription';\n      case 'fragment':\n        return Kind.FRAGMENT_DEFINITION;\n      case 'schema':\n        return 'SchemaDef';\n      case 'scalar':\n        return 'ScalarDef';\n      case 'type':\n        return 'ObjectTypeDef';\n      case 'interface':\n        return 'InterfaceDef';\n      case 'union':\n        return 'UnionDef';\n      case 'enum':\n        return 'EnumDef';\n      case 'input':\n        return 'InputDef';\n      case 'extend':\n        return 'ExtendDef';\n      case 'directive':\n        return 'DirectiveDef';\n    }\n  },\n  // Note: instead of \"Operation\", these rules have been separated out.\n  ShortQuery: ['SelectionSet'],\n  Query: [\n    word('query'),\n    opt(name('def')),\n    opt('VariableDefinitions'),\n    list('Directive'),\n    'SelectionSet',\n  ],\n\n  Mutation: [\n    word('mutation'),\n    opt(name('def')),\n    opt('VariableDefinitions'),\n    list('Directive'),\n    'SelectionSet',\n  ],\n\n  Subscription: [\n    word('subscription'),\n    opt(name('def')),\n    opt('VariableDefinitions'),\n    list('Directive'),\n    'SelectionSet',\n  ],\n\n  VariableDefinitions: [p('('), list('VariableDefinition'), p(')')],\n  VariableDefinition: ['Variable', p(':'), 'Type', opt('DefaultValue')],\n  Variable: [p('$', 'variable'), name('variable')],\n  DefaultValue: [p('='), 'Value'],\n  SelectionSet: [p('{'), list('Selection'), p('}')],\n  Selection(token: Token, stream: CharacterStream) {\n    return token.value === '...'\n      ? stream.match(/[\\s\\u00a0,]*(on\\b|@|{)/, false)\n        ? 'InlineFragment'\n        : 'FragmentSpread'\n      : stream.match(/[\\s\\u00a0,]*:/, false)\n        ? 'AliasedField'\n        : 'Field';\n  },\n  // Note: this minor deviation of \"AliasedField\" simplifies the lookahead.\n  AliasedField: [\n    name('property'),\n    p(':'),\n    name('qualifier'),\n    opt('Arguments'),\n    list('Directive'),\n    opt('SelectionSet'),\n  ],\n\n  Field: [\n    name('property'),\n    opt('Arguments'),\n    list('Directive'),\n    opt('SelectionSet'),\n  ],\n\n  Arguments: [p('('), list('Argument'), p(')')],\n  Argument: [name('attribute'), p(':'), 'Value'],\n  FragmentSpread: [p('...'), name('def'), list('Directive')],\n  InlineFragment: [\n    p('...'),\n    opt('TypeCondition'),\n    list('Directive'),\n    'SelectionSet',\n  ],\n\n  FragmentDefinition: [\n    word('fragment'),\n    opt(butNot(name('def'), [word('on')])),\n    'TypeCondition',\n    list('Directive'),\n    'SelectionSet',\n  ],\n\n  TypeCondition: [word('on'), 'NamedType'],\n  // Variables could be parsed in cases where only Const is expected by spec.\n  Value(token: Token) {\n    switch (token.kind) {\n      case 'Number':\n        return 'NumberValue';\n      case 'String':\n        return 'StringValue';\n      case 'Punctuation':\n        switch (token.value) {\n          case '[':\n            return 'ListValue';\n          case '{':\n            return 'ObjectValue';\n          case '$':\n            return 'Variable';\n          case '&':\n            return 'NamedType';\n        }\n\n        return null;\n      case 'Name':\n        switch (token.value) {\n          case 'true':\n          case 'false':\n            return 'BooleanValue';\n        }\n\n        if (token.value === 'null') {\n          return 'NullValue';\n        }\n        return 'EnumValue';\n    }\n  },\n  NumberValue: [t('Number', 'number')],\n  StringValue: [\n    {\n      style: 'string',\n      match: (token: Token) => token.kind === 'String',\n      update(state: State, token: Token) {\n        if (token.value.startsWith('\"\"\"')) {\n          state.inBlockstring = !token.value.slice(3).endsWith('\"\"\"');\n        }\n      },\n    },\n  ],\n  BooleanValue: [t('Name', 'builtin')],\n  NullValue: [t('Name', 'keyword')],\n  EnumValue: [name('string-2')],\n  ListValue: [p('['), list('Value'), p(']')],\n  ObjectValue: [p('{'), list('ObjectField'), p('}')],\n  ObjectField: [name('attribute'), p(':'), 'Value'],\n  Type(token: Token) {\n    return token.value === '[' ? 'ListType' : 'NonNullType';\n  },\n  // NonNullType has been merged into ListType to simplify.\n  ListType: [p('['), 'Type', p(']'), opt(p('!'))],\n  NonNullType: ['NamedType', opt(p('!'))],\n  NamedType: [type('atom')],\n  Directive: [p('@', 'meta'), name('meta'), opt('Arguments')],\n  DirectiveDef: [\n    word('directive'),\n    p('@', 'meta'),\n    name('meta'),\n    opt('ArgumentsDef'),\n    word('on'),\n    list('DirectiveLocation', p('|')),\n  ],\n  InterfaceDef: [\n    word('interface'),\n    name('atom'),\n    opt('Implements'),\n    list('Directive'),\n    p('{'),\n    list('FieldDef'),\n    p('}'),\n  ],\n  Implements: [word('implements'), list('NamedType', p('&'))],\n  DirectiveLocation: [name('string-2')],\n  // GraphQL schema language\n  SchemaDef: [\n    word('schema'),\n    list('Directive'),\n    p('{'),\n    list('OperationTypeDef'),\n    p('}'),\n  ],\n\n  OperationTypeDef: [name('keyword'), p(':'), name('atom')],\n  ScalarDef: [word('scalar'), name('atom'), list('Directive')],\n  ObjectTypeDef: [\n    word('type'),\n    name('atom'),\n    opt('Implements'),\n    list('Directive'),\n    p('{'),\n    list('FieldDef'),\n    p('}'),\n  ],\n\n  FieldDef: [\n    name('property'),\n    opt('ArgumentsDef'),\n    p(':'),\n    'Type',\n    list('Directive'),\n  ],\n\n  ArgumentsDef: [p('('), list('InputValueDef'), p(')')],\n  InputValueDef: [\n    name('attribute'),\n    p(':'),\n    'Type',\n    opt('DefaultValue'),\n    list('Directive'),\n  ],\n\n  UnionDef: [\n    word('union'),\n    name('atom'),\n    list('Directive'),\n    p('='),\n    list('UnionMember', p('|')),\n  ],\n\n  UnionMember: ['NamedType'],\n  EnumDef: [\n    word('enum'),\n    name('atom'),\n    list('Directive'),\n    p('{'),\n    list('EnumValueDef'),\n    p('}'),\n  ],\n\n  EnumValueDef: [name('string-2'), list('Directive')],\n  InputDef: [\n    word('input'),\n    name('atom'),\n    list('Directive'),\n    p('{'),\n    list('InputValueDef'),\n    p('}'),\n  ],\n  ExtendDef: [word('extend'), 'ExtensionDefinition'],\n  ExtensionDefinition(token: Token): RuleKind | void {\n    switch (token.value) {\n      case 'schema':\n        return Kind.SCHEMA_EXTENSION;\n      case 'scalar':\n        return Kind.SCALAR_TYPE_EXTENSION;\n      case 'type':\n        return Kind.OBJECT_TYPE_EXTENSION;\n      case 'interface':\n        return Kind.INTERFACE_TYPE_EXTENSION;\n      case 'union':\n        return Kind.UNION_TYPE_EXTENSION;\n      case 'enum':\n        return Kind.ENUM_TYPE_EXTENSION;\n      case 'input':\n        return Kind.INPUT_OBJECT_TYPE_EXTENSION;\n    }\n  },\n  [Kind.SCHEMA_EXTENSION]: ['SchemaDef'],\n  [Kind.SCALAR_TYPE_EXTENSION]: ['ScalarDef'],\n  [Kind.OBJECT_TYPE_EXTENSION]: ['ObjectTypeDef'],\n  [Kind.INTERFACE_TYPE_EXTENSION]: ['InterfaceDef'],\n  [Kind.UNION_TYPE_EXTENSION]: ['UnionDef'],\n  [Kind.ENUM_TYPE_EXTENSION]: ['EnumDef'],\n  [Kind.INPUT_OBJECT_TYPE_EXTENSION]: ['InputDef'],\n};\n\n// A keyword Token.\nfunction word(value: string) {\n  return {\n    style: 'keyword',\n    match: (token: Token) => token.kind === 'Name' && token.value === value,\n  };\n}\n\n// A Name Token which will decorate the state with a `name`.\nfunction name(style: string): Rule {\n  return {\n    style,\n    match: (token: Token) => token.kind === 'Name',\n    update(state: State, token: Token) {\n      state.name = token.value;\n    },\n  };\n}\n\n// A Name Token which will decorate the previous state with a `type`.\nfunction type(style: string) {\n  return {\n    style,\n    match: (token: Token) => token.kind === 'Name',\n    update(state: State, token: Token) {\n      if (state.prevState?.prevState) {\n        state.name = token.value;\n        state.prevState.prevState.type = token.value;\n      }\n    },\n  };\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/__tests__/CharacterStream.test.ts",
    "content": "import CharacterStream from '../CharacterStream';\n\ndescribe('CharacterStream', () => {\n  describe('getStartOfToken', () => {\n    it('returns start position', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.getStartOfToken()).toEqual(0);\n    });\n  });\n\n  describe('getCurrentPosition', () => {\n    it('returns current position', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.getCurrentPosition()).toEqual(0);\n\n      stream.next();\n\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n  });\n\n  describe('sol', () => {\n    it('returns true if at start of the source string', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.sol()).toEqual(true);\n\n      stream.next();\n\n      expect(stream.sol()).toEqual(false);\n    });\n  });\n\n  describe('eol', () => {\n    it('returns true if end of source string is reached', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eol()).toEqual(false);\n\n      stream.skipToEnd();\n\n      expect(stream.eol()).toEqual(true);\n    });\n  });\n\n  describe('peak', () => {\n    it('returns the next character in source string', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.peek()).toEqual('s');\n\n      stream.next();\n\n      expect(stream.peek()).toEqual('c');\n    });\n\n    it('returns null if at end of the source string', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.skipToEnd();\n\n      expect(stream.peek()).toEqual(null);\n    });\n  });\n\n  describe('next', () => {\n    it('increments the current position', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.next();\n\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n\n    it('returns the next character in source string', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.next()).toEqual('s');\n      expect(stream.next()).toEqual('c');\n    });\n  });\n\n  describe('_testNextCharacter', () => {\n    it('tests next character with the pattern provided', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream._testNextCharacter('s')).toEqual(true);\n\n      stream.next();\n\n      expect(stream._testNextCharacter('c')).toEqual(true);\n    });\n\n    it('returns correct result with regex pattern', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream._testNextCharacter(/s/)).toEqual(true);\n    });\n\n    it('returns correct result with a callback function as pattern', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      const matcher = nextChar => nextChar === 's';\n\n      expect(stream._testNextCharacter(matcher)).toEqual(true);\n    });\n  });\n\n  describe('eat', () => {\n    it('returns next character is matched with the pattern provided', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eat('s')).toEqual('s');\n    });\n\n    it('returns undefined is not matched with the pattern provided', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eat('b')).toEqual(undefined);\n    });\n\n    it('increments current position after successful match', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.eat('s');\n\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n\n    it('sets start to current position after successful match', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.next();\n      stream.eat('c');\n\n      expect(stream.getStartOfToken()).toEqual(1);\n    });\n  });\n\n  describe('eatWhile', () => {\n    it('returns true if any character matched', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eatWhile(/[_A-Za-z]+/)).toEqual(true);\n    });\n\n    it('returns false if no character matched', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eatWhile(/^(?:,)/)).toEqual(false);\n    });\n\n    it('increments current position upto where the characters are matched', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.eatWhile(/[_A-Za-z]+/);\n\n      expect(stream.getCurrentPosition()).toEqual(6);\n      expect(stream.peek()).toEqual(' ');\n    });\n\n    it('sets start to first matched character position', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.skipTo(7);\n      stream.eatWhile(/[_A-Za-z]+/);\n\n      expect(stream.getStartOfToken()).toEqual(7);\n    });\n  });\n\n  describe('eatSpace', () => {\n    it('returns true if space found', () => {\n      const source = '  scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eatSpace()).toEqual(true);\n    });\n\n    it('returns false if no space found', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.eatSpace()).toEqual(false);\n    });\n\n    it('increments current position upto where the space is matched', () => {\n      const source = '  scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.eatSpace();\n\n      expect(stream.getCurrentPosition()).toEqual(2);\n    });\n\n    it('sets start to last space character position', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.getStartOfToken()).toEqual(0);\n\n      stream.skipTo(6);\n      stream.eatSpace();\n\n      expect(stream.getStartOfToken()).toEqual(6);\n    });\n  });\n\n  describe('skipToEnd', () => {\n    it('sets pos to end of the source string', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.skipToEnd();\n\n      expect(stream.getCurrentPosition()).toEqual(10);\n    });\n  });\n\n  describe('skipTo', () => {\n    it('sets pos to the provided index', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.skipTo(2);\n\n      expect(stream.getCurrentPosition()).toEqual(2);\n    });\n  });\n\n  describe('backUp', () => {\n    it('goes back the number of steps provided', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.skipTo(2);\n\n      stream.backUp(1);\n\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n  });\n\n  describe('column', () => {\n    it('returns current position', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.skipTo(1);\n\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n  });\n\n  describe('current', () => {\n    it('returns the current parsed portion of the source string', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream._start = 1;\n      stream.skipTo(6);\n\n      expect(stream.current()).toEqual('calar');\n    });\n  });\n\n  describe('indentation', () => {\n    it('returns 0 for no indentation', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.indentation()).toEqual(0);\n    });\n\n    it('returns correct indentation', () => {\n      const source = '  scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.indentation()).toEqual(2);\n    });\n\n    it('counts tab as 2 spaces in indentation', () => {\n      const source = '\\tscalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.indentation()).toEqual(2);\n    });\n  });\n\n  describe('match', () => {\n    it('returns false if no match found', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.match('a')).toEqual(false);\n    });\n\n    it('returns matches if found', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.match(/scalar/)[0]).toEqual('scalar');\n    });\n\n    it('accepts string pattern', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.match('scalar')).toEqual(true);\n    });\n\n    it('dose case-insensitive match when caseFold is true', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      expect(stream.match('Scalar', true, true)).toEqual(true);\n      expect(stream.match('Scalar', true, false)).toEqual(false);\n    });\n\n    it('consumes the source string if a match is found, by default', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.next();\n      stream.match('calar');\n\n      expect(stream.getStartOfToken()).toEqual(1);\n      expect(stream.getCurrentPosition()).toEqual(6);\n    });\n\n    it('does not consumes the source string if no match is found', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.next();\n      stream.match(/123/);\n\n      expect(stream.getStartOfToken()).toEqual(0);\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n\n    it('does not consume the source string if marked as false', () => {\n      const source = 'scalar Foo';\n      const stream = new CharacterStream(source);\n\n      stream.next();\n      stream.match('calar', false);\n\n      expect(stream.getStartOfToken()).toEqual(0);\n      expect(stream.getCurrentPosition()).toEqual(1);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/__tests__/OnlineParser.test.ts",
    "content": "/* eslint-disable jest/expect-expect */\nimport OnlineParser from '../onlineParser';\nimport {\n  getUtils,\n  performForEachType,\n  expectVarsDef,\n  expectArgs,\n  expectDirective,\n} from './OnlineParserUtils';\n\ndescribe('onlineParser', () => {\n  describe('.startState', () => {\n    it('initializes state correctly', () => {\n      const parser = OnlineParser();\n\n      expect(parser.startState()).toEqual({\n        level: 0,\n        step: 0,\n        name: null,\n        kind: 'Document',\n        type: null,\n        rule: [\n          {\n            isList: true,\n            ofRule: 'Definition',\n            separator: undefined,\n          },\n        ],\n        needsSeparator: false,\n        prevState: {\n          level: 0,\n          step: 0,\n          name: null,\n          kind: null,\n          type: null,\n          rule: null,\n          needsSeparator: false,\n          prevState: null,\n        },\n      });\n    });\n  });\n\n  describe('.token', () => {\n    it('detects invalid char', () => {\n      const { token } = getUtils('^');\n\n      expect(token()).toEqual('invalidchar');\n    });\n\n    it('parses schema def', () => {\n      const { t } = getUtils(`\n        schema {\n          query: SomeType\n        }\n      `);\n\n      t.keyword('schema', { kind: 'SchemaDef' });\n      t.punctuation('{');\n\n      t.keyword('query', { kind: 'OperationTypeDef' });\n      t.punctuation(':');\n      t.name('SomeType');\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses short query', () => {\n      const { t } = getUtils(`\n        {\n          someField\n        }\n      `);\n\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses query', () => {\n      const { t } = getUtils(`\n        query SomeQuery {\n          someField\n        }\n      `);\n\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses query with variables', () => {\n      const { t, stream } = getUtils(`\n        query SomeQuery ($someVariable: SomeInputType) {\n          someField(someArg: $someVariable)\n        }\n      `);\n\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      expectVarsDef(\n        { t, stream },\n        {\n          onKind: 'Query',\n          vars: [{ name: 'someVariable', type: 'SomeInputType' }],\n        },\n      );\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n      expectArgs(\n        { t, stream },\n        {\n          onKind: 'Field',\n          args: [{ name: 'someArg', isVariable: true, value: 'someVariable' }],\n        },\n      );\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    performForEachType(\n      `\n        query SomeQuery {\n          someField(someArg: __VALUE__)\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses query field having argument of type ${fill.type}`, () => {\n          t.keyword('query', { kind: 'Query' });\n          t.def('SomeQuery');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someField', { kind: 'Field' });\n          expectArgs(\n            { t, stream },\n            { onKind: 'Field', args: [{ name: 'someArg', ...fill }] },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    performForEachType(\n      `\n        query SomeQuery {\n          someField(someArg: [__VALUE__])\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses query field having argument as list of type ${fill.type}`, () => {\n          t.keyword('query', { kind: 'Query' });\n          t.def('SomeQuery');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someField', { kind: 'Field' });\n          expectArgs(\n            { t, stream },\n            {\n              onKind: 'Field',\n              args: [{ name: 'someArg', isList: true, ...fill }],\n            },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    it('parses query field having argument of type object', () => {\n      const { t } = getUtils(`\n        query SomeQuery {\n          someField(someArg: { anotherField: $someVariable })\n        }\n      `);\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n      t.punctuation(/\\(/, { kind: 'Arguments' });\n      t.attribute('someArg', { kind: 'Argument' });\n      t.punctuation(':');\n      t.punctuation('{', { kind: 'ObjectValue' });\n      t.attribute('anotherField', { kind: 'ObjectField' });\n      t.punctuation(':');\n      t.variable('$', { kind: 'Variable' });\n      t.variable('someVariable');\n      t.punctuation('}', { kind: 'Arguments' });\n      t.punctuation(/\\)/, { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    performForEachType(\n      `\n        query SomeQuery {\n          someField @someDirective(anotherArg: __VALUE__)\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses query field with directive having argument of type ${fill.type}`, () => {\n          t.keyword('query', { kind: 'Query' });\n          t.def('SomeQuery');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someField', { kind: 'Field' });\n          expectDirective(\n            { t, stream },\n            {\n              name: 'someDirective',\n              onKind: 'Field',\n              args: [{ name: 'anotherArg', ...fill }],\n            },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    it('parses query field with a directive and selection set', () => {\n      const { t } = getUtils(`\n        query SomeQuery {\n          someField @someDirective {\n            anotherField\n          }\n        }\n      `);\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses query field with an alias', () => {\n      const { t } = getUtils(`\n        query SomeQuery {\n          someAlias : someField @someDirective {\n            anotherField\n          }\n        }\n      `);\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someAlias', { kind: 'AliasedField' });\n      t.punctuation(':');\n      t.qualifier('someField');\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses invalid query', () => {\n      const { t, token } = getUtils(`\n        {}garbage\n      `);\n\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      expect(token()).toEqual('invalidchar');\n\n      t.eol();\n    });\n\n    it('parses a fragment definition', () => {\n      const { t } = getUtils(`\n        fragment SomeFragment on SomeType {\n          someField\n        }\n      `);\n\n      t.keyword('fragment', { kind: 'FragmentDefinition' });\n      t.def('SomeFragment');\n      t.keyword('on', { kind: 'TypeCondition' });\n      t.name('SomeType', { kind: 'NamedType' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses a fragment definition with a directive', () => {\n      const { t } = getUtils(`\n        fragment SomeFragment on SomeType @someDirective {\n          someField\n        }\n      `);\n\n      t.keyword('fragment', { kind: 'FragmentDefinition' });\n      t.def('SomeFragment');\n      t.keyword('on', { kind: 'TypeCondition' });\n      t.name('SomeType', { kind: 'NamedType' });\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses query with inline fragment', () => {\n      const { t } = getUtils(`\n        query SomeQuery {\n          someField {\n            ... on SomeType {\n              anotherField\n            }\n          }\n        }\n      `);\n\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('...', { kind: 'InlineFragment' });\n      t.keyword('on', { kind: 'TypeCondition' });\n      t.name('SomeType', { kind: 'NamedType' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses query with fragment spread', () => {\n      const { t } = getUtils(`\n        query SomeQuery {\n          someField {\n            ...SomeFragment @someDirective\n          }\n        }\n      `);\n\n      t.keyword('query', { kind: 'Query' });\n      t.def('SomeQuery');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someField', { kind: 'Field' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('...', { kind: 'FragmentSpread' });\n      t.def('SomeFragment');\n      expectDirective({ t }, { name: 'someDirective' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses mutation', () => {\n      const { t } = getUtils(`\n        mutation SomeMutation {\n          someMutation\n        }\n      `);\n\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someMutation', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses mutation with variables', () => {\n      const { t, stream } = getUtils(`\n        mutation SomeMutation ($someVariable: SomeInputType) {\n          someMutation(someArg: $someVariable)\n        }\n      `);\n\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      expectVarsDef(\n        { t, stream },\n        {\n          onKind: 'Mutation',\n          vars: [{ name: 'someVariable', type: 'SomeInputType' }],\n        },\n      );\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someMutation', { kind: 'Field' });\n      expectArgs(\n        { t, stream },\n        {\n          onKind: 'Field',\n          args: [{ name: 'someArg', isVariable: true, value: 'someVariable' }],\n        },\n      );\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    performForEachType(\n      `\n        mutation SomeMutation {\n          someMutation(someArg: __VALUE__)\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses mutation field having argument of type ${fill.type}`, () => {\n          t.keyword('mutation', { kind: 'Mutation' });\n          t.def('SomeMutation');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someMutation', { kind: 'Field' });\n          expectArgs(\n            { t, stream },\n            { onKind: 'Field', args: [{ name: 'someArg', ...fill }] },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    it('parses mutation field having argument of type object', () => {\n      const { t } = getUtils(`\n        mutation SomeMutation {\n          someMutation(someArg: { anotherField: $someVariable })\n        }\n      `);\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someMutation', { kind: 'Field' });\n      t.punctuation(/\\(/, { kind: 'Arguments' });\n      t.attribute('someArg', { kind: 'Argument' });\n      t.punctuation(':');\n      t.punctuation('{', { kind: 'ObjectValue' });\n      t.attribute('anotherField', { kind: 'ObjectField' });\n      t.punctuation(':');\n      t.variable('$', { kind: 'Variable' });\n      t.variable('someVariable');\n      t.punctuation('}', { kind: 'Arguments' });\n      t.punctuation(/\\)/, { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    performForEachType(\n      `\n        mutation SomeMutation {\n          someMutation @someDirective(anotherArg: __VALUE__)\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses mutation field with directive having argument of type ${fill.type}`, () => {\n          t.keyword('mutation', { kind: 'Mutation' });\n          t.def('SomeMutation');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someMutation', { kind: 'Field' });\n          expectDirective(\n            { t, stream },\n            {\n              name: 'someDirective',\n              onKind: 'Field',\n              args: [{ name: 'anotherArg', ...fill }],\n            },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    it('parses mutation field with a directive and selection set', () => {\n      const { t } = getUtils(`\n        mutation SomeMutation {\n          someMutation @someDirective {\n            anotherField\n          }\n        }\n      `);\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someMutation', { kind: 'Field' });\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses mutation field with an alias', () => {\n      const { t } = getUtils(`\n        mutation SomeMutation {\n          someAlias : someMutation @someDirective {\n            anotherField\n          }\n        }\n      `);\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someAlias', { kind: 'AliasedField' });\n      t.punctuation(':');\n      t.qualifier('someMutation');\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses mutation with inline fragment', () => {\n      const { t } = getUtils(`\n        mutation SomeMutation {\n          someMutation {\n            ... on SomeType {\n              anotherField\n            }\n          }\n        }\n      `);\n\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someMutation', { kind: 'Field' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('...', { kind: 'InlineFragment' });\n      t.keyword('on', { kind: 'TypeCondition' });\n      t.name('SomeType', { kind: 'NamedType' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses mutation with fragment spread', () => {\n      const { t } = getUtils(`\n        mutation SomeMutation {\n          someMutation {\n            ...SomeFragment @someDirective\n          }\n        }\n      `);\n\n      t.keyword('mutation', { kind: 'Mutation' });\n      t.def('SomeMutation');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someMutation', { kind: 'Field' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('...', { kind: 'FragmentSpread' });\n      t.def('SomeFragment');\n      expectDirective({ t }, { name: 'someDirective' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses subscription', () => {\n      const { t } = getUtils(`\n        subscription SomeSubscription {\n          someSubscription\n        }\n      `);\n\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someSubscription', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses subscription with variables', () => {\n      const { t, stream } = getUtils(`\n        subscription SomeSubscription ($someVariable: SomeInputType) {\n          someSubscription(someArg: $someVariable)\n        }\n      `);\n\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      expectVarsDef(\n        { t, stream },\n        {\n          onKind: 'Subscription',\n          vars: [{ name: 'someVariable', type: 'SomeInputType' }],\n        },\n      );\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someSubscription', { kind: 'Field' });\n      expectArgs(\n        { t, stream },\n        {\n          onKind: 'Field',\n          args: [{ name: 'someArg', isVariable: true, value: 'someVariable' }],\n        },\n      );\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    performForEachType(\n      `\n        subscription SomeSubscription {\n          someSubscription(someArg: __VALUE__)\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses subscription field having argument of type ${fill.type}`, () => {\n          t.keyword('subscription', { kind: 'Subscription' });\n          t.def('SomeSubscription');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someSubscription', { kind: 'Field' });\n          expectArgs(\n            { t, stream },\n            { onKind: 'Field', args: [{ name: 'someArg', ...fill }] },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    it('parses subscription field having argument of type object', () => {\n      const { t } = getUtils(`\n        subscription SomeSubscription {\n          someSubscription(someArg: { anotherField: $someVariable })\n        }\n      `);\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someSubscription', { kind: 'Field' });\n      t.punctuation(/\\(/, { kind: 'Arguments' });\n      t.attribute('someArg', { kind: 'Argument' });\n      t.punctuation(':');\n      t.punctuation('{', { kind: 'ObjectValue' });\n      t.attribute('anotherField', { kind: 'ObjectField' });\n      t.punctuation(':');\n      t.variable('$', { kind: 'Variable' });\n      t.variable('someVariable');\n      t.punctuation('}', { kind: 'Arguments' });\n      t.punctuation(/\\)/, { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    performForEachType(\n      `\n        subscription SomeSubscription {\n          someSubscription @someDirective(anotherArg: __VALUE__)\n        }\n      `,\n      ({ t, stream }, fill) => {\n        it(`parses subscription field with directive having argument of type ${fill.type}`, () => {\n          t.keyword('subscription', { kind: 'Subscription' });\n          t.def('SomeSubscription');\n          t.punctuation('{', { kind: 'SelectionSet' });\n\n          t.property('someSubscription', { kind: 'Field' });\n          expectDirective(\n            { t, stream },\n            {\n              name: 'someDirective',\n              onKind: 'Field',\n              args: [{ name: 'anotherArg', ...fill }],\n            },\n          );\n\n          t.punctuation('}', { kind: 'Document' });\n\n          t.eol();\n        });\n      },\n    );\n\n    it('parses subscription field with a directive and selection set', () => {\n      const { t } = getUtils(`\n        subscription SomeSubscription {\n          someSubscription @someDirective {\n            anotherField\n          }\n        }\n      `);\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someSubscription', { kind: 'Field' });\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses subscription field with an alias', () => {\n      const { t } = getUtils(`\n        subscription SomeSubscription {\n          someAlias : someSubscription @someDirective {\n            anotherField\n          }\n        }\n      `);\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someAlias', { kind: 'AliasedField' });\n      t.punctuation(':');\n      t.qualifier('someSubscription');\n      expectDirective({ t }, { name: 'someDirective' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses subscription with inline fragment', () => {\n      const { t } = getUtils(/* GraphQL */ `\n        subscription SomeSubscription {\n          someSubscription {\n            ... on SomeType {\n              anotherField\n            }\n          }\n        }\n      `);\n\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someSubscription', { kind: 'Field' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('...', { kind: 'InlineFragment' });\n      t.keyword('on', { kind: 'TypeCondition' });\n      t.name('SomeType', { kind: 'NamedType' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('anotherField', { kind: 'Field' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    it('parses subscription with fragment spread', () => {\n      const { t } = getUtils(/* GraphQL */ `\n        subscription SomeSubscription {\n          someSubscription {\n            ...SomeFragment @someDirective\n          }\n        }\n      `);\n\n      t.keyword('subscription', { kind: 'Subscription' });\n      t.def('SomeSubscription');\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.property('someSubscription', { kind: 'Field' });\n      t.punctuation('{', { kind: 'SelectionSet' });\n\n      t.punctuation('...', { kind: 'FragmentSpread' });\n      t.def('SomeFragment');\n      expectDirective({ t }, { name: 'someDirective' });\n\n      t.punctuation('}', { kind: 'SelectionSet' });\n\n      t.punctuation('}', { kind: 'Document' });\n\n      t.eol();\n    });\n\n    describe('parses object type def', () => {\n      it('correctly', () => {\n        const { t } = getUtils(`\n          type SomeType {\n            someField: AnotherType!\n          }\n        `);\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        t.punctuation('!', { kind: 'FieldDef' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with an object implementing an interface', () => {\n        const { t } = getUtils('type SomeType implements SomeInterface');\n\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.keyword('implements', { kind: 'Implements' });\n        t.name('SomeInterface', { kind: 'NamedType' });\n\n        t.eol();\n      });\n\n      it('with an object type implementing multiple interfaces', () => {\n        const { t } = getUtils(\n          'type SomeType implements SomeInterface & AnotherInterface & YetAnotherInterface',\n        );\n\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.keyword('implements', { kind: 'Implements' });\n        t.name('SomeInterface', { kind: 'NamedType' });\n        t.punctuation('&', { kind: 'Implements' });\n        t.name('AnotherInterface', { kind: 'NamedType' });\n        t.punctuation('&', { kind: 'Implements' });\n        t.name('YetAnotherInterface', { kind: 'NamedType' });\n        t.eol();\n      });\n\n      it('with a directive', () => {\n        const { t } = getUtils('type SomeType @someDirective');\n\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        expectDirective({ t }, { name: 'someDirective' });\n\n        t.eol();\n      });\n\n      performForEachType(\n        'type SomeType @someDirective(someArg: __VALUE__)',\n        ({ t, stream }, fill) => {\n          it(`with a directive having argument of type ${fill.type}`, () => {\n            t.keyword('type', { kind: 'ObjectTypeDef' });\n            t.name('SomeType');\n            expectDirective(\n              { t, stream },\n              {\n                name: 'someDirective',\n                onKind: 'ObjectTypeDef',\n                args: [{ name: 'someArg', ...fill }],\n              },\n            );\n\n            t.eol();\n          });\n        },\n      );\n    });\n\n    describe('parses interface def', () => {\n      it('correctly', () => {\n        const { t } = getUtils(`\n          interface SomeInterface {\n            someField: SomeType!\n          }\n        `);\n        t.keyword('interface', { kind: 'InterfaceDef' });\n        t.name('SomeInterface');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('SomeType', { kind: 'NamedType' });\n        t.punctuation('!', { kind: 'FieldDef' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with a directive', () => {\n        const { t } = getUtils('interface SomeInterface @someDirective');\n\n        t.keyword('interface', { kind: 'InterfaceDef' });\n        t.name('SomeInterface');\n        expectDirective({ t }, { name: 'someDirective' });\n\n        t.eol();\n      });\n\n      it('implementing multiple interfaces', () => {\n        const { t } = getUtils(\n          'interface AnInterface implements SomeInterface & AnotherInterface & YetAnotherInterface',\n        );\n\n        t.keyword('interface', { kind: 'InterfaceDef' });\n        t.name('AnInterface');\n        t.keyword('implements', { kind: 'Implements' });\n        t.name('SomeInterface', { kind: 'NamedType' });\n        t.punctuation('&', { kind: 'Implements' });\n        t.name('AnotherInterface', { kind: 'NamedType' });\n        t.punctuation('&', { kind: 'Implements' });\n        t.name('YetAnotherInterface', { kind: 'NamedType' });\n        t.eol();\n      });\n\n      performForEachType(\n        'interface SomeInterface @someDirective(someArg: __VALUE__)',\n        ({ t, stream }, fill) => {\n          it(`with a directive having argument of type ${fill.type}`, () => {\n            t.keyword('interface', { kind: 'InterfaceDef' });\n            t.name('SomeInterface');\n            expectDirective(\n              { t, stream },\n              {\n                name: 'someDirective',\n                onKind: 'InterfaceDef',\n                args: [{ name: 'someArg', ...fill }],\n              },\n            );\n\n            t.eol();\n          });\n        },\n      );\n    });\n\n    describe('parses field defs', () => {\n      it('correctly', () => {\n        const { t } = getUtils(`\n          type SomeType {\n            someField: AnotherType!\n          }\n        `);\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        t.punctuation('!', { kind: 'FieldDef' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with an argument', () => {\n        const { t } = getUtils(`\n          type SomeType {\n            someField(someArg: AnotherType): [SomeAnotherType!]!\n          }\n        `);\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(/\\(/, { kind: 'ArgumentsDef' });\n        t.attribute('someArg', { kind: 'InputValueDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        t.punctuation(/\\)/, { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.punctuation(/\\[/, { kind: 'ListType' });\n        t.name('SomeAnotherType', { kind: 'NamedType' });\n        t.punctuation('!', { kind: 'ListType' });\n        t.punctuation(/\\]/);\n        t.punctuation('!', { kind: 'FieldDef' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with a directive', () => {\n        const { t } = getUtils(`\n          type SomeType {\n            someField: AnotherType @someDirective\n          }\n        `);\n\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        expectDirective({ t }, { name: 'someDirective' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with multiple directives', () => {\n        const { t } = getUtils(`\n          type SomeType {\n            someField: AnotherType @someDirective @anotherDirective\n          }\n        `);\n\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        expectDirective({ t }, { name: 'someDirective' });\n        expectDirective({ t }, { name: 'anotherDirective' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      performForEachType(\n        `\n          type SomeType {\n            someField: AnotherType @someDirective(someArg: __VALUE__)\n          }\n        `,\n        ({ t, stream }, fill) => {\n          it(`with a directive having arguments of type ${fill.type}`, () => {\n            t.keyword('type', { kind: 'ObjectTypeDef' });\n            t.name('SomeType');\n            t.punctuation('{');\n\n            t.property('someField', { kind: 'FieldDef' });\n            t.punctuation(':');\n            t.name('AnotherType', { kind: 'NamedType' });\n            expectDirective(\n              { t, stream },\n              {\n                name: 'someDirective',\n                onKind: 'FieldDef',\n                args: [{ name: 'someArg', ...fill }],\n              },\n            );\n\n            t.punctuation('}', { kind: 'Document' });\n\n            t.eol();\n          });\n        },\n      );\n    });\n\n    describe('parses extend type def', () => {\n      it('correctly', () => {\n        const { t } = getUtils(`\n          extend type SomeType {\n            someField: AnotherType\n          }\n        `);\n\n        t.keyword('extend', { kind: 'ExtendDef' });\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with multiple directives', () => {\n        const { t } = getUtils(`\n          extend type SomeType {\n            someField: AnotherType @someDirective @anotherDirective\n          }\n        `);\n\n        t.keyword('extend', { kind: 'ExtendDef' });\n        t.keyword('type', { kind: 'ObjectTypeDef' });\n        t.name('SomeType');\n        t.punctuation('{');\n\n        t.property('someField', { kind: 'FieldDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        expectDirective({ t }, { name: 'someDirective' });\n        expectDirective({ t }, { name: 'anotherDirective' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n    });\n\n    describe('parses input type def', () => {\n      it('correctly', () => {\n        const { t } = getUtils(`\n          input SomeInputType {\n            someField: AnotherType\n          }\n        `);\n\n        t.keyword('input', { kind: 'InputDef' });\n        t.name('SomeInputType');\n        t.punctuation('{');\n\n        t.attribute('someField', { kind: 'InputValueDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with multiple directives', () => {\n        const { t } = getUtils(`\n          input SomeInputType {\n            someField: AnotherType @someDirective @anotherDirective\n          }\n        `);\n\n        t.keyword('input', { kind: 'InputDef' });\n        t.name('SomeInputType');\n        t.punctuation('{');\n\n        t.attribute('someField', { kind: 'InputValueDef' });\n        t.punctuation(':');\n        t.name('AnotherType', { kind: 'NamedType' });\n        expectDirective({ t }, { name: 'someDirective' });\n        expectDirective({ t }, { name: 'anotherDirective' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n    });\n\n    describe('parses enum type def', () => {\n      it('correctly', () => {\n        const { t } = getUtils(`\n          enum SomeEnum {\n            SOME_ENUM_VALUE\n            ANOTHER_ENUM_VALUE\n          }\n        `);\n\n        t.keyword('enum', { kind: 'EnumDef' });\n        t.name('SomeEnum');\n        t.punctuation('{');\n\n        t.value('Enum', 'SOME_ENUM_VALUE', { kind: 'EnumValueDef' });\n        t.value('Enum', 'ANOTHER_ENUM_VALUE', { kind: 'EnumValueDef' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n\n      it('with a directive', () => {\n        const { t } = getUtils(`\n          enum SomeEnum @someDirective {\n            SOME_ENUM_VALUE\n            ANOTHER_ENUM_VALUE\n          }\n        `);\n\n        t.keyword('enum', { kind: 'EnumDef' });\n        t.name('SomeEnum');\n        expectDirective({ t }, { name: 'someDirective' });\n        t.punctuation('{', { kind: 'EnumDef' });\n\n        t.value('Enum', 'SOME_ENUM_VALUE', { kind: 'EnumValueDef' });\n        t.value('Enum', 'ANOTHER_ENUM_VALUE', { kind: 'EnumValueDef' });\n\n        t.punctuation('}', { kind: 'Document' });\n\n        t.eol();\n      });\n    });\n\n    describe('parses scalar type def', () => {\n      it('correctly', () => {\n        const { t } = getUtils('scalar SomeScalar');\n\n        t.keyword('scalar', { kind: 'ScalarDef' });\n        t.name('SomeScalar');\n\n        t.eol();\n      });\n\n      it('with a directive', () => {\n        const { t } = getUtils('scalar SomeScalar @someDirective');\n\n        t.keyword('scalar', { kind: 'ScalarDef' });\n        t.name('SomeScalar');\n        expectDirective({ t }, { name: 'someDirective' });\n\n        t.eol();\n      });\n    });\n\n    describe('parses union type def', () => {\n      it('correctly', () => {\n        const { t } = getUtils('union SomeUnionType = SomeType | AnotherType');\n\n        t.keyword('union', { kind: 'UnionDef' });\n        t.name('SomeUnionType');\n        t.punctuation('=');\n        t.name('SomeType', { kind: 'NamedType' });\n        t.punctuation('|', { kind: 'UnionDef' });\n        t.name('AnotherType', { kind: 'NamedType' });\n\n        t.eol();\n      });\n\n      it('with a directive', () => {\n        const { t } = getUtils(\n          'union SomeUnionType @someDirective = SomeType | AnotherType',\n        );\n\n        t.keyword('union', { kind: 'UnionDef' });\n        t.name('SomeUnionType');\n        expectDirective({ t }, { name: 'someDirective' });\n        t.punctuation('=', { kind: 'UnionDef' });\n        t.name('SomeType', { kind: 'NamedType' });\n        t.punctuation('|', { kind: 'UnionDef' });\n        t.name('AnotherType', { kind: 'NamedType' });\n\n        t.eol();\n      });\n    });\n\n    describe('parses directive type def', () => {\n      it('with multiple locations', () => {\n        const { t } = getUtils(\n          'directive @someDirective on FIELD_DEFINITION | ENUM_VALUE ',\n        );\n\n        t.keyword('directive', { kind: 'DirectiveDef' });\n        t.meta('@');\n        t.meta('someDirective');\n        t.keyword('on');\n        t.value('Enum', 'FIELD_DEFINITION', { kind: 'DirectiveLocation' });\n        t.punctuation('|', { kind: 'DirectiveDef' });\n        t.value('Enum', 'ENUM_VALUE', { kind: 'DirectiveLocation' });\n\n        t.eol();\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/__tests__/OnlineParserUtils.ts",
    "content": "import OnlineParser from '../onlineParser';\nimport CharacterStream from '../CharacterStream';\nimport { RuleKind } from '../types';\n\nconst tokenTypeMap = {\n  Number: 'number',\n  String: 'string',\n  Boolean: 'builtin',\n  Null: 'keyword',\n  Enum: 'string-2',\n};\n\nconst typesMap = {\n  ID: { value: '\"1\"', kind: 'StringValue', valueType: 'String' },\n  Int: { value: '1', kind: 'NumberValue', valueType: 'Number' },\n  Float: { value: '1.0', kind: 'NumberValue', valueType: 'Number' },\n  String: { value: '\"abc\"', kind: 'StringValue', valueType: 'String' },\n  Boolean: { value: 'true', kind: 'BooleanValue', valueType: 'Boolean' },\n  Enum: { value: 'ADMIN', kind: 'EnumValue', valueType: 'Enum' },\n  Null: { value: 'null', kind: 'NullValue', valueType: 'Null' },\n};\n\ntype TokenAssertArgs = {\n  pattern: string;\n  kind?: RuleKind;\n  type: RuleKind;\n  eatSpace: boolean;\n};\n\ntype SimpleRules =\n  | 'keyword'\n  | 'name'\n  | 'property'\n  | 'qualifier'\n  | 'variable'\n  | 'meta'\n  | 'def'\n  | 'punctuation'\n  | 'attribute';\n\ntype SimpleRuleAssertOptions = {\n  kind?: RuleKind | string;\n};\n\ntype SimpleRule = (\n  pattern: string | RegExp,\n  options?: SimpleRuleAssertOptions,\n) => void;\n\ntype IAssertRules = {\n  [name in SimpleRules]: SimpleRule;\n} & {\n  token: (args: TokenAssertArgs) => void;\n  value: (\n    kind: RuleKind | string,\n    pattern: string,\n    options?: { kind?: RuleKind | string },\n  ) => void;\n  eol: (eatSpace?: boolean) => void;\n};\n\ntype Utils = { t: IAssertRules; stream?: CharacterStream };\n\ntype Args = { name?: string; onKind?: RuleKind; args?: any[]; vars?: any[] };\n\nexport const getUtils = (source: string) => {\n  const parser = OnlineParser();\n  const stream = new CharacterStream(source);\n  const state = parser.startState();\n\n  const token = (_stream = stream, _state = state) =>\n    parser.token(_stream, _state);\n\n  const t: IAssertRules = {\n    token(\n      { pattern, type, kind = state.kind, eatSpace = true }: TokenAssertArgs,\n      fn = token,\n    ) {\n      if (eatSpace) {\n        stream.eatSpace();\n      }\n\n      expect(Boolean(stream.match(pattern, false))).toEqual(true);\n      expect(fn()).toEqual(type);\n      expect(state.kind).toEqual(kind);\n    },\n    keyword(pattern, options = {}) {\n      this.token({ pattern, type: 'keyword', kind: options.kind });\n    },\n    name(pattern, options = {}) {\n      this.token({ pattern, type: 'atom', kind: options.kind });\n    },\n    property(pattern, options = {}) {\n      this.token({ pattern, type: 'property', kind: options.kind });\n    },\n    qualifier(pattern, options = {}) {\n      this.token({ pattern, type: 'qualifier', kind: options.kind });\n    },\n    variable(pattern, options = {}) {\n      this.token({ pattern, type: 'variable', kind: options.kind });\n    },\n    meta(pattern, options = {}) {\n      this.token({ pattern, type: 'meta', kind: options.kind });\n    },\n    def(pattern, options = {}) {\n      this.token({ pattern, type: 'def', kind: options.kind });\n    },\n    punctuation(pattern, options = {}) {\n      this.token({ pattern, type: 'punctuation', kind: options.kind });\n    },\n    attribute(pattern, options = {}) {\n      this.token({ pattern, type: 'attribute', kind: options.kind });\n    },\n    value(kind, pattern, options) {\n      this.token({ pattern, type: tokenTypeMap[kind], kind: options.kind });\n    },\n    eol(eatSpace = true) {\n      if (eatSpace) {\n        stream.eatSpace();\n      }\n\n      expect(stream.eol()).toEqual(true);\n    },\n  };\n\n  return { parser, token, stream, state, t };\n};\n\nexport const performForEachType = (source, test) => {\n  for (const [type, { value, kind, valueType }] of Object.entries(typesMap)) {\n    const utils = getUtils(\n      source.replaceAll('__VALUE__', value).replaceAll('__TYPE__', type),\n    );\n    test(utils, { type, value, kind, valueType });\n  }\n};\n\nexport const expectVarsDef = (\n  { t, stream }: Utils,\n  { onKind, vars = [] }: Args,\n) => {\n  t.punctuation(/\\(/, { kind: 'VariableDefinitions' });\n\n  for (const variable of vars) {\n    t.variable('$', { kind: 'Variable' });\n    t.variable(variable.name);\n    t.punctuation(':', { kind: 'VariableDefinition' });\n    t.name(variable.type, { kind: 'NamedType' });\n\n    stream.eatWhile(/(,|\\s)/);\n  }\n\n  t.punctuation(/\\)/, { kind: onKind });\n};\n\nexport const expectArgs = (\n  { t, stream }: Utils,\n  { onKind, args = [] }: Args,\n) => {\n  t.punctuation(/\\(/, { kind: 'Arguments' });\n\n  for (const arg of args) {\n    t.attribute(arg.name, { kind: 'Argument' });\n    t.punctuation(':');\n    if (arg.isVariable) {\n      t.variable('$', { kind: 'Variable' });\n      t.variable(arg.value);\n    } else {\n      if (arg.isList) {\n        t.punctuation(/\\[/, { kind: 'ListValue' });\n      }\n      t.value(arg.valueType, arg.value, { kind: arg.kind });\n      if (arg.isList) {\n        t.punctuation(/\\]/, { kind: 'Arguments' });\n      }\n    }\n\n    stream.eatWhile(/(,|\\s)/);\n  }\n\n  t.punctuation(/\\)/, { kind: onKind });\n};\n\nexport const expectDirective = (\n  utils: Utils,\n  { name, onKind, args = [] }: Args,\n) => {\n  const { t } = utils;\n  t.meta('@', { kind: 'Directive' });\n  t.meta(name);\n\n  if (args.length) {\n    expectArgs(utils, { onKind, args });\n  }\n};\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/__tests__/RuleHelpers.test.ts",
    "content": "import { opt, list, butNot, t, p } from '../RuleHelpers';\n\ndescribe('opt', () => {\n  it('returns an optional rule', () => {\n    const rule = {};\n\n    const result = opt(rule);\n\n    expect(result).toEqual({ ofRule: rule });\n  });\n});\n\ndescribe('list', () => {\n  it('returns a list of rule', () => {\n    const rule = {};\n    const separator = ',';\n\n    const result = list(rule, separator);\n\n    expect(result).toEqual({ ofRule: rule, separator, isList: true });\n  });\n});\n\ndescribe('butNot', () => {\n  const rule = {\n    match: token =>\n      token.kind === 'Name' && /^[_A-Za-z][_0-9A-Za-z]*/.test(token.value),\n  };\n\n  const exclusionRules = [\n    {\n      match: token => token.kind === 'Name' && token.value === 'Bar',\n    },\n  ];\n\n  const token = (value, kind = 'Name') => ({ value, kind });\n\n  it('returns rule which performs correct match', () => {\n    const newRule = butNot(rule, exclusionRules);\n\n    expect(newRule.match(token('Foo'))).toEqual(true);\n    expect(newRule.match(token('123Foo'))).toEqual(false);\n  });\n\n  it('returns rule which skip results from exclusion rule match', () => {\n    const newRule = butNot(rule, exclusionRules);\n\n    expect(newRule.match(token('Bar'))).toEqual(false);\n  });\n\n  it('returns rule which results in false if no original match present', () => {\n    const newRule = butNot({}, exclusionRules);\n\n    expect(newRule.match(token('a'))).toEqual(false);\n  });\n});\n\ndescribe('t', () => {\n  it('build correct rule for token of a kind', () => {\n    const rule = t('Name', 'def');\n\n    expect(rule.style).toEqual('def');\n    expect(rule.match({ kind: 'Name' })).toEqual(true);\n    expect(rule.match({ kind: 'Punctuation' })).toEqual(false);\n  });\n});\n\ndescribe('p', () => {\n  it('build correct rule for punctuation token of a value', () => {\n    const rule = p('(');\n\n    expect(rule.style).toEqual('punctuation');\n    expect(rule.match({ kind: 'Punctuation', value: '(' })).toEqual(true);\n    expect(rule.match({ kind: 'Punctuation', value: ')' })).toEqual(false);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/api.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { IPosition } from '..';\nimport {\n  CharacterStream,\n  onlineParser,\n  ContextToken,\n  State,\n  getTypeInfo,\n} from '.';\nimport { BREAK, GraphQLSchema, Kind, parse, visit } from 'graphql';\n\nexport type ParserCallbackFn = (\n  stream: CharacterStream,\n  state: State,\n  style: string,\n  index: number,\n) => void | 'BREAK';\n\n/**\n * Provides an utility function to parse a given query text and construct a\n * `token` context object.\n * A token context provides useful information about the token/style that\n * CharacterStream currently possesses, as well as the end state and style\n * of the token.\n */\nexport function runOnlineParser(\n  queryText: string,\n  callback: ParserCallbackFn,\n): ContextToken {\n  const lines = queryText.split('\\n');\n  const parser = onlineParser();\n  let state = parser.startState();\n  let style = '';\n\n  let stream: CharacterStream = new CharacterStream('');\n\n  for (let i = 0; i < lines.length; i++) {\n    stream = new CharacterStream(lines[i]);\n    while (!stream.eol()) {\n      style = parser.token(stream, state);\n      const code = callback(stream, state, style, i);\n      if (code === 'BREAK') {\n        break;\n      }\n    }\n\n    // Above while loop won't run if there is an empty line.\n    // Run the callback one more time to catch this.\n    callback(stream, state, style, i);\n\n    if (!state.kind) {\n      state = parser.startState();\n    }\n  }\n\n  return {\n    start: stream.getStartOfToken(),\n    end: stream.getCurrentPosition(),\n    string: stream.current(),\n    state,\n    style,\n  };\n}\n\nexport enum GraphQLDocumentMode {\n  TYPE_SYSTEM = 'TYPE_SYSTEM',\n  EXECUTABLE = 'EXECUTABLE',\n  UNKNOWN = 'UNKNOWN',\n}\n\nexport const TYPE_SYSTEM_KINDS: Kind[] = [\n  // TypeSystemDefinition\n  Kind.SCHEMA_DEFINITION,\n  Kind.OPERATION_TYPE_DEFINITION,\n  Kind.SCALAR_TYPE_DEFINITION,\n  Kind.OBJECT_TYPE_DEFINITION,\n  Kind.INTERFACE_TYPE_DEFINITION,\n  Kind.UNION_TYPE_DEFINITION,\n  Kind.ENUM_TYPE_DEFINITION,\n  Kind.INPUT_OBJECT_TYPE_DEFINITION,\n  Kind.DIRECTIVE_DEFINITION,\n  // TypeSystemExtension\n  Kind.SCHEMA_EXTENSION,\n  Kind.SCALAR_TYPE_EXTENSION,\n  Kind.OBJECT_TYPE_EXTENSION,\n  Kind.INTERFACE_TYPE_EXTENSION,\n  Kind.UNION_TYPE_EXTENSION,\n  Kind.ENUM_TYPE_EXTENSION,\n  Kind.INPUT_OBJECT_TYPE_EXTENSION,\n];\n\nconst getParsedMode = (sdl: string | undefined): GraphQLDocumentMode => {\n  let mode = GraphQLDocumentMode.UNKNOWN;\n  if (sdl) {\n    try {\n      visit(parse(sdl), {\n        enter(node) {\n          if (node.kind === 'Document') {\n            mode = GraphQLDocumentMode.EXECUTABLE;\n            return;\n          }\n          if (TYPE_SYSTEM_KINDS.includes(node.kind)) {\n            mode = GraphQLDocumentMode.TYPE_SYSTEM;\n            return BREAK;\n          }\n          return false;\n        },\n      });\n    } catch {\n      return mode;\n    }\n  }\n  return mode;\n};\n\nexport function getDocumentMode(\n  documentText: string,\n  uri?: string,\n): GraphQLDocumentMode {\n  if (uri?.endsWith('.graphqls')) {\n    return GraphQLDocumentMode.TYPE_SYSTEM;\n  }\n  return getParsedMode(documentText);\n}\n\n/**\n * Given a query text and a cursor position, return the context token\n */\nexport function getTokenAtPosition(\n  queryText: string,\n  cursor: IPosition,\n  offset = 0,\n): ContextToken {\n  let styleAtCursor = null;\n  let stateAtCursor = null;\n  let stringAtCursor = null;\n  const token = runOnlineParser(queryText, (stream, state, style, index) => {\n    if (\n      index !== cursor.line ||\n      stream.getCurrentPosition() + offset < cursor.character + 1\n    ) {\n      return;\n    }\n    styleAtCursor = style;\n    stateAtCursor = { ...state };\n    stringAtCursor = stream.current();\n    return 'BREAK';\n  });\n\n  // Return the state/style of parsed token in case those at cursor aren't\n  // available.\n  return {\n    start: token.start,\n    end: token.end,\n    string: stringAtCursor || token.string,\n    state: stateAtCursor || token.state,\n    style: styleAtCursor || token.style,\n  };\n}\n\n/**\n * Returns the token, state, typeInfo and mode at the cursor position\n * Used by getAutocompleteSuggestions\n */\nexport function getContextAtPosition(\n  queryText: string,\n  cursor: IPosition,\n  schema: GraphQLSchema,\n  contextToken?: ContextToken,\n  options?: { mode?: GraphQLDocumentMode; uri?: string },\n): {\n  token: ContextToken;\n  state: State;\n  typeInfo: ReturnType<typeof getTypeInfo>;\n  mode: GraphQLDocumentMode;\n} | null {\n  const token: ContextToken =\n    contextToken || getTokenAtPosition(queryText, cursor, 1);\n  if (!token) {\n    return null;\n  }\n\n  const state =\n    token.state.kind === 'Invalid' ? token.state.prevState : token.state;\n  if (!state) {\n    return null;\n  }\n\n  // relieve flow errors by checking if `state` exists\n\n  const typeInfo = getTypeInfo(schema, token.state);\n  const mode = options?.mode || getDocumentMode(queryText, options?.uri);\n  return {\n    token,\n    state,\n    typeInfo,\n    mode,\n  };\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/getTypeInfo.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  GraphQLSchema,\n  GraphQLEnumValue,\n  GraphQLField,\n  GraphQLInterfaceType,\n  GraphQLObjectType,\n  GraphQLArgument,\n  GraphQLEnumType,\n  GraphQLInputObjectType,\n  GraphQLList,\n  getNamedType,\n  getNullableType,\n  SchemaMetaFieldDef,\n  GraphQLType,\n  TypeMetaFieldDef,\n  TypeNameMetaFieldDef,\n  isCompositeType,\n} from 'graphql';\n\nimport { AllTypeInfo } from '../types';\n\nimport { State, RuleKinds } from '.';\n\n// Gets the field definition given a type and field name\nexport function getFieldDef(\n  schema: GraphQLSchema,\n  type: GraphQLType,\n  fieldName: string,\n): GraphQLField<any, any> | null | undefined {\n  if (fieldName === SchemaMetaFieldDef.name && schema.getQueryType() === type) {\n    return SchemaMetaFieldDef;\n  }\n  if (fieldName === TypeMetaFieldDef.name && schema.getQueryType() === type) {\n    return TypeMetaFieldDef;\n  }\n  if (fieldName === TypeNameMetaFieldDef.name && isCompositeType(type)) {\n    return TypeNameMetaFieldDef;\n  }\n  if ('getFields' in type) {\n    return type.getFields()[fieldName] as any;\n  }\n\n  return null;\n}\n\n// Utility for iterating through a CodeMirror parse state stack bottom-up.\nexport function forEachState(\n  stack: State,\n  fn: (state: State) => AllTypeInfo | null | void,\n): void {\n  const reverseStateStack = [];\n  let state: State | null | undefined = stack;\n  while (state?.kind) {\n    reverseStateStack.push(state);\n    state = state.prevState;\n  }\n  for (let i = reverseStateStack.length - 1; i >= 0; i--) {\n    fn(reverseStateStack[i]);\n  }\n}\n\n// Utility for returning the state representing the Definition this token state\n// is within, if any.\nexport function getDefinitionState(\n  tokenState: State,\n): State | null | undefined {\n  let definitionState;\n\n  // TODO - couldn't figure this one out\n  forEachState(tokenState, (state: State): void => {\n    switch (state.kind) {\n      case 'Query':\n      case 'ShortQuery':\n      case 'Mutation':\n      case 'Subscription':\n      case 'FragmentDefinition':\n        definitionState = state;\n        break;\n    }\n  });\n\n  return definitionState;\n}\n\n// Utility for collecting rich type information given any token's state\n// from the graphql-mode parser.\nexport function getTypeInfo(\n  schema: GraphQLSchema,\n  tokenState: State,\n): AllTypeInfo {\n  let argDef: AllTypeInfo['argDef'];\n  let argDefs: AllTypeInfo['argDefs'];\n  let directiveDef: AllTypeInfo['directiveDef'];\n  let enumValue: AllTypeInfo['enumValue'];\n  let fieldDef: AllTypeInfo['fieldDef'];\n  let inputType: AllTypeInfo['inputType'];\n  let objectTypeDef: AllTypeInfo['objectTypeDef'];\n  let objectFieldDefs: AllTypeInfo['objectFieldDefs'];\n  let parentType: AllTypeInfo['parentType'];\n  let type: AllTypeInfo['type'];\n  let interfaceDef: AllTypeInfo['interfaceDef'];\n  forEachState(tokenState, state => {\n    switch (state.kind) {\n      case RuleKinds.QUERY:\n      case 'ShortQuery':\n        type = schema.getQueryType();\n        break;\n      case RuleKinds.MUTATION:\n        type = schema.getMutationType();\n        break;\n      case RuleKinds.SUBSCRIPTION:\n        type = schema.getSubscriptionType();\n        break;\n      case RuleKinds.INLINE_FRAGMENT:\n      case RuleKinds.FRAGMENT_DEFINITION:\n        if (state.type) {\n          type = schema.getType(state.type);\n        }\n        break;\n      case RuleKinds.FIELD:\n      case RuleKinds.ALIASED_FIELD: {\n        if (!type || !state.name) {\n          fieldDef = null;\n        } else {\n          fieldDef = parentType\n            ? getFieldDef(schema, parentType, state.name)\n            : null;\n          type = fieldDef ? fieldDef.type : null;\n        }\n        break;\n      }\n      case RuleKinds.SELECTION_SET:\n        parentType = getNamedType(type!);\n        break;\n      case RuleKinds.DIRECTIVE:\n        directiveDef = state.name ? schema.getDirective(state.name) : null;\n        break;\n\n      case RuleKinds.INTERFACE_DEF:\n        if (state.name) {\n          objectTypeDef = null;\n          interfaceDef = new GraphQLInterfaceType({\n            name: state.name,\n            interfaces: [],\n            fields: {},\n          });\n        }\n\n        break;\n\n      case RuleKinds.OBJECT_TYPE_DEF:\n        if (state.name) {\n          interfaceDef = null;\n          objectTypeDef = new GraphQLObjectType({\n            name: state.name,\n            interfaces: [],\n            fields: {},\n          });\n        }\n\n        break;\n      case RuleKinds.ARGUMENTS: {\n        if (state.prevState) {\n          switch (state.prevState.kind) {\n            case RuleKinds.FIELD:\n              argDefs = fieldDef && (fieldDef.args as GraphQLArgument[]);\n              break;\n            case RuleKinds.DIRECTIVE:\n              argDefs =\n                directiveDef && (directiveDef.args as GraphQLArgument[]);\n              break;\n            // TODO: needs more tests\n            case RuleKinds.ALIASED_FIELD: {\n              const name = state.prevState?.name;\n              if (!name) {\n                argDefs = null;\n                break;\n              }\n              const field = parentType\n                ? getFieldDef(schema, parentType, name)\n                : null;\n              if (!field) {\n                argDefs = null;\n                break;\n              }\n              argDefs = field.args as GraphQLArgument[];\n              break;\n            }\n            default:\n              argDefs = null;\n              break;\n          }\n        } else {\n          argDefs = null;\n        }\n        break;\n      }\n      case RuleKinds.ARGUMENT:\n        if (argDefs) {\n          for (let i = 0; i < argDefs.length; i++) {\n            if (argDefs[i].name === state.name) {\n              argDef = argDefs[i];\n              break;\n            }\n          }\n        }\n        inputType = argDef?.type;\n        break;\n      case RuleKinds.VARIABLE_DEFINITION:\n      case RuleKinds.VARIABLE:\n        type = inputType;\n        break;\n      // TODO: needs tests\n      case RuleKinds.ENUM_VALUE:\n        const enumType = getNamedType(inputType!);\n        enumValue =\n          enumType instanceof GraphQLEnumType\n            ? enumType\n                .getValues()\n                .find((val: GraphQLEnumValue) => val.value === state.name)\n            : null;\n        break;\n      // TODO: needs tests\n      case RuleKinds.LIST_VALUE:\n        const nullableType = getNullableType(inputType!);\n        inputType =\n          nullableType instanceof GraphQLList ? nullableType.ofType : null;\n        break;\n      case RuleKinds.OBJECT_VALUE:\n        const objectType = getNamedType(inputType!);\n        objectFieldDefs =\n          objectType instanceof GraphQLInputObjectType\n            ? objectType.getFields()\n            : null;\n        break;\n      // TODO: needs tests\n      case RuleKinds.OBJECT_FIELD:\n        const objectField =\n          state.name && objectFieldDefs ? objectFieldDefs[state.name] : null;\n        inputType = objectField?.type;\n        // @ts-expect-error\n        fieldDef = objectField as GraphQLField<null, null>;\n        type = fieldDef ? fieldDef.type : null;\n        break;\n      case RuleKinds.NAMED_TYPE:\n        if (state.name) {\n          type = schema.getType(state.name);\n        }\n        // TODO: collect already extended interfaces of the type/interface we're extending\n        //  here to eliminate them from the completion list\n        // because \"type A extends B & C &\" should not show completion options for B & C still.\n\n        break;\n    }\n  });\n\n  return {\n    argDef,\n    argDefs,\n    directiveDef,\n    enumValue,\n    fieldDef,\n    inputType,\n    objectFieldDefs,\n    parentType,\n    type,\n    interfaceDef,\n    objectTypeDef,\n  };\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/index.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nexport { default as CharacterStream } from './CharacterStream';\n\nexport { LexRules, ParseRules, isIgnored } from './Rules';\n\nexport { butNot, list, opt, p, t } from './RuleHelpers';\n\nexport { default as onlineParser, ParserOptions } from './onlineParser';\n\nexport {\n  runOnlineParser,\n  type ParserCallbackFn,\n  getTokenAtPosition,\n  getContextAtPosition,\n  GraphQLDocumentMode,\n  getDocumentMode,\n} from './api';\n\nexport { getTypeInfo, getDefinitionState, getFieldDef } from './getTypeInfo';\n\nexport * from './types';\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/onlineParser.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Builds an online immutable parser, designed to be used as part of a syntax\n * highlighting and code intelligence tools.\n *\n * Options:\n *\n *     eatWhitespace: (\n *       stream: Stream | CodeMirror.StringStream | CharacterStream\n *     ) => boolean\n *       Use CodeMirror API.\n *\n *     LexRules: { [name: string]: RegExp }, Includes `Punctuation`, `Comment`.\n *\n *     ParseRules: { [name: string]: Array<Rule> }, Includes `Document`.\n *\n *     editorConfig: { [name: string]: any }, Provides an editor-specific\n *       configurations set.\n *\n */\n\nimport CharacterStream from './CharacterStream';\nimport { State, Token, Rule, RuleKind } from './types';\n\nimport { LexRules, ParseRules, isIgnored } from './Rules';\nimport { Kind } from 'graphql';\n\nexport type ParserOptions = {\n  eatWhitespace: (stream: CharacterStream) => boolean;\n  lexRules: Partial<typeof LexRules>;\n  parseRules: typeof ParseRules;\n  editorConfig: { [name: string]: any };\n};\n\nexport default function onlineParser(\n  options: ParserOptions = {\n    eatWhitespace: stream => stream.eatWhile(isIgnored),\n    lexRules: LexRules,\n    parseRules: ParseRules,\n    editorConfig: {},\n  },\n): {\n  startState: () => State;\n  token: (stream: CharacterStream, state: State) => string;\n} {\n  return {\n    startState() {\n      const initialState = {\n        level: 0,\n        step: 0,\n        name: null,\n        kind: null,\n        type: null,\n        rule: null,\n        needsSeparator: false,\n        prevState: null,\n      };\n\n      pushRule(options.parseRules, initialState, Kind.DOCUMENT);\n      return initialState;\n    },\n    token(stream: CharacterStream, state: State) {\n      return getToken(stream, state, options);\n    },\n  };\n}\n\nfunction getToken(\n  stream: CharacterStream,\n  state: State,\n  options: ParserOptions,\n): string {\n  if (state.inBlockstring) {\n    // eslint-disable-next-line unicorn/prefer-regexp-test -- false positive stream is not string\n    if (stream.match(/.*\"\"\"/)) {\n      state.inBlockstring = false;\n      return 'string';\n    }\n    stream.skipToEnd();\n    return 'string';\n  }\n\n  const { lexRules, parseRules, eatWhitespace, editorConfig } = options;\n  // Restore state after an empty-rule.\n  if (state.rule && state.rule.length === 0) {\n    popRule(state);\n  } else if (state.needsAdvance) {\n    state.needsAdvance = false;\n    advanceRule(state, true);\n  }\n\n  // Remember initial indentation\n  if (stream.sol()) {\n    const tabSize = editorConfig?.tabSize || 2;\n    state.indentLevel = Math.floor(stream.indentation() / tabSize);\n  }\n\n  // Consume spaces and ignored characters\n  if (eatWhitespace(stream)) {\n    return 'ws';\n  }\n\n  // Get a matched token from the stream, using lex\n  const token = lex(lexRules, stream);\n\n  // If there's no matching token, skip ahead.\n  if (!token) {\n    const matchedSomething = stream.match(/\\S+/);\n    if (!matchedSomething) {\n      // We need to eat at least one character, and we couldn't match any\n      // non-whitespace, so it must be exotic whitespace.\n      stream.match(/\\s/);\n    }\n    pushRule(SpecialParseRules, state, 'Invalid');\n    return 'invalidchar';\n  }\n\n  // If the next token is a Comment, insert a Comment parsing rule.\n  if (token.kind === 'Comment') {\n    pushRule(SpecialParseRules, state, 'Comment');\n    return 'comment';\n  }\n\n  // Save state before continuing.\n  const backupState = assign({}, state);\n\n  // Handle changes in expected indentation level\n  if (token.kind === 'Punctuation') {\n    if (/^[{([]/.test(token.value)) {\n      if (state.indentLevel !== undefined) {\n        // Push on the stack of levels one level deeper than the current level.\n        state.levels = (state.levels || []).concat(state.indentLevel + 1);\n      }\n    } else if (/^[})\\]]/.test(token.value)) {\n      // Pop from the stack of levels.\n      // If the top of the stack is lower than the current level, lower the\n      // current level to match.\n      const levels = (state.levels = (state.levels || []).slice(0, -1));\n      // FIXME\n      // what if state.indentLevel === 0?\n      if (\n        state.indentLevel &&\n        levels.length > 0 &&\n        levels.at(-1)! < state.indentLevel\n      ) {\n        state.indentLevel = levels.at(-1);\n      }\n    }\n  }\n\n  while (state.rule) {\n    // If this is a forking rule, determine what rule to use based on\n    // the current token, otherwise expect based on the current step.\n    let expected: any =\n      typeof state.rule === 'function'\n        ? state.step === 0\n          ? state.rule(token, stream)\n          : null\n        : state.rule[state.step];\n\n    // Separator between list elements if necessary.\n    if (state.needsSeparator) {\n      expected = expected?.separator;\n    }\n\n    if (expected) {\n      // Un-wrap optional/list parseRules.\n      if (expected.ofRule) {\n        expected = expected.ofRule;\n      }\n\n      // A string represents a Rule\n      if (typeof expected === 'string') {\n        pushRule(parseRules, state, expected as RuleKind);\n        continue;\n      }\n\n      // Otherwise, match a Terminal.\n      if (expected.match?.(token)) {\n        if (expected.update) {\n          expected.update(state, token);\n        }\n\n        // If this token was a punctuator, advance the parse rule, otherwise\n        // mark the state to be advanced before the next token. This ensures\n        // that tokens which can be appended to keep the appropriate state.\n        if (token.kind === 'Punctuation') {\n          advanceRule(state, true);\n        } else {\n          state.needsAdvance = true;\n        }\n\n        return expected.style;\n      }\n    }\n    unsuccessful(state);\n  }\n\n  // The parser does not know how to interpret this token, do not affect state.\n  assign(state, backupState);\n  pushRule(SpecialParseRules, state, 'Invalid');\n  return 'invalidchar';\n}\n\n// Utility function to assign from object to another object.\nfunction assign(to: object, from: object): object {\n  const keys = Object.keys(from);\n  for (let i = 0; i < keys.length; i++) {\n    // @ts-ignore\n    // TODO: ParseRules as numerical index\n    to[keys[i]] = from[keys[i]];\n  }\n  return to;\n}\n\n// A special rule set for parsing comment tokens.\nconst SpecialParseRules = {\n  Invalid: [],\n  Comment: [],\n};\n\n// Push a new rule onto the state.\nfunction pushRule(\n  rules: typeof ParseRules,\n  state: State,\n  ruleKind: RuleKind,\n): void {\n  if (!rules[ruleKind]) {\n    throw new TypeError('Unknown rule: ' + ruleKind);\n  }\n  state.prevState = { ...state };\n  state.kind = ruleKind;\n  state.name = null;\n  state.type = null;\n  state.rule = rules[ruleKind];\n  state.step = 0;\n  state.needsSeparator = false;\n}\n\n// Pop the current rule from the state.\nfunction popRule(state: State): undefined {\n  // Check if there's anything to pop\n  if (!state.prevState) {\n    return;\n  }\n  state.kind = state.prevState.kind;\n  state.name = state.prevState.name;\n  state.type = state.prevState.type;\n  state.rule = state.prevState.rule;\n  state.step = state.prevState.step;\n  state.needsSeparator = state.prevState.needsSeparator;\n  state.prevState = state.prevState.prevState;\n}\n\n// Advance the step of the current rule.\nfunction advanceRule(state: State, successful: boolean): undefined {\n  // If this is advancing successfully and the current state is a list, give\n  // it an opportunity to repeat itself.\n  if (isList(state) && state.rule) {\n    // @ts-ignore\n    // TODO: ParseRules as numerical index\n    const step = state.rule[state.step];\n    if (step.separator) {\n      const { separator } = step;\n      state.needsSeparator = !state.needsSeparator;\n      // If the separator was optional, then give it an opportunity to repeat.\n      if (!state.needsSeparator && separator.ofRule) {\n        return;\n      }\n    }\n    // If this was a successful list parse, then allow it to repeat itself.\n    if (successful) {\n      return;\n    }\n  }\n\n  // Advance the step in the rule. If the rule is completed, pop\n  // the rule and advance the parent rule as well (recursively).\n  state.needsSeparator = false;\n  state.step++;\n\n  // While the current rule is completed.\n  while (\n    state.rule &&\n    !(Array.isArray(state.rule) && state.step < state.rule.length)\n  ) {\n    popRule(state);\n\n    if (state.rule) {\n      // Do not advance a List step so it has the opportunity to repeat itself.\n      if (isList(state)) {\n        // @ts-ignore\n        // TODO: ParseRules as numerical index\n        if (state.rule?.[state.step].separator) {\n          state.needsSeparator = !state.needsSeparator;\n        }\n      } else {\n        state.needsSeparator = false;\n        state.step++;\n      }\n    }\n  }\n}\n\nfunction isList(state: State): boolean | null | undefined {\n  const step =\n    Array.isArray(state.rule) &&\n    typeof state.rule[state.step] !== 'string' &&\n    (state.rule[state.step] as Rule);\n  return step && step.isList;\n}\n\n// Unwind the state after an unsuccessful match.\nfunction unsuccessful(state: State): void {\n  // Fall back to the parent rule until you get to an optional or list rule or\n  // until the entire stack of rules is empty.\n  while (\n    state.rule &&\n    // TODO: not sure how to fix this in a performant way\n    // @ts-ignore\n    !(Array.isArray(state.rule) && state.rule[state.step].ofRule)\n  ) {\n    popRule(state);\n  }\n\n  // If there is still a rule, it must be an optional or list rule.\n  // Consider this rule a success so that we may move past it.\n  if (state.rule) {\n    advanceRule(state, false);\n  }\n}\n\n// Given a stream, returns a { kind, value } pair, or null.\nfunction lex(\n  lexRules: Partial<typeof LexRules>,\n  stream: CharacterStream,\n): Token | null | undefined {\n  const kinds = Object.keys(lexRules);\n  for (let i = 0; i < kinds.length; i++) {\n    // @ts-ignore\n    // TODO: ParseRules as numerical index\n    const match = stream.match(lexRules[kinds[i]]);\n    if (match && match instanceof Array) {\n      return { kind: kinds[i], value: match[0] };\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/parser/types.ts",
    "content": "import { Kind } from 'graphql';\nimport { Maybe } from '../types';\nimport CharacterStream from './CharacterStream';\n\nexport type ContextToken = {\n  start: number;\n  end: number;\n  string: string;\n  state: State;\n  style?: string;\n};\n\nexport type ContextTokenForCodeMirror = {\n  start: number;\n  end: number;\n  string: string;\n  type: string | null;\n  state: State;\n};\n\nexport type ContextTokenUnion = ContextToken | ContextTokenForCodeMirror;\n\nexport type RuleOrString = Rule | string;\n\nexport type ParseRule =\n  | RuleOrString[]\n  | ((token: Token, stream: CharacterStream) => string | null | void);\n\nexport type Token = {\n  kind: string;\n  value: string;\n};\n\nexport type Rule = {\n  style?: string;\n  match?: (token: Token) => boolean;\n  update?: (state: State, token: Token) => void;\n  separator?: string | Rule;\n  isList?: boolean;\n  ofRule?: Rule | string;\n};\n\nexport type State = {\n  level: number;\n  levels?: number[];\n  prevState: Maybe<State>;\n  rule: Maybe<ParseRule>;\n  kind: Maybe<RuleKind>;\n  name: Maybe<string>;\n  type: Maybe<string>;\n  step: number;\n  needsSeparator: boolean;\n  needsAdvance?: boolean;\n  indentLevel?: number;\n  inBlockstring?: boolean;\n};\n\nexport const AdditionalRuleKinds: _AdditionalRuleKinds = {\n  ALIASED_FIELD: 'AliasedField',\n  ARGUMENTS: 'Arguments',\n  SHORT_QUERY: 'ShortQuery',\n  QUERY: 'Query',\n  MUTATION: 'Mutation',\n  SUBSCRIPTION: 'Subscription',\n  TYPE_CONDITION: 'TypeCondition',\n  INVALID: 'Invalid',\n  COMMENT: 'Comment',\n  SCHEMA_DEF: 'SchemaDef',\n  SCALAR_DEF: 'ScalarDef',\n  OBJECT_TYPE_DEF: 'ObjectTypeDef',\n  OBJECT_VALUE: 'ObjectValue',\n  LIST_VALUE: 'ListValue',\n  INTERFACE_DEF: 'InterfaceDef',\n  UNION_DEF: 'UnionDef',\n  ENUM_DEF: 'EnumDef',\n  ENUM_VALUE: 'EnumValue',\n  FIELD_DEF: 'FieldDef',\n  INPUT_DEF: 'InputDef',\n  INPUT_VALUE_DEF: 'InputValueDef',\n  ARGUMENTS_DEF: 'ArgumentsDef',\n  EXTEND_DEF: 'ExtendDef',\n  EXTENSION_DEFINITION: 'ExtensionDefinition',\n  DIRECTIVE_DEF: 'DirectiveDef',\n  IMPLEMENTS: 'Implements',\n  VARIABLE_DEFINITIONS: 'VariableDefinitions',\n  TYPE: 'Type',\n  VARIABLE: 'Variable',\n};\n\nexport type _AdditionalRuleKinds = {\n  ALIASED_FIELD: 'AliasedField';\n  ARGUMENTS: 'Arguments';\n  SHORT_QUERY: 'ShortQuery';\n  QUERY: 'Query';\n  MUTATION: 'Mutation';\n  SUBSCRIPTION: 'Subscription';\n  TYPE_CONDITION: 'TypeCondition';\n  INVALID: 'Invalid';\n  COMMENT: 'Comment';\n  SCHEMA_DEF: 'SchemaDef';\n  SCALAR_DEF: 'ScalarDef';\n  OBJECT_TYPE_DEF: 'ObjectTypeDef';\n  OBJECT_VALUE: 'ObjectValue';\n  LIST_VALUE: 'ListValue';\n  INTERFACE_DEF: 'InterfaceDef';\n  UNION_DEF: 'UnionDef';\n  ENUM_DEF: 'EnumDef';\n  ENUM_VALUE: 'EnumValue';\n  FIELD_DEF: 'FieldDef';\n  INPUT_DEF: 'InputDef';\n  INPUT_VALUE_DEF: 'InputValueDef';\n  ARGUMENTS_DEF: 'ArgumentsDef';\n  EXTEND_DEF: 'ExtendDef';\n  EXTENSION_DEFINITION: 'ExtensionDefinition';\n  DIRECTIVE_DEF: 'DirectiveDef';\n  IMPLEMENTS: 'Implements';\n  VARIABLE_DEFINITIONS: 'VariableDefinitions';\n  TYPE: 'Type';\n  VARIABLE: 'Variable';\n};\n\nexport const RuleKinds = {\n  ...Kind,\n  ...AdditionalRuleKinds,\n};\n\nexport type _RuleKinds = Omit<typeof Kind, 'VARIABLE'> &\n  typeof AdditionalRuleKinds;\n\nexport type RuleKind = _RuleKinds[keyof _RuleKinds];\nexport type RuleKindEnum = RuleKind;\nexport type TokenPattern = string | ((char: string) => boolean) | RegExp;\n\nexport interface CharacterStreamInterface {\n  getStartOfToken: () => number;\n  getCurrentPosition: () => number;\n  eol: () => boolean;\n  sol: () => boolean;\n  peek: () => string | null;\n  next: () => string;\n  eat: (pattern: TokenPattern) => string | undefined;\n  eatWhile: (match: TokenPattern) => boolean;\n  eatSpace: () => boolean;\n  skipToEnd: () => void;\n  skipTo: (position: number) => void;\n  match: (\n    pattern: TokenPattern,\n    consume?: Maybe<boolean>,\n    caseFold?: Maybe<boolean>,\n  ) => string[] | boolean;\n  backUp: (num: number) => void;\n  column: () => number;\n  indentation: () => number;\n  current: () => string;\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/temp-bin.ts",
    "content": "#!/bin/node\n'use strict';\n\nfunction bright(str: string) {\n  return `\\x1b[1m${str}\\x1b[0m`;\n}\n\nfunction yellow(str: string) {\n  return `\\x1b[33m${str}\\x1b[0m`;\n}\n\nprocess.stderr.write(`\n  ${bright(yellow('WARNING!'))}\n\n  ${bright('graphql-language-service')} command line interface has been moved to\n\n  ${bright('graphql-language-service-cli')}\n\n  as of version 3.0.0\n\n  \n  ${bright('Re-Installation:')}\n\n  yarn:\n    ${bright('yarn global remove graphql-language-service')}\n    ${bright('yarn global add graphql-language-service-cli')}\n\n  npm:\n    ${bright('npm uninstall -g graphql-language-service')}\n    ${bright('npm i -g graphql-language-service-cli')}\n\n\n  ${bright('New Binary Path:')}\n\n  the executable will now be available as ${bright(\n    'graphql-lsp',\n  )} instead of ${bright('graphql')}\n\n`);\n"
  },
  {
    "path": "packages/graphql-language-service/src/types.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\nimport type {\n  Diagnostic as DiagnosticType,\n  CompletionItem as CompletionItemType,\n} from 'vscode-languageserver-types';\n\nexport { InsertTextFormat } from 'vscode-languageserver-types';\n\nimport type {\n  ASTNode,\n  GraphQLSchema,\n  DocumentNode,\n  FragmentDefinitionNode,\n  NamedTypeNode,\n  TypeDefinitionNode,\n  NameNode,\n  GraphQLArgument,\n  GraphQLEnumValue,\n  GraphQLField,\n  GraphQLInputFieldMap,\n  GraphQLInterfaceType,\n  GraphQLObjectType,\n  GraphQLType,\n  GraphQLDirective,\n} from 'graphql';\n\nexport type Maybe<T> = T | null | undefined;\n\nimport type {\n  GraphQLConfig,\n  GraphQLProjectConfig,\n  GraphQLExtensionDeclaration,\n} from 'graphql-config';\n\nexport { GraphQLDocumentMode } from './parser';\n\nexport type {\n  GraphQLConfig,\n  GraphQLProjectConfig,\n  GraphQLExtensionDeclaration,\n};\n\nexport interface GraphQLCache {\n  getGraphQLConfig: () => GraphQLConfig;\n\n  getProjectForFile: (uri: string) => GraphQLProjectConfig | void;\n\n  getObjectTypeDependenciesForAST: (\n    parsedQuery: ASTNode,\n    fragmentDefinitions: Map<string, ObjectTypeInfo>,\n  ) => Promise<ObjectTypeInfo[]>;\n\n  getObjectTypeDefinitions: (\n    graphQLConfig: GraphQLProjectConfig,\n  ) => Promise<Map<string, ObjectTypeInfo>>;\n\n  updateObjectTypeDefinition: (\n    rootDir: Uri,\n    filePath: Uri,\n    contents: CachedContent[],\n  ) => Promise<void>;\n\n  getFragmentDependencies: (\n    query: string,\n    fragmentDefinitions: Maybe<Map<string, FragmentInfo>>,\n  ) => Promise<FragmentInfo[]>;\n\n  getFragmentDependenciesForAST: (\n    parsedQuery: ASTNode,\n    fragmentDefinitions: Map<string, FragmentInfo>,\n  ) => Promise<FragmentInfo[]>;\n\n  getFragmentDefinitions: (\n    graphQLConfig: GraphQLProjectConfig,\n  ) => Promise<Map<string, FragmentInfo>>;\n\n  updateFragmentDefinition: (\n    rootDir: Uri,\n    filePath: Uri,\n    contents: CachedContent[],\n  ) => Promise<void>;\n  getSchema: (\n    appName: string,\n    queryHasExtensions?: boolean,\n  ) => Promise<GraphQLSchema | null>;\n}\n\n// online-parser related\nexport interface IPosition {\n  line: number;\n  character: number;\n  setLine(line: number): void;\n  setCharacter(character: number): void;\n  lessThanOrEqualTo(position: IPosition): boolean;\n}\n\nexport interface IRange {\n  start: IPosition;\n  end: IPosition;\n  setEnd(line: number, character: number): void;\n  setStart(line: number, character: number): void;\n  containsPosition(position: IPosition): boolean;\n}\nexport type CachedContent = {\n  query: string;\n  range: IRange | null;\n};\n\n// GraphQL Language Service related types\nexport type Uri = string;\n\nexport type GraphQLFileMetadata = {\n  filePath: Uri;\n  size: number;\n  mtime: number;\n};\n\nexport type GraphQLFileInfo = {\n  filePath: Uri;\n  content: string;\n  asts: DocumentNode[];\n  queries: CachedContent[];\n  size: number;\n  mtime: number;\n};\n\nexport type AllTypeInfo = {\n  type: Maybe<GraphQLType>;\n  parentType: Maybe<GraphQLType>;\n  inputType: Maybe<GraphQLType>;\n  directiveDef: Maybe<GraphQLDirective>;\n  fieldDef: Maybe<GraphQLField<any, any>>;\n  enumValue: Maybe<GraphQLEnumValue>;\n  argDef: Maybe<GraphQLArgument>;\n  argDefs: Maybe<GraphQLArgument[]>;\n  objectFieldDefs: Maybe<GraphQLInputFieldMap>;\n  interfaceDef: Maybe<GraphQLInterfaceType>;\n  objectTypeDef: Maybe<GraphQLObjectType>;\n};\n\nexport type FragmentInfo = {\n  filePath?: Uri;\n  content: string;\n  definition: FragmentDefinitionNode;\n};\n\nexport type NamedTypeInfo = {\n  filePath?: Uri;\n  content: string;\n  definition: NamedTypeNode;\n};\n\nexport type ObjectTypeInfo = {\n  filePath?: Uri;\n  content: string;\n  definition: TypeDefinitionNode;\n};\n\nexport type Diagnostic = DiagnosticType;\n\nexport type CompletionItemBase = {\n  label: string;\n  isDeprecated?: boolean;\n};\n\nexport type CompletionItem = CompletionItemType & {\n  isDeprecated?: boolean;\n  documentation?: string | null;\n  deprecationReason?: string | null;\n  type?: GraphQLType;\n  command?: CompletionItemType['command'];\n  // if label differs from what should be inserted\n  rawInsert?: string;\n};\n// Below are basically a copy-paste from Nuclide rpc types for definitions.\n\n// Definitions/hyperlink\nexport type Definition = {\n  path: Uri;\n  position: IPosition;\n  range?: IRange;\n  id?: string;\n  name?: string;\n  language?: string;\n  projectRoot?: Uri;\n  locator?: string;\n};\n\n// Outline view\nexport type TokenKind =\n  | 'keyword'\n  | 'class-name'\n  | 'constructor'\n  | 'method'\n  | 'param'\n  | 'string'\n  | 'whitespace'\n  | 'plain'\n  | 'type';\nexport type TextToken = {\n  kind: TokenKind;\n  value: string | NameNode;\n};\n\nexport type TokenizedText = TextToken[];\nexport type OutlineTree = {\n  // Must be one or the other. If both are present, tokenizedText is preferred.\n  plainText?: string;\n  tokenizedText?: TokenizedText;\n  representativeName?: string;\n  kind: string;\n  startPosition: IPosition;\n  endPosition?: IPosition;\n  children: OutlineTree[];\n};\n\nexport type Outline = {\n  outlineTrees: OutlineTree[];\n};\n\nexport interface FileEvent {\n  uri: string;\n  type: FileChangeType;\n}\n\nexport const FileChangeTypeKind = {\n  Created: 1,\n  Changed: 2,\n  Deleted: 3,\n};\n\nexport type FileChangeTypeKind = {\n  Created: 1;\n  Changed: 2;\n  Deleted: 3;\n};\n\nexport type FileChangeTypeKeys = keyof FileChangeTypeKind;\n\nexport type FileChangeType = FileChangeTypeKind[FileChangeTypeKeys];\n\n// copied from `microsoft/vscode-languageserver-types` to prevent import issues\n\n/**\n * The kind of completion entry.\n */\nexport namespace CompletionItemKind {\n  export const Text = 1;\n  export const Method = 2;\n  export const Function = 3;\n  export const Constructor = 4;\n  export const Field = 5;\n  export const Variable = 6;\n  export const Class = 7;\n  export const Interface = 8;\n  export const Module = 9;\n  export const Property = 10;\n  export const Unit = 11;\n  export const Value = 12;\n  export const Enum = 13;\n  export const Keyword = 14;\n  export const Snippet = 15;\n  export const Color = 16;\n  export const File = 17;\n  export const Reference = 18;\n  export const Folder = 19;\n  export const EnumMember = 20;\n  export const Constant = 21;\n  export const Struct = 22;\n  export const Event = 23;\n  export const Operator = 24;\n  export const TypeParameter = 25;\n}\n\nexport type CompletionItemKind =\n  | 1\n  | 2\n  | 3\n  | 4\n  | 5\n  | 6\n  | 7\n  | 8\n  | 9\n  | 10\n  | 11\n  | 12\n  | 13\n  | 14\n  | 15\n  | 16\n  | 17\n  | 18\n  | 19\n  | 20\n  | 21\n  | 22\n  | 23\n  | 24\n  | 25;\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/Range.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Location } from 'graphql';\nimport { IRange, IPosition } from '../types';\n\nexport class Range implements IRange {\n  start: IPosition;\n  end: IPosition;\n  constructor(start: IPosition, end: IPosition) {\n    this.start = start;\n    this.end = end;\n  }\n\n  setStart(line: number, character: number) {\n    this.start = new Position(line, character);\n  }\n\n  setEnd(line: number, character: number) {\n    this.end = new Position(line, character);\n  }\n\n  containsPosition = (position: IPosition): boolean => {\n    if (this.start.line === position.line) {\n      return this.start.character <= position.character;\n    }\n    if (this.end.line === position.line) {\n      return this.end.character >= position.character;\n    }\n    return this.start.line <= position.line && this.end.line >= position.line;\n  };\n}\n\nexport class Position implements IPosition {\n  line: number;\n  character: number;\n  constructor(line: number, character: number) {\n    this.line = line;\n    this.character = character;\n  }\n\n  setLine(line: number) {\n    this.line = line;\n  }\n\n  setCharacter(character: number) {\n    this.character = character;\n  }\n\n  lessThanOrEqualTo = (position: IPosition): boolean =>\n    this.line < position.line ||\n    (this.line === position.line && this.character <= position.character);\n}\n\nexport function offsetToPosition(text: string, loc: number): Position {\n  const EOL = '\\n';\n  const buf = text.slice(0, loc);\n  const lines = buf.split(EOL).length - 1;\n  const lastLineIndex = buf.lastIndexOf(EOL);\n  return new Position(lines, loc - lastLineIndex - 1);\n}\n\nexport function locToRange(text: string, loc: Location): Range {\n  const start = offsetToPosition(text, loc.start);\n  const end = offsetToPosition(text, loc.end);\n  return new Range(start, end);\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/Range.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Location } from 'graphql';\nimport { Range, Position, offsetToPosition, locToRange } from '../Range';\n\nconst text = `query test {\n  name\n}`;\n\nconst absRange: Location = {\n  start: 15,\n  end: 18,\n  // @ts-ignore\n  startToken: null,\n  // @ts-ignore\n  endToken: null,\n  // @ts-ignore\n  source: null,\n}; // position of 'name' attribute in the test query\n\nconst offsetRangeStart = new Position(1, 2);\nconst offsetRangeEnd = new Position(1, 5);\n\ndescribe('Position', () => {\n  it('constructs a IPosition object', () => {\n    const pos = new Position(3, 5);\n    expect(pos).not.toBeUndefined();\n    expect(pos.character).toEqual(5);\n    expect(pos.line).toEqual(3);\n  });\n\n  it('compares IPosition objects', () => {\n    const posA = new Position(1, 2);\n    const posB = new Position(2, 2);\n    const posC = new Position(2, 3);\n    expect(posA.lessThanOrEqualTo(posB)).toEqual(true);\n    expect(posB.lessThanOrEqualTo(posC)).toEqual(true);\n    expect(posC.lessThanOrEqualTo(posA)).toEqual(false);\n  });\n});\n\ndescribe('Range', () => {\n  let start: Position;\n  let end: Position;\n  let range: Range;\n\n  beforeAll(() => {\n    start = new Position(2, 3);\n    end = new Position(2, 5);\n    range = new Range(start, end);\n  });\n\n  it('constructs a IRange object', () => {\n    expect(range).not.toBeUndefined();\n    expect(range.start).toEqual(start);\n    expect(range.end).toEqual(end);\n  });\n\n  it('checks if it contains certain position', () => {\n    const posA = new Position(2, 4);\n    const posB = new Position(3, 5);\n    expect(range.containsPosition(posA)).toEqual(true);\n    expect(range.containsPosition(posB)).toEqual(false);\n  });\n});\n\ndescribe('offsetToPosition()', () => {\n  it('returns the offset to a position', () => {\n    const position = offsetToPosition(text, absRange.start);\n    expect(position.character).toEqual(offsetRangeStart.character);\n    expect(position.line).toEqual(offsetRangeStart.line);\n  });\n});\n\ndescribe('locToRange()', () => {\n  it('returns the range for a location', () => {\n    const range = locToRange(text, absRange);\n    expect(range.start.character).toEqual(offsetRangeStart.character);\n    expect(range.start.line).toEqual(offsetRangeStart.line);\n    expect(range.end.character).toEqual(offsetRangeEnd.character);\n    expect(range.end.line).toEqual(offsetRangeEnd.line);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/__fixtures__/file.js",
    "content": "module.exports = {\n  example: true,\n};\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/__fixtures__/invalid.fake",
    "content": ""
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/__fixtures__/noextension",
    "content": ""
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/__fixtures__/package.json",
    "content": "{\n  \"name\": \"example\"\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/__schema__/RecursiveSchema.graphql",
    "content": "schema {\n  query: query_root\n}\n\ninput string_options {\n  _eq: String\n  _ilike: String\n}\n\ntype issues {\n  name: String\n}\n\ninput issues_where_input {\n  _and: [issues_where_input!]\n  name: string_options\n}\n\ntype query_root {\n  issues(where: issues_where_input): [issues!]!\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/__schema__/StarWarsSchema.graphql",
    "content": "schema {\n  query: Query\n}\n\ndirective @test(testArg: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\n\nscalar SomeCustomScalar\nscalar EmailAddress\nscalar Even\nscalar SpecialScalar\nscalar SpecialDate\nscalar FooBar\nscalar Foo\n\n\"\"\"\nAn input type with custom scalars\n\"\"\"\ninput CustomScalarsInput {\n  \"\"\"\n  example email\n  \"\"\"\n  email: EmailAddress\n  \"\"\"\n  example even\n  \"\"\"\n  even: Even\n}\n\nenum Episode {\n  NEWHOPE\n  EMPIRE\n  JEDI\n}\n\ninterface Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Human implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Droid implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n  primaryFunction: String\n}\n\n\"\"\"\nexample input type\n\"\"\"\ninput InputType {\n  \"\"\"\n  example key\n  \"\"\"\n  key: String!\n  \"\"\"\n  example value\n  \"\"\"\n  value: Int = 42\n\n  \"\"\"\n  nesting a whole object!\n  \"\"\"\n  exampleObject: ChildInputType!\n\n  \"\"\"\n  list type with default\n  \"\"\"\n  exampleList: [ChildInputType] = [{ isChild: false, favoriteBook: \"Binti\" }]\n  exampleScalarList: [String]! = [\"something\"]\n}\n\ninput ChildInputType {\n  isChild: Boolean! = true\n  \"\"\"\n  favorite book\n  \"\"\"\n  favoriteBook: String = \"Where the wild things are\"\n}\n\ntype TestType {\n  testField: String\n}\n\ntype Query {\n  hero(episode: Episode): Character\n  human(id: String!): Human\n  droid(id: String!): Droid\n  inputTypeTest(args: InputType = { key: \"key\" }): TestType\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/collectVariables.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport {\n  GraphQLBoolean,\n  GraphQLFloat,\n  GraphQLID,\n  GraphQLInt,\n  GraphQLSchema,\n  GraphQLString,\n  parse,\n  GraphQLEnumType,\n  GraphQLObjectType,\n} from 'graphql';\n\nimport { collectVariables } from '../collectVariables';\n\nconst TestEnum = new GraphQLEnumType({\n  name: 'ExampleEnum',\n  values: {\n    a: { value: 'a' },\n    b: { value: 'b' },\n  },\n});\n\ndescribe('collectVariables', () => {\n  const TestType = new GraphQLObjectType({\n    name: 'Test',\n    fields: {\n      id: { type: GraphQLID },\n      string: { type: GraphQLString },\n      int: { type: GraphQLInt },\n      float: { type: GraphQLFloat },\n      boolean: { type: GraphQLBoolean },\n      enum: { type: TestEnum },\n    },\n  });\n\n  const TestSchema = new GraphQLSchema({\n    query: TestType,\n  });\n\n  it('returns an empty object if no variables exist', () => {\n    const variableToType = collectVariables(TestSchema, parse('{ id }'));\n    expect(variableToType).toEqual({});\n  });\n\n  it('collects variable types from a schema and query', () => {\n    const variableToType = collectVariables(\n      TestSchema,\n      parse(`\n      query ($foo: Int, $bar: String) { id }\n    `),\n    );\n    expect(Object.keys(variableToType)).toEqual(['foo', 'bar']);\n    expect(variableToType.foo).toEqual(GraphQLInt);\n    expect(variableToType.bar).toEqual(GraphQLString);\n  });\n\n  it('collects variable types from multiple queries', () => {\n    const variableToType = collectVariables(\n      TestSchema,\n      parse(`\n      query A($foo: Int, $bar: String) { id }\n      query B($foo: Int, $baz: Float) { id },\n      query B($foo: Int, $baz: Float, $bae: ExampleEnum) { id }\n    `),\n    );\n    expect(Object.keys(variableToType)).toEqual(['foo', 'bar', 'baz', 'bae']);\n    expect(variableToType.foo).toEqual(GraphQLInt);\n    expect(variableToType.bar).toEqual(GraphQLString);\n    expect(variableToType.baz).toEqual(GraphQLFloat);\n    expect(variableToType.baz).toEqual(GraphQLFloat);\n    expect(variableToType.bae).toEqual(TestEnum);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/getASTNodeAtPosition.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { parse } from 'graphql';\nimport { Position } from '../Range';\nimport { getASTNodeAtPosition, pointToOffset } from '../getASTNodeAtPosition';\n\nconst doc = `\nquery A {\nfield\n}\n\nfragment B on B {\n  b\n}`;\n\nconst ast = parse(doc);\n\ndescribe('getASTNodeAtPosition', () => {\n  it('gets the node at the beginning', () => {\n    const point = new Position(2, 0);\n    const node = getASTNodeAtPosition(doc, ast, point);\n    expect(node).not.toBeUndefined();\n    if (node != null) {\n      // @ts-ignore\n      expect(node.name.value).toEqual('field');\n    }\n  });\n\n  it('does not find the node before the beginning', () => {\n    const point = new Position(0, 0);\n    const node = getASTNodeAtPosition(doc, ast, point);\n    expect(node).not.toBeUndefined();\n    if (node != null) {\n      expect(node.kind).toEqual('Document');\n    }\n  });\n\n  it('gets the node at the end', () => {\n    const point = new Position(2, 5);\n    const node = getASTNodeAtPosition(doc, ast, point);\n    expect(node).not.toBeUndefined();\n    if (node != null) {\n      // @ts-ignore\n      expect(node.name.value).toEqual('field');\n    }\n  });\n\n  it('does not find the node after the end', () => {\n    const point = new Position(4, 0);\n    const node = getASTNodeAtPosition(doc, ast, point);\n    expect(node).not.toBeUndefined();\n    if (node != null) {\n      expect(node.kind).toEqual('Document');\n    }\n  });\n});\n\ndescribe('pointToOffset', () => {\n  it('works for single lines', () => {\n    const text = 'lorem';\n    expect(pointToOffset(text, new Position(0, 2))).toEqual(2);\n  });\n\n  it('takes EOL into account', () => {\n    const text = 'lorem\\n';\n    expect(pointToOffset(text, new Position(1, 0))).toEqual(text.length);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/getVariablesJSONSchema.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { buildSchema, GraphQLSchema, parse } from 'graphql';\n\nimport { join } from 'node:path';\nimport { collectVariables } from '../collectVariables';\n\nimport { getVariablesJSONSchema } from '../getVariablesJSONSchema';\n\ndescribe('getVariablesJSONSchema', () => {\n  let schema: GraphQLSchema;\n\n  beforeEach(() => {\n    const schemaPath = join(__dirname, '__schema__', 'StarWarsSchema.graphql');\n    schema = buildSchema(readFileSync(schemaPath, 'utf8'));\n  });\n\n  it('should handle scalar types', () => {\n    const variableToType = collectVariables(\n      schema,\n      parse(`query(\n          $id: ID,\n          $string: String!,\n          $boolean: Boolean,\n          $number: Int!,\n          $price: Float,\n          $custom: SomeCustomScalar,\n          $anotherCustom: SomeCustomScalar!\n        ) {\n        characters{\n          name\n        }\n       }`),\n    );\n\n    const jsonSchema = getVariablesJSONSchema(variableToType);\n\n    expect(jsonSchema.required).toEqual(['string', 'number', 'anotherCustom']);\n\n    expect(jsonSchema.properties).toEqual({\n      boolean: {\n        type: ['boolean', 'null'],\n        description: 'Boolean',\n      },\n      string: {\n        type: 'string',\n        description: 'String!',\n      },\n      number: {\n        type: 'integer',\n        description: 'Int!',\n      },\n      price: {\n        description: 'Float',\n        type: ['number', 'null'],\n      },\n      custom: {\n        description: 'SomeCustomScalar',\n        type: ['string', 'number', 'boolean', 'integer', 'null'],\n      },\n      anotherCustom: {\n        description: 'SomeCustomScalar!',\n        type: ['string', 'number', 'boolean', 'integer'],\n      },\n    });\n  });\n\n  it('should handle custom scalar schemas', () => {\n    const variableToType = collectVariables(\n      schema,\n      parse(`query(\n          $email: EmailAddress!,\n          $optionalEmail: EmailAddress,\n          $evenNumber: Even!,\n          $optionalEvenNumber: Even,\n          $special: SpecialScalar!,\n          $optionalSpecial: SpecialScalar,\n          $specialDate: SpecialDate!,\n          $optionalSpecialDate: SpecialDate,\n          $foobar: FooBar!,\n          $optionalFoobar: FooBar,\n          $foo: Foo!,\n          $optionalFoo: Foo,\n          $customInput: CustomScalarsInput!,\n          $optionalCustomInput: CustomScalarsInput\n        ) {\n        characters{\n          name\n        }\n       }`),\n    );\n\n    const jsonSchema = getVariablesJSONSchema(variableToType, {\n      scalarSchemas: {\n        EmailAddress: {\n          type: 'string',\n          format: 'email',\n        },\n        Even: {\n          type: 'integer',\n          multipleOf: 2,\n          description: 'An even number.',\n        },\n        SpecialScalar: {\n          type: ['string'],\n          minLength: 5,\n        },\n        FooBar: {\n          enum: ['foo', 'bar'],\n        },\n        Foo: {\n          const: 'foo',\n        },\n        SpecialDate: {\n          description: 'A date or date time.',\n          oneOf: [\n            {\n              type: 'string',\n              format: 'date-time',\n            },\n            {\n              type: 'string',\n              format: 'date',\n            },\n          ],\n        },\n      },\n    });\n\n    expect(jsonSchema.required).toEqual([\n      'email',\n      'evenNumber',\n      'special',\n      'specialDate',\n      'foobar',\n      'foo',\n      'customInput',\n    ]);\n\n    expect(jsonSchema.definitions).toEqual({\n      CustomScalarsInput: {\n        description: 'CustomScalarsInput\\nAn input type with custom scalars',\n        properties: {\n          email: {\n            description: 'example email\\n\\nEmailAddress',\n            format: 'email',\n            type: ['string', 'null'],\n          },\n          even: {\n            description: 'example even\\n\\nEven\\nAn even number.',\n            multipleOf: 2,\n            type: ['integer', 'null'],\n          },\n        },\n        required: [],\n        type: 'object',\n      },\n    });\n\n    expect(jsonSchema.properties).toEqual({\n      email: {\n        type: 'string',\n        format: 'email',\n        description: 'EmailAddress!',\n      },\n      optionalEmail: {\n        type: ['string', 'null'],\n        format: 'email',\n        description: 'EmailAddress',\n      },\n      evenNumber: {\n        type: 'integer',\n        multipleOf: 2,\n        description: 'Even!\\nAn even number.',\n      },\n      optionalEvenNumber: {\n        type: ['integer', 'null'],\n        multipleOf: 2,\n        description: 'Even\\nAn even number.',\n      },\n      special: {\n        type: ['string'],\n        minLength: 5,\n        description: 'SpecialScalar!',\n      },\n      optionalSpecial: {\n        type: ['string', 'null'],\n        minLength: 5,\n        description: 'SpecialScalar',\n      },\n      foobar: {\n        enum: ['foo', 'bar'],\n        description: 'FooBar!',\n      },\n      optionalFoobar: {\n        enum: ['foo', 'bar', null],\n        description: 'FooBar',\n      },\n      foo: {\n        const: 'foo',\n        description: 'Foo!',\n      },\n      optionalFoo: {\n        oneOf: [{ const: 'foo' }, { type: 'null' }],\n        description: 'Foo',\n      },\n      specialDate: {\n        description: 'SpecialDate!\\nA date or date time.',\n        oneOf: [\n          {\n            type: 'string',\n            format: 'date-time',\n          },\n          {\n            type: 'string',\n            format: 'date',\n          },\n        ],\n      },\n      optionalSpecialDate: {\n        description: 'SpecialDate\\nA date or date time.',\n        oneOf: [\n          {\n            type: 'string',\n            format: 'date-time',\n          },\n          {\n            type: 'string',\n            format: 'date',\n          },\n          {\n            type: 'null',\n          },\n        ],\n      },\n      customInput: {\n        $ref: '#/definitions/CustomScalarsInput',\n        description: 'CustomScalarsInput!\\nAn input type with custom scalars',\n      },\n      optionalCustomInput: {\n        description: 'CustomScalarsInput\\nAn input type with custom scalars',\n        oneOf: [\n          {\n            $ref: '#/definitions/CustomScalarsInput',\n          },\n          {\n            type: 'null',\n          },\n        ],\n      },\n    });\n  });\n\n  it('should handle input object types', () => {\n    const variableToType = collectVariables(\n      schema,\n      parse(`query($input: InputType!, $anotherInput: InputType) {\n        characters {\n          name\n        }\n       }`),\n    );\n\n    const jsonSchema = getVariablesJSONSchema(variableToType);\n\n    expect(jsonSchema.required).toEqual(['input']);\n\n    expect(jsonSchema.properties).toEqual({\n      input: {\n        $ref: '#/definitions/InputType',\n        description: 'InputType!\\nexample input type',\n      },\n      anotherInput: {\n        oneOf: [{ $ref: '#/definitions/InputType' }, { type: 'null' }],\n        description: 'InputType\\nexample input type',\n      },\n    });\n    expect(jsonSchema.definitions).toEqual({\n      InputType: {\n        type: 'object',\n        description: 'InputType\\nexample input type',\n        properties: {\n          key: {\n            description: 'example key\\n\\nString!',\n            type: 'string',\n          },\n          value: {\n            description: 'example value\\n\\nInt',\n            type: ['integer', 'null'],\n            default: 42,\n          },\n          exampleObject: {\n            $ref: '#/definitions/ChildInputType',\n            description: 'nesting a whole object!\\n\\nChildInputType!',\n          },\n          exampleList: {\n            type: ['array', 'null'],\n            items: {\n              description: 'ChildInputType',\n              oneOf: [\n                { $ref: '#/definitions/ChildInputType' },\n                { type: 'null' },\n              ],\n            },\n            description: 'list type with default\\n\\n[ChildInputType]',\n            default: [\n              {\n                isChild: false,\n                favoriteBook: 'Binti',\n              },\n            ],\n          },\n          exampleScalarList: {\n            type: 'array',\n            description: '[String]!',\n            items: {\n              type: ['string', 'null'],\n              description: 'String',\n            },\n            default: ['something'],\n          },\n        },\n        required: ['key', 'exampleObject', 'exampleScalarList'],\n      },\n      ChildInputType: {\n        type: 'object',\n        description: 'ChildInputType',\n        properties: {\n          isChild: {\n            type: 'boolean',\n            description: 'Boolean!',\n            default: true,\n          },\n          favoriteBook: {\n            type: ['string', 'null'],\n            description: 'favorite book\\n\\nString',\n            default: 'Where the wild things are',\n          },\n        },\n        required: ['isChild'],\n      },\n    });\n  });\n\n  const mdTicks = (name: string) => `\\`\\`\\`graphql\\n${name}\\n\\`\\`\\``;\n\n  it('should handle input object types with markdown', () => {\n    const variableToType = collectVariables(\n      schema,\n      parse(`query($input: InputType!, $anotherInput: InputType, $episode: Episode, $anotherEpisode: Episode!) {\n        characters {\n          name\n        }\n       }`),\n    );\n\n    const jsonSchema = getVariablesJSONSchema(variableToType, {\n      useMarkdownDescription: true,\n    });\n\n    expect(jsonSchema.required).toEqual(['input', 'anotherEpisode']);\n\n    expect(jsonSchema.properties).toEqual({\n      input: {\n        $ref: '#/definitions/InputType',\n        description: 'InputType!\\nexample input type',\n        markdownDescription: '```graphql\\nInputType!\\n```\\nexample input type',\n      },\n      anotherInput: {\n        oneOf: [{ $ref: '#/definitions/InputType' }, { type: 'null' }],\n        description: 'InputType\\nexample input type',\n        markdownDescription: '```graphql\\nInputType\\n```\\nexample input type',\n      },\n      episode: {\n        enum: ['NEWHOPE', 'EMPIRE', 'JEDI', null],\n        description: 'Episode',\n        markdownDescription: mdTicks('Episode'),\n      },\n      anotherEpisode: {\n        enum: ['NEWHOPE', 'EMPIRE', 'JEDI'],\n        description: 'Episode!',\n        markdownDescription: mdTicks('Episode!'),\n      },\n    });\n    expect(jsonSchema.definitions).toEqual({\n      InputType: {\n        type: 'object',\n        description: 'InputType\\nexample input type',\n        markdownDescription: `${mdTicks('InputType')}\\nexample input type`,\n        properties: {\n          key: {\n            description: 'example key\\n\\nString!',\n            markdownDescription: `example key\\n\\n${mdTicks('String!')}`,\n            type: 'string',\n          },\n          value: {\n            description: 'example value\\n\\nInt',\n            markdownDescription: `example value\\n\\n${mdTicks('Int')}`,\n            type: ['integer', 'null'],\n            default: 42,\n          },\n          exampleObject: {\n            description: 'nesting a whole object!\\n\\nChildInputType!',\n            markdownDescription: `nesting a whole object!\\n\\n${mdTicks(\n              'ChildInputType!',\n            )}`,\n            $ref: '#/definitions/ChildInputType',\n          },\n          exampleList: {\n            type: ['array', 'null'],\n            items: {\n              description: 'ChildInputType',\n              markdownDescription: '```graphql\\nChildInputType\\n```',\n              oneOf: [\n                { $ref: '#/definitions/ChildInputType' },\n                { type: 'null' },\n              ],\n            },\n            description: 'list type with default\\n\\n[ChildInputType]',\n            markdownDescription: `list type with default\\n\\n${mdTicks(\n              '[ChildInputType]',\n            )}`,\n            default: [\n              {\n                isChild: false,\n                favoriteBook: 'Binti',\n              },\n            ],\n          },\n          exampleScalarList: {\n            type: 'array',\n            description: '[String]!',\n            markdownDescription: mdTicks('[String]!'),\n            items: {\n              type: ['string', 'null'],\n              description: 'String',\n              markdownDescription: mdTicks('String'),\n            },\n            default: ['something'],\n          },\n        },\n        required: ['key', 'exampleObject', 'exampleScalarList'],\n      },\n      ChildInputType: {\n        description: 'ChildInputType',\n        markdownDescription: `${mdTicks('ChildInputType')}`,\n        properties: {\n          favoriteBook: {\n            default: 'Where the wild things are',\n            description: 'favorite book\\n\\nString',\n            markdownDescription: 'favorite book\\n\\n```graphql\\nString\\n```',\n            type: ['string', 'null'],\n          },\n          isChild: {\n            default: true,\n            description: 'Boolean!',\n            markdownDescription: '```graphql\\nBoolean!\\n```',\n            type: 'boolean',\n          },\n        },\n        required: ['isChild'],\n        type: 'object',\n      },\n    });\n  });\n\n  it('should handle recursive schema properly', () => {\n    const schemaPath = join(__dirname, '__schema__', 'RecursiveSchema.graphql');\n    schema = buildSchema(readFileSync(schemaPath, 'utf8'));\n\n    const variableToType = collectVariables(\n      schema,\n      parse(`query Example(\n      $where: issues_where_input! = {}\n    ) {\n      issues(where: $where) {\n        name\n      }\n    }`),\n    );\n\n    getVariablesJSONSchema(variableToType, { useMarkdownDescription: true });\n    expect(true).toEqual(true);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/__tests__/validateWithCustomRules.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { readFileSync } from 'node:fs';\nimport {\n  GraphQLError,\n  buildSchema,\n  parse,\n  GraphQLSchema,\n  ValidationContext,\n  ArgumentNode,\n  version,\n} from 'graphql';\nimport { join } from 'node:path';\n\nimport { validateWithCustomRules } from '../validateWithCustomRules';\n\ndescribe('validateWithCustomRules', () => {\n  let schema: GraphQLSchema;\n\n  beforeEach(() => {\n    const schemaPath = join(__dirname, '__schema__', 'StarWarsSchema.graphql');\n    schema = buildSchema(readFileSync(schemaPath, 'utf8'));\n  });\n\n  it('validates with custom rules defined', () => {\n    const invalidAST = parse('query { human(id: \"a\") { name } }');\n    const customRules = [\n      (context: ValidationContext) => ({\n        Argument(node: ArgumentNode) {\n          // @ts-ignore\n          if (!/^\\d+$/.test(node.value.value)) {\n            context.reportError(\n              new GraphQLError(\n                'Argument ID must be a number written in string type.',\n                // @ts-expect-error\n                parseInt(version, 10) > 16 ? { nodes: node } : node,\n              ),\n            );\n          }\n        },\n      }),\n    ];\n\n    const errors = validateWithCustomRules(schema, invalidAST, customRules);\n    expect(errors.length).toEqual(1);\n    expect(errors[0].message).toEqual(\n      'Argument ID must be a number written in string type.',\n    );\n  });\n\n  it('validates properly when the query is in Relay compat mode', () => {\n    const astWithUnknownFragment = parse('query { ...UnknownFragment }');\n    const noErrors = validateWithCustomRules(\n      schema,\n      astWithUnknownFragment,\n      [],\n      true,\n    );\n    expect(noErrors.length).toEqual(0);\n\n    const errors = validateWithCustomRules(\n      schema,\n      astWithUnknownFragment,\n      [],\n      false,\n    );\n    expect(errors.length).toEqual(1);\n    expect(errors[0].message).toEqual('Unknown fragment \"UnknownFragment\".');\n  });\n\n  it('does not validate for Relay @arguments and @argumentDefinition', () => {\n    const astWithArgumentsDirective = parse(\n      'query { human(id: \"1\") @arguments(foo: \"bar\") { name } }',\n    );\n\n    expect(\n      validateWithCustomRules(schema, astWithArgumentsDirective, []),\n    ).toEqual([]);\n\n    const astWithArgumentDefDirective = parse(\n      '{ human(id: \"2\") { name @argumentDefinitions(arg: \"foo\") } }',\n    );\n\n    expect(\n      validateWithCustomRules(schema, astWithArgumentDefDirective),\n    ).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/collectVariables.ts",
    "content": "import {\n  typeFromAST,\n  GraphQLSchema,\n  DocumentNode,\n  NamedTypeNode,\n  GraphQLInputType,\n  GraphQLFloat,\n  Kind,\n} from 'graphql';\n\nexport type VariableToType = {\n  [variable: string]: GraphQLInputType;\n};\n\n/**\n * Generates a map of GraphQLInputTypes for\n * all the variables in an AST document of operations\n *\n * @param schema\n * @param documentAST\n * @returns {VariableToType}\n */\nexport function collectVariables(\n  schema: GraphQLSchema,\n  documentAST: DocumentNode,\n): VariableToType {\n  const variableToType: VariableToType = Object.create(null);\n  // it would be more ideal to use visitWithTypeInfo here but it's very simple\n  for (const definition of documentAST.definitions) {\n    if (definition.kind === 'OperationDefinition') {\n      const { variableDefinitions } = definition;\n      if (variableDefinitions) {\n        for (const { variable, type } of variableDefinitions) {\n          const inputType = typeFromAST(\n            schema,\n            type as NamedTypeNode,\n          ) as GraphQLInputType;\n          if (inputType) {\n            variableToType[variable.name.value] = inputType;\n          } else if (\n            type.kind === Kind.NAMED_TYPE &&\n            // in the experimental stream defer branch we are using, it seems typeFromAST() doesn't recognize Floats?\n            type.name.value === 'Float'\n          ) {\n            variableToType[variable.name.value] = GraphQLFloat;\n          }\n        }\n      }\n    }\n  }\n  return variableToType;\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/fragmentDependencies.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { DocumentNode, FragmentDefinitionNode, parse, visit } from 'graphql';\nimport nullthrows from 'nullthrows';\n\nexport const getFragmentDependencies = (\n  operationString: string,\n  fragmentDefinitions?: Map<string, FragmentDefinitionNode> | null,\n): FragmentDefinitionNode[] => {\n  // If there isn't context for fragment references,\n  // return an empty array.\n  if (!fragmentDefinitions) {\n    return [];\n  }\n  // If the operation cannot be parsed, validations cannot happen yet.\n  // Return an empty array.\n  let parsedOperation;\n  try {\n    parsedOperation = parse(operationString);\n  } catch {\n    return [];\n  }\n  return getFragmentDependenciesForAST(parsedOperation, fragmentDefinitions);\n};\n\nexport const getFragmentDependenciesForAST = (\n  parsedOperation: DocumentNode,\n  fragmentDefinitions: Map<string, FragmentDefinitionNode>,\n): FragmentDefinitionNode[] => {\n  if (!fragmentDefinitions) {\n    return [];\n  }\n\n  const existingFrags = new Map();\n  const referencedFragNames = new Set<string>();\n\n  visit(parsedOperation, {\n    FragmentDefinition(node) {\n      existingFrags.set(node.name.value, true);\n    },\n    FragmentSpread(node) {\n      if (!referencedFragNames.has(node.name.value)) {\n        referencedFragNames.add(node.name.value);\n      }\n    },\n  });\n\n  const asts = new Set<FragmentDefinitionNode>();\n  for (const name of referencedFragNames) {\n    if (!existingFrags.has(name) && fragmentDefinitions.has(name)) {\n      asts.add(nullthrows(fragmentDefinitions.get(name)));\n    }\n  }\n\n  const referencedFragments: FragmentDefinitionNode[] = [];\n\n  for (const ast of asts) {\n    visit(ast, {\n      FragmentSpread(node) {\n        if (\n          !referencedFragNames.has(node.name.value) &&\n          fragmentDefinitions.get(node.name.value)\n        ) {\n          asts.add(nullthrows(fragmentDefinitions.get(node.name.value)));\n          referencedFragNames.add(node.name.value);\n        }\n      },\n    });\n    if (!existingFrags.has(ast.name.value)) {\n      referencedFragments.push(ast);\n    }\n  }\n\n  return referencedFragments;\n};\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/getASTNodeAtPosition.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { IPosition as TPosition } from '../types';\nimport { ASTNode, visit } from 'graphql';\n\nexport function getASTNodeAtPosition(\n  query: string,\n  ast: ASTNode,\n  point: TPosition,\n): ASTNode | undefined {\n  const offset = pointToOffset(query, point);\n  let nodeContainingPosition: ASTNode | undefined;\n  visit(ast, {\n    enter(node) {\n      if (\n        node.kind !== 'Name' && // We're usually interested in their parents\n        node.loc &&\n        node.loc.start <= offset &&\n        offset <= node.loc.end\n      ) {\n        nodeContainingPosition = node;\n      } else {\n        return false;\n      }\n    },\n    leave(node) {\n      if (node.loc && node.loc.start <= offset && offset <= node.loc.end) {\n        return false;\n      }\n    },\n  });\n\n  return nodeContainingPosition;\n}\n\nexport function pointToOffset(text: string, point: TPosition): number {\n  const linesUntilPosition = text.split('\\n').slice(0, point.line);\n  return (\n    point.character +\n    linesUntilPosition\n      .map(\n        line => line.length + 1, // count EOL\n      )\n      .reduce((a, b) => a + b, 0)\n  );\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/getOperationFacts.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport { parse, visit } from 'graphql';\nimport { collectVariables } from './collectVariables';\n\nimport type { VariableToType } from './collectVariables';\nimport type {\n  GraphQLSchema,\n  DocumentNode,\n  OperationDefinitionNode,\n} from 'graphql';\n\nexport type OperationASTFacts = {\n  variableToType?: VariableToType;\n  operations: OperationDefinitionNode[];\n};\n\n/**\n * extract all operation nodes, and if schema is present, variable definitions, in a map\n *\n * @param documentAST {DocumentNode} a graphql-js compatible AST node\n * @param schema {GraphQLSchema} optional schema\n * @returns {OperationASTFacts}\n * @example\n *\n * ```ts\n *  const { variablesToType, operations } = getOperationASTFacts(\n *    parse('documentString'),\n *  );\n *  operations.forEach(op => {\n *    console.log(op.name, op.operation, op.loc);\n *  });\n *   Object.entries(variablesToType).forEach(([variableName, type]) => {\n *    console.log(variableName, type);\n *  });\n * ```\n */\n\nexport function getOperationASTFacts(\n  documentAST: DocumentNode,\n  schema?: GraphQLSchema | null,\n): OperationASTFacts {\n  const variableToType = schema\n    ? collectVariables(schema, documentAST)\n    : undefined;\n\n  // Collect operations by their names.\n  const operations: OperationDefinitionNode[] = [];\n\n  visit(documentAST, {\n    OperationDefinition(node) {\n      operations.push(node);\n    },\n  });\n\n  return { variableToType, operations };\n}\n\nexport type OperationFacts = {\n  documentAST: DocumentNode;\n} & OperationASTFacts;\n\nexport type QueryFacts = OperationFacts;\n\n/**\n * Provided previous \"queryFacts\", a GraphQL schema, and a query document\n * string, return a set of facts about that query useful for GraphiQL features.\n *\n * If the query cannot be parsed, returns undefined.\n * @param schema {GraphQLSchema} (optional)\n * @param documentString {string} the document you want to parse for operations (optional)\n *\n * @returns {OperationFacts | undefined}\n */\nexport default function getOperationFacts(\n  schema?: GraphQLSchema | null,\n  documentString?: string | null,\n): OperationFacts | undefined {\n  if (!documentString) {\n    return;\n  }\n\n  try {\n    const documentAST = parse(documentString);\n    return {\n      ...getOperationASTFacts(documentAST, schema),\n      documentAST,\n    };\n  } catch {}\n}\n\n/**\n * for backwards compatibility\n */\nexport const getQueryFacts = getOperationFacts;\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/getVariablesJSONSchema.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport {\n  GraphQLInputField,\n  GraphQLInputType,\n  isEnumType,\n  isInputObjectType,\n  isListType,\n  isNonNullType,\n  isScalarType,\n} from 'graphql';\n\nimport type {\n  JSONSchema4Type,\n  JSONSchema6,\n  JSONSchema6Definition,\n  JSONSchema6TypeName,\n} from 'json-schema';\nimport type { VariableToType } from './collectVariables';\n\nexport type { JSONSchema6, JSONSchema6TypeName };\n\nexport type JsonSchemaOptions = {\n  /**\n   * use undocumented `monaco-json` `markdownDescription` field in place of json-schema spec `description` field.\n   */\n  useMarkdownDescription?: boolean;\n};\n\ntype PropertiedJSON6 = JSONSchema6 & {\n  properties: {\n    [k: string]: JSONSchema6;\n  };\n};\n\nexport type JSONSchemaOptions = {\n  /**\n   * whether to append a non-json schema valid 'markdownDescription` for `monaco-json`\n   */\n  useMarkdownDescription?: boolean;\n  /**\n   * Scalar schema mappings.\n   */\n  scalarSchemas?: Record<string, JSONSchema6>;\n};\ntype JSONSchemaRunningOptions = JSONSchemaOptions & {\n  definitionMarker: Marker;\n};\n\nexport const defaultJSONSchemaOptions = {\n  useMarkdownDescription: false,\n};\n\nexport type MonacoEditorJSONSchema = JSONSchema6 & {\n  markdownDescription?: string;\n};\n\nexport type CombinedSchema = JSONSchema6 | MonacoEditorJSONSchema;\n\ntype Definitions = { [k: string]: JSONSchema6Definition };\n\nexport type DefinitionResult = {\n  definition: JSONSchema6 | MonacoEditorJSONSchema;\n  required: boolean;\n  definitions?: Definitions;\n};\n\nfunction text(into: string[], newText: string) {\n  into.push(newText);\n}\n\nfunction renderType(into: string[], t: GraphQLInputType | GraphQLInputField) {\n  if (isNonNullType(t)) {\n    renderType(into, t.ofType);\n    text(into, '!');\n  } else if (isListType(t)) {\n    text(into, '[');\n    // @ts-ignore\n    renderType(into, t.ofType);\n    text(into, ']');\n  } else {\n    text(into, t.name);\n  }\n}\n\nfunction renderDefinitionDescription(\n  t: GraphQLInputType | GraphQLInputField,\n  useMarkdown?: boolean,\n  description?: string | null,\n) {\n  const into: string[] = [];\n\n  const type = 'type' in t ? t.type : t;\n\n  // input field description\n  if ('type' in t && t.description) {\n    text(into, t.description);\n    text(into, '\\n\\n');\n  }\n\n  // type\n  text(into, renderTypeToString(type, useMarkdown));\n\n  // type description\n  if (description) {\n    text(into, '\\n');\n    text(into, description);\n  } else if (!isScalarType(type) && 'description' in type && type.description) {\n    text(into, '\\n');\n    text(into, type.description);\n  } else if (\n    'ofType' in type &&\n    !isScalarType(type.ofType) &&\n    'description' in type.ofType &&\n    type.ofType.description\n  ) {\n    text(into, '\\n');\n    text(into, type.ofType.description);\n  }\n\n  return into.join('');\n}\n\nfunction renderTypeToString(\n  t: GraphQLInputType | GraphQLInputField,\n  useMarkdown?: boolean,\n) {\n  const into: string[] = [];\n  if (useMarkdown) {\n    text(into, '```graphql\\n');\n  }\n  renderType(into, t);\n  if (useMarkdown) {\n    text(into, '\\n```');\n  }\n  return into.join('');\n}\n\nconst defaultScalarTypesMap: { [key: string]: JSONSchema6 } = {\n  Int: { type: 'integer' },\n  String: { type: 'string' },\n  Float: { type: 'number' },\n  ID: { type: 'string' },\n  Boolean: { type: 'boolean' },\n  // { \"type\": \"string\", \"format\": \"date\" } is not compatible with proposed DateTime GraphQL-Scalars.com spec\n  DateTime: { type: 'string' },\n};\n\nclass Marker {\n  private set = new Set<string>();\n\n  mark(name: string): boolean {\n    if (this.set.has(name)) {\n      return false;\n    }\n    this.set.add(name);\n    return true;\n  }\n}\n\n/**\n *\n * @param type {GraphQLInputType}\n * @param options\n * @returns {DefinitionResult}\n */\nfunction getJSONSchemaFromGraphQLType(\n  fieldOrType: GraphQLInputType | GraphQLInputField,\n  options?: JSONSchemaRunningOptions,\n): DefinitionResult {\n  let definition: CombinedSchema = Object.create(null);\n  const definitions: Definitions = Object.create(null);\n\n  // field or type\n  const isField = 'type' in fieldOrType;\n  // type\n  const type = isField ? fieldOrType.type : fieldOrType;\n  // base type\n  const baseType = isNonNullType(type) ? type.ofType : type;\n  const required = isNonNullType(type);\n\n  if (isScalarType(baseType)) {\n    //  scalars\n    if (options?.scalarSchemas?.[baseType.name]) {\n      // deep clone\n      definition = JSON.parse(\n        JSON.stringify(options.scalarSchemas[baseType.name]),\n      );\n    } else {\n      // any\n      definition.type = ['string', 'number', 'boolean', 'integer'];\n    }\n    if (!required) {\n      if (Array.isArray(definition.type)) {\n        definition.type.push('null');\n      } else if (definition.type) {\n        definition.type = [definition.type, 'null'];\n      } else if (definition.enum) {\n        definition.enum.push(null);\n      } else if (definition.oneOf) {\n        definition.oneOf.push({ type: 'null' });\n      } else {\n        definition = {\n          oneOf: [definition, { type: 'null' }],\n        };\n      }\n    }\n  } else if (isEnumType(baseType)) {\n    definition.enum = baseType.getValues().map(val => val.name);\n    if (!required) {\n      definition.enum.push(null);\n    }\n  } else if (isListType(baseType)) {\n    if (required) {\n      definition.type = 'array';\n    } else {\n      definition.type = ['array', 'null'];\n    }\n\n    const { definition: def, definitions: defs } = getJSONSchemaFromGraphQLType(\n      baseType.ofType,\n      options,\n    );\n\n    definition.items = def;\n\n    if (defs) {\n      for (const defName of Object.keys(defs)) {\n        definitions[defName] = defs[defName];\n      }\n    }\n  } else if (isInputObjectType(baseType)) {\n    if (required) {\n      definition.$ref = `#/definitions/${baseType.name}`;\n    } else {\n      definition.oneOf = [\n        { $ref: `#/definitions/${baseType.name}` },\n        { type: 'null' },\n      ];\n    }\n    if (options?.definitionMarker?.mark(baseType.name)) {\n      const fields = baseType.getFields();\n\n      const fieldDef: PropertiedJSON6 = {\n        type: 'object',\n        properties: {},\n        required: [],\n      };\n\n      fieldDef.description = renderDefinitionDescription(baseType);\n      if (options?.useMarkdownDescription) {\n        // @ts-expect-error\n        fieldDef.markdownDescription = renderDefinitionDescription(\n          baseType,\n          true,\n        );\n      }\n\n      for (const fieldName of Object.keys(fields)) {\n        const field = fields[fieldName];\n        const {\n          required: fieldRequired,\n          definition: fieldDefinition,\n          definitions: typeDefinitions,\n        } = getJSONSchemaFromGraphQLType(field, options);\n\n        fieldDef.properties[fieldName] = fieldDefinition;\n\n        if (fieldRequired) {\n          fieldDef.required!.push(fieldName);\n        }\n        if (typeDefinitions) {\n          for (const [defName, value] of Object.entries(typeDefinitions)) {\n            definitions[defName] = value;\n          }\n        }\n      }\n      definitions[baseType.name] = fieldDef;\n    }\n  }\n\n  if ('defaultValue' in fieldOrType && fieldOrType.defaultValue !== undefined) {\n    definition.default = fieldOrType.defaultValue as\n      | JSONSchema4Type\n      | undefined;\n  }\n\n  // append to type descriptions, or schema description\n  const { description } = definition;\n  definition.description = renderDefinitionDescription(\n    fieldOrType,\n    false,\n    description,\n  );\n  if (options?.useMarkdownDescription) {\n    // @ts-expect-error\n    definition.markdownDescription = renderDefinitionDescription(\n      fieldOrType,\n      true,\n      description,\n    );\n  }\n\n  return { required, definition, definitions };\n}\n\n/**\n * Generates a JSONSchema6 valid document for operation(s) from a map of Map<string, GraphQLInputType>.\n *\n * It generates referenced Definitions for each type, so that no graphql types are repeated.\n *\n * Note: you must install `@types/json-schema` if you want a valid result type\n *\n * @param facts {OperationFacts} the result of getOperationFacts, or getOperationASTFacts\n * @returns {JSONSchema6}'\n *\n * @example\n * simple usage:\n *\n * ```ts\n * import { parse } from 'graphql'\n * import { collectVariables, getVariablesJSONSchema } from 'graphql-language-service'\n * const variablesToType = collectVariables(parse(query), schema)\n * const JSONSchema6Result = getVariablesJSONSchema(variablesToType, schema)\n * ```\n *\n * @example\n * advanced usage:\n * ```ts\n *\n * import { parse } from 'graphql'\n * import { collectVariables, getVariablesJSONSchema } from 'graphql-language-service'\n * const variablesToType = collectVariables(parse(query), schema)\n *\n * // you can append `markdownDescription` to JSON schema, which  monaco-json uses.\n * const JSONSchema6Result = getVariablesJSONSchema(variablesToType, schema, { useMarkdownDescription: true })\n *\n * // let's say we want to use it with an IDE extension that expects a JSON file\n * // the resultant object literal can be written to string\n * import fs from 'fs/promises'\n * await fs.writeFile('operation-schema.json', JSON.stringify(JSONSchema6Result, null, 2))\n * ```\n */\nexport function getVariablesJSONSchema(\n  variableToType: VariableToType,\n  options?: JSONSchemaOptions,\n): JSONSchema6 {\n  const jsonSchema: PropertiedJSON6 = {\n    // this gets monaco-json validation working again\n    // otherwise it shows an error for newer schema draft versions\n    // variables and graphql types are simple and compatible with all versions of json schema\n    // since draft 4. package.json and many other schemas still use draft 4\n    $schema: 'http://json-schema.org/draft-04/schema',\n    type: 'object',\n    properties: {},\n    required: [],\n    additionalProperties: false,\n  };\n\n  const runtimeOptions: JSONSchemaRunningOptions = {\n    ...options,\n    definitionMarker: new Marker(),\n    scalarSchemas: {\n      ...defaultScalarTypesMap,\n      ...options?.scalarSchemas,\n    },\n  };\n\n  if (variableToType) {\n    // I would use a reduce here, but I wanted it to be readable.\n    for (const [variableName, type] of Object.entries(variableToType)) {\n      const { definition, required, definitions } =\n        getJSONSchemaFromGraphQLType(type, runtimeOptions);\n      jsonSchema.properties[variableName] = definition;\n      if (required) {\n        jsonSchema.required?.push(variableName);\n      }\n      if (definitions) {\n        jsonSchema.definitions = { ...jsonSchema?.definitions, ...definitions };\n      }\n    }\n  }\n  return jsonSchema;\n}\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/index.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nexport {\n  getFragmentDependencies,\n  getFragmentDependenciesForAST,\n} from './fragmentDependencies';\n\nexport {\n  getVariablesJSONSchema,\n  JSONSchema6,\n  JSONSchema6TypeName,\n  JSONSchemaOptions,\n} from './getVariablesJSONSchema';\n\nexport { getASTNodeAtPosition, pointToOffset } from './getASTNodeAtPosition';\n\nexport { Position, Range, locToRange, offsetToPosition } from './Range';\n\nexport { validateWithCustomRules } from './validateWithCustomRules';\n\nexport { collectVariables, VariableToType } from './collectVariables';\n\nexport {\n  default as getOperationFacts,\n  getOperationASTFacts,\n  getQueryFacts,\n  OperationFacts,\n  QueryFacts,\n} from './getOperationFacts';\n"
  },
  {
    "path": "packages/graphql-language-service/src/utils/validateWithCustomRules.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  ValidationRule,\n  DocumentNode,\n  specifiedRules,\n  validate,\n  GraphQLError,\n  GraphQLSchema,\n  NoUnusedFragmentsRule,\n  KnownFragmentNamesRule,\n  Kind,\n  ExecutableDefinitionsRule,\n  // specifiedSDLRules:\n  LoneSchemaDefinitionRule,\n  UniqueOperationTypesRule,\n  UniqueTypeNamesRule,\n  UniqueEnumValueNamesRule,\n  UniqueFieldDefinitionNamesRule,\n  UniqueDirectiveNamesRule,\n  KnownTypeNamesRule,\n  KnownDirectivesRule,\n  UniqueDirectivesPerLocationRule,\n  PossibleTypeExtensionsRule,\n  // KnownArgumentNamesOnDirectivesRule,\n  UniqueArgumentNamesRule,\n  UniqueInputFieldNamesRule,\n  UniqueVariableNamesRule,\n  FragmentsOnCompositeTypesRule,\n  ProvidedRequiredArgumentsRule,\n} from 'graphql';\n\nconst specifiedSDLRules = [\n  LoneSchemaDefinitionRule,\n  UniqueOperationTypesRule,\n  UniqueTypeNamesRule,\n  UniqueEnumValueNamesRule,\n  UniqueFieldDefinitionNamesRule,\n  UniqueDirectiveNamesRule,\n  KnownTypeNamesRule,\n  KnownDirectivesRule,\n  UniqueDirectivesPerLocationRule,\n  PossibleTypeExtensionsRule,\n  // KnownArgumentNamesOnDirectivesRule,\n  UniqueArgumentNamesRule,\n  UniqueInputFieldNamesRule,\n  UniqueVariableNamesRule,\n  FragmentsOnCompositeTypesRule,\n  ProvidedRequiredArgumentsRule,\n];\n\n/**\n * Validate a GraphQL Document optionally with custom validation rules.\n */\nexport function validateWithCustomRules(\n  schema: GraphQLSchema,\n  ast: DocumentNode,\n  customRules?: Array<ValidationRule> | null,\n  isRelayCompatMode?: boolean,\n  isSchemaDocument?: boolean,\n): Array<GraphQLError> {\n  const rules = specifiedRules.filter(rule => {\n    // Because every fragment is considered for determining model subsets that may\n    // be used anywhere in the codebase they're all technically \"used\" by clients\n    // of graphql-data. So we remove this rule from the validators.\n    if (rule === NoUnusedFragmentsRule || rule === ExecutableDefinitionsRule) {\n      return false;\n    }\n    if (isRelayCompatMode && rule === KnownFragmentNamesRule) {\n      return false;\n    }\n    return true;\n  });\n\n  if (customRules) {\n    Array.prototype.push.apply(rules, customRules);\n  }\n  if (isSchemaDocument) {\n    Array.prototype.push.apply(rules, specifiedSDLRules);\n  }\n  const errors = validate(schema, ast, rules);\n  return errors.filter(error => {\n    if (error.message.includes('Unknown directive') && error.nodes) {\n      const node = error.nodes[0];\n      if (node && node.kind === Kind.DIRECTIVE) {\n        const name = node.name.value;\n        if (name === 'arguments' || name === 'argumentDefinitions') {\n          return false;\n        }\n      }\n    }\n    return true;\n  });\n}\n"
  },
  {
    "path": "packages/graphql-language-service/tsconfig.esm.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./esm\",\n    \"composite\": true\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/graphql-language-service/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\",\n    \"baseUrl\": \".\"\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/graphql-language-service/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n  },\n});\n"
  },
  {
    "path": "packages/graphql-language-service-cli/.npmignore",
    "content": "node_modules\nsrc\nyarn.lock\n"
  },
  {
    "path": "packages/graphql-language-service-cli/CHANGELOG.md",
    "content": "# graphql-language-service-cli\n\n## 3.5.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service-server@2.14.0\n  - graphql-language-service@5.3.0\n\n## 3.4.2\n\n### Patch Changes\n\n- [#3647](https://github.com/graphql/graphiql/pull/3647) [`ba5720b`](https://github.com/graphql/graphiql/commit/ba5720b430ed1c888ff64c67aa4b9a36083b9ed0) Thanks [@acao](https://github.com/acao)! - several LSP fixes and improvements:\n\n  **Bugfixes**\n\n  debounce schema change events to fix codegen bugs to fix #3622\n\n  on mass file changes, network schema is overfetching because the schema cache is now invalidated on every watched schema file change\n\n  to address this, we debounce the new `onSchemaChange` event by 400ms\n\n  note that `schemaCacheTTL` can only be set in extension settings or graphql config at the top level - it will be ignored if configured per-project in the graphql config\n\n  **Code Improvements**\n\n  - Fixes flaky tests, and `schemaCacheTTL` setting not being passed to the cache\n  - Adds a test to validate network schema changes are reflected in the cache\n\n- Updated dependencies [[`ba5720b`](https://github.com/graphql/graphiql/commit/ba5720b430ed1c888ff64c67aa4b9a36083b9ed0), [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d), [`e2c04c7`](https://github.com/graphql/graphiql/commit/e2c04c7c2dc5109ff0446d9a6a010ffdffed1e44)]:\n  - graphql-language-service-server@2.13.2\n  - graphql-language-service@5.2.2\n\n## 3.4.1\n\n### Patch Changes\n\n- [#3628](https://github.com/graphql/graphiql/pull/3628) [`7fad662f`](https://github.com/graphql/graphiql/commit/7fad662f77eae9f842bb55cb93cb98df33bbc1ed) Thanks [@acao](https://github.com/acao)! - fix the lsp stream interface for stdin/out (neovim, etc)\n\n- Updated dependencies [[`7fad662f`](https://github.com/graphql/graphiql/commit/7fad662f77eae9f842bb55cb93cb98df33bbc1ed)]:\n  - graphql-language-service-server@2.13.1\n\n## 3.4.0\n\n### Minor Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fix many schema and fragment lifecycle issues, not all of them, but many related to cacheing. Note: this makes `cacheSchemaForLookup` enabled by default again for schema first contexts.\n\n  This fixes multiple cacheing bugs, upon addomg some in-depth integration test coverage for the LSP server. It also solves several bugs regarding loading config types, and properly restarts the server and invalidates schema when there are config changes.\n\n  ### Bugfix Summary\n\n  - configurable polling updates for network and other code first schema configuration, set to a 30s interval by default. powered by `schemaCacheTTL` which can be configured in the IDE settings (vscode, nvim) or in the graphql config file. (1)\n  - jump to definition in embedded files offset bug, for both fragments and code files with SDL strings\n  - cache invalidation for fragments (fragment lookup/autcoomplete data is more accurate, but incomplete/invalid fragments still do not autocomplete or validate, and remember fragment options always filter/validate by the `on` type!)\n  - schema cache invalidation for schema files - schema updates as you change the SDL files, and the generated file for code first by the `schemaCacheTTL` setting\n  - schema definition lookups & autocomplete crossing over into the wrong project\n\n  **Notes**\n\n  1. If possible, configuring for your locally running framework or a schema registry client to handle schema updates and output to a `schema.graphql` or `introspection.json` will always provide a better experience. many graphql frameworks have this built in! Otherwise, we must use this new lazy polling approach if you provide a url schema (this includes both introspection URLs and remote file URLs, and the combination of these).\n\n  ### Known Bugs Fixed\n\n  - #3318\n  - #2357\n  - #3469\n  - #2422\n  - #2820\n  - many more!\n\n  ### Test Improvements\n\n  - new, high level integration spec suite for the LSP with a matching test utility\n  - more unit test coverage\n  - **total increased test coverage of about 25% in the LSP server codebase.**\n  - many \"happy paths\" covered for both schema and code first contexts\n  - many bugs revealed (and their source)\n\n  ### What's next?\n\n  Another stage of the rewrite is already almost ready. This will fix even more bugs and improve memory usage, eliminate redundant parsing and ensure that graphql config's loaders do _all_ of the parsing and heavy lifting, thus honoring all the configs as well. It also significantly reduces the code complexity.\n\n  There is also a plan to match Relay LSP's lookup config for either IDE (vscode, nvm, etc) settings as they provide, or by loading modules into your `graphql-config`!\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Introduce `locateCommand` based on Relay LSP `pathToLocateCommand`:\n\n  Now with `<graphql config>.extensions.languageService.locateCommand`, you can specify either the [existing signature](https://marketplace.visualstudio.com/items?itemName=meta.relay#relay.pathtolocatecommand-default-null) for relay, with the same callback parameters and return signature (of a string delimited by `:` characters), or you can return an object with {uri, range} for the exact set of coordinates for the destination range. the function can be sync or async.\n\n  Relay LSP currently supports `Type` and `Type.field` for the 2nd argument. Ours also returns `Type.field(argument)` as a point of reference. It works with object types, input types, fragments, executable definitions and their fields, and should work for directive definitions as well.\n\n  In the case of unnamed types such as fragment spreads, they return the name of the implemented type currently, but I'm curious what users prefer here. I assumed that some people may want to not be limited to only using this for SDL type definition lookups. Also look soon to see `locateCommand` support added for symbols, outline, and coming references and implementations.\n\n  The module at the path you specify in relay LSP for `pathToLocateCommand` should work as such.\n\n  ```ts\n  // import it\n  import { locateCommand } from './graphql/tooling/lsp/locate.js';\n  export default {\n    languageService: {\n      locateCommand,\n    },\n\n    projects: {\n      a: {\n        schema: 'https://localhost:8000/graphql',\n        documents: './a/**/*.{ts,tsx,jsx,js,graphql}',\n      },\n      b: {\n        schema: './schema/ascode.ts',\n        documents: './b/**/*.{ts,tsx,jsx,js,graphql}',\n      },\n    },\n  };\n  ```\n\n  ```ts\n  // or define it inline\n\n  import { type LocateCommand } from 'graphql-language-service-server';\n\n  // relay LSP style\n  const locateCommand = (projectName: string, typePath: string) => {\n    const { path, startLine, endLine } = ourLookupUtility(\n      projectName,\n      typePath,\n    );\n    return `${path}:${startLine}:${endLine}`;\n  };\n\n  // an example with our alternative return signature\n  const locateCommand: LocateCommand = (projectName, typePath, info) => {\n    // pass more info, such as GraphQLType with the ast node. info.project is also available if you need it\n    const { path, range } = ourLookupUtility(\n      projectName,\n      typePath,\n      info.type.node,\n    );\n    return { uri: path, range }; // range.start.line/range.end.line\n  };\n\n  export default {\n    languageService: {\n      locateCommand,\n    },\n    schema: 'https://localhost:8000/graphql',\n    documents: './**/*.{ts,tsx,jsx,js,graphql}',\n  };\n  ```\n\n  Passing a string as a module path to resolve is coming in a follow-up release. Then it can be used with `.yml`, `.toml`, `.json`, `package.json#graphql`, etc\n\n  For now this was a quick baseline for a feature asked for in multiple channels!\n\n  Let us know how this works, and about any other interoperability improvements between our graphql LSP and other language servers (relay, intellij, etc) used by you and colleauges in your engineering organisations. We are trying our best to keep up with the awesome innovations they have 👀!\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d), [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d), [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service-server@2.13.0\n  - graphql-language-service@5.2.1\n\n## 3.3.33\n\n### Patch Changes\n\n- Updated dependencies [[`98af5307`](https://github.com/graphql/graphiql/commit/98af53071bb27afc0afc82d66f539c1ac08315b3), [`36c7f25c`](https://github.com/graphql/graphiql/commit/36c7f25c9388827d3a6a279eb090d61dc2600b56)]:\n  - graphql-language-service-server@2.12.0\n\n## 3.3.32\n\n### Patch Changes\n\n- Updated dependencies [[`6c7adf85`](https://github.com/graphql/graphiql/commit/6c7adf85c10d92cd3708a6dab44cb5b0f965fb84)]:\n  - graphql-language-service-server@2.11.10\n\n## 3.3.31\n\n### Patch Changes\n\n- Updated dependencies [[`34d0a976`](https://github.com/graphql/graphiql/commit/34d0a97688d7b83949f34bb4b2effebe4bafae79)]:\n  - graphql-language-service-server@2.11.9\n\n## 3.3.30\n\n### Patch Changes\n\n- Updated dependencies [[`3bfb2877`](https://github.com/graphql/graphiql/commit/3bfb28777457f783852dfe5c9af739470194d33b)]:\n  - graphql-language-service-server@2.11.8\n\n## 3.3.29\n\n### Patch Changes\n\n- [#3488](https://github.com/graphql/graphiql/pull/3488) [`d5028be2`](https://github.com/graphql/graphiql/commit/d5028be252ed385af972e090dda22788835da71e) Thanks [@acao](https://github.com/acao)! - Bump graphql & graphql-tools version to fix potential runtime security bugs\n\n- [`22771f35`](https://github.com/graphql/graphiql/commit/22771f35d00e4f80cb851e2a1f93db074e238e18) Thanks [@acao](https://github.com/acao)! - Fixes to svelte parsing, tag parsing refactor\n\n- Updated dependencies [[`d5028be2`](https://github.com/graphql/graphiql/commit/d5028be252ed385af972e090dda22788835da71e), [`22771f35`](https://github.com/graphql/graphiql/commit/22771f35d00e4f80cb851e2a1f93db074e238e18)]:\n  - graphql-language-service-server@2.11.7\n\n## 3.3.28\n\n### Patch Changes\n\n- Updated dependencies [[`75ccd72c`](https://github.com/graphql/graphiql/commit/75ccd72c660c3b20cafa38da01d18a91ea24c7db)]:\n  - graphql-language-service-server@2.11.6\n\n## 3.3.27\n\n### Patch Changes\n\n- Updated dependencies [[`530ef47a`](https://github.com/graphql/graphiql/commit/530ef47ac6bbcb24cedc453bf802626d4a630e45)]:\n  - graphql-language-service-server@2.11.5\n\n## 3.3.26\n\n### Patch Changes\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n  - graphql-language-service-server@2.11.4\n\n## 3.3.25\n\n### Patch Changes\n\n- [#3322](https://github.com/graphql/graphiql/pull/3322) [`6939bac4`](https://github.com/graphql/graphiql/commit/6939bac4a9a849fe497260fd0702bdd95eefd943) Thanks [@acao](https://github.com/acao)! - Bypass babel typescript parsing errors to continue extracting graphql strings\n\n- Updated dependencies [[`6939bac4`](https://github.com/graphql/graphiql/commit/6939bac4a9a849fe497260fd0702bdd95eefd943)]:\n  - graphql-language-service-server@2.11.3\n\n## 3.3.24\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5), [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8)]:\n  - graphql-language-service-server@2.11.2\n  - graphql-language-service@5.1.7\n\n## 3.3.24-alpha.0\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5), [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8)]:\n  - graphql-language-service-server@2.11.2-alpha.0\n  - graphql-language-service@5.1.7-alpha.0\n\n## 3.3.23\n\n### Patch Changes\n\n- Updated dependencies [[`4c3a08b1`](https://github.com/graphql/graphiql/commit/4c3a08b1a99e0933362a1c93340b613730c90aa4)]:\n  - graphql-language-service-server@2.11.1\n\n## 3.3.22\n\n### Patch Changes\n\n- [#3148](https://github.com/graphql/graphiql/pull/3148) [`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939) Thanks [@mskelton](https://github.com/mskelton)! - Use native LSP logger instead of manual file based logging. This fixes errors in Neovim when using the GraphQL LSP.\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939), [`28b1b5a0`](https://github.com/graphql/graphiql/commit/28b1b5a016787ec4119d28f057a9d93814d4e310)]:\n  - graphql-language-service-server@2.11.0\n  - graphql-language-service@5.1.6\n\n## 3.3.21\n\n### Patch Changes\n\n- Updated dependencies [[`f2040452`](https://github.com/graphql/graphiql/commit/f20404529677635f5d4792b328aa648641bf8d9c)]:\n  - graphql-language-service-server@2.10.0\n\n## 3.3.20\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service-server@2.9.10\n  - graphql-language-service@5.1.5\n\n## 3.3.19\n\n### Patch Changes\n\n- Updated dependencies [[`632a7c6b`](https://github.com/graphql/graphiql/commit/632a7c6bb2959ef5d59236aeab218587578466e7)]:\n  - graphql-language-service-server@2.9.9\n\n## 3.3.18\n\n### Patch Changes\n\n- [#3109](https://github.com/graphql/graphiql/pull/3109) [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-floating-promises` eslint rule\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9), [`06d39823`](https://github.com/graphql/graphiql/commit/06d39823e093c8441fea469446c25f18a664e778), [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b), [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040)]:\n  - graphql-language-service@5.1.4\n  - graphql-language-service-server@2.9.8\n\n## 3.3.17\n\n### Patch Changes\n\n- [#3046](https://github.com/graphql/graphiql/pull/3046) [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer .at() method for index access\n\n- Updated dependencies [[`9d9478ae`](https://github.com/graphql/graphiql/commit/9d9478aea7536d2957e4371cef4f30577db2113d), [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0)]:\n  - graphql-language-service-server@2.9.7\n  - graphql-language-service@5.1.3\n\n## 3.3.16\n\n### Patch Changes\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`90350022`](https://github.com/graphql/graphiql/commit/90350022334d9fcce0f4b72b3b0f7a12d21f78f9), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n  - graphql-language-service-server@2.9.6\n\n## 3.3.15\n\n### Patch Changes\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2966](https://github.com/graphql/graphiql/pull/2966) [`f9aa87dc`](https://github.com/graphql/graphiql/commit/f9aa87dc6a88ed8a8a0a94de520c7a41fff8ffde) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `sonarjs/no-small-switch` and `sonarjs/no-duplicated-branches` rules\n\n- [#2938](https://github.com/graphql/graphiql/pull/2938) [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/throw-new-error` rule\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de), [`f9aa87dc`](https://github.com/graphql/graphiql/commit/f9aa87dc6a88ed8a8a0a94de520c7a41fff8ffde), [`10e97bbe`](https://github.com/graphql/graphiql/commit/10e97bbe6c9ff81bae73b11ba81ac2b69eca2772), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9), [`d502a33b`](https://github.com/graphql/graphiql/commit/d502a33b4332f1025e947c02d7cfdc5799365c8d), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171), [`4ff2794c`](https://github.com/graphql/graphiql/commit/4ff2794c8b6032168e27252096cb276ce712878e)]:\n  - graphql-language-service@5.1.1\n  - graphql-language-service-server@2.9.5\n\n## 3.3.14\n\n### Patch Changes\n\n- [#2901](https://github.com/graphql/graphiql/pull/2901) [`eff4fd6b`](https://github.com/graphql/graphiql/commit/eff4fd6b9087c2d9cdb260ee2502a31d23769c3f) Thanks [@acao](https://github.com/acao)! - Reload the language service when a legacy format .graphqlconfig file has changed\n\n- Updated dependencies [[`eff4fd6b`](https://github.com/graphql/graphiql/commit/eff4fd6b9087c2d9cdb260ee2502a31d23769c3f)]:\n  - graphql-language-service-server@2.9.4\n\n## 3.3.13\n\n### Patch Changes\n\n- [#2900](https://github.com/graphql/graphiql/pull/2900) [`8989ffce`](https://github.com/graphql/graphiql/commit/8989ffce7d6beca874e70f5a1ff066102580173a) Thanks [@acao](https://github.com/acao)! - use decorators-legacy @babel/parser plugin so that all styles of decorator usage are supported\n- Updated dependencies [[`8989ffce`](https://github.com/graphql/graphiql/commit/8989ffce7d6beca874e70f5a1ff066102580173a)]:\n  - graphql-language-service-server@2.9.3\n\n## 3.3.12\n\n### Patch Changes\n\n- Updated dependencies [[`bdd1bd04`](https://github.com/graphql/graphiql/commit/bdd1bd045fc6610ccaae4745b8ecc10004594274), [`967006a6`](https://github.com/graphql/graphiql/commit/967006a68e56f8f3a605c69fee5f920afdb6d8cf)]:\n  - graphql-language-service-server@2.9.2\n\n## 3.3.11\n\n### Patch Changes\n\n- [#2829](https://github.com/graphql/graphiql/pull/2829) [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10) Thanks [@acao](https://github.com/acao)! - svelte language support, using the vue sfc parser introduced for vue support\n\n- Updated dependencies [[`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10), [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10)]:\n  - graphql-language-service-server@2.9.1\n\n## 3.3.10\n\n### Patch Changes\n\n- Updated dependencies [[`b422003c`](https://github.com/graphql/graphiql/commit/b422003c2403072e96d14f920a3f0f1dc1f4f708)]:\n  - graphql-language-service-server@2.9.0\n\n## 3.3.9\n\n### Patch Changes\n\n- Updated dependencies [[`929152f8`](https://github.com/graphql/graphiql/commit/929152f8ea076ffa3bf34b83445473331c3bdb67)]:\n  - graphql-language-service-server@2.8.9\n\n## 3.3.8\n\n### Patch Changes\n\n- [#2812](https://github.com/graphql/graphiql/pull/2812) [`cf2e3061`](https://github.com/graphql/graphiql/commit/cf2e3061f67ef5cf6b890e217d20915d0eaec1bd) Thanks [@acao](https://github.com/acao)! - fix a bundling bug for vscode, rolling back graphql-config upgrade\n\n- Updated dependencies [[`cf2e3061`](https://github.com/graphql/graphiql/commit/cf2e3061f67ef5cf6b890e217d20915d0eaec1bd)]:\n  - graphql-language-service-server@2.8.8\n\n## 3.3.7\n\n### Patch Changes\n\n- Updated dependencies [[`f688422e`](https://github.com/graphql/graphiql/commit/f688422ed87ddd411cf3552fa6d9a5a367cd8662)]:\n  - graphql-language-service-server@2.8.7\n\n## 3.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`a2071504`](https://github.com/graphql/graphiql/commit/a20715046fe7684bb9b17fbc9f5637b44e5210d6)]:\n  - graphql-language-service-server@2.8.6\n\n## 3.3.5\n\n### Patch Changes\n\n- [#2616](https://github.com/graphql/graphiql/pull/2616) [`b0d7f06c`](https://github.com/graphql/graphiql/commit/b0d7f06cf9ec6fd6b1dcb61dd0273e37dd546ed5) Thanks [@acao](https://github.com/acao)! - support vscode multi-root workspaces! creates an LSP server instance for each workspace.\n\n  WARNING: large-scale vscode workspaces usage, and this in tandem with `graphql.config.*` multi-project configs could lead to excessive system resource usage. Optimizations coming soon.\n\n- Updated dependencies [[`b0d7f06c`](https://github.com/graphql/graphiql/commit/b0d7f06cf9ec6fd6b1dcb61dd0273e37dd546ed5)]:\n  - graphql-language-service-server@2.8.5\n\n## 3.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782)]:\n  - graphql-language-service@5.1.0\n  - graphql-language-service-server@2.8.4\n\n## 3.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`721425b3`](https://github.com/graphql/graphiql/commit/721425b3382e68dd4c7b883473e3eda38a9816ee)]:\n  - graphql-language-service-server@2.8.3\n\n## 3.3.2\n\n### Patch Changes\n\n- [#2660](https://github.com/graphql/graphiql/pull/2660) [`34d31fbc`](https://github.com/graphql/graphiql/commit/34d31fbce6c49c929b48bdf1a6b0cebc33d8bbbf) Thanks [@acao](https://github.com/acao)! - bump `ts-node` to 10.x, so that TypeScript based configs (i.e. `.graphqlrc.ts`) will continue to work. It also bumps to the latest patch releases of `graphql-config` fixed several issues with TypeScript loading ([v4.3.2](https://github.com/kamilkisiela/graphql-config/releases/tag/v4.3.2), [v4.3.3](https://github.com/kamilkisiela/graphql-config/releases/tag/v4.3.3)). We tested manually, but please open a bug if you encounter any with schema-as-url configs & schema introspection.\n\n- Updated dependencies [[`34d31fbc`](https://github.com/graphql/graphiql/commit/34d31fbce6c49c929b48bdf1a6b0cebc33d8bbbf)]:\n  - graphql-language-service-server@2.8.2\n\n## 3.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`12cf4db0`](https://github.com/graphql/graphiql/commit/12cf4db006d1c058460bc04f51d8743fe1ac63bb)]:\n  - graphql-language-service-server@2.8.1\n\n## 3.3.0\n\n### Minor Changes\n\n- [#2557](https://github.com/graphql/graphiql/pull/2557) [`3304606d`](https://github.com/graphql/graphiql/commit/3304606d5130a745cbdab0e6c9182e75101ddde9) Thanks [@acao](https://github.com/acao)! - upgrades the `vscode-languageserver` and `vscode-jsonrpc` reference implementations for the lsp server to the latest. also upgrades `vscode-languageclient` in `vscode-graphql` to the latest 8.0.1. seems to work fine for IPC in `vscode-graphql` at least!\n\n  hopefully this solves #2230 once and for all!\n\n### Patch Changes\n\n- Updated dependencies [[`3304606d`](https://github.com/graphql/graphiql/commit/3304606d5130a745cbdab0e6c9182e75101ddde9)]:\n  - graphql-language-service-server@2.8.0\n\n## 3.2.30\n\n### Patch Changes\n\n- [#2553](https://github.com/graphql/graphiql/pull/2553) [`edc1c964`](https://github.com/graphql/graphiql/commit/edc1c96477cc2fbc2b6ac5d6195b8f9766a8c5d4) Thanks [@acao](https://github.com/acao)! - Fix error with LSP crash for CLI users #2230. `vscode-graphql` not impacted - rather, `nvim.coc`, maybe other clients who use CLI directly). recreation of #2546 by [@xuanduc987](https://github.com/xuanduc987, thank you!)\n\n- Updated dependencies [[`edc1c964`](https://github.com/graphql/graphiql/commit/edc1c96477cc2fbc2b6ac5d6195b8f9766a8c5d4)]:\n  - graphql-language-service-server@2.7.29\n\n## 3.2.29\n\n### Patch Changes\n\n- [#2519](https://github.com/graphql/graphiql/pull/2519) [`de5d5a07`](https://github.com/graphql/graphiql/commit/de5d5a07891fd49241a5abbb17eaf377a015a0a8) Thanks [@acao](https://github.com/acao)! - enable graphql-config legacy mode by default in the LSP server\n\n* [#2509](https://github.com/graphql/graphiql/pull/2509) [`737d4184`](https://github.com/graphql/graphiql/commit/737d4184f3af1d8fe9d64eb1b7e23dfcfbe640ea) Thanks [@Chnapy](https://github.com/Chnapy)! - Add `gql(``)`, `graphql(``)` call expressions support for highlighting & language\n\n* Updated dependencies [[`de5d5a07`](https://github.com/graphql/graphiql/commit/de5d5a07891fd49241a5abbb17eaf377a015a0a8), [`737d4184`](https://github.com/graphql/graphiql/commit/737d4184f3af1d8fe9d64eb1b7e23dfcfbe640ea)]:\n  - graphql-language-service-server@2.7.28\n\n## 3.2.28\n\n### Patch Changes\n\n- Updated dependencies [[`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - graphql-language-service-server@2.7.27\n  - graphql-language-service@5.0.6\n\n## 3.2.27\n\n### Patch Changes\n\n- [#2486](https://github.com/graphql/graphiql/pull/2486) [`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa) Thanks [@stonexer](https://github.com/stonexer)! - definition support for operation fields ✨\n\n  you can now jump to the applicable object type definition for query/mutation/subscription fields!\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service-server@2.7.26\n  - graphql-language-service@5.0.5\n\n## 3.2.26\n\n### Patch Changes\n\n- Updated dependencies [[`cf092f59`](https://github.com/graphql/graphiql/commit/cf092f5960eae250bb193b9011b2fb883f797a99)]:\n  - graphql-language-service-server@2.7.25\n\n## 3.2.25\n\n### Patch Changes\n\n- Updated dependencies [[`d0017a93`](https://github.com/graphql/graphiql/commit/d0017a93b818cf3119e51c2b6c4a19004f98e29b)]:\n  - graphql-language-service-server@2.7.24\n\n## 3.2.24\n\n### Patch Changes\n\n- Updated dependencies [[`6ca6a92d`](https://github.com/graphql/graphiql/commit/6ca6a92d0fd12af974683de9706c8e8e06c751c2)]:\n  - graphql-language-service-server@2.7.23\n\n## 3.2.23\n\n### Patch Changes\n\n- Updated dependencies [[`6db28447`](https://github.com/graphql/graphiql/commit/6db284479a14873fea3e359efd71be0b15ab3ee8), [`1bea864d`](https://github.com/graphql/graphiql/commit/1bea864d05dee04bb20c06dc3c3d68675b87a50a)]:\n  - graphql-language-service-server@2.7.22\n\n## 3.2.22\n\n### Patch Changes\n\n- Updated dependencies [[`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2)]:\n  - graphql-language-service@5.0.4\n  - graphql-language-service-server@2.7.21\n\n## 3.2.21\n\n### Patch Changes\n\n- [#2291](https://github.com/graphql/graphiql/pull/2291) [`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902) Thanks [@retrodaredevil](https://github.com/retrodaredevil)! - Target es6 for the languages services\n\n- Updated dependencies [[`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902)]:\n  - graphql-language-service@5.0.3\n  - graphql-language-service-server@2.7.20\n\n## 3.2.20\n\n### Patch Changes\n\n- Updated dependencies [[`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f)]:\n  - graphql-language-service@5.0.2\n  - graphql-language-service-server@2.7.19\n\n## 3.2.19\n\n### Patch Changes\n\n- Updated dependencies [[`e15d1dae`](https://github.com/graphql/graphiql/commit/e15d1dae399a7d43d8d98f2ce431a9a1f0ba84ae)]:\n  - graphql-language-service-server@2.7.18\n\n## 3.2.18\n\n### Patch Changes\n\n- [#2267](https://github.com/graphql/graphiql/pull/2267) [`fe441272`](https://github.com/graphql/graphiql/commit/fe44127296f808e58407855c7f8806e04c8ddf03) Thanks [@elken](https://github.com/elken)! - Re-add `graphql-language-service-server` as a dep to `graphql-language-service-cli`\n\n## 3.2.17\n\n### Patch Changes\n\n- [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa) Thanks [@acao](https://github.com/acao)! - fix lockfile and imports from LSP merge\n\n- Updated dependencies [[`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa), [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa)]:\n  - graphql-language-service@5.0.1\n\n## 3.2.16\n\n### Patch Changes\n\n- Updated dependencies [[`2502a364`](https://github.com/graphql/graphiql/commit/2502a364b74dc754d92baa1579b536cf42139958)]:\n  - graphql-language-service@5.0.0\n  - graphql-language-service-server@2.7.16\n\n## 3.2.15\n\n### Patch Changes\n\n- Updated dependencies [[`ab83198f`](https://github.com/graphql/graphiql/commit/ab83198fa8b3c5453d3733982ee9ca8a2d6bca7a)]:\n  - graphql-language-service-server@2.7.15\n\n## 3.2.14\n\n### Patch Changes\n\n- Updated dependencies [[`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f), [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c), [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5)]:\n  - graphql-language-service-server@2.7.14\n  - graphql-language-service@4.1.5\n\n## 3.2.13\n\n### Patch Changes\n\n- Updated dependencies [[`08ff6dce`](https://github.com/graphql/graphiql/commit/08ff6dce0625f7ab58a45364aed9ca04c7862fa7)]:\n  - graphql-language-service-server@2.7.13\n  - graphql-language-service@4.1.4\n\n## 3.2.12\n\n### Patch Changes\n\n- Updated dependencies [[`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8)]:\n  - graphql-language-service@4.1.3\n  - graphql-language-service-server@2.7.12\n\n## 3.2.11\n\n### Patch Changes\n\n- Updated dependencies [[`e20760fb`](https://github.com/graphql/graphiql/commit/e20760fbd95c13d6d549cba3faa15a59aee9a2c0)]:\n  - graphql-language-service@4.1.2\n  - graphql-language-service-server@2.7.11\n\n## 3.2.10\n\n### Patch Changes\n\n- Updated dependencies [[`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63)]:\n  - graphql-language-service-server@2.7.10\n  - graphql-language-service-utils@2.7.1\n  - graphql-language-service@4.1.1\n\n## 3.2.9\n\n### Patch Changes\n\n- Updated dependencies [[`0f1f90ce`](https://github.com/graphql/graphiql/commit/0f1f90ce8f4a25ddebdaf7a9ddbe136214aa64a3)]:\n  - graphql-language-service@4.1.0\n  - graphql-language-service-server@2.7.9\n\n## 3.2.8\n\n### Patch Changes\n\n- Updated dependencies [[`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3)]:\n  - graphql-language-service-utils@2.7.0\n  - graphql-language-service@4.0.0\n  - graphql-language-service-server@2.7.8\n\n## 3.2.7\n\n### Patch Changes\n\n- Updated dependencies [[`c4236190`](https://github.com/graphql/graphiql/commit/c4236190f91adedaf4f4a54cd0400a6b42c3c407), [`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1)]:\n  - graphql-language-service-server@2.7.7\n  - graphql-language-service@3.2.5\n\n## 3.2.6\n\n### Patch Changes\n\n- Updated dependencies [[`4286185c`](https://github.com/graphql/graphiql/commit/4286185cdc6119175e23d66b8e177ba32693a63a)]:\n  - graphql-language-service-server@2.7.6\n\n## 3.2.5\n\n### Patch Changes\n\n- [`f82bd7a9`](https://github.com/graphql/graphiql/commit/f82bd7a931eb5fa9a33e59d417303706844c9063) [#2055](https://github.com/graphql/graphiql/pull/2055) Thanks [@acao](https://github.com/acao)! - this fixes the URI scheme related bugs and make sure schema as sdl config works again.\n\n  `fileURLToPath` had been introduced by a contributor and I didn't test properly, it broke sdl file loading!\n\n  definitions, autocomplete, diagnostics, etc should work again also hides the more verbose logging output for now\n\n- Updated dependencies [[`f82bd7a9`](https://github.com/graphql/graphiql/commit/f82bd7a931eb5fa9a33e59d417303706844c9063)]:\n  - graphql-language-service-server@2.7.5\n  - graphql-language-service@3.2.4\n  - graphql-language-service-utils@2.6.3\n\n## 3.2.4\n\n### Patch Changes\n\n- [`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf) [#2047](https://github.com/graphql/graphiql/pull/2047) Thanks [@willstott101](https://github.com/willstott101)! - Source code included in all packages to fix source maps. codemirror-graphql includes esm build in package.\n\n- Updated dependencies [[`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf)]:\n  - graphql-language-service@3.2.3\n  - graphql-language-service-server@2.7.4\n  - graphql-language-service-utils@2.6.2\n\n## 3.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf)]:\n  - graphql-language-service@3.2.2\n  - graphql-language-service-server@2.7.3\n  - graphql-language-service-utils@2.6.1\n\n## 3.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`7e98c6ff`](https://github.com/graphql/graphiql/commit/7e98c6fff3b1c62954c9c8d902ac64ddbf23fc5d)]:\n  - graphql-language-service-server@2.7.2\n\n## 3.2.1\n\n### Patch Changes\n\n- [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce) [#2013](https://github.com/graphql/graphiql/pull/2013) Thanks [@PabloSzx](https://github.com/PabloSzx)! - Update utils\n\n- Updated dependencies [[`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce), [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce)]:\n  - graphql-language-service-utils@2.6.0\n  - graphql-language-service@3.2.1\n  - graphql-language-service-server@2.7.1\n\n## 3.2.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n### Patch Changes\n\n- Updated dependencies [[`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a)]:\n  - graphql-language-service-server@2.7.0\n  - graphql-language-service@3.2.0\n\n## 3.1.14\n\n### Patch Changes\n\n- [`83c4a007`](https://github.com/graphql/graphiql/commit/83c4a0070a4df704ce874ec977d65ca6c7e43ee8) [#1964](https://github.com/graphql/graphiql/pull/1964) Thanks [@patrickszmucer](https://github.com/patrickszmucer)! - Fix unknown fragment errors on save\n\n* [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8) [#1777](https://github.com/graphql/graphiql/pull/1777) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - adopt block string parsing for variables in language parser\n\n* Updated dependencies [[`0e2c1a02`](https://github.com/graphql/graphiql/commit/0e2c1a020cc2761155f7c9467d3ed4cb45941aeb), [`83c4a007`](https://github.com/graphql/graphiql/commit/83c4a0070a4df704ce874ec977d65ca6c7e43ee8), [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8)]:\n  - graphql-language-service@3.1.6\n  - graphql-language-service-server@2.6.5\n\n## 3.1.13\n\n### Patch Changes\n\n- [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n## [3.1.12](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.11...graphql-language-service-cli@3.1.12) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.11](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.10...graphql-language-service-cli@3.1.11) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.10](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.9...graphql-language-service-cli@3.1.10) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.9](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.8...graphql-language-service-cli@3.1.9) (2021-01-03)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.8](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.7...graphql-language-service-cli@3.1.8) (2020-12-28)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.7](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.6...graphql-language-service-cli@3.1.7) (2020-12-08)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.6](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.5...graphql-language-service-cli@3.1.6) (2020-11-28)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.5](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.4...graphql-language-service-cli@3.1.5) (2020-10-20)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.4](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.3...graphql-language-service-cli@3.1.4) (2020-09-23)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.3](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.2...graphql-language-service-cli@3.1.3) (2020-09-23)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.2](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.1...graphql-language-service-cli@3.1.2) (2020-09-20)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.1](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0...graphql-language-service-cli@3.1.1) (2020-09-20)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0-alpha.5...graphql-language-service-cli@3.1.0) (2020-09-18)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0-alpha.5](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0-alpha.4...graphql-language-service-cli@3.1.0-alpha.5) (2020-09-11)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0-alpha.4](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0-alpha.3...graphql-language-service-cli@3.1.0-alpha.4) (2020-08-26)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0-alpha.2...graphql-language-service-cli@3.1.0-alpha.3) (2020-08-22)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0-alpha.2](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0-alpha.1...graphql-language-service-cli@3.1.0-alpha.2) (2020-08-12)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0-alpha.1](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.1.0-alpha.0...graphql-language-service-cli@3.1.0-alpha.1) (2020-08-12)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.1.0-alpha.0](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.0.1...graphql-language-service-cli@3.1.0-alpha.0) (2020-08-10)\n\n### Bug Fixes\n\n- pre-caching schema bugs, new server config options ([#1636](https://github.com/graphql/graphiql/issues/1636)) ([d989456](https://github.com/graphql/graphiql/commit/d9894564c056134e15093956e0951dcefe061d76))\n\n### Features\n\n- graphql-config@3 support in lsp server ([#1616](https://github.com/graphql/graphiql/issues/1616)) ([27cd185](https://github.com/graphql/graphiql/commit/27cd18562b64dfe18e6343b6a49f3f606af89d86))\n\n## [3.0.1](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.0.0...graphql-language-service-cli@3.0.1) (2020-08-06)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.0.0](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.0.0-alpha.5...graphql-language-service-cli@3.0.0) (2020-06-11)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.0.0-alpha.5](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.0.0-alpha.4...graphql-language-service-cli@3.0.0-alpha.5) (2020-06-04)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [3.0.0-alpha.4](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.0.0-alpha.3...graphql-language-service-cli@3.0.0-alpha.4) (2020-06-04)\n\n### Bug Fixes\n\n- cleanup cache entry from lerna publish ([4a26218](https://github.com/graphql/graphiql/commit/4a2621808a1aea8b30d5d27b8d86a60bf2b44b01))\n\n## [3.0.0-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service-cli@3.0.0-alpha.2...graphql-language-service-cli@3.0.0-alpha.3) (2020-05-28)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n# 3.0.0-alpha.2 (2020-05-19)\n\n**Note:** Version bump only for package graphql-language-service-cli\n\n## [2.4.0-alpha.8](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.7...graphql-language-service@2.4.0-alpha.8) (2020-05-17)\n\n### Bug Fixes\n\n- repair CLI, handle all schema and LSP errors ([#1482](https://github.com/graphql/graphiql/issues/1482)) ([992f384](https://github.com/graphql/graphiql/commit/992f38494f20f5877bfd6ff54893854ac7a0eaa2))\n\n## [2.4.0-alpha.7](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.6...graphql-language-service@2.4.0-alpha.7) (2020-04-10)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.4.0-alpha.6](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.5...graphql-language-service@2.4.0-alpha.6) (2020-04-10)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.4.0-alpha.5](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.4...graphql-language-service@2.4.0-alpha.5) (2020-04-06)\n\n### Features\n\n- upgrade to graphql@15.0.0 for [#1191](https://github.com/graphql/graphiql/issues/1191) ([#1204](https://github.com/graphql/graphiql/issues/1204)) ([f13c8e9](https://github.com/graphql/graphiql/commit/f13c8e9d0e66df4b051b332c7d02f4bb83e07ffd))\n\n## [2.4.0-alpha.4](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.3...graphql-language-service@2.4.0-alpha.4) (2020-04-03)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.4.0-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.2...graphql-language-service@2.4.0-alpha.3) (2020-03-20)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.4.0-alpha.2](https://github.com/graphql/graphiql/compare/graphql-language-service@2.4.0-alpha.0...graphql-language-service@2.4.0-alpha.2) (2020-03-20)\n\n### Bug Fixes\n\n- error formatting, [#1319](https://github.com/graphql/graphiql/issues/1319) ([#1381](https://github.com/graphql/graphiql/issues/1381)) ([16509a4](https://github.com/graphql/graphiql/commit/16509a4278d523a7f0a96c846cc0f370d29a0700))\n\n### Features\n\n- **cli:** recommend matching commands ([#1420](https://github.com/graphql/graphiql/issues/1420)) ([0fbae82](https://github.com/graphql/graphiql/commit/0fbae828ced2e8b95016268805654cde8322b076))\n- **graphql-config:** add graphql config extensions ([#1118](https://github.com/graphql/graphiql/issues/1118)) ([2a77e47](https://github.com/graphql/graphiql/commit/2a77e47719ec9181a00183a08ffa11287b8fd2f5))\n- capture unknown commands making use of the in-house s… ([#1417](https://github.com/graphql/graphiql/issues/1417)) ([dd12a6b](https://github.com/graphql/graphiql/commit/dd12a6b903976ce8d35cf91d3c9606450f1c0990))\n- use new GraphQL Config ([#1342](https://github.com/graphql/graphiql/issues/1342)) ([e45838f](https://github.com/graphql/graphiql/commit/e45838f5ba579e05b20f1a147ce431478ffad9aa))\n\n## [2.4.0-alpha.1](https://github.com/graphql/graphiql/compare/graphql-language-service@2.3.4...graphql-language-service@2.4.0-alpha.1) (2020-01-18)\n\n### Features\n\n- convert LSP Server to Typescript, remove watchman ([#1138](https://github.com/graphql/graphiql/issues/1138)) ([8e33dbb](https://github.com/graphql/graphiql/commit/8e33dbb))\n\n## [2.3.4](https://github.com/graphql/graphiql/compare/graphql-language-service@2.3.3...graphql-language-service@2.3.4) (2019-12-09)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.3.3](https://github.com/graphql/graphiql/compare/graphql-language-service@2.3.2...graphql-language-service@2.3.3) (2019-12-09)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.3.2](https://github.com/graphql/graphiql/compare/graphql-language-service@2.3.1...graphql-language-service@2.3.2) (2019-12-03)\n\n**Note:** Version bump only for package graphql-language-service\n\n## [2.3.1](https://github.com/graphql/graphiql/compare/graphql-language-service@2.3.0...graphql-language-service@2.3.1) (2019-11-26)\n\n**Note:** Version bump only for package graphql-language-service\n\n# 2.3.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 2.0.1 (2019-05-14)\n\n# 2.0.0 (2018-09-18)\n\n## 1.2.2 (2018-06-11)\n\n## 1.1.2 (2018-04-19)\n\n## 1.1.1 (2018-04-18)\n\n# 1.1.0 (2018-04-09)\n\n## 1.0.18 (2018-01-04)\n\n## 1.0.16 (2017-11-21)\n\n## 1.0.15 (2017-10-02)\n\n## 0.1.14 (2017-09-29)\n\n## 0.1.13 (2017-08-24)\n\n## 0.1.12 (2017-08-21)\n\n## 0.1.11 (2017-08-20)\n\n## 0.1.10 (2017-08-19)\n\n## 0.1.9 (2017-08-18)\n\n## 0.1.8 (2017-08-18)\n\n## 0.1.7 (2017-08-16)\n\n## 0.1.6 (2017-08-15)\n\n## 0.1.5 (2017-08-14)\n\n## 0.1.5-0 (2017-08-10)\n\n## 0.1.4-0 (2017-08-10)\n\n## 0.1.3-0 (2017-08-10)\n\n## 0.1.2-0 (2017-08-10)\n\n## 0.1.1-0 (2017-08-10)\n\n# 0.1.0-0 (2017-08-10)\n\n# 2.2.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 2.0.1 (2019-05-14)\n\n# 2.0.0 (2018-09-18)\n\n## 1.2.2 (2018-06-11)\n\n## 1.1.2 (2018-04-19)\n\n## 1.1.1 (2018-04-18)\n\n# 1.1.0 (2018-04-09)\n\n## 1.0.18 (2018-01-04)\n\n## 1.0.16 (2017-11-21)\n\n## 1.0.15 (2017-10-02)\n\n## 0.1.14 (2017-09-29)\n\n## 0.1.13 (2017-08-24)\n\n## 0.1.12 (2017-08-21)\n\n## 0.1.11 (2017-08-20)\n\n## 0.1.10 (2017-08-19)\n\n## 0.1.9 (2017-08-18)\n\n## 0.1.8 (2017-08-18)\n\n## 0.1.7 (2017-08-16)\n\n## 0.1.6 (2017-08-15)\n\n## 0.1.5 (2017-08-14)\n\n## 0.1.5-0 (2017-08-10)\n\n## 0.1.4-0 (2017-08-10)\n\n## 0.1.3-0 (2017-08-10)\n\n## 0.1.2-0 (2017-08-10)\n\n## 0.1.1-0 (2017-08-10)\n\n# 0.1.0-0 (2017-08-10)\n\n# 2.2.0-alpha.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 2.0.1 (2019-05-14)\n\n# 2.0.0 (2018-09-18)\n\n## 1.2.2 (2018-06-11)\n\n## 1.1.2 (2018-04-19)\n\n## 1.1.1 (2018-04-18)\n\n# 1.1.0 (2018-04-09)\n\n## 1.0.18 (2018-01-04)\n\n## 1.0.16 (2017-11-21)\n\n## 1.0.15 (2017-10-02)\n\n## 0.1.14 (2017-09-29)\n\n## 0.1.13 (2017-08-24)\n\n## 0.1.12 (2017-08-21)\n\n## 0.1.11 (2017-08-20)\n\n## 0.1.10 (2017-08-19)\n\n## 0.1.9 (2017-08-18)\n\n## 0.1.8 (2017-08-18)\n\n## 0.1.7 (2017-08-16)\n\n## 0.1.6 (2017-08-15)\n\n## 0.1.5 (2017-08-14)\n\n## 0.1.5-0 (2017-08-10)\n\n## 0.1.4-0 (2017-08-10)\n\n## 0.1.3-0 (2017-08-10)\n\n## 0.1.2-0 (2017-08-10)\n\n## 0.1.1-0 (2017-08-10)\n\n# 0.1.0-0 (2017-08-10)\n\n## 2.1.1-alpha.1 (2019-09-01)\n\n## 2.0.1 (2019-05-14)\n\n# 2.0.0 (2018-09-18)\n\n## 1.2.2 (2018-06-11)\n\n## 1.1.2 (2018-04-19)\n\n## 1.1.1 (2018-04-18)\n\n# 1.1.0 (2018-04-09)\n\n## 1.0.18 (2018-01-04)\n\n## 1.0.16 (2017-11-21)\n\n## 1.0.15 (2017-10-02)\n\n## 0.1.14 (2017-09-29)\n\n## 0.1.13 (2017-08-24)\n\n## 0.1.12 (2017-08-21)\n\n## 0.1.11 (2017-08-20)\n\n## 0.1.10 (2017-08-19)\n\n## 0.1.9 (2017-08-18)\n\n## 0.1.8 (2017-08-18)\n\n## 0.1.7 (2017-08-16)\n\n## 0.1.6 (2017-08-15)\n\n## 0.1.5 (2017-08-14)\n\n## 0.1.5-0 (2017-08-10)\n\n## 0.1.4-0 (2017-08-10)\n\n## 0.1.3-0 (2017-08-10)\n\n## 0.1.2-0 (2017-08-10)\n\n## 0.1.1-0 (2017-08-10)\n\n# 0.1.0-0 (2017-08-10)\n\n**Note:** Version bump only for package graphql-language-service\n\n## 2.1.1-alpha.0 (2019-09-01)\n\n## 2.0.1 (2019-05-14)\n\n# 2.0.0 (2018-09-18)\n\n## 1.2.2 (2018-06-11)\n\n## 1.1.2 (2018-04-19)\n\n## 1.1.1 (2018-04-18)\n\n# 1.1.0 (2018-04-09)\n\n## 1.0.18 (2018-01-04)\n\n## 1.0.16 (2017-11-21)\n\n## 1.0.15 (2017-10-02)\n\n## 0.1.14 (2017-09-29)\n\n## 0.1.13 (2017-08-24)\n\n## 0.1.12 (2017-08-21)\n\n## 0.1.11 (2017-08-20)\n\n## 0.1.10 (2017-08-19)\n\n## 0.1.9 (2017-08-18)\n\n## 0.1.8 (2017-08-18)\n\n## 0.1.7 (2017-08-16)\n\n## 0.1.6 (2017-08-15)\n\n## 0.1.5 (2017-08-14)\n\n## 0.1.5-0 (2017-08-10)\n\n## 0.1.4-0 (2017-08-10)\n\n## 0.1.3-0 (2017-08-10)\n\n## 0.1.2-0 (2017-08-10)\n\n## 0.1.1-0 (2017-08-10)\n\n# 0.1.0-0 (2017-08-10)\n\n**Note:** Version bump only for package graphql-language-service\n\n## 2.1.1 (2019-09-01)\n\n## 2.0.1 (2019-05-14)\n\n# 2.0.0 (2018-09-18)\n\n## 1.2.2 (2018-06-11)\n\n## 1.1.2 (2018-04-19)\n\n## 1.1.1 (2018-04-18)\n\n# 1.1.0 (2018-04-09)\n\n## 1.0.18 (2018-01-04)\n\n## 1.0.16 (2017-11-21)\n\n## 1.0.15 (2017-10-02)\n\n## 0.1.14 (2017-09-29)\n\n## 0.1.13 (2017-08-24)\n\n## 0.1.12 (2017-08-21)\n\n## 0.1.11 (2017-08-20)\n\n## 0.1.10 (2017-08-19)\n\n## 0.1.9 (2017-08-18)\n\n## 0.1.8 (2017-08-18)\n\n## 0.1.7 (2017-08-16)\n\n## 0.1.6 (2017-08-15)\n\n## 0.1.5 (2017-08-14)\n\n## 0.1.5-0 (2017-08-10)\n\n## 0.1.4-0 (2017-08-10)\n\n## 0.1.3-0 (2017-08-10)\n\n## 0.1.2-0 (2017-08-10)\n\n## 0.1.1-0 (2017-08-10)\n\n# 0.1.0-0 (2017-08-10)\n\n**Note:** Version bump only for package graphql-language-service\n"
  },
  {
    "path": "packages/graphql-language-service-cli/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/graphql-language-service-cli/README.md",
    "content": "# graphql-language-service-cli\n\n> Note: As of 3.0.0, this package has been renamed from\n> `graphql-language-service` to `graphql-language-service-cli`. please now use\n> the `graphql-lsp` bin, instead of the `graphql` binary.\n\n[![NPM](https://img.shields.io/npm/v/graphql-language-service-cli.svg)](https://npmjs.com/graphql-language-service-cli)\n![npm downloads](https://img.shields.io/npm/dm/graphql-language-service-vli?label=npm%20downloads)\n![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/codemirror-graphql)\n[![License](https://img.shields.io/npm/l/graphql-language-service.svg?style=flat-square)](LICENSE)\n\n_We welcome your feedback and suggestions._\n\nGraphQL Language Service provides an interface for building GraphQL language\nservices for IDEs.\n\nAlmost 100% for\n[Microsoft's Language Server Protocol](https://github.com/Microsoft/language-server-protocol)\nis in place\n\nSupported features include:\n\n- Diagnostics (GraphQL syntax linting/validations) (**spec-compliant**)\n- Autocomplete suggestions (**spec-compliant**)\n- Hyperlink to fragment definitions and named types (type, input, enum)\n  definitions (**spec-compliant**)\n- Outline view support for queries and SDL\n- Symbols support across the workspace\n\nsee more information at\n[`graphql-language-service-server`](https://npmjs.com/graphql-language-service-server)\n\n## Installation and Usage\n\n### Dependencies\n\nAn LSP-compatible client with a file watcher that sends watch notifications to\nthe server.\n\n**DROPPED**: GraphQL Language Service no longer depends on\n[Watchman](https://facebook.github.io/watchman/)\n\nOnly node 9 or greater, and npm or yarn are required dependencies.\n\n### Installation\n\nwith `yarn`:\n\n```sh\nyarn global add graphql-language-service-cli\n```\n\nwith `npm`:\n\n```sh\nnpm install -g graphql-language-service-cli\n```\n\neither will install the `graphql-lsp` bin globally\n\n### GraphQL configuration file (`.graphqlrc.yml`)\n\nCheck out [graphql-config](https://graphql-config.com/docs)\n\nThe custom graphql language configurations are:\n\n- `customDirectives` - `['@myExampleDirective']`\n- `customValidationRules` - returns rules array with parameter\n  `ValidationContext` from `graphql/validation`\n\n### LSP Workspace Configuration\n\nWhen running `server`, your LSP-compatible client can\n[provide additional workspace configuration](https://npmjs.com/graphql-language-service-server#workspace-configuration).\n\nFor example, `coc.nvim` allows for providing custom `settings`\n\n```json\n\"languageserver\": {\n  \"graphql\": {\n    \"command\": \"graphql-lsp\",\n    \"args\": [\"server\", \"-m\", \"stream\"],\n    // customize filetypes to your needs\n    \"filetypes\": [\"typescript\", \"typescriptreact\", \"graphql\"],\n    \"settings\": {\n        \"graphql-config.load.legacy\": true\n    }\n  }\n}\n```\n\nthis would allow for legacy `graphql-config` file formats like `.graphqlconfig`,\nuseful on projects maintaining compatibility with the intellij plugin\n\n### Using the command-line interface\n\n```sh\ngraphql-lsp server --schema=localhost:3000\n```\n\nThe node executable contains several commands: `server` and the command-line\nlanguage service methods (`validate`, `autocomplete`, `outline`).\n\n### CLI Options\n\n```\nUsage: graphql-lsp <command> <file>\n\n[-h | --help][-c | --configDir] {configDir}\n[-t | --text] {textBuffer}\n[-f | --file] {filePath}\n[-s | --schema] {schemaPath}\n\nOptions:\n\n-h, --help Show help [boolean]\n\n-t, --text Text buffer to perform GraphQL diagnostics on.\nWill defer to --file option if omitted.\nOverrides the --file option, if any.\n[string]\n\n-f, --file File path to perform GraphQL diagnostics on.\nWill be ignored if --text option is supplied.\n[string]\n\n--row A row number from the cursor location for GraphQL\nautocomplete suggestions.\nIf omitted, the last row number will be used.\n[number]\n\n--column A column number from the cursor location for GraphQL\nautocomplete suggestions.\nIf omitted, the last column number will be used.\n[number]\n\n-c, --configDir Path to the .graphqlrc.yml configuration file.\nWalks up the directory tree from the provided config\ndirectory, or the current working directory, until a\n.graphqlrc is found or the root directory is found.\n[string]\n\n-s, --schemaPath a path to schema DSL file\n[string]\n\nAt least one command is required.\nCommands: \"server, validate, autocomplete, outline\"\n\n```\n"
  },
  {
    "path": "packages/graphql-language-service-cli/bin/graphql.js",
    "content": "#!/usr/bin/env node\n/*\n * Copyright (c) 2021 GraphQL Contributors\n * All rights reserved.\n *\n * This source code is licensed under the license found in the LICENSE file in\n * the root directory of this source tree.\n */\n\nif (process?.env) {\n  process.env.GRAPHQL_NO_NAME_WARNING = true;\n}\n\nrequire('@babel/polyfill');\nrequire('../dist/cli');\n"
  },
  {
    "path": "packages/graphql-language-service-cli/package.json",
    "content": "{\n  \"name\": \"graphql-language-service-cli\",\n  \"version\": \"3.5.0\",\n  \"description\": \"An interface for building GraphQL language services for IDEs\",\n  \"contributors\": [\n    \"Hyohyeon Jeong <asiandrummer@fb.com>\",\n    \"Lee Byron <lee@leebyron.com> (https://leebyron.com)\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphql-language-service-cli\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:language-service-cli\"\n  },\n  \"bin\": {\n    \"graphql-lsp\": \"./bin/graphql.js\"\n  },\n  \"license\": \"MIT\",\n  \"files\": [\n    \"bin\",\n    \"dist\",\n    \"src\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"test\": \"vitest\"\n  },\n  \"keywords\": [\n    \"graphql\",\n    \"graphql-language-service\",\n    \"graphql-language-service-cli\",\n    \"language server\",\n    \"LSP\"\n  ],\n  \"peerDependencies\": {\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\"\n  },\n  \"dependencies\": {\n    \"@babel/polyfill\": \"^7.12.1\",\n    \"@types/yargs\": \"16.0.5\",\n    \"graphql-language-service\": \"^5.3.0\",\n    \"graphql-language-service-server\": \"^2.14.0\",\n    \"yargs\": \"^16.2.0\"\n  },\n  \"devDependencies\": {\n    \"graphql\": \"^16.9.0\"\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-cli/src/__tests__/client.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport main from '../client';\n\ndescribe('process.stderr.write', () => {\n  afterEach(() => {\n    vi.restoreAllMocks();\n  });\n\n  it('is passed information on error of string type', () => {\n    const argv = {\n      schemaPath: '...',\n      text: 'foo',\n    };\n    const mockStdErrWrite = vi\n      .spyOn(process.stderr, 'write')\n      .mockImplementation();\n    vi.spyOn(process, 'exit').mockImplementation(() => {});\n    const undefinedWithNewLine = /^undefined\\n$/;\n\n    main('autocomplete', argv);\n    expect(mockStdErrWrite).toHaveBeenLastCalledWith(expect.any(String));\n    expect(mockStdErrWrite).toHaveBeenLastCalledWith(\n      expect.not.stringMatching(undefinedWithNewLine),\n    );\n\n    main('outline', argv);\n    expect(mockStdErrWrite).toHaveBeenLastCalledWith(expect.any(String));\n    expect(mockStdErrWrite).toHaveBeenLastCalledWith(\n      expect.not.stringMatching(undefinedWithNewLine),\n    );\n\n    main('validate', argv);\n    expect(mockStdErrWrite).toHaveBeenLastCalledWith(expect.any(String));\n    expect(mockStdErrWrite).toHaveBeenLastCalledWith(\n      expect.not.stringMatching(undefinedWithNewLine),\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-cli/src/__tests__/index.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\ndescribe('blinking light demo', () => {\n  it('runs', () => {\n    // This is just a placeholder for now as all the existing tests have moved\n    // down into the respective package directories. In the future, this will be\n    // the home of the integration tests.\n    expect(true).toEqual(true);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-cli/src/cli.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport yargs from 'yargs';\nimport client from './client';\n\nimport { startServer } from 'graphql-language-service-server';\n\nconst { argv } = yargs\n  .usage(\n    'GraphQL Language Service Command-Line Interface.\\n' +\n      'Usage: graphql-lsp <command> <file>\\n' +\n      '    [-h | --help]\\n' +\n      '    [-c | --configDir] {configDir}\\n' +\n      '    [-t | --text] {textBuffer}\\n' +\n      '    [-f | --file] {filePath}\\n' +\n      '    [-s | --schema] {schemaPath}\\n' +\n      '    [-m | --method] {method}\\n' +\n      '    [-p | --port] {port}\\n' +\n      '\\n    At least one command is required.\\n',\n  )\n  .help('h')\n  .alias('h', 'help')\n  .strict()\n  .recommendCommands()\n  .demandCommand(\n    1,\n    'At least one command is required.\\n' +\n      'Commands: \"server, validate, autocomplete, outline\"\\n',\n  )\n  .command('server', 'GraphQL language server service')\n  .command('validate', 'Validates the query')\n  .command('autocomplete', 'Get autocomplete suggestions')\n  .command('outline', 'Get outline')\n  .option('t', {\n    alias: 'text',\n    describe:\n      'Text buffer to perform GraphQL diagnostics on.\\n' +\n      'Will defer to --file option if omitted.\\n' +\n      'Overrides the --file option, if any.\\n',\n    type: 'string',\n  })\n  .option('f', {\n    alias: 'file',\n    describe:\n      'File path to perform GraphQL diagnostics on.\\n' +\n      'Will be ignored if --text option is supplied.\\n',\n    type: 'string',\n  })\n  .option('row', {\n    describe:\n      'A row number from the cursor location for ' +\n      'GraphQL autocomplete suggestions.\\n' +\n      'If omitted, the last row number will be used.\\n',\n    type: 'number',\n  })\n  .option('column', {\n    describe:\n      'A column number from the cursor location for ' +\n      'GraphQL autocomplete suggestions.\\n' +\n      'If omitted, the last column number will be used.\\n',\n    type: 'number',\n  })\n  .option('c', {\n    alias: 'configDir',\n    describe:\n      'Path to the .graphqlrc configuration file.\\n' +\n      'Walks up the directory tree from the provided config directory, or ' +\n      'the current working directory, until a .graphqlrc is found or ' +\n      'the root directory is found.\\n',\n    type: 'string',\n  })\n  .option('m', {\n    alias: 'method',\n    describe:\n      'A IPC communication method between client and server.\\n' +\n      'Can be one of: stream, node, socket.\\n' +\n      'Will default to use a node IPC channel for communication.\\n',\n    type: 'string',\n    default: 'node',\n  })\n  .option('p', {\n    alias: 'port',\n    describe:\n      'Port number to communicate via socket.\\n' +\n      'The port number of a service running inside the IDE that the language ' +\n      'service should connect to.\\n' +\n      'Required if the client communicates via socket connection.\\n',\n    type: 'number',\n  })\n  .option('s', {\n    alias: 'schemaPath',\n    describe: 'a path to schema DSL file\\n',\n    type: 'string',\n  });\n\nconst command = argv._.pop();\n\nif (!command) {\n  process.stdout.write('no command supplied');\n  process.exit(0);\n}\n\nif (command === 'server') {\n  process.on('uncaughtException', error => {\n    process.stderr.write(\n      'An error was thrown from GraphQL language service: ' + String(error),\n    );\n    // don't exit at all if there is an uncaughtException\n    // process.exit(0);\n  });\n\n  const options: { [key: string]: any } = {};\n  if (argv.port) {\n    options.port = argv.port;\n  }\n  if (argv.method) {\n    options.method = argv.method;\n  }\n  if (argv.configDir) {\n    options.configDir = argv.configDir;\n  }\n  // eslint-disable-next-line promise/prefer-await-to-then -- don't know if I can use top level await here\n  startServer(options).catch(error => {\n    process.stderr.write(\n      'An error was thrown from GraphQL language service: ' + String(error),\n    );\n  });\n} else {\n  client(command as string, argv as Record<string, string>);\n}\n\n// Exit the process when stream closes from remote end.\nprocess.stdin.on('close', () => {\n  process.exit(0);\n});\n"
  },
  {
    "path": "packages/graphql-language-service-cli/src/client.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { GraphQLSchema, buildSchema, buildClientSchema } from 'graphql';\n\nimport invariant from 'node:assert';\nimport fs from 'node:fs';\nimport {\n  getAutocompleteSuggestions,\n  getDiagnostics,\n  getOutline,\n  Position,\n} from 'graphql-language-service';\n\nimport path from 'node:path';\n\nimport type { CompletionItem, Diagnostic } from 'graphql-language-service';\n\nconst GRAPHQL_SUCCESS_CODE = 0;\nconst GRAPHQL_FAILURE_CODE = 1;\n\ntype EXIT_CODE = 0 | 1;\n\n/**\n * Performs GraphQL language service features with provided arguments from\n * the command-line interface.\n *\n * `autocomplete`: returns GraphQL autocomplete suggestions at the cursor\n *                 location provided, or at the end of the query text.\n * `outline`: returns GraphQL query outline information.\n * `validate`: performs GraphQL query lint/validations and returns the results.\n *             Query validation is only performed if a schema path is supplied.\n */\n\nexport default function main(\n  command: string,\n  argv: { [key: string]: string },\n): void {\n  const filePath = argv.file?.trim();\n  invariant(\n    argv.text || argv.file,\n    'A path to the GraphQL file or its contents is required.',\n  );\n\n  const text = ensureText(argv.text, filePath);\n  const schemaPath = argv.schemaPath?.trim();\n\n  let exitCode;\n  switch (command) {\n    case 'autocomplete':\n      const lines = text.split('\\n');\n      const row = parseInt(argv.row, 10) || lines.length - 1;\n      const column = parseInt(argv.column, 10) || lines.at(-1)!.length;\n      const point = new Position(row, column);\n      exitCode = _getAutocompleteSuggestions(text, point, schemaPath);\n      break;\n    case 'outline':\n      exitCode = _getOutline(text);\n      break;\n    case 'validate':\n      exitCode = _getDiagnostics(filePath, text, schemaPath);\n      break;\n    default:\n      throw new Error(`Unknown command '${command}'`);\n  }\n\n  process.exit(exitCode);\n}\n\ninterface AutocompleteResultsMap {\n  [i: number]: CompletionItem;\n}\n\nfunction formatUnknownError(error: unknown) {\n  let message: string | undefined;\n  if (error instanceof Error) {\n    message = error.stack;\n  }\n  return message ?? String(error);\n}\n\nfunction _getAutocompleteSuggestions(\n  queryText: string,\n  point: Position,\n  schemaPath: string,\n): EXIT_CODE {\n  invariant(\n    schemaPath,\n    'A schema path is required to provide GraphQL autocompletion',\n  );\n\n  try {\n    const schema = schemaPath ? generateSchema(schemaPath) : null;\n    const resultArray = schema\n      ? getAutocompleteSuggestions(schema, queryText, point)\n      : [];\n    const resultObject: AutocompleteResultsMap = resultArray.reduce(\n      (prev: AutocompleteResultsMap, cur, index) => {\n        prev[index] = cur;\n        return prev;\n      },\n      {},\n    );\n    process.stdout.write(JSON.stringify(resultObject, null, 2));\n    return GRAPHQL_SUCCESS_CODE;\n  } catch (error) {\n    process.stderr.write(formatUnknownError(error) + '\\n');\n    return GRAPHQL_FAILURE_CODE;\n  }\n}\n\ninterface DiagnosticResultsMap {\n  [i: number]: Diagnostic;\n}\n\nfunction _getDiagnostics(\n  _filePath: string,\n  queryText: string,\n  schemaPath?: string,\n): EXIT_CODE {\n  try {\n    // `schema` is not strictly required as GraphQL diagnostics may still notify\n    // whether the query text is syntactically valid.\n    const schema = schemaPath ? generateSchema(schemaPath) : null;\n    const resultArray = getDiagnostics(queryText, schema);\n    const resultObject: DiagnosticResultsMap = resultArray.reduce(\n      (prev: DiagnosticResultsMap, cur, index) => {\n        prev[index] = cur;\n        return prev;\n      },\n      {},\n    );\n    process.stdout.write(JSON.stringify(resultObject, null, 2));\n    return GRAPHQL_SUCCESS_CODE;\n  } catch (error) {\n    process.stderr.write(formatUnknownError(error) + '\\n');\n    return GRAPHQL_FAILURE_CODE;\n  }\n}\n\nfunction _getOutline(queryText: string): EXIT_CODE {\n  try {\n    const outline = getOutline(queryText);\n    if (outline) {\n      process.stdout.write(JSON.stringify(outline, null, 2));\n    } else {\n      throw new Error('Error parsing or no outline tree found');\n    }\n  } catch (error) {\n    process.stderr.write(formatUnknownError(error) + '\\n');\n    return GRAPHQL_FAILURE_CODE;\n  }\n  return GRAPHQL_SUCCESS_CODE;\n}\n\nfunction ensureText(queryText: string, filePath: string): string {\n  let text = queryText;\n  // Always honor text argument over filePath.\n  // If text isn't available, try reading from the filePath.\n  if (!text) {\n    try {\n      text = fs.readFileSync(filePath, 'utf8');\n    } catch (error) {\n      throw new Error(String(error));\n    }\n  }\n  return text;\n}\n\nfunction generateSchema(schemaPath: string): GraphQLSchema {\n  const schemaDSL = fs.readFileSync(schemaPath, 'utf8');\n  const schemaFileExt = path.extname(schemaPath);\n  switch (schemaFileExt) {\n    case '.graphql':\n      return buildSchema(schemaDSL);\n    case '.json':\n      return buildClientSchema(JSON.parse(schemaDSL));\n    default:\n      throw new Error('Unsupported schema file extension');\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-cli/tsconfig.esm.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./esm\",\n    \"composite\": true,\n    \"target\": \"ES2018\"\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    },\n    {\n      \"path\": \"../graphql-language-service-server\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/graphql-language-service-cli/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\",\n    \"target\": \"ES2018\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    },\n    {\n      \"path\": \"../graphql-language-service-server\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/graphql-language-service-cli/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n  },\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/.npmignore",
    "content": "node_modules\nsrc\nyarn.lock\n"
  },
  {
    "path": "packages/graphql-language-service-server/CHANGELOG.md",
    "content": "# graphql-language-service-server\n\n## 2.14.8\n\n### Patch Changes\n\n- [#3975](https://github.com/graphql/graphiql/pull/3975) [`4375aa7`](https://github.com/graphql/graphiql/commit/4375aa7a16e875949840be6cb6e216d0abdd835b) Thanks [@benjie](https://github.com/benjie)! - fix `GraphQLCache._schemaMap` type, should be `LRUCache`\n\n## 2.14.7\n\n### Patch Changes\n\n- [#3964](https://github.com/graphql/graphiql/pull/3964) [`12cd5d7`](https://github.com/graphql/graphiql/commit/12cd5d7c8e89ed8ddfcc33267043f2107c770641) Thanks [@pleb](https://github.com/pleb)! - fix vs code extension setting graphql-config.dotEnvPath incorrect registration path\n\n## 2.14.6\n\n### Patch Changes\n\n- [#3954](https://github.com/graphql/graphiql/pull/3954) [`8ec7a77`](https://github.com/graphql/graphiql/commit/8ec7a77e77078f7cb3826263518c8df6ab16bc24) Thanks [@dimaMachina](https://github.com/dimaMachina)! - [lsp] Fix parsing of relay style locations in locateCommand results\n\n## 2.14.5\n\n### Patch Changes\n\n- [#3933](https://github.com/graphql/graphiql/pull/3933) [`38fdcdb`](https://github.com/graphql/graphiql/commit/38fdcdbc4bab5451638f56eae5a19062632afe93) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove unnecessary string conversion in `logger.info(String(error))`\n\n## 2.14.4\n\n### Patch Changes\n\n- [#3913](https://github.com/graphql/graphiql/pull/3913) [`3b5c309`](https://github.com/graphql/graphiql/commit/3b5c309e71b381311a6e928db089f4fa48530b35) Thanks [@joshbode](https://github.com/joshbode)! - return `null` instead of an empty `contents` array when hover results are empty\n\n## 2.14.3\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n- Updated dependencies [[`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - graphql-language-service@5.3.1\n\n## 2.14.2\n\n### Patch Changes\n\n- [#3883](https://github.com/graphql/graphiql/pull/3883) [`f8ac8cf`](https://github.com/graphql/graphiql/commit/f8ac8cf5f083d40258ae461144cca2c7b196d397) Thanks [@acao](https://github.com/acao)! - Bump vscode-graphql and LSP server for patch fixes\n\n## 2.14.1\n\n### Patch Changes\n\n- [#3861](https://github.com/graphql/graphiql/pull/3861) [`c5325dd`](https://github.com/graphql/graphiql/commit/c5325ddc30bfe4528c6a238be72ef6db6ae72795) Thanks [@motemen](https://github.com/motemen)! - fix parsing non-graphql documents\n\n## 2.14.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service@5.3.0\n\n## 2.13.3\n\n### Patch Changes\n\n- [#3703](https://github.com/graphql/graphiql/pull/3703) [`590a987`](https://github.com/graphql/graphiql/commit/590a987811b5ddcc37f5b76900dd2b8dba802f91) Thanks [@acao](https://github.com/acao)! - use `filepath` instead of `filePath` for `graphql-config`\n\n## 2.13.2\n\n### Patch Changes\n\n- [#3647](https://github.com/graphql/graphiql/pull/3647) [`ba5720b`](https://github.com/graphql/graphiql/commit/ba5720b430ed1c888ff64c67aa4b9a36083b9ed0) Thanks [@acao](https://github.com/acao)! - several LSP fixes and improvements:\n\n  **Bugfixes**\n\n  debounce schema change events to fix codegen bugs to fix #3622\n\n  on mass file changes, network schema is overfetching because the schema cache is now invalidated on every watched schema file change\n\n  to address this, we debounce the new `onSchemaChange` event by 400ms\n\n  note that `schemaCacheTTL` can only be set in extension settings or graphql config at the top level - it will be ignored if configured per-project in the graphql config\n\n  **Code Improvements**\n\n  - Fixes flaky tests, and `schemaCacheTTL` setting not being passed to the cache\n  - Adds a test to validate network schema changes are reflected in the cache\n\n- [#3637](https://github.com/graphql/graphiql/pull/3637) [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update eslint plugins and fix errors\n\n- [#3671](https://github.com/graphql/graphiql/pull/3671) [`e2c04c7`](https://github.com/graphql/graphiql/commit/e2c04c7c2dc5109ff0446d9a6a010ffdffed1e44) Thanks [@acao](https://github.com/acao)! - - switch to using just @astrojs/compiler instead of the more complex \"sync\" adaptation using workers\n  - upgrade vue SFC parser to use the new reccomended import from vue package itself\n  - fix prettier config related to prettier & format on save for parseDocument tests\n  - fix jest/babel config related to some of the parsers\n- Updated dependencies [[`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d)]:\n  - graphql-language-service@5.2.2\n\n## 2.13.1\n\n### Patch Changes\n\n- [#3628](https://github.com/graphql/graphiql/pull/3628) [`7fad662f`](https://github.com/graphql/graphiql/commit/7fad662f77eae9f842bb55cb93cb98df33bbc1ed) Thanks [@acao](https://github.com/acao)! - fix the lsp stream interface for stdin/out (neovim, etc)\n\n## 2.13.0\n\n### Minor Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fix many schema and fragment lifecycle issues, not all of them, but many related to cacheing. Note: this makes `cacheSchemaForLookup` enabled by default again for schema first contexts.\n\n  This fixes multiple cacheing bugs, upon addomg some in-depth integration test coverage for the LSP server. It also solves several bugs regarding loading config types, and properly restarts the server and invalidates schema when there are config changes.\n\n  ### Bugfix Summary\n\n  - configurable polling updates for network and other code first schema configuration, set to a 30s interval by default. powered by `schemaCacheTTL` which can be configured in the IDE settings (vscode, nvim) or in the graphql config file. (1)\n  - jump to definition in embedded files offset bug, for both fragments and code files with SDL strings\n  - cache invalidation for fragments (fragment lookup/autcoomplete data is more accurate, but incomplete/invalid fragments still do not autocomplete or validate, and remember fragment options always filter/validate by the `on` type!)\n  - schema cache invalidation for schema files - schema updates as you change the SDL files, and the generated file for code first by the `schemaCacheTTL` setting\n  - schema definition lookups & autocomplete crossing over into the wrong project\n\n  **Notes**\n\n  1. If possible, configuring for your locally running framework or a schema registry client to handle schema updates and output to a `schema.graphql` or `introspection.json` will always provide a better experience. many graphql frameworks have this built in! Otherwise, we must use this new lazy polling approach if you provide a url schema (this includes both introspection URLs and remote file URLs, and the combination of these).\n\n  ### Known Bugs Fixed\n\n  - #3318\n  - #2357\n  - #3469\n  - #2422\n  - #2820\n  - many more!\n\n  ### Test Improvements\n\n  - new, high level integration spec suite for the LSP with a matching test utility\n  - more unit test coverage\n  - **total increased test coverage of about 25% in the LSP server codebase.**\n  - many \"happy paths\" covered for both schema and code first contexts\n  - many bugs revealed (and their source)\n\n  ### What's next?\n\n  Another stage of the rewrite is already almost ready. This will fix even more bugs and improve memory usage, eliminate redundant parsing and ensure that graphql config's loaders do _all_ of the parsing and heavy lifting, thus honoring all the configs as well. It also significantly reduces the code complexity.\n\n  There is also a plan to match Relay LSP's lookup config for either IDE (vscode, nvm, etc) settings as they provide, or by loading modules into your `graphql-config`!\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Introduce `locateCommand` based on Relay LSP `pathToLocateCommand`:\n\n  Now with `<graphql config>.extensions.languageService.locateCommand`, you can specify either the [existing signature](https://marketplace.visualstudio.com/items?itemName=meta.relay#relay.pathtolocatecommand-default-null) for relay, with the same callback parameters and return signature (of a string delimited by `:` characters), or you can return an object with {uri, range} for the exact set of coordinates for the destination range. the function can be sync or async.\n\n  Relay LSP currently supports `Type` and `Type.field` for the 2nd argument. Ours also returns `Type.field(argument)` as a point of reference. It works with object types, input types, fragments, executable definitions and their fields, and should work for directive definitions as well.\n\n  In the case of unnamed types such as fragment spreads, they return the name of the implemented type currently, but I'm curious what users prefer here. I assumed that some people may want to not be limited to only using this for SDL type definition lookups. Also look soon to see `locateCommand` support added for symbols, outline, and coming references and implementations.\n\n  The module at the path you specify in relay LSP for `pathToLocateCommand` should work as such.\n\n  ```ts\n  // import it\n  import { locateCommand } from './graphql/tooling/lsp/locate.js';\n  export default {\n    languageService: {\n      locateCommand,\n    },\n\n    projects: {\n      a: {\n        schema: 'https://localhost:8000/graphql',\n        documents: './a/**/*.{ts,tsx,jsx,js,graphql}',\n      },\n      b: {\n        schema: './schema/ascode.ts',\n        documents: './b/**/*.{ts,tsx,jsx,js,graphql}',\n      },\n    },\n  };\n  ```\n\n  ```ts\n  // or define it inline\n\n  import { type LocateCommand } from 'graphql-language-service-server';\n\n  // relay LSP style\n  const locateCommand = (projectName: string, typePath: string) => {\n    const { path, startLine, endLine } = ourLookupUtility(\n      projectName,\n      typePath,\n    );\n    return `${path}:${startLine}:${endLine}`;\n  };\n\n  // an example with our alternative return signature\n  const locateCommand: LocateCommand = (projectName, typePath, info) => {\n    // pass more info, such as GraphQLType with the ast node. info.project is also available if you need it\n    const { path, range } = ourLookupUtility(\n      projectName,\n      typePath,\n      info.type.node,\n    );\n    return { uri: path, range }; // range.start.line/range.end.line\n  };\n\n  export default {\n    languageService: {\n      locateCommand,\n    },\n    schema: 'https://localhost:8000/graphql',\n    documents: './**/*.{ts,tsx,jsx,js,graphql}',\n  };\n  ```\n\n  Passing a string as a module path to resolve is coming in a follow-up release. Then it can be used with `.yml`, `.toml`, `.json`, `package.json#graphql`, etc\n\n  For now this was a quick baseline for a feature asked for in multiple channels!\n\n  Let us know how this works, and about any other interoperability improvements between our graphql LSP and other language servers (relay, intellij, etc) used by you and colleauges in your engineering organisations. We are trying our best to keep up with the awesome innovations they have 👀!\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service@5.2.1\n\n## 2.12.0\n\n### Minor Changes\n\n- [#3475](https://github.com/graphql/graphiql/pull/3475) [`98af5307`](https://github.com/graphql/graphiql/commit/98af53071bb27afc0afc82d66f539c1ac08315b3) Thanks [@XiNiHa](https://github.com/XiNiHa)! - Add Astro file support\n\n### Patch Changes\n\n- [#3514](https://github.com/graphql/graphiql/pull/3514) [`36c7f25c`](https://github.com/graphql/graphiql/commit/36c7f25c9388827d3a6a279eb090d61dc2600b56) Thanks [@acao](https://github.com/acao)! - fix svelte parsing, re-load config only on config changes\n\n  - fix esbuild bundling of `typescript` for `svelte2tsx`!\n  - confirm with manual testing of the vsix extension bundle ✅\n  - ensure that the server only attemps to parse opened/saved files when the server is activated or the file is a config file\n\n## 2.11.10\n\n### Patch Changes\n\n- [#3503](https://github.com/graphql/graphiql/pull/3503) [`6c7adf85`](https://github.com/graphql/graphiql/commit/6c7adf85c10d92cd3708a6dab44cb5b0f965fb84) Thanks [@acao](https://github.com/acao)! - Temporarily revert svelte parsing until we can fix bundling issues with svelte2tsx. For now we return to using the vue parser to parse svelte files which will invariably cause some issues, such as being off by several characters\n\n## 2.11.9\n\n### Patch Changes\n\n- [#3500](https://github.com/graphql/graphiql/pull/3500) [`34d0a976`](https://github.com/graphql/graphiql/commit/34d0a97688d7b83949f34bb4b2effebe4bafae79) Thanks [@acao](https://github.com/acao)! - Add typescript as a dependency for `svelte2tsx`\n\n## 2.11.8\n\n### Patch Changes\n\n- [#3498](https://github.com/graphql/graphiql/pull/3498) [`3bfb2877`](https://github.com/graphql/graphiql/commit/3bfb28777457f783852dfe5c9af739470194d33b) Thanks [@acao](https://github.com/acao)! - Add typescript as a dependency for `svelte2tsx`\n\n## 2.11.7\n\n### Patch Changes\n\n- [#3488](https://github.com/graphql/graphiql/pull/3488) [`d5028be2`](https://github.com/graphql/graphiql/commit/d5028be252ed385af972e090dda22788835da71e) Thanks [@acao](https://github.com/acao)! - Bump graphql & graphql-tools version to fix potential runtime security bugs\n\n- [`22771f35`](https://github.com/graphql/graphiql/commit/22771f35d00e4f80cb851e2a1f93db074e238e18) Thanks [@acao](https://github.com/acao)! - Fixes to svelte parsing, tag parsing refactor\n\n## 2.11.6\n\n### Patch Changes\n\n- [#3467](https://github.com/graphql/graphiql/pull/3467) [`75ccd72c`](https://github.com/graphql/graphiql/commit/75ccd72c660c3b20cafa38da01d18a91ea24c7db) Thanks [@A-N-uraag](https://github.com/A-N-uraag)! - Fixed crashing of LSP server on saving a schema with errors\n\n## 2.11.5\n\n### Patch Changes\n\n- [#3413](https://github.com/graphql/graphiql/pull/3413) [`530ef47a`](https://github.com/graphql/graphiql/commit/530ef47ac6bbcb24cedc453bf802626d4a630e45) Thanks [@BPScott](https://github.com/BPScott)! - Fix crash when editing a file that does not belong to a project\n\n## 2.11.4\n\n### Patch Changes\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n\n## 2.11.3\n\n### Patch Changes\n\n- [#3322](https://github.com/graphql/graphiql/pull/3322) [`6939bac4`](https://github.com/graphql/graphiql/commit/6939bac4a9a849fe497260fd0702bdd95eefd943) Thanks [@acao](https://github.com/acao)! - Bypass babel typescript parsing errors to continue extracting graphql strings\n\n## 2.11.2\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- [#3216](https://github.com/graphql/graphiql/pull/3216) [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8) Thanks [@simowe](https://github.com/simowe)! - fix: reload schema when a change to the schema file is detected\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7\n\n## 2.11.2-alpha.0\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- [#3216](https://github.com/graphql/graphiql/pull/3216) [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8) Thanks [@simowe](https://github.com/simowe)! - fix: reload schema when a change to the schema file is detected\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7-alpha.0\n\n## 2.11.1\n\n### Patch Changes\n\n- [#3143](https://github.com/graphql/graphiql/pull/3143) [`4c3a08b1`](https://github.com/graphql/graphiql/commit/4c3a08b1a99e0933362a1c93340b613730c90aa4) Thanks [@B2o5T](https://github.com/B2o5T)! - [ESLint] enable `sonar/prefer-promise-shorthand` and `sonar/no-dead-store` rules\n\n## 2.11.0\n\n### Minor Changes\n\n- [#3148](https://github.com/graphql/graphiql/pull/3148) [`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939) Thanks [@mskelton](https://github.com/mskelton)! - Use native LSP logger instead of manual file based logging. This fixes errors in Neovim when using the GraphQL LSP.\n\n### Patch Changes\n\n- [#3135](https://github.com/graphql/graphiql/pull/3135) [`28b1b5a0`](https://github.com/graphql/graphiql/commit/28b1b5a016787ec4119d28f057a9d93814d4e310) Thanks [@KammererTob](https://github.com/KammererTob)! - fixed wrong script tag offset for vue-sfc\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939)]:\n  - graphql-language-service@5.1.6\n\n## 2.10.0\n\n### Minor Changes\n\n- [#3163](https://github.com/graphql/graphiql/pull/3163) [`f2040452`](https://github.com/graphql/graphiql/commit/f20404529677635f5d4792b328aa648641bf8d9c) Thanks [@AaronMoat](https://github.com/AaronMoat)! - Fix GraphQLCache to read both documents and schema\n\n## 2.9.10\n\n### Patch Changes\n\n- [#3150](https://github.com/graphql/graphiql/pull/3150) [`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284) Thanks [@AaronMoat](https://github.com/AaronMoat)! - fix(graphql-language-service-server): allow getDefinition to work for unions\n\n  Fixes the issue where a schema like the one below won't allow you to click through to X.\n\n  ```graphql\n  union X = A | B\n  type A {\n    x: String\n  }\n  type B {\n    x: String\n  }\n  type Query {\n    a: X\n  }\n  ```\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service@5.1.5\n\n## 2.9.9\n\n### Patch Changes\n\n- [#3154](https://github.com/graphql/graphiql/pull/3154) [`632a7c6b`](https://github.com/graphql/graphiql/commit/632a7c6bb2959ef5d59236aeab218587578466e7) Thanks [@scamden](https://github.com/scamden)! - allow caching for multiple projects in graphql config\n\n## 2.9.8\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- [#3157](https://github.com/graphql/graphiql/pull/3157) [`06d39823`](https://github.com/graphql/graphiql/commit/06d39823e093c8441fea469446c25f18a664e778) Thanks [@jycouet](https://github.com/jycouet)! - fix: `.vue` and `.svelte` files doesn't log errors anymore when parsing with no script tag (#2836)\n\n- [#3109](https://github.com/graphql/graphiql/pull/3109) [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-floating-promises` eslint rule\n\n- [#3120](https://github.com/graphql/graphiql/pull/3120) [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040) Thanks [@B2o5T](https://github.com/B2o5T)! - prefer await to then\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9)]:\n  - graphql-language-service@5.1.4\n\n## 2.9.7\n\n### Patch Changes\n\n- [#3088](https://github.com/graphql/graphiql/pull/3088) [`9d9478ae`](https://github.com/graphql/graphiql/commit/9d9478aea7536d2957e4371cef4f30577db2113d) Thanks [@B2o5T](https://github.com/B2o5T)! - remove nowhere used `node-fetch` dependency\n\n- [#3046](https://github.com/graphql/graphiql/pull/3046) [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d) Thanks [@B2o5T](https://github.com/B2o5T)! - Prefer .at() method for index access\n\n- Updated dependencies [[`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0)]:\n  - graphql-language-service@5.1.3\n\n## 2.9.6\n\n### Patch Changes\n\n- [#2993](https://github.com/graphql/graphiql/pull/2993) [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4) Thanks [@B2o5T](https://github.com/B2o5T)! - add `unicorn/consistent-destructuring` rule\n\n- [#2962](https://github.com/graphql/graphiql/pull/2962) [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d) Thanks [@B2o5T](https://github.com/B2o5T)! - clean all ESLint warnings, add `--max-warnings=0` and `--cache` flags\n\n- [#3051](https://github.com/graphql/graphiql/pull/3051) [`90350022`](https://github.com/graphql/graphiql/commit/90350022334d9fcce0f4b72b3b0f7a12d21f78f9) Thanks [@B2o5T](https://github.com/B2o5T)! - update babel, support `satisfies` operator\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n\n## 2.9.5\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2966](https://github.com/graphql/graphiql/pull/2966) [`f9aa87dc`](https://github.com/graphql/graphiql/commit/f9aa87dc6a88ed8a8a0a94de520c7a41fff8ffde) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `sonarjs/no-small-switch` and `sonarjs/no-duplicated-branches` rules\n\n- [#2926](https://github.com/graphql/graphiql/pull/2926) [`10e97bbe`](https://github.com/graphql/graphiql/commit/10e97bbe6c9ff81bae73b11ba81ac2b69eca2772) Thanks [@elijaholmos](https://github.com/elijaholmos)! - support cts and mts file extensions\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- [#2933](https://github.com/graphql/graphiql/pull/2933) [`d502a33b`](https://github.com/graphql/graphiql/commit/d502a33b4332f1025e947c02d7cfdc5799365c8d) Thanks [@B2o5T](https://github.com/B2o5T)! - enable @typescript-eslint/no-unused-expressions\n\n- [#2965](https://github.com/graphql/graphiql/pull/2965) [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-optional-catch-binding` rule\n\n- [#2963](https://github.com/graphql/graphiql/pull/2963) [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `prefer-destructuring` rule\n\n- [#2942](https://github.com/graphql/graphiql/pull/2942) [`4ff2794c`](https://github.com/graphql/graphiql/commit/4ff2794c8b6032168e27252096cb276ce712878e) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `sonarjs/no-redundant-jump` rule\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171)]:\n  - graphql-language-service@5.1.1\n\n## 2.9.4\n\n### Patch Changes\n\n- [#2901](https://github.com/graphql/graphiql/pull/2901) [`eff4fd6b`](https://github.com/graphql/graphiql/commit/eff4fd6b9087c2d9cdb260ee2502a31d23769c3f) Thanks [@acao](https://github.com/acao)! - Reload the language service when a legacy format .graphqlconfig file has changed\n\n## 2.9.3\n\n### Patch Changes\n\n- [#2900](https://github.com/graphql/graphiql/pull/2900) [`8989ffce`](https://github.com/graphql/graphiql/commit/8989ffce7d6beca874e70f5a1ff066102580173a) Thanks [@acao](https://github.com/acao)! - use decorators-legacy @babel/parser plugin so that all styles of decorator usage are supported\n\n## 2.9.2\n\n### Patch Changes\n\n- [#2861](https://github.com/graphql/graphiql/pull/2861) [`bdd1bd04`](https://github.com/graphql/graphiql/commit/bdd1bd045fc6610ccaae4745b8ecc10004594274) Thanks [@aloker](https://github.com/aloker)! - add missing pieces for svelte language support\n\n* [#2488](https://github.com/graphql/graphiql/pull/2488) [`967006a6`](https://github.com/graphql/graphiql/commit/967006a68e56f8f3a605c69fee5f920afdb6d8cf) Thanks [@acao](https://github.com/acao)! - Disable`fillLeafsOnComplete` by default\n\n  Users found this generally annoying by default, especially when there are required arguments\n\n  Without automatically prompting autocompletion of required arguments as well as lead expansion, it makes the extension harder to use\n\n  You can now supply this in your graphql config:\n\n  `config.extensions.languageService.fillLeafsOnComplete`\n\n  Setting it to to `true` will enable this feature. Will soon add the ability to manually enable this in `monaco-graphql` as well.\n\n  For both, this kind of behavior would be better as a keyboard command, context menu item &/or codelens prompt\n\n## 2.9.1\n\n### Patch Changes\n\n- [#2829](https://github.com/graphql/graphiql/pull/2829) [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10) Thanks [@acao](https://github.com/acao)! - major bugfixes with `onDidChange` and `onDidChangeWatchedFiles` events\n\n* [#2829](https://github.com/graphql/graphiql/pull/2829) [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10) Thanks [@acao](https://github.com/acao)! - svelte language support, using the vue sfc parser introduced for vue support\n\n## 2.9.0\n\n### Minor Changes\n\n- [#2827](https://github.com/graphql/graphiql/pull/2827) [`b422003c`](https://github.com/graphql/graphiql/commit/b422003c2403072e96d14f920a3f0f1dc1f4f708) Thanks [@acao](https://github.com/acao)! - Introducing vue.js support for intellisense! Thanks @AumyF\n\n## 2.8.9\n\n### Patch Changes\n\n- [#2818](https://github.com/graphql/graphiql/pull/2818) [`929152f8`](https://github.com/graphql/graphiql/commit/929152f8ea076ffa3bf34b83445473331c3bdb67) Thanks [@acao](https://github.com/acao)! - Workspaces support introduced a regression for no-config scenario. Reverting to fix bugs with no graphql config crashing the server.\n\n## 2.8.8\n\n### Patch Changes\n\n- [#2812](https://github.com/graphql/graphiql/pull/2812) [`cf2e3061`](https://github.com/graphql/graphiql/commit/cf2e3061f67ef5cf6b890e217d20915d0eaec1bd) Thanks [@acao](https://github.com/acao)! - fix a bundling bug for vscode, rolling back graphql-config upgrade\n\n## 2.8.7\n\n### Patch Changes\n\n- [#2810](https://github.com/graphql/graphiql/pull/2810) [`f688422e`](https://github.com/graphql/graphiql/commit/f688422ed87ddd411cf3552fa6d9a5a367cd8662) Thanks [@acao](https://github.com/acao)! - fix graphql exec extension, upgrade `graphql-config`, fix issue with graphql-config cosmiconfig typescript config loader.\n\n## 2.8.6\n\n### Patch Changes\n\n- [#2808](https://github.com/graphql/graphiql/pull/2808) [`a2071504`](https://github.com/graphql/graphiql/commit/a20715046fe7684bb9b17fbc9f5637b44e5210d6) Thanks [@acao](https://github.com/acao)! - fix graphql config init bug\n\n## 2.8.5\n\n### Patch Changes\n\n- [#2616](https://github.com/graphql/graphiql/pull/2616) [`b0d7f06c`](https://github.com/graphql/graphiql/commit/b0d7f06cf9ec6fd6b1dcb61dd0273e37dd546ed5) Thanks [@acao](https://github.com/acao)! - support vscode multi-root workspaces! creates an LSP server instance for each workspace.\n\n  WARNING: large-scale vscode workspaces usage, and this in tandem with `graphql.config.*` multi-project configs could lead to excessive system resource usage. Optimizations coming soon.\n\n## 2.8.4\n\n### Patch Changes\n\n- Updated dependencies [[`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782)]:\n  - graphql-language-service@5.1.0\n\n## 2.8.3\n\n### Patch Changes\n\n- [#2664](https://github.com/graphql/graphiql/pull/2664) [`721425b3`](https://github.com/graphql/graphiql/commit/721425b3382e68dd4c7b883473e3eda38a9816ee) Thanks [@acao](https://github.com/acao)! - This reverts the bugfix for .graphqlrc.ts users, which broke the extension for schema url users\n\n## 2.8.2\n\n### Patch Changes\n\n- [#2660](https://github.com/graphql/graphiql/pull/2660) [`34d31fbc`](https://github.com/graphql/graphiql/commit/34d31fbce6c49c929b48bdf1a6b0cebc33d8bbbf) Thanks [@acao](https://github.com/acao)! - bump `ts-node` to 10.x, so that TypeScript based configs (i.e. `.graphqlrc.ts`) will continue to work. It also bumps to the latest patch releases of `graphql-config` fixed several issues with TypeScript loading ([v4.3.2](https://github.com/kamilkisiela/graphql-config/releases/tag/v4.3.2), [v4.3.3](https://github.com/kamilkisiela/graphql-config/releases/tag/v4.3.3)). We tested manually, but please open a bug if you encounter any with schema-as-url configs & schema introspection.\n\n## 2.8.1\n\n### Patch Changes\n\n- [#2623](https://github.com/graphql/graphiql/pull/2623) [`12cf4db0`](https://github.com/graphql/graphiql/commit/12cf4db006d1c058460bc04f51d8743fe1ac63bb) Thanks [@acao](https://github.com/acao)! - In #2624, fix introspection schema fetching regression in lsp server, and fix for users writing new .gql/.graphql files\n\n## 2.8.0\n\n### Minor Changes\n\n- [#2557](https://github.com/graphql/graphiql/pull/2557) [`3304606d`](https://github.com/graphql/graphiql/commit/3304606d5130a745cbdab0e6c9182e75101ddde9) Thanks [@acao](https://github.com/acao)! - upgrades the `vscode-languageserver` and `vscode-jsonrpc` reference implementations for the lsp server to the latest. also upgrades `vscode-languageclient` in `vscode-graphql` to the latest 8.0.1. seems to work fine for IPC in `vscode-graphql` at least!\n\n  hopefully this solves #2230 once and for all!\n\n## 2.7.29\n\n### Patch Changes\n\n- [#2553](https://github.com/graphql/graphiql/pull/2553) [`edc1c964`](https://github.com/graphql/graphiql/commit/edc1c96477cc2fbc2b6ac5d6195b8f9766a8c5d4) Thanks [@acao](https://github.com/acao)! - Fix error with LSP crash for CLI users #2230. `vscode-graphql` not impacted - rather, `nvim.coc`, maybe other clients who use CLI directly). recreation of #2546 by [@xuanduc987](https://github.com/xuanduc987, thank you!)\n\n## 2.7.28\n\n### Patch Changes\n\n- [#2519](https://github.com/graphql/graphiql/pull/2519) [`de5d5a07`](https://github.com/graphql/graphiql/commit/de5d5a07891fd49241a5abbb17eaf377a015a0a8) Thanks [@acao](https://github.com/acao)! - enable graphql-config legacy mode by default in the LSP server\n\n* [#2509](https://github.com/graphql/graphiql/pull/2509) [`737d4184`](https://github.com/graphql/graphiql/commit/737d4184f3af1d8fe9d64eb1b7e23dfcfbe640ea) Thanks [@Chnapy](https://github.com/Chnapy)! - Add `gql(``)`, `graphql(``)` call expressions support for highlighting & language\n\n## 2.7.27\n\n### Patch Changes\n\n- [#2506](https://github.com/graphql/graphiql/pull/2506) [`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c) Thanks [@acao](https://github.com/acao)! - Remove redundant check, trigger LSP release\n\n- Updated dependencies [[`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - graphql-language-service@5.0.6\n\n## 2.7.26\n\n### Patch Changes\n\n- [#2486](https://github.com/graphql/graphiql/pull/2486) [`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa) Thanks [@stonexer](https://github.com/stonexer)! - definition support for operation fields ✨\n\n  you can now jump to the applicable object type definition for query/mutation/subscription fields!\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service@5.0.5\n\n## 2.7.25\n\n### Patch Changes\n\n- [#2481](https://github.com/graphql/graphiql/pull/2481) [`cf092f59`](https://github.com/graphql/graphiql/commit/cf092f5960eae250bb193b9011b2fb883f797a99) Thanks [@acao](https://github.com/acao)! - No longer load dotenv in the LSP server\n\n## 2.7.24\n\n### Patch Changes\n\n- [#2470](https://github.com/graphql/graphiql/pull/2470) [`d0017a93`](https://github.com/graphql/graphiql/commit/d0017a93b818cf3119e51c2b6c4a19004f98e29b) Thanks [@acao](https://github.com/acao)! - Aims to resolve #2421\n\n  - graphql config errors only log to output channel, no longer crash the LSP\n  - more performant LSP request no-ops for failing/missing config\n\n  this used to fail silently in the output channel, but vscode introduced a new retry and notification for this\n\n  would like to provide more helpful graphql config DX in the future but this should be better for now\n\n## 2.7.23\n\n### Patch Changes\n\n- [#2417](https://github.com/graphql/graphiql/pull/2417) [`6ca6a92d`](https://github.com/graphql/graphiql/commit/6ca6a92d0fd12af974683de9706c8e8e06c751c2) Thanks [@acao](https://github.com/acao)! - fix annoying trigger character on newline issue #2182\n\n## 2.7.22\n\n### Patch Changes\n\n- [#2385](https://github.com/graphql/graphiql/pull/2385) [`6db28447`](https://github.com/graphql/graphiql/commit/6db284479a14873fea3e359efd71be0b15ab3ee8) Thanks [@acao](https://github.com/acao)! - Stop reporting unnecessary EOF errors when authoring new queries\n\n* [#2382](https://github.com/graphql/graphiql/pull/2382) [`1bea864d`](https://github.com/graphql/graphiql/commit/1bea864d05dee04bb20c06dc3c3d68675b87a50a) Thanks [@acao](https://github.com/acao)! - allow disabling query/SDL validation with `graphql-config` setting `{ extensions: { languageService: { enableValidation: false } } }`.\n\n  Currently, users receive duplicate validation messages when using our LSP alongside existing validation tools like `graphql-eslint`, and this allows them to disable the LSP feature in that case.\n\n## 2.7.21\n\n### Patch Changes\n\n- [#2378](https://github.com/graphql/graphiql/pull/2378) [`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2) Thanks [@acao](https://github.com/acao)! - Trap all graphql parsing exceptions from (relatively) newly added logic. This should clear up bugs that have been plaguing users for two years now, sorry!\n\n- Updated dependencies [[`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2)]:\n  - graphql-language-service@5.0.4\n\n## 2.7.20\n\n### Patch Changes\n\n- Updated dependencies [[`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902)]:\n  - graphql-language-service@5.0.3\n\n## 2.7.19\n\n### Patch Changes\n\n- [`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f) Thanks [@acao](https://github.com/acao)! - - upgrade `graphql-config` to latest in server\n  - remove `graphql-config` dependency from `vscode-graphql` and `graphql-language-service`\n  - fix `vscode-graphql` esbuild bundling bug in `vscode-graphql` [#2269](https://github.com/graphql/graphiql/issues/2269) by fixing `esbuild` version\n- Updated dependencies [[`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f)]:\n  - graphql-language-service@5.0.2\n\n## 2.7.18\n\n### Patch Changes\n\n- [#2271](https://github.com/graphql/graphiql/pull/2271) [`e15d1dae`](https://github.com/graphql/graphiql/commit/e15d1dae399a7d43d8d98f2ce431a9a1f0ba84ae) Thanks [@acao](https://github.com/acao)! - a few bugfixes related to config handling impacting vim and potentially other LSP server users\n\n## 2.7.17\n\n### Patch Changes\n\n- Updated dependencies [[`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa), [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa)]:\n  - graphql-language-service@5.0.1\n\n## 2.7.16\n\n### Patch Changes\n\n- Updated dependencies [[`2502a364`](https://github.com/graphql/graphiql/commit/2502a364b74dc754d92baa1579b536cf42139958)]:\n  - graphql-language-service@5.0.0\n\n## 2.7.15\n\n### Patch Changes\n\n- [#2214](https://github.com/graphql/graphiql/pull/2214) [`ab83198f`](https://github.com/graphql/graphiql/commit/ab83198fa8b3c5453d3733982ee9ca8a2d6bca7a) Thanks [@Cellule](https://github.com/Cellule)! - Fixed Windows fileUri when resolving type definition location\n\n## 2.7.14\n\n### Patch Changes\n\n- [#2161](https://github.com/graphql/graphiql/pull/2161) [`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f) Thanks [@orta](https://github.com/orta)! - Do not log errors when a JS/TS file has no embedded graphql tags\n\n* [#2176](https://github.com/graphql/graphiql/pull/2176) [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c) Thanks [@orta](https://github.com/orta)! - Update babel parser in the graphql language server\n\n- [#2175](https://github.com/graphql/graphiql/pull/2175) [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5) Thanks [@orta](https://github.com/orta)! - Better handling of unparsable babel JS/TS files\n\n- Updated dependencies [[`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f), [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c), [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5)]:\n  - graphql-language-service@4.1.5\n\n## 2.7.13\n\n### Patch Changes\n\n- [#2111](https://github.com/graphql/graphiql/pull/2111) [`08ff6dce`](https://github.com/graphql/graphiql/commit/08ff6dce0625f7ab58a45364aed9ca04c7862fa7) Thanks [@acao](https://github.com/acao)! - Support template literals and tagged template literals with replacement expressions\n\n- Updated dependencies []:\n  - graphql-language-service@4.1.4\n\n## 2.7.12\n\n### Patch Changes\n\n- Updated dependencies [[`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8)]:\n  - graphql-language-service@4.1.3\n\n## 2.7.11\n\n### Patch Changes\n\n- Updated dependencies [[`e20760fb`](https://github.com/graphql/graphiql/commit/e20760fbd95c13d6d549cba3faa15a59aee9a2c0)]:\n  - graphql-language-service@4.1.2\n\n## 2.7.10\n\n### Patch Changes\n\n- [#2091](https://github.com/graphql/graphiql/pull/2091) [`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63) Thanks [@acao](https://github.com/acao)! - Fix graphql 15 related issues. Should now build & test interchangeably.\n\n- Updated dependencies [[`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63)]:\n  - graphql-language-service-utils@2.7.1\n  - graphql-language-service@4.1.1\n\n## 2.7.9\n\n### Patch Changes\n\n- Updated dependencies [[`0f1f90ce`](https://github.com/graphql/graphiql/commit/0f1f90ce8f4a25ddebdaf7a9ddbe136214aa64a3)]:\n  - graphql-language-service@4.1.0\n\n## 2.7.8\n\n### Patch Changes\n\n- Updated dependencies [[`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3)]:\n  - graphql-language-service-utils@2.7.0\n  - graphql-language-service@4.0.0\n\n## 2.7.7\n\n### Patch Changes\n\n- [`c4236190`](https://github.com/graphql/graphiql/commit/c4236190f91adedaf4f4a54cd0400a6b42c3c407) [#2072](https://github.com/graphql/graphiql/pull/2072) Thanks [@acao](https://github.com/acao)! - this fixes the parsing of file URIs by `graphql-language-service-server` in cases such as:\n\n  - windows without WSL\n  - special characters in filenames\n  - likely other cases\n\n  previously we were using the old approach of `URL(uri).pathname` which was not working! now using the standard `vscode-uri` approach of `URI.parse(uri).fsName`.\n\n  this should fix issues with object and fragment type completion as well I think\n\n  also for #2066 made it so that graphql config is not loaded into the file cache unnecessarily, and that it's only loaded on editor save events rather than on file changed events\n\n  fixes #1644 and #2066\n\n* [`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1) [#2065](https://github.com/graphql/graphiql/pull/2065) Thanks [@acao](https://github.com/acao)! - Add an opt-in feature to generate markdown in hover elements, starting with highlighting type information. Enabled for the language server and also the language service and thus `monaco-graphql` as well.\n\n* Updated dependencies [[`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1)]:\n  - graphql-language-service@3.2.5\n\n## 2.7.6\n\n### Patch Changes\n\n- [`4286185c`](https://github.com/graphql/graphiql/commit/4286185cdc6119175e23d66b8e177ba32693a63a) [#2060](https://github.com/graphql/graphiql/pull/2060) Thanks [@acao](https://github.com/acao)! - Parse more JS extensions in the language server\n\n## 2.7.5\n\n### Patch Changes\n\n- [`f82bd7a9`](https://github.com/graphql/graphiql/commit/f82bd7a931eb5fa9a33e59d417303706844c9063) [#2055](https://github.com/graphql/graphiql/pull/2055) Thanks [@acao](https://github.com/acao)! - this fixes the URI scheme related bugs and make sure schema as sdl config works again.\n\n  `fileURLToPath` had been introduced by a contributor and I didn't test properly, it broke sdl file loading!\n\n  definitions, autocomplete, diagnostics, etc should work again also hides the more verbose logging output for now\n\n- Updated dependencies []:\n  - graphql-language-service@3.2.4\n  - graphql-language-service-utils@2.6.3\n\n## 2.7.4\n\n### Patch Changes\n\n- [`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf) [#2047](https://github.com/graphql/graphiql/pull/2047) Thanks [@willstott101](https://github.com/willstott101)! - Source code included in all packages to fix source maps. codemirror-graphql includes esm build in package.\n\n- Updated dependencies [[`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf)]:\n  - graphql-language-service@3.2.3\n  - graphql-language-service-utils@2.6.2\n\n## 2.7.3\n\n### Patch Changes\n\n- [`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf) [#2045](https://github.com/graphql/graphiql/pull/2045) Thanks [@acao](https://github.com/acao)! - fix graphql-js peer dependencies - [#2044](https://github.com/graphql/graphiql/pull/2044)\n\n- Updated dependencies [[`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf)]:\n  - graphql-language-service@3.2.2\n  - graphql-language-service-utils@2.6.1\n\n## 2.7.2\n\n### Patch Changes\n\n- [`7e98c6ff`](https://github.com/graphql/graphiql/commit/7e98c6fff3b1c62954c9c8d902ac64ddbf23fc5d) Thanks [@acao](https://github.com/acao)! - upgrade graphql-language-service-server to use graphql-config 4.1.0! adds support for .ts and .toml config files in the language server, amongst many other improvements!\n\n## 2.7.1\n\n### Patch Changes\n\n- [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce) [#2013](https://github.com/graphql/graphiql/pull/2013) Thanks [@PabloSzx](https://github.com/PabloSzx)! - Update utils\n\n- Updated dependencies [[`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce), [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce)]:\n  - graphql-language-service-utils@2.6.0\n  - graphql-language-service@3.2.1\n\n## 2.7.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n### Patch Changes\n\n- Updated dependencies [[`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a)]:\n  - graphql-language-service@3.2.0\n\n## 2.6.5\n\n### Patch Changes\n\n- [`83c4a007`](https://github.com/graphql/graphiql/commit/83c4a0070a4df704ce874ec977d65ca6c7e43ee8) [#1964](https://github.com/graphql/graphiql/pull/1964) Thanks [@patrickszmucer](https://github.com/patrickszmucer)! - Fix unknown fragment errors on save\n\n* [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8) [#1777](https://github.com/graphql/graphiql/pull/1777) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - adopt block string parsing for variables in language parser\n\n* Updated dependencies [[`0e2c1a02`](https://github.com/graphql/graphiql/commit/0e2c1a020cc2761155f7c9467d3ed4cb45941aeb), [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8)]:\n  - graphql-language-service@3.1.6\n\n## 2.6.4\n\n### Patch Changes\n\n- [`72bff0e7`](https://github.com/graphql/graphiql/commit/72bff0e7db46fb53293efc990dc64d2c06401459) [#1951](https://github.com/graphql/graphiql/pull/1951) Thanks [@GoodForOneFare](https://github.com/GoodForOneFare)! - fix: skip config updates when no custom filename is defined\n\n* [`2fd5bf72`](https://github.com/graphql/graphiql/commit/2fd5bf7239edb78339e5ac7211f09c245e47c3bb) [#1941](https://github.com/graphql/graphiql/pull/1941) Thanks [@arcanis](https://github.com/arcanis)! - Adds support for `#graphql` and `/* GraphQL */` in the language server\n\n* Updated dependencies [[`2fd5bf72`](https://github.com/graphql/graphiql/commit/2fd5bf7239edb78339e5ac7211f09c245e47c3bb)]:\n  - graphql-language-service@3.1.5\n\n## 2.6.3\n\n### Patch Changes\n\n- [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n## [2.6.2](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.6.1...graphql-language-service-server@2.6.2) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.6.1](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.6.0...graphql-language-service-server@2.6.1) (2021-01-07)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.6.0](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.9...graphql-language-service-server@2.6.0) (2021-01-07)\n\n### Features\n\n- implied or external fragments, for [#612](https://github.com/graphql/graphiql/issues/612) ([#1750](https://github.com/graphql/graphiql/issues/1750)) ([cfed265](https://github.com/graphql/graphiql/commit/cfed265e3cf31875b39ea517781a217fcdfcadc2))\n\n## [2.5.9](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.8...graphql-language-service-server@2.5.9) (2021-01-03)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.8](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.7...graphql-language-service-server@2.5.8) (2020-12-28)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.7](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.6...graphql-language-service-server@2.5.7) (2020-12-08)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.6](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.5...graphql-language-service-server@2.5.6) (2020-11-28)\n\n### Bug Fixes\n\n- crash on receiving an LSP message in \"stream\" mode ([1238075](https://github.com/graphql/graphiql/commit/1238075c5bbd18b09f493c0018da5e4b24e8e615)), closes [#1708](https://github.com/graphql/graphiql/issues/1708)\n- languageserver filepath on Windows ([#1715](https://github.com/graphql/graphiql/issues/1715)) ([d2feff9](https://github.com/graphql/graphiql/commit/d2feff92aba979fb52fd0e5846776be223fbf11e))\n\n## [2.5.5](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.4...graphql-language-service-server@2.5.5) (2020-10-20)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.4](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.3...graphql-language-service-server@2.5.4) (2020-09-23)\n\n### Bug Fixes\n\n- useSchemaFileDefinitions, cleanup ([#1674](https://github.com/graphql/graphiql/issues/1674)) ([3673455](https://github.com/graphql/graphiql/commit/36734557e2874384adbfe86b64aeaa93e06df53f))\n\n## [2.5.3](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.2...graphql-language-service-server@2.5.3) (2020-09-23)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.2](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.1...graphql-language-service-server@2.5.2) (2020-09-20)\n\n### Bug Fixes\n\n- re-introduce allowed extensions ([#1668](https://github.com/graphql/graphiql/issues/1668)) ([eedd575](https://github.com/graphql/graphiql/commit/eedd5753751857bd5837dd8be8602bf7fadb5517))\n\n## [2.5.1](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0...graphql-language-service-server@2.5.1) (2020-09-20)\n\n### Bug Fixes\n\n- better error handling when the config isn't present ([#1667](https://github.com/graphql/graphiql/issues/1667)) ([f414300](https://github.com/graphql/graphiql/commit/f4143008f93a8849dfa4caae948d2eceb299a141))\n\n## [2.5.0](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0-alpha.5...graphql-language-service-server@2.5.0) (2020-09-18)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.0-alpha.5](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0-alpha.4...graphql-language-service-server@2.5.0-alpha.5) (2020-09-11)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.0-alpha.4](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0-alpha.3...graphql-language-service-server@2.5.0-alpha.4) (2020-08-26)\n\n### Features\n\n- custom config baseDir, embedded fragment def offsets ([#1651](https://github.com/graphql/graphiql/issues/1651)) ([e8dc958](https://github.com/graphql/graphiql/commit/e8dc958b46544022fe58b498ca5eef572f54afe0))\n\n## [2.5.0-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0-alpha.2...graphql-language-service-server@2.5.0-alpha.3) (2020-08-22)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.0-alpha.2](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0-alpha.1...graphql-language-service-server@2.5.0-alpha.2) (2020-08-12)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.5.0-alpha.1](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.5.0-alpha.0...graphql-language-service-server@2.5.0-alpha.1) (2020-08-12)\n\n### Bug Fixes\n\n- recursively write tmp directories, write schema async ([#1641](https://github.com/graphql/graphiql/issues/1641)) ([cd0061e](https://github.com/graphql/graphiql/commit/cd0061e1abe47f5f4075d52a6c1e4157cbd0a95a))\n\n## [2.5.0-alpha.0](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.1...graphql-language-service-server@2.5.0-alpha.0) (2020-08-10)\n\n### Bug Fixes\n\n- pre-caching schema bugs, new server config options ([#1636](https://github.com/graphql/graphiql/issues/1636)) ([d989456](https://github.com/graphql/graphiql/commit/d9894564c056134e15093956e0951dcefe061d76))\n\n### Features\n\n- graphql-config@3 support in lsp server ([#1616](https://github.com/graphql/graphiql/issues/1616)) ([27cd185](https://github.com/graphql/graphiql/commit/27cd18562b64dfe18e6343b6a49f3f606af89d86))\n\n## [2.4.1](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0...graphql-language-service-server@2.4.1) (2020-08-06)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.12...graphql-language-service-server@2.4.0) (2020-06-11)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.12](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.11...graphql-language-service-server@2.4.0-alpha.12) (2020-06-04)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.11](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.10...graphql-language-service-server@2.4.0-alpha.11) (2020-06-04)\n\n### Bug Fixes\n\n- cleanup cache entry from lerna publish ([4a26218](https://github.com/graphql/graphiql/commit/4a2621808a1aea8b30d5d27b8d86a60bf2b44b01))\n\n## [2.4.0-alpha.10](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.9...graphql-language-service-server@2.4.0-alpha.10) (2020-05-28)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.9](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.8...graphql-language-service-server@2.4.0-alpha.9) (2020-05-19)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.8](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.7...graphql-language-service-server@2.4.0-alpha.8) (2020-05-17)\n\n### Bug Fixes\n\n- remove problematic file resolution module from webpack sco… ([#1489](https://github.com/graphql/graphiql/issues/1489)) ([8dab038](https://github.com/graphql/graphiql/commit/8dab0385772f443f73b559e2c668080733168236))\n- repair CLI, handle all schema and LSP errors ([#1482](https://github.com/graphql/graphiql/issues/1482)) ([992f384](https://github.com/graphql/graphiql/commit/992f38494f20f5877bfd6ff54893854ac7a0eaa2))\n\n### Features\n\n- Monaco Mode - Phase 2 - Mode & Worker ([#1459](https://github.com/graphql/graphiql/issues/1459)) ([bc95fb4](https://github.com/graphql/graphiql/commit/bc95fb46459a4437ff9471ff43c98e1c5c50f51e))\n\n## [2.4.0-alpha.7](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.6...graphql-language-service-server@2.4.0-alpha.7) (2020-04-10)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.6](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.5...graphql-language-service-server@2.4.0-alpha.6) (2020-04-10)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.5](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.4...graphql-language-service-server@2.4.0-alpha.5) (2020-04-06)\n\n### Features\n\n- upgrade to graphql@15.0.0 for [#1191](https://github.com/graphql/graphiql/issues/1191) ([#1204](https://github.com/graphql/graphiql/issues/1204)) ([f13c8e9](https://github.com/graphql/graphiql/commit/f13c8e9d0e66df4b051b332c7d02f4bb83e07ffd))\n\n## [2.4.0-alpha.4](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.3...graphql-language-service-server@2.4.0-alpha.4) (2020-04-03)\n\n### Bug Fixes\n\n- make sure that custom parser is used if passed to process ([#1438](https://github.com/graphql/graphiql/issues/1438)) ([5e098a4](https://github.com/graphql/graphiql/commit/5e098a4a80a8e1cff4541ad34363ab2001fcda4a))\n\n### Features\n\n- make sure @ triggers directive completion automatically ([#1441](https://github.com/graphql/graphiql/issues/1441)) ([935220a](https://github.com/graphql/graphiql/commit/935220a68641b94af2598840b0ced3fd945f86dd))\n\n## [2.4.0-alpha.3](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.2...graphql-language-service-server@2.4.0-alpha.3) (2020-03-20)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## [2.4.0-alpha.2](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.4.0-alpha.0...graphql-language-service-server@2.4.0-alpha.2) (2020-03-20)\n\n### Bug Fixes\n\n- eslint warnings ([#1360](https://github.com/graphql/graphiql/issues/1360)) ([84d4821](https://github.com/graphql/graphiql/commit/84d4821ee19030314666a46f11a4b69ffaddca45))\n- initial request cache set, import tsc bugs ([#1266](https://github.com/graphql/graphiql/issues/1266)) ([6b98f8a](https://github.com/graphql/graphiql/commit/6b98f8a442d4a8ea160fb90a29acf33f5382db2e))\n- restore error handling for server [#1306](https://github.com/graphql/graphiql/issues/1306) ([#1425](https://github.com/graphql/graphiql/issues/1425)) ([c12d975](https://github.com/graphql/graphiql/commit/c12d975027e4021bbea7ad54e7e0c19ac7943e6c))\n- type check ([#1374](https://github.com/graphql/graphiql/issues/1374)) ([84cc41e](https://github.com/graphql/graphiql/commit/84cc41ef1c5b56d26929edd9669c766cdf3628e8))\n- typo to fix hover ([#1426](https://github.com/graphql/graphiql/issues/1426)) ([1fdcb28](https://github.com/graphql/graphiql/commit/1fdcb28689bf85a31af10cbdc4648c5ed3013672))\n\n### Features\n\n- optionally provide LSP an instantiated GraphQLConfig ([#1432](https://github.com/graphql/graphiql/issues/1432)) ([012db2a](https://github.com/graphql/graphiql/commit/012db2a39bfcddde63ffd2e93dae0c158f8e73ed))\n- typescript, tsx, jsx support for LSP server using babel ([#1427](https://github.com/graphql/graphiql/issues/1427)) ([ee06123](https://github.com/graphql/graphiql/commit/ee061235489c8f5ed27c116c09b606e371ee40c5))\n- **graphql-config:** add graphql config extensions ([#1118](https://github.com/graphql/graphiql/issues/1118)) ([2a77e47](https://github.com/graphql/graphiql/commit/2a77e47719ec9181a00183a08ffa11287b8fd2f5))\n- Symbol support for single document ([#1244](https://github.com/graphql/graphiql/issues/1244)) ([f729f9a](https://github.com/graphql/graphiql/commit/f729f9a3c20362f4515bf3037347a07cc3690b38))\n- use new GraphQL Config ([#1342](https://github.com/graphql/graphiql/issues/1342)) ([e45838f](https://github.com/graphql/graphiql/commit/e45838f5ba579e05b20f1a147ce431478ffad9aa))\n\n## [2.4.0-alpha.1](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.3.3...graphql-language-service-server@2.4.0-alpha.1) (2020-01-18)\n\n### Bug Fixes\n\n- linting issues, trailingCommas: all ([#1099](https://github.com/graphql/graphiql/issues/1099)) ([de4005b](https://github.com/graphql/graphiql/commit/de4005b))\n\n### Features\n\n- convert LSP Server to Typescript, remove watchman ([#1138](https://github.com/graphql/graphiql/issues/1138)) ([8e33dbb](https://github.com/graphql/graphiql/commit/8e33dbb))\n\n## [2.3.3](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.3.2...graphql-language-service-server@2.3.3) (2019-12-09)\n\n### Bug Fixes\n\n- a few more tweaks to babel ignore ([e0ad2c6](https://github.com/graphql/graphiql/commit/e0ad2c6))\n\n## [2.3.2](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.3.1...graphql-language-service-server@2.3.2) (2019-12-03)\n\n### Bug Fixes\n\n- convert browserify build to webpack, fixes [#976](https://github.com/graphql/graphiql/issues/976) ([#1001](https://github.com/graphql/graphiql/issues/1001)) ([3caf041](https://github.com/graphql/graphiql/commit/3caf041))\n\n## [2.3.1](https://github.com/graphql/graphiql/compare/graphql-language-service-server@2.3.0...graphql-language-service-server@2.3.1) (2019-11-26)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n# 2.3.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 0.0.1 (2017-03-29)\n\n# 2.2.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 0.0.1 (2017-03-29)\n\n# 2.2.0-alpha.0 (2019-10-04)\n\n### Features\n\n- convert LSP from flow to typescript ([#957](https://github.com/graphql/graphiql/issues/957)) [@acao](https://github.com/acao) @Neitsch [@benjie](https://github.com/benjie) ([36ed669](https://github.com/graphql/graphiql/commit/36ed669))\n\n## 0.0.1 (2017-03-29)\n\n## 2.1.1-alpha.1 (2019-09-01)\n\n## 0.0.1 (2017-03-29)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## 2.1.1-alpha.0 (2019-09-01)\n\n## 0.0.1 (2017-03-29)\n\n**Note:** Version bump only for package graphql-language-service-server\n\n## 2.1.1 (2019-09-01)\n\n## 0.0.1 (2017-03-29)\n\n**Note:** Version bump only for package graphql-language-service-server\n"
  },
  {
    "path": "packages/graphql-language-service-server/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/graphql-language-service-server/README.md",
    "content": "# graphql-language-service-server\n\n[![NPM](https://img.shields.io/npm/v/graphql-language-service-server.svg?style=flat-square)](https://npmjs.com/graphql-language-service-server)\n![npm downloads](https://img.shields.io/npm/dm/graphql-language-service-server?label=npm%20downloads)\n[![License](https://img.shields.io/npm/l/graphql-language-service-server.svg?style=flat-square)](LICENSE)\n\n[Changelog](https://github.com/graphql/graphiql/blob/main/packages/graphql-language-service-server/CHANGELOG.md)\n|\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphql_language_service_server.html)\n| [Discord Channel](https://discord.gg/PXaRYrpgK4)\n\nServer process backing the\n[GraphQL Language Service](https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service).\n\nGraphQL Language Service Server provides an interface for building GraphQL\nlanguage services for IDEs.\n\nPartial support for\n[Microsoft's Language Server Protocol](https://github.com/Microsoft/language-server-protocol)\nis in place, with more to come in the future.\n\nSupported features include:\n\n- Diagnostics (GraphQL syntax linting/validations) (**spec-compliant**)\n- Autocomplete suggestions (**spec-compliant**)\n- Hyperlink to fragment definitions and named types (type, input, enum)\n  definitions (**spec-compliant**)\n- Outline view support for queries\n- Support for `gql` `graphql` and other template tags inside javascript,\n  typescript, jsx, ts, vue and svelte files, and an interface to allow custom\n  parsing of all files.\n\n## Installation and Usage\n\n### Dependencies\n\n- An LSP compatible client with its own file watcher, that sends watch\n  notifications to the server, such as vscode, nvim, or sublime-lsp.\n- Node.js `^18.18.0 || >=20.9.0` or later is required.\n- (for now) a graphql config file is required\n\n### Installation\n\n```bash\nnpm install graphql-language-service-server\n# or\nyarn add graphql-language-service-server\n```\n\nWe also provide a CLI interface to this server, see\n[`graphql-language-service-cli`](../graphql-language-service-cli/)\n\n### Usage\n\nInitialize the GraphQL Language Server with the `startServer` function:\n\n```ts\nimport { startServer } from 'graphql-language-service-server';\n\nawait startServer({\n  method: 'node',\n});\n```\n\nIf you are developing a service or extension, this is the LSP language server\nyou want to run.\n\nWhen developing vscode extensions, just the above is enough to get started for\nyour extension's `ServerOptions.run.module`, for example.\n\n`startServer` function takes the following parameters:\n\n| Parameter      | Required                                             | Description                                                                       |\n| -------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------- |\n| port           | `true` when method is `socket`, `false` otherwise    | port for the LSP server to run on                                                 |\n| method         | `false`                                              | `socket`, `streams`, or `node` (ipc)                                              |\n| config         | `false`                                              | custom `graphql-config` instance from `loadConfig` (see example above)            |\n| configDir      | `false`                                              | the directory where graphql-config is found                                       |\n| extensions     | `false`                                              | array of functions to transform the graphql-config and add extensions dynamically |\n| parser         | `false`                                              | Customize _all_ file parsing by overriding the default `parseDocument` function   |\n| fileExtensions | `false`. defaults to `['.js', '.ts', '.tsx, '.jsx']` | Customize file extensions used by the default LSP parser                          |\n\n### GraphQL configuration file\n\nYou _must_ provide a graphql config file\n\nCheck out [graphql-config](https://graphql-config.com/introduction) to learn the\nmany ways you can define your graphql config\n\n#### `.graphqlrc` or `.graphqlrc.yml/yaml` or `graphql.config.yml`\n\n```yaml\nschema: 'packages/api/src/schema.graphql'\ndocuments: 'packages/app/src/components/**/*.{tsx,ts}'\nextensions:\n  endpoints:\n    example:\n      url: 'http://localhost:8000'\n  customExtension:\n    foo: true\n```\n\n#### `.graphqlrc` or `.graphqlrc.json` or `graphql.config.json`\n\n```json\n{\n  \"schema\": \"https://localhost:8000\"\n}\n```\n\n#### `graphql.config.js` or `.graphqlrc.js`\n\n```js\nmodule.exports = { schema: 'https://localhost:8000' };\n```\n\n#### custom `startServer`\n\nuse graphql config [`loadConfig`](https://graphql-config.com/load-config) for\nfurther customization:\n\n```ts\nimport { loadConfig } from 'graphql-config'; // 3.0.0 or later!\n\n// with required params\nconst config = await loadConfig();\n\nawait startServer({\n  method: 'node',\n  // or instead of configName, an exact path (relative from rootDir or absolute)\n\n  // deprecated for: loadConfigOptions.rootDir. root directory for graphql config file(s), or for relative resolution for exact `filePath`. default process.cwd()\n  // configDir: '',\n  loadConfigOptions: {\n    // any of the options for graphql-config@3 `loadConfig()`\n    schema: await config.getSchema(),\n    // rootDir is same as `configDir` before, the path where the graphql config file would be found by cosmic-config\n    rootDir: 'config/',\n    // or - the relative or absolute path to your file\n    filePath: 'exact/path/to/config.js', // (also supports yml, json, ts, toml)\n    // myPlatform.config.js/json/yaml works now!\n    configName: 'myPlatform',\n  },\n});\n```\n\n<span id=\"custom-graphql-config\" />\n\n#### Custom `graphql-config` features\n\nThe graphql-config features we support are:\n\n```js\nmodule.exports = {\n  extensions: {\n    // add customDirectives (legacy). you can now provide multiple schema pointers to config.schema/project.schema, including inline strings. same with scalars or any SDL type that you'd like to append to the schema\n    customDirectives: ['@myExampleDirective'],\n    // a function that returns an array of validation rules, ala https://github.com/graphql/graphql-js/tree/main/src/validation/rules\n    // note that this file will be loaded by the vscode runtime, so the node version and other factors will come into play\n    customValidationRules: require('./config/customValidationRules'),\n    schemaCacheTTL: 1000, // reduce or increase minimum schema cache lifetime from 30000ms (30 seconds). you may want to reduce this if you are developing fullstack with network schema\n    languageService: {\n      // this is enabled by default if non-local files are specified in the project `schema`\n      // NOTE: this will disable all definition lookup for local SDL files\n      cacheSchemaFileForLookup: true,\n      // undefined by default which has the same effect as `true`, set to `false` if you are already using // `graphql-eslint` or some other tool for validating graphql in your IDE. Must be explicitly `false` to disable this feature, not just \"falsy\"\n      enableValidation: true,\n      // (experimental) enhanced auto expansion of graphql leaf fields and arguments\n      fillLeafsOnComplete: true,\n      // instead of jumping directly to the SDL file, you can override definition peek/jump results to point to different files or locations\n      // (for example, source files for your schema in any language!)\n      // based on Relay vscode's pathToLocateCommand\n      // see LocateCommand type!\n      locateCommand(projectName, typePath, info) {\n        // pass more info, such as GraphQLType with the ast node. info.project is also available if you need it\n        const { path, range } = ourLookupUtility(\n          projectName,\n          typePath,\n          info.type.node,\n        );\n        return { uri: path, range }; // range.start.line/range.end.character/etc, base 1\n        // you can also return relay LSP style\n        // return '/path/to/file.py:20:1'; // (range: 20:1 20:1 )\n        // return '/path/to/file.py'; // (range: 1:1 1:1)\n      },\n    },\n  },\n};\n```\n\nor for multi-project workspaces:\n\n```ts\n// graphql.config.ts\nexport default {\n  projects: {\n    myProject: {\n      schema: [\n        // internally in `graphql-config`, an attempt will be made to combine these schemas into one in-memory schema to use for validation, lookup, etc\n        'http://localhost:8080',\n        './my-project/schema.graphql',\n        './my-project/schema.ts',\n        '@customDirective(arg: String!)',\n        'scalar CustomScalar',\n      ],\n      // project specific defaults\n      extensions: {\n        languageService: {\n          cacheSchemaFileForLookup: true,\n          enableValidation: false,\n        },\n      },\n    },\n    anotherProject: {\n      schema: {\n        'http://localhost:8081': {\n          customHeaders: { Authorization: 'Bearer example' },\n        },\n      },\n    },\n  },\n  // global defaults for all projects\n  extensions: {\n    languageService: {\n      cacheSchemaFileForLookup: false,\n      enableValidation: true,\n    },\n  },\n};\n```\n\nYou can specify any of these settings globally as above, or per project. Read\nthe graphql-config docs to learn more about this!\n\nFor secrets (headers, urls, etc), you can import `dotenv()` and set a base path\nas you wish in your `graphql-config` file to pre-load `process.env` variables.\n\n### Troubleshooting notes\n\n- you may need to manually restart the language server for some of these\n  configurations to take effect\n- graphql-config's multi-project support is not related to multi-root workspaces\n  in vscode - in fact, each workspace can have multiple graphql config projects,\n  which is what makes multi-root workspaces tricky to support. coming soon!\n\n<span id=\"workspace-configuration\" />\n\n### Workspace Configuration\n\nThe LSP Server reads config by sending `workspace/configuration` method when it\ninitializes.\n\nNote: We still do not support LSP multi-root workspaces but will tackle this\nvery soon!\n\nMany LSP clients beyond vscode offer ways to set these configurations, such as\nvia `initializationOptions` in nvim.coc. The options are mostly designed to\nconfigure graphql-config's load parameters, the only thing we can't configure\nwith graphql config. The final option can be set in `graphql-config` as well\n\n| Parameter                                 | Default                                           | Description                                                                                                                                                                                                                                                                                         |\n| ----------------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `graphql-config.load.baseDir`             | workspace root or process.cwd()                   | the path where graphql config looks for config files                                                                                                                                                                                                                                                |\n| `graphql-config.load.filepath`            | `null`                                            | exact filepath of the config file.                                                                                                                                                                                                                                                                  |\n| `graphql-config.load.configName`          | `graphql`                                         | config name prefix instead of `graphql`                                                                                                                                                                                                                                                             |\n| `graphql-config.load.legacy`              | `true`                                            | backwards compatibility with `graphql-config@2`                                                                                                                                                                                                                                                     |\n| `graphql-config.dotEnvPath`               | `null`                                            | backwards compatibility with `graphql-config@2`                                                                                                                                                                                                                                                     |\n| `vscode-graphql.cacheSchemaFileForLookup` | `true` if `schema` contains non-SDL files or URLs | generate an SDL file based on your graphql-config schema configuration for definition lookup and other features. enabled by default when your `schema` config are URLs or introspection JSON, or if you have any non-local SDL files in `schema`                                                    |\n| `vscode-graphql.schemaCacheTTL`           | `30000`                                           | an integer value in milliseconds for the desired minimum cache lifetime for all schemas, which also causes the generated file to be re-written. set to 30s by default. effectively a \"lazy\" form of polling. if you are developing a schema alongside client queries, you may want to decrease this |\n| `vscode-graphql.debug`                    | `false`                                           | show more verbose log output in the output channel                                                                                                                                                                                                                                                  |\n\nall the `graphql-config.load.*` configuration values come from static\n`loadConfig()` options in graphql config.\n\n(more coming soon!)\n\n### Architectural Overview\n\nGraphQL Language Service currently communicates via Stream transport with the\nIDE server. GraphQL server will receive/send RPC messages to perform language\nservice features, while caching the necessary GraphQL artifacts such as fragment\ndefinitions, GraphQL schemas etc. More about the server interface and RPC\nmessage format below.\n\nThe IDE server should launch a separate GraphQL server with its own child\nprocess for each `.graphqlrc.yml` file the IDE finds (using the nearest ancestor\ndirectory relative to the file currently being edited):\n\n```\n./application\n\n  ./productA\n    .graphqlrc.yml\n    ProductAQuery.graphql\n    ProductASchema.graphql\n\n  ./productB\n    .graphqlrc.yml\n    ProductBQuery.graphql\n    ProductBSchema.graphql\n```\n\nA separate GraphQL server should be instantiated for `ProductA` and `ProductB`,\neach with its own `.graphqlrc.yml` file, as illustrated in the directory\nstructure above.\n\nThe IDE server should manage the lifecycle of the GraphQL server. Ideally, the\nIDE server should spawn a child process for each of the GraphQL Language Service\nprocesses necessary, and gracefully exit the processes as the IDE closes. In\ncase of errors or a sudden halt the GraphQL Language Service will close as the\nstream from the IDE closes.\n\n### Server Interface\n\nGraphQL Language Server uses [JSON-RPC](http://www.jsonrpc.org/specification) to\ncommunicate with the IDE servers. Microsoft's language server currently supports\ntwo communication transports: Stream (stdio) and IPC. For IPC transport, the\nreference guide to be used for development is\n[the language server protocol](https://microsoft.github.io/language-server-protocol/specification)\ndocumentation.\n\nFor each transport, there is a slight difference in JSON message format,\nespecially in how the methods to be invoked are defined - below are the\ncurrently supported methods for each transport (will be updated as progress is\nmade):\n\n|                      | Stream                       | IPC                                         |\n| -------------------: | ---------------------------- | ------------------------------------------- |\n|          Diagnostics | `getDiagnostics`             | `textDocument/publishDiagnostics`           |\n|       Autocompletion | `getAutocompleteSuggestions` | `textDocument/completion`                   |\n|              Outline | `getOutline`                 | `textDocument/outline`                      |\n|     Document Symbols | `getDocumentSymbols`         | `textDocument/symbols`                      |\n|    Workspace Symbols | `getWorkspaceSymbols`        | `workspace/symbols`                         |\n|     Go-to definition | `getDefinition`              | `textDocument/definition`                   |\n| Workspace Definition | `getWorkspaceDefinition`     | `workspace/definition`                      |\n|          File Events | Not supported yet            | `didOpen/didClose/didSave/didChange` events |\n"
  },
  {
    "path": "packages/graphql-language-service-server/jest.config.js",
    "content": "module.exports = require('../../jest.config.base')(__dirname);\n"
  },
  {
    "path": "packages/graphql-language-service-server/package.json",
    "content": "{\n  \"name\": \"graphql-language-service-server\",\n  \"version\": \"2.14.8\",\n  \"description\": \"Server process backing the GraphQL Language Service\",\n  \"contributors\": [\n    \"Greg Hurrell <greg@hurrell.net> (https://greg.hurrell.net)\",\n    \"Hyohyeon Jeong <asiandrummer@fb.com>\",\n    \"Lee Byron <lee@leebyron.com> (https://leebyron.com)\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/graphql-language-service-server\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-server#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/graphql/graphiql/issues?q=issue+label:lsp-server\"\n  },\n  \"license\": \"MIT\",\n  \"files\": [\n    \"dist\",\n    \"esm\",\n    \"src\"\n  ],\n  \"keywords\": [\n    \"graphql\",\n    \"language server\",\n    \"LSP\",\n    \"vue\",\n    \"svelte\",\n    \"typescript\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\"\n  },\n  \"main\": \"dist/index.js\",\n  \"module\": \"esm/index.js\",\n  \"typings\": \"esm/index.d.ts\",\n  \"peerDependencies\": {\n    \"graphql\": \"^16.0.0\"\n  },\n  \"COMMENT\": \"please do not remove dependencies without thorough testing. many dependencies are not imported directly, as they are peer dependencies\",\n  \"dependencies\": {\n    \"@astrojs/compiler\": \"^2.10.1\",\n    \"@babel/parser\": \"^7.23.6\",\n    \"@babel/types\": \"^7.23.5\",\n    \"@graphql-tools/code-file-loader\": \"8.0.3\",\n    \"cosmiconfig-toml-loader\": \"^1.0.0\",\n    \"dotenv\": \"10.0.0\",\n    \"fast-glob\": \"^3.2.7\",\n    \"glob\": \"^7.2.0\",\n    \"graphql-config\": \"5.0.3\",\n    \"graphql-language-service\": \"^5.3.1\",\n    \"lru-cache\": \"^10.2.0\",\n    \"mkdirp\": \"^1.0.4\",\n    \"node-abort-controller\": \"^3.0.1\",\n    \"nullthrows\": \"^1.0.0\",\n    \"source-map-js\": \"1.0.2\",\n    \"svelte\": \"^4.2.19\",\n    \"svelte2tsx\": \"^0.7.0\",\n    \"typescript\": \"^5.3.3\",\n    \"vscode-jsonrpc\": \"^8.0.1\",\n    \"vscode-languageserver\": \"^8.0.1\",\n    \"vscode-languageserver-types\": \"^3.17.2\",\n    \"vscode-uri\": \"^3.0.2\",\n    \"vue\": \"^3.2.0\"\n  },\n  \"devDependencies\": {\n    \"@types/glob\": \"^8.1.0\",\n    \"@types/mkdirp\": \"^1.0.1\",\n    \"@types/mock-fs\": \"^4.13.4\",\n    \"@whatwg-node/fetch\": \"npm:^0.9.0\",\n    \"cross-env\": \"^7.0.2\",\n    \"debounce-promise\": \"^3.1.2\",\n    \"graphql\": \"^16.9.0\",\n    \"mock-fs\": \"^5.2.0\"\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/GraphQLCache.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  ASTNode,\n  DocumentNode,\n  DefinitionNode,\n  isTypeDefinitionNode,\n  GraphQLSchema,\n  Kind,\n  extendSchema,\n  parse,\n  visit,\n} from 'graphql';\nimport type {\n  CachedContent,\n  GraphQLFileMetadata,\n  GraphQLFileInfo,\n  FragmentInfo,\n  ObjectTypeInfo,\n  Uri,\n} from 'graphql-language-service';\n\nimport * as fs from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport nullthrows from 'nullthrows';\n\nimport {\n  loadConfig,\n  GraphQLConfig,\n  GraphQLProjectConfig,\n  GraphQLExtensionDeclaration,\n} from 'graphql-config';\n\nimport type { UnnormalizedTypeDefPointer } from '@graphql-tools/load';\n\nimport { parseDocument } from './parseDocument';\nimport stringToHash from './stringToHash';\nimport { glob } from 'glob';\nimport { LoadConfigOptions } from './types';\nimport { URI } from 'vscode-uri';\nimport {\n  CodeFileLoader,\n  CodeFileLoaderConfig,\n} from '@graphql-tools/code-file-loader';\nimport {\n  DEFAULT_SUPPORTED_EXTENSIONS,\n  DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n} from './constants';\nimport { NoopLogger, Logger } from './Logger';\nimport { LRUCache } from 'lru-cache';\n// import { is } from '@babel/types';\n\nconst codeLoaderConfig: CodeFileLoaderConfig = {\n  noSilentErrors: false,\n  pluckConfig: {\n    skipIndent: true,\n  },\n};\n\nconst LanguageServiceExtension: GraphQLExtensionDeclaration = api => {\n  // For schema\n  api.loaders.schema.register(new CodeFileLoader(codeLoaderConfig));\n  // For documents\n  api.loaders.documents.register(new CodeFileLoader(codeLoaderConfig));\n\n  return { name: 'languageService' };\n};\n\n// Maximum files to read when processing GraphQL files.\nconst MAX_READS = 200;\n\nexport type OnSchemaChange = (project: GraphQLProjectConfig) => void;\n\nexport async function getGraphQLCache({\n  parser,\n  logger,\n  loadConfigOptions,\n  config,\n  onSchemaChange,\n  schemaCacheTTL,\n}: {\n  parser: typeof parseDocument;\n  logger: Logger | NoopLogger;\n  loadConfigOptions: LoadConfigOptions;\n  config?: GraphQLConfig;\n  onSchemaChange?: OnSchemaChange;\n  schemaCacheTTL?: number;\n}): Promise<GraphQLCache> {\n  const graphQLConfig =\n    config ||\n    (await loadConfig({\n      ...loadConfigOptions,\n      extensions: [\n        ...(loadConfigOptions?.extensions ?? []),\n        LanguageServiceExtension,\n      ],\n    }));\n  return new GraphQLCache({\n    configDir: loadConfigOptions.rootDir!,\n    config: graphQLConfig!,\n    parser,\n    logger,\n    onSchemaChange,\n    schemaCacheTTL:\n      schemaCacheTTL ??\n      // @ts-expect-error TODO: add types for extension configs\n      config?.extensions?.get('languageService')?.schemaCacheTTL,\n  });\n}\n\nexport class GraphQLCache {\n  _configDir: Uri;\n  _graphQLFileListCache: Map<Uri, Map<string, GraphQLFileInfo>>;\n  _graphQLConfig: GraphQLConfig;\n  _schemaMap: LRUCache<Uri, GraphQLSchema>;\n  _typeExtensionMap: Map<Uri, number>;\n  _fragmentDefinitionsCache: Map<Uri, Map<string, FragmentInfo>>;\n  _typeDefinitionsCache: Map<Uri, Map<string, ObjectTypeInfo>>;\n  _parser: typeof parseDocument;\n  _logger: Logger | NoopLogger;\n  _onSchemaChange?: OnSchemaChange;\n  _schemaCacheTTL?: number;\n\n  constructor({\n    configDir,\n    config,\n    parser,\n    logger,\n    onSchemaChange,\n    schemaCacheTTL,\n  }: {\n    configDir: Uri;\n    config: GraphQLConfig;\n    parser: typeof parseDocument;\n    logger: Logger | NoopLogger;\n    onSchemaChange?: OnSchemaChange;\n    schemaCacheTTL?: number;\n  }) {\n    this._configDir = configDir;\n    this._graphQLConfig = config;\n    this._graphQLFileListCache = new Map();\n    this._schemaMap = new LRUCache({\n      max: 20,\n      ttl: schemaCacheTTL ?? 1000 * 30,\n      ttlAutopurge: true,\n      updateAgeOnGet: false,\n    });\n    this._fragmentDefinitionsCache = new Map();\n    this._typeDefinitionsCache = new Map();\n    this._typeExtensionMap = new Map();\n    this._parser = parser;\n    this._logger = logger;\n    this._onSchemaChange = onSchemaChange;\n  }\n\n  getGraphQLConfig = (): GraphQLConfig => this._graphQLConfig;\n\n  getProjectForFile = (uri: string): GraphQLProjectConfig | void => {\n    try {\n      const project = this._graphQLConfig.getProjectForFile(\n        URI.parse(uri).fsPath,\n      );\n      if (!project.documents) {\n        this._logger.warn(\n          `No documents configured for project ${project.name}. Many features will not work correctly.`,\n        );\n      }\n      return project;\n    } catch (err) {\n      this._logger.error(\n        `there was an error loading the project config for this file ${err}`,\n      );\n      return;\n    }\n  };\n\n  getFragmentDependencies = async (\n    query: string,\n    fragmentDefinitions?: Map<string, FragmentInfo> | null,\n  ): Promise<FragmentInfo[]> => {\n    // If there isn't context for fragment references,\n    // return an empty array.\n    if (!fragmentDefinitions) {\n      return [];\n    }\n    // If the query cannot be parsed, validations cannot happen yet.\n    // Return an empty array.\n    let parsedQuery;\n    try {\n      parsedQuery = parse(query);\n    } catch {\n      return [];\n    }\n    return this.getFragmentDependenciesForAST(parsedQuery, fragmentDefinitions);\n  };\n\n  getFragmentDependenciesForAST = async (\n    parsedQuery: ASTNode,\n    fragmentDefinitions: Map<string, FragmentInfo>,\n  ): Promise<FragmentInfo[]> => {\n    if (!fragmentDefinitions) {\n      return [];\n    }\n\n    const existingFrags = new Map();\n    const referencedFragNames = new Set<string>();\n\n    visit(parsedQuery, {\n      FragmentDefinition(node) {\n        existingFrags.set(node.name.value, true);\n      },\n      FragmentSpread(node) {\n        if (!referencedFragNames.has(node.name.value)) {\n          referencedFragNames.add(node.name.value);\n        }\n      },\n    });\n\n    const asts = new Set<FragmentInfo>();\n    for (const name of referencedFragNames) {\n      if (!existingFrags.has(name) && fragmentDefinitions.has(name)) {\n        asts.add(nullthrows(fragmentDefinitions.get(name)));\n      }\n    }\n\n    const referencedFragments: FragmentInfo[] = [];\n\n    for (const ast of asts) {\n      visit(ast.definition, {\n        FragmentSpread(node) {\n          if (\n            !referencedFragNames.has(node.name.value) &&\n            fragmentDefinitions.get(node.name.value)\n          ) {\n            asts.add(nullthrows(fragmentDefinitions.get(node.name.value)));\n            referencedFragNames.add(node.name.value);\n          }\n        },\n      });\n      if (!existingFrags.has(ast.definition.name.value)) {\n        referencedFragments.push(ast);\n      }\n    }\n\n    return referencedFragments;\n  };\n\n  _cacheKeyForProject = ({ dirpath, name }: GraphQLProjectConfig): string => {\n    return `${dirpath}-${name}`;\n  };\n\n  getFragmentDefinitions = async (\n    projectConfig: GraphQLProjectConfig,\n  ): Promise<Map<string, FragmentInfo>> => {\n    // This function may be called from other classes.\n    // If then, check the cache first.\n    const rootDir = projectConfig.dirpath;\n    const cacheKey = this._cacheKeyForProject(projectConfig);\n    if (this._fragmentDefinitionsCache.has(cacheKey)) {\n      return this._fragmentDefinitionsCache.get(cacheKey) || new Map();\n    }\n\n    const list = await this._readFilesFromInputDirs(rootDir, projectConfig);\n\n    const { fragmentDefinitions, graphQLFileMap } =\n      await this.readAllGraphQLFiles(list);\n\n    this._fragmentDefinitionsCache.set(cacheKey, fragmentDefinitions);\n    this._graphQLFileListCache.set(cacheKey, graphQLFileMap);\n\n    return fragmentDefinitions;\n  };\n\n  getObjectTypeDependenciesForAST = async (\n    parsedQuery: ASTNode,\n    objectTypeDefinitions: Map<string, ObjectTypeInfo>,\n  ): Promise<Array<ObjectTypeInfo>> => {\n    if (!objectTypeDefinitions) {\n      return [];\n    }\n\n    const existingObjectTypes = new Map();\n    const referencedObjectTypes = new Set<string>();\n\n    visit(parsedQuery, {\n      ObjectTypeDefinition(node) {\n        existingObjectTypes.set(node.name.value, true);\n      },\n      InputObjectTypeDefinition(node) {\n        existingObjectTypes.set(node.name.value, true);\n      },\n      EnumTypeDefinition(node) {\n        existingObjectTypes.set(node.name.value, true);\n      },\n      NamedType(node) {\n        if (!referencedObjectTypes.has(node.name.value)) {\n          referencedObjectTypes.add(node.name.value);\n        }\n      },\n      UnionTypeDefinition(node) {\n        existingObjectTypes.set(node.name.value, true);\n      },\n      ScalarTypeDefinition(node) {\n        existingObjectTypes.set(node.name.value, true);\n      },\n      InterfaceTypeDefinition(node) {\n        existingObjectTypes.set(node.name.value, true);\n      },\n    });\n\n    const asts = new Set<ObjectTypeInfo>();\n    for (const name of referencedObjectTypes) {\n      if (!existingObjectTypes.has(name) && objectTypeDefinitions.has(name)) {\n        asts.add(nullthrows(objectTypeDefinitions.get(name)));\n      }\n    }\n\n    const referencedObjects: ObjectTypeInfo[] = [];\n\n    for (const ast of asts) {\n      visit(ast.definition, {\n        NamedType(node) {\n          if (\n            !referencedObjectTypes.has(node.name.value) &&\n            objectTypeDefinitions.get(node.name.value)\n          ) {\n            asts.add(nullthrows(objectTypeDefinitions.get(node.name.value)));\n            referencedObjectTypes.add(node.name.value);\n          }\n        },\n      });\n      if (!existingObjectTypes.has(ast.definition.name.value)) {\n        referencedObjects.push(ast);\n      }\n    }\n\n    return referencedObjects;\n  };\n\n  getObjectTypeDefinitions = async (\n    projectConfig: GraphQLProjectConfig,\n  ): Promise<Map<string, ObjectTypeInfo>> => {\n    // This function may be called from other classes.\n    // If then, check the cache first.\n    const rootDir = projectConfig.dirpath;\n    const cacheKey = this._cacheKeyForProject(projectConfig);\n    if (this._typeDefinitionsCache.has(cacheKey)) {\n      return this._typeDefinitionsCache.get(cacheKey) || new Map();\n    }\n    const list = await this._readFilesFromInputDirs(rootDir, projectConfig);\n    const { objectTypeDefinitions, graphQLFileMap } =\n      await this.readAllGraphQLFiles(list);\n    this._typeDefinitionsCache.set(cacheKey, objectTypeDefinitions);\n    this._graphQLFileListCache.set(cacheKey, graphQLFileMap);\n\n    return objectTypeDefinitions;\n  };\n\n  _readFilesFromInputDirs = (\n    rootDir: string,\n    projectConfig: GraphQLProjectConfig,\n  ): Promise<Array<GraphQLFileMetadata>> => {\n    let pattern: string;\n    const patterns = this._getSchemaAndDocumentFilePatterns(projectConfig);\n\n    // See https://github.com/graphql/graphql-language-service/issues/221\n    // for details on why special handling is required here for the\n    // documents.length === 1 case.\n    if (patterns.length === 1) {\n      // @ts-ignore\n      pattern = patterns[0];\n    } else {\n      pattern = `{${patterns.join(',')}}`;\n    }\n\n    return new Promise((resolve, reject) => {\n      const globResult = new glob.Glob(\n        pattern,\n        {\n          cwd: rootDir,\n          stat: true,\n          absolute: false,\n          ignore: [\n            'generated/relay',\n            '**/__flow__/**',\n            '**/__generated__/**',\n            '**/__github__/**',\n            '**/__mocks__/**',\n            '**/node_modules/**',\n            '**/__flowtests__/**',\n          ],\n        },\n        error => {\n          if (error) {\n            reject(error);\n          }\n        },\n      );\n      globResult.on('end', () => {\n        resolve(\n          Object.keys(globResult.statCache)\n            .filter(\n              filePath => typeof globResult.statCache[filePath] === 'object',\n            )\n            .filter(filePath => projectConfig.match(filePath))\n            .map(filePath => {\n              // @TODO\n              // so we have to force this here\n              // because glob's DefinitelyTyped doesn't use fs.Stats here though\n              // the docs indicate that is what's there :shrug:\n              const cacheEntry = globResult.statCache[filePath] as fs.Stats;\n              return {\n                filePath: URI.file(filePath).toString(),\n                mtime: Math.trunc(cacheEntry.mtime.getTime() / 1000),\n                size: cacheEntry.size,\n              };\n            }),\n        );\n      });\n    });\n  };\n\n  _getSchemaAndDocumentFilePatterns = (projectConfig: GraphQLProjectConfig) => {\n    const patterns: string[] = [];\n\n    for (const pointer of [projectConfig.documents, projectConfig.schema]) {\n      if (pointer) {\n        if (typeof pointer === 'string') {\n          patterns.push(pointer);\n        } else if (Array.isArray(pointer)) {\n          patterns.push(...pointer);\n        }\n      }\n    }\n\n    return patterns;\n  };\n\n  async updateFragmentDefinition(\n    projectCacheKey: Uri,\n    filePath: Uri,\n    contents: Array<CachedContent>,\n  ): Promise<void> {\n    const cache = this._fragmentDefinitionsCache.get(projectCacheKey);\n    const asts = contents.map(({ query }) => {\n      try {\n        return {\n          ast: parse(query),\n          query,\n        };\n      } catch {\n        return { ast: null, query };\n      }\n    });\n    if (cache) {\n      // first go through the fragment list to delete the ones from this file\n      for (const [key, value] of cache.entries()) {\n        if (value.filePath === filePath) {\n          cache.delete(key);\n        }\n      }\n      this._setFragmentCache(asts, cache, filePath);\n    } else {\n      const newFragmentCache = this._setFragmentCache(\n        asts,\n        new Map(),\n        filePath,\n      );\n      this._fragmentDefinitionsCache.set(projectCacheKey, newFragmentCache);\n    }\n  }\n  _setFragmentCache(\n    asts: { ast: DocumentNode | null; query: string }[],\n    fragmentCache: Map<string, FragmentInfo>,\n    filePath: string | undefined,\n  ) {\n    for (const { ast, query } of asts) {\n      if (!ast) {\n        continue;\n      }\n      for (const definition of ast.definitions) {\n        if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n          fragmentCache.set(definition.name.value, {\n            filePath,\n            content: query,\n            definition,\n          });\n        }\n      }\n    }\n    return fragmentCache;\n  }\n\n  async updateObjectTypeDefinition(\n    projectCacheKey: Uri,\n    filePath: Uri,\n    contents: Array<CachedContent>,\n  ): Promise<void> {\n    const cache = this._typeDefinitionsCache.get(projectCacheKey);\n    const asts = contents.map(({ query }) => {\n      try {\n        return {\n          ast: parse(query),\n          query,\n        };\n      } catch {\n        return { ast: null, query };\n      }\n    });\n    if (cache) {\n      // first go through the types list to delete the ones from this file\n      for (const [key, value] of cache.entries()) {\n        if (value.filePath === filePath) {\n          cache.delete(key);\n        }\n      }\n      this._setDefinitionCache(asts, cache, filePath);\n    } else {\n      const newTypeCache = this._setDefinitionCache(asts, new Map(), filePath);\n      this._typeDefinitionsCache.set(projectCacheKey, newTypeCache);\n    }\n  }\n  _setDefinitionCache(\n    asts: { ast: DocumentNode | null; query: string }[],\n    typeCache: Map<string, ObjectTypeInfo>,\n    filePath: string | undefined,\n  ) {\n    for (const { ast, query } of asts) {\n      if (!ast) {\n        continue;\n      }\n      for (const definition of ast.definitions) {\n        if (isTypeDefinitionNode(definition)) {\n          typeCache.set(definition.name.value, {\n            filePath,\n            content: query,\n            definition,\n          });\n        }\n      }\n    }\n    return typeCache;\n  }\n\n  _extendSchema(\n    schema: GraphQLSchema,\n    schemaPath: string | null,\n    schemaCacheKey: string | null,\n  ): GraphQLSchema {\n    const graphQLFileMap = this._graphQLFileListCache.get(this._configDir);\n    const typeExtensions: DefinitionNode[] = [];\n\n    if (!graphQLFileMap) {\n      return schema;\n    }\n    for (const { filePath, asts } of graphQLFileMap.values()) {\n      for (const ast of asts) {\n        if (filePath === schemaPath) {\n          continue;\n        }\n        for (const definition of ast.definitions) {\n          switch (definition.kind) {\n            case Kind.OBJECT_TYPE_DEFINITION:\n            case Kind.INTERFACE_TYPE_DEFINITION:\n            case Kind.ENUM_TYPE_DEFINITION:\n            case Kind.UNION_TYPE_DEFINITION:\n            case Kind.SCALAR_TYPE_DEFINITION:\n            case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n            case Kind.SCALAR_TYPE_EXTENSION:\n            case Kind.OBJECT_TYPE_EXTENSION:\n            case Kind.INTERFACE_TYPE_EXTENSION:\n            case Kind.UNION_TYPE_EXTENSION:\n            case Kind.ENUM_TYPE_EXTENSION:\n            case Kind.INPUT_OBJECT_TYPE_EXTENSION:\n            case Kind.DIRECTIVE_DEFINITION:\n              typeExtensions.push(definition);\n              break;\n          }\n        }\n      }\n    }\n\n    if (schemaCacheKey) {\n      const sorted = typeExtensions.sort((a: any, b: any) => {\n        const aName = a.definition ? a.definition.name.value : a.name.value;\n        const bName = b.definition ? b.definition.name.value : b.name.value;\n        return aName > bName ? 1 : -1;\n      });\n      const hash = stringToHash(JSON.stringify(sorted));\n\n      if (\n        this._typeExtensionMap.has(schemaCacheKey) &&\n        this._typeExtensionMap.get(schemaCacheKey) === hash\n      ) {\n        return schema;\n      }\n\n      this._typeExtensionMap.set(schemaCacheKey, hash);\n    }\n\n    return extendSchema(schema, {\n      kind: Kind.DOCUMENT,\n      definitions: typeExtensions,\n    });\n  }\n\n  getSchema = async (\n    appName?: string,\n    queryHasExtensions?: boolean | null,\n  ): Promise<GraphQLSchema | null> => {\n    const projectConfig = this._graphQLConfig.getProject(appName);\n\n    if (!projectConfig) {\n      return null;\n    }\n\n    const schemaPath = projectConfig.schema as string;\n    const schemaKey = this._getSchemaCacheKeyForProject(projectConfig);\n\n    let schemaCacheKey = null;\n    let schema = null;\n\n    if (schemaPath && schemaKey) {\n      schemaCacheKey = schemaKey as string;\n\n      // Maybe use cache\n      if (this._schemaMap.has(schemaCacheKey)) {\n        schema = this._schemaMap.get(schemaCacheKey);\n        if (schema) {\n          return queryHasExtensions\n            ? this._extendSchema(schema, schemaPath, schemaCacheKey)\n            : schema;\n        }\n      }\n\n      // Read from disk\n      schema = await projectConfig.getSchema();\n    }\n\n    const customDirectives = projectConfig?.extensions?.customDirectives;\n    if (customDirectives && schema) {\n      const directivesSDL = customDirectives.join('\\n\\n');\n      schema = extendSchema(schema, parse(directivesSDL));\n    }\n\n    if (!schema) {\n      return null;\n    }\n\n    if (this._graphQLFileListCache.has(this._configDir)) {\n      schema = this._extendSchema(schema, schemaPath, schemaCacheKey);\n    }\n\n    if (schemaCacheKey) {\n      this._schemaMap.set(schemaCacheKey, schema);\n      if (this._onSchemaChange) {\n        this._onSchemaChange(projectConfig);\n      }\n    }\n    return schema;\n  };\n\n  invalidateSchemaCacheForProject(projectConfig: GraphQLProjectConfig) {\n    const schemaKey = this._getSchemaCacheKeyForProject(\n      projectConfig,\n    ) as string;\n    if (schemaKey) {\n      this._schemaMap.delete(schemaKey);\n    }\n  }\n\n  _getSchemaCacheKeyForProject(\n    projectConfig: GraphQLProjectConfig,\n  ): UnnormalizedTypeDefPointer {\n    return projectConfig.schema;\n  }\n\n  _getProjectName(projectConfig: GraphQLProjectConfig) {\n    return projectConfig?.name || 'default';\n  }\n\n  /**\n   * Given a list of GraphQL file metadata, read all files collected from watchman\n   * and create fragmentDefinitions and GraphQL files cache.\n   */\n  readAllGraphQLFiles = async (\n    list: Array<GraphQLFileMetadata>,\n  ): Promise<{\n    objectTypeDefinitions: Map<string, ObjectTypeInfo>;\n    fragmentDefinitions: Map<string, FragmentInfo>;\n    graphQLFileMap: Map<string, GraphQLFileInfo>;\n  }> => {\n    const queue = list.slice(); // copy\n    const responses: GraphQLFileInfo[] = [];\n    while (queue.length) {\n      const chunk = queue.splice(0, MAX_READS);\n      const promises = chunk.map(async fileInfo => {\n        try {\n          const response = await this.promiseToReadGraphQLFile(\n            fileInfo.filePath,\n          );\n          responses.push({\n            ...response,\n            mtime: fileInfo.mtime,\n            size: fileInfo.size,\n          });\n        } catch (error: any) {\n          // eslint-disable-next-line no-console\n          console.log('pro', error);\n          /**\n           * fs emits `EMFILE | ENFILE` error when there are too many\n           * open files - this can cause some fragment files not to be\n           * processed.  Solve this case by implementing a queue to save\n           * files failed to be processed because of `EMFILE` error,\n           * and await on Promises created with the next batch from the\n           * queue.\n           */\n          if (error.code === 'EMFILE' || error.code === 'ENFILE') {\n            queue.push(fileInfo);\n          }\n        }\n      });\n      await Promise.all(promises); // eslint-disable-line no-await-in-loop\n    }\n\n    return this.processGraphQLFiles(responses);\n  };\n\n  /**\n   * Takes an array of GraphQL File information and batch-processes into a\n   * map of fragmentDefinitions and GraphQL file cache.\n   */\n  processGraphQLFiles = (\n    responses: Array<GraphQLFileInfo>,\n  ): {\n    objectTypeDefinitions: Map<string, ObjectTypeInfo>;\n    fragmentDefinitions: Map<string, FragmentInfo>;\n    graphQLFileMap: Map<string, GraphQLFileInfo>;\n  } => {\n    const objectTypeDefinitions = new Map();\n    const fragmentDefinitions = new Map();\n    const graphQLFileMap = new Map();\n\n    for (const response of responses) {\n      const { filePath, content, asts, mtime, size } = response;\n\n      if (asts) {\n        for (const ast of asts) {\n          for (const definition of ast.definitions) {\n            if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n              fragmentDefinitions.set(definition.name.value, {\n                filePath,\n                content,\n                definition,\n              });\n            } else if (isTypeDefinitionNode(definition)) {\n              objectTypeDefinitions.set(definition.name.value, {\n                filePath,\n                content,\n                definition,\n              });\n            }\n          }\n        }\n      }\n\n      // Relay the previous object whether or not ast exists.\n      graphQLFileMap.set(filePath, {\n        filePath,\n        content,\n        asts,\n        mtime,\n        size,\n      });\n    }\n\n    return {\n      objectTypeDefinitions,\n      fragmentDefinitions,\n      graphQLFileMap,\n    };\n  };\n\n  /**\n   * Returns a Promise to read a GraphQL file and return a GraphQL metadata\n   * including a parsed AST.\n   */\n  promiseToReadGraphQLFile = async (\n    filePath: Uri,\n  ): Promise<GraphQLFileInfo> => {\n    const content = await readFile(URI.parse(filePath).fsPath, 'utf-8');\n\n    const asts: DocumentNode[] = [];\n    let queries: CachedContent[] = [];\n    if (content.trim().length !== 0) {\n      try {\n        queries = await this._parser(\n          content,\n          filePath,\n          DEFAULT_SUPPORTED_EXTENSIONS,\n          DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n          this._logger,\n        );\n        if (queries.length === 0) {\n          // still resolve with an empty ast\n          return {\n            filePath,\n            content,\n            asts: [],\n            queries: [],\n            mtime: 0,\n            size: 0,\n          };\n        }\n\n        for (const { query } of queries) {\n          asts.push(parse(query));\n        }\n        return {\n          filePath,\n          content,\n          asts,\n          queries,\n          mtime: 0,\n          size: 0,\n        };\n      } catch {\n        // If query has syntax errors, go ahead and still resolve\n        // the filePath and the content, but leave ast empty.\n        return {\n          filePath,\n          content,\n          asts: [],\n          queries: [],\n          mtime: 0,\n          size: 0,\n        };\n      }\n    }\n    return { filePath, content, asts, queries, mtime: 0, size: 0 };\n  };\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/GraphQLLanguageService.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {\n  DocumentNode,\n  FragmentSpreadNode,\n  FragmentDefinitionNode,\n  TypeDefinitionNode,\n  NamedTypeNode,\n  ValidationRule,\n  FieldNode,\n  GraphQLError,\n  Kind,\n  parse,\n  print,\n  isTypeDefinitionNode,\n  ArgumentNode,\n  typeFromAST,\n} from 'graphql';\n\nimport {\n  CompletionItem,\n  Diagnostic,\n  Uri,\n  IPosition,\n  Outline,\n  OutlineTree,\n  getAutocompleteSuggestions,\n  getHoverInformation,\n  HoverConfig,\n  validateQuery,\n  getRange,\n  DIAGNOSTIC_SEVERITY,\n  getOutline,\n  getDefinitionQueryResultForFragmentSpread,\n  getDefinitionQueryResultForDefinitionNode,\n  getDefinitionQueryResultForNamedType,\n  getDefinitionQueryResultForField,\n  getASTNodeAtPosition,\n  getTokenAtPosition,\n  getTypeInfo,\n  DefinitionQueryResponse,\n  getDefinitionQueryResultForArgument,\n} from 'graphql-language-service';\n\nimport type { GraphQLCache } from './GraphQLCache';\n\nimport { GraphQLConfig, GraphQLProjectConfig } from 'graphql-config';\n\nimport type { Logger } from 'vscode-languageserver';\nimport {\n  Hover,\n  SymbolInformation,\n  SymbolKind,\n} from 'vscode-languageserver-types';\n\nconst KIND_TO_SYMBOL_KIND: { [key: string]: SymbolKind } = {\n  [Kind.FIELD]: SymbolKind.Field,\n  [Kind.OPERATION_DEFINITION]: SymbolKind.Class,\n  [Kind.FRAGMENT_DEFINITION]: SymbolKind.Class,\n  [Kind.FRAGMENT_SPREAD]: SymbolKind.Struct,\n  [Kind.OBJECT_TYPE_DEFINITION]: SymbolKind.Class,\n  [Kind.ENUM_TYPE_DEFINITION]: SymbolKind.Enum,\n  [Kind.ENUM_VALUE_DEFINITION]: SymbolKind.EnumMember,\n  [Kind.INPUT_OBJECT_TYPE_DEFINITION]: SymbolKind.Class,\n  [Kind.INPUT_VALUE_DEFINITION]: SymbolKind.Field,\n  [Kind.FIELD_DEFINITION]: SymbolKind.Field,\n  [Kind.INTERFACE_TYPE_DEFINITION]: SymbolKind.Interface,\n  [Kind.DOCUMENT]: SymbolKind.File,\n  // novel, for symbols only\n  FieldWithArguments: SymbolKind.Method,\n};\n\nfunction getKind(tree: OutlineTree) {\n  if (\n    tree.kind === 'FieldDefinition' &&\n    tree.children &&\n    tree.children.length > 0\n  ) {\n    return KIND_TO_SYMBOL_KIND.FieldWithArguments;\n  }\n  return KIND_TO_SYMBOL_KIND[tree.kind];\n}\n\nexport class GraphQLLanguageService {\n  _graphQLCache: GraphQLCache;\n  _graphQLConfig: GraphQLConfig;\n  _logger: Logger;\n\n  constructor(cache: GraphQLCache, logger: Logger) {\n    this._graphQLCache = cache;\n    this._graphQLConfig = cache.getGraphQLConfig();\n\n    this._logger = logger;\n  }\n\n  getConfigForURI(uri: Uri) {\n    const config = this._graphQLCache.getProjectForFile(uri);\n    if (config) {\n      return config;\n    }\n  }\n\n  public async getDiagnostics(\n    document: string,\n    uri: Uri,\n    isRelayCompatMode?: boolean,\n  ): Promise<Array<Diagnostic>> {\n    // Perform syntax diagnostics first, as this doesn't require\n    // schema/fragment definitions, even the project configuration.\n    let documentHasExtensions = false;\n    const projectConfig = this.getConfigForURI(uri);\n    // skip validation when there's nothing to validate, prevents noisy unexpected EOF errors\n    if (!projectConfig || !document || document.trim().length < 2) {\n      return [];\n    }\n    const { schema: schemaPath, name: projectName, extensions } = projectConfig;\n\n    try {\n      const documentAST = parse(document);\n      if (!schemaPath || uri !== schemaPath) {\n        documentHasExtensions = documentAST.definitions.some(definition => {\n          switch (definition.kind) {\n            case Kind.OBJECT_TYPE_DEFINITION:\n            case Kind.INTERFACE_TYPE_DEFINITION:\n            case Kind.ENUM_TYPE_DEFINITION:\n            case Kind.UNION_TYPE_DEFINITION:\n            case Kind.SCALAR_TYPE_DEFINITION:\n            case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n            case Kind.SCALAR_TYPE_EXTENSION:\n            case Kind.OBJECT_TYPE_EXTENSION:\n            case Kind.INTERFACE_TYPE_EXTENSION:\n            case Kind.UNION_TYPE_EXTENSION:\n            case Kind.ENUM_TYPE_EXTENSION:\n            case Kind.INPUT_OBJECT_TYPE_EXTENSION:\n            case Kind.DIRECTIVE_DEFINITION:\n              return true;\n          }\n\n          return false;\n        });\n      }\n    } catch (error) {\n      if (error instanceof GraphQLError) {\n        const range = getRange(\n          error.locations?.[0] ?? { column: 0, line: 0 },\n          document,\n        );\n        return [\n          {\n            severity: DIAGNOSTIC_SEVERITY.Error,\n            message: error.message,\n            source: 'GraphQL: Syntax',\n            range,\n          },\n        ];\n      }\n\n      throw error;\n    }\n\n    // If there's a matching config, proceed to prepare to run validation\n    let source = document;\n    const fragmentDefinitions =\n      await this._graphQLCache.getFragmentDefinitions(projectConfig);\n\n    const fragmentDependencies =\n      await this._graphQLCache.getFragmentDependencies(\n        document,\n        fragmentDefinitions,\n      );\n\n    const dependenciesSource = fragmentDependencies.reduce(\n      (prev, cur) => `${prev} ${print(cur.definition)}`,\n      '',\n    );\n\n    source = `${source} ${dependenciesSource}`;\n\n    let validationAst = null;\n    try {\n      validationAst = parse(source);\n    } catch {\n      // the query string is already checked to be parsed properly - errors\n      // from this parse must be from corrupted fragment dependencies.\n      // For IDEs we don't care for errors outside of the currently edited\n      // query, so we return an empty array here.\n      return [];\n    }\n\n    // Check if there are custom validation rules to be used\n    let customRules: ValidationRule[] | null = null;\n    if (\n      extensions?.customValidationRules &&\n      typeof extensions.customValidationRules === 'function'\n    ) {\n      customRules = extensions.customValidationRules(this._graphQLConfig);\n    }\n    const schema = await this._graphQLCache.getSchema(\n      projectName,\n      documentHasExtensions,\n    );\n\n    if (!schema) {\n      return [];\n    }\n\n    return validateQuery(validationAst, schema, customRules, isRelayCompatMode);\n  }\n\n  public async getAutocompleteSuggestions(\n    query: string,\n    position: IPosition,\n    filePath: Uri,\n  ): Promise<Array<CompletionItem>> {\n    const projectConfig = this.getConfigForURI(filePath);\n    if (!projectConfig) {\n      return [];\n    }\n    const schema = await this._graphQLCache.getSchema(projectConfig.name);\n    if (!schema) {\n      return [];\n    }\n    let fragmentInfo = [] as Array<FragmentDefinitionNode>;\n    try {\n      const fragmentDefinitions =\n        await this._graphQLCache.getFragmentDefinitions(projectConfig);\n      fragmentInfo = Array.from(fragmentDefinitions).map(\n        ([, info]) => info.definition,\n      );\n    } catch {}\n\n    return getAutocompleteSuggestions(\n      schema,\n      query,\n      position,\n      undefined,\n      fragmentInfo,\n      {\n        uri: filePath,\n        fillLeafsOnComplete:\n          projectConfig?.extensions?.languageService?.fillLeafsOnComplete ??\n          false,\n      },\n    );\n  }\n\n  public async getHoverInformation(\n    query: string,\n    position: IPosition,\n    filePath: Uri,\n    options?: HoverConfig,\n  ): Promise<Hover['contents']> {\n    const projectConfig = this.getConfigForURI(filePath);\n    if (!projectConfig) {\n      return '';\n    }\n    const schema = await this._graphQLCache.getSchema(projectConfig.name);\n\n    if (schema) {\n      return getHoverInformation(schema, query, position, undefined, options);\n    }\n    return '';\n  }\n\n  public async getDefinition(\n    query: string,\n    position: IPosition,\n    filePath: Uri,\n  ): Promise<DefinitionQueryResponse | null> {\n    const projectConfig = this.getConfigForURI(filePath);\n\n    if (!projectConfig) {\n      return null;\n    }\n\n    const schema = await this._graphQLCache.getSchema(projectConfig.name);\n    if (!schema) {\n      return null;\n    }\n    let ast;\n    try {\n      ast = parse(query);\n    } catch {\n      return null;\n    }\n\n    const node = getASTNodeAtPosition(query, ast, position);\n    // @ts-expect-error\n    const type = node && typeFromAST(schema, node);\n\n    let queryResult: DefinitionQueryResponse | null = null;\n    if (node) {\n      switch (node.kind) {\n        case Kind.FRAGMENT_SPREAD:\n          queryResult = await this._getDefinitionForFragmentSpread(\n            query,\n            ast,\n            node,\n            filePath,\n            projectConfig,\n          );\n          break;\n        case Kind.FRAGMENT_DEFINITION:\n        case Kind.OPERATION_DEFINITION:\n          queryResult = getDefinitionQueryResultForDefinitionNode(\n            filePath,\n            query,\n            node,\n          );\n          break;\n        case Kind.NAMED_TYPE:\n          queryResult = await this._getDefinitionForNamedType(\n            query,\n            ast,\n            node,\n            filePath,\n            projectConfig,\n          );\n          break;\n        case Kind.FIELD:\n          queryResult = await this._getDefinitionForField(\n            query,\n            ast,\n            node,\n            filePath,\n            projectConfig,\n            position,\n          );\n          break;\n        case Kind.ARGUMENT:\n          queryResult = await this._getDefinitionForArgument(\n            query,\n            ast,\n            node,\n            filePath,\n            projectConfig,\n            position,\n          );\n          break;\n      }\n    }\n    if (queryResult) {\n      return {\n        ...queryResult,\n        node,\n        type,\n      };\n    }\n    return null;\n  }\n\n  public async getDocumentSymbols(\n    document: string,\n    filePath: Uri,\n  ): Promise<SymbolInformation[]> {\n    const outline = await this.getOutline(document);\n    if (!outline) {\n      return [];\n    }\n\n    const output: Array<SymbolInformation> = [];\n    const input = outline.outlineTrees.map((tree: OutlineTree) => [null, tree]);\n\n    while (input.length > 0) {\n      const res = input.pop();\n      if (!res) {\n        return [];\n      }\n      const [parent, tree] = res;\n      if (!tree) {\n        return [];\n      }\n\n      output.push({\n        // @ts-ignore\n        name: tree.representativeName ?? 'Anonymous',\n        kind: getKind(tree),\n        location: {\n          uri: filePath,\n          range: {\n            start: tree.startPosition,\n            // @ts-ignore\n            end: tree.endPosition,\n          },\n        },\n        containerName: parent ? parent.representativeName : undefined,\n      });\n      input.push(...tree.children.map(child => [tree, child]));\n    }\n    return output;\n  }\n  //\n  // public async getReferences(\n  //   document: string,\n  //   position: Position,\n  //   filePath: Uri,\n  // ): Promise<Location[]> {\n  //\n  // }\n\n  async _getDefinitionForNamedType(\n    query: string,\n    ast: DocumentNode,\n    node: NamedTypeNode,\n    filePath: Uri,\n    projectConfig: GraphQLProjectConfig,\n  ): Promise<DefinitionQueryResponse | null> {\n    const objectTypeDefinitions =\n      await this._graphQLCache.getObjectTypeDefinitions(projectConfig);\n\n    const dependencies =\n      await this._graphQLCache.getObjectTypeDependenciesForAST(\n        ast,\n        objectTypeDefinitions,\n      );\n\n    const localOperationDefinitionInfos = ast.definitions\n      .filter(isTypeDefinitionNode)\n      .map((definition: TypeDefinitionNode) => ({\n        filePath,\n        content: query,\n        definition,\n      }));\n\n    return getDefinitionQueryResultForNamedType(\n      query,\n      node,\n      dependencies.concat(localOperationDefinitionInfos),\n    );\n  }\n\n  async _getDefinitionForField(\n    query: string,\n    _ast: DocumentNode,\n    _node: FieldNode,\n    _filePath: Uri,\n    projectConfig: GraphQLProjectConfig,\n    position: IPosition,\n  ) {\n    const token = getTokenAtPosition(query, position);\n    const schema = await this._graphQLCache.getSchema(projectConfig.name);\n\n    const typeInfo = getTypeInfo(schema!, token.state);\n    const fieldName = typeInfo.fieldDef?.name;\n\n    if (typeInfo && fieldName) {\n      const parentTypeName = (typeInfo.parentType as any).toString();\n\n      const objectTypeDefinitions =\n        await this._graphQLCache.getObjectTypeDefinitions(projectConfig);\n\n      // TODO: need something like getObjectTypeDependenciesForAST?\n      const dependencies = [...objectTypeDefinitions.values()];\n\n      return getDefinitionQueryResultForField(\n        fieldName,\n        parentTypeName,\n        dependencies,\n      );\n    }\n\n    return null;\n  }\n\n  async _getDefinitionForArgument(\n    query: string,\n    _ast: DocumentNode,\n    _node: ArgumentNode,\n    _filePath: Uri,\n    projectConfig: GraphQLProjectConfig,\n    position: IPosition,\n  ) {\n    const token = getTokenAtPosition(query, position);\n    const schema = await this._graphQLCache.getSchema(projectConfig.name);\n\n    const typeInfo = getTypeInfo(schema!, token.state);\n    const fieldName = typeInfo.fieldDef?.name;\n    const argumentName = typeInfo.argDef?.name;\n    if (typeInfo && fieldName && argumentName) {\n      const objectTypeDefinitions =\n        await this._graphQLCache.getObjectTypeDefinitions(projectConfig);\n\n      // TODO: need something like getObjectTypeDependenciesForAST?\n      const dependencies = [...objectTypeDefinitions.values()];\n\n      return getDefinitionQueryResultForArgument(\n        argumentName,\n        fieldName,\n        // @ts-expect-error - typeInfo is not typed correctly\n        typeInfo.argDef?.type?.name,\n        dependencies,\n      );\n    }\n\n    return null;\n  }\n\n  async _getDefinitionForFragmentSpread(\n    query: string,\n    ast: DocumentNode,\n    node: FragmentSpreadNode,\n    filePath: Uri,\n    projectConfig: GraphQLProjectConfig,\n  ): Promise<DefinitionQueryResponse | null> {\n    const fragmentDefinitions =\n      await this._graphQLCache.getFragmentDefinitions(projectConfig);\n\n    const dependencies = await this._graphQLCache.getFragmentDependenciesForAST(\n      ast,\n      fragmentDefinitions,\n    );\n\n    const localFragDefinitions = ast.definitions.filter(\n      definition => definition.kind === Kind.FRAGMENT_DEFINITION,\n    );\n\n    const typeCastedDefs =\n      localFragDefinitions as any as Array<FragmentDefinitionNode>;\n\n    const localFragInfos = typeCastedDefs.map(\n      (definition: FragmentDefinitionNode) => ({\n        filePath,\n        content: query,\n        definition,\n      }),\n    );\n\n    return getDefinitionQueryResultForFragmentSpread(\n      query,\n      node,\n      dependencies.concat(localFragInfos),\n    );\n  }\n\n  async getOutline(documentText: string): Promise<Outline | null> {\n    return getOutline(documentText);\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/Logger.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Logger as VSCodeLogger } from 'vscode-jsonrpc';\nimport { Connection } from 'vscode-languageserver';\n\nexport class Logger implements VSCodeLogger {\n  // TODO: allow specifying exact log level?\n  // for now this is to handle the debug setting\n  private logLevel: number;\n  constructor(\n    private _connection: Connection,\n    debug?: boolean,\n  ) {\n    this.logLevel = debug ? 1 : 0;\n  }\n\n  error(message: string): void {\n    this._connection.console.error(message);\n  }\n\n  warn(message: string): void {\n    this._connection.console.warn(message);\n  }\n\n  info(message: string): void {\n    this._connection.console.info(message);\n  }\n\n  log(message: string): void {\n    if (this.logLevel > 0) {\n      this._connection.console.log(message);\n    }\n  }\n  set level(level: number) {\n    this.logLevel = level;\n  }\n  get level() {\n    return this.logLevel;\n  }\n}\n\nexport class NoopLogger implements VSCodeLogger {\n  error() {}\n  warn() {}\n  info() {}\n  log() {}\n  set level(_level: number) {}\n  get level() {\n    return 0;\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/MessageProcessor.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n// do not change to node:fs import, or it will break mock-fs\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { URI } from 'vscode-uri';\nimport {\n  CachedContent,\n  Uri,\n  GraphQLConfig,\n  GraphQLProjectConfig,\n  FileChangeTypeKind,\n  Range,\n  Position,\n  IPosition,\n} from 'graphql-language-service';\n\nimport { GraphQLLanguageService } from './GraphQLLanguageService';\n\nimport type {\n  CompletionParams,\n  FileEvent,\n  VersionedTextDocumentIdentifier,\n  DidSaveTextDocumentParams,\n  DidOpenTextDocumentParams,\n  DidChangeConfigurationParams,\n  Diagnostic,\n  CompletionList,\n  CancellationToken,\n  Hover,\n  InitializeResult,\n  Location,\n  PublishDiagnosticsParams,\n  DidChangeTextDocumentParams,\n  DidCloseTextDocumentParams,\n  DidChangeWatchedFilesParams,\n  InitializeParams,\n  Range as RangeType,\n  Position as VscodePosition,\n  TextDocumentPositionParams,\n  DocumentSymbolParams,\n  SymbolInformation,\n  WorkspaceSymbolParams,\n  Connection,\n  DidChangeConfigurationRegistrationOptions,\n} from 'vscode-languageserver/node';\n\nimport type { UnnormalizedTypeDefPointer } from '@graphql-tools/load';\n\nimport { getGraphQLCache, GraphQLCache } from './GraphQLCache';\nimport { parseDocument } from './parseDocument';\n\nimport { printSchema, visit, parse, FragmentDefinitionNode } from 'graphql';\nimport { tmpdir } from 'node:os';\nimport {\n  ConfigEmptyError,\n  ConfigInvalidError,\n  ConfigNotFoundError,\n  LoaderNoResultError,\n  ProjectNotFoundError,\n} from 'graphql-config';\nimport type { LoadConfigOptions, LocateCommand } from './types';\nimport {\n  DEFAULT_SUPPORTED_EXTENSIONS,\n  SupportedExtensionsEnum,\n} from './constants';\nimport { NoopLogger, Logger } from './Logger';\nimport { glob } from 'fast-glob';\nimport { isProjectSDLOnly, unwrapProjectSchema } from './common';\nimport { DefinitionQueryResponse } from 'graphql-language-service/src/interface';\nimport { default as debounce } from 'debounce-promise';\n\nconst configDocLink =\n  'https://www.npmjs.com/package/graphql-language-service-server#user-content-graphql-configuration-file';\n\ntype CachedDocumentType = {\n  version: number;\n  contents: CachedContent[];\n};\n\nfunction toPosition(position: VscodePosition): IPosition {\n  return new Position(position.line, position.character);\n}\n\nexport class MessageProcessor {\n  private _connection: Connection;\n  private _graphQLCache!: GraphQLCache;\n  private _languageService!: GraphQLLanguageService;\n  private _textDocumentCache = new Map<string, CachedDocumentType>();\n  private _isInitialized = false;\n  private _isGraphQLConfigMissing: boolean | null = null;\n  private _willShutdown = false;\n  private _logger: Logger | NoopLogger;\n  private _parser: (text: string, uri: string) => Promise<CachedContent[]>;\n  private _tmpDir: string;\n  private _tmpDirBase: string;\n  private _loadConfigOptions: LoadConfigOptions;\n  private _rootPath: string = process.cwd();\n  private _settings: any;\n  private _providedConfig?: GraphQLConfig;\n\n  constructor({\n    logger,\n    fileExtensions,\n    graphqlFileExtensions,\n    loadConfigOptions,\n    config,\n    parser,\n    tmpDir,\n    connection,\n  }: {\n    logger: Logger | NoopLogger;\n    fileExtensions: ReadonlyArray<SupportedExtensionsEnum>;\n    graphqlFileExtensions: string[];\n    loadConfigOptions: LoadConfigOptions;\n    config?: GraphQLConfig;\n    parser?: typeof parseDocument;\n    tmpDir?: string;\n    connection: Connection;\n  }) {\n    if (config) {\n      this._providedConfig = config;\n    }\n    this._connection = connection;\n    this._logger = logger;\n    this._parser = async (text, uri) => {\n      const p = parser ?? parseDocument;\n      return p(text, uri, fileExtensions, graphqlFileExtensions, this._logger);\n    };\n    this._tmpDir = tmpDir || tmpdir();\n    this._tmpDirBase = path.join(this._tmpDir, 'graphql-language-service');\n    // use legacy mode by default for backwards compatibility\n    this._loadConfigOptions = { legacy: true, ...loadConfigOptions };\n    /**\n     * existsSync(this._tmpDirBase) with mkdirSync(this._tmpDirBase) provoke race condition, we use\n     * `{ recursive: true }` that way, if the directory already exists, it does not throw.\n     */\n    // if (!existsSync(this._tmpDirBase)) {\n    mkdirSync(this._tmpDirBase, { recursive: true });\n    // }\n  }\n  get connection(): Connection {\n    return this._connection;\n  }\n  set connection(connection: Connection) {\n    this._connection = connection;\n  }\n\n  public async handleInitializeRequest(\n    params: InitializeParams,\n    _token?: CancellationToken,\n    configDir?: string,\n  ): Promise<InitializeResult> {\n    if (!params) {\n      throw new Error('`params` argument is required to initialize.');\n    }\n\n    const serverCapabilities: InitializeResult = {\n      capabilities: {\n        workspaceSymbolProvider: true,\n        documentSymbolProvider: true,\n        completionProvider: {\n          resolveProvider: true,\n          triggerCharacters: [' ', ':', '$', '(', '@', '\\n'],\n        },\n        definitionProvider: true,\n        textDocumentSync: 1,\n        hoverProvider: true,\n        workspace: {\n          workspaceFolders: {\n            supported: true,\n            changeNotifications: true,\n          },\n        },\n      },\n    };\n\n    this._rootPath = configDir\n      ? configDir.trim()\n      : params.rootUri || this._rootPath;\n    if (!this._rootPath) {\n      this._logger.warn(\n        'no rootPath configured in extension or server, defaulting to cwd',\n      );\n    }\n\n    this._logger.info(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'initialize',\n      }),\n    );\n\n    return serverCapabilities;\n  }\n  // TODO next: refactor (most of) this into the `GraphQLCache` class\n  async _initializeGraphQLCaches() {\n    const settings = await this._connection.workspace.getConfiguration({\n      section: 'graphql-config',\n    });\n\n    const vscodeSettings = await this._connection.workspace.getConfiguration({\n      section: 'vscode-graphql',\n    });\n\n    // TODO: eventually we will instantiate an instance of this per workspace,\n    // so rootDir should become that workspace's rootDir\n    this._settings = { ...settings, ...vscodeSettings };\n    const rootDir = this._settings?.load?.rootDir.length\n      ? this._settings?.load?.rootDir\n      : this._rootPath;\n    if (settings?.dotEnvPath) {\n      require('dotenv').config({\n        path: path.resolve(rootDir, settings.dotEnvPath),\n      });\n    }\n    this._rootPath = rootDir;\n    this._loadConfigOptions = {\n      ...Object.keys(this._settings?.load ?? {}).reduce((agg, key) => {\n        const value = this._settings?.load[key];\n        if (value === undefined || value === null) {\n          delete agg[key];\n        }\n        return agg;\n      }, this._settings.load ?? {}),\n      rootDir,\n    };\n\n    const onSchemaChange = debounce(async (project: GraphQLProjectConfig) => {\n      const { cacheSchemaFileForLookup } =\n        this.getCachedSchemaSettings(project);\n      if (!cacheSchemaFileForLookup) {\n        return;\n      }\n      const unwrappedSchema = unwrapProjectSchema(project);\n      const sdlOnly = isProjectSDLOnly(unwrappedSchema);\n      if (sdlOnly) {\n        return;\n      }\n      return this.cacheConfigSchemaFile(project);\n    }, 400);\n\n    try {\n      // now we have the settings so we can re-build the logger\n      this._logger.level = this._settings?.debug === true ? 1 : 0;\n      // createServer() can be called with a custom config object, and\n      // this is a public interface that may be used by customized versions of the server\n      if (this._providedConfig) {\n        this._graphQLCache = new GraphQLCache({\n          config: this._providedConfig,\n          logger: this._logger,\n          parser: this._parser,\n          configDir: rootDir,\n          onSchemaChange,\n          schemaCacheTTL: this._settings?.schemaCacheTTL,\n        });\n        this._languageService = new GraphQLLanguageService(\n          this._graphQLCache,\n          this._logger,\n        );\n      } else {\n        // reload the graphql cache\n        this._graphQLCache = await getGraphQLCache({\n          parser: this._parser,\n          loadConfigOptions: this._loadConfigOptions,\n          logger: this._logger,\n          onSchemaChange,\n          schemaCacheTTL: this._settings?.schemaCacheTTL,\n        });\n        this._languageService = new GraphQLLanguageService(\n          this._graphQLCache,\n          this._logger,\n        );\n      }\n      const config = this._graphQLCache.getGraphQLConfig();\n      if (config) {\n        await this._cacheAllProjectFiles(config);\n        // TODO: per project lazy instantiation.\n        // we had it working before, but it seemed like it caused bugs\n        // which were caused by something else.\n        // thus. _isInitialized should be replaced with something like\n        // projectHasInitialized: (projectName: string) => boolean\n        this._isInitialized = true;\n        this._isGraphQLConfigMissing = false;\n        this._logger.info('GraphQL Language Server caches initialized');\n      }\n    } catch (err) {\n      this._handleConfigError({ err });\n    }\n  }\n  private _handleConfigError({ err }: { err: unknown; uri?: string }) {\n    if (err instanceof ConfigNotFoundError || err instanceof ConfigEmptyError) {\n      // TODO: obviously this needs to become a map by workspace from uri\n      // for workspaces support\n      this._isGraphQLConfigMissing = true;\n      this._logConfigError(err.message);\n    } else if (err instanceof ProjectNotFoundError) {\n      // this is the only case where we don't invalidate config;\n      // TODO: per-project schema initialization status (PR is almost ready)\n      this._logConfigError(\n        'Project not found for this file - make sure that a schema is present in the config file or for the project',\n      );\n    } else if (err instanceof ConfigInvalidError) {\n      this._isGraphQLConfigMissing = true;\n      this._logConfigError(`Invalid configuration\\n${err.message}`);\n    } else if (err instanceof LoaderNoResultError) {\n      this._isGraphQLConfigMissing = true;\n      this._logConfigError(err.message);\n      return;\n    } else {\n      // if it's another kind of error,\n      // lets just assume the config is missing and\n      // disable language features\n      this._isGraphQLConfigMissing = true;\n      this._logConfigError(\n        // @ts-expect-error\n        err?.message ?? err?.toString(),\n      );\n    }\n  }\n\n  private _logConfigError(errorMessage: string) {\n    this._logger.error(\n      'WARNING: graphql-config error, only highlighting is enabled:\\n' +\n        errorMessage +\n        `\\nfor more information on using 'graphql-config' with 'graphql-language-service-server', \\nsee the documentation at ${configDocLink}`,\n    );\n  }\n  private async _isGraphQLConfigFile(uri: string) {\n    const configMatchers = ['graphql.config', 'graphqlrc', 'graphqlconfig'];\n    if (this._settings?.load?.fileName?.length) {\n      configMatchers.push(this._settings.load.fileName);\n    }\n\n    const fileMatch = configMatchers\n      .filter(Boolean)\n      .some(v => uri.match(v)?.length);\n    if (fileMatch) {\n      return fileMatch;\n    }\n    if (uri.match('package.json')?.length) {\n      try {\n        const pkgConfig = await readFile(URI.parse(uri).fsPath, 'utf-8');\n        return Boolean(JSON.parse(pkgConfig)?.graphql);\n      } catch {}\n    }\n    return false;\n  }\n  private async _loadConfigOrSkip(uri: string) {\n    try {\n      const isGraphQLConfigFile = await this._isGraphQLConfigFile(uri);\n\n      if (!this._isInitialized) {\n        if (this._isGraphQLConfigMissing === true && !isGraphQLConfigFile) {\n          return true;\n        }\n        // don't try to initialize again if we've already tried\n        // and the graphql config file or package.json entry isn't even there\n        await this._initializeGraphQLCaches();\n        return isGraphQLConfigFile;\n      }\n      // if it has initialized, but this is another config file change, then let's handle it\n      if (isGraphQLConfigFile) {\n        await this._initializeGraphQLCaches();\n      }\n      return isGraphQLConfigFile;\n    } catch (err) {\n      this._logger.error(String(err));\n      // return true if it's a graphql config file so we don't treat\n      // this as a non-config file if it is one\n      return true;\n    }\n  }\n\n  public async handleDidOpenOrSaveNotification(\n    params: DidSaveTextDocumentParams | DidOpenTextDocumentParams,\n  ): Promise<PublishDiagnosticsParams> {\n    const { textDocument } = params;\n    const { uri } = textDocument;\n\n    /**\n     * Initialize the LSP server when the first file is opened or saved,\n     * so that we can access the user settings for config rootDir, etc\n     */\n    const shouldSkip = await this._loadConfigOrSkip(uri);\n    // if we're loading config or the config is missing or there's an error\n    // don't do anything else\n    if (shouldSkip) {\n      return { uri, diagnostics: [] };\n    }\n\n    // Here, we set the workspace settings in memory,\n    // and re-initialize the language service when a different\n    // root path is detected.\n    // We aren't able to use initialization event for this\n    // and the config change event is after the fact.\n\n    if (!textDocument) {\n      throw new Error('`textDocument` argument is required.');\n    }\n\n    const diagnostics: Diagnostic[] = [];\n\n    if (!this._isInitialized) {\n      return { uri, diagnostics };\n    }\n    try {\n      const project = this._graphQLCache.getProjectForFile(uri);\n\n      if (project) {\n        const text = 'text' in textDocument && textDocument.text;\n        // for some reason if i try to tell to not parse empty files, it breaks :shrug:\n        // i think this is because if the file change is empty, it doesn't get parsed\n        // TODO: this could be related to a bug in how we are calling didOpenOrSave in our tests\n        // that doesn't reflect the real runtime behavior\n\n        const { contents } = await this._parseAndCacheFile(\n          uri,\n          project,\n          text as string,\n        );\n        if (project?.extensions?.languageService?.enableValidation !== false) {\n          await Promise.all(\n            contents.map(async ({ query, range }) => {\n              const results = await this._languageService.getDiagnostics(\n                query,\n                uri,\n                this._isRelayCompatMode(query),\n              );\n              if (results && results.length > 0) {\n                diagnostics.push(\n                  ...processDiagnosticsMessage(results, query, range),\n                );\n              }\n            }),\n          );\n        }\n      }\n\n      this._logger.log(\n        JSON.stringify({\n          type: 'usage',\n          messageType: 'textDocument/didOpenOrSave',\n          projectName: project?.name,\n          fileName: uri,\n        }),\n      );\n      return { uri, diagnostics };\n    } catch (err) {\n      this._handleConfigError({ err, uri });\n      return { uri, diagnostics };\n    }\n  }\n\n  public async handleDidChangeNotification(\n    params: DidChangeTextDocumentParams,\n  ): Promise<PublishDiagnosticsParams | null> {\n    if (\n      this._isGraphQLConfigMissing ||\n      !this._isInitialized ||\n      !this._graphQLCache\n    ) {\n      return null;\n    }\n    // For every `textDocument/didChange` event, keep a cache of textDocuments\n    // with version information up-to-date, so that the textDocument contents\n    // may be used during performing language service features,\n    // e.g. auto-completions.\n    if (!params?.textDocument?.uri || !params.contentChanges) {\n      throw new Error(\n        '`textDocument.uri` and `contentChanges` arguments are required.',\n      );\n    }\n    const { textDocument, contentChanges } = params;\n    const { uri } = textDocument;\n\n    try {\n      const project = this._graphQLCache.getProjectForFile(uri);\n      if (!project) {\n        return { uri, diagnostics: [] };\n      }\n\n      // As `contentChanges` is an array, and we just want the\n      // latest update to the text, grab the last entry from the array.\n\n      // If it's a .js file, try parsing the contents to see if GraphQL queries\n      // exist. If not found, delete from the cache.\n      const { contents } = await this._parseAndCacheFile(\n        uri,\n        project,\n        contentChanges.at(-1)!.text,\n      );\n      // // If it's a .graphql file, proceed normally and invalidate the cache.\n      // await this._invalidateCache(textDocument, uri, contents);\n\n      const diagnostics: Diagnostic[] = [];\n\n      if (project?.extensions?.languageService?.enableValidation !== false) {\n        // Send the diagnostics onChange as well\n        try {\n          await Promise.all(\n            contents.map(async ({ query, range }) => {\n              const results = await this._languageService.getDiagnostics(\n                query,\n                uri,\n                this._isRelayCompatMode(query),\n              );\n              if (results && results.length > 0) {\n                diagnostics.push(\n                  ...processDiagnosticsMessage(results, query, range),\n                );\n              }\n              // skip diagnostic errors, usually related to parsing incomplete fragments\n            }),\n          );\n        } catch {}\n      }\n\n      this._logger.log(\n        JSON.stringify({\n          type: 'usage',\n          messageType: 'textDocument/didChange',\n          projectName: project?.name,\n          fileName: uri,\n        }),\n      );\n\n      return { uri, diagnostics };\n    } catch (err) {\n      this._handleConfigError({ err, uri });\n      return { uri, diagnostics: [] };\n    }\n  }\n  async handleDidChangeConfiguration(\n    _params: DidChangeConfigurationParams,\n  ): Promise<DidChangeConfigurationRegistrationOptions> {\n    await this._initializeGraphQLCaches();\n    this._logger.log(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'workspace/didChangeConfiguration',\n      }),\n    );\n    return {};\n  }\n\n  public handleDidCloseNotification(params: DidCloseTextDocumentParams): void {\n    if (!this._isInitialized) {\n      return;\n    }\n    // For every `textDocument/didClose` event, delete the cached entry.\n    // This is to keep a low memory usage && switch the source of truth to\n    // the file on disk.\n    if (!params?.textDocument) {\n      throw new Error('`textDocument` is required.');\n    }\n    const { textDocument } = params;\n    const { uri } = textDocument;\n\n    if (this._textDocumentCache.has(uri)) {\n      this._textDocumentCache.delete(uri);\n    }\n    const project = this._graphQLCache.getProjectForFile(uri);\n\n    this._logger.log(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'textDocument/didClose',\n        projectName: project?.name,\n        fileName: uri,\n      }),\n    );\n  }\n\n  public handleShutdownRequest(): void {\n    this._willShutdown = true;\n  }\n\n  public handleExitNotification(): void {\n    process.exit(this._willShutdown ? 0 : 1);\n  }\n\n  private validateDocumentAndPosition(params: CompletionParams): void {\n    if (!params?.textDocument?.uri || !params.position) {\n      throw new Error(\n        '`textDocument.uri` and `position` arguments are required.',\n      );\n    }\n  }\n\n  public async handleCompletionRequest(\n    params: CompletionParams,\n  ): Promise<CompletionList> {\n    if (!this._isInitialized) {\n      return { items: [], isIncomplete: false };\n    }\n\n    this.validateDocumentAndPosition(params);\n\n    const { textDocument, position } = params;\n\n    // `textDocument/completion` event takes advantage of the fact that\n    // `textDocument/didChange` event always fires before, which would have\n    // updated the cache with the query text from the editor.\n    // Treat the computed list always complete.\n\n    const cachedDocument = this._getCachedDocument(textDocument.uri);\n    if (!cachedDocument) {\n      return { items: [], isIncomplete: false };\n    }\n\n    const found = cachedDocument.contents.find(content => {\n      const currentRange = content.range;\n      if (currentRange?.containsPosition(toPosition(position))) {\n        return true;\n      }\n    });\n\n    // If there is no GraphQL query in this file, return an empty result.\n    if (!found) {\n      return { items: [], isIncomplete: false };\n    }\n\n    const { query, range } = found;\n\n    if (range) {\n      position.line -= range.start.line;\n    }\n\n    const result = await this._languageService.getAutocompleteSuggestions(\n      query,\n      toPosition(position),\n      textDocument.uri,\n    );\n\n    const project = this._graphQLCache.getProjectForFile(textDocument.uri);\n\n    this._logger.log(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'textDocument/completion',\n        projectName: project?.name,\n        fileName: textDocument.uri,\n      }),\n    );\n\n    return { items: result, isIncomplete: false };\n  }\n\n  public async handleHoverRequest(\n    params: TextDocumentPositionParams,\n  ): Promise<Hover | null> {\n    if (!this._isInitialized) {\n      return null;\n    }\n\n    this.validateDocumentAndPosition(params);\n\n    const { textDocument, position } = params;\n\n    const cachedDocument = this._getCachedDocument(textDocument.uri);\n    if (!cachedDocument) {\n      return null;\n    }\n\n    const found = cachedDocument.contents.find(content => {\n      const currentRange = content.range;\n      if (currentRange?.containsPosition(toPosition(position))) {\n        return true;\n      }\n    });\n\n    // If there is no GraphQL query in this file, return an empty result.\n    if (!found) {\n      return null;\n    }\n\n    const { query, range } = found;\n\n    if (range) {\n      position.line -= range.start.line;\n    }\n    const result = await this._languageService.getHoverInformation(\n      query,\n      toPosition(position),\n      textDocument.uri,\n      { useMarkdown: true },\n    );\n\n    return {\n      contents: result,\n    };\n  }\n\n  private async _parseAndCacheFile(\n    uri: string,\n    project: GraphQLProjectConfig,\n    text?: string,\n  ) {\n    try {\n      const fileText = text || (await readFile(URI.parse(uri).fsPath, 'utf-8'));\n      const contents = await this._parser(fileText, uri);\n      const cachedDocument = this._textDocumentCache.get(uri);\n      const version = cachedDocument ? cachedDocument.version++ : 0;\n      await this._invalidateCache({ uri, version }, uri, contents);\n      await this._updateFragmentDefinition(uri, contents);\n      await this._updateObjectTypeDefinition(uri, contents, project);\n      await this._updateSchemaIfChanged(project, uri);\n      return { contents, version };\n    } catch {\n      return { contents: [], version: 0 };\n    }\n  }\n\n  public async handleWatchedFilesChangedNotification(\n    params: DidChangeWatchedFilesParams,\n  ): Promise<Array<PublishDiagnosticsParams | undefined> | null> {\n    const resultsForChanges = Promise.all(\n      params.changes.map(async (change: FileEvent) => {\n        const shouldSkip = await this._loadConfigOrSkip(change.uri);\n        if (shouldSkip) {\n          return { uri: change.uri, diagnostics: [] };\n        }\n        if (\n          change.type === FileChangeTypeKind.Created ||\n          change.type === FileChangeTypeKind.Changed\n        ) {\n          const { uri } = change;\n\n          try {\n            let diagnostics: Diagnostic[] = [];\n            const project = this._graphQLCache.getProjectForFile(uri);\n            if (project) {\n              // Important! Use system file uri not file path here!!!!\n              const { contents } = await this._parseAndCacheFile(uri, project);\n              if (\n                project?.extensions?.languageService?.enableValidation !== false\n              ) {\n                diagnostics = (\n                  await Promise.all(\n                    contents.map(async ({ query, range }) => {\n                      const results =\n                        await this._languageService.getDiagnostics(\n                          query,\n                          uri,\n                          this._isRelayCompatMode(query),\n                        );\n                      if (results && results.length > 0) {\n                        return processDiagnosticsMessage(results, query, range);\n                      }\n                      return [];\n                    }),\n                  )\n                ).reduce((left, right) => left.concat(right), diagnostics);\n              }\n\n              return { uri, diagnostics };\n            }\n            // skip diagnostics errors usually from incomplete files\n          } catch {}\n          return { uri, diagnostics: [] };\n        }\n        if (change.type === FileChangeTypeKind.Deleted) {\n          await this._updateFragmentDefinition(change.uri, []);\n          await this._updateObjectTypeDefinition(change.uri, []);\n        }\n      }),\n    );\n    this._logger.log(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'workspace/didChangeWatchedFiles',\n        files: params.changes.map(change => change.uri),\n      }),\n    );\n    return resultsForChanges;\n  }\n\n  public async handleDefinitionRequest(\n    params: TextDocumentPositionParams,\n    _token?: CancellationToken,\n  ): Promise<Array<Location>> {\n    if (!this._isInitialized) {\n      return [];\n    }\n\n    if (!params?.textDocument || !params.position) {\n      throw new Error('`textDocument` and `position` arguments are required.');\n    }\n    const { textDocument, position } = params;\n    const project = this._graphQLCache.getProjectForFile(textDocument.uri);\n    const cachedDocument = this._getCachedDocument(textDocument.uri);\n    if (!cachedDocument || !project) {\n      return [];\n    }\n\n    const found = cachedDocument.contents.find(content => {\n      const currentRange = content.range;\n      if (currentRange?.containsPosition(toPosition(position))) {\n        return true;\n      }\n    });\n\n    // If there is no GraphQL query in this file, return an empty result.\n    if (!found) {\n      return [];\n    }\n\n    const { query, range: parentRange } = found;\n    if (parentRange) {\n      position.line -= parentRange.start.line;\n    }\n\n    let result: DefinitionQueryResponse | null = null;\n\n    try {\n      result = await this._languageService.getDefinition(\n        query,\n        toPosition(position),\n        textDocument.uri,\n      );\n    } catch {\n      // these thrown errors end up getting fired before the service is initialized, so lets cool down on that\n    }\n\n    const inlineFragments: string[] = [];\n    try {\n      visit(parse(query), {\n        FragmentDefinition(node: FragmentDefinitionNode) {\n          inlineFragments.push(node.name.value);\n        },\n      });\n    } catch {}\n\n    const locateCommand = project?.extensions?.languageService\n      ?.locateCommand as LocateCommand | undefined;\n\n    const formatted = result\n      ? result.definitions.map(res => {\n          const defRange = res.range as Range;\n          if (parentRange && res.name) {\n            const isInline = inlineFragments.includes(res.name);\n            const isEmbedded = DEFAULT_SUPPORTED_EXTENSIONS.includes(\n              path.extname(res.path) as SupportedExtensionsEnum,\n            );\n\n            if (isEmbedded || isInline) {\n              const cachedDoc = this._getCachedDocument(\n                URI.parse(res.path).toString(),\n              );\n              const vOffset = isEmbedded\n                ? cachedDoc?.contents[0].range?.start.line ?? 0\n                : parentRange.start.line;\n\n              defRange.setStart(\n                (defRange.start.line += vOffset),\n                defRange.start.character,\n              );\n              defRange.setEnd(\n                (defRange.end.line += vOffset),\n                defRange.end.character,\n              );\n            }\n          }\n\n          if (locateCommand && result && result?.printedName) {\n            const locateResult = this._getCustomLocateResult(\n              project,\n              result,\n              locateCommand,\n            );\n\n            if (locateResult) {\n              return locateResult;\n            }\n          }\n          return {\n            uri: res.path,\n            range: defRange,\n          };\n        })\n      : [];\n\n    this._logger.log(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'textDocument/definition',\n        projectName: project?.name,\n        fileName: textDocument.uri,\n      }),\n    );\n    return formatted;\n  }\n  _getCustomLocateResult(\n    project: GraphQLProjectConfig,\n    result: DefinitionQueryResponse,\n    locateCommand: LocateCommand,\n  ) {\n    if (!result.printedName) {\n      return null;\n    }\n    try {\n      const locateResult = locateCommand(project.name, result.printedName, {\n        node: result.node,\n        type: result.type,\n        project,\n      });\n      if (typeof locateResult === 'string') {\n        const [uri, line = '1', character = '1'] = locateResult.split(':');\n        const startLine = Math.max(parseInt(line, 10) - 1, 0);\n        const startCharacter = Math.max(parseInt(character, 10) - 1, 0);\n        return {\n          uri,\n          range: new Range(\n            new Position(startLine, startCharacter),\n            new Position(startLine, startCharacter),\n          ),\n        };\n      }\n      return locateResult;\n    } catch (error) {\n      this._logger.error(\n        'There was an error executing user defined locateCommand\\n\\n' +\n          (error as Error).toString(),\n      );\n      return null;\n    }\n  }\n\n  public async handleDocumentSymbolRequest(\n    params: DocumentSymbolParams,\n  ): Promise<Array<SymbolInformation>> {\n    if (!this._isInitialized) {\n      return [];\n    }\n\n    if (!params?.textDocument) {\n      throw new Error('`textDocument` argument is required.');\n    }\n\n    const { textDocument } = params;\n    const cachedDocument = this._getCachedDocument(textDocument.uri);\n    if (!cachedDocument?.contents[0]) {\n      return [];\n    }\n\n    if (\n      this._settings.largeFileThreshold !== undefined &&\n      this._settings.largeFileThreshold <\n        cachedDocument.contents[0].query.length\n    ) {\n      return [];\n    }\n\n    this._logger.log(\n      JSON.stringify({\n        type: 'usage',\n        messageType: 'textDocument/documentSymbol',\n        fileName: textDocument.uri,\n      }),\n    );\n\n    return this._languageService.getDocumentSymbols(\n      cachedDocument.contents[0].query,\n      textDocument.uri,\n    );\n  }\n\n  // async handleReferencesRequest(params: ReferenceParams): Promise<Location[]> {\n  //    if (!this._isInitialized) {\n  //      return [];\n  //    }\n\n  //    if (!params?.textDocument) {\n  //      throw new Error('`textDocument` argument is required.');\n  //    }\n\n  //    const textDocument = params.textDocument;\n  //    const cachedDocument = this._getCachedDocument(textDocument.uri);\n  //    if (!cachedDocument) {\n  //      throw new Error('A cached document cannot be found.');\n  //    }\n  //    return this._languageService.getReferences(\n  //      cachedDocument.contents[0].query,\n  //      params.position,\n  //      textDocument.uri,\n  //    );\n  // }\n\n  public async handleWorkspaceSymbolRequest(\n    params: WorkspaceSymbolParams,\n  ): Promise<Array<SymbolInformation>> {\n    if (!this._isInitialized) {\n      return [];\n    }\n\n    if (params.query !== '') {\n      const documents = this._getTextDocuments();\n      const symbols: SymbolInformation[] = [];\n      await Promise.all(\n        documents.map(async ([uri]) => {\n          const cachedDocument = this._getCachedDocument(uri);\n\n          if (!cachedDocument) {\n            return [];\n          }\n          const docSymbols = await this._languageService.getDocumentSymbols(\n            cachedDocument.contents[0].query,\n            uri,\n          );\n          symbols.push(...docSymbols);\n        }),\n      );\n      return symbols.filter(symbol => symbol?.name?.includes(params.query));\n    }\n\n    return [];\n  }\n\n  private _getTextDocuments() {\n    return Array.from(this._textDocumentCache);\n  }\n\n  private async _cacheSchemaText(\n    uri: string,\n    text: string,\n    version: number,\n    project?: GraphQLProjectConfig,\n  ) {\n    try {\n      const contents = await this._parser(text, uri);\n      if (contents.length > 0) {\n        await this._invalidateCache({ version, uri }, uri, contents);\n        await this._updateObjectTypeDefinition(uri, contents, project);\n      }\n    } catch (err) {\n      this._logger.error(String(err));\n    }\n  }\n  private async _cacheSchemaFile(\n    fileUri: UnnormalizedTypeDefPointer,\n    project: GraphQLProjectConfig,\n  ) {\n    try {\n      // const parsedUri = URI.file(fileUri.toString());\n      // @ts-expect-error\n      const matches = await glob(fileUri, {\n        cwd: project.dirpath,\n        absolute: true,\n      });\n      const uri = matches[0];\n      let version = 1;\n      if (uri) {\n        const schemaUri = URI.file(uri).toString();\n        const schemaDocument = this._getCachedDocument(schemaUri);\n\n        if (schemaDocument) {\n          version = schemaDocument.version++;\n        }\n        const schemaText = await readFile(uri, 'utf-8');\n        await this._cacheSchemaText(schemaUri, schemaText, version);\n      }\n    } catch (err) {\n      this._logger.error(String(err));\n    }\n  }\n  private _getTmpProjectPath(\n    project: GraphQLProjectConfig,\n    prependWithProtocol = true,\n    appendPath?: string,\n  ) {\n    const baseDir = this._graphQLCache.getGraphQLConfig().dirpath;\n    const workspaceName = path.basename(baseDir);\n    const basePath = path.join(this._tmpDirBase, workspaceName);\n    let projectTmpPath = path.join(basePath, 'projects', project.name);\n    if (!existsSync(projectTmpPath)) {\n      mkdirSync(projectTmpPath, {\n        recursive: true,\n      });\n    }\n    if (appendPath) {\n      projectTmpPath = path.join(projectTmpPath, appendPath);\n    }\n    if (prependWithProtocol) {\n      return URI.file(path.resolve(projectTmpPath)).toString();\n    }\n    return path.resolve(projectTmpPath);\n  }\n\n  private getCachedSchemaSettings(project: GraphQLProjectConfig) {\n    const config = project?.extensions?.languageService;\n    let cacheSchemaFileForLookup = true;\n    let schemaCacheTTL = 1000 * 30;\n\n    if (\n      config?.cacheSchemaFileForLookup === false ||\n      this?._settings?.cacheSchemaFileForLookup === false\n    ) {\n      cacheSchemaFileForLookup = false;\n    }\n    // nullish coalescing allows 0 to be a valid value here\n    if (config?.schemaCacheTTL) {\n      schemaCacheTTL = config.schemaCacheTTL;\n    }\n    if (this?._settings?.schemaCacheTTL) {\n      schemaCacheTTL = this._settings.schemaCacheTTL;\n    }\n    return { cacheSchemaFileForLookup, schemaCacheTTL };\n  }\n\n  private async _cacheSchemaFilesForProject(project: GraphQLProjectConfig) {\n    // const config = project?.extensions?.languageService;\n    /**\n     * By default, we look for schema definitions in SDL files\n     *\n     * with the opt-in feature `cacheSchemaOutputFileForLookup` enabled,\n     * the resultant `graphql-config` .getSchema() schema output will be cached\n     * locally and available as a single file for definition lookup and peek\n     *\n     * this is helpful when your `graphql-config` `schema` input is:\n     * - a remote or local URL\n     * - compiled from graphql files and code sources\n     * - otherwise where you don't have schema SDL in the codebase or don't want to use it for lookup\n     *\n     * it is disabled by default\n     */\n    const { cacheSchemaFileForLookup } = this.getCachedSchemaSettings(project);\n    const unwrappedSchema = unwrapProjectSchema(project);\n\n    // only local schema lookups if all of the schema entries are local files\n    const sdlOnly = isProjectSDLOnly(unwrappedSchema);\n\n    // const uri = this._getTmpProjectPath(\n    //   project,\n    //   true,\n    //   'generated-schema.graphql',\n    // );\n    // const fsPath = this._getTmpProjectPath(\n    //   project,\n    //   false,\n    //   'generated-schema.graphql',\n    // );\n    // invalidate the cache for the generated schema file\n    // whether or not the user will continue using this feature\n    // because sdlOnly needs this file to be removed as well if the user is switching schemas\n    // this._textDocumentCache.delete(uri);\n    // skip exceptions if the file doesn't exist\n    try {\n      // await rm(fsPath, { force: true });\n    } catch {}\n    // if we are caching the config schema, and it isn't a .graphql file, cache it\n    if (cacheSchemaFileForLookup && !sdlOnly) {\n      await this.cacheConfigSchemaFile(project);\n    } else if (sdlOnly) {\n      await Promise.all(\n        unwrappedSchema.map(async schemaEntry =>\n          this._cacheSchemaFile(schemaEntry, project),\n        ),\n      );\n    }\n  }\n  /**\n   * Cache the schema as represented by graphql-config, with extensions\n   * from GraphQLCache.getSchema()\n   * @param project {GraphQLProjectConfig}\n   */\n  private async cacheConfigSchemaFile(project: GraphQLProjectConfig) {\n    try {\n      const schema = await this._graphQLCache.getSchema(project.name);\n      if (schema) {\n        let schemaText = printSchema(schema);\n        // file:// protocol path\n        const uri = this._getTmpProjectPath(\n          project,\n          true,\n          'generated-schema.graphql',\n        );\n\n        // no file:// protocol for fs.writeFileSync()\n        const fsPath = this._getTmpProjectPath(\n          project,\n          false,\n          'generated-schema.graphql',\n        );\n        schemaText = `# This is an automatically generated representation of your schema.\\n# Any changes to this file will be overwritten and will not be\\n# reflected in the resulting GraphQL schema\\n\\n${schemaText}`;\n\n        const cachedSchemaDoc = this._getCachedDocument(uri);\n        this._graphQLCache._schemaMap.set(project.name, schema);\n        try {\n          await mkdir(path.dirname(fsPath), { recursive: true });\n        } catch {}\n\n        if (!cachedSchemaDoc) {\n          await writeFile(fsPath, schemaText, {\n            encoding: 'utf-8',\n          });\n          await this._cacheSchemaText(uri, schemaText, 0, project);\n        }\n        // do we have a change in the getSchema result? if so, update schema cache\n        if (cachedSchemaDoc) {\n          await writeFile(fsPath, schemaText, 'utf-8');\n          await this._cacheSchemaText(\n            uri,\n            schemaText,\n            cachedSchemaDoc.version++,\n            project,\n          );\n        }\n      }\n    } catch (err) {\n      this._logger.error(String(err));\n    }\n  }\n  /**\n   * Pre-cache all documents for a project.\n   *\n   * TODO: Maybe make this optional, where only schema needs to be pre-cached.\n   *\n   * @param project {GraphQLProjectConfig}\n   */\n  private async _cacheDocumentFilesforProject(project: GraphQLProjectConfig) {\n    try {\n      const documents = await project.getDocuments();\n      const documentLocations = new Set(\n        documents\n          .filter(doc => doc.location && doc.rawSDL)\n          .map(doc => doc.location!),\n      );\n\n      return Promise.all(\n        Array.from(documentLocations).map(async loc => {\n          let filePath = loc;\n          if (!path.isAbsolute(filePath)) {\n            filePath = path.join(project.dirpath, loc);\n          }\n\n          // build full system URI path with protocol\n          const uri = URI.file(filePath).toString();\n\n          const fileContent = await readFile(filePath, 'utf-8');\n          // I would use the already existing graphql-config AST, but there are a few reasons we can't yet\n          const contents = await this._parser(fileContent, uri);\n          if (!contents[0]?.query) {\n            return;\n          }\n\n          await this._updateObjectTypeDefinition(uri, contents);\n          await this._updateFragmentDefinition(uri, contents);\n          await this._invalidateCache({ version: 1, uri }, uri, contents);\n        }),\n      );\n    } catch (err) {\n      this._logger.error(\n        `invalid/unknown file in graphql config documents entry:\\n '${project.documents}'`,\n      );\n      this._logger.error(String(err));\n    }\n  }\n  /**\n   * This should only be run on initialize() really.\n   * Caching all the document files upfront could be expensive.\n   * @param config {GraphQLConfig}\n   */\n  private async _cacheAllProjectFiles(config: GraphQLConfig) {\n    if (config?.projects) {\n      return Promise.all(\n        Object.keys(config.projects).map(async projectName => {\n          const project = config.getProject(projectName);\n\n          await this._cacheSchemaFilesForProject(project);\n          if (project.documents?.length) {\n            await this._cacheDocumentFilesforProject(project);\n          } else {\n            this._logger.warn(\n              [\n                `No 'documents' config found for project: ${projectName}.`,\n                'Fragments and query documents cannot be detected.',\n                'LSP server will only perform some partial validation and SDL features.',\n              ].join('\\n'),\n            );\n          }\n        }),\n      );\n    }\n  }\n  _isRelayCompatMode(query: string): boolean {\n    return (\n      query.includes('RelayCompat') || query.includes('react-relay/compat')\n    );\n  }\n\n  private async _updateFragmentDefinition(\n    uri: Uri,\n    contents: CachedContent[],\n  ): Promise<void> {\n    const project = this._graphQLCache.getProjectForFile(uri);\n    if (project) {\n      const cacheKey = this._graphQLCache._cacheKeyForProject(project);\n      await this._graphQLCache.updateFragmentDefinition(\n        cacheKey,\n        uri,\n        contents,\n      );\n    }\n  }\n\n  private async _updateSchemaIfChanged(\n    project: GraphQLProjectConfig,\n    uri: Uri,\n  ): Promise<void> {\n    await Promise.all(\n      unwrapProjectSchema(project).map(async schema => {\n        const schemaFilePath = path.resolve(project.dirpath, schema);\n        const uriFilePath = URI.parse(uri).fsPath;\n\n        if (uriFilePath === schemaFilePath) {\n          try {\n            const file = await readFile(schemaFilePath, 'utf-8');\n            // only invalidate the schema cache if we can actually parse the file\n            // otherwise, leave the last valid one in place\n            parse(file, { noLocation: true });\n            this._graphQLCache.invalidateSchemaCacheForProject(project);\n          } catch {}\n        }\n      }),\n    );\n  }\n\n  private async _updateObjectTypeDefinition(\n    uri: Uri,\n    contents: CachedContent[],\n    project?: GraphQLProjectConfig,\n  ): Promise<void> {\n    const resolvedProject =\n      project ?? (await this._graphQLCache.getProjectForFile(uri));\n    if (resolvedProject) {\n      const cacheKey = this._graphQLCache._cacheKeyForProject(resolvedProject);\n      await this._graphQLCache.updateObjectTypeDefinition(\n        cacheKey,\n        uri,\n        contents,\n      );\n    }\n  }\n\n  private _getCachedDocument(uri: string): CachedDocumentType | null {\n    if (this._textDocumentCache.has(uri)) {\n      const cachedDocument = this._textDocumentCache.get(uri);\n      if (cachedDocument) {\n        return cachedDocument;\n      }\n    }\n\n    return null;\n  }\n  private async _invalidateCache(\n    textDocument: VersionedTextDocumentIdentifier,\n    uri: Uri,\n    contents: CachedContent[],\n  ): Promise<Map<string, CachedDocumentType> | null> {\n    if (this._textDocumentCache.has(uri)) {\n      const cachedDocument = this._textDocumentCache.get(uri);\n      if (\n        cachedDocument &&\n        textDocument?.version &&\n        cachedDocument.version < textDocument.version\n      ) {\n        // Current server capabilities specify the full sync of the contents.\n        // Therefore always overwrite the entire content.\n        return this._textDocumentCache.set(uri, {\n          version: textDocument.version,\n          contents,\n        });\n      }\n    }\n    return this._textDocumentCache.set(uri, {\n      version: textDocument.version ?? 0,\n      contents,\n    });\n  }\n}\n\nexport function processDiagnosticsMessage(\n  results: Diagnostic[],\n  query: string,\n  range: RangeType | null,\n): Diagnostic[] {\n  const queryLines = query.split('\\n');\n  const totalLines = queryLines.length;\n  const lastLineLength = queryLines[totalLines - 1].length;\n  const lastCharacterPosition = new Position(totalLines, lastLineLength);\n  const processedResults = results.filter(diagnostic =>\n    // @ts-ignore\n    diagnostic.range.end.lessThanOrEqualTo(lastCharacterPosition),\n  );\n\n  if (range) {\n    const offset = range.start;\n    return processedResults.map(diagnostic => ({\n      ...diagnostic,\n      range: new Range(\n        new Position(\n          diagnostic.range.start.line + offset.line,\n          diagnostic.range.start.character,\n        ),\n        new Position(\n          diagnostic.range.end.line + offset.line,\n          diagnostic.range.end.character,\n        ),\n      ),\n    }));\n  }\n\n  return processedResults;\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/.graphqlrc.yml",
    "content": "projects:\n  testWithSchema:\n    schema:\n      - __schema__/StarWarsSchema.graphql\n      - 'directive @customDirective on FRAGMENT_SPREAD'\n  testWithGlobSchema:\n    schema:\n      - __schema__/*.graphql\n      - 'directive @customDirective on FRAGMENT_SPREAD'\n  testWithEndpoint:\n    schema: https://example.com/graphql\n  testWithEndpointAndSchema:\n    schema:\n      - __schema__/StarWarsSchema.graphql\n      - https://example.com/graphql\n  testWithoutSchema:\n    schema: ''\n  testWithCustomDirectives:\n    schema:\n      - __schema__/StarWarsSchema.graphql\n      - 'directive @customDirective on FIELD'\n  testSingularIncludesGlob:\n    schema: __schema__/StarWarsSchema.graphql\n    documents: __queries__/*.graphql\n  testMultipleIncludes:\n    schema: __schema__/StarWarsSchema.graphql\n    documents:\n      - __queries__/*.graphql\n      - __fragments__/*.graphql\n  testNoIncludes:\n    schema: __schema__/StarWarsSchema.graphql\n  testBadIncludes:\n    schema: __schema__/StarWarsSchema.graphql\n    documents: nope.nopeql\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/GraphQLCache.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\nimport { AbortController as MockAbortController } from 'node-abort-controller';\nimport fetchMock from 'fetch-mock';\n\njest.mock('@whatwg-node/fetch', () => ({\n  fetch: require('fetch-mock').fetchHandler,\n  AbortController: MockAbortController,\n  TextDecoder: global.TextDecoder,\n}));\n\nimport { loadConfig, GraphQLExtensionDeclaration } from 'graphql-config';\nimport {\n  GraphQLSchema,\n  parse,\n  introspectionFromSchema,\n  FragmentDefinitionNode,\n  TypeDefinitionNode,\n} from 'graphql';\nimport { GraphQLCache, getGraphQLCache } from '../GraphQLCache';\nimport { parseDocument } from '../parseDocument';\nimport type { FragmentInfo, ObjectTypeInfo } from 'graphql-language-service';\nimport { NoopLogger } from '../Logger';\n\nfunction withoutASTNode(definition: any) {\n  const result = { ...definition };\n  delete result.astNode;\n  return result;\n}\n\nconst logger = new NoopLogger();\ndescribe('GraphQLCache', () => {\n  const configDir = __dirname;\n  let graphQLRC;\n  let cache = new GraphQLCache({\n    configDir,\n    config: graphQLRC,\n    parser: parseDocument,\n    logger,\n  });\n\n  beforeEach(async () => {\n    graphQLRC = await loadConfig({ rootDir: configDir });\n    cache = new GraphQLCache({\n      configDir,\n      config: graphQLRC,\n      parser: parseDocument,\n      logger,\n    });\n  });\n\n  afterEach(() => {\n    fetchMock.restore();\n  });\n\n  describe('getGraphQLCache', () => {\n    it('should apply extensions', async () => {\n      const extension: GraphQLExtensionDeclaration = _config => {\n        return {\n          name: 'extension-used', // Just adding a key to the config to demo extension usage\n        };\n      };\n      const extensions = [extension];\n      const cacheWithExtensions = await getGraphQLCache({\n        loadConfigOptions: { rootDir: configDir, extensions },\n        parser: parseDocument,\n        logger,\n      });\n      const config = cacheWithExtensions.getGraphQLConfig();\n      expect('extensions' in config).toBe(true);\n      expect(config.extensions.has('extension-used')).toBeTruthy();\n      expect(config.extensions.get('extension-used')).toEqual({\n        name: 'extension-used',\n      });\n    });\n  });\n\n  describe('getSchema', () => {\n    it('generates the schema correctly for the test app config', async () => {\n      const schema = await cache.getSchema('testWithSchema');\n      expect(schema instanceof GraphQLSchema).toEqual(true);\n    });\n\n    it('generates the schema correctly from endpoint', async () => {\n      const introspectionResult = {\n        data: introspectionFromSchema(\n          await graphQLRC.getProject('testWithSchema').getSchema(),\n          { descriptions: true },\n        ),\n      };\n      fetchMock.mock({\n        matcher: '*',\n        response: {\n          headers: {\n            'Content-Type': 'application/json',\n          },\n          body: introspectionResult,\n        },\n      });\n\n      const schema = await cache.getSchema('testWithEndpoint');\n      expect(fetchMock.called('*')).toEqual(true);\n      expect(schema instanceof GraphQLSchema).toEqual(true);\n    });\n\n    it('does not generate a schema without a schema path or endpoint', async () => {\n      const schema = await cache.getSchema('testWithoutSchema');\n      expect(schema instanceof GraphQLSchema).toEqual(false);\n    });\n\n    it('extend the schema with appropriate custom directive', async () => {\n      const schema = await cache.getSchema('testWithCustomDirectives');\n      expect(withoutASTNode(schema.getDirective('customDirective'))).toEqual(\n        // objectContaining is used to pass this test without changing the code if more properties are added in GraphQLDirective class in the new version of graphql module.\n        expect.objectContaining({\n          args: [],\n          description: undefined,\n          isRepeatable: false,\n          locations: ['FIELD'],\n          name: 'customDirective',\n        }),\n      );\n    });\n\n    it('extend the schema with appropriate custom directive 2', async () => {\n      const schema = await cache.getSchema('testWithSchema');\n      expect(withoutASTNode(schema.getDirective('customDirective'))).toEqual(\n        // objectContaining is used to pass this test without changing the code if more properties are added in GraphQLDirective class in the new version of graphql module.\n        expect.objectContaining({\n          args: [],\n          description: undefined,\n          isRepeatable: false,\n          locations: ['FRAGMENT_SPREAD'],\n          name: 'customDirective',\n        }),\n      );\n    });\n  });\n\n  describe('getFragmentDependencies', () => {\n    const duckContent = `fragment Duck on Duck {\n      quack\n    }`;\n    const duckDefinition = parse(duckContent).definitions[0];\n\n    const catContent = `fragment Cat on Cat {\n      meow\n    }`;\n\n    const catDefinition = parse(catContent).definitions[0];\n\n    const fragmentDefinitions = new Map<string, FragmentInfo>();\n    fragmentDefinitions.set('Duck', {\n      file: 'someFilePath',\n      content: duckContent,\n      definition: duckDefinition,\n    } as FragmentInfo);\n    fragmentDefinitions.set('Cat', {\n      file: 'someOtherFilePath',\n      content: catContent,\n      definition: catDefinition as FragmentDefinitionNode,\n    } as FragmentInfo);\n\n    it('finds fragments referenced in Relay queries', async () => {\n      const text =\n        'module.exports = Relay.createContainer(' +\n        'DispatchResumeCard, {\\n' +\n        '  fragments: {\\n' +\n        '    candidate: () => graphql`\\n' +\n        '      query A { ...Duck ...Cat }\\n' +\n        '    `,\\n' +\n        '  },\\n' +\n        '});';\n      const contents = await parseDocument(text, 'test.js');\n      const result = await cache.getFragmentDependenciesForAST(\n        parse(contents[0].query),\n        fragmentDefinitions,\n      );\n      expect(result.length).toEqual(2);\n    });\n\n    it('finds fragments referenced from the query', async () => {\n      const ast = parse('query A { ...Duck }');\n\n      const result = await cache.getFragmentDependenciesForAST(\n        ast,\n        fragmentDefinitions,\n      );\n      expect(result.length).toEqual(1);\n    });\n  });\n\n  describe('getFragmentDefinitions', () => {\n    it('caches fragments found through single glob in `documents`', async () => {\n      const config = graphQLRC.getProject('testSingularIncludesGlob');\n      const fragmentDefinitions = await cache.getFragmentDefinitions(config);\n      expect(fragmentDefinitions.get('testFragment')).not.toBeUndefined();\n    });\n\n    it('caches fragments found through multiple globs in `documents`', async () => {\n      const config = graphQLRC.getProject('testMultipleIncludes');\n      const fragmentDefinitions = await cache.getFragmentDefinitions(config);\n      expect(fragmentDefinitions.get('testFragment')).not.toBeUndefined();\n    });\n\n    it('handles empty documents', async () => {\n      const config = graphQLRC.getProject('testNoIncludes');\n      const fragmentDefinitions = await cache.getFragmentDefinitions(config);\n      expect(fragmentDefinitions.get('testFragment')).toBeUndefined();\n    });\n\n    it('handles non-existent documents', async () => {\n      const config = graphQLRC.getProject('testBadIncludes');\n      const fragmentDefinitions = await cache.getFragmentDefinitions(config);\n      expect(fragmentDefinitions.get('testFragment')).toBeUndefined();\n    });\n  });\n\n  describe('getNamedTypeDependencies', () => {\n    const query = `type Query {\n        hero(episode: Episode): Character\n      }\n\n      type Episode {\n        id: ID!\n      }\n      `;\n    const parsedQuery = parse(query);\n\n    const namedTypeDefinitions = new Map<string, ObjectTypeInfo>();\n    namedTypeDefinitions.set('Character', {\n      file: 'someOtherFilePath',\n      content: query,\n      definition: {\n        kind: 'ObjectTypeDefinition',\n        name: {\n          kind: 'Name',\n          value: 'Character',\n        },\n        loc: {\n          start: 0,\n          end: 0,\n        },\n      } as TypeDefinitionNode,\n    } as ObjectTypeInfo);\n\n    it('finds named types referenced from the SDL', async () => {\n      const result = await cache.getObjectTypeDependenciesForAST(\n        parsedQuery,\n        namedTypeDefinitions,\n      );\n      expect(result.length).toEqual(1);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/GraphQLLanguageService.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { join } from 'node:path';\n\nimport { GraphQLConfig } from 'graphql-config';\nimport { GraphQLLanguageService } from '../GraphQLLanguageService';\nimport { SymbolKind } from 'vscode-languageserver-protocol';\nimport { Position } from 'graphql-language-service';\nimport { NoopLogger } from '../Logger';\nimport { GraphQLEnumType } from 'graphql';\n\nconst MOCK_CONFIG = {\n  filepath: join(__dirname, '.graphqlrc.yml'),\n  config: {\n    schema: './__schema__/StarWarsSchema.graphql',\n    documents: ['./queries/**', '**/*.graphql'],\n  },\n};\n\ndescribe('GraphQLLanguageService', () => {\n  const mockCache = {\n    async getSchema() {\n      const config = this.getGraphQLConfig();\n      return config.getDefault().getSchema();\n    },\n\n    getGraphQLConfig() {\n      return new GraphQLConfig(MOCK_CONFIG, []);\n    },\n\n    getProjectForFile(uri: string) {\n      return this.getGraphQLConfig().getProjectForFile(uri);\n    },\n    getFragmentDefinitions() {\n      const definitions = new Map();\n      definitions.set('TestFragment', {\n        filePath: 'fake file path',\n        content: 'fake file content',\n        definition: {\n          kind: 'FragmentDefinition',\n          name: {\n            value: 'TestFragment',\n          },\n          loc: {\n            start: 293,\n            end: 335,\n          },\n        },\n      });\n      return definitions;\n    },\n    // setting the defs here in duplicate as with object types below\n    // leads to duplicates, perhaps related to a bug, or perhaps just a test bug?\n    getFragmentDependenciesForAST() {\n      return [];\n    },\n    getObjectTypeDefinitions() {\n      const definitions = new Map();\n\n      definitions.set('Episode', {\n        filePath: 'fake file path',\n        content: 'fake file content',\n        definition: {\n          name: {\n            value: 'Episode',\n          },\n\n          loc: {\n            start: 293,\n            end: 335,\n          },\n        },\n      });\n\n      definitions.set('Human', {\n        filePath: 'fake file path',\n        content: 'fake file content',\n        definition: {\n          name: {\n            value: 'Human',\n          },\n\n          fields: [\n            {\n              name: { value: 'name' },\n              loc: {\n                start: 293,\n                end: 335,\n              },\n              arguments: [\n                {\n                  name: { value: 'arg' },\n                  loc: {\n                    start: 293,\n                    end: 335,\n                  },\n                  type: GraphQLEnumType,\n                },\n              ],\n            },\n          ],\n\n          loc: {\n            start: 293,\n            end: 335,\n          },\n        },\n      });\n\n      return definitions;\n    },\n\n    getObjectTypeDependenciesForAST() {\n      return [\n        {\n          filePath: 'fake file path',\n          content: 'fake file content',\n          definition: {\n            name: {\n              value: 'Episode',\n            },\n\n            loc: {\n              start: 293,\n              end: 335,\n            },\n          },\n        },\n        {\n          filePath: 'fake file path',\n          content: 'fake file content',\n          definition: {\n            name: {\n              value: 'Human',\n            },\n\n            loc: {\n              start: 293,\n              end: 335,\n            },\n          },\n        },\n      ];\n    },\n  };\n\n  let languageService: GraphQLLanguageService;\n  beforeEach(() => {\n    languageService = new GraphQLLanguageService(\n      mockCache as any,\n      new NoopLogger(),\n    );\n  });\n\n  it('runs diagnostic service as expected', async () => {\n    const diagnostics = await languageService.getDiagnostics(\n      'invalidKeyword',\n      './queries/testQuery.graphql',\n    );\n    expect(diagnostics.length).toEqual(1);\n    const diagnostic = diagnostics[0];\n    expect(diagnostic.message).toEqual(\n      'Syntax Error: Unexpected Name \"invalidKeyword\".',\n    );\n  });\n\n  it('avoids reporting validation errors when not enough characters are present', async () => {\n    const diagnostics = await languageService.getDiagnostics(\n      ' \\n   \\n  \\n\\n',\n      './queries/testQuery.graphql',\n    );\n    expect(diagnostics.length).toEqual(0);\n  });\n\n  it('still reports errors on empty anonymous op', async () => {\n    const diagnostics = await languageService.getDiagnostics(\n      ' \\n   {\\n  \\n}\\n\\n',\n      './queries/testQuery.graphql',\n    );\n    expect(diagnostics.length).toEqual(1);\n    expect(diagnostics[0].message).toEqual(\n      'Syntax Error: Expected Name, found \"}\".',\n    );\n  });\n\n  it('runs definition service as expected', async () => {\n    const definitionQueryResult = await languageService.getDefinition(\n      'type Query { hero(episode: Episode): Character }',\n      { line: 0, character: 28 } as Position,\n      './queries/definitionQuery.graphql',\n    );\n    expect(definitionQueryResult?.definitions.length).toEqual(1);\n  });\n\n  it('runs definition service on fragment definition', async () => {\n    const definitionQueryResult = await languageService.getDefinition(\n      'fragment TestFragment on Human { name }',\n      { line: 0, character: 14 } as Position,\n      './queries/definitionQuery.graphql',\n    );\n    expect(definitionQueryResult?.definitions.length).toEqual(1);\n  });\n  it('runs definition service on fragment spread', async () => {\n    const definitionQueryResult = await languageService.getDefinition(\n      'fragment TestFragment on Human { name }\\nquery { ...TestFragment }',\n      { line: 1, character: 14 } as Position,\n      './queries/definitionQuery.graphql',\n    );\n    expect(definitionQueryResult?.definitions.length).toEqual(1);\n  });\n\n  it('runs definition service on field as expected', async () => {\n    const definitionQueryResult = await languageService.getDefinition(\n      'query XXX { human { name } }',\n      { line: 0, character: 21 } as Position,\n      './queries/definitionQuery.graphql',\n    );\n    expect(definitionQueryResult?.definitions.length).toEqual(1);\n  });\n\n  it('can find a definition for a union', async () => {\n    const query =\n      'union X = A | B\\ntype A { x: String }\\ntype B { x: String }\\ntype Query { a: X }';\n    const definitionQueryResult = await languageService.getDefinition(\n      query,\n      { line: 3, character: 16 } as Position,\n      './queries/definitionQuery.graphql',\n    );\n    expect(definitionQueryResult?.definitions.length).toEqual(1);\n  });\n\n  it('runs hover service as expected', async () => {\n    const hoverInformation = await languageService.getHoverInformation(\n      'type Query { hero(episode: String): String }',\n      { line: 0, character: 28 } as Position,\n      './queries/definitionQuery.graphql',\n    );\n    expect(hoverInformation).toEqual(\n      'String\\n\\nThe `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    );\n  });\n\n  it('runs document symbol requests as expected', async () => {\n    const validQuery = `\n  query OperationExample {\n    item(episode: EMPIRE){\n      ...testFragment\n    }\n  }\n  `;\n\n    const result = await languageService.getDocumentSymbols(\n      validQuery,\n      'file://file.graphql',\n    );\n\n    expect(result).not.toBeUndefined();\n    expect(result.length).toEqual(3);\n    // expect(result[0].name).toEqual('item');\n    expect(result[1].name).toEqual('item');\n    expect(result[1].kind).toEqual(SymbolKind.Field);\n    expect(result[1].location.range.start.line).toEqual(2);\n    expect(result[1].location.range.start.character).toEqual(4);\n    expect(result[1].location.range.end.line).toEqual(4);\n    expect(result[1].location.range.end.character).toEqual(5);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/Logger.test.ts",
    "content": "import { Logger } from '../Logger';\n\ndescribe('Logger', () => {\n  const connection = {\n    console: {\n      error: jest.fn(),\n      warn: jest.fn(),\n      info: jest.fn(),\n      log: jest.fn(),\n    },\n    onDidChangeConfiguration: jest.fn(),\n    workspace: {\n      getConfiguration: jest.fn(),\n    },\n  };\n\n  beforeEach(() => {\n    jest.clearAllMocks();\n  });\n\n  it('should initialize with default log level, and ignore .log intentionally', () => {\n    const logger = new Logger(connection as any);\n    expect(logger).toBeDefined();\n    expect(logger.logLevel).toBe(0);\n    logger.log('test');\n    expect(connection.console.log).toHaveBeenCalledTimes(0);\n  });\n\n  it('should not change log level when settings are not passed', () => {\n    const logger = new Logger(connection as any, true);\n    expect(logger).toBeDefined();\n    expect(logger.logLevel).toBe(1);\n    logger.log('test');\n    expect(connection.console.log).toHaveBeenCalledTimes(1);\n    expect(logger.logLevel).toBe(1);\n    logger.log('test');\n    expect(connection.console.log).toHaveBeenCalledTimes(2);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/MessageProcessor.spec.ts",
    "content": "import { readFile, rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport mockfs from 'mock-fs';\nimport { MockFile, MockProject } from './__utils__/MockProject';\nimport { FileChangeType } from 'vscode-languageserver';\nimport { serializeRange } from './__utils__/utils';\nimport { URI } from 'vscode-uri';\nimport {\n  GraphQLSchema,\n  buildASTSchema,\n  introspectionFromSchema,\n  parse,\n  version,\n} from 'graphql';\nimport fetchMock from 'fetch-mock';\nimport * as graphql from 'graphql';\n\nimport { createSchema } from '../../../graphiql/test/schema.js';\n\nconst graphiqlSchema = createSchema(graphql);\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\njest.mock('@whatwg-node/fetch', () => {\n  const { AbortController } = require('node-abort-controller');\n\n  return {\n    fetch: require('fetch-mock').fetchHandler,\n    AbortController,\n    TextDecoder: global.TextDecoder,\n  };\n});\n\nfunction mockSchema(schema: GraphQLSchema) {\n  const introspectionResult = {\n    data: introspectionFromSchema(schema, { descriptions: true }),\n  };\n  return fetchMock.mock({\n    matcher: '*',\n    response: {\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: introspectionResult,\n    },\n  });\n}\n\nconst defaultFiles: MockFile[] = [\n  ['query.graphql', 'query { bar ...B }'],\n  ['fragments.graphql', 'fragment B on Foo { bar }'],\n];\nconst schemaFile: MockFile = [\n  'schema.graphql',\n  'type Query { foo: Foo, test: Test }\\n\\ntype Foo { bar: String }\\n\\ntype Test { test: Foo }',\n];\n\nconst fooTypePosition = {\n  start: { line: 2, character: 0 },\n  end: { line: 2, character: 24 },\n};\n\nconst fooInlineTypePosition = {\n  start: { line: 5, character: 0 },\n  end: { line: 5, character: 24 },\n};\n\nconst genSchemaPath = path.join(\n  tmpdir(),\n  'graphql-language-service',\n  'test',\n  'projects',\n  'default',\n  'generated-schema.graphql',\n);\n\n// TODO:\n// - reorganize into multiple files\n// - potentially a high level abstraction and/or it.each() for a pathway across configs, file extensions, etc.\n//   this may be cumbersome with offset position assertions but possible\n//   if we can create consistency that doesn't limit variability\n// - convert each it() into a nested describe() block (or a top level describe() in another file), and sprinkle in it() statements to replace comments\n// - fix TODO comments where bugs were found that couldn't be resolved quickly (2-4hr time box)\n\ndescribe('MessageProcessor with no config', () => {\n  beforeAll(async () => {\n    await rm(path.join(tmpdir(), 'graphql-language-service'), {\n      recursive: true,\n      force: true,\n    });\n  });\n\n  afterEach(() => {\n    mockfs.restore();\n    fetchMock.restore();\n  });\n\n  it('fails to initialize with empty config file', async () => {\n    const project = new MockProject({\n      files: [...defaultFiles, ['graphql.config.json', '']],\n    });\n    await project.init();\n\n    expect(project.lsp._logger.info).toHaveBeenCalledTimes(1);\n    expect(project.lsp._logger.error).toHaveBeenCalledTimes(1);\n    expect(project.lsp._logger.error).toHaveBeenCalledWith(\n      expect.stringMatching(\n        /GraphQL Config file is not available in the provided config directory/,\n      ),\n    );\n    expect(project.lsp._isInitialized).toEqual(false);\n    expect(project.lsp._isGraphQLConfigMissing).toEqual(true);\n    project.lsp.handleShutdownRequest();\n  });\n\n  it('fails to initialize with no config file present', async () => {\n    const project = new MockProject({\n      files: [...defaultFiles],\n    });\n    await project.init();\n\n    expect(project.lsp._logger.error).toHaveBeenCalledTimes(1);\n    expect(project.lsp._logger.error).toHaveBeenCalledWith(\n      expect.stringMatching(\n        /GraphQL Config file is not available in the provided config directory/,\n      ),\n    );\n    expect(project.lsp._isInitialized).toEqual(false);\n    expect(project.lsp._isGraphQLConfigMissing).toEqual(true);\n    project.lsp.handleShutdownRequest();\n  });\n\n  it('initializes when presented with a valid config later', async () => {\n    const project = new MockProject({\n      files: [...defaultFiles],\n    });\n    await project.init();\n    expect(project.lsp._isInitialized).toEqual(false);\n    expect(project.lsp._isGraphQLConfigMissing).toEqual(true);\n    expect(project.lsp._logger.error).toHaveBeenCalledTimes(1);\n\n    project.changeFile(\n      'graphql.config.json',\n      '{ \"schema\": \"./schema.graphql\" }',\n    );\n    // TODO: this should work for on watched file changes as well!\n    await project.lsp.handleDidOpenOrSaveNotification({\n      textDocument: {\n        uri: project.uri('graphql.config.json'),\n      },\n    });\n    expect(project.lsp._isInitialized).toEqual(true);\n    expect(project.lsp._isGraphQLConfigMissing).toEqual(false);\n    expect(project.lsp._graphQLCache).toBeDefined();\n    project.lsp.handleShutdownRequest();\n  });\n});\n\ndescribe('MessageProcessor with config', () => {\n  afterEach(() => {\n    mockfs.restore();\n    fetchMock.restore();\n  });\n\n  it('caches files and schema with .graphql file config, and the schema updates with watched file changes', async () => {\n    const project = new MockProject({\n      files: [\n        schemaFile,\n        [\n          'graphql.config.json',\n          '{ \"schema\": \"./schema.graphql\", \"documents\": \"./**.graphql\" }',\n        ],\n        ...defaultFiles,\n      ],\n    });\n    const results = await project.init('query.graphql');\n    expect(results.diagnostics[0].message).toEqual(\n      'Cannot query field \"bar\" on type \"Query\".',\n    );\n    expect(results.diagnostics[1].message).toEqual(\n      'Fragment \"B\" cannot be spread here as objects of type \"Query\" can never be of type \"Foo\".',\n    );\n    const initSchemaDefRequest = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('schema.graphql') },\n      position: { character: 19, line: 0 },\n    });\n    expect(initSchemaDefRequest.length).toEqual(1);\n    expect(initSchemaDefRequest[0].uri).toEqual(project.uri('schema.graphql'));\n    expect(serializeRange(initSchemaDefRequest[0].range)).toEqual(\n      fooTypePosition,\n    );\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    expect(await project.lsp._graphQLCache.getSchema('default')).toBeDefined();\n    // TODO: for some reason the cache result formats the graphql query??\n    const docCache = project.lsp._textDocumentCache;\n    expect(\n      docCache.get(project.uri('query.graphql'))!.contents[0].query,\n    ).toContain('...B');\n    const schemaDefinitions = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('fragments.graphql') },\n      position: { character: 16, line: 0 },\n    });\n    expect(schemaDefinitions[0].uri).toEqual(project.uri('schema.graphql'));\n\n    expect(serializeRange(schemaDefinitions[0].range)).toEqual(fooTypePosition);\n\n    // query definition request of fragment name jumps to the fragment definition\n    const firstQueryDefRequest = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('query.graphql') },\n      position: { character: 16, line: 0 },\n    });\n\n    expect(firstQueryDefRequest[0].uri).toEqual(\n      project.uri('fragments.graphql'),\n    );\n    expect(serializeRange(firstQueryDefRequest[0].range)).toEqual({\n      start: {\n        line: 0,\n        character: 0,\n      },\n      end: {\n        line: 0,\n        character: 25,\n      },\n    });\n\n    // change the file to make the fragment invalid\n    project.changeFile(\n      'schema.graphql',\n      // now Foo has a bad field, the fragment should be invalid\n      'type Query { foo: Foo, test: Test }\\n\\n type Test { test: String }\\n\\n\\n\\n\\ntype Foo { bad: Int }',\n    );\n    await project.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        { uri: project.uri('schema.graphql'), type: FileChangeType.Changed },\n      ],\n    });\n    const typeCache =\n      project.lsp._graphQLCache._typeDefinitionsCache.get('/tmp/test-default');\n    expect(typeCache?.get('Test')?.definition.name.value).toEqual('Test');\n\n    // test in-file schema defs! important!\n    const schemaDefRequest = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('schema.graphql') },\n      position: { character: 19, line: 0 },\n    });\n\n    const fooLaterTypePosition = {\n      start: { line: 7, character: 0 },\n      end: { line: 7, character: 21 },\n    };\n    expect(schemaDefRequest.length).toEqual(1);\n    expect(schemaDefRequest[0].uri).toEqual(project.uri('schema.graphql'));\n    expect(serializeRange(schemaDefRequest[0].range)).toEqual(\n      fooLaterTypePosition,\n    );\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    // change the file to make the fragment invalid\n    project.changeFile(\n      'schema.graphql',\n      // now Foo has a bad field, the fragment should be invalid\n      'type Query { foo: Foo, test: Test }\\n\\n type Test { test: String }\\n\\n\\n\\n\\n\\ntype Foo { bad: Int }',\n    );\n\n    await project.lsp.handleDidChangeNotification({\n      contentChanges: [\n        {\n          type: FileChangeType.Changed,\n          text: 'type Query { foo: Foo, test: Test }\\n\\n type Test { test: String }\\n\\n\\n\\n\\n\\ntype Foo { bad: Int }',\n        },\n      ],\n      textDocument: { uri: project.uri('schema.graphql'), version: 1 },\n    });\n\n    const schemaDefRequest2 = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('schema.graphql') },\n      position: { character: 19, line: 0 },\n    });\n\n    const fooLaterTypePosition2 = {\n      start: { line: 8, character: 0 },\n      end: { line: 8, character: 21 },\n    };\n    expect(schemaDefRequest2.length).toEqual(1);\n    expect(schemaDefRequest2[0].uri).toEqual(project.uri('schema.graphql'));\n    expect(serializeRange(schemaDefRequest2[0].range)).toEqual(\n      fooLaterTypePosition2,\n    );\n\n    // TODO: this fragment should now be invalid\n    const result = await project.lsp.handleDidOpenOrSaveNotification({\n      textDocument: { uri: project.uri('fragments.graphql') },\n    });\n    expect(result.diagnostics[0].message).toEqual(\n      'Cannot query field \"bar\" on type \"Foo\". Did you mean \"bad\"?',\n    );\n    const generatedFile = existsSync(genSchemaPath);\n    // this generated file should not exist because the schema is local!\n    expect(generatedFile).toEqual(false);\n    // simulating codegen\n    project.changeFile(\n      'fragments.graphql',\n      'fragment A on Foo { bad }\\n\\nfragment B on Test { test }',\n    );\n    await project.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        { uri: project.uri('fragments.graphql'), type: FileChangeType.Changed },\n      ],\n    });\n\n    // TODO: this interface should maybe not be tested here but in unit tests\n    const fragCache =\n      project.lsp._graphQLCache._fragmentDefinitionsCache.get(\n        '/tmp/test-default',\n      );\n    expect(fragCache?.get('A')?.definition.name.value).toEqual('A');\n    expect(fragCache?.get('B')?.definition.name.value).toEqual('B');\n    const queryFieldDefRequest = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('fragments.graphql') },\n      position: { character: 22, line: 0 },\n    });\n    expect(queryFieldDefRequest[0].uri).toEqual(project.uri('schema.graphql'));\n    expect(serializeRange(queryFieldDefRequest[0].range)).toEqual({\n      start: {\n        line: 8,\n        character: 11,\n      },\n      end: {\n        line: 8,\n        character: 19,\n      },\n    });\n\n    // on the second request, the position has changed\n    const secondQueryDefRequest = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('query.graphql') },\n      position: { character: 16, line: 0 },\n    });\n    expect(secondQueryDefRequest[0].uri).toEqual(\n      project.uri('fragments.graphql'),\n    );\n    expect(serializeRange(secondQueryDefRequest[0].range)).toEqual({\n      start: {\n        line: 2,\n        character: 0,\n      },\n      end: {\n        line: 2,\n        character: 27,\n      },\n    });\n    // definitions request for fragments jumps to a different place in schema.graphql now\n    const schemaDefinitionsAgain = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('fragments.graphql') },\n      position: { character: 16, line: 0 },\n    });\n    expect(schemaDefinitionsAgain[0].uri).toEqual(\n      project.uri('schema.graphql'),\n    );\n\n    expect(serializeRange(schemaDefinitionsAgain[0].range)).toEqual(\n      fooLaterTypePosition2,\n    );\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    project.lsp.handleShutdownRequest();\n  });\n\n  it('caches files and schema with a URL config', async () => {\n    const offset = parseInt(version, 10) > 16 ? 25 : 0;\n    mockSchema(graphiqlSchema);\n\n    const project = new MockProject({\n      files: [\n        ['query.graphql', 'query { test { isTest, ...T } }'],\n        ['fragments.graphql', 'fragment T on Test {\\n isTest \\n}'],\n        [\n          'graphql.config.json',\n          '{ \"schema\": \"http://localhost:3100/graphql\", \"documents\": \"./**\" }',\n        ],\n      ],\n    });\n    const initParams = await project.init('query.graphql');\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n\n    expect(initParams.diagnostics).toEqual([]);\n\n    const changeParams = await project.lsp.handleDidChangeNotification({\n      textDocument: { uri: project.uri('query.graphql'), version: 1 },\n      contentChanges: [{ text: 'query { test { isTest, ...T or }  }' }],\n    });\n    expect(changeParams?.diagnostics[0].message).toEqual(\n      'Cannot query field \"or\" on type \"Test\".',\n    );\n    expect(await project.lsp._graphQLCache.getSchema('default')).toBeDefined();\n\n    // schema file is present and contains schema\n    const file = await readFile(genSchemaPath, 'utf8');\n    expect(file.split('\\n').length).toBeGreaterThan(10);\n\n    // hover works\n    const hover = await project.lsp.handleHoverRequest({\n      position: {\n        character: 10,\n        line: 0,\n      },\n      textDocument: { uri: project.uri('query.graphql') },\n    });\n    expect(hover.contents).toContain('`test` field from `Test` type.');\n\n    // ensure that fragment definitions work\n    const definitions = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('query.graphql') },\n      position: { character: 26, line: 0 },\n    });\n\n    expect(definitions[0].uri).toEqual(project.uri('fragments.graphql'));\n    expect(serializeRange(definitions[0].range)).toEqual({\n      start: {\n        line: 0,\n        character: 0,\n      },\n      end: {\n        line: 2,\n        character: 1,\n      },\n    });\n\n    const typeDefinitions = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('fragments.graphql') },\n      position: { character: 15, line: 0 },\n    });\n    expect(typeDefinitions[0].uri).toEqual(URI.parse(genSchemaPath).toString());\n\n    expect(serializeRange(typeDefinitions[0].range)).toEqual({\n      start: {\n        line: 11 + offset,\n        character: 0,\n      },\n      end: {\n        line: 106 + offset,\n        character: 1,\n      },\n    });\n\n    const schemaDefs = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: URI.parse(genSchemaPath).toString() },\n      position: { character: 20, line: 18 + offset },\n    });\n    expect(schemaDefs[0].uri).toEqual(URI.parse(genSchemaPath).toString());\n    // note: if the graphiql test schema changes,\n    // this might break, please adjust if you see a failure here\n    expect(serializeRange(schemaDefs[0].range)).toEqual({\n      start: {\n        line: 108 + offset,\n        character: 0,\n      },\n      end: {\n        line: 116 + offset,\n        character: 1,\n      },\n    });\n    // lets remove the fragments file\n    await project.deleteFile('fragments.graphql');\n    // and add a fragments.ts file, watched\n    await project.addFile(\n      'fragments.ts',\n      '\\n\\n\\nexport const fragment = gql`\\n\\n  fragment T on Test { isTest } \\n query { hasArgs(string: \"\") }\\n`',\n      true,\n    );\n\n    await project.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        { uri: project.uri('fragments.ts'), type: FileChangeType.Created },\n      ],\n    });\n    const defsForTs = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('query.graphql') },\n      position: { character: 26, line: 0 },\n    });\n    // this one is really important\n    expect(defsForTs[0].uri).toEqual(project.uri('fragments.ts'));\n    expect(serializeRange(defsForTs[0].range)).toEqual({\n      start: {\n        line: 5,\n        character: 2,\n      },\n      end: {\n        line: 5,\n        character: 31,\n      },\n    });\n    const defsForArgs = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('fragments.ts') },\n      position: { character: 19, line: 6 },\n    });\n\n    expect(defsForArgs[0].uri).toEqual(URI.parse(genSchemaPath).toString());\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    project.lsp.handleShutdownRequest();\n  });\n\n  it('caches multiple projects with files and schema with a URL config and a local schema', async () => {\n    mockSchema(graphiqlSchema);\n\n    const project = new MockProject({\n      files: [\n        [\n          'a/fragments.ts',\n          '\\n\\n\\nexport const fragment = gql`\\n\\n  fragment TestFragment on Test { isTest }\\n`',\n        ],\n        [\n          'a/query.ts',\n          '\\n\\n\\nexport const query = graphql`query { test { isTest ...T } }`',\n        ],\n\n        [\n          'b/query.ts',\n          'import graphql from \"graphql\"\\n\\n\\nconst a = graphql` query example { test() { isTest ...T }  }`',\n        ],\n        [\n          'b/fragments.ts',\n          '\\n\\n\\nexport const fragment = gql`\\n\\n  fragment T on Test { isTest }\\n`',\n        ],\n        [\n          'b/schema.ts',\n          `\\n\\nexport const schema = gql(\\`\\n${schemaFile[1]}\\`)`,\n        ],\n        [\n          'package.json',\n          `{ \"graphql\": { \"projects\": { \n              \"a\": { \"schema\": \"http://localhost:3100/graphql\", \"documents\": \"./a/**\" }, \n              \"b\": { \"schema\": \"./b/schema.ts\", \"documents\": \"./b/**\" }  }\n            } \n          }`,\n        ],\n        schemaFile,\n      ],\n      settings: { schemaCacheTTL: 500 },\n    });\n\n    const initParams = await project.init('a/query.ts');\n    expect(initParams.diagnostics[0].message).toEqual('Unknown fragment \"T\".');\n\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    expect(await project.lsp._graphQLCache.getSchema('a')).toBeDefined();\n    expect(project.lsp._logger.info).not.toHaveBeenCalledWith(\n      expect.stringMatching(/SyntaxError: Unexpected token/),\n    );\n\n    fetchMock.restore();\n    mockSchema(\n      buildASTSchema(\n        parse(\n          'type example100 { string: String } type Query { example: example100 }',\n        ),\n      ),\n    );\n    await project.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        { uri: project.uri('a/fragments.ts'), type: FileChangeType.Changed },\n      ],\n    });\n    await sleep(1000);\n    expect(\n      (await project.lsp._graphQLCache.getSchema('a')).getType('example100'),\n    ).toBeTruthy();\n    await sleep(1000);\n    const file = await readFile(genSchemaPath.replace('default', 'a'), 'utf8');\n    expect(file).toContain('example100');\n    // add a new typescript file with empty query to the b project\n    // and expect autocomplete to only show options for project b\n    await project.addFile(\n      'b/empty.ts',\n      'import gql from \"graphql-tag\"\\ngql`query a {    }`',\n    );\n    const completion = await project.lsp.handleCompletionRequest({\n      textDocument: { uri: project.uri('b/empty.ts') },\n      position: { character: 13, line: 1 },\n    });\n\n    expect(completion.items?.length).toEqual(5);\n    expect(completion.items.map(i => i.label)).toEqual([\n      'foo',\n      'test',\n      '__typename',\n      '__schema',\n      '__type',\n    ]);\n    // this confirms that autocomplete respects cross-project boundaries for types.\n    // it performs a definition request for the foo field in Query\n    const schemaCompletion1 = await project.lsp.handleCompletionRequest({\n      textDocument: { uri: project.uri('b/schema.ts') },\n      position: { character: 21, line: 3 },\n    });\n    expect(schemaCompletion1.items.map(i => i.label)).toEqual(['Foo']);\n    // it performs a definition request for the Foo type in Test.test\n    const schemaDefinition = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('b/schema.ts') },\n      position: { character: 21, line: 6 },\n    });\n    expect(serializeRange(schemaDefinition[0].range)).toEqual(\n      fooInlineTypePosition,\n    );\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    // simulate a watched schema file change (codegen, etc)\n    project.changeFile(\n      'b/schema.ts',\n      `\\n\\nexport const schema = gql(\\`\\n${\n        schemaFile[1] + '\\ntype Example1 { field:    }'\n      }\\`\\n)`,\n    );\n    await project.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        { uri: project.uri('b/schema.ts'), type: FileChangeType.Changed },\n      ],\n    });\n    // TODO: repeat this with other changes to the schema file and use a\n    // didChange event to see if the schema updates properly as well\n    // await project.lsp.handleDidChangeNotification({\n    //   textDocument: { uri: project.uri('b/schema.graphql'), version: 1 },\n    //   contentChanges: [\n    //     { text: schemaFile[1] + '\\ntype Example1 { field:    }' },\n    //   ],\n    // });\n    // console.log(project.fileCache.get('b/schema.graphql'));\n    const schemaCompletion = await project.lsp.handleCompletionRequest({\n      textDocument: { uri: project.uri('b/schema.ts') },\n      position: { character: 25, line: 8 },\n    });\n    // TODO: SDL completion still feels incomplete here... where is Int?\n    // where is self-referential Example1?\n    expect(schemaCompletion.items.map(i => i.label)).toEqual([\n      'Query',\n      'Foo',\n      'String',\n      'Test',\n      'Boolean',\n    ]);\n\n    expect(project.lsp._logger.error).not.toHaveBeenCalled();\n    project.lsp.handleShutdownRequest();\n  });\n\n  it('correctly handles a fragment inside a TypeScript file', async () => {\n    const project = new MockProject({\n      files: [\n        [\n          'schema.graphql',\n          `\ntype Item {\n  foo: String\n  bar: Int\n}\n\ntype Query {\n  items: [Item]\n}\n          `,\n        ],\n        [\n          'query.ts',\n          `\nimport gql from 'graphql-tag'\n\nconst query = gql\\`\n  query {\n    items {\n      ...ItemFragment\n    }\n  }\n\\`\n          `,\n        ],\n        [\n          'fragments.ts',\n          `\nimport gql from 'graphql-tag'\n\nexport const ItemFragment = gql\\`\n  fragment ItemFragment on Item {\n    foo\n    bar\n  }\n\\`\n          `,\n        ],\n        [\n          'graphql.config.json',\n          '{ \"schema\": \"./schema.graphql\", \"documents\": \"./**.{graphql,ts}\" }',\n        ],\n      ],\n    });\n\n    const initParams = await project.init('query.ts');\n    expect(initParams.diagnostics).toEqual([]);\n\n    const fragmentDefinition = await project.lsp.handleDefinitionRequest({\n      textDocument: { uri: project.uri('query.ts') },\n      position: { character: 10, line: 6 },\n    });\n\n    expect(fragmentDefinition[0]?.uri).toEqual(project.uri('fragments.ts'));\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/MessageProcessor.test.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\nimport { SymbolKind } from 'vscode-languageserver';\nimport { FileChangeType } from 'vscode-languageserver-protocol';\nimport { Position, Range } from 'graphql-language-service';\n\nimport {\n  MessageProcessor,\n  processDiagnosticsMessage,\n} from '../MessageProcessor';\nimport { parseDocument } from '../parseDocument';\n\njest.mock('../Logger');\n\njest.setTimeout(20000);\n\nimport { GraphQLCache } from '../GraphQLCache';\n\nimport {\n  ConfigInvalidError,\n  ConfigNotFoundError,\n  LoaderNoResultError,\n  ProjectNotFoundError,\n  loadConfig,\n} from 'graphql-config';\n\nimport type { DefinitionQueryResult, Outline } from 'graphql-language-service';\n\nimport { NoopLogger } from '../Logger';\nimport { pathToFileURL } from 'node:url';\nimport mockfs from 'mock-fs';\nimport { join } from 'node:path';\n\njest.mock('node:fs', () => ({\n  ...jest.requireActual<typeof import('fs')>('fs'),\n  readFileSync: jest.fn(jest.requireActual('fs').readFileSync),\n}));\n\ndescribe('MessageProcessor', () => {\n  const logger = new NoopLogger();\n  const messageProcessor = new MessageProcessor({\n    // @ts-ignore\n    connection: {},\n    logger,\n    graphqlFileExtensions: ['graphql'],\n    loadConfigOptions: { rootDir: __dirname },\n    config: null,\n  });\n\n  const queryPathUri = pathToFileURL(`${__dirname}/__queries__`);\n  const textDocumentTestString = `\n  {\n    hero(episode: NEWHOPE){\n    }\n  }\n  `;\n  let gqlConfig;\n  beforeEach(async () => {\n    gqlConfig = await loadConfig({ rootDir: __dirname, extensions: [] });\n\n    // loadConfig.mockRestore();\n    messageProcessor._settings = { load: {} };\n    messageProcessor._graphQLCache = new GraphQLCache({\n      configDir: __dirname,\n      config: gqlConfig,\n      parser: parseDocument,\n      logger: new NoopLogger(),\n    });\n    messageProcessor._languageService = {\n      // @ts-ignore\n      getAutocompleteSuggestions(query, position, uri) {\n        return [{ label: `${query} at ${uri}` }];\n      },\n      // @ts-ignore\n      getDiagnostics(_query, _uri) {\n        return [];\n      },\n      async getHoverInformation(_query, position, _uri) {\n        return {\n          contents: '```graphql\\nField: hero\\n```',\n          range: new Range(position, position),\n        };\n      },\n      async getDocumentSymbols(_query: string, uri: string) {\n        return [\n          {\n            name: 'item',\n            kind: SymbolKind.Field,\n            location: {\n              uri,\n              range: {\n                start: { line: 1, character: 2 },\n                end: { line: 1, character: 4 },\n              },\n            },\n          },\n        ];\n      },\n      async getOutline(_query: string): Promise<Outline> {\n        return {\n          outlineTrees: [\n            {\n              representativeName: 'item',\n              kind: 'Field',\n              startPosition: new Position(1, 2),\n              endPosition: new Position(1, 4),\n              children: [],\n            },\n          ],\n        };\n      },\n      async getDefinition(\n        _query,\n        position,\n        uri,\n      ): Promise<DefinitionQueryResult> {\n        return {\n          queryRange: [new Range(position, position)],\n          printedName: 'example',\n          definitions: [\n            {\n              position,\n              path: uri,\n            },\n          ],\n        };\n      },\n    };\n  });\n\n  let getConfigurationReturnValue = {};\n  // @ts-ignore\n  messageProcessor._connection = {\n    // @ts-ignore\n    get workspace() {\n      return {\n        async getConfiguration() {\n          return [getConfigurationReturnValue];\n        },\n      };\n    },\n  };\n\n  const initialDocument = {\n    textDocument: {\n      text: textDocumentTestString,\n      uri: `${queryPathUri}/test.graphql`,\n      version: 0,\n    },\n  };\n\n  messageProcessor._isInitialized = true;\n\n  it('initializes properly and opens a file', async () => {\n    const { capabilities } = await messageProcessor.handleInitializeRequest(\n      // @ts-ignore\n      {\n        rootPath: __dirname,\n      },\n      null,\n      __dirname,\n    );\n    expect(capabilities.definitionProvider).toEqual(true);\n    expect(capabilities.workspaceSymbolProvider).toEqual(true);\n    expect(capabilities.completionProvider.resolveProvider).toEqual(true);\n    expect(capabilities.textDocumentSync).toEqual(1);\n  });\n  it('detects a config file', async () => {\n    const result =\n      await messageProcessor._isGraphQLConfigFile('graphql.config.js');\n    expect(result).toEqual(true);\n    const falseResult =\n      await messageProcessor._isGraphQLConfigFile('graphql.js');\n    expect(falseResult).toEqual(false);\n\n    mockfs({ [`${__dirname}/package.json`]: '{\"graphql\": {}}' });\n    const pkgResult = await messageProcessor._isGraphQLConfigFile(\n      `file://${__dirname}/package.json`,\n    );\n    mockfs.restore();\n    expect(pkgResult).toEqual(true);\n\n    mockfs({ [`${__dirname}/package.json`]: '{ }' });\n    const pkgFalseResult = await messageProcessor._isGraphQLConfigFile(\n      `file://${__dirname}/package.json`,\n    );\n    mockfs.restore();\n    expect(pkgFalseResult).toEqual(false);\n  });\n  it('runs completion requests properly', async () => {\n    const uri = `${queryPathUri}/test2.graphql`;\n    const query = 'test';\n    messageProcessor._textDocumentCache.set(uri, {\n      version: 0,\n      contents: [\n        {\n          query,\n          range: new Range(new Position(0, 0), new Position(0, 0)),\n        },\n      ],\n    });\n\n    const test = {\n      position: new Position(0, 0),\n      textDocument: { uri },\n    };\n    const result = await messageProcessor.handleCompletionRequest(test);\n    expect(result).toEqual({\n      items: [{ label: `${query} at ${uri}` }],\n      isIncomplete: false,\n    });\n  });\n  it('runs completion requests properly with no file present', async () => {\n    const test = {\n      position: new Position(0, 0),\n      textDocument: { uri: `${queryPathUri}/test13.graphql` },\n    };\n    const result = await messageProcessor.handleCompletionRequest(test);\n    expect(result).toEqual({\n      items: [],\n      isIncomplete: false,\n    });\n  });\n  it('runs completion requests properly when not initialized', async () => {\n    const test = {\n      position: new Position(0, 3),\n      textDocument: { uri: `${queryPathUri}/test2.graphql` },\n    };\n    messageProcessor._isInitialized = false;\n    const result = await messageProcessor.handleCompletionRequest(test);\n    expect(result).toEqual({\n      items: [],\n      isIncomplete: false,\n    });\n  });\n\n  it('runs document symbol requests', async () => {\n    messageProcessor._isInitialized = true;\n    const uri = `${queryPathUri}/test3.graphql`;\n    const validQuery = `\n  {\n    hero(episode: EMPIRE){\n      ...testFragment\n    }\n  }\n  `;\n\n    const newDocument = {\n      textDocument: {\n        text: validQuery,\n        uri,\n        version: 0,\n      },\n    };\n\n    messageProcessor._textDocumentCache.set(uri, {\n      version: 0,\n      contents: [\n        {\n          query: validQuery,\n          range: new Range(new Position(0, 0), new Position(0, 0)),\n        },\n      ],\n    });\n\n    const test = {\n      textDocument: newDocument.textDocument,\n    };\n\n    const result = await messageProcessor.handleDocumentSymbolRequest(test);\n\n    expect(result).not.toBeUndefined();\n    expect(result.length).toEqual(1);\n    expect(result[0].name).toEqual('item');\n    expect(result[0].kind).toEqual(SymbolKind.Field);\n    expect(result[0].location.range).toEqual({\n      start: { line: 1, character: 2 },\n      end: { line: 1, character: 4 },\n    });\n  });\n  it('runs document symbol requests with no file present', async () => {\n    const test = {\n      textDocument: {\n        uri: `${queryPathUri}/test4.graphql`,\n        version: 0,\n      },\n    };\n\n    const result = await messageProcessor.handleDocumentSymbolRequest(test);\n    expect(result).toEqual([]);\n  });\n  it('runs document symbol requests when not initialized', async () => {\n    const test = {\n      textDocument: {\n        uri: `${queryPathUri}/test3.graphql`,\n        version: 0,\n      },\n    };\n    messageProcessor._isInitialized = false;\n    const result = await messageProcessor.handleDocumentSymbolRequest(test);\n    expect(result).toEqual([]);\n    messageProcessor._isInitialized = true;\n    const nextResult = await messageProcessor.handleDocumentSymbolRequest(test);\n    expect(nextResult[0].location.uri).toContain('test3.graphql');\n    expect(nextResult[0].name).toEqual('item');\n    expect(nextResult.length).toEqual(1);\n  });\n\n  it('properly changes the file cache with the didChange handler', async () => {\n    const uri = `${queryPathUri}/test.graphql`;\n    messageProcessor._textDocumentCache.set(uri, {\n      version: 1,\n      contents: [\n        {\n          query: '',\n          range: new Range(new Position(0, 0), new Position(0, 0)),\n        },\n      ],\n    });\n    const textDocumentChangedString = `\n      {\n        hero(episode: NEWHOPE){\n          name\n        }\n      }\n      `;\n\n    const result = await messageProcessor.handleDidChangeNotification({\n      textDocument: {\n        // @ts-ignore\n        text: textDocumentTestString,\n        uri,\n        version: 1,\n      },\n      contentChanges: [\n        { text: textDocumentTestString },\n        { text: textDocumentChangedString },\n      ],\n    });\n    // Query fixed, no more errors\n    expect(result.diagnostics.length).toEqual(0);\n  });\n\n  it('does not crash on null value returned in response to workspace configuration', async () => {\n    // for some reason this is needed? can't be a good thing... must have done something to cause a performance hit on\n    // loading config schema..\n    jest.setTimeout(10000);\n    const previousConfigurationValue = getConfigurationReturnValue;\n    getConfigurationReturnValue = null;\n    const result = await messageProcessor.handleDidChangeConfiguration({});\n    expect(result).toEqual({});\n    getConfigurationReturnValue = previousConfigurationValue;\n  });\n\n  it('properly removes from the file cache with the didClose handler', async () => {\n    messageProcessor.handleDidCloseNotification(initialDocument);\n\n    const position = { line: 4, character: 5 };\n    const params = { textDocument: initialDocument.textDocument, position };\n\n    // Should throw because file has been deleted from cache\n    try {\n      const result = await messageProcessor.handleCompletionRequest(params);\n      expect(result).toEqual(null);\n    } catch {}\n  });\n\n  // modified to work with jest.mock() of WatchmanClient\n  it('runs definition requests', async () => {\n    jest.setTimeout(10000);\n    const validQuery = `\n  {\n    hero(episode: EMPIRE){\n      ...testFragment\n    }\n  }\n  `;\n\n    const newDocument = {\n      textDocument: {\n        text: validQuery,\n        uri: `${queryPathUri}/test3.graphql`,\n        version: 1,\n      },\n    };\n    messageProcessor._getCachedDocument = (_uri: string) => ({\n      version: 1,\n      contents: [\n        {\n          query: validQuery,\n          range: new Range(new Position(0, 0), new Position(20, 4)),\n        },\n      ],\n    });\n\n    await messageProcessor.handleDidOpenOrSaveNotification(newDocument);\n\n    const test = {\n      position: new Position(3, 15),\n      textDocument: newDocument.textDocument,\n    };\n\n    const result = await messageProcessor.handleDefinitionRequest(test);\n    expect(result[0].uri).toEqual(`${queryPathUri}/test3.graphql`);\n  });\n\n  it('retrieves custom results from locateCommand', async () => {\n    jest.setTimeout(10000);\n    const validQuery = `\n  {\n    hero(episode: EMPIRE){\n      ...testFragment\n    }\n  }\n  `;\n\n    const newDocument = {\n      textDocument: {\n        text: validQuery,\n        uri: `${queryPathUri}/test3.graphql`,\n        version: 1,\n      },\n    };\n    messageProcessor._getCachedDocument = (_uri: string) => ({\n      version: 1,\n      contents: [\n        {\n          query: validQuery,\n          range: new Range(new Position(0, 0), new Position(20, 4)),\n        },\n      ],\n    });\n\n    await messageProcessor.handleDidOpenOrSaveNotification(newDocument);\n\n    const test = {\n      position: new Position(3, 15),\n      textDocument: newDocument.textDocument,\n    };\n    const result = await messageProcessor._languageService.getDefinition(\n      validQuery,\n      test.position,\n      test.textDocument.uri,\n    );\n    const project = messageProcessor._graphQLCache.getProjectForFile(\n      test.textDocument.uri,\n    );\n\n    const customResult = messageProcessor._getCustomLocateResult(\n      project,\n      { definitions: result, printedName: 'example' },\n      () => 'hello',\n    );\n    expect(customResult.uri).toEqual('hello');\n\n    const customResult2 = messageProcessor._getCustomLocateResult(\n      project,\n      { definitions: result, printedName: 'example' },\n      () => 'hello:2:4',\n    );\n    expect(customResult2.uri).toEqual('hello');\n    expect(customResult2.range.start.line).toEqual(1);\n    expect(customResult2.range.start.character).toEqual(3);\n    expect(customResult2.range.end.line).toEqual(1);\n    expect(customResult2.range.end.character).toEqual(3);\n    const customResult3 = messageProcessor._getCustomLocateResult(\n      project,\n      { definitions: result, printedName: 'example' },\n      () => ({\n        uri: 'hello1',\n        range: {\n          start: { character: 2, line: 2 },\n          end: { character: 4, line: 4 },\n        },\n      }),\n    );\n    expect(customResult3.uri).toEqual('hello1');\n    expect(customResult3.range.start.line).toEqual(2);\n    expect(customResult3.range.start.character).toEqual(2);\n    expect(customResult3.range.end.line).toEqual(4);\n    expect(customResult3.range.end.character).toEqual(4);\n    const oldGetProject = messageProcessor._graphQLCache.getProjectForFile;\n\n    messageProcessor._graphQLCache.getProjectForFile = jest.fn(() => ({\n      schema: project.schema,\n      documents: project.documents,\n      dirpath: project.dirpath,\n      extensions: {\n        languageService: { locateCommand: () => 'foo:3:4' },\n      },\n    }));\n    const result2 = await messageProcessor.handleDefinitionRequest(test);\n    expect(result2[0].range.start.line).toBe(2);\n    expect(result2[0].range.start.character).toBe(3);\n    expect(result2[0].range.end.line).toBe(2);\n    expect(result2[0].range.end.character).toBe(3);\n    messageProcessor._graphQLCache.getProjectForFile = oldGetProject;\n  });\n  it('runs hover requests', async () => {\n    const validQuery = `\n  {\n    hero(episode: EMPIRE){\n      ...testFragment\n    }\n  }\n  `;\n\n    const newDocument = {\n      textDocument: {\n        text: validQuery,\n        uri: `${queryPathUri}/test4.graphql`,\n        version: 1,\n      },\n    };\n    messageProcessor._getCachedDocument = (_uri: string) => ({\n      version: 1,\n      contents: [\n        {\n          query: validQuery,\n          range: new Range(new Position(0, 0), new Position(20, 4)),\n        },\n      ],\n    });\n\n    await messageProcessor.handleDidOpenOrSaveNotification(newDocument);\n\n    const test = {\n      position: new Position(3, 15),\n      textDocument: newDocument.textDocument,\n    };\n\n    const result = await messageProcessor.handleHoverRequest(test);\n    expect(JSON.stringify(result.contents)).toEqual(\n      JSON.stringify({\n        contents: '```graphql\\nField: hero\\n```',\n        range: new Range(new Position(3, 15), new Position(3, 15)),\n      }),\n    );\n  });\n  it('runs hover request with no file present', async () => {\n    const test = {\n      position: new Position(3, 15),\n      textDocument: {\n        uri: `${queryPathUri}/test5.graphql`,\n        version: 1,\n      },\n    };\n    messageProcessor._getCachedDocument = (_uri: string) => null;\n\n    const result = await messageProcessor.handleHoverRequest(test);\n    expect(result).toBeNull();\n  });\n  it('handles provided config', async () => {\n    const msgProcessor = new MessageProcessor({\n      // @ts-ignore\n      connection: {\n        workspace: {\n          getConfiguration() {\n            return {};\n          },\n        },\n      },\n      logger,\n      graphqlFileExtensions: ['graphql'],\n      loadConfigOptions: { rootDir: __dirname },\n      config: gqlConfig,\n    });\n    expect(msgProcessor._providedConfig).toBeTruthy();\n    await msgProcessor.handleInitializeRequest(\n      // @ts-ignore\n      {\n        rootPath: __dirname,\n      },\n      null,\n      __dirname,\n    );\n    await msgProcessor.handleDidChangeConfiguration({\n      settings: {},\n    });\n    expect(msgProcessor._graphQLCache).toBeTruthy();\n  });\n\n  it('runs workspace symbol requests', async () => {\n    const msgProcessor = new MessageProcessor({\n      // @ts-ignore\n      connection: {},\n      logger,\n      graphqlFileExtensions: ['graphql'],\n      loadConfigOptions: { rootDir: __dirname },\n    });\n    await msgProcessor.handleInitializeRequest(\n      // @ts-ignore\n      {\n        rootPath: __dirname,\n      },\n      null,\n      __dirname,\n    );\n    const uri = `${queryPathUri}/test6.graphql`;\n    const docUri = `${queryPathUri}/test7.graphql`;\n    const validQuery = `\n  {\n    hero(episode: EMPIRE){\n      ...testFragment\n    }\n  }\n  `;\n    const validDocument = `\n  fragment testFragment on Character {\n    name\n    }`;\n    msgProcessor._graphQLCache = new GraphQLCache({\n      configDir: __dirname,\n      config: await loadConfig({ rootDir: __dirname }),\n      parser: parseDocument,\n      logger: new NoopLogger(),\n    });\n    msgProcessor._languageService = {\n      getDocumentSymbols: async () => [\n        {\n          name: 'testFragment',\n          kind: SymbolKind.Field,\n          location: {\n            uri,\n            range: {\n              start: { line: 1, character: 2 },\n              end: { line: 1, character: 4 },\n            },\n          },\n        },\n      ],\n    };\n    msgProcessor._isInitialized = true;\n    msgProcessor._textDocumentCache.set(uri, {\n      version: 0,\n      contents: [\n        {\n          query: validQuery,\n          range: new Range(new Position(0, 0), new Position(6, 0)),\n        },\n      ],\n    });\n\n    await msgProcessor._graphQLCache.updateFragmentDefinition(\n      __dirname,\n      docUri,\n      [\n        {\n          query: validDocument,\n          range: new Range(new Position(0, 0), new Position(4, 0)),\n        },\n      ],\n    );\n\n    const test = {\n      query: 'testFragment',\n    };\n\n    const result = await msgProcessor.handleWorkspaceSymbolRequest(test);\n    expect(result).not.toBeUndefined();\n    expect(result.length).toEqual(1);\n    expect(result[0].name).toEqual('testFragment');\n    expect(result[0].kind).toEqual(SymbolKind.Field);\n    expect(result[0].location.range).toEqual({\n      start: { line: 1, character: 2 },\n      end: { line: 1, character: 4 },\n    });\n  });\n\n  describe('_loadConfigOrSkip', () => {\n    const mockReadFileSync: jest.Mock =\n      jest.requireMock('node:fs').readFileSync;\n\n    beforeEach(() => {\n      mockReadFileSync.mockReturnValue('');\n      messageProcessor._initializeGraphQLCaches = jest.fn();\n    });\n\n    it('loads config if not initialized', async () => {\n      messageProcessor._isInitialized = false;\n\n      const result = await messageProcessor._loadConfigOrSkip(\n        `${pathToFileURL('.')}/graphql.config.js`,\n      );\n      expect(messageProcessor._initializeGraphQLCaches).toHaveBeenCalledTimes(\n        1,\n      );\n      // we want to return true here to skip further processing, because it's just a config file change\n      expect(result).toEqual(true);\n    });\n\n    it('loads config if a file change occurs and the server is not initialized', async () => {\n      messageProcessor._isInitialized = false;\n\n      const result = await messageProcessor._loadConfigOrSkip(\n        `${pathToFileURL('.')}/file.ts`,\n      );\n      expect(messageProcessor._initializeGraphQLCaches).toHaveBeenCalledTimes(\n        1,\n      );\n      // here we have a non-config file, so we don't want to skip, because we need to run diagnostics etc\n      expect(result).toEqual(false);\n    });\n    it('config file change updates server config even if the server is already initialized', async () => {\n      messageProcessor._isInitialized = true;\n      const result = await messageProcessor._loadConfigOrSkip(\n        `${pathToFileURL('.')}/graphql.config.ts`,\n      );\n      expect(messageProcessor._initializeGraphQLCaches).toHaveBeenCalledTimes(\n        1,\n      );\n      expect(result).toEqual(true);\n    });\n    it('skips if the server is already initialized', async () => {\n      messageProcessor._isInitialized = true;\n      const result = await messageProcessor._loadConfigOrSkip(\n        `${pathToFileURL('.')}/myFile.ts`,\n      );\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(result).toEqual(false);\n    });\n  });\n\n  describe('handleDidOpenOrSaveNotification', () => {\n    const mockReadFileSync: jest.Mock =\n      jest.requireMock('node:fs').readFileSync;\n\n    beforeEach(() => {\n      mockReadFileSync.mockReturnValue('');\n      messageProcessor._initializeGraphQLCaches = jest.fn();\n      messageProcessor._loadConfigOrSkip = jest.fn();\n    });\n    it('updates config for standard config filename changes', async () => {\n      await messageProcessor.handleDidOpenOrSaveNotification({\n        textDocument: {\n          uri: `${pathToFileURL('.')}/.graphql.config.js`,\n          languageId: 'js',\n          version: 0,\n          text: '',\n        },\n      });\n      expect(messageProcessor._loadConfigOrSkip).toHaveBeenCalled();\n    });\n\n    it('updates config for custom config filename changes', async () => {\n      const customConfigName = 'custom-config-name.yml';\n      messageProcessor._settings = { load: { fileName: customConfigName } };\n\n      await messageProcessor.handleDidOpenOrSaveNotification({\n        textDocument: {\n          uri: `${pathToFileURL('.')}/${customConfigName}`,\n          languageId: 'js',\n          version: 0,\n          text: '',\n        },\n      });\n\n      expect(messageProcessor._loadConfigOrSkip).toHaveBeenCalledWith(\n        expect.stringContaining(customConfigName),\n      );\n    });\n\n    it('handles config requests with no config', async () => {\n      messageProcessor._settings = {};\n\n      await messageProcessor.handleDidChangeConfiguration({\n        settings: [],\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).toHaveBeenCalled();\n\n      await messageProcessor.handleDidOpenOrSaveNotification({\n        textDocument: {\n          uri: `${pathToFileURL('.')}/.graphql.config.js`,\n          languageId: 'js',\n          version: 0,\n          text: '',\n        },\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).toHaveBeenCalled();\n    });\n  });\n\n  describe('_handleConfigErrors', () => {\n    it('handles missing config errors', async () => {\n      messageProcessor._handleConfigError({\n        err: new ConfigNotFoundError('test missing-config'),\n        uri: 'test',\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(logger.error).toHaveBeenCalledWith(\n        expect.stringContaining('test missing-config'),\n      );\n    });\n    it('handles missing project errors', async () => {\n      messageProcessor._handleConfigError({\n        err: new ProjectNotFoundError('test missing-project'),\n        uri: 'test',\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(logger.error).toHaveBeenCalledWith(\n        expect.stringContaining('Project not found for this file'),\n      );\n    });\n    it('handles invalid config errors', async () => {\n      messageProcessor._handleConfigError({\n        err: new ConfigInvalidError('test invalid error'),\n        uri: 'test',\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(logger.error).toHaveBeenCalledWith(\n        expect.stringContaining('Invalid configuration'),\n      );\n    });\n    it('handles empty loader result errors', async () => {\n      messageProcessor._handleConfigError({\n        err: new LoaderNoResultError('test loader-error'),\n        uri: 'test',\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(logger.error).toHaveBeenCalledWith(\n        expect.stringContaining('test loader-error'),\n      );\n    });\n    it('handles generic errors', async () => {\n      messageProcessor._handleConfigError({\n        err: new Error('test loader-error'),\n        uri: 'test',\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(logger.error).toHaveBeenCalledWith(\n        expect.stringContaining('test loader-error'),\n      );\n    });\n  });\n  describe('handleWatchedFilesChangedNotification', () => {\n    const mockReadFileSync: jest.Mock =\n      jest.requireMock('node:fs').readFileSync;\n\n    beforeEach(() => {\n      mockReadFileSync.mockReturnValue(' query { id }');\n      messageProcessor._initializeGraphQLCaches = jest.fn();\n      messageProcessor._updateFragmentDefinition = jest.fn();\n      messageProcessor._isGraphQLConfigMissing = false;\n      messageProcessor._isInitialized = true;\n    });\n\n    it('skips config updates for normal file changes', async () => {\n      await messageProcessor.handleWatchedFilesChangedNotification({\n        changes: [\n          {\n            uri: `${pathToFileURL(\n              join(__dirname, '__queries__'),\n            )}/test.graphql`,\n            type: FileChangeType.Changed,\n          },\n        ],\n      });\n\n      expect(messageProcessor._initializeGraphQLCaches).not.toHaveBeenCalled();\n      expect(messageProcessor._updateFragmentDefinition).toHaveBeenCalled();\n    });\n  });\n\n  describe('handleWatchedFilesChangedNotification without graphql config', () => {\n    const mockReadFileSync: jest.Mock =\n      jest.requireMock('node:fs').readFileSync;\n\n    beforeEach(() => {\n      mockReadFileSync.mockReturnValue('');\n      messageProcessor._isGraphQLConfigMissing = true;\n      messageProcessor._parser = jest.fn();\n    });\n\n    it('skips config updates for normal file changes', async () => {\n      await messageProcessor.handleWatchedFilesChangedNotification({\n        changes: [\n          {\n            uri: `${pathToFileURL('.')}/foo.js`,\n            type: FileChangeType.Changed,\n          },\n        ],\n      });\n      expect(messageProcessor._parser).not.toHaveBeenCalled();\n    });\n  });\n\n  describe('handleDidChangedNotification without graphql config', () => {\n    const mockReadFileSync: jest.Mock =\n      jest.requireMock('node:fs').readFileSync;\n\n    beforeEach(() => {\n      mockReadFileSync.mockReturnValue('');\n      messageProcessor._isGraphQLConfigMissing = true;\n      messageProcessor._parser = jest.fn();\n    });\n\n    it('skips config updates for normal file changes', async () => {\n      await messageProcessor.handleDidChangeNotification({\n        textDocument: {\n          uri: `${pathToFileURL('.')}/foo.js`,\n          version: 1,\n        },\n        contentChanges: [{ text: 'var something' }],\n      });\n      expect(messageProcessor._parser).not.toHaveBeenCalled();\n    });\n  });\n});\n\ndescribe('processDiagnosticsMessage', () => {\n  it('processes diagnostics messages', () => {\n    const query = 'query { foo }';\n    const inputRange = new Range(new Position(1, 1), new Position(1, 1));\n\n    const diagnostics = processDiagnosticsMessage(\n      [\n        {\n          severity: 1,\n          message: 'test',\n          source: 'GraphQL: Validation',\n          range: inputRange,\n        },\n      ],\n      query,\n      inputRange,\n    );\n\n    expect(JSON.stringify(diagnostics)).toEqual(\n      JSON.stringify([\n        {\n          severity: 1,\n          message: 'test',\n          source: 'GraphQL: Validation',\n          range: new Range(new Position(2, 1), new Position(2, 1)),\n        },\n      ]),\n    );\n  });\n  it('processes diagnostics messages with null range', () => {\n    const query = 'query { foo }';\n    const inputRange = new Range(new Position(1, 1), new Position(1, 1));\n\n    const diagnostics = processDiagnosticsMessage(\n      [\n        {\n          severity: 1,\n          message: 'test',\n          source: 'GraphQL: Validation',\n          range: inputRange,\n        },\n      ],\n      query,\n      null,\n    );\n\n    expect(JSON.stringify(diagnostics)).toEqual(\n      JSON.stringify([\n        {\n          severity: 1,\n          message: 'test',\n          source: 'GraphQL: Validation',\n          range: inputRange,\n        },\n      ]),\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__queries__/test.graphql",
    "content": "{\n  hero(episode: NEWHOPE) {\n    secretBackstory\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__queries__/test2.graphql",
    "content": ""
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__queries__/test3.graphql",
    "content": "{\n  hero(episode: EMPIRE) {\n    ...testFragment\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__queries__/testFragment.graphql",
    "content": "fragment testFragment on Character {\n  name\n  appearsIn\n  friends {\n    name\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__schema__/StarWarsSchema.graphql",
    "content": "# Copyright (c) 2021 GraphQL Contributors\n\nschema {\n  query: Query\n}\n\ndirective @test(testArg: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\n\nenum Episode {\n  NEWHOPE\n  EMPIRE\n  JEDI\n}\n\ninterface Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Human implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Droid implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n  primaryFunction: String\n}\n\ninput InputType {\n  key: String!\n  value: Int = 42\n}\n\ntype TestType {\n  testField: String\n}\n\ntype Query {\n  hero(episode: Episode): Character\n  human(id: String!): Human\n  droid(id: String!): Droid\n  inputTypeTest(args: InputType = { key: \"key\" }): TestType\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__utils__/MockProject.ts",
    "content": "import mockfs from 'mock-fs';\nimport { MessageProcessor } from '../../MessageProcessor';\nimport { Logger as VSCodeLogger } from 'vscode-jsonrpc';\nimport { URI } from 'vscode-uri';\nimport { FileChangeType } from 'vscode-languageserver';\nimport { FileChangeTypeKind } from 'graphql-language-service';\n\nexport type MockFile = [filename: string, text: string];\n\nexport class MockLogger implements VSCodeLogger {\n  error = jest.fn();\n  warn = jest.fn();\n  info = jest.fn();\n  log = jest.fn();\n}\n\n// when using mockfs with cosmic-config, a dynamic inline\n// require of parse-json creates the necessity for loading in the actual\n// modules to the mocked filesystem\nconst modules = [\n  'parse-json',\n  'error-ex',\n  'is-arrayish',\n  'json-parse-even-better-errors',\n  'lines-and-columns',\n  '@babel/code-frame',\n  // these i think are just required by jest when you console log from a test\n  'jest-message-util',\n  'stack-utils',\n  'pretty-format',\n  'ansi-regex',\n  'js-tokens',\n  'escape-string-regexp',\n  'jest-worker',\n  'jiti',\n  'cosmiconfig',\n  'minimatch',\n  'tslib',\n];\nconst defaultMocks = modules.reduce((acc, module) => {\n  acc[`node_modules/${module}`] = mockfs.load(`node_modules/${module}`);\n  return acc;\n}, {});\n\ntype File = [filename: string, text: string];\ntype Files = File[];\n\nexport class MockProject {\n  private root: string;\n  private fileCache: Map<string, string>;\n  private messageProcessor: MessageProcessor;\n  constructor({\n    files = [],\n    root = '/tmp/test',\n    settings,\n  }: {\n    files: Files;\n    root?: string;\n    settings?: Record<string, any>;\n  }) {\n    this.root = root;\n    this.fileCache = new Map(files);\n\n    this.mockFiles();\n    this.messageProcessor = new MessageProcessor({\n      connection: {\n        get workspace() {\n          return {\n            async getConfiguration() {\n              return settings;\n            },\n          };\n        },\n      },\n      logger: new MockLogger(),\n      loadConfigOptions: {\n        rootDir: root,\n      },\n    });\n  }\n\n  public async init(filename?: string, fileText?: string) {\n    await this.lsp.handleInitializeRequest({\n      rootPath: this.root,\n      rootUri: this.root,\n      capabilities: {},\n      processId: 200,\n      workspaceFolders: null,\n    });\n    return this.lsp.handleDidOpenOrSaveNotification({\n      textDocument: {\n        uri: this.uri(filename || 'query.graphql'),\n        version: 1,\n        text:\n          this.fileCache.get('query.graphql') ||\n          (filename && this.fileCache.get(filename)) ||\n          fileText,\n      },\n    });\n  }\n  private mockFiles() {\n    const mockFiles = {\n      ...defaultMocks,\n      // without this, the generated schema file may not be cleaned up by previous tests\n      '/tmp/graphql-language-service': mockfs.directory(),\n    };\n    for (const [filename, text] of this.fileCache) {\n      mockFiles[this.filePath(filename)] = text;\n    }\n    mockfs(mockFiles);\n  }\n  public filePath(filename: string) {\n    return `${this.root}/${filename}`;\n  }\n  public uri(filename: string) {\n    return URI.file(this.filePath(filename)).toString();\n  }\n  changeFile(filename: string, text: string) {\n    this.fileCache.set(filename, text);\n    this.mockFiles();\n  }\n  async addFile(filename: string, text: string, watched = false) {\n    this.fileCache.set(filename, text);\n    this.mockFiles();\n    if (watched) {\n      await this.lsp.handleWatchedFilesChangedNotification({\n        changes: [\n          {\n            uri: this.uri(filename),\n            type: FileChangeTypeKind.Created,\n          },\n        ],\n      });\n    }\n    await this.lsp.handleDidChangeNotification({\n      contentChanges: [\n        {\n          type: FileChangeTypeKind.Created,\n          text,\n        },\n      ],\n      textDocument: {\n        uri: this.uri(filename),\n        version: 2,\n      },\n    });\n  }\n  async changeWatchedFile(filename: string, text: string) {\n    this.changeFile(filename, text);\n    await this.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        {\n          uri: this.uri(filename),\n          type: FileChangeType.Changed,\n        },\n      ],\n    });\n  }\n  async saveOpenFile(filename: string, text: string) {\n    this.changeFile(filename, text);\n    await this.lsp.handleDidOpenOrSaveNotification({\n      textDocument: {\n        uri: this.uri(filename),\n        version: 2,\n        text,\n      },\n    });\n  }\n  async addWatchedFile(filename: string, text: string) {\n    this.changeFile(filename, text);\n    await this.lsp.handleDidChangeNotification({\n      contentChanges: [\n        {\n          type: FileChangeTypeKind.Created,\n          text,\n        },\n      ],\n      textDocument: {\n        uri: this.uri(filename),\n        version: 2,\n      },\n    });\n  }\n  async deleteFile(filename: string) {\n    mockfs.restore();\n    this.fileCache.delete(filename);\n    this.mockFiles();\n    await this.lsp.handleWatchedFilesChangedNotification({\n      changes: [\n        {\n          type: FileChangeType.Deleted,\n          uri: this.uri(filename),\n        },\n      ],\n    });\n  }\n  get lsp() {\n    return this.messageProcessor;\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__utils__/runServer.js",
    "content": "exports.default = require('../../../../graphiql/test/e2e-server.js');\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/__utils__/utils.ts",
    "content": "import { Range } from 'vscode-languageserver';\n\nexport const serializeRange = (range: Range) =>\n  JSON.parse(JSON.stringify(range));\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/findGraphQLTags.test.ts",
    "content": "/**\n *  Copyright (c) 2022 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Position, Range } from 'graphql-language-service';\nimport { findGraphQLTags as baseFindGraphQLTags } from '../findGraphQLTags';\n\njest.mock('../Logger');\n\nimport { NoopLogger } from '../Logger';\nimport { SupportedExtensionsEnum } from '../constants';\n\ndescribe('findGraphQLTags', () => {\n  const logger = new NoopLogger();\n  const findGraphQLTags = (text: string, ext: SupportedExtensionsEnum) =>\n    baseFindGraphQLTags(text, ext, '', logger);\n\n  it('returns empty for files without asts', async () => {\n    const text = '// just a comment';\n    const contents = await findGraphQLTags(text, '.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('finds queries in tagged templates', async () => {\n    const text = `\n// @flow\nimport {gql} from 'react-apollo';\nimport type {B} from 'B';\nimport A from './A';\n\nconst QUERY = gql\\`\nquery Test {\n    test {\n    value\n    ...FragmentsComment\n    }\n}\n\\${A.fragments.test}\n\\`\n\nexport function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.js');\n    expect(contents[0].template).toEqual(`\nquery Test {\n    test {\n    value\n    ...FragmentsComment\n    }\n}\n`);\n  });\n\n  it('finds queries in call expressions with template literals', async () => {\n    const text = `\n    // @flow\n    import {gql} from 'react-apollo';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = gql(\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`);\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.js');\n    expect(contents[0].template).toEqual(`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n\n  it('finds queries in call expressions with with newlines preceding the template', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = gql(\n  \\`\n  query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\`);\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.ts');\n    expect(contents[0].template).toEqual(`\n  query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    `);\n  });\n\n  it('finds queries in #graphql-annotated templates', async () => {\n    const text = `\nimport {gql} from 'react-apollo';\nimport {B} from 'B';\nimport A from './A';\n\nconst QUERY: string = \\`#graphql\nquery Test {\n  test {\n    value\n    ...FragmentsComment\n  }\n}\n\\${A.fragments.test}\n\\`\n\nexport function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.ts');\n    expect(contents[0].template).toEqual(`#graphql\nquery Test {\n  test {\n    value\n    ...FragmentsComment\n  }\n}\n\n`);\n  });\n\n  it('finds queries in /* GraphQL */ prefixed templates', async () => {\n    const text = `\nimport {gql} from 'react-apollo';\nimport {B} from 'B';\nimport A from './A';\n\n\nconst QUERY: string = /* GraphQL */ \\`\nquery Test {\n  test {\n    value\n    ...FragmentsComment\n  }\n}\n\\${A.fragments.test}\n\\`\n\nexport function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.ts');\n    expect(contents[0].template).toEqual(`\nquery Test {\n  test {\n    value\n    ...FragmentsComment\n  }\n}\n\n`);\n  });\n\n  it('finds queries with nested graphql.experimental template tag expression', async () => {\n    const text = 'const query = graphql.experimental` query {} `';\n\n    const contents = await findGraphQLTags(text, '.ts');\n    expect(contents[0].template).toEqual(' query {} ');\n  });\n\n  it('finds queries with spec decorators', async () => {\n    const text = `\n    \n      @a class A {}\n      const query = graphql\\` query {} \\` \n    \n    `;\n    const contents = await findGraphQLTags(text, '.ts');\n\n    expect(contents[0].template).toEqual(' query {} ');\n  });\n\n  it('finds queries with es7 decorators', async () => {\n    const text = `\n   \n    class C {\n      state = {isLoading: true}\n      @enumerable(false)\n      method() {}\n      @something\n      onChange() {}\n    }\n\n    // 'legacy-decorators' does'nt like this this. thus why the modes are incompatible\n    class MyClass1 extends Component {\n      state = {isLoading: true}\n      \n      @something\n      onChange() {}\n      \n      @something()\n      handleSubmit() {}\n    }\n    \n    @isTestable(true)\n    class MyClass {}\n    \n    @Module({\n      imports: [\n        GraphQLModule.forRoot({\n          debug: false,\n          playground: false,\n        }),\n      ],\n    })\n\n    class A {}\n    \n@Decorator.a.b()\nclass Todo {}\n\n@Decorator.d().e\nclass Todo2{}\n\n    @a\n   class AppModule {}\n      const query = graphql\\` query {} \\` \n    `;\n    const contents = await findGraphQLTags(text, '.ts');\n\n    expect(contents[0].template).toEqual(' query {} ');\n  });\n\n  it('finds queries with nested template tag expressions', async () => {\n    const text = `export default {\n  else: () => gql\\` query {} \\`\n}`;\n\n    const contents = await findGraphQLTags(text, '.ts');\n    expect(contents[0].template).toEqual(' query {} ');\n  });\n\n  it('finds queries with template tags inside call expressions', async () => {\n    const text = `something({\n  else: () => graphql\\` query {} \\`\n})`;\n\n    const contents = await findGraphQLTags(text, '.ts');\n    expect(contents[0].template).toEqual(' query {} ');\n  });\n\n  it('finds queries in tagged templates in Vue SFC using <script setup>', async () => {\n    const text = `\n<script setup lang=\"ts\">\ngql\\`\nquery {id}\n\\`;\n</script>\n`;\n    const contents = await findGraphQLTags(text, '.vue');\n    expect(contents[0].template).toEqual(`\nquery {id}`);\n    expect(contents[0].range.start.line).toEqual(2);\n    expect(contents[0].range.end.line).toEqual(4);\n  });\n\n  it('finds queries in tagged templates in Vue SFC using <script setup> and template above', async () => {\n    const text = `<template>\n      <div/>\n    </template>\n<script setup lang=\"ts\">\ngql\\`\nquery {id}\n\\`;\n</script>\n`;\n    const contents = await findGraphQLTags(text, '.vue');\n    expect(contents[0].template).toEqual(`\nquery {id}`);\n    expect(contents[0].range.start.line).toEqual(4);\n    expect(contents[0].range.end.line).toEqual(6);\n  });\n\n  it('finds queries in tagged templates in Vue SFC using normal <script>', async () => {\n    const text = `\n<script lang=\"ts\">\ngql\\`\nquery {id}\n\\`;\n</script>\n`;\n    const contents = await findGraphQLTags(text, '.vue');\n    expect(contents[0].template).toEqual(`\nquery {id}`);\n    expect(contents[0].range.start.line).toEqual(2);\n    expect(contents[0].range.end.line).toEqual(4);\n  });\n\n  it('finds queries in tagged templates in Vue SFC using normal <script> and template above', async () => {\n    const text = `<template>\n    <div/>\n  </template>\n<script lang=\"ts\">\ngql\\`\nquery {id}\n\\`;\n</script>\n`;\n    const contents = await findGraphQLTags(text, '.vue');\n    expect(contents[0].template).toEqual(`\nquery {id}`);\n    expect(contents[0].range.start.line).toEqual(4);\n    expect(contents[0].range.end.line).toEqual(6);\n  });\n\n  it('finds queries in tagged templates in Vue SFC using <script lang=\"tsx\">', async () => {\n    const text = `\n<script lang=\"tsx\">\nimport { defineComponent } from 'vue';\n\ngql\\`\nquery {id}\n\\`;\n\nexport default defineComponent({\n  setup() {\n    return () => <div>Hello</div>\n  }\n});\n</script>\n`;\n\n    const contents = await findGraphQLTags(text, '.vue');\n    expect(contents[0].template).toEqual(`\nquery {id}`);\n  });\n\n  it('finds queries in tagged templates in Svelte using normal <script>', async () => {\n    const text = `\n    <script context=\"module\">\n    const query = graphql(\\`\n    query AllCharacters {\n        characters {\n            results {\n                name\n                id\n                image\n            }\n        }\n    }\n\\`)\n    export async function load({fetch}) {\n        return { \n            props: {\n                _data: await fetch({\n                    text: query\n                })\n              }\n            }\n        }\n  \n</script>\n`;\n    const contents = await findGraphQLTags(text, '.svelte');\n    expect(contents[0].template).toEqual(`\n    query AllCharacters {\n        characters {\n            results {\n                name\n                id\n                image\n            }\n        }\n    }\n`);\n\n    expect(JSON.stringify(contents[0].range)).toEqual(\n      JSON.stringify(new Range(new Position(2, 29), new Position(12, 0))),\n    );\n  });\n\n  it('no crash in Svelte files without <script>', async () => {\n    const text = '';\n\n    const consoleErrorSpy = jest\n      .spyOn(process.stderr, 'write')\n      .mockImplementation(() => true);\n\n    const contents = await baseFindGraphQLTags(\n      text,\n      '.svelte',\n      '',\n      new NoopLogger(),\n    );\n    // We should have no contents\n    expect(contents).toMatchObject([]);\n\n    // Nothing should be logged as it's a managed error\n    expect(consoleErrorSpy.mock.calls.length).toBe(0);\n\n    consoleErrorSpy.mockRestore();\n  });\n\n  it('no crash in Svelte files with empty <script>', async () => {\n    const text = '<script></script>';\n\n    const consoleErrorSpy = jest\n      .spyOn(process.stderr, 'write')\n      .mockImplementation(() => true);\n\n    const contents = await baseFindGraphQLTags(\n      text,\n      '.svelte',\n      '',\n      new NoopLogger(),\n    );\n    // We should have no contents\n    expect(contents).toMatchObject([]);\n\n    // Nothing should be logged as it's a managed error\n    expect(consoleErrorSpy.mock.calls.length).toBe(0);\n\n    consoleErrorSpy.mockRestore();\n  });\n\n  it('no crash in Svelte files with empty <script> (typescript)', async () => {\n    const text = '<script lang=\"ts\"></script>';\n\n    const consoleErrorSpy = jest\n      .spyOn(process.stderr, 'write')\n      .mockImplementation(() => true);\n\n    const contents = await baseFindGraphQLTags(\n      text,\n      '.svelte',\n      '',\n      new NoopLogger(),\n    );\n    // We should have no contents\n    expect(contents).toMatchObject([]);\n\n    // Nothing should be logged as it's a managed error\n    expect(consoleErrorSpy.mock.calls.length).toBe(0);\n\n    consoleErrorSpy.mockRestore();\n  });\n\n  it('finds multiple queries in a single file', async () => {\n    const text = `something({\n  else: () => gql\\` query {} \\`\n})\nconst query = graphql\\`query myQuery {}\\``;\n\n    const contents = await findGraphQLTags(text, '.ts');\n\n    expect(contents.length).toEqual(2);\n\n    // let's double check that we're properly\n    // extracting the positions of each embedded string\n    expect(contents[0].range.start.line).toEqual(1);\n    expect(contents[0].range.start.character).toEqual(18);\n    expect(contents[0].range.end.line).toEqual(1);\n    expect(contents[0].range.end.character).toEqual(28);\n    expect(contents[0].template).toEqual(' query {} ');\n\n    // and the second string, with correct positional information!\n    expect(contents[1].range.start.line).toEqual(3);\n    expect(contents[1].range.start.character).toEqual(22);\n    expect(contents[1].range.end.line).toEqual(3);\n    expect(contents[1].range.end.character).toEqual(38);\n    expect(contents[1].template).toEqual('query myQuery {}');\n  });\n\n  it('ignores non gql tagged templates', async () => {\n    const text = `\n// @flow\nimport randomthing from 'package';\nimport type {B} from 'B';\nimport A from './A';\n\nconst QUERY = randomthing\\`\nquery Test {\n  test {\n    value\n    ...FragmentsComment\n  }\n}\n\\${A.fragments.test}\n\\`\n\nexport function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('ignores non gql call expressions with template literals', async () => {\n    const text = `\n// @flow\nimport randomthing from 'package';\nimport type {B} from 'B';\nimport A from './A';\n\nconst QUERY = randomthing(\\`\nquery Test {\n  test {\n    value\n    ...FragmentsComment\n  }\n}\n\\${A.fragments.test}\n\\`);\n\nexport function Example(arg: string) {}`;\n\n    const contents = await findGraphQLTags(text, '.js');\n    expect(contents.length).toEqual(0);\n  });\n  it('handles full svelte example', async () => {\n    const text = `\n    <script>\n    import { ApolloClient, gql } from '@apollo/client';\n    import { setClient, getClient, query } from 'svelte-apollo';\n    import { onMount } from 'svelte';\n    let country;\n    const QUERY = gql\\`\n        query GetCountryData {\n            countries(namePrefix: \"America\") {\n                edges {\n                    node {\n                        name\n                        flagImageUri\n                    }\n                }\n            }\n        }\n    \\`;\n    const client = new ApolloClient({\n        uri: 'https://geodb-cities-graphql.p.rapidapi.com/',\n    });\n    setClient(client);\n    onMount(async () => {\n        const response = query(client, { query: QUERY });\n        country = response.data;\n    });\n</script>\n<div>\n    {#if country}\n        <h2>\n            {country.name}\n        </h2>\n        <img src={country.flagImageUri} alt=\"Country Flag\" />\n    {:else}\n        <p>loading...</p>\n    {/if}\n</div>\n    `;\n    const contents = await findGraphQLTags(text, '.svelte');\n    expect(contents.length).toEqual(1);\n  });\n\n  it('handles full astro example', async () => {\n    const text = `\n    ---\n    const gql = String.raw;\n    const response = await fetch(\"https://swapi-graphql.netlify.app/.netlify/functions/index\",\n      {\n        method: 'POST',\n        headers: {'Content-Type':'application/json'},\n        body: JSON.stringify({\n          query: gql\\`\n            query getFilm ($id:ID!) {\n              film(id: $id) {\n                title\n                releaseDate\n              }\n            }\n          \\`,\n          variables: {\n            id: \"XM6MQ==\",\n          },\n        }),\n      });\n\n    const json = await response.json();\n    const { film } = json.data;\n    ---\n    <h1>Fetching information about Star Wars: A New Hope</h1>\n    <h2>Title: {film.title}</h2>\n    <p>Year: {film.releaseDate}</p>`;\n    const contents = await findGraphQLTags(text, '.astro');\n    expect(contents.length).toEqual(1);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/parseDocument.test.ts",
    "content": "import { parseDocument } from '../parseDocument';\n\ndescribe('parseDocument', () => {\n  it('parseDocument finds queries in tagged templates', async () => {\n    const text = `\n    // @flow\n    import {gql} from 'react-apollo';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = gql\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n\n  it('parseDocument finds queries in tagged templates in leaf', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = gql\\`\n    query Test {\n      test {\n        \\${A.fragments.test}\n      }\n    }\n    \\`\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        __typename\n      }\n    }\n    `);\n  });\n\n  it('parseDocument finds queries in tagged templates using typescript', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    \n    const QUERY: string = gql\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.ts');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n\n  it('parseDocument finds queries in tagged templates using tsx', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    \n    const QUERY: string = gql\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {\n      return <div>{QUERY}</div>\n    }`;\n\n    const contents = await parseDocument(text, 'test.tsx');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n\n  it('parseDocument finds queries in multi-expression tagged templates using tsx', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    const someValue = 'value'\n    const QUERY: string = gql\\`\n    query Test {\n      test {\n        value\n        $\\{someValue}\n        ...FragmentsComment\n      }\n      $\\{someValue}\n    }\\`\n    \n    export function Example(arg: string) {\n      return <div>{QUERY}</div>\n    }`;\n\n    const contents = await parseDocument(text, 'test.tsx');\n\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        \n        ...FragmentsComment\n      }\n      \n    }`);\n  });\n  // TODO: why an extra line here?\n  it('parseDocument finds queries in multi-expression tagged template with declarations with using tsx', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    const someValue = 'value'\n    type SomeType = { test: any }\n    const QUERY: string = gql<SomeType>\\`\n    query Test {\n      test {\n        value\n        $\\{someValue}\n        ...FragmentsComment\n      }\n      $\\{someValue}\n    }\\`\n    \n    export function Example(arg: string) {\n      return <div>{QUERY}</div>\n    }`;\n\n    const contents = await parseDocument(text, 'test.tsx');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        \n        ...FragmentsComment\n      }\n      \n    }`);\n  });\n\n  it('parseDocument finds queries in multi-expression template strings using tsx', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    const someValue = 'value'\n    const QUERY: string =\n    /* GraphQL */\n    \\`\n    query Test {\n      test {\n        value\n        \\${someValue}\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {\n      return <div>{QUERY}</div>\n    }`;\n\n    const contents = await parseDocument(text, 'test.tsx');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        \n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n\n  it('parseDocument finds queries in call expressions with template literals', async () => {\n    const text = `\n    // @flow\n    import {gql} from 'react-apollo';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = gql(\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`);\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents[0].query).toEqual(`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n\n  it('parseDocument finds queries in #graphql-annotated templates', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    \n    const QUERY: string = \\`#graphql\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.ts');\n    expect(contents[0].query).toEqual(`#graphql\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \n    `);\n  });\n  it('parseDocument finds queries in /*GraphQL*/-annotated templates', async () => {\n    const text = `\n    import {gql} from 'react-apollo';\n    import {B} from 'B';\n    import A from './A';\n    \n    const QUERY: string = /* GraphQL */ \\`\n      query Test {\n        test {\n          value\n          ...FragmentsComment\n        }\n      }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.ts');\n    // please let me keep this whitespace prettier!\n    // note: if this test suddenly starts failing, it's because some auto-formatting configuration ignored\n    // our `.prettierignore` file, as the whitespace below Test query is expected\n    expect(contents[0].query).toEqual(/* GraphQL */ `\n      query Test {\n        test {\n          value\n          ...FragmentsComment\n        }\n      }\n    \n    `);\n  });\n\n  it('parseDocument ignores non gql tagged templates', async () => {\n    const text = `\n    // @flow\n    import randomThing from 'package';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = randomThing\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('parseDocument ignores non gql call expressions with template literals', async () => {\n    const text = `\n    // @flow\n    import randomthing from 'package';\n    import type {B} from 'B';\n    import A from './A';\n    \n    const QUERY = randomthing(\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.fragments.test}\n    \\`);\n    \n    export function Example(arg: string) {}`;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('an unparsable JS/TS file does not throw and bring down the server', async () => {\n    const text = `\n    // @flow\n    import type randomThing fro 'package';\n    import type {B} from 'B';\n    im port A from './A';\n    \n    con  QUERY = randomThing\\`\n    query Test {\n      test {\n        value\n        ...FragmentsComment\n      }\n    }\n    \\${A.frag`;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('an empty file is ignored', async () => {\n    const text = '';\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('a whitespace only file with empty asts is ignored', async () => {\n    const text = `\n    \n    `;\n\n    const contents = await parseDocument(text, 'test.js');\n    expect(contents.length).toEqual(0);\n  });\n\n  it('an ignored file is ignored', async () => {\n    const text = `\n    something\n    `;\n    const contents = await parseDocument(text, 'test.txt');\n    expect(contents.length).toEqual(0);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/startServer.spec.ts",
    "content": "import startServer from '../startServer';\n\ndescribe('startServer', () => {\n  let c;\n  afterEach(async () => {\n    if (c) {\n      try {\n        await c.sendNotification('exit');\n      } catch {}\n    }\n  });\n  it('should start the server', async () => {\n    c = await startServer();\n    // if the server starts, we're good\n    expect(true).toBe(true);\n  });\n  // TODO: this one fails to exit properly in tests\n  // eslint-disable-next-line jest/no-disabled-tests\n  it.skip('should start the server with stream', async () => {\n    c = await startServer({\n      method: 'stream',\n    });\n    // if the server starts, we're good\n    expect(true).toBe(true);\n  });\n  it('should start the server with ipc', async () => {\n    c = await startServer({\n      method: 'node',\n    });\n    // if the server starts, we're good\n    expect(true).toBe(true);\n  });\n  it('should start the server with websockets', async () => {\n    c = await startServer({\n      method: 'socket',\n      port: 4000,\n    });\n    // if the server starts, we're good\n    expect(true).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/__tests__/startServer.test.ts",
    "content": "import { IPCMessageReader, IPCMessageWriter } from 'vscode-jsonrpc/node';\nimport { addHandlers, buildOptions, initializeHandlers } from '../startServer';\n\ndescribe('buildOptions', () => {\n  it('should build options', () => {\n    const options = buildOptions({});\n    expect(options).toEqual({\n      loadConfigOptions: {\n        extensions: [],\n        rootDir: process.cwd(),\n      },\n    });\n  });\n  it('should build options with loadConfigOptions', () => {\n    const options = buildOptions({ loadConfigOptions: { rootDir: '/root' } });\n    expect(options).toEqual({\n      loadConfigOptions: {\n        rootDir: '/root',\n      },\n    });\n  });\n  it('should build options with loadConfigOptions without rootDir', () => {\n    const options = buildOptions({ loadConfigOptions: { extensions: [] } });\n    expect(options).toEqual({\n      loadConfigOptions: {\n        rootDir: process.cwd(),\n        extensions: [],\n      },\n    });\n  });\n  it('should build options with just extensions', () => {\n    const options = buildOptions({ extensions: [] });\n    expect(options).toEqual({\n      extensions: [],\n      loadConfigOptions: {\n        rootDir: process.cwd(),\n        extensions: [],\n      },\n    });\n  });\n});\n\ndescribe('initializeHandlers', () => {\n  beforeEach(() => {\n    jest.resetModules();\n  });\n  it('should initialize handlers', async () => {\n    const reader = new IPCMessageReader(process);\n    const writer = new IPCMessageWriter(process);\n    const handlers = await initializeHandlers({\n      reader,\n      writer,\n      options: {\n        loadConfigOptions: { rootDir: '/root' },\n      },\n    });\n    expect(handlers).toBeDefined();\n  });\n});\n\ndescribe('addHandlers', () => {\n  it('should add handlers', async () => {\n    const connection = {\n      onInitialize: jest.fn(),\n      onInitialized: jest.fn(),\n      onShutdown: jest.fn(),\n      onExit: jest.fn(),\n      onNotification: jest.fn(),\n      onRequest: jest.fn(),\n      sendNotification: jest.fn(),\n      sendRequest: jest.fn(),\n      console: {\n        error: jest.fn(),\n        warn: jest.fn(),\n        info: jest.fn(),\n        log: jest.fn(),\n      },\n    };\n\n    await addHandlers({\n      connection,\n      options: { loadConfigOptions: { rootDir: '/root' } },\n    });\n    expect(\n      connection.onNotification.mock.calls.map(c => c[0].method ?? c[0]),\n    ).toEqual([\n      'textDocument/didOpen',\n      'textDocument/didSave',\n      'textDocument/didChange',\n      'textDocument/didClose',\n      'exit',\n      '$/cancelRequest',\n      'workspace/didChangeWatchedFiles',\n      'workspace/didChangeConfiguration',\n    ]);\n    expect(\n      connection.onRequest.mock.calls.map(c => c[0].method ?? c[0]),\n    ).toEqual([\n      'shutdown',\n      'initialize',\n      'textDocument/completion',\n      'completionItem/resolve',\n      'textDocument/definition',\n      'textDocument/hover',\n      'textDocument/documentSymbol',\n      'workspace/symbol',\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/common.ts",
    "content": "import { glob } from 'glob';\nimport { GraphQLProjectConfig } from 'graphql-config';\nimport {\n  DEFAULT_SUPPORTED_EXTENSIONS,\n  DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n} from './constants';\n\nexport function unwrapProjectSchema(project: GraphQLProjectConfig): string[] {\n  const projectSchema = project.schema;\n\n  const schemas: string[] = [];\n  if (typeof projectSchema === 'string') {\n    schemas.push(projectSchema);\n  } else if (Array.isArray(projectSchema)) {\n    for (const schemaEntry of projectSchema) {\n      if (typeof schemaEntry === 'string') {\n        schemas.push(schemaEntry);\n      } else if (schemaEntry) {\n        schemas.push(...Object.keys(schemaEntry));\n      }\n    }\n  } else {\n    schemas.push(...Object.keys(projectSchema));\n  }\n\n  return schemas.reduce<string[]>((agg, schema) => {\n    const results = globIfFilePattern(schema);\n    return [...agg, ...results];\n  }, []);\n}\nfunction globIfFilePattern(pattern: string) {\n  if (pattern.includes('*')) {\n    try {\n      return glob.sync(pattern);\n      // URLs may contain * characters\n    } catch {}\n  }\n  return [pattern];\n}\nconst allExtensions = [\n  ...DEFAULT_SUPPORTED_EXTENSIONS,\n  ...DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n];\n// only local schema lookups if all of the schema entries are local files\nexport function isProjectSDLOnly(unwrappedSchema: string[]): boolean {\n  return unwrappedSchema.every(schemaEntry =>\n    allExtensions.some(\n      // local schema file URIs for lookup don't start with http, and end with an extension.\n      // though it isn't often used, technically schema config could include a remote .graphql file\n      ext => !schemaEntry.startsWith('http') && schemaEntry.endsWith(ext),\n    ),\n  );\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/constants.ts",
    "content": "import type { ParserOptions, ParserPlugin } from '@babel/parser';\n\n// Attempt to be as inclusive as possible of source text.\nexport const PARSER_OPTIONS: ParserOptions = {\n  allowImportExportEverywhere: true,\n  allowReturnOutsideFunction: true,\n  allowSuperOutsideMethod: true,\n  allowAwaitOutsideFunction: true,\n  // important! this allows babel to keep parsing when there are issues\n  errorRecovery: true,\n  sourceType: 'module',\n  strictMode: false,\n};\n\n/**\n * .graphql is the officially recommended extension for graphql files\n *\n * .gql and .graphqls are included for compatibility for commonly used extensions\n *\n * GQL is a registered trademark of Google, and refers to Google Query Language.\n * GraphQL Foundation does *not* recommend using this extension or acronym for\n * referring to GraphQL.\n *\n * any changes should also be reflected in vscode-graphql-syntax textmate grammar & package.json\n */\nexport const DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS = [\n  '.graphql',\n  '.graphqls',\n  '.gql',\n];\n\n/**\n * default tag delimiters to use when parsing GraphQL strings (for js/ts/vue/svelte)\n * any changes should also be reflected in vscode-graphql-syntax textmate grammar\n */\nexport const TAG_MAP: Record<string, true> = {\n  graphql: true,\n  gql: true,\n  graphqls: true,\n};\n\n/**\n * default extensions to use when parsing for GraphQL strings\n * any changes should also be reflected in vscode-graphql-syntax textmate grammar & package.json\n */\nexport const DEFAULT_SUPPORTED_EXTENSIONS = [\n  '.js',\n  '.cjs',\n  '.mjs',\n  '.es',\n  '.esm',\n  '.es6',\n  '.ts',\n  '.jsx',\n  '.tsx',\n  '.vue',\n  '.svelte',\n  '.astro',\n  '.cts',\n  '.mts',\n] as const;\n\nexport type SupportedExtensions = typeof DEFAULT_SUPPORTED_EXTENSIONS;\nexport type SupportedExtensionsEnum =\n  (typeof DEFAULT_SUPPORTED_EXTENSIONS)[number];\n\n/**\n * default plugins to use with babel parser\n */\nexport const BABEL_PLUGINS: ParserPlugin[] = [\n  'asyncDoExpressions',\n  'asyncGenerators',\n  'bigInt',\n  'classProperties',\n  'classPrivateProperties',\n  'classPrivateMethods',\n  'classStaticBlock',\n  'doExpressions',\n  'decimal',\n  'decorators-legacy',\n  'destructuringPrivate',\n  'dynamicImport',\n  'exportDefaultFrom',\n  'exportNamespaceFrom',\n  'functionBind',\n  'functionSent',\n  'importMeta',\n  'importAssertions',\n  'jsx',\n  'logicalAssignment',\n  'moduleBlocks',\n  'moduleStringNames',\n  'nullishCoalescingOperator',\n  'numericSeparator',\n  'objectRestSpread',\n  'optionalCatchBinding',\n  'optionalChaining',\n  // ['pipelineOperator', { proposal: 'hack' }],\n  'privateIn',\n  'regexpUnicodeSets',\n  'throwExpressions',\n  'topLevelAwait',\n];\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/findGraphQLTags.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {\n  Expression,\n  TaggedTemplateExpression,\n  TemplateLiteral,\n} from '@babel/types';\n\nimport { Position, Range } from 'graphql-language-service';\n\nimport { TAG_MAP } from './constants';\n\nimport type { Logger, NoopLogger } from './Logger';\nimport { RangeMapper } from './parsers/types';\nimport { parserMap } from './parsers';\n\ntype TagResult = { tag: string; template: string; range: Range };\n\ninterface TagVisitors {\n  [type: string]: (node: any) => void;\n}\n\nexport async function findGraphQLTags(\n  text: string,\n  ext: keyof typeof parserMap,\n  uri: string,\n  logger: Logger | NoopLogger,\n): Promise<TagResult[]> {\n  const result: TagResult[] = [];\n\n  let rangeMapper = (range: Range) => range;\n\n  const parser = parserMap[ext];\n  const parserResult = await parser(text, uri, logger);\n  if (!parserResult) {\n    return [];\n  }\n  if (parserResult?.rangeMapper) {\n    rangeMapper = parserResult.rangeMapper;\n  }\n\n  const { asts } = parserResult;\n  if (!asts?.length) {\n    return [];\n  }\n\n  const visitors = {\n    CallExpression(node: Expression) {\n      if (!('callee' in node)) {\n        return;\n      }\n      const { callee } = node;\n\n      if (\n        callee.type === 'Identifier' &&\n        getGraphQLTagName(callee) &&\n        'arguments' in node\n      ) {\n        const templateLiteral = node.arguments[0];\n        if (\n          templateLiteral &&\n          (templateLiteral.type === 'TemplateLiteral' ||\n            templateLiteral.type === 'TaggedTemplateExpression')\n        ) {\n          // @ts-expect-error\n          const parsed = parseTemplateLiteral(templateLiteral, rangeMapper);\n          if (parsed) {\n            result.push(parsed);\n          }\n        }\n      }\n\n      traverse(node, visitors);\n    },\n    TaggedTemplateExpression(node: TaggedTemplateExpression) {\n      const tagName = getGraphQLTagName(node.tag);\n      if (tagName) {\n        const { loc } = node.quasi.quasis[0];\n\n        const template =\n          node.quasi.quasis.length > 1\n            ? node.quasi.quasis\n                .map((quasi, i) =>\n                  i === node.quasi.quasis?.length - 1\n                    ? quasi.value.raw\n                    : getReplacementString(\n                        quasi.value.raw,\n                        node.quasi.quasis[i + 1].value.raw,\n                      ),\n                )\n                .join('')\n            : node.quasi.quasis[0].value.raw;\n        // handle template literals with N line expressions\n        if (loc && node.quasi.quasis.length > 1) {\n          const last = node.quasi.quasis.pop();\n          if (last?.loc?.end) {\n            loc.end = last.loc.end;\n          }\n        }\n        if (loc) {\n          const range = rangeMapper(\n            new Range(\n              new Position(loc.start.line - 1, loc.start.column),\n              new Position(loc.end.line - 1, loc.end.column),\n            ),\n          );\n\n          result.push({\n            tag: tagName,\n            template: template.endsWith('\\n')\n              ? template.slice(0, template.length - 1)\n              : template,\n            range,\n          });\n        }\n      }\n    },\n    TemplateLiteral(node: TemplateLiteral) {\n      // check if the template literal is prefixed with #graphql\n      const hasGraphQLPrefix =\n        node.quasis[0].value.raw.startsWith('#graphql\\n');\n      // check if the template expression has /* GraphQL */ comment\n      const hasGraphQLComment = Boolean(\n        node.leadingComments?.[0]?.value.match(/^\\s*GraphQL\\s*$/),\n      );\n      if (hasGraphQLPrefix || hasGraphQLComment) {\n        const parsed = parseTemplateLiteral(node, rangeMapper);\n        if (parsed) {\n          result.push(parsed);\n        }\n      }\n    },\n  };\n  for (const ast of asts) {\n    visit(ast, visitors);\n  }\n  return result;\n}\n\n/*\n Here we inject replacements for template tag literal expressions, \n so that graphql parse & thus validation can be performed, \n and we don't get <EOF> or expected name parse errors\n \n TODO: other user reported cases to consider:\n 1. operation field argument values - though we recommend graphql variables\n 2. fragment spreads (maybe fragment variables will help solve this?)\n \n these might be extra difficult because they may require type introspection\n 3. directive argument default values\n 5. default argument values for input types\n*/\nconst getReplacementString = (quasi: string, nextQuasi: string) => {\n  const trimmed = quasi.trimEnd();\n  const trimmedNext = nextQuasi.trimStart();\n  // only actually empty leaf field expressions\n  if (trimmed.endsWith('{') && trimmedNext.startsWith('}')) {\n    return quasi + '__typename';\n  }\n  return quasi;\n};\n/**\n * Parses a Babel AST template literal into a GraphQL tag.\n */\nfunction parseTemplateLiteral(node: TemplateLiteral, rangeMapper: RangeMapper) {\n  const { loc } = node.quasis[0];\n  if (loc) {\n    // handle template literals with N line expressions\n\n    if (node.quasis.length > 1) {\n      const quasis = [...node.quasis];\n      const last = quasis.pop();\n      if (last?.loc?.end) {\n        loc.end = last.loc.end;\n      }\n    }\n    const template = node.quasis\n      .map((quasi, i) =>\n        i === node.quasis?.length - 1\n          ? quasi.value.raw\n          : getReplacementString(quasi.value.raw, node.quasis[i + 1].value.raw),\n      )\n      .join('');\n\n    const range = rangeMapper(\n      new Range(\n        new Position(loc.start.line - 1, loc.start.column),\n        new Position(loc.end.line - 1, loc.end.column),\n      ),\n    );\n\n    return {\n      tag: '',\n      template,\n      range,\n    };\n  }\n}\n\nfunction getGraphQLTagName(tag: Expression): string | null {\n  if (tag.type === 'Identifier' && TAG_MAP[tag.name]) {\n    return tag.name;\n  }\n  if (\n    tag.type === 'MemberExpression' &&\n    tag.object.type === 'Identifier' &&\n    tag.object.name === 'graphql' &&\n    tag.property.type === 'Identifier' &&\n    tag.property.name === 'experimental'\n  ) {\n    return 'graphql.experimental';\n  }\n  return null;\n}\n\nfunction visit(node: { [key: string]: any }, visitors: TagVisitors) {\n  const fn = visitors[node.type];\n  if (fn && fn != null) {\n    fn(node);\n    return;\n  }\n  traverse(node, visitors);\n}\nconst IGNORED_KEYS: { [key: string]: boolean } = {\n  comments: true,\n  end: true,\n  leadingComments: true,\n  loc: true,\n  name: true,\n  start: true,\n  trailingComments: true,\n  type: true,\n};\n\nfunction traverse(node: { [key: string]: any }, visitors: TagVisitors) {\n  for (const key in node) {\n    if (IGNORED_KEYS[key]) {\n      continue;\n    }\n    const prop = node[key];\n    if (prop && typeof prop === 'object' && typeof prop.type === 'string') {\n      visit(prop, visitors);\n    } else if (Array.isArray(prop)) {\n      for (const item of prop) {\n        if (item && typeof item === 'object' && typeof item.type === 'string') {\n          visit(item, visitors);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/index.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\nexport { MessageProcessor } from './MessageProcessor';\n\nexport { default as startServer } from './startServer';\n\nexport * from './GraphQLCache';\nexport * from './parseDocument';\nexport * from './findGraphQLTags';\nexport * from './types';\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parseDocument.ts",
    "content": "import { extname } from 'node:path';\nimport type { CachedContent } from 'graphql-language-service';\nimport { Range, Position } from 'graphql-language-service';\nimport type { Logger } from './Logger';\n\nimport { findGraphQLTags } from './findGraphQLTags';\nimport {\n  DEFAULT_SUPPORTED_EXTENSIONS,\n  DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n  SupportedExtensionsEnum,\n} from './constants';\nimport { NoopLogger } from './Logger';\n\n/**\n * Helper functions to perform requested services from client/server.\n */\n\n// Check the uri to determine the file type (JavaScript/GraphQL).\n// If .js file, either return the parsed query/range or null if GraphQL queries\n// are not found.\nexport async function parseDocument(\n  text: string,\n  uri: string,\n  fileExtensions: ReadonlyArray<SupportedExtensionsEnum> = DEFAULT_SUPPORTED_EXTENSIONS,\n  graphQLFileExtensions: string[] = DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n  logger: Logger | NoopLogger = new NoopLogger(),\n): Promise<CachedContent[]> {\n  // Check if the text content includes a GraphQL query.\n  // If the text doesn't include GraphQL queries, do not proceed.\n  const ext = extname(\n    uri,\n  ) as unknown as (typeof DEFAULT_SUPPORTED_EXTENSIONS)[number];\n  if (!text || text === '') {\n    return [];\n  }\n\n  if (fileExtensions.includes(ext)) {\n    const templates = await findGraphQLTags(text, ext, uri, logger);\n    return templates.map(({ template, range }) => ({ query: template, range }));\n  }\n  if (graphQLFileExtensions.includes(ext)) {\n    const query = text;\n    const lines = query.split('\\n');\n    const range = new Range(\n      new Position(0, 0),\n      new Position(lines.length - 1, lines.at(-1)!.length - 1),\n    );\n    return [{ query, range }];\n  }\n  return [];\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parsers/astro.ts",
    "content": "import { Position, Range } from 'graphql-language-service';\nimport { RangeMapper, SourceParser } from './types';\nimport { babelParser } from './babel';\nimport { parse } from '@astrojs/compiler';\n\ntype ParseAstroResult =\n  | { type: 'error'; errors: string[] }\n  | {\n      type: 'ok';\n      scriptOffset: number;\n      scriptAst: any[];\n    };\n\nasync function parseAstro(source: string): Promise<ParseAstroResult> {\n  const { ast, diagnostics } = await parse(source, {\n    position: false, // defaults to `true`\n  });\n\n  if (diagnostics.some(d => d.severity === /* Error */ 1)) {\n    return {\n      type: 'error',\n      errors: diagnostics.map(d => JSON.stringify(d)),\n    };\n  }\n\n  for (const node of ast.children) {\n    if (node.type === 'frontmatter') {\n      try {\n        return {\n          type: 'ok',\n          scriptOffset: (node.position?.start.line ?? 1) - 1,\n          scriptAst: [babelParser(node.value, ['typescript'])],\n        };\n      } catch (error) {\n        return {\n          type: 'error',\n          errors: [String(error)],\n        };\n      }\n    }\n  }\n\n  return { type: 'error', errors: ['Could not find frontmatter block'] };\n}\n\nexport const astroParser: SourceParser = async (text, uri, logger) => {\n  const parseAstroResult = await parseAstro(text);\n  if (parseAstroResult.type === 'error') {\n    logger.info(\n      `Could not parse the astro file at ${uri} to extract the graphql tags:`,\n    );\n    for (const error of parseAstroResult.errors) {\n      logger.info(error);\n    }\n    return null;\n  }\n\n  const rangeMapper: RangeMapper = range => {\n    return new Range(\n      new Position(\n        range.start.line + parseAstroResult.scriptOffset,\n        range.start.character,\n      ),\n      new Position(\n        range.end.line + parseAstroResult.scriptOffset,\n        range.end.character,\n      ),\n    );\n  };\n  return { asts: parseAstroResult.scriptAst, rangeMapper };\n};\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parsers/babel.ts",
    "content": "import { parse, ParserPlugin } from '@babel/parser';\nimport { BABEL_PLUGINS, PARSER_OPTIONS } from '../constants';\nimport { SourceParser } from './types';\n\nexport const babelParser = (text: string, plugins?: ParserPlugin[]) => {\n  const babelPlugins = [...BABEL_PLUGINS];\n  if (plugins) {\n    babelPlugins.push(...plugins);\n  }\n  PARSER_OPTIONS.plugins = babelPlugins;\n  return parse(text, PARSER_OPTIONS);\n};\n\nexport const ecmaParser: SourceParser = (text, uri, logger) => {\n  try {\n    return { asts: [babelParser(text, ['flow', 'flowComments'])] };\n  } catch (error) {\n    logger.info(\n      `Could not parse the JavaScript file at ${uri} to extract the graphql tags:`,\n    );\n    logger.info(String(error));\n    return null;\n  }\n};\n\nexport const tsParser: SourceParser = (text, uri, logger) => {\n  try {\n    return { asts: [babelParser(text, ['typescript'])] };\n  } catch (error) {\n    logger.info(\n      `Could not parse the TypeScript file at ${uri} to extract the graphql tags:`,\n    );\n    logger.info(String(error));\n    return null;\n  }\n};\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parsers/index.ts",
    "content": "import { ecmaParser, tsParser } from './babel';\nimport { vueParser } from './vue';\nimport { astroParser } from './astro';\nimport { svelteParser } from './svelte';\nimport { DEFAULT_SUPPORTED_EXTENSIONS } from '../constants';\nimport { SourceParser } from './types';\n\n// ensures that all of the supported extensions have parsers\ntype ParserMap = {\n  [K in (typeof DEFAULT_SUPPORTED_EXTENSIONS)[number]]: SourceParser;\n};\n\nexport const parserMap: ParserMap = {\n  '.js': ecmaParser,\n  '.jsx': ecmaParser,\n  '.mjs': ecmaParser,\n  '.es': ecmaParser,\n  '.es6': ecmaParser,\n  '.esm': ecmaParser,\n  '.cjs': ecmaParser,\n  '.ts': tsParser,\n  '.tsx': tsParser,\n  '.cts': tsParser,\n  '.mts': tsParser,\n  '.svelte': svelteParser,\n  '.vue': vueParser,\n  '.astro': astroParser,\n};\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parsers/svelte.ts",
    "content": "import { babelParser } from './babel';\nimport { svelte2tsx } from 'svelte2tsx';\nimport { SourceMapConsumer } from 'source-map-js';\nimport { Position, Range } from 'graphql-language-service';\nimport type { RangeMapper, SourceParser } from './types';\n\nexport const svelteParser: SourceParser = (text, uri, logger) => {\n  const svelteResult = svelte2tsx(text, {\n    filename: uri,\n  });\n\n  const consumer = new SourceMapConsumer({\n    ...svelteResult.map,\n    version: String(svelteResult.map.version),\n  });\n\n  const rangeMapper: RangeMapper = range => {\n    const start = consumer.originalPositionFor({\n      line: range.start.line,\n      column: range.start.character,\n    });\n\n    const end = consumer.originalPositionFor({\n      line: range.end.line,\n      column: range.end.character,\n    });\n\n    return new Range(\n      new Position(start.line, start.column),\n      new Position(end.line, end.column),\n    );\n  };\n  try {\n    return {\n      asts: [babelParser(svelteResult.code, ['typescript'])],\n      rangeMapper,\n    };\n  } catch (error) {\n    logger.info(\n      `Could not parse the Svelte file at ${uri} to extract the graphql tags:`,\n    );\n    logger.info(String(error));\n    return null;\n  }\n};\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parsers/types.ts",
    "content": "import type { Range } from 'graphql-language-service';\nimport type { NoopLogger, Logger } from '../Logger';\n\nexport type RangeMapper = (range: Range) => Range;\n\nexport type SourceParserResult = null | {\n  asts: any[];\n  rangeMapper?: RangeMapper;\n};\n\nexport type SourceParser = (\n  text: string,\n  uri: string,\n  logger: Logger | NoopLogger,\n) => Promise<SourceParserResult> | SourceParserResult;\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/parsers/vue.ts",
    "content": "import { parse, compileScript, SFCScriptBlock } from 'vue/compiler-sfc';\nimport { RangeMapper, SourceParser } from './types';\nimport { Position, Range } from 'graphql-language-service';\nimport { BlockStatement, Statement } from '@babel/types';\n\ntype ParseVueSFCResult =\n  | { type: 'error'; errors: Error[] }\n  | {\n      type: 'ok';\n      scriptOffset: number;\n      scriptSetupAst?: Statement[];\n      scriptAst?: Statement[];\n    };\n\nexport function parseVueSFC(source: string): ParseVueSFCResult {\n  const { errors, descriptor } = parse(source);\n\n  if (errors.length !== 0) {\n    return { type: 'error', errors };\n  }\n\n  let scriptBlock: SFCScriptBlock | null = null;\n  try {\n    scriptBlock = compileScript(descriptor, { id: 'foobar' });\n  } catch (error) {\n    if (\n      error instanceof Error &&\n      error.message === '[@vue/compiler-sfc] SFC contains no <script> tags.'\n    ) {\n      return {\n        type: 'ok',\n        scriptSetupAst: [],\n        scriptAst: [],\n        scriptOffset: 0,\n      };\n    }\n    return { type: 'error', errors: [error as Error] };\n  }\n\n  return {\n    type: 'ok',\n    scriptOffset: scriptBlock.loc.start.line - 1,\n    scriptSetupAst: scriptBlock.scriptSetupAst,\n    scriptAst: scriptBlock.scriptAst as BlockStatement[],\n  };\n}\n\nexport const vueParser: SourceParser = (text, uri, logger) => {\n  const asts = [];\n  const parseVueSFCResult = parseVueSFC(text);\n  if (parseVueSFCResult.type === 'error') {\n    logger.info(\n      `Could not parse the vue file at ${uri} to extract the graphql tags:`,\n    );\n    for (const error of parseVueSFCResult.errors) {\n      logger.info(String(error));\n    }\n    return null;\n  }\n\n  if (parseVueSFCResult.scriptAst !== undefined) {\n    asts.push(...parseVueSFCResult.scriptAst);\n  }\n  if (parseVueSFCResult.scriptSetupAst !== undefined) {\n    asts.push(...parseVueSFCResult.scriptSetupAst);\n  }\n\n  const rangeMapper: RangeMapper = range => {\n    return new Range(\n      new Position(\n        range.start.line + parseVueSFCResult.scriptOffset,\n        range.start.character,\n      ),\n      new Position(\n        range.end.line + parseVueSFCResult.scriptOffset,\n        range.end.character,\n      ),\n    );\n  };\n  return { asts, rangeMapper };\n};\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/startServer.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\nimport { MessageProcessor } from './MessageProcessor';\nimport { GraphQLConfig } from 'graphql-config';\nimport {\n  IPCMessageReader,\n  IPCMessageWriter,\n  SocketMessageReader,\n  SocketMessageWriter,\n  StreamMessageReader,\n  StreamMessageWriter,\n} from 'vscode-jsonrpc/node';\n\nimport {\n  CompletionRequest,\n  CompletionResolveRequest,\n  DefinitionRequest,\n  DidOpenTextDocumentNotification,\n  DidSaveTextDocumentNotification,\n  DidChangeTextDocumentNotification,\n  DidChangeConfigurationNotification,\n  DidCloseTextDocumentNotification,\n  ExitNotification,\n  HoverRequest,\n  InitializeRequest,\n  PublishDiagnosticsNotification,\n  DidChangeWatchedFilesNotification,\n  ShutdownRequest,\n  DocumentSymbolRequest,\n  PublishDiagnosticsParams,\n  WorkspaceSymbolRequest,\n  createConnection as createLanguageServerConnection,\n  Connection,\n} from 'vscode-languageserver/node';\n\nimport { Logger } from './Logger';\nimport { parseDocument } from './parseDocument';\nimport {\n  DEFAULT_SUPPORTED_EXTENSIONS,\n  DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n  SupportedExtensionsEnum,\n} from './constants';\nimport { LoadConfigOptions, ServerOptions } from './types';\nimport { createConnection } from 'node:net';\n\n/**\n * Make loadConfigOptions\n */\nexport type MappedServerOptions = Omit<ServerOptions, 'loadConfigOptions'> & {\n  loadConfigOptions: Omit<LoadConfigOptions, 'rootDir'> & { rootDir: string };\n};\n\n/**\n * Legacy mappings for < 2.5.0\n * @param options {ServerOptions}\n */\nexport const buildOptions = (options: ServerOptions): MappedServerOptions => {\n  const serverOptions = { ...options } as MappedServerOptions;\n\n  if (serverOptions.loadConfigOptions) {\n    const { extensions, rootDir } = serverOptions.loadConfigOptions;\n    if (extensions) {\n      serverOptions.loadConfigOptions.extensions = extensions;\n    }\n    if (!rootDir) {\n      if (serverOptions.configDir) {\n        serverOptions.loadConfigOptions.rootDir = serverOptions.configDir;\n      } else {\n        serverOptions.loadConfigOptions.rootDir = process.cwd();\n      }\n    }\n  } else {\n    serverOptions.loadConfigOptions = {\n      rootDir: options.configDir || process.cwd(),\n      extensions: serverOptions.extensions || [],\n    };\n  }\n  return serverOptions;\n};\n\n/**\n * startServer - initialize LSP server with options\n *\n * @param options {ServerOptions} server initialization methods\n * @returns {Promise<void>}\n */\nexport default async function startServer(\n  options?: ServerOptions,\n): Promise<Connection | void> {\n  const finalOptions = buildOptions({ method: 'node', ...options });\n  let reader;\n  let writer;\n  switch (finalOptions.method) {\n    case 'socket':\n      // For socket connection, the message connection needs to be\n      // established before the server socket starts listening.\n      // Do that, and return at the end of this block.\n      if (!finalOptions.port) {\n        process.stderr.write(\n          '--port is required to establish socket connection.',\n        );\n        process.exit(1);\n      }\n\n      const { port, hostname, encoding } = finalOptions;\n      const socket = createConnection(port, hostname ?? '127.0.01');\n\n      reader = new SocketMessageReader(socket, encoding ?? 'utf-8');\n      writer = new SocketMessageWriter(socket, encoding ?? 'utf-8');\n\n      break;\n    case 'stream':\n      reader = new StreamMessageReader(process.stdin);\n      writer = new StreamMessageWriter(process.stdout);\n      break;\n\n    default:\n      reader = new IPCMessageReader(process);\n      writer = new IPCMessageWriter(process);\n      break;\n  }\n  const streamServer = await initializeHandlers({\n    reader,\n    writer,\n    options: finalOptions,\n  });\n  streamServer.listen();\n  return streamServer;\n}\n\ntype InitializerParams = {\n  reader: SocketMessageReader | StreamMessageReader | IPCMessageReader;\n  writer: SocketMessageWriter | StreamMessageWriter | IPCMessageWriter;\n  options: MappedServerOptions;\n};\n\nexport async function initializeHandlers({\n  reader,\n  writer,\n  options,\n}: InitializerParams): Promise<Connection> {\n  const connection = createLanguageServerConnection(reader, writer);\n  const logger = new Logger(connection, options.debug);\n\n  try {\n    await addHandlers({ connection, logger, ...options });\n    return connection;\n  } catch (err) {\n    logger.error('There was an error initializing the server connection');\n    logger.error(String(err));\n    process.exit(1);\n  }\n}\n\nfunction reportDiagnostics(\n  diagnostics: PublishDiagnosticsParams | null,\n  connection: Connection,\n) {\n  if (diagnostics) {\n    void connection.sendNotification(\n      PublishDiagnosticsNotification.type,\n      diagnostics,\n    );\n  }\n}\n\ntype HandlerOptions = {\n  connection: Connection;\n  logger: Logger;\n  config?: GraphQLConfig;\n  parser?: typeof parseDocument;\n  fileExtensions?: ReadonlyArray<SupportedExtensionsEnum>;\n  graphqlFileExtensions?: string[];\n  tmpDir?: string;\n  loadConfigOptions: LoadConfigOptions;\n};\n\n/**\n * take the resultant message connection, and attach the matching `MessageProcessor` instance event handlers\n * similar to languageFeatures.ts in monaco language modes\n *\n * @param options {HandlerOptions}\n */\nexport async function addHandlers({\n  connection,\n  logger,\n  config,\n  parser,\n  fileExtensions,\n  graphqlFileExtensions,\n  tmpDir,\n  loadConfigOptions,\n}: HandlerOptions): Promise<void> {\n  const messageProcessor = new MessageProcessor({\n    logger,\n    config,\n    parser,\n    fileExtensions: fileExtensions || DEFAULT_SUPPORTED_EXTENSIONS,\n    graphqlFileExtensions:\n      graphqlFileExtensions || DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,\n    tmpDir,\n    loadConfigOptions,\n    connection,\n  });\n\n  connection.onNotification(\n    DidOpenTextDocumentNotification.type,\n    async params => {\n      const diagnostics =\n        await messageProcessor.handleDidOpenOrSaveNotification(params);\n      reportDiagnostics(diagnostics, connection);\n    },\n  );\n  connection.onNotification(\n    DidSaveTextDocumentNotification.type,\n    async params => {\n      const diagnostics =\n        await messageProcessor.handleDidOpenOrSaveNotification(params);\n      reportDiagnostics(diagnostics, connection);\n    },\n  );\n  connection.onNotification(\n    DidChangeTextDocumentNotification.type,\n    async params => {\n      const diagnostics =\n        await messageProcessor.handleDidChangeNotification(params);\n      reportDiagnostics(diagnostics, connection);\n    },\n  );\n\n  connection.onNotification(\n    DidCloseTextDocumentNotification.type,\n    messageProcessor.handleDidCloseNotification,\n  );\n  connection.onRequest(ShutdownRequest.type, () =>\n    messageProcessor.handleShutdownRequest(),\n  );\n  connection.onNotification(ExitNotification.type, () =>\n    messageProcessor.handleExitNotification(),\n  );\n\n  // Ignore cancel requests\n  connection.onNotification('$/cancelRequest', () => ({}));\n\n  connection.onRequest(InitializeRequest.type, (params, token) =>\n    messageProcessor.handleInitializeRequest(\n      params,\n      token,\n      loadConfigOptions.rootDir,\n    ),\n  );\n\n  connection.onRequest(CompletionRequest.type, params =>\n    messageProcessor.handleCompletionRequest(params),\n  );\n\n  connection.onRequest(CompletionResolveRequest.type, item => item);\n\n  connection.onRequest(DefinitionRequest.type, params =>\n    messageProcessor.handleDefinitionRequest(params),\n  );\n\n  connection.onRequest(HoverRequest.type, params =>\n    messageProcessor.handleHoverRequest(params),\n  );\n\n  connection.onNotification(DidChangeWatchedFilesNotification.type, params =>\n    messageProcessor.handleWatchedFilesChangedNotification(params),\n  );\n\n  connection.onRequest(DocumentSymbolRequest.type, params =>\n    messageProcessor.handleDocumentSymbolRequest(params),\n  );\n\n  connection.onRequest(WorkspaceSymbolRequest.type, params =>\n    messageProcessor.handleWorkspaceSymbolRequest(params),\n  );\n\n  connection.onNotification(DidChangeConfigurationNotification.type, params =>\n    messageProcessor.handleDidChangeConfiguration(params),\n  );\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/stringToHash.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors\n *  All rights reserved.\n *\n *  This source code is licensed under the license found in the\n *  LICENSE file in the root directory of this source tree.\n *\n */\n\n/* eslint-disable no-bitwise */\nexport default function stringToHash(str: string): number {\n  let hash = 0;\n  if (str.length === 0) {\n    return hash;\n  }\n  for (let i = 0; i < str.length; i++) {\n    const chr = str.charCodeAt(i);\n    hash = (hash << 5) - hash + chr;\n    hash |= 0; // Convert to 32bit integer\n  }\n  return hash;\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/src/types.ts",
    "content": "import type {\n  GraphQLExtensionDeclaration,\n  loadConfig,\n  GraphQLProjectConfig,\n} from 'graphql-config';\nexport type LoadConfigOptions = Parameters<typeof loadConfig>[0];\nimport { GraphQLConfig } from 'graphql-config';\nimport { ASTNode, GraphQLType } from 'graphql';\nimport { parseDocument } from './parseDocument';\nimport { SupportedExtensionsEnum } from './constants';\n\n// base 1\ntype RangeType = {\n  start: {\n    line: number;\n    character: number;\n  };\n  end: {\n    line: number;\n    character: number;\n  };\n};\n\ntype AdditionalLocateInfo = {\n  node?: ASTNode | null;\n  type?: GraphQLType | null;\n  project: GraphQLProjectConfig;\n};\n\ntype LineNumber = string;\ntype CharacterNumber = string;\ntype RelayLSPLocateCommand = (\n  // either Type, Type.field or Type.field(argument)\n  projectName: string,\n  typeName: string,\n  info: AdditionalLocateInfo,\n) =>\n  | `${string}:${LineNumber}:${CharacterNumber}`\n  | `${string}:${LineNumber}`\n  | string;\n\ntype GraphQLLocateCommand = (\n  projectName: string,\n  typeName: string,\n  info: AdditionalLocateInfo,\n) => {\n  range: RangeType;\n  uri: string;\n};\n\nexport type LocateCommand = RelayLSPLocateCommand | GraphQLLocateCommand;\n\nexport interface ServerOptions {\n  /**\n   * socket, streams, or node (ipc).\n   * @default 'node'\n   */\n  method?: 'socket' | 'stream' | 'node';\n  /**\n   * (socket only) port for the LSP server to run on. required if using method socket\n   */\n  port?: number;\n  /**\n   * (socket only) hostname for the LSP server to run on.\n   * @default '127.0.0.1'\n   */\n  hostname?: string;\n  /**\n   * (socket only) encoding for the LSP server to use.\n   * @default 'utf-8'\n   */\n  encoding?: 'utf-8' | 'ascii';\n  /**\n   * `LoadConfigOptions` from `graphql-config@3` to use when we `loadConfig()`\n   * uses process.cwd() by default for `rootDir` option.\n   * you can also pass explicit `filepath`, add extensions, etc\n   */\n  loadConfigOptions?: LoadConfigOptions;\n  /**\n   * @deprecated use loadConfigOptions.rootDir now) the directory where graphql-config is found\n   */\n  configDir?: string;\n  /**\n   * @deprecated use loadConfigOptions.extensions\n   */\n  extensions?: GraphQLExtensionDeclaration[];\n  /**\n   * allowed file extensions for embedded graphql, used by the parser.\n   * note that with vscode, this is also controlled by manifest and client configurations.\n   * do not put full-file graphql extensions here!\n   * @default ['.js', '.jsx', '.tsx', '.ts', '.mjs']\n   */\n  fileExtensions?: ReadonlyArray<SupportedExtensionsEnum>;\n  /**\n   * allowed file extensions for full-file graphql, used by the parser.\n   * @default ['graphql', 'graphqls', 'gql'  ]\n   */\n  graphqlFileExtensions?: string[];\n  /**\n   * pre-existing GraphQLConfig primitive, to override `loadConfigOptions` and related deprecated fields\n   */\n  config?: GraphQLConfig;\n  /**\n   * custom, multi-language parser used by the LSP server.\n   * detects extension from uri and decides how to parse it.\n   * uses graphql.parse() by default\n   * response format is designed to assist with developing LSP tooling around embedded language support\n   */\n  parser?: typeof parseDocument;\n  /**\n   * the temporary directory that the server writes to for logs and caching schema\n   */\n  tmpDir?: string;\n\n  /**\n   * debug mode\n   *\n   * same as with the client reference implementation, the debug setting controls logging output\n   * this allows all logger.info() messages to come through. by default, the highest level is warn\n   */\n  debug?: true;\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/tsconfig.esm.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./esm\"\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/graphql-language-service-server/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\"\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/monaco-graphql/CHANGELOG.md",
    "content": "# Change Log\n\n## 1.7.3\n\n### Patch Changes\n\n- [#4133](https://github.com/graphql/graphiql/pull/4133) [`1bc6568`](https://github.com/graphql/graphiql/commit/1bc6568da947394c216342ae75fb509fdbf03390) Thanks [@dimaMachina](https://github.com/dimaMachina)! - to fix esm.sh example we should pin `monaco-editor` peer dependency to versions `≥ 0.20.0 and < 0.53`, since `monaco-editor@^0.53.0` isn't supported yet with `monaco-graphql`\n\n## 1.7.2\n\n### Patch Changes\n\n- [#4071](https://github.com/graphql/graphiql/pull/4071) [`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd) Thanks [@dimaMachina](https://github.com/dimaMachina)! - feat(graphql-language-service): export `getContextAtPosition`\n  feat(graphiql): dynamically import `monaco-editor` and `monaco-graphql`\n\n  When using GraphiQL in Next.js app, you no longer need to use `next/dynamic`:\n\n  ```diff\n  -import dynamic from 'next/dynamic'\n  -const GraphiQL = dynamic(() => import('graphiql').then(mod => mod.GraphiQL), {\n  -  ssr: false\n  -})\n  +import { GraphiQL } from 'graphiql'\n  ```\n\n- Updated dependencies [[`3a0a755`](https://github.com/graphql/graphiql/commit/3a0a75569c6b318f5dc27d62000bcc9b0536c6fd)]:\n  - graphql-language-service@5.5.0\n\n## 1.7.1\n\n### Patch Changes\n\n- [#4005](https://github.com/graphql/graphiql/pull/4005) [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove unused types\n\n  - `BaseSchemaConfig`\n  - `IDisposable`\n  - `JSONDiagnosticOptions`\n  - `IEvent`\n  - `FilePointer`\n\n## 1.7.1-rc.0\n\n### Patch Changes\n\n- [#4005](https://github.com/graphql/graphiql/pull/4005) [`1e3ec84`](https://github.com/graphql/graphiql/commit/1e3ec8455706e62e6cae306df58d3343ec6b612d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove unused types\n\n  - `BaseSchemaConfig`\n  - `IDisposable`\n  - `JSONDiagnosticOptions`\n  - `IEvent`\n  - `FilePointer`\n\n## 1.7.0\n\n### Minor Changes\n\n- [#3996](https://github.com/graphql/graphiql/pull/3996) [`662c143`](https://github.com/graphql/graphiql/commit/662c1434932de12f1d213992c2b3bc85d5d38370) Thanks [@dimaMachina](https://github.com/dimaMachina)! - - support monaco-editor 0.52\n  - remove unnecessary conditions\n  - render Markdown in completion popup descriptions\n\n## 1.6.2\n\n### Patch Changes\n\n- [#3983](https://github.com/graphql/graphiql/pull/3983) [`403dfc2`](https://github.com/graphql/graphiql/commit/403dfc21c61c9c07fce00607c1416a449bc0d57f) Thanks [@dimaMachina](https://github.com/dimaMachina)! - remove unused `MonacoCompletionItem` type\n\n  fix `types` field in `package.json`, should be first, before `import` or `require` fields\n\n  fixed `monaco-graphql` severity, it was hardcoded to `5` which is not valid value of monaco severity\n\n- Updated dependencies [[`9498dee`](https://github.com/graphql/graphiql/commit/9498deea7636fd82602f230b6b21c743ca5705a7)]:\n  - graphql-language-service@5.4.0\n\n## 1.6.1\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n- Updated dependencies [[`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe)]:\n  - graphql-language-service@5.3.1\n\n## 1.6.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service@5.3.0\n\n## 1.5.3\n\n### Patch Changes\n\n- [#3637](https://github.com/graphql/graphiql/pull/3637) [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d) Thanks [@dimaMachina](https://github.com/dimaMachina)! - update eslint plugins and fix errors\n\n- Updated dependencies [[`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d)]:\n  - graphql-language-service@5.2.2\n\n## 1.5.2\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service@5.2.1\n\n## 1.5.1\n\n### Patch Changes\n\n- [#3523](https://github.com/graphql/graphiql/pull/3523) [`88d76cab`](https://github.com/graphql/graphiql/commit/88d76cabe57aa99f89f569cb2787e2f06e0ab9c5) Thanks [@bboure](https://github.com/bboure)! - Fix JSON diagnostics for multiple editors\n\n## 1.5.0\n\n### Minor Changes\n\n- [#3507](https://github.com/graphql/graphiql/pull/3507) [`7f05c102`](https://github.com/graphql/graphiql/commit/7f05c1022cd5ae74c5be450acacfb48121d01676) Thanks [@bboure](https://github.com/bboure)! - Fix race condition in the worker Manager\n\n## 1.4.0\n\n### Minor Changes\n\n- [#3376](https://github.com/graphql/graphiql/pull/3376) [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c) Thanks [@bboure](https://github.com/bboure)! - Add support for custom scalars\n\n### Patch Changes\n\n- [#3384](https://github.com/graphql/graphiql/pull/3384) [`31ded5e0`](https://github.com/graphql/graphiql/commit/31ded5e02ffb3334c22235fdb4285e926be0a98d) Thanks [@acao](https://github.com/acao)! - import only `editor.api` & basic features, add `monaco-graphql/lite`\n\n  - switch from exporting `edcore.js` to `editor.api.js` as recommended, and minimal features to get the editor working\n    - `edcore` imports `editor.all` which contains many monaco-editor features we don't use\n  - dynamic import of `json` language mode only if the user supplies configuration for json validation\n  - update monaco examples to show minimal `typescript` implementation alongside `graphql`\n  - add new simplified `exports` with backwards compatibility:\n    - `monaco-graphql/initializeMode`\n    - `monaco-graphql/graphql.worker`\n    - `monaco-graphql/monaco-editor`\n  - introduce `monaco-graphql/lite` for users who want the most minimum version possible, and to only import the features they need\n\n- Updated dependencies [[`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c), [`7b00774a`](https://github.com/graphql/graphiql/commit/7b00774affad1f25253ce49f1f48c9e3f372808c)]:\n  - graphql-language-service@5.2.0\n\n## 1.3.0\n\n### Minor Changes\n\n- [#3285](https://github.com/graphql/graphiql/pull/3285) [`d7f595e3`](https://github.com/graphql/graphiql/commit/d7f595e3034a05bcd739cdae590221d60bf55f19) Thanks [@B2o5T](https://github.com/B2o5T)! - avoid bundling unnecessary languages — import `monaco-graphql/esm/monaco-editor` instead of `monaco-editor` to reduce your bundle size, as that imports only `graphql` and `json` languages and leaves out `ts`, `css`, `html`, and much more\n\n## 1.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7\n\n## 1.2.4-alpha.0\n\n### Patch Changes\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`d9e5089f`](https://github.com/graphql/graphiql/commit/d9e5089f78f85cd50c3e3e3ba8510f7dda3d06f5)]:\n  - graphql-language-service@5.1.7-alpha.0\n\n## 1.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939)]:\n  - graphql-language-service@5.1.6\n\n## 1.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service@5.1.5\n\n## 1.2.1\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- [#3109](https://github.com/graphql/graphiql/pull/3109) [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-floating-promises` eslint rule\n\n- [#3120](https://github.com/graphql/graphiql/pull/3120) [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040) Thanks [@B2o5T](https://github.com/B2o5T)! - prefer await to then\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9)]:\n  - graphql-language-service@5.1.4\n\n## 1.2.0\n\n### Minor Changes\n\n- [#3071](https://github.com/graphql/graphiql/pull/3071) [`1821ef2b`](https://github.com/graphql/graphiql/commit/1821ef2b3f06c69fa5fa27dbd66d19e81e792590) Thanks [@acao](https://github.com/acao)! - Upgrade peer resolutions for monaco-graphql\n\n### Patch Changes\n\n- [#3093](https://github.com/graphql/graphiql/pull/3093) [`6ed73bf7`](https://github.com/graphql/graphiql/commit/6ed73bf7ca9781d511458e70268deff203fd36cb) Thanks [@acao](https://github.com/acao)! - Bugfix for 'worker not found' type errors on \\_doValidate()'\n\n- [#3047](https://github.com/graphql/graphiql/pull/3047) [`190fae87`](https://github.com/graphql/graphiql/commit/190fae87a3e4b07a473ba7029fb22d19e713c4b4) Thanks [@B2o5T](https://github.com/B2o5T)! - combining multiple Array#push() into one call\n\n- Updated dependencies [[`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d), [`881a2024`](https://github.com/graphql/graphiql/commit/881a202497d5a58eb5260a5aa54c0c88930d69a0)]:\n  - graphql-language-service@5.1.3\n\n## 1.1.8\n\n### Patch Changes\n\n- [#2993](https://github.com/graphql/graphiql/pull/2993) [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4) Thanks [@B2o5T](https://github.com/B2o5T)! - add `unicorn/consistent-destructuring` rule\n\n- Updated dependencies [[`e68cb8bc`](https://github.com/graphql/graphiql/commit/e68cb8bcaf9baddf6fca747abab871ecd1bc7a4c), [`f788e65a`](https://github.com/graphql/graphiql/commit/f788e65aff267ec873237034831d1fd936222a9b), [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service@5.1.2\n\n## 1.1.7\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2965](https://github.com/graphql/graphiql/pull/2965) [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-optional-catch-binding` rule\n\n- [#2938](https://github.com/graphql/graphiql/pull/2938) [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/throw-new-error` rule\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`4a8b2e17`](https://github.com/graphql/graphiql/commit/4a8b2e1766a38eb4828cf9a81bf9d767070041de), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`c44ea4f1`](https://github.com/graphql/graphiql/commit/c44ea4f1917b97daac815c08299b934c8ca57ed9), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`6a9d913f`](https://github.com/graphql/graphiql/commit/6a9d913f0d1b847124286b3fa1f3a2649d315171)]:\n  - graphql-language-service@5.1.1\n\n## 1.1.6\n\n### Patch Changes\n\n- [#2900](https://github.com/graphql/graphiql/pull/2900) [`8989ffce`](https://github.com/graphql/graphiql/commit/8989ffce7d6beca874e70f5a1ff066102580173a) Thanks [@acao](https://github.com/acao)! - use decorators-legacy @babel/parser plugin so that all styles of decorator usage are supported\n\n## 1.1.5\n\n### Patch Changes\n\n- [#2488](https://github.com/graphql/graphiql/pull/2488) [`967006a6`](https://github.com/graphql/graphiql/commit/967006a68e56f8f3a605c69fee5f920afdb6d8cf) Thanks [@acao](https://github.com/acao)! - Disable`fillLeafsOnComplete` by default\n\n  Users found this generally annoying by default, especially when there are required arguments\n\n  Without automatically prompting autocompletion of required arguments as well as lead expansion, it makes the extension harder to use\n\n  You can now supply this in your graphql config:\n\n  `config.extensions.languageService.fillLeafsOnComplete`\n\n  Setting it to to `true` will enable this feature. Will soon add the ability to manually enable this in `monaco-graphql` as well.\n\n  For both, this kind of behavior would be better as a keyboard command, context menu item &/or codelens prompt\n\n## 1.1.4\n\n### Patch Changes\n\n- [#2834](https://github.com/graphql/graphiql/pull/2834) [`0a950ea3`](https://github.com/graphql/graphiql/commit/0a950ea374504b13d39c042db1d495a79dff4d0d) Thanks [@acao](https://github.com/acao)! - prevent the mode from instantiating more than once in the main process. it should never need to!\n\n  you can supply multiple `schemas` with uri path resolution rules that resolve globs in the browser even!\n\n## 1.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`d6ff4d7a`](https://github.com/graphql/graphiql/commit/d6ff4d7a5d535a0c43fe5914016bac9ef0c2b782)]:\n  - graphql-language-service@5.1.0\n\n## 1.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - graphql-language-service@5.0.6\n\n## 1.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service@5.0.5\n\n## 1.1.0\n\n### Minor Changes\n\n- [#2457](https://github.com/graphql/graphiql/pull/2457) [`8241f56d`](https://github.com/graphql/graphiql/commit/8241f56d78642223949ae717c584accbbe844d17) Thanks [@B2o5T](https://github.com/B2o5T)! - fix typo in `externalFragmentDefinitions`\n\n## 1.0.17\n\n### Patch Changes\n\n- Updated dependencies [[`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2)]:\n  - graphql-language-service@5.0.4\n\n## 1.0.16\n\n### Patch Changes\n\n- Updated dependencies [[`45cbc759`](https://github.com/graphql/graphiql/commit/45cbc759c732999e8b1eb4714d6047ab77c17902)]:\n  - graphql-language-service@5.0.3\n\n## 1.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f)]:\n  - graphql-language-service@5.0.2\n\n## 1.0.14\n\n### Patch Changes\n\n- [#2253](https://github.com/graphql/graphiql/pull/2253) [`63177891`](https://github.com/graphql/graphiql/commit/63177891d7ea4e8a3824892baea45ebaba06eba8) Thanks [@acao](https://github.com/acao)! - fix worker + n problem when changing config (schema, etc) in `monaco-graphql`\n\n## 1.0.13\n\n### Patch Changes\n\n- Updated dependencies [[`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa), [`3626f8d5`](https://github.com/graphql/graphiql/commit/3626f8d5012ee77a39e984ae347396cb00fcc6fa)]:\n  - graphql-language-service@5.0.1\n\n## 1.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`2502a364`](https://github.com/graphql/graphiql/commit/2502a364b74dc754d92baa1579b536cf42139958)]:\n  - graphql-language-service@5.0.0\n\n## 1.0.11\n\n### Patch Changes\n\n- [#2222](https://github.com/graphql/graphiql/pull/2222) [`33f4bf97`](https://github.com/graphql/graphiql/commit/33f4bf977d2c9e831bf9c3acb9c16365b9de2750) Thanks [@acao](https://github.com/acao)! - fixed lost this handle while parsing schema, thanks @waterfoul\n\n## 1.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`484c0523`](https://github.com/graphql/graphiql/commit/484c0523cdd529f9e261d61a38616b6745075c7f), [`5852ba47`](https://github.com/graphql/graphiql/commit/5852ba47c720a2577817aed512bef9a262254f2c), [`48c5df65`](https://github.com/graphql/graphiql/commit/48c5df654e323cee3b8c57d7414247465235d1b5)]:\n  - graphql-language-service@4.1.5\n\n## 1.0.9\n\n### Patch Changes\n\n- [#2118](https://github.com/graphql/graphiql/pull/2118) [`0d1122f9`](https://github.com/graphql/graphiql/commit/0d1122f9c8600ddd86022e72c0fa3696bb1e8b33) Thanks [@acao](https://github.com/acao)! - fix: monaco `getModeId` bug for `monaco-editor@^0.30.0`\n\n  We fixed this already, but we reverted it because folks were having issues with older versions. This fix works for all versions of `monaco-editor` that we support!\n\n## 1.0.8\n\n### Patch Changes\n\n- [#2116](https://github.com/graphql/graphiql/pull/2116) [`65a51d04`](https://github.com/graphql/graphiql/commit/65a51d04876d56560d3453a09eb93f2e296f462a) Thanks [@acao](https://github.com/acao)! - - `picomatch-browser` fork no longer uses `path`. these changes to remove node dependencies from `picomatch`, 99% of them are by another contributor, will eventually be merged into the actual `picomatch`\n  - no `onLanguage` for `initializeMode` - always instantiate the mode when this is called directly! Fixes some editor creation race condition issues\n  - introduce a demo using react + vite and minimal config, no workarounds! This will help us prototype for `@graphiql/react`\n  - use `schemaValidation: 'error'` by default. allow user to override `validate` if they want.\n  - always re-register providers on schema config changes. seems to fix some issues on lazy instantiation\n\n## 1.0.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service@4.1.4\n\n## 1.0.6\n\n### Patch Changes\n\n- [#2105](https://github.com/graphql/graphiql/pull/2105) [`f7dc1f12`](https://github.com/graphql/graphiql/commit/f7dc1f1299cee06e20b65f8e457d74bf1cb6f76f) Thanks [@acao](https://github.com/acao)! - Fix a bug where `_cacheSchemas()` was not being called by the language service\n\n## 1.0.5\n\n### Patch Changes\n\n- [#2103](https://github.com/graphql/graphiql/pull/2103) [`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8) Thanks [@acao](https://github.com/acao)! - LanguageService should not be imported by `codemirror-graphql`, and thus `picomatch` should not be imported.\n\n- Updated dependencies [[`a44772d6`](https://github.com/graphql/graphiql/commit/a44772d6af97254c4f159ea7237e842a3e3719e8)]:\n  - graphql-language-service@4.1.3\n\n## 1.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`e20760fb`](https://github.com/graphql/graphiql/commit/e20760fbd95c13d6d549cba3faa15a59aee9a2c0)]:\n  - graphql-language-service@4.1.2\n\n## 1.0.3\n\n### Patch Changes\n\n- [#2093](https://github.com/graphql/graphiql/pull/2093) [`c875412f`](https://github.com/graphql/graphiql/commit/c875412faaf0e1fb374c27ddd26d7f9795003675) Thanks [@acao](https://github.com/acao)! - export LANGUAGE_ID from monaco-graphql again\n\n## 1.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`ff9cebe5`](https://github.com/graphql/graphiql/commit/ff9cebe515a3539f85b9479954ae644dfeb68b63)]:\n  - graphql-language-service-utils@2.7.1\n  - graphql-language-service@4.1.1\n\n## 1.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`0f1f90ce`](https://github.com/graphql/graphiql/commit/0f1f90ce8f4a25ddebdaf7a9ddbe136214aa64a3)]:\n  - graphql-language-service@4.1.0\n\n## 1.0.0\n\n### Major Changes\n\n- [#1997](https://github.com/graphql/graphiql/pull/1997) [`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3) Thanks [@acao](https://github.com/acao)! - This introduces some big changes to `monaco-graphql`, and some exciting features, including multi-model support, multi-schema support, and variables json language feature support 🎉.\n\n  see [the readme](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql#monaco-graphql) to learn how to configure and use the new interface.\n\n  #### 🚨 BREAKING CHANGES!! 🚨\n\n  - `monaco-graphql` 🚨 **no longer loads schemas using `fetch` introspection** 🚨, you must specify the schema in one of many ways statically or dynamically. specifying just a schema `uri` no longer works. see [the readme](https://github.com/graphql/graphiql/tree/main/packages/monaco-graphql#monaco-graphql)\n  - when specifying the language to an editor or model, **use `graphql` as the language id instead of `graphqlDev`**\n    - the mode now extends the default basic language support from `monaco-editor` itself\n    - when bundling, for syntax highlighting and basic language features, you must specify `graphql` in languages for your webpack or vite monaco plugins\n  - The exported mode api for configuration been entirely rewritten. It is simple for now, but we will add more powerful methods to the `monaco.languages.api` over time :)\n\n  #### New Features\n\n  this introduces many improvements:\n\n  - json language support, by mapping from each graphql model uri to a set of json variable model uris\n    - we generate a json schema definition for the json variables on the fly\n    - it updates alongside editor validation as you type\n  - less redundant schema loading - schema is loaded in main process instead of in the webworker\n  - web worker stability has been improved by contributors in previous patches, but removing remote schema loading vastly simplifies worker creation\n  - the editor now supports multiple graphql models, configurable against multiple schema configurations\n\n  * You can now use `initializeMode()` to initialize the language mode & worker with the schema, but you can still lazily load it, and fall back on default monaco editor basic languages support\n\n### Patch Changes\n\n- Updated dependencies [[`9df315b4`](https://github.com/graphql/graphiql/commit/9df315b44896efa313ed6744445fc8f9e702ebc3)]:\n  - graphql-language-service-utils@2.7.0\n  - graphql-language-service@4.0.0\n\n## 0.6.5\n\n### Patch Changes\n\n- [`989fca69`](https://github.com/graphql/graphiql/commit/989fca693385aa408bcfe18cde34934a5aea5dce) [#2070](https://github.com/graphql/graphiql/pull/2070) Thanks [@acao](https://github.com/acao)! - Fix a bug with variable completion with duplicate `$` across the ecosystem. Introduce more `triggerCharacters` across monaco and the LSP server for autocompletion in far more cases\n\n- Updated dependencies [[`df57cd25`](https://github.com/graphql/graphiql/commit/df57cd2556302d6aa5dd140e7bee3f7bdab4deb1)]:\n  - graphql-language-service@3.2.5\n\n## 0.6.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service@3.2.4\n  - graphql-language-service-utils@2.6.3\n\n## 0.6.3\n\n### Patch Changes\n\n- Updated dependencies [[`bdd57312`](https://github.com/graphql/graphiql/commit/bdd573129844168749aba0aaa20e31b9da81aacf)]:\n  - graphql-language-service@3.2.3\n  - graphql-language-service-utils@2.6.2\n\n## 0.6.2\n\n### Patch Changes\n\n- [`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf) [#2045](https://github.com/graphql/graphiql/pull/2045) Thanks [@acao](https://github.com/acao)! - fix graphql-js peer dependencies - [#2044](https://github.com/graphql/graphiql/pull/2044)\n\n- Updated dependencies [[`858907d2`](https://github.com/graphql/graphiql/commit/858907d2106742a65ec52eb017f2e91268cc37bf)]:\n  - graphql-language-service@3.2.2\n  - graphql-language-service-utils@2.6.1\n\n## 0.6.1\n\n### Patch Changes\n\n- [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce) [#2013](https://github.com/graphql/graphiql/pull/2013) Thanks [@PabloSzx](https://github.com/PabloSzx)! - Update utils\n\n- Updated dependencies [[`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce), [`9a6ed03f`](https://github.com/graphql/graphiql/commit/9a6ed03fbe4de9652ff5d81a8f584234995dd2ce)]:\n  - graphql-language-service-utils@2.6.0\n  - graphql-language-service@3.2.1\n\n## 0.6.0\n\n### Minor Changes\n\n- [`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a) [#2010](https://github.com/graphql/graphiql/pull/2010) Thanks [@acao](https://github.com/acao)! - upgrade to `graphql@16.0.0-experimental-stream-defer.5`. thanks @saihaj!\n\n### Patch Changes\n\n- Updated dependencies [[`716cf786`](https://github.com/graphql/graphiql/commit/716cf786aea6af42ea637ca3c56ae6c6ebc17c7a)]:\n  - graphql-language-service@3.2.0\n\n## 0.5.1\n\n### Patch Changes\n\n- [`0e2c1a02`](https://github.com/graphql/graphiql/commit/0e2c1a020cc2761155f7c9467d3ed4cb45941aeb) [#1979](https://github.com/graphql/graphiql/pull/1979) Thanks [@iahu](https://github.com/iahu)! - fix: export `monaco-graphql` esm with esm modules, also fix issues with worker manager, resolves #1706 & #1791\n\n* [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8) [#1777](https://github.com/graphql/graphiql/pull/1777) Thanks [@dwwoelfel](https://github.com/dwwoelfel)! - adopt block string parsing for variables in language parser\n\n* Updated dependencies [[`0e2c1a02`](https://github.com/graphql/graphiql/commit/0e2c1a020cc2761155f7c9467d3ed4cb45941aeb), [`75dbb0b1`](https://github.com/graphql/graphiql/commit/75dbb0b18e2102d271a5cfe78faf54fe22e83ac8)]:\n  - graphql-language-service@3.1.6\n\n## 0.5.0\n\n### Minor Changes\n\n- [`fec37c6b`](https://github.com/graphql/graphiql/commit/fec37c6b2953e177bea99d4cbf993c9b253198ba) [#1952](https://github.com/graphql/graphiql/pull/1952) Thanks [@Nishchit14](https://github.com/Nishchit14)! - devDependency and peerDependency of monaco-graphql has been upgraded for monaco-editor. monaco-graphql is now supporting latest version of monaco-editor which is v0.27.0\n\n### Patch Changes\n\n- Updated dependencies [[`2fd5bf72`](https://github.com/graphql/graphiql/commit/2fd5bf7239edb78339e5ac7211f09c245e47c3bb)]:\n  - graphql-language-service@3.1.5\n\n## 0.4.4\n\n### Patch Changes\n\n- [`5b8a057d`](https://github.com/graphql/graphiql/commit/5b8a057dd64ebecc391be32176a2403bb9d9ff92) [#1838](https://github.com/graphql/graphiql/pull/1838) Thanks [@acao](https://github.com/acao)! - Set all cross-runtime build targets to es6\n\n## 0.4.3\n\n### Patch Changes\n\n- [`6869ce77`](https://github.com/graphql/graphiql/commit/6869ce7767050787db5f1017abf82fa5a52fc97a) [#1816](https://github.com/graphql/graphiql/pull/1816) Thanks [@acao](https://github.com/acao)! - improve peer resolutions for graphql 14 & 15. `14.5.0` minimum is for built-in typescript types, and another method only available in `14.4.0`\n\n## [0.4.2](https://github.com/graphql/graphiql/compare/monaco-graphql@0.4.1...monaco-graphql@0.4.2) (2021-01-07)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.4.1](https://github.com/graphql/graphiql/compare/monaco-graphql@0.4.0...monaco-graphql@0.4.1) (2021-01-07)\n\n**Note:** Version bump only for package monaco-graphql\n\n# [0.4.0](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.5...monaco-graphql@0.4.0) (2021-01-07)\n\n### Features\n\n- implied or external fragments, for [#612](https://github.com/graphql/graphiql/issues/612) ([#1750](https://github.com/graphql/graphiql/issues/1750)) ([cfed265](https://github.com/graphql/graphiql/commit/cfed265e3cf31875b39ea517781a217fcdfcadc2))\n\n## [0.3.5](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.4...monaco-graphql@0.3.5) (2021-01-03)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.3.4](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.3...monaco-graphql@0.3.4) (2020-12-28)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.3.3](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.2...monaco-graphql@0.3.3) (2020-12-08)\n\n### Bug Fixes\n\n- GraphQLAPI.setSchemaConfig README example ([#1726](https://github.com/graphql/graphiql/issues/1726)) ([01a1ff7](https://github.com/graphql/graphiql/commit/01a1ff74b0568229318339f9b026d99c117bd218))\n\n## [0.3.2](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.1...monaco-graphql@0.3.2) (2020-11-28)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.3.1](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.1-alpha.3...monaco-graphql@0.3.1) (2020-09-18)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.3.1-alpha.3](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.1-alpha.2...monaco-graphql@0.3.1-alpha.3) (2020-09-11)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.3.1-alpha.2](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.1-alpha.1...monaco-graphql@0.3.1-alpha.2) (2020-08-22)\n\n### Bug Fixes\n\n- improve setSchema & schema loading, allow primitive schema ([#1648](https://github.com/graphql/graphiql/issues/1648)) ([975f29e](https://github.com/graphql/graphiql/commit/975f29ed6e21c7354c42ed778dfd1b52287f70c6))\n\n## [0.3.1-alpha.1](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.1-alpha.0...monaco-graphql@0.3.1-alpha.1) (2020-08-12)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.3.1-alpha.0](https://github.com/graphql/graphiql/compare/monaco-graphql@0.3.0...monaco-graphql@0.3.1-alpha.0) (2020-08-10)\n\n**Note:** Version bump only for package monaco-graphql\n\n# [0.3.0](https://github.com/graphql/graphiql/compare/monaco-graphql@0.2.0...monaco-graphql@0.3.0) (2020-08-06)\n\n### Features\n\n- [RFC] GraphiQL rewrite for monaco editor, react context and redesign, i18n ([#1523](https://github.com/graphql/graphiql/issues/1523)) ([ad730cd](https://github.com/graphql/graphiql/commit/ad730cdc2e3cb7216d821a01725c60475989ee20))\n\n# [0.2.0](https://github.com/graphql/graphiql/compare/monaco-graphql@0.1.4...monaco-graphql@0.2.0) (2020-06-11)\n\n### Features\n\n- standalone monaco API ([#1575](https://github.com/graphql/graphiql/issues/1575)) ([954aa3d](https://github.com/graphql/graphiql/commit/954aa3d7159fd26bba9650824e0f668e417ca64f))\n\n## [0.1.4](https://github.com/graphql/graphiql/compare/monaco-graphql@0.1.3...monaco-graphql@0.1.4) (2020-06-04)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.1.3](https://github.com/graphql/graphiql/compare/monaco-graphql@0.1.2...monaco-graphql@0.1.3) (2020-06-04)\n\n### Bug Fixes\n\n- cleanup cache entry from lerna publish ([4a26218](https://github.com/graphql/graphiql/commit/4a2621808a1aea8b30d5d27b8d86a60bf2b44b01))\n\n## [0.1.2](https://github.com/graphql/graphiql/compare/monaco-graphql@0.1.1...monaco-graphql@0.1.2) (2020-05-28)\n\n**Note:** Version bump only for package monaco-graphql\n\n## [0.1.1](https://github.com/graphql/graphiql/compare/monaco-graphql@0.1.0...monaco-graphql@0.1.1) (2020-05-19)\n\n**Note:** Version bump only for package monaco-graphql\n\n# 0.1.0 (2020-05-17)\n\n### Features\n\n- Monaco Mode - Phase 2 - Mode & Worker ([#1459](https://github.com/graphql/graphiql/issues/1459)) ([bc95fb4](https://github.com/graphql/graphiql/commit/bc95fb46459a4437ff9471ff43c98e1c5c50f51e))\n- monaco-graphql docs, api, improvements ([#1521](https://github.com/graphql/graphiql/issues/1521)) ([c79158c](https://github.com/graphql/graphiql/commit/c79158c72e976ab286e7ec3fded7f3e2d24e50d0))\n"
  },
  {
    "path": "packages/monaco-graphql/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/monaco-graphql/README.md",
    "content": "[Changelog](https://github.com/graphql/graphiql/blob/main/packages/monaco-graphql/CHANGELOG.md)\n|\n[API Docs](https://graphiql-test.netlify.app/typedoc/modules/graphql_language_service_server.html)\n| [Discord Channel](https://discord.gg/r4BxrAG6fN)\n\nGraphQL language plugin for the Monaco Editor. You can use it to build\nvscode/codespaces-like web or desktop IDEs using whatever frontend javascript\nlibraries or frameworks you want, or none!\n\n- [webpack example](https://github.com/graphql/graphiql/tree/main/examples/monaco-graphql-webpack/)\n  using plain javascript, shows how to change schemas\n- [vite + react example](https://stackblitz.com/edit/monaco-graphql-react-vite?file=src%2FApp.tsx&terminal=dev) -\n  minimal example with variables (C)JSON support using react\n- [live demo](https://monaco-graphql.netlify.com) of the monaco webpack example\n  (prompts for GitHub access token!)\n\n> **NOTE:** This is in pre-release state as we build towards GraphiQL 2.0.x.\n> [`codemirror-graphql`](https://github.com/graphql/graphiql/tree/main/packages/codemirror-graphql)\n> has more features (such as JSON variables validation) and is more stable.\n\n## Features\n\nIt provides the following features while editing GraphQL files:\n\n- Configurable multi-model, multi-schema language worker with `fileMatch`\n  expressions\n- Code completion (schema driven) for Operation and SDL types\n  - Automatic expansion & completion on leaf type completion\n- Hover (schema driven) with markdown support\n- Validation (schema driven)\n- JSON Variables validation and language features (schema driven)\n- Formatting - using prettier\n- Syntax Highlighting & Basic Languages provided by `monaco-editor` basic\n  languages support\n- Configurable formatting options\n- Providing external fragments\n- create custom workers for custom language service options - parser, validation\n  rules, schemaBuilder, etc\n\n## Usage\n\nFor now, we use `language` id of `graphql` until we can ensure we can dovetail\nnicely with the official `graphql` language ID.\n\nTo use with webpack, here is an example to get you started:\n\n```sh\nyarn add monaco-graphql\n```\n\n## Sync Example\n\n```ts\nimport * as monaco from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { initializeMode } from 'monaco-graphql/initializeMode'; // `monaco-graphql/esm/initializeMode` still works\n\n// you can also configure these using the webpack or vite plugins for `monaco-editor`\nimport GraphQLWorker from 'worker-loader!monaco-graphql/esm/graphql.worker';\n\n// instantiates the worker & language features with the schema!\nconst MonacoGraphQLAPI = initializeMode({\n  schemas: [\n    {\n      schema: myGraphqlSchema as GraphQLSchema,\n      // anything that monaco.URI.from() is compatible with\n      uri: 'https://my-schema.com',\n      uri: '/my-schema.graphql',\n      // match the monaco file uris for this schema.\n      // accepts specific uris and anything `picomatch` supports.\n      // (everything except bracket regular expressions)\n      fileMatch: ['**/*.graphql'],\n      // note: not sure if ^ works if the graphql model is using urls for uris?\n    },\n  ],\n});\n\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    if (label === 'graphql') {\n      return new GraphQLWorker();\n    }\n    // if you are using vite or webpack plugin, it will be found here\n    return new Worker('editor.worker.js');\n  },\n};\nmonaco.editor.create(document.getElementById('someElementId'), {\n  value: 'query { }',\n  language: 'graphql',\n  formatOnPaste: true,\n});\n```\n\n## Lazy Example\n\nThe existing API works as before in terms of instantiating the schema.\nTo avoid manually calling getWorker(), you can use the monaco editor plugins for webpack or vite (see examples, and below)\n\n```ts\nimport * as monaco from 'monaco-editor/esm/vs/editor/editor.api';\n// enables our language worker right away, despite no schema\nimport 'monaco-graphql';\n\n// you can also configure these using the webpack or vite plugins for `monaco-editor`\nimport GraphQLWorker from 'worker-loader!monaco-graphql/esm/graphql.worker';\n\n// lazily invoke the api config methods whenever we want!\nmonaco.languages.graphql.setSchemaConfig([\n  {\n    schema: myGraphqlSchema as GraphQLSchema,\n    // anything that monaco.URI.from() is compatible with\n    uri: 'https://my-schema.com',\n    uri: '/my-schema.graphql',\n    // match the monaco file uris for this schema.\n    // accepts specific uris and anything `picomatch` supports.\n    // (everything except bracket regular expressions)\n    fileMatch: ['**/*.graphql'],\n    // note: not sure if ^ works if the graphql model is using urls for uris?\n  },\n]);\n\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    if (label === 'graphql') {\n      return new GraphQLWorker();\n    }\n    return new Worker('editor.worker.js');\n  },\n};\nmonaco.editor.create(document.getElementById('someElementId'), {\n  value: 'query { }',\n  language: 'graphql',\n  formatOnPaste: true,\n});\n```\n\nThis will cover the basics, making an HTTP POST with the default\n`introspectionQuery()` operation. To customize the entire fetcher, see\n[advanced customization]() below. For more customization options, see the\n[Monaco Editor API Docs](https://microsoft.github.io/monaco-editor/api/index.html)\n\n## Advanced Usage\n\n### Variables JSON Support!\n\nIn `monaco-graphql@0.5.0` we introduced a method `getVariablesJSONSchema` that\nallows you to retrieve a `JSONSchema` description for the declared variables for\nany given set of operations\n\n## Full Sync Demo with Variables JSON\n\n```ts\nimport * as monaco from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { initializeMode } from 'monaco-graphql/initializeMode';\n\nimport GraphQLWorker from 'worker-loader!monaco-graphql/esm/graphql.worker';\n\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    if (label === 'graphql') {\n      return new GraphQLWorker();\n    }\n    return new Worker('editor.worker.js');\n  },\n};\n\n// the language service will be instantiated once the schema is available\nconst MonacoGraphQLAPI = initializeMode({\n  schemas: [\n    {\n      // anything that monaco.URI.from() is compatible with\n      uri: 'https://my-schema.com',\n      // match the monaco file uris for this schema.\n      // accepts specific filenames and anything `picomatch` supports.\n      fileMatch: ['**/*.graphql'],\n      schema: myGraphqlSchema as GraphQLSchema,\n    },\n  ],\n});\n\nconst operationModel = monaco.editor.createModel(\n  'query {}',\n  'graphql',\n  '/operation.graphql',\n);\n\nconst operationEditor = monaco.editor.create(\n  document.getElementById('someElementId'),\n  {\n    model: operationModel,\n    language: 'graphql',\n    formatOnPaste: true,\n  },\n);\n\nconst variablesSchemaUri = monaco.editor.URI.file('/variables-schema.json');\n\nconst variablesModel = monaco.editor.createModel(\n  '{}',\n  'json',\n  '/variables.json',\n);\n\nconst variablesEditor = monaco.editor.create(\n  document.getElementById('someElementId'),\n  {\n    model: variablesModel,\n    language: 'graphql',\n    formatOnPaste: true,\n  },\n);\n\n// high-level method for configuring json variables validation\nMonacoGraphQLAPI.setDiagnosticSettings({\n  validateVariablesJson: {\n    // Urls, uris, anything that monaco.URI.from() is compatible with.\n    // Match operation model to variables editor,\n    // and the language service will automatically listen for changes,\n    // and compute the json schema using the GraphQLWorker.\n    // This is in the main process is applied to the global monaco json settings\n    // for validation, completion and more using monaco-json's built-in JSON Schema support.\n    [operationModel.uri.toString()]: [variablesModel.uri.toString()],\n  },\n  jsonDiagnosticSettings: {\n    allowComments: true, // allow json, parse with a jsonc parser to make requests\n  },\n});\n\nMonacoGraphQL.setCompletionSettings({\n  // this auto-fills NonNull leaf fields\n  // it used to be on by default, but is annoying when\n  // fields contain required argument.\n  // hoping to fix that soon!\n  __experimental__fillLeafsOnComplete: true,\n});\n```\n\nYou can also experiment with the built-in `jsonc`? (JSON\nsyntax that allows comments and trailing commas, for `tsconfig.json`, etc.) and the 3rd party `monaco-yaml` language modes\nfor completion of other types of variable input. you can also experiment with\neditor methods to parse detected input into different formats, etc (`yaml`\npastes as `json`, etc.)\n\nYou could of course prefer to generate a `jsonschema` form for variables input\nusing a framework of your choice, instead of an editor. Enjoy!\n\n## `monaco-graphql/lite`\n\nYou can also import a \"lite\" version, and manually enable only the monaco features you want!\n\nWarning: by default, completion and other features will not work, only highlighting and validation.\n\n```ts\nimport { initializeMode } from 'monaco-graphql/lite';\n\n// enable completion\nimport 'monaco-editor/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution';\n\nconst api = initializeMode({\n  schemas: [\n    {\n      // anything that monaco.URI.from() is compatible with\n      uri: 'schema.graphql',\n      // match the monaco file uris for this schema.\n      // accepts specific filenames and anything `picomatch` supports.\n      fileMatch: ['operation.graphql'],\n      schema: myGraphqlSchema as GraphQLSchema,\n    },\n  ],\n});\n```\n\n## `MonacoGraphQLAPI` ([typedoc](https://graphiql-test.netlify.app/typedoc/classes/monaco_graphql.monacoMonacoGraphQLAPI.html))\n\nIf you call any of these API methods to modify the language service\nconfiguration at any point at runtime, the webworker will reload relevant\nlanguage features.\n\nIf you `import 'monaco-graphql'` synchronously, you can access the api via\n`monaco.languages.graphql.api`.\n\n```ts\nimport 'monaco-graphql';\n// now the api will be available on the `monaco.languages` global\nconst { api } = monaco.languages.graphql;\n```\n\n```ts\nimport 'monaco-graphql';\n\n// also this\nimport { languages } from 'monaco-editor';\n// now the api will be available on the `monaco.languages` global\nconst { api } = languages.graphql;\n```\n\nOtherwise, you can, like in the sync demo above:\n\n```ts\nimport { initializeMode } from 'monaco-graphql/initializeMode';\n\nconst api = initializeMode(config);\n```\n\n### `monaco.languages.graphql.api.setSchemaConfig([SchemaConfig])`\n\nsame as the above, except it overwrites the entire schema config.\n\nyou can provide multiple, and use `fileMatch` to map to various uri \"directory\"\nglobs or specific files. `uri` can be an url or file path, anything parsable\n\n```ts\n// you can load it lazily\nimport 'monaco-graphql';\n\nmonaco.languages.graphql.api.setSchemaConfig([\n  {\n    schema: GraphQLSchema,\n    fileMatch: ['**/*.graphql'],\n    uri: 'my-schema.graphql',\n  },\n]);\n```\n\nor you can load the language features only when you have your schema\n\n```ts\nimport { initializeMode } from 'monaco-graphql/initializeMode';\n\nconst schemas = [\n  {\n    schema: GraphQLSchema,\n    fileMatch: ['operations/*.graphql'],\n    uri: 'my-schema.graphql',\n  },\n];\nconst api = initializeMode({ schemas });\n\n// add another schema. this will cause language workers and features to reset\napi.setSchemaConfig([\n  ...schemas,\n  {\n    introspectionJSON: myIntrospectionJSON,\n    fileMatch: ['specific/monaco/uri.graphql'],\n    uri: 'another-schema.graphql',\n  },\n]);\n```\n\nor if you want, replace the entire configuration with a single schema. this will\ncause the worker to be entirely re-created and language services reset\n\n```ts\napi.setSchemaConfig([\n  {\n    introspectionJSON: myIntrospectionJSON,\n    fileMatch: ['**/*.graphql'],\n    uri: 'my-schema.graphql',\n  },\n]);\n```\n\n### `monaco.languages.graphql.api.setModeConfiguration()`\n\nThis is where you can toggle monaco language features. all are enabled by\ndefault.\n\n```ts\nmonaco.languages.graphql.api.setModeConfiguration({\n  documentFormattingEdits: true,\n  completionItems: true,\n  hovers: true,\n  documentSymbols: true,\n  diagnostics: true,\n});\n```\n\n### `monaco.languages.graphql.api.setFormattingOptions()`\n\nthis accepts an object `{ prettierConfig: prettier.Options }`, which accepts\n[any prettier option](https://prettier.io/docs/en/options.html). it will not\nre-load the schema or language features, however the new prettier options will\ntake effect.\n\nthis method overwrites the previous configuration, and will only accept static\nvalues that can be passed between the main/worker process boundary.\n\n```ts\nmonaco.languages.graphql.api.setFormattingOptions({\n  // if you wanna be like that\n  prettierOptions: { tabWidth: 2, useTabs: true },\n});\n```\n\n### `monaco.languages.graphql.api.setExternalFragmentDefinitions()`\n\nAppend external fragments to be used by autocomplete and other language\nfeatures.\n\nThis accepts either a string that contains fragment definitions, or\n`TypeDefinitionNode[]`\n\n### `monaco.languages.graphql.api.getDiagnosticOptions`\n\n```ts\nmonaco.languages.graphql.api.setDiagnosticSettings({\n  validateVariablesJson: {\n    // Urls, uris, anything that monaco.URI.from() is compatible with.\n    // Match operation model to variables editor,\n    // and the language service will automatically listen for changes,\n    // and compute the json schema using the GraphQLWorker.\n    // This is in the main process is applied to the global monaco json settings\n    // for validation, completion and more using monaco-json's built-in JSON Schema support.\n    [operationModel.uri.toString()]: [variablesModel.uri.toString()],\n  },\n  jsonDiagnosticSettings: {\n    allowComments: true, // allow json, parse with a jsonc parser to make requests\n  },\n});\n```\n\n## Bundlers\n\n### Webpack\n\nyou'll can refer to the webpack configuration in the\n[full monaco webpack example](/examples/monaco-graphql-webpack#readme) to see\nhow it works with webpack and the official `monaco-editor-webpack-plugin`. there\nis probably an easier way to configure webpack `worker-loader` for this.\n\n**Notes:**\n\n- for additional features, please specify them in `features` for the webpack plugin, or import them directly\n- if you are trying to add `typescript` as a language, there is an outstanding [bug with the webpack plugin](https://github.com/microsoft/monaco-editor/issues/2738), see our [next.js example](../../examples/monaco-graphql-nextjs/next.config.js) for the workaround. do not specify `languages: ['typescript']` or `javascript`\n\n### Vite\n\nYou can configure vite to load `monaco-editor` json mode and even the language\neditor worker using\n[the example for our mode](https://github.com/vdesjs/vite-plugin-monaco-editor#options)\n\nBe sure to import additional editor features and language modes manually, as the vite plugin only allows you to specify `languageWorkers`.\nSee the vite example to see how to add typescript support\n\n## Web Frameworks\n\nthe plain javascript\n[webpack example](https://github.com/graphql/graphiql/tree/main/examples/monaco-graphql-webpack/)\nshould give you a starting point to see how to implement it with\n\n### React\n\n- [`use-monaco`](https://www.npmjs.com/package/use-monaco) seems to support the\n  custom language worker configuration we want, and seems to be well built! we\n  hope to help them build their\n- when loading it yourself, either dynamic import the mode and/or instantiate it\n  yourself using `useEffect` on `didMount` to prevent breaking SSR.\n- it may work with other libraries by using a similar strategy to\n  [this](https://github.com/graphql/graphiql/blob/9df315b44896efa313ed6744445fc8f9e702ebc3/examples/monaco-graphql-webpack/src/editors.ts#L15).\n  you can also provide `MonacoEnvironment.getWorkerUrl` which works better as an\n  async import of your pre-build worker files\n\n## Custom Webworker (for passing non-static config to worker)\n\nIf you want to pass a custom parser and/or validation rules, it is supported,\nhowever the setup is a bit more complicated.\n\nYou can add any `LanguageServiceConfig`\n([typedoc](https://graphiql-test.netlify.app/typedoc/modules/graphql_language_service.html#graphqllanguageconfig-1))\nconfiguration options you like here to `languageConfig` as below.\n\nThis is because we can't pass non-static configuration to the existing worker\nprogrammatically, so you must import these and build the worker custom with\nthose functions. Part of the (worthwhile) cost of crossing runtimes!\n\nyou'll want to create your own `my-graphql.worker.ts` file, and add your custom\nconfig such as `schemaLoader` to `createData`:\n\n```ts\n// my-graphql.worker.ts\nimport type * as monaco from 'monaco-editor';\nimport type { ICreateData } from 'monaco-graphql';\n// @ts-expect-error -- ignore missing types\nimport { initialize } from 'monaco-editor/esm/vs/editor/editor.worker';\nimport { GraphQLWorker } from 'monaco-graphql/esm/GraphQLWorker';\nimport { GraphQLError, ValidationRule } from 'graphql';\n\nconst RequireOperationNameRule: ValidationRule = context => {\n  return {\n    OperationDefinition(node) {\n      if (node.name) {\n        return;\n      }\n      context.reportError(\n        new GraphQLError('Oops, all operations must be named.', {\n          nodes: [node],\n        }),\n      );\n    },\n  };\n};\n\nglobalThis.onmessage = () => {\n  initialize((ctx: monaco.worker.IWorkerContext, createData: ICreateData) => {\n    createData.languageConfig.customValidationRules = [\n      RequireOperationNameRule,\n    ];\n    return new GraphQLWorker(ctx, createData);\n  });\n};\n```\n\nthen, in your application:\n\n```ts\n// Vite query suffixes https://vite.dev/guide/features.html#import-with-query-suffixes\nimport EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';\nimport GraphQLWorker from './my-graphql.worker?worker';\n\nglobalThis.MonacoEnvironment = {\n  getWorker(_workerId: string, label: string) {\n    return label === 'graphql' ? new GraphQLWorker() : new EditorWorker();\n  },\n};\n```\n\nor, if you have webpack configured for it:\n\n```ts\nglobalThis.MonacoEnvironment = {\n  getWorkerUrl(_workerId: string, label: string) {\n    return label === 'graphql' ? 'my-graphql.worker.js' : 'editor.worker.js';\n  },\n};\n```\n\nwith vite you just need:\n\n```ts\nimport { defineConfig } from 'vite';\nimport monacoEditorPlugin from 'vite-plugin-monaco-editor';\n\nexport default defineConfig({\n  plugins: [\n    monacoEditorPlugin({\n      customWorker: [\n        {\n          label: 'graphql',\n          entry: 'my-graphql.worker.js',\n        },\n      ],\n    }),\n  ],\n});\n```\n\n## Monaco Editor Tips\n\nIf you are familiar with Codemirror/Atom-era terminology and features, here's\nsome gotchas:\n\n- \"hinting\" => \"code completion\" in LSP terminology\n- \"linting\" => \"diagnostics\" in lsp terminology\n- the default keymap is different, more vscode like\n- command palette and right click context menu are important\n- you can extend the provided standard completion, linting, etc. for example,\n  `editor.setModelMarkers()`\n- [Monaco Editor API Docs](https://microsoft.github.io/monaco-editor/api/index.html)\n- [Monaco Editor Samples](https://github.com/Microsoft/monaco-editor-samples)\n  repository is great for tips on implementing with different bundlers,\n  runtimes, etc.\n\n## Avoid Bundle All `monaco-editor`'s Languages\n\nWhile importing `monaco-editor` in your project, you silently import 83 builtin\nlanguages, such as `typescript`, `html`, `css`, `json` and others. You can found\na full list of\n[basic-languages](https://github.com/microsoft/monaco-editor/tree/main/src/basic-languages)\nand\n[languages](https://github.com/microsoft/monaco-editor/tree/main/src/language).\n\nFor `monaco-graphql`, you need only 2 languages - `graphql` and `json`.\nIn version `monaco-graphql@1.3.0` and later, you can replace all `monaco-editor`'s\nimports with `monaco-graphql/esm/monaco-editor` to improve performance, load\nonly `graphql` and `json` languages, and skip loading unused languages.\n\n```diff\n-import { ... } from 'monaco-editor'\n+import { ... } from 'monaco-graphql/esm/monaco-editor'\n```\n\n### Catch Future Import Mistakes with ESLint\n\nTo prevent mis-importing of `monaco-editor`, you can set up default\n`no-restricted-imports` rule for JavaScript projects or\n`@typescript-eslint/no-restricted-imports` for TypeScript projects.\n\n```json5\n{\n  rules: {\n    // or @typescript-eslint/no-restricted-imports\n    'no-restricted-imports': [\n      'error',\n      {\n        name: 'monaco-editor',\n        message: '`monaco-editor` imports all languages; use `monaco-graphql/esm/monaco-editor` instead to import only `json` and `graphql` languages',\n      },\n    ],\n  },\n}\n```\n\n## Inspiration\n\n`microsoft/monaco-json` was our inspiration from the outset, when it was still a\nstandalone repository. @acao actually wholesale copied many files, you could\nalmost say it was a fork!\n\n## TODO\n\n- [x] variables JSON validation\n- [x] variables completion\n- [ ] Symbols & Definitions\n- [x] file uri-driven schema loading\n- [x] op -> schema & schema -> schema references\n- [x] `insertText` for field and argument completion\n"
  },
  {
    "path": "packages/monaco-graphql/package.json",
    "content": "{\n  \"name\": \"monaco-graphql\",\n  \"description\": \"full service, official monaco mode for GraphQL\",\n  \"version\": \"1.7.3\",\n  \"license\": \"MIT\",\n  \"main\": \"dist/monaco.contribution.js\",\n  \"module\": \"esm/monaco.contribution.js\",\n  \"types\": \"esm/monaco.contribution.d.ts\",\n  \"contributors\": [\n    {\n      \"name\": \"Peng Lyu\",\n      \"url\": \"https://github.com/rebornix\"\n    },\n    {\n      \"name\": \"Rikki Schulte\",\n      \"url\": \"https://github.com/acao\"\n    }\n  ],\n  \"exports\": {\n    \".\": {\n      \"types\": \"./esm/monaco.contribution.d.ts\",\n      \"import\": \"./esm/monaco.contribution.js\",\n      \"require\": \"./dist/monaco.contribution.js\",\n      \"default\": \"./dist/monaco.contribution.js\"\n    },\n    \"./*\": {\n      \"types\": \"./*\",\n      \"import\": \"./*\",\n      \"require\": \"./*\",\n      \"default\": \"./*\"\n    },\n    \"./esm/graphql.worker\": {\n      \"types\": \"./esm/graphql.worker.d.ts\",\n      \"import\": \"./esm/graphql.worker.js\",\n      \"require\": \"./dist/graphql.worker.js\"\n    },\n    \"./lite\": {\n      \"types\": \"./esm/lite.d.ts\",\n      \"import\": \"./esm/lite.js\",\n      \"require\": \"./dist/lite.js\",\n      \"default\": \"./dist/lite.js\"\n    },\n    \"./graphql.worker\": {\n      \"types\": \"./esm/graphql.worker.d.ts\",\n      \"import\": \"./esm/graphql.worker.js\",\n      \"require\": \"./dist/graphql.worker.js\",\n      \"default\": \"./dist/graphql.worker.js\"\n    },\n    \"./initializeMode\": {\n      \"types\": \"./esm/initializeMode.d.ts\",\n      \"import\": \"./esm/initializeMode.js\",\n      \"require\": \"./dist/initializeMode.js\",\n      \"default\": \"./dist/initializeMode.js\"\n    }\n  },\n  \"repository\": {\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/monaco-graphql\"\n  },\n  \"files\": [\n    \"dist\",\n    \"esm\"\n  ],\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"test\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"graphql-language-service\": \"^5.5.0\",\n    \"picomatch-browser\": \"^2.2.6\"\n  },\n  \"devDependencies\": {\n    \"execa\": \"^7.1.1\",\n    \"graphql\": \"^16.9.0\",\n    \"monaco-editor\": \"0.52.2\",\n    \"prettier\": \"3.3.2\",\n    \"vscode-languageserver-types\": \"^3.17.1\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^15.5.0 || ^16.0.0 || ^17.0.0\",\n    \"monaco-editor\": \">= 0.20.0 < 0.53\",\n    \"prettier\": \"^2.8.0 || ^3.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/GraphQLWorker.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { FormattingOptions, ICreateData, SchemaConfig } from './typings';\nimport type * as monaco from './monaco-editor';\nimport { getRange } from 'graphql-language-service';\nimport { LanguageService } from './LanguageService';\nimport {\n  toGraphQLPosition,\n  toMonacoRange,\n  toMarkerData,\n  toCompletion,\n  GraphQLWorkerCompletionItem,\n} from './utils';\n\nexport class GraphQLWorker {\n  private _ctx: monaco.worker.IWorkerContext;\n  private _languageService: LanguageService;\n  private _formattingOptions: FormattingOptions | undefined;\n\n  constructor(ctx: monaco.worker.IWorkerContext, createData: ICreateData) {\n    this._ctx = ctx;\n    this._languageService = new LanguageService(createData.languageConfig);\n    this._formattingOptions = createData.formattingOptions;\n  }\n\n  public async doValidation(uri: string) {\n    try {\n      const documentModel = this._getTextModel(uri);\n      const document = documentModel?.getValue();\n      if (!document) {\n        return [];\n      }\n      const graphqlDiagnostics = this._languageService.getDiagnostics(\n        uri,\n        document,\n      );\n      return graphqlDiagnostics.map(toMarkerData);\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error(err);\n      return [];\n    }\n  }\n\n  public async doComplete(\n    uri: string,\n    position: monaco.Position,\n  ): Promise<GraphQLWorkerCompletionItem[]> {\n    try {\n      const documentModel = this._getTextModel(uri);\n      const document = documentModel?.getValue();\n      if (!document) {\n        return [];\n      }\n      const graphQLPosition = toGraphQLPosition(position);\n      const suggestions = this._languageService.getCompletion(\n        uri,\n        document,\n        graphQLPosition,\n      );\n      return suggestions.map(suggestion => toCompletion(suggestion));\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error(err);\n      return [];\n    }\n  }\n\n  public async doHover(uri: string, position: monaco.Position) {\n    try {\n      const documentModel = this._getTextModel(uri);\n      const document = documentModel?.getValue();\n      if (!document) {\n        return null;\n      }\n      const graphQLPosition = toGraphQLPosition(position);\n      const hover = this._languageService.getHover(\n        uri,\n        document,\n        graphQLPosition,\n      );\n      const location = {\n        column: graphQLPosition.character,\n        line: graphQLPosition.line,\n      };\n      return {\n        content: hover,\n        range: toMonacoRange(getRange(location, document)),\n      };\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error(err);\n      return null;\n    }\n  }\n\n  public async doGetVariablesJSONSchema(uri: string): Promise<unknown> {\n    const documentModel = this._getTextModel(uri);\n    const document = documentModel?.getValue();\n    if (!documentModel || !document) {\n      return null;\n    }\n    const jsonSchema = this._languageService.getVariablesJSONSchema(\n      uri,\n      document,\n      { useMarkdownDescription: true },\n    );\n    if (jsonSchema) {\n      return {\n        ...jsonSchema,\n        $id: 'monaco://variables-schema.json',\n        title: 'GraphQL Variables',\n      };\n    }\n\n    return null;\n  }\n\n  async doFormat(uri: string): Promise<string | null> {\n    const documentModel = this._getTextModel(uri);\n    const document = documentModel?.getValue();\n    if (!documentModel || !document) {\n      return null;\n    }\n    const prettierStandalone = await import('prettier/standalone');\n    const prettierGraphqlParser = await import('prettier/parser-graphql');\n\n    return prettierStandalone.format(document, {\n      parser: 'graphql',\n      // @ts-expect-error -- should be fixed by pnpm migration\n      plugins: [prettierGraphqlParser],\n      ...this._formattingOptions?.prettierConfig,\n    });\n  }\n\n  /**\n   * TODO: store this in a proper document cache in the language service\n   */\n  private _getTextModel(uri: string): monaco.worker.IMirrorModel | null {\n    const models = this._ctx.getMirrorModels();\n    for (const model of models) {\n      if (model.uri.toString() === uri) {\n        return model;\n      }\n    }\n    return null;\n  }\n\n  public doUpdateSchema(schema: SchemaConfig) {\n    return this._languageService.updateSchema(schema);\n  }\n\n  public doUpdateSchemas(schemas: SchemaConfig[]) {\n    return this._languageService.updateSchemas(schemas);\n  }\n}\n\nexport default {\n  GraphQLWorker,\n};\n\nexport function create(\n  ctx: monaco.worker.IWorkerContext,\n  createData: ICreateData,\n): GraphQLWorker {\n  return new GraphQLWorker(ctx, createData);\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/LanguageService.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport {\n  parse,\n  GraphQLSchema,\n  ParseOptions,\n  ValidationRule,\n  FragmentDefinitionNode,\n  visit,\n  DocumentNode,\n  Source,\n} from 'graphql';\nimport picomatch from 'picomatch-browser';\nimport type {\n  AutocompleteSuggestionOptions,\n  IPosition,\n} from 'graphql-language-service';\nimport {\n  getAutocompleteSuggestions,\n  getDiagnostics,\n  getHoverInformation,\n  HoverConfig,\n  getVariablesJSONSchema,\n  getOperationASTFacts,\n  JSONSchemaOptions,\n} from 'graphql-language-service';\nimport { defaultSchemaLoader } from './schemaLoader';\nimport { SchemaConfig, SchemaLoader, GraphQLLanguageConfig } from './typings';\n\ntype SchemaCacheItem = Omit<SchemaConfig, 'schema'> & { schema: GraphQLSchema };\n\ntype SchemaCache = Map<string, SchemaCacheItem>;\nconst schemaCache: SchemaCache = new Map();\n\n/**\n * Currently only used by the `monaco-graphql` worker\n */\nexport class LanguageService {\n  private _parser: typeof parse = parse;\n  private _schemas: SchemaConfig[] = [];\n  private _schemaCache: SchemaCache = schemaCache;\n  private _schemaLoader: SchemaLoader = defaultSchemaLoader;\n  private _parseOptions?: ParseOptions;\n  private _customValidationRules?: ValidationRule[];\n  private _externalFragmentDefinitionNodes: FragmentDefinitionNode[] | null =\n    null;\n  private _externalFragmentDefinitionsString: string | null = null;\n  private _completionSettings: AutocompleteSuggestionOptions;\n  constructor({\n    parser,\n    schemas,\n    parseOptions,\n    externalFragmentDefinitions,\n    customValidationRules,\n    fillLeafsOnComplete,\n    completionSettings,\n  }: GraphQLLanguageConfig) {\n    this._schemaLoader = defaultSchemaLoader;\n    if (schemas) {\n      this._schemas = schemas;\n      this._cacheSchemas();\n    }\n    if (parser) {\n      this._parser = parser;\n    }\n    this._completionSettings = {\n      ...completionSettings,\n      fillLeafsOnComplete:\n        completionSettings?.fillLeafsOnComplete ?? fillLeafsOnComplete,\n    };\n\n    if (parseOptions) {\n      this._parseOptions = parseOptions;\n    }\n    if (customValidationRules) {\n      this._customValidationRules = customValidationRules;\n    }\n    if (externalFragmentDefinitions) {\n      if (Array.isArray(externalFragmentDefinitions)) {\n        this._externalFragmentDefinitionNodes = externalFragmentDefinitions;\n      } else {\n        this._externalFragmentDefinitionsString = externalFragmentDefinitions;\n      }\n    }\n  }\n\n  private _cacheSchemas() {\n    for (const schema of this._schemas) {\n      this._cacheSchema(schema);\n    }\n  }\n\n  private _cacheSchema(schemaConfig: SchemaConfig) {\n    const schema = this._schemaLoader(schemaConfig, this.parse.bind(this));\n    return this._schemaCache.set(schemaConfig.uri, {\n      ...schemaConfig,\n      schema,\n    });\n  }\n\n  /**\n   * Provide a model uri path, and see if a schema config has a `fileMatch` to match it\n   * @param uri {string}\n   * @returns {SchemaCacheItem | undefined}\n   */\n  public getSchemaForFile(uri: string): SchemaCacheItem | undefined {\n    if (!this._schemas.length) {\n      return;\n    }\n    if (this._schemas.length === 1) {\n      return this._schemaCache.get(this._schemas[0]!.uri);\n    }\n    const schema = this._schemas.find(schemaConfig => {\n      if (!schemaConfig.fileMatch) {\n        return false;\n      }\n      return schemaConfig.fileMatch.some(glob => {\n        const isMatch = picomatch(glob);\n        return isMatch(uri);\n      });\n    });\n    if (schema) {\n      const cacheEntry = this._schemaCache.get(schema.uri);\n      if (cacheEntry) {\n        return cacheEntry;\n      }\n      const cache = this._cacheSchema(schema);\n      return cache.get(schema.uri);\n    }\n  }\n\n  public getExternalFragmentDefinitions(): FragmentDefinitionNode[] {\n    if (\n      !this._externalFragmentDefinitionNodes &&\n      this._externalFragmentDefinitionsString\n    ) {\n      const definitionNodes: FragmentDefinitionNode[] = [];\n      try {\n        visit(this._parser(this._externalFragmentDefinitionsString), {\n          FragmentDefinition(node) {\n            definitionNodes.push(node);\n          },\n        });\n      } catch {\n        throw new Error(\n          `Failed parsing externalFragmentDefinitions string:\\n${this._externalFragmentDefinitionsString}`,\n        );\n      }\n\n      this._externalFragmentDefinitionNodes = definitionNodes;\n    }\n    return this._externalFragmentDefinitionNodes!;\n  }\n\n  /**\n   * Override `schemas` config entirely.\n   */\n  public async updateSchemas(schemas: SchemaConfig[]): Promise<void> {\n    this._schemas = schemas;\n    this._cacheSchemas();\n  }\n\n  /**\n   * Overwrite an existing schema config by Uri string.\n   */\n  public updateSchema(schema: SchemaConfig): void {\n    const schemaIndex = this._schemas.findIndex(c => c.uri === schema.uri);\n    if (schemaIndex < 0) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        'updateSchema could not find a schema in your config by that URI',\n        schema.uri,\n      );\n      return;\n    }\n    this._schemas[schemaIndex] = schema;\n    this._cacheSchema(schema);\n  }\n\n  /**\n   * Add a schema to the config.\n   */\n  public addSchema(schema: SchemaConfig): void {\n    this._schemas.push(schema);\n    this._cacheSchema(schema);\n  }\n  /**\n   * Uses the configured parser\n   * @param text {string | Source}\n   * @param options {ParseOptions}\n   * @returns {DocumentNode}\n   */\n  public parse(text: string | Source, options?: ParseOptions): DocumentNode {\n    return this._parser(text, options || this._parseOptions);\n  }\n  /**\n   * get completion for the given uri and matching schema\n   * @param uri\n   * @param documentText\n   * @param position\n   * @returns\n   */\n  public getCompletion = (\n    uri: string,\n    documentText: string,\n    position: IPosition,\n  ) => {\n    const schema = this.getSchemaForFile(uri);\n    if (!documentText || !schema?.schema) {\n      return [];\n    }\n    return getAutocompleteSuggestions(\n      schema.schema,\n      documentText,\n      position,\n      undefined,\n      this.getExternalFragmentDefinitions(),\n      { uri, ...this._completionSettings },\n    );\n  };\n  /**\n   * get diagnostics using graphql validation\n   */\n  public getDiagnostics = (\n    uri: string,\n    documentText: string,\n    customRules?: ValidationRule[],\n  ) => {\n    const schema = this.getSchemaForFile(uri);\n    if (!documentText || documentText.trim().length < 2 || !schema?.schema) {\n      return [];\n    }\n    return getDiagnostics(\n      documentText,\n      schema.schema,\n      customRules ?? this._customValidationRules,\n      false,\n      this.getExternalFragmentDefinitions(),\n    );\n  };\n\n  public getHover = (\n    uri: string,\n    documentText: string,\n    position: IPosition,\n    options?: HoverConfig,\n  ) => {\n    const schema = this.getSchemaForFile(uri);\n    if (schema && documentText.length > 3) {\n      return getHoverInformation(\n        schema.schema,\n        documentText,\n        position,\n        undefined,\n        {\n          useMarkdown: true,\n          ...options,\n        },\n      );\n    }\n  };\n\n  public getVariablesJSONSchema = (\n    uri: string,\n    documentText: string,\n    options?: JSONSchemaOptions,\n  ) => {\n    const schema = this.getSchemaForFile(uri);\n    if (schema && documentText.length > 3) {\n      try {\n        const documentAST = this.parse(documentText);\n        const { variableToType } = getOperationASTFacts(\n          documentAST,\n          schema.schema,\n        );\n        if (variableToType) {\n          return getVariablesJSONSchema(variableToType, {\n            ...options,\n            scalarSchemas: schema.customScalarSchemas,\n          });\n        }\n      } catch {}\n    }\n    return null;\n  };\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/api.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { Emitter } from './monaco-editor';\nimport type * as monaco from './monaco-editor';\nimport type { FragmentDefinitionNode, GraphQLSchema } from 'graphql';\nimport type {\n  CompletionSettings,\n  DiagnosticSettings,\n  FormattingOptions,\n  ModeConfiguration,\n  MonacoGraphQLInitializeConfig,\n  SchemaConfig,\n  GraphQLLanguageConfig,\n} from './typings';\n\nexport interface MonacoGraphQLAPIOptions\n  extends Pick<\n      // Optional fields\n      MonacoGraphQLInitializeConfig,\n      'schemas'\n    >,\n    Pick<\n      // Required fields\n      Required<MonacoGraphQLInitializeConfig>,\n      | 'modeConfiguration'\n      | 'formattingOptions'\n      | 'diagnosticSettings'\n      | 'completionSettings'\n    > {\n  languageId: string;\n}\n\nexport type SchemaEntry = {\n  schema: GraphQLSchema;\n  documentString?: string;\n  introspectionJSONString?: string;\n};\n\nexport class MonacoGraphQLAPI {\n  private _onDidChange = new Emitter<MonacoGraphQLAPI>();\n  private _formattingOptions: FormattingOptions;\n  private _modeConfiguration: ModeConfiguration;\n  private _diagnosticSettings: DiagnosticSettings;\n  private _completionSettings: CompletionSettings;\n  private _schemas: SchemaConfig[] | null = null;\n  private _schemasById: Record<string, SchemaConfig> = Object.create(null);\n  private _languageId: string;\n  private _externalFragmentDefinitions: GraphQLLanguageConfig['externalFragmentDefinitions'];\n\n  constructor({\n    languageId,\n    schemas,\n    modeConfiguration,\n    formattingOptions,\n    diagnosticSettings,\n    completionSettings,\n  }: MonacoGraphQLAPIOptions) {\n    this._languageId = languageId;\n\n    if (schemas) {\n      this.setSchemaConfig(schemas);\n    }\n    this._modeConfiguration = modeConfiguration;\n    this._completionSettings = completionSettings;\n    this._diagnosticSettings = diagnosticSettings;\n    this._formattingOptions = formattingOptions;\n  }\n\n  public get onDidChange(): monaco.IEvent<MonacoGraphQLAPI> {\n    return this._onDidChange.event;\n  }\n\n  public get languageId(): string {\n    return this._languageId;\n  }\n\n  public get modeConfiguration(): ModeConfiguration {\n    return this._modeConfiguration;\n  }\n\n  public get schemas(): SchemaConfig[] | null {\n    return this._schemas;\n  }\n\n  public schemasById(): Record<string, SchemaConfig> {\n    return this._schemasById;\n  }\n\n  public get formattingOptions(): FormattingOptions {\n    return this._formattingOptions;\n  }\n\n  public get diagnosticSettings(): DiagnosticSettings {\n    return this._diagnosticSettings;\n  }\n\n  public get completionSettings(): CompletionSettings {\n    return {\n      ...this._completionSettings,\n      fillLeafsOnComplete:\n        this._completionSettings.__experimental__fillLeafsOnComplete ??\n        this._completionSettings.fillLeafsOnComplete,\n    };\n  }\n\n  public get externalFragmentDefinitions() {\n    return this._externalFragmentDefinitions;\n  }\n\n  /**\n   * override all schema config.\n   */\n  public setSchemaConfig(schemas: SchemaConfig[]): void {\n    this._schemas = schemas;\n    this._schemasById = schemas.reduce((result, schema) => {\n      result[schema.uri] = schema;\n      return result;\n    }, Object.create(null));\n    this._onDidChange.fire(this);\n  }\n\n  public setExternalFragmentDefinitions(\n    externalFragmentDefinitions: string | FragmentDefinitionNode[],\n  ) {\n    this._externalFragmentDefinitions = externalFragmentDefinitions;\n  }\n\n  public setModeConfiguration(modeConfiguration: ModeConfiguration): void {\n    this._modeConfiguration = modeConfiguration;\n    this._onDidChange.fire(this);\n  }\n\n  public setFormattingOptions(formattingOptions: FormattingOptions): void {\n    this._formattingOptions = formattingOptions;\n    this._onDidChange.fire(this);\n  }\n\n  public setDiagnosticSettings(diagnosticSettings: DiagnosticSettings): void {\n    this._diagnosticSettings = diagnosticSettings;\n    this._onDidChange.fire(this);\n  }\n\n  public setCompletionSettings(completionSettings: CompletionSettings): void {\n    this._completionSettings = completionSettings;\n    this._onDidChange.fire(this);\n  }\n}\n\nexport function create(\n  languageId: string,\n  config?: MonacoGraphQLInitializeConfig,\n) {\n  if (!config) {\n    return new MonacoGraphQLAPI({\n      languageId,\n      schemas: [],\n      formattingOptions: formattingDefaults,\n      modeConfiguration: modeConfigurationDefault,\n      diagnosticSettings: diagnosticSettingDefault,\n      completionSettings: completionSettingDefault,\n    });\n  }\n  const {\n    schemas,\n    formattingOptions,\n    modeConfiguration,\n    diagnosticSettings,\n    completionSettings,\n  } = config;\n  return new MonacoGraphQLAPI({\n    languageId,\n    schemas,\n    formattingOptions: {\n      ...formattingDefaults,\n      ...formattingOptions,\n      prettierConfig: {\n        ...formattingDefaults.prettierConfig,\n        ...formattingOptions?.prettierConfig,\n      },\n    },\n    modeConfiguration: {\n      ...modeConfigurationDefault,\n      ...modeConfiguration,\n    },\n    diagnosticSettings: {\n      ...diagnosticSettingDefault,\n      ...diagnosticSettings,\n    },\n    completionSettings: {\n      ...completionSettingDefault,\n      ...completionSettings,\n    },\n  });\n}\n\nexport const modeConfigurationDefault: Required<ModeConfiguration> = {\n  documentFormattingEdits: true,\n  documentRangeFormattingEdits: false,\n  completionItems: true,\n  hovers: true,\n  documentSymbols: false,\n  tokens: false,\n  colors: false,\n  foldingRanges: false,\n  diagnostics: true,\n  selectionRanges: false,\n};\n\nexport const formattingDefaults: FormattingOptions = {\n  prettierConfig: {\n    // rationale? a11y.\n    // https://adamtuttle.codes/blog/2021/tabs-vs-spaces-its-an-accessibility-issue/\n    tabWidth: 2,\n  },\n};\n\nexport const diagnosticSettingDefault: DiagnosticSettings = {\n  jsonDiagnosticSettings: {\n    schemaValidation: 'error',\n  },\n};\n\nexport const completionSettingDefault: CompletionSettings = {\n  __experimental__fillLeafsOnComplete: false,\n};\n"
  },
  {
    "path": "packages/monaco-graphql/src/full.ts",
    "content": "import 'monaco-editor/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution';\nimport 'monaco-editor/esm/vs/editor/contrib/format/browser/formatActions';\nimport 'monaco-editor/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching';\nimport 'monaco-editor/esm/vs/editor/browser/coreCommands';\nimport 'monaco-editor/esm/vs/editor/contrib/clipboard/browser/clipboard';\nimport 'monaco-editor/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo';\nimport 'monaco-editor/esm/vs/editor/contrib/contextmenu/browser/contextmenu';\nimport 'monaco-editor/esm/vs/editor/contrib/find/browser/findController';\n"
  },
  {
    "path": "packages/monaco-graphql/src/graphql.worker.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport type * as monaco from './monaco-editor';\nimport { ICreateData } from './typings';\n\n// @ts-expect-error\nimport { initialize } from 'monaco-editor/esm/vs/editor/editor.worker';\n\nimport { GraphQLWorker } from './GraphQLWorker';\n\nglobalThis.onmessage = () => {\n  initialize(\n    (ctx: monaco.worker.IWorkerContext, createData: ICreateData) =>\n      new GraphQLWorker(ctx, createData),\n  );\n};\n"
  },
  {
    "path": "packages/monaco-graphql/src/graphqlMode.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { Uri, IDisposable, languages } from './monaco-editor';\nimport { WorkerManager } from './workerManager';\nimport { GraphQLWorker } from './GraphQLWorker';\nimport { MonacoGraphQLAPI } from './api';\nimport * as languageFeatures from './languageFeatures';\n\nexport function setupMode(defaults: MonacoGraphQLAPI): IDisposable {\n  const disposables: IDisposable[] = [];\n  const providers: IDisposable[] = [];\n  const client = new WorkerManager(defaults);\n  disposables.push(client);\n\n  const worker: languageFeatures.WorkerAccessor = (\n    ...uris: Uri[]\n  ): Promise<GraphQLWorker> => {\n    try {\n      return client.getLanguageServiceWorker(...uris);\n    } catch {\n      throw new Error('Error fetching graphql language service worker');\n    }\n  };\n\n  function registerSchemaLessProviders(): void {\n    const { modeConfiguration, languageId } = defaults;\n    if (modeConfiguration.documentFormattingEdits) {\n      providers.push(\n        languages.registerDocumentFormattingEditProvider(\n          languageId,\n          new languageFeatures.DocumentFormattingAdapter(worker),\n        ),\n      );\n    }\n  }\n\n  function registerAllProviders(api: MonacoGraphQLAPI): void {\n    const { modeConfiguration, languageId } = defaults;\n    disposeAll(providers);\n\n    if (modeConfiguration.completionItems) {\n      providers.push(\n        languages.registerCompletionItemProvider(\n          languageId,\n          new languageFeatures.CompletionAdapter(worker),\n        ),\n      );\n    }\n    if (modeConfiguration.diagnostics) {\n      providers.push(new languageFeatures.DiagnosticsAdapter(api, worker));\n    }\n    if (modeConfiguration.hovers) {\n      providers.push(\n        languages.registerHoverProvider(\n          languageId,\n          new languageFeatures.HoverAdapter(worker),\n        ),\n      );\n    }\n\n    registerSchemaLessProviders();\n  }\n\n  let {\n    modeConfiguration,\n    formattingOptions,\n    diagnosticSettings,\n    externalFragmentDefinitions,\n    schemas,\n  } = defaults;\n\n  registerAllProviders(defaults);\n\n  defaults.onDidChange(newDefaults => {\n    if (newDefaults.modeConfiguration !== modeConfiguration) {\n      modeConfiguration = newDefaults.modeConfiguration;\n      registerAllProviders(newDefaults);\n    }\n    if (newDefaults.formattingOptions !== formattingOptions) {\n      formattingOptions = newDefaults.formattingOptions;\n      registerSchemaLessProviders();\n    }\n    if (\n      newDefaults.externalFragmentDefinitions !== externalFragmentDefinitions\n    ) {\n      externalFragmentDefinitions = newDefaults.externalFragmentDefinitions;\n      registerAllProviders(newDefaults);\n    }\n    if (newDefaults.diagnosticSettings !== diagnosticSettings) {\n      diagnosticSettings = newDefaults.diagnosticSettings;\n      registerAllProviders(newDefaults);\n    }\n    if (newDefaults.schemas !== schemas) {\n      schemas = newDefaults.schemas;\n      registerAllProviders(newDefaults);\n    }\n  });\n\n  disposables.push(asDisposable(providers));\n\n  return asDisposable(disposables);\n}\n\nfunction asDisposable(disposables: IDisposable[]): IDisposable {\n  return { dispose: () => disposeAll(disposables) };\n}\n\nfunction disposeAll(disposables: IDisposable[]) {\n  while (disposables.length) {\n    disposables.pop()!.dispose();\n  }\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/initialize.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport type * as GraphQLMode from './graphqlMode';\nimport { create as createMonacoGraphQLAPI, MonacoGraphQLAPI } from './api';\nimport type { MonacoGraphQLInitializeConfig } from './typings';\nimport { languages } from './monaco-editor';\n\nexport const LANGUAGE_ID = 'graphql';\n\nlet api: MonacoGraphQLAPI | undefined;\n\n/**\n * Initialize the mode and worker synchronously with the provided configuration\n */\nexport function initializeMode(\n  config?: MonacoGraphQLInitializeConfig,\n): MonacoGraphQLAPI {\n  if (!api) {\n    api = createMonacoGraphQLAPI(LANGUAGE_ID, config);\n    (languages as any).graphql = { api };\n    // export to the global monaco API\n\n    // eslint-disable-next-line promise/prefer-await-to-then -- ignore to leave initializeMode sync\n    void getMode().then(mode => mode.setupMode(api!));\n  }\n\n  return api;\n}\n\nfunction getMode(): Promise<typeof GraphQLMode> {\n  return import('./graphqlMode');\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/initializeMode.ts",
    "content": "import './full';\n\nexport { initializeMode, LANGUAGE_ID } from './initialize';\n"
  },
  {
    "path": "packages/monaco-graphql/src/languageFeatures.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { GraphQLWorker } from './GraphQLWorker';\nimport type { MonacoGraphQLAPI } from './api';\nimport type * as monaco from './monaco-editor';\nimport { Uri, languages } from './monaco-editor';\nimport { editor } from 'monaco-editor/esm/vs/editor/editor.api';\nimport { CompletionItemKind as lsCompletionItemKind } from 'graphql-language-service';\nimport { getModelLanguageId, GraphQLWorkerCompletionItem } from './utils';\n\nexport interface WorkerAccessor {\n  (...more: Uri[]): monaco.Thenable<GraphQLWorker>;\n}\n\n// --- completion ------\n\nexport class DiagnosticsAdapter {\n  private _disposables: monaco.IDisposable[] = [];\n  private _listener: { [uri: string]: monaco.IDisposable } =\n    Object.create(null);\n\n  constructor(\n    private defaults: MonacoGraphQLAPI,\n    private _worker: WorkerAccessor,\n  ) {\n    this._worker = _worker;\n    let onChangeTimeout: ReturnType<typeof setTimeout>;\n    const onModelAdd = (model: editor.IModel): void => {\n      const modeId = getModelLanguageId(model);\n      if (modeId !== this.defaults.languageId) {\n        // it is tempting to load JSON models we cared about here\n        // into the web worker, however setDiagnosticOptions() needs\n        // to be called here from the main process anyway, and the worker\n        // is already generating JSON schema itself!\n        return;\n      }\n      const modelUri = model.uri.toString();\n      // if the config changes, this adapter will be re-instantiated, so we only need to check this once\n      const jsonValidationForModel =\n        defaults.diagnosticSettings.validateVariablesJSON?.[modelUri];\n      // once on adding a model, this is also fired when schema or other config changes\n      onChangeTimeout = setTimeout(() => {\n        void this._doValidate(model.uri, modeId, jsonValidationForModel);\n      }, 400);\n\n      this._listener[modelUri] = model.onDidChangeContent(() => {\n        clearTimeout(onChangeTimeout);\n        onChangeTimeout = setTimeout(() => {\n          void this._doValidate(model.uri, modeId, jsonValidationForModel);\n        }, 400);\n      });\n    };\n\n    const onModelRemoved = (model: editor.IModel): void => {\n      editor.setModelMarkers(model, this.defaults.languageId, []);\n      const uriStr = model.uri.toString();\n      const listener = this._listener[uriStr];\n\n      if (listener) {\n        listener.dispose();\n        delete this._listener[uriStr];\n      }\n    };\n\n    this._disposables.push(\n      editor.onDidCreateModel(onModelAdd),\n      {\n        dispose() {\n          clearTimeout(onChangeTimeout);\n        },\n      },\n      editor.onWillDisposeModel(model => {\n        onModelRemoved(model);\n      }),\n      editor.onDidChangeModelLanguage(event => {\n        onModelRemoved(event.model);\n        onModelAdd(event.model);\n      }),\n      {\n        dispose: () => {\n          for (const listener of Object.values(this._listener)) {\n            listener.dispose();\n          }\n        },\n      },\n      defaults.onDidChange(() => {\n        for (const model of editor.getModels()) {\n          if (getModelLanguageId(model) === this.defaults.languageId) {\n            onModelRemoved(model);\n            onModelAdd(model);\n          }\n        }\n      }),\n    );\n    for (const model of editor.getModels()) {\n      if (getModelLanguageId(model) === this.defaults.languageId) {\n        onModelAdd(model);\n      }\n    }\n  }\n\n  public dispose(): void {\n    for (const disposable of this._disposables) {\n      disposable.dispose();\n    }\n    this._disposables = [];\n  }\n\n  private async _doValidate(\n    resource: Uri,\n    languageId: string,\n    variablesUris?: string[],\n  ) {\n    const worker = await this._worker(resource);\n\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- to handle an edge case bug that happens when typing before the schema is present\n    if (!worker) {\n      return;\n    }\n\n    const diagnostics = await worker.doValidation(resource.toString());\n    editor.setModelMarkers(editor.getModel(resource)!, languageId, diagnostics);\n\n    if (variablesUris) {\n      // only import the JSON mode if users configure it\n      await import('monaco-editor/esm/vs/language/json/monaco.contribution.js');\n\n      if (!variablesUris.length) {\n        throw new Error('No variables URI strings provided to validate');\n      }\n      const jsonSchema = await worker.doGetVariablesJSONSchema(\n        resource.toString(),\n      );\n      if (!jsonSchema) {\n        return;\n      }\n\n      const schemaUri = Uri.file(\n        variablesUris[0]!.replace('.json', '-schema.json'),\n      ).toString();\n      const configResult = {\n        uri: schemaUri,\n        schema: jsonSchema,\n        fileMatch: variablesUris,\n      };\n      const currentSchemas =\n        languages.json.jsonDefaults.diagnosticsOptions.schemas?.filter(\n          s => s.uri !== schemaUri,\n        ) || [];\n\n      // TODO: export from api somehow?\n      languages.json.jsonDefaults.setDiagnosticsOptions({\n        schemaValidation: 'error',\n        validate: true,\n        ...this.defaults.diagnosticSettings.jsonDiagnosticSettings,\n        schemas: [...currentSchemas, configResult],\n        enableSchemaRequest: false,\n      });\n    }\n  }\n}\n\nconst mKind = languages.CompletionItemKind;\n\nconst kindMap: Record<lsCompletionItemKind, languages.CompletionItemKind> = {\n  [lsCompletionItemKind.Text]: mKind.Text,\n  [lsCompletionItemKind.Method]: mKind.Method,\n  [lsCompletionItemKind.Function]: mKind.Function,\n  [lsCompletionItemKind.Constructor]: mKind.Constructor,\n  [lsCompletionItemKind.Field]: mKind.Field,\n  [lsCompletionItemKind.Variable]: mKind.Variable,\n  [lsCompletionItemKind.Class]: mKind.Class,\n  [lsCompletionItemKind.Interface]: mKind.Interface,\n  [lsCompletionItemKind.Module]: mKind.Module,\n  [lsCompletionItemKind.Property]: mKind.Property,\n  [lsCompletionItemKind.Unit]: mKind.Unit,\n  [lsCompletionItemKind.Value]: mKind.Value,\n  [lsCompletionItemKind.Enum]: mKind.Enum,\n  [lsCompletionItemKind.Keyword]: mKind.Keyword,\n  [lsCompletionItemKind.Snippet]: mKind.Snippet,\n  [lsCompletionItemKind.Color]: mKind.Color,\n  [lsCompletionItemKind.File]: mKind.File,\n  [lsCompletionItemKind.Reference]: mKind.Reference,\n  [lsCompletionItemKind.Folder]: mKind.Folder,\n  [lsCompletionItemKind.EnumMember]: mKind.EnumMember,\n  [lsCompletionItemKind.Constant]: mKind.Constant,\n  [lsCompletionItemKind.Struct]: mKind.Struct,\n  [lsCompletionItemKind.Event]: mKind.Event,\n  [lsCompletionItemKind.Operator]: mKind.Operator,\n  [lsCompletionItemKind.TypeParameter]: mKind.TypeParameter,\n};\n\nexport function toCompletionItemKind(\n  kind: lsCompletionItemKind,\n): languages.CompletionItemKind {\n  return kind in kindMap ? kindMap[kind] : mKind.Text;\n}\n\nexport function toCompletion(\n  entry: GraphQLWorkerCompletionItem,\n): languages.CompletionItem {\n  const suggestions: languages.CompletionItem = {\n    // @ts-expect-error\n    range: entry.range,\n    kind: toCompletionItemKind(entry.kind!),\n    label: entry.label,\n    insertText: entry.insertText ?? entry.label,\n    insertTextRules: entry.insertText\n      ? languages.CompletionItemInsertTextRule.InsertAsSnippet\n      : undefined,\n    sortText: entry.sortText,\n    filterText: entry.filterText,\n    documentation: entry.documentation,\n    detail: entry.detail,\n    command: entry.command,\n  };\n  return suggestions;\n}\n\nexport class CompletionAdapter implements languages.CompletionItemProvider {\n  constructor(private _worker: WorkerAccessor) {\n    this._worker = _worker;\n  }\n\n  public get triggerCharacters(): string[] {\n    // removing /n character for now until we can\n    // re-introduce the behavior in a programmatic,\n    // context-aware fashion\n    return [':', '$', ' ', '(', '@'];\n  }\n\n  async provideCompletionItems(\n    model: editor.IReadOnlyModel,\n    position: monaco.Position,\n    _context: languages.CompletionContext,\n    _token: monaco.CancellationToken,\n  ): Promise<languages.CompletionList> {\n    try {\n      const worker = await this._worker(model.uri);\n      const completionItems = await worker.doComplete(\n        model.uri.toString(),\n        position,\n      );\n      return {\n        incomplete: true,\n        suggestions: completionItems.map(toCompletion),\n      };\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error('Error fetching completion items', err);\n      return { suggestions: [] };\n    }\n  }\n}\n\nexport class DocumentFormattingAdapter\n  implements languages.DocumentFormattingEditProvider\n{\n  constructor(private _worker: WorkerAccessor) {\n    this._worker = _worker;\n  }\n\n  async provideDocumentFormattingEdits(\n    document: editor.ITextModel,\n    _options: languages.FormattingOptions,\n    _token: monaco.CancellationToken,\n  ) {\n    const worker = await this._worker(document.uri);\n\n    const formatted = await worker.doFormat(document.uri.toString());\n    if (!formatted) {\n      return [];\n    }\n    return [\n      {\n        range: document.getFullModelRange(),\n        text: formatted,\n      },\n    ];\n  }\n}\n\nexport class HoverAdapter implements languages.HoverProvider {\n  constructor(private _worker: WorkerAccessor) {}\n\n  async provideHover(\n    model: editor.IReadOnlyModel,\n    position: monaco.Position,\n    _token: monaco.CancellationToken,\n  ): Promise<languages.Hover> {\n    const resource = model.uri;\n    const worker = await this._worker(model.uri);\n    const hoverItem = await worker.doHover(resource.toString(), position);\n\n    if (hoverItem) {\n      return {\n        range: hoverItem.range,\n        contents: [{ value: hoverItem.content as string }],\n      };\n    }\n\n    return {\n      contents: [],\n    };\n  }\n\n  dispose() {}\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/lite.ts",
    "content": "/**\n * monaco-graphql/lite with no exports\n */\nexport { initializeMode, LANGUAGE_ID } from './initialize';\n"
  },
  {
    "path": "packages/monaco-graphql/src/monaco-editor.ts",
    "content": "/*\n * Importing `monaco-editor` imports all languages, and can expand bundle size.\n * When you import `monaco-editor`, under the hood you import\n * `monaco-editor/esm/vs/editor/editor.main.js` (described in its `package.json#module` field)\n * Inside this file there are the following:\n *\n * ```js\n * import '../basic-languages/monaco.contribution'; // ⚠️ a lot of languages; we only need graphql\n * import '../language/css/monaco.contribution'; // ❌ throw out\n * import '../language/html/monaco.contribution'; // ❌ throw out\n * import '../language/json/monaco.contribution'; // ✅ json language for variables/response editor\n * import '../language/typescript/monaco.contribution'; // ❌ throw out\n * export * from './edcore.main'; // ✅ editor, languages, Uri,... exports\n * ```\n *\n * Types for `monaco-editor/esm/vs/editor/edcore.main` are also left out;\n * we enhance them in `monaco.d.ts` 😎\n */\nimport 'monaco-editor/esm/vs/basic-languages/graphql/graphql.contribution.js';\nimport 'monaco-editor/esm/vs/language/json/monaco.contribution.js';\n\nexport * from 'monaco-editor/esm/vs/editor/edcore.main.js';\n"
  },
  {
    "path": "packages/monaco-graphql/src/monaco.contribution.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nexport {\n  modeConfigurationDefault,\n  SchemaEntry,\n  formattingDefaults,\n  MonacoGraphQLAPI,\n  MonacoGraphQLAPIOptions,\n  diagnosticSettingDefault,\n} from './api';\nimport { languages } from './monaco-editor';\nimport { initializeMode, LANGUAGE_ID } from './initializeMode';\n\nexport * from './typings';\n\nexport { LANGUAGE_ID };\n\n// here is the only place where we\n// initialize the mode `onLanguage`\nlanguages.onLanguage(LANGUAGE_ID, () => {\n  const api = initializeMode();\n\n  (languages as any).graphql = { api };\n});\n"
  },
  {
    "path": "packages/monaco-graphql/src/schemaLoader.ts",
    "content": "import { buildClientSchema, buildASTSchema } from 'graphql';\nimport type { SchemaLoader } from './typings';\n\nexport const defaultSchemaLoader: SchemaLoader = (schemaConfig, parser) => {\n  const {\n    schema,\n    documentAST,\n    introspectionJSON,\n    introspectionJSONString,\n    buildSchemaOptions,\n    documentString,\n  } = schemaConfig;\n  if (schema) {\n    return schema;\n  }\n  if (introspectionJSONString) {\n    const introspectionJSONResult = JSON.parse(introspectionJSONString);\n    return buildClientSchema(introspectionJSONResult, buildSchemaOptions);\n  }\n  if (documentString && parser) {\n    const docAST = parser(documentString);\n    return buildASTSchema(docAST, buildSchemaOptions);\n  }\n  if (introspectionJSON) {\n    return buildClientSchema(introspectionJSON, buildSchemaOptions);\n  }\n  if (documentAST) {\n    return buildASTSchema(documentAST, buildSchemaOptions);\n  }\n  throw new Error('No schema supplied');\n};\n"
  },
  {
    "path": "packages/monaco-graphql/src/typings/index.ts",
    "content": "import type * as monaco from '../monaco-editor';\nimport {\n  IntrospectionQuery,\n  DocumentNode,\n  BuildSchemaOptions,\n  parse,\n  ParseOptions,\n  GraphQLSchema,\n  ValidationRule,\n  FragmentDefinitionNode,\n} from 'graphql';\nimport {\n  AutocompleteSuggestionOptions,\n  JSONSchema6,\n} from 'graphql-language-service';\nimport type { Options as PrettierConfig } from 'prettier';\n\n/**\n * Inspired by the `monaco-json` schema object in `DiagnosticSettings[\"schemas\"]`,\n * which we use :)\n *\n * You have many schema format options to provide, choose one!\n *\n * For large schemas, try different formats to see what is most efficient for you.\n */\nexport type SchemaConfig = {\n  /**\n   * A unique uri string for this schema.\n   * Model data will eventually be set for this URI for definition lookup\n   */\n  uri: string;\n  /**\n   * An array of URIs or globs to associate with this schema in the language worker\n   * Uses `picomatch` which supports many common expressions except brackets\n   * Only necessary if you provide more than one schema, otherwise it defaults to the sole schema\n   */\n  fileMatch?: string[];\n  /**\n   * provide custom options when using `buildClientSchema`, `buildASTSchema`, etc\n   */\n  buildSchemaOptions?: BuildSchemaOptions;\n  /**\n   * A GraphQLSchema instance\n   */\n  schema?: GraphQLSchema;\n  /**\n   * An SDL document string\n   */\n  documentString?: string;\n  /**\n   * A GraphQL DocumentNode AST\n   */\n  documentAST?: DocumentNode;\n  /**\n   * A parsed JSON literal of the introspection results\n   */\n  introspectionJSON?: IntrospectionQuery;\n  /**\n   * A stringified introspection JSON result\n   */\n  introspectionJSONString?: string;\n  /**\n   * JSON schemas ued for custom scalars\n   * @example\n   * ```ts\n   * {\n   *  customScalarSchemas: {\n   *    DateTime: {\n   *      type: \"string\",\n   *      format: \"date-time\"\n   *    }\n   *  }\n   * ```\n   */\n  customScalarSchemas?: Record<string, JSONSchema6>;\n};\n\n/**\n * This schema loader is focused on performance for the monaco worker runtime\n * We favor taking in stringified schema representations as they can be used to communicate\n * Across the main/webworker process boundary\n */\nexport type SchemaLoader = (\n  schemaConfig: SchemaConfig,\n  parser: GraphQLLanguageConfig['parser'],\n) => GraphQLSchema;\n\n/**\n * For the `monaco-graphql` language worker, these must be specified\n * in a custom webworker. see the readme.\n */\nexport type GraphQLLanguageConfig = {\n  /**\n   * Provide a parser that matches `graphql` `parse()` signature\n   * Used for internal document parsing operations\n   * for autocompletion and hover, `graphql-language-service-parser ` is used via `graphql-language-service-interface`\n   */\n  parser?: typeof parse;\n  /**\n   * Custom options passed to `parse`, whether `graphql` parse by default or custom parser\n   */\n  parseOptions?: ParseOptions;\n  /**\n   * Take a variety of schema inputs common for the language worker, and transform them\n   * to at least a `schema` if not other easily available implementations\n   */\n  schemaLoader?: SchemaLoader;\n  /**\n   * An array of schema configurations from which to match files for language features\n   * You can provide many formats, see the config for details!\n   */\n  schemas?: SchemaConfig[];\n  /**\n   * External fragments to be used with completion and validation\n   */\n  externalFragmentDefinitions?: FragmentDefinitionNode[] | string;\n  /**\n   * Custom validation rules following `graphql` `ValidationRule` signature\n   */\n  customValidationRules?: ValidationRule[];\n  completionSettings?: Omit<CompletionSettings, 'uri'>;\n  /**\n   * Should field leafs be automatically expanded & filled on autocomplete?\n   *\n   * NOTE: this can be annoying with required arguments\n   * @deprecated use `completionSettings.fillLeafsOnComplete` instead\n   */\n  fillLeafsOnComplete?: boolean;\n};\n\nexport type FormattingOptions = { prettierConfig?: PrettierConfig };\n\nexport interface ModeConfiguration {\n  /**\n   * Defines whether the built-in documentFormattingEdit provider is enabled.\n   */\n  readonly documentFormattingEdits?: boolean;\n\n  /**\n   * Defines whether the built-in documentRangeFormattingEdit provider is enabled.\n   */\n  readonly documentRangeFormattingEdits?: boolean;\n\n  /**\n   * Defines whether the built-in completionItemProvider is enabled.\n   */\n  readonly completionItems?: boolean;\n\n  /**\n   * Defines whether the built-in hoverProvider is enabled.\n   */\n  readonly hovers?: boolean;\n\n  /**\n   * Defines whether the built-in documentSymbolProvider is enabled.\n   */\n  readonly documentSymbols?: boolean;\n\n  /**\n   * Defines whether the built-in tokens provider is enabled.\n   */\n  readonly tokens?: boolean;\n\n  /**\n   * Defines whether the built-in color provider is enabled.\n   */\n  readonly colors?: boolean;\n\n  /**\n   * Defines whether the built-in foldingRange provider is enabled.\n   */\n  readonly foldingRanges?: boolean;\n\n  /**\n   * Defines whether the built-in diagnostic provider is enabled.\n   */\n  readonly diagnostics?: boolean;\n\n  /**\n   * Defines whether the built-in selection range provider is enabled.\n   */\n  readonly selectionRanges?: boolean;\n}\n\nexport type DiagnosticSettings = {\n  /**\n   * whilst editing operations, alongside graphql validation,\n   * generate json schema for variables to validate json schema models\n   * @example\n   * ```ts\n   * validateVariablesJSON: {\n   *   \"monaco://my-operation.graphql\": [\"monaco://my-variables.json\"]\n   * }\n   * ```\n   */\n  validateVariablesJSON?: Record<string, string[]>;\n  /**\n   * The default `JSONDiagnosticOptions` from `monaco-editor`'s `json` mode - to use when applying variablesJSON.\n   * some examples of settings to provide here:\n   *\n   * - `allowComments: true` enables jsonc editing\n   * - `validateSchema: 'warning'`\n   * - `trailingComments` is `error` by default, and can be `warning` or `ignore`\n   */\n  jsonDiagnosticSettings?: monaco.languages.json.DiagnosticsOptions;\n};\n\nexport type CompletionSettings = AutocompleteSuggestionOptions & {\n  /**\n   * @deprecated use `fillLeafsOnComplete` for parity. still experimental\n   */\n  __experimental__fillLeafsOnComplete?: boolean;\n};\n\n/**\n * Configuration to initialize the editor with\n */\nexport interface MonacoGraphQLInitializeConfig\n  extends Pick<GraphQLLanguageConfig, 'schemas'> {\n  /**\n   * custom (experimental) settings for autocompletion behavior\n   */\n  completionSettings?: CompletionSettings;\n  /**\n   * custom settings for diagnostics (validation)\n   */\n  diagnosticSettings?: DiagnosticSettings;\n  /**\n   * Provide prettier formatting options as `prettierConfig.<option>`\n   * @example\n   * ```ts\n   * initializeMode({\n   *   formattingOptions: { prettierConfig: { useTabs: true } }\n   * })\n   * ```\n   */\n  formattingOptions?: FormattingOptions;\n  /**\n   * Generic monaco language mode options, same as for the official monaco JSON mode\n   */\n  modeConfiguration?: ModeConfiguration;\n}\n\nexport interface ICreateData {\n  languageId: string;\n  formattingOptions?: FormattingOptions;\n  languageConfig: GraphQLLanguageConfig;\n  diagnosticSettings: DiagnosticSettings;\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/typings/monaco-editor.d.ts",
    "content": "/* eslint-disable @typescript-eslint/no-restricted-imports --\n * in this file is allowed to import monaco-editor\n */\ndeclare module 'monaco-editor/esm/vs/editor/edcore.main.js' {\n  export * from 'monaco-editor';\n}\n\ndeclare module 'monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js' {\n  export { MarkerSeverity } from 'monaco-editor';\n}\n"
  },
  {
    "path": "packages/monaco-graphql/src/typings/picomatch-browser.d.ts",
    "content": "declare module 'picomatch-browser';\n"
  },
  {
    "path": "packages/monaco-graphql/src/utils.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\n\nimport { SchemaConfig } from './typings';\nimport type {\n  IRange as GraphQLRange,\n  IPosition as GraphQLPosition,\n  Diagnostic,\n  CompletionItem as GraphQLCompletionItem,\n} from 'graphql-language-service';\nimport type * as monaco from './monaco-editor';\nimport { buildASTSchema, printSchema } from 'graphql';\nimport { Position } from 'graphql-language-service';\n// Importing from 'monaco-editor' in a worker throws “ReferenceError: window is not defined”\nimport { MarkerSeverity } from 'monaco-editor/esm/vs/editor/common/standalone/standaloneEnums.js';\n\n// for backwards compatibility\nexport const getModelLanguageId = (model: monaco.editor.ITextModel) => {\n  if ('getModeId' in model) {\n    // @ts-expect-error -- for <0.30.0 support\n    return model.getModeId();\n  }\n  return model.getLanguageId();\n};\n\nexport function toMonacoRange(range: GraphQLRange): monaco.IRange {\n  return {\n    startLineNumber: range.start.line + 1,\n    startColumn: range.start.character + 1,\n    endLineNumber: range.end.line + 1,\n    endColumn: range.end.character + 1,\n  };\n}\n\nexport function toGraphQLPosition(position: monaco.Position): GraphQLPosition {\n  return new Position(position.lineNumber - 1, position.column - 1);\n}\n\nexport type GraphQLWorkerCompletionItem = Omit<\n  GraphQLCompletionItem,\n  'documentation'\n> & {\n  range?: monaco.IRange;\n  command?: monaco.languages.CompletionItem['command'];\n  documentation?: monaco.languages.CompletionItem['documentation'];\n};\n\nexport function toCompletion(\n  entry: GraphQLCompletionItem,\n  range?: GraphQLRange,\n): GraphQLWorkerCompletionItem {\n  return {\n    label: entry.label,\n    insertText: entry.insertText,\n    sortText: entry.sortText,\n    filterText: entry.filterText,\n    ...(entry.documentation && {\n      documentation: {\n        value: entry.documentation,\n      },\n    }),\n    detail: entry.detail,\n    ...(range && { range: toMonacoRange(range) }),\n    kind: entry.kind,\n    ...(entry.insertTextFormat && { insertTextFormat: entry.insertTextFormat }),\n    ...(entry.insertTextMode && { insertTextMode: entry.insertTextMode }),\n    ...(entry.command && {\n      command: { ...entry.command, id: entry.command.command },\n    }),\n    ...(entry.labelDetails && { labelDetails: entry.labelDetails }),\n  };\n}\n\n/**\n * Monaco and VSCode have slightly different ideas of marker severity.\n * for example, vscode has Error = 1, whereas monaco has Error = 8. this takes care of that\n * @param severity - optional vscode diagnostic severity to convert to monaco MarkerSeverity\n * @returns the matching marker severity level on monaco's terms\n */\nexport function toMonacoSeverity(\n  severity?: Diagnostic['severity'],\n): monaco.MarkerSeverity {\n  const severityMap = {\n    1: MarkerSeverity.Error, // MarkerSeverity.Error\n    2: MarkerSeverity.Warning, // MarkerSeverity.Warning\n    3: MarkerSeverity.Info, // MarkerSeverity.Info\n    4: MarkerSeverity.Hint, // MarkerSeverity.Hint\n  };\n\n  return severity ? severityMap[severity] : severityMap[2];\n}\n\nexport function toMarkerData(\n  diagnostic: Diagnostic,\n): monaco.editor.IMarkerData {\n  return {\n    startLineNumber: diagnostic.range.start.line + 1,\n    endLineNumber: diagnostic.range.end.line + 1,\n    startColumn: diagnostic.range.start.character + 1,\n    endColumn: diagnostic.range.end.character,\n    message: diagnostic.message,\n    severity: toMonacoSeverity(diagnostic.severity),\n    code: (diagnostic.code as string) || undefined,\n  };\n}\n\n/**\n * Send the most minimal string representation\n * to the worker for language service instantiation\n */\nexport const getStringSchema = (schemaConfig: SchemaConfig) => {\n  const {\n    schema: graphQLSchema,\n    documentAST,\n    introspectionJSON,\n    introspectionJSONString,\n    documentString,\n    ...rest\n  } = schemaConfig;\n  if (graphQLSchema) {\n    return {\n      ...rest,\n      documentString: printSchema(graphQLSchema),\n    };\n  }\n  if (introspectionJSONString) {\n    return {\n      ...rest,\n      introspectionJSONString,\n    };\n  }\n  if (documentString) {\n    return {\n      ...rest,\n      documentString,\n    };\n  }\n  if (introspectionJSON) {\n    return {\n      ...rest,\n      introspectionJSONString: JSON.stringify(introspectionJSON),\n    };\n  }\n\n  if (documentAST) {\n    const schema = buildASTSchema(documentAST, rest.buildSchemaOptions);\n    return {\n      ...rest,\n      documentString: printSchema(schema),\n    };\n  }\n  throw new Error('No schema supplied');\n};\n"
  },
  {
    "path": "packages/monaco-graphql/src/workerManager.ts",
    "content": "/**\n *  Copyright (c) 2021 GraphQL Contributors.\n *\n *  This source code is licensed under the MIT license found in the\n *  LICENSE file in the root directory of this source tree.\n */\nimport { editor, IDisposable, Uri } from './monaco-editor';\nimport { MonacoGraphQLAPI } from './api';\nimport { GraphQLWorker } from './GraphQLWorker';\nimport { ICreateData } from './typings';\nimport { getStringSchema } from './utils';\n\nconst STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min\n\nexport class WorkerManager {\n  private _defaults: MonacoGraphQLAPI;\n  private _idleCheckInterval: number;\n  private _lastUsedTime = 0;\n  private _configChangeListener: IDisposable;\n  private _worker: editor.MonacoWebWorker<GraphQLWorker> | null = null;\n  private _client: Promise<GraphQLWorker> | null = null;\n\n  constructor(defaults: MonacoGraphQLAPI) {\n    this._defaults = defaults;\n    this._idleCheckInterval = window.setInterval(\n      () => this._checkIfIdle(),\n      30 * 1000,\n    );\n    // this is where we re-start the worker on config changes\n    this._configChangeListener = this._defaults.onDidChange(() => {\n      this._stopWorker();\n    });\n  }\n\n  private _stopWorker(): void {\n    if (this._worker) {\n      this._worker.dispose();\n      this._worker = null;\n    }\n    this._client = null;\n  }\n\n  dispose(): void {\n    clearInterval(this._idleCheckInterval);\n    this._configChangeListener.dispose();\n    this._stopWorker();\n  }\n\n  private _checkIfIdle(): void {\n    if (!this._worker) {\n      return;\n    }\n    const timePassedSinceLastUsed = Date.now() - this._lastUsedTime;\n    if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {\n      this._stopWorker();\n    }\n  }\n\n  private async _getClient(): Promise<GraphQLWorker> {\n    this._lastUsedTime = Date.now();\n    if (!this._client && !this._worker) {\n      try {\n        const {\n          languageId,\n          formattingOptions,\n          schemas,\n          externalFragmentDefinitions,\n          completionSettings,\n        } = this._defaults;\n        this._worker = editor.createWebWorker<GraphQLWorker>({\n          // module that exports the create() method and returns a `GraphQLWorker` instance\n          moduleId: 'monaco-graphql/esm/GraphQLWorker.js',\n\n          label: languageId,\n          // passed in to the create() method\n          createData: {\n            languageId,\n            formattingOptions,\n            // only string-based config can be passed from the main process\n            languageConfig: {\n              schemas: schemas?.map(getStringSchema),\n              externalFragmentDefinitions,\n              // TODO: make this overridable\n              // MonacoAPI possibly another configuration object for this I think?\n              // all of this could be organized better\n              fillLeafsOnComplete:\n                completionSettings.__experimental__fillLeafsOnComplete,\n            },\n          } as ICreateData,\n        });\n        this._client = this._worker.getProxy();\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.error('error loading worker', error);\n      }\n    }\n    return this._client!;\n  }\n\n  async getLanguageServiceWorker(...resources: Uri[]): Promise<GraphQLWorker> {\n    const client = await this._getClient();\n    await this._worker!.withSyncedResources(resources);\n\n    return client;\n  }\n}\n"
  },
  {
    "path": "packages/monaco-graphql/test/monaco-editor.test.ts",
    "content": "import { $ } from 'execa';\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_COLOR_REGEX = /\\u001b\\[\\d+m/g;\n\ndescribe('monaco-editor', () => {\n  it('should include in bundle only graphql/json languages', async () => {\n    const { stdout } =\n      await $`yarn workspace example-monaco-graphql-react-vite build`;\n    // When process.env.CI is set, stdout contains ANSI color codes, and vite doesn't have\n    // `--no-colors` flag\n    const output = stdout\n      .replaceAll(ANSI_COLOR_REGEX, '')\n      .split('\\n')\n      .slice(1, -1)\n      .join('\\n')\n      // To replace two or more spaces and everything until the end of the line\n      // Because kb fails on CI\n      .replaceAll(/\\s{2,}.*/gm, '');\n    expect(output).toMatchInlineSnapshot(`\n      \"transforming...\n      ✓ 1108 modules transformed.\n      rendering chunks...\n      computing gzip size...\n      dist/index.html\n      dist/workers/graphql.js\n      dist/assets/codicon.ttf\n      dist/workers/standalone.js\n      dist/workers/editor.worker.js\n      dist/workers/json.worker.js\n      dist/workers/graphql.worker.js\n      dist/workers/ts.worker.js\n      dist/assets/index.css\n      dist/assets/graphql.js\n      dist/assets/typescript.js\n      dist/assets/index.js\n      dist/assets/tsMode.js\n      dist/assets/jsonMode.js\n      dist/assets/graphqlMode.js\n      dist/index.js\"\n    `);\n  }, 60_000);\n});\n"
  },
  {
    "path": "packages/monaco-graphql/tsconfig.esm.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"ESNext\",\n    \"baseUrl\": \".\",\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./esm\",\n    \"lib\": [\"dom\", \"ESNext\"],\n    \"paths\": {\n      \"*\": [\"*\"]\n    }\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\n    \"**/__tests__/**\",\n    \"**/*.spec.*\",\n    \"**/node_modules/monaco-editor-core/**/*.d.ts\",\n    \"**/node_modules/jest-haste-map/**/*\",\n    \"dist\",\n    \"esm\",\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "packages/monaco-graphql/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"moduleResolution\": \"node\",\n    \"baseUrl\": \".\",\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\",\n    \"target\": \"es2015\",\n    \"noUncheckedIndexedAccess\": true,\n    \"lib\": [\"dom\", \"ESNext\"],\n    \"paths\": {\n      \"*\": [\"*\"]\n    }\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    }\n  ],\n  \"include\": [\"./src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\", \"dist\", \"esm\", \"node_modules\"]\n}\n"
  },
  {
    "path": "packages/monaco-graphql/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n  },\n});\n"
  },
  {
    "path": "packages/vscode-graphql/.vscodeignore",
    "content": ".vscode/**\n.vscode-test/**\nout/test/**\nsrc/**\n.gitignore\ntsconfig.json\nvsc-extension-quickstart.md\ntslint.json\n.github\nrenovate.json\n*.tsbuildinfo\nesbuild.js\ndist/**\n\n# exclude all node_modules by default\n../../node_modules/**\n\n# @astrojs/compiler relies on the filesystem structure, therefore can't be bundled\n!../../node_modules/@astrojs/compiler\n# astrojs-compiler-sync relies on the filesystem structure, therefore can't be bundled\n!../../node_modules/astrojs-compiler-sync\n# synckit is the dependency of astrojs-compiler-sync\n!../../node_modules/synckit\n# @pkgr/core is the dependency of synckit\n!../../node_modules/@pkgr/core\n"
  },
  {
    "path": "packages/vscode-graphql/CHANGELOG.md",
    "content": "# Change Log\n\n## 0.13.2\n\n### Patch Changes\n\n- [#3883](https://github.com/graphql/graphiql/pull/3883) [`f8ac8cf`](https://github.com/graphql/graphiql/commit/f8ac8cf5f083d40258ae461144cca2c7b196d397) Thanks [@acao](https://github.com/acao)! - Bump vscode-graphql and LSP server for patch fixes\n\n- Updated dependencies [[`f8ac8cf`](https://github.com/graphql/graphiql/commit/f8ac8cf5f083d40258ae461144cca2c7b196d397)]:\n  - graphql-language-service-server@2.14.2\n\n## 0.13.0\n\n### Minor Changes\n\n- [#3819](https://github.com/graphql/graphiql/pull/3819) [`5665872`](https://github.com/graphql/graphiql/commit/566587290dd164bd9c51fd382b8d6b90034ca3dc) Thanks [@robertoaloi](https://github.com/robertoaloi)! - Make LSP transport configurable (ipc, stdio)\n\n## 0.12.1\n\n### Patch Changes\n\n- [#3773](https://github.com/graphql/graphiql/pull/3773) [`31edfab`](https://github.com/graphql/graphiql/commit/31edfab441304d8eb3358acebc475c51e5646e8b) Thanks [@yaacovCR](https://github.com/yaacovCR)! - use latest stable version of graphql 16.9.0 for bundled libraries & tests\n\n## 0.12.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n### Patch Changes\n\n- Updated dependencies [[`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931)]:\n  - graphql-language-service-server@2.14.0\n\n## 0.11.3\n\n### Patch Changes\n\n- [#3703](https://github.com/graphql/graphiql/pull/3703) [`590a987`](https://github.com/graphql/graphiql/commit/590a987811b5ddcc37f5b76900dd2b8dba802f91) Thanks [@acao](https://github.com/acao)! - use `filepath` instead of `filePath` for `graphql-config`\n\n- Updated dependencies [[`590a987`](https://github.com/graphql/graphiql/commit/590a987811b5ddcc37f5b76900dd2b8dba802f91)]:\n  - graphql-language-service-server@2.13.3\n\n## 0.11.2\n\n### Patch Changes\n\n- [#3647](https://github.com/graphql/graphiql/pull/3647) [`ba5720b`](https://github.com/graphql/graphiql/commit/ba5720b430ed1c888ff64c67aa4b9a36083b9ed0) Thanks [@acao](https://github.com/acao)! - several LSP fixes and improvements:\n\n  **Bugfixes**\n\n  debounce schema change events to fix codegen bugs to fix #3622\n\n  on mass file changes, network schema is overfetching because the schema cache is now invalidated on every watched schema file change\n\n  to address this, we debounce the new `onSchemaChange` event by 400ms\n\n  note that `schemaCacheTTL` can only be set in extension settings or graphql config at the top level - it will be ignored if configured per-project in the graphql config\n\n  **Code Improvements**\n\n  - Fixes flaky tests, and `schemaCacheTTL` setting not being passed to the cache\n  - Adds a test to validate network schema changes are reflected in the cache\n\n- Updated dependencies [[`ba5720b`](https://github.com/graphql/graphiql/commit/ba5720b430ed1c888ff64c67aa4b9a36083b9ed0), [`fdec377`](https://github.com/graphql/graphiql/commit/fdec377f28ac0d918a219b78dfa2d8f0996ff84d), [`e2c04c7`](https://github.com/graphql/graphiql/commit/e2c04c7c2dc5109ff0446d9a6a010ffdffed1e44)]:\n  - graphql-language-service-server@2.13.2\n\n## 0.11.1\n\n### Patch Changes\n\n- Updated dependencies [[`7fad662f`](https://github.com/graphql/graphiql/commit/7fad662f77eae9f842bb55cb93cb98df33bbc1ed)]:\n  - graphql-language-service-server@2.13.1\n\n## 0.11.0\n\n### Minor Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fix many schema and fragment lifecycle issues, not all of them, but many related to cacheing. Note: this makes `cacheSchemaForLookup` enabled by default again for schema first contexts.\n\n  This fixes multiple cacheing bugs, upon addomg some in-depth integration test coverage for the LSP server. It also solves several bugs regarding loading config types, and properly restarts the server and invalidates schema when there are config changes.\n\n  ### Bugfix Summary\n\n  - configurable polling updates for network and other code first schema configuration, set to a 30s interval by default. powered by `schemaCacheTTL` which can be configured in the IDE settings (vscode, nvim) or in the graphql config file. (1)\n  - jump to definition in embedded files offset bug, for both fragments and code files with SDL strings\n  - cache invalidation for fragments (fragment lookup/autcoomplete data is more accurate, but incomplete/invalid fragments still do not autocomplete or validate, and remember fragment options always filter/validate by the `on` type!)\n  - schema cache invalidation for schema files - schema updates as you change the SDL files, and the generated file for code first by the `schemaCacheTTL` setting\n  - schema definition lookups & autocomplete crossing over into the wrong project\n\n  **Notes**\n\n  1. If possible, configuring for your locally running framework or a schema registry client to handle schema updates and output to a `schema.graphql` or `introspection.json` will always provide a better experience. many graphql frameworks have this built in! Otherwise, we must use this new lazy polling approach if you provide a url schema (this includes both introspection URLs and remote file URLs, and the combination of these).\n\n  ### Known Bugs Fixed\n\n  - #3318\n  - #2357\n  - #3469\n  - #2422\n  - #2820\n  - many more!\n\n  ### Test Improvements\n\n  - new, high level integration spec suite for the LSP with a matching test utility\n  - more unit test coverage\n  - **total increased test coverage of about 25% in the LSP server codebase.**\n  - many \"happy paths\" covered for both schema and code first contexts\n  - many bugs revealed (and their source)\n\n  ### What's next?\n\n  Another stage of the rewrite is already almost ready. This will fix even more bugs and improve memory usage, eliminate redundant parsing and ensure that graphql config's loaders do _all_ of the parsing and heavy lifting, thus honoring all the configs as well. It also significantly reduces the code complexity.\n\n  There is also a plan to match Relay LSP's lookup config for either IDE (vscode, nvm, etc) settings as they provide, or by loading modules into your `graphql-config`!\n\n### Patch Changes\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Fixes several issues with Type System (SDL) completion across the ecosystem:\n\n  - restores completion for object and input type fields when the document context is not detectable or parseable\n  - correct top-level completions for either of the unknown, type system or executable definitions. this leads to mixed top level completions when the document is unparseable, but now you are not seemingly restricted to only executable top level definitions\n  - `.graphqls` ad-hoc standard functionality remains, but is not required, as it is not part of the official spec, and the spec also allows mixed mode documents in theory, and this concept is required when the type is unknown\n\n- [#3521](https://github.com/graphql/graphiql/pull/3521) [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d) Thanks [@acao](https://github.com/acao)! - Introduce `locateCommand` based on Relay LSP `pathToLocateCommand`:\n\n  Now with `<graphql config>.extensions.languageService.locateCommand`, you can specify either the [existing signature](https://marketplace.visualstudio.com/items?itemName=meta.relay#relay.pathtolocatecommand-default-null) for relay, with the same callback parameters and return signature (of a string delimited by `:` characters), or you can return an object with {uri, range} for the exact set of coordinates for the destination range. the function can be sync or async.\n\n  Relay LSP currently supports `Type` and `Type.field` for the 2nd argument. Ours also returns `Type.field(argument)` as a point of reference. It works with object types, input types, fragments, executable definitions and their fields, and should work for directive definitions as well.\n\n  In the case of unnamed types such as fragment spreads, they return the name of the implemented type currently, but I'm curious what users prefer here. I assumed that some people may want to not be limited to only using this for SDL type definition lookups. Also look soon to see `locateCommand` support added for symbols, outline, and coming references and implementations.\n\n  The module at the path you specify in relay LSP for `pathToLocateCommand` should work as such.\n\n  ```ts\n  // import it\n  import { locateCommand } from './graphql/tooling/lsp/locate.js';\n  export default {\n    languageService: {\n      locateCommand,\n    },\n\n    projects: {\n      a: {\n        schema: 'https://localhost:8000/graphql',\n        documents: './a/**/*.{ts,tsx,jsx,js,graphql}',\n      },\n      b: {\n        schema: './schema/ascode.ts',\n        documents: './b/**/*.{ts,tsx,jsx,js,graphql}',\n      },\n    },\n  };\n  ```\n\n  ```ts\n  // or define it inline\n\n  import { type LocateCommand } from 'graphql-language-service-server';\n\n  // relay LSP style\n  const locateCommand = (projectName: string, typePath: string) => {\n    const { path, startLine, endLine } = ourLookupUtility(\n      projectName,\n      typePath,\n    );\n    return `${path}:${startLine}:${endLine}`;\n  };\n\n  // an example with our alternative return signature\n  const locateCommand: LocateCommand = (projectName, typePath, info) => {\n    // pass more info, such as GraphQLType with the ast node. info.project is also available if you need it\n    const { path, range } = ourLookupUtility(\n      projectName,\n      typePath,\n      info.type.node,\n    );\n    return { uri: path, range }; // range.start.line/range.end.line\n  };\n\n  export default {\n    languageService: {\n      locateCommand,\n    },\n    schema: 'https://localhost:8000/graphql',\n    documents: './**/*.{ts,tsx,jsx,js,graphql}',\n  };\n  ```\n\n  Passing a string as a module path to resolve is coming in a follow-up release. Then it can be used with `.yml`, `.toml`, `.json`, `package.json#graphql`, etc\n\n  For now this was a quick baseline for a feature asked for in multiple channels!\n\n  Let us know how this works, and about any other interoperability improvements between our graphql LSP and other language servers (relay, intellij, etc) used by you and colleauges in your engineering organisations. We are trying our best to keep up with the awesome innovations they have 👀!\n\n- Updated dependencies [[`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d), [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d), [`aa6dbbb4`](https://github.com/graphql/graphiql/commit/aa6dbbb45bf51c1966537640fbe5c4f375735c8d)]:\n  - graphql-language-service-server@2.13.0\n\n## 0.9.3\n\n### Patch Changes\n\n- [#3549](https://github.com/graphql/graphiql/pull/3549) [`e5efc97e`](https://github.com/graphql/graphiql/commit/e5efc97e10ba237d8209859a24cda826b9899832) Thanks [@acao](https://github.com/acao)! - Fix OpenVSX build by re-using the vsce build (astro compiler bug)\n\n## 0.9.2\n\n### Patch Changes\n\n- [#3543](https://github.com/graphql/graphiql/pull/3543) [`defc126b`](https://github.com/graphql/graphiql/commit/defc126b107961d7a4ba093b35b1d77bb7018a79) Thanks [@acao](https://github.com/acao)! - Temporarily revert a syntax highlighting bugfix that caused more bugs\n\n## 0.9.1\n\n### Patch Changes\n\n- [#3519](https://github.com/graphql/graphiql/pull/3519) [`8188e3e6`](https://github.com/graphql/graphiql/commit/8188e3e6fd979bcf2fbdf9568deb0c88d0df99e2) Thanks [@acao](https://github.com/acao)! - bump ovsx\n\n## 0.9.0\n\n### Minor Changes\n\n- [#3475](https://github.com/graphql/graphiql/pull/3475) [`98af5307`](https://github.com/graphql/graphiql/commit/98af53071bb27afc0afc82d66f539c1ac08315b3) Thanks [@XiNiHa](https://github.com/XiNiHa)! - Add Astro file support\n\n### Patch Changes\n\n- [#3514](https://github.com/graphql/graphiql/pull/3514) [`36c7f25c`](https://github.com/graphql/graphiql/commit/36c7f25c9388827d3a6a279eb090d61dc2600b56) Thanks [@acao](https://github.com/acao)! - fix svelte parsing, re-load config only on config changes\n\n  - fix esbuild bundling of `typescript` for `svelte2tsx`!\n  - confirm with manual testing of the vsix extension bundle ✅\n  - ensure that the server only attemps to parse opened/saved files when the server is activated or the file is a config file\n\n- Updated dependencies [[`98af5307`](https://github.com/graphql/graphiql/commit/98af53071bb27afc0afc82d66f539c1ac08315b3), [`36c7f25c`](https://github.com/graphql/graphiql/commit/36c7f25c9388827d3a6a279eb090d61dc2600b56)]:\n  - graphql-language-service-server@2.12.0\n\n## 0.8.25\n\n### Patch Changes\n\n- [#3503](https://github.com/graphql/graphiql/pull/3503) [`6c7adf85`](https://github.com/graphql/graphiql/commit/6c7adf85c10d92cd3708a6dab44cb5b0f965fb84) Thanks [@acao](https://github.com/acao)! - Temporarily revert svelte parsing until we can fix bundling issues with svelte2tsx. For now we return to using the vue parser to parse svelte files which will invariably cause some issues, such as being off by several characters\n\n- Updated dependencies [[`6c7adf85`](https://github.com/graphql/graphiql/commit/6c7adf85c10d92cd3708a6dab44cb5b0f965fb84)]:\n  - graphql-language-service-server@2.11.10\n\n## 0.8.24\n\n### Patch Changes\n\n- [#3500](https://github.com/graphql/graphiql/pull/3500) [`34d0a976`](https://github.com/graphql/graphiql/commit/34d0a97688d7b83949f34bb4b2effebe4bafae79) Thanks [@acao](https://github.com/acao)! - Add typescript as a dependency for `svelte2tsx`\n\n- Updated dependencies [[`34d0a976`](https://github.com/graphql/graphiql/commit/34d0a97688d7b83949f34bb4b2effebe4bafae79)]:\n  - graphql-language-service-server@2.11.9\n\n## 0.8.23\n\n### Patch Changes\n\n- [#3498](https://github.com/graphql/graphiql/pull/3498) [`3bfb2877`](https://github.com/graphql/graphiql/commit/3bfb28777457f783852dfe5c9af739470194d33b) Thanks [@acao](https://github.com/acao)! - Add typescript as a dependency for `svelte2tsx`\n\n- Updated dependencies [[`3bfb2877`](https://github.com/graphql/graphiql/commit/3bfb28777457f783852dfe5c9af739470194d33b)]:\n  - graphql-language-service-server@2.11.8\n\n## 0.8.22\n\n### Patch Changes\n\n- [#3490](https://github.com/graphql/graphiql/pull/3490) [`334224b4`](https://github.com/graphql/graphiql/commit/334224b4502fda9fd77684da63cac00b8a7c1ee7) Thanks [@acao](https://github.com/acao)! - - add ruby syntax support\n\n  - add graphql syntax support in markdown codeblocks for js, ts, jsx, tsx, svelte, vue, ruby, rescript, reason, ocaml, php and python\n  - make textmate injectors more performant and specific, eliminate redundant config\n\n  Big thanks to [@RedCMD](https://github.com/RedCMD) and [@aeschli](https://github.com/aeschli) for your help!\n\n- [#3488](https://github.com/graphql/graphiql/pull/3488) [`d5028be2`](https://github.com/graphql/graphiql/commit/d5028be252ed385af972e090dda22788835da71e) Thanks [@acao](https://github.com/acao)! - Bump graphql & graphql-tools version to fix potential runtime security bugs\n\n- [`22771f35`](https://github.com/graphql/graphiql/commit/22771f35d00e4f80cb851e2a1f93db074e238e18) Thanks [@acao](https://github.com/acao)! - Fixes to svelte parsing, tag parsing refactor\n\n- Updated dependencies [[`d5028be2`](https://github.com/graphql/graphiql/commit/d5028be252ed385af972e090dda22788835da71e), [`22771f35`](https://github.com/graphql/graphiql/commit/22771f35d00e4f80cb851e2a1f93db074e238e18)]:\n  - graphql-language-service-server@2.11.7\n\n## 0.8.21\n\n### Patch Changes\n\n- [#3480](https://github.com/graphql/graphiql/pull/3480) [`a1fced10`](https://github.com/graphql/graphiql/commit/a1fced10bf37a339709243a9576b3fdcae832fb8) Thanks [@craig-riecke](https://github.com/craig-riecke)! - Fix execution extension esbuild bundling\n\n## 0.8.20\n\n### Patch Changes\n\n- Updated dependencies [[`75ccd72c`](https://github.com/graphql/graphiql/commit/75ccd72c660c3b20cafa38da01d18a91ea24c7db)]:\n  - graphql-language-service-server@2.11.6\n\n## 0.8.19\n\n### Patch Changes\n\n- Updated dependencies [[`530ef47a`](https://github.com/graphql/graphiql/commit/530ef47ac6bbcb24cedc453bf802626d4a630e45)]:\n  - graphql-language-service-server@2.11.5\n\n## 0.8.18\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service-server@2.11.4\n\n## 0.8.17\n\n### Patch Changes\n\n- [#3322](https://github.com/graphql/graphiql/pull/3322) [`6939bac4`](https://github.com/graphql/graphiql/commit/6939bac4a9a849fe497260fd0702bdd95eefd943) Thanks [@acao](https://github.com/acao)! - Bypass babel typescript parsing errors to continue extracting graphql strings\n\n- Updated dependencies [[`6939bac4`](https://github.com/graphql/graphiql/commit/6939bac4a9a849fe497260fd0702bdd95eefd943)]:\n  - graphql-language-service-server@2.11.3\n\n## 0.8.16\n\n### Patch Changes\n\n- [#3274](https://github.com/graphql/graphiql/pull/3274) [`5e38ab6b`](https://github.com/graphql/graphiql/commit/5e38ab6b2235cb0dec4e7df42772680a1e905a1a) Thanks [@acao](https://github.com/acao)! - fix esbuild + vsce issue\n\n## 0.8.15\n\n### Patch Changes\n\n- [#3269](https://github.com/graphql/graphiql/pull/3269) [`2fb7f1f5`](https://github.com/graphql/graphiql/commit/2fb7f1f5d8a69a5de572b783de7801d5993f758a) Thanks [@acao](https://github.com/acao)! - fix ovsx release\n\n## 0.8.14\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- [#3216](https://github.com/graphql/graphiql/pull/3216) [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8) Thanks [@simowe](https://github.com/simowe)! - fix: reload schema when a change to the schema file is detected\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8)]:\n  - graphql-language-service-server@2.11.2\n\n## 0.8.14-alpha.0\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n- [#3216](https://github.com/graphql/graphiql/pull/3216) [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8) Thanks [@simowe](https://github.com/simowe)! - fix: reload schema when a change to the schema file is detected\n\n- Updated dependencies [[`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9), [`55135804`](https://github.com/graphql/graphiql/commit/551358045611a27551e5654c2b115295c35639d8)]:\n  - graphql-language-service-server@2.11.2-alpha.0\n\n## 0.8.13\n\n### Patch Changes\n\n- Updated dependencies [[`4c3a08b1`](https://github.com/graphql/graphiql/commit/4c3a08b1a99e0933362a1c93340b613730c90aa4)]:\n  - graphql-language-service-server@2.11.1\n\n## 0.8.12\n\n### Patch Changes\n\n- Updated dependencies [[`06007498`](https://github.com/graphql/graphiql/commit/06007498880528ed75dd4d705dcbcd7c9e775939), [`28b1b5a0`](https://github.com/graphql/graphiql/commit/28b1b5a016787ec4119d28f057a9d93814d4e310)]:\n  - graphql-language-service-server@2.11.0\n\n## 0.8.11\n\n### Patch Changes\n\n- Updated dependencies [[`f2040452`](https://github.com/graphql/graphiql/commit/f20404529677635f5d4792b328aa648641bf8d9c)]:\n  - graphql-language-service-server@2.10.0\n\n## 0.8.10\n\n### Patch Changes\n\n- Updated dependencies [[`4d33b221`](https://github.com/graphql/graphiql/commit/4d33b2214e941f171385a1b72a1fa995714bb284)]:\n  - graphql-language-service-server@2.9.10\n\n## 0.8.9\n\n### Patch Changes\n\n- Updated dependencies [[`632a7c6b`](https://github.com/graphql/graphiql/commit/632a7c6bb2959ef5d59236aeab218587578466e7)]:\n  - graphql-language-service-server@2.9.9\n\n## 0.8.8\n\n### Patch Changes\n\n- [#3157](https://github.com/graphql/graphiql/pull/3157) [`06d39823`](https://github.com/graphql/graphiql/commit/06d39823e093c8441fea469446c25f18a664e778) Thanks [@jycouet](https://github.com/jycouet)! - fix: `.vue` and `.svelte` files doesn't log errors anymore when parsing with no script tag (#2836)\n\n- [#3120](https://github.com/graphql/graphiql/pull/3120) [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040) Thanks [@B2o5T](https://github.com/B2o5T)! - prefer await to then\n\n- Updated dependencies [[`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9), [`06d39823`](https://github.com/graphql/graphiql/commit/06d39823e093c8441fea469446c25f18a664e778), [`51007002`](https://github.com/graphql/graphiql/commit/510070028b7d8e98f2ba25f396519976aea5fa4b), [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040)]:\n  - graphql-language-service-server@2.9.8\n\n## 0.8.7\n\n### Patch Changes\n\n- Updated dependencies [[`9d9478ae`](https://github.com/graphql/graphiql/commit/9d9478aea7536d2957e4371cef4f30577db2113d), [`b9c13328`](https://github.com/graphql/graphiql/commit/b9c13328f3d28c0026ee0f0ecc7213065c9b016d)]:\n  - graphql-language-service-server@2.9.7\n\n## 0.8.6\n\n### Patch Changes\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n- Updated dependencies [[`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4), [`db2a0982`](https://github.com/graphql/graphiql/commit/db2a0982a17134f0069483ab283594eb64735b7d), [`90350022`](https://github.com/graphql/graphiql/commit/90350022334d9fcce0f4b72b3b0f7a12d21f78f9), [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba)]:\n  - graphql-language-service-server@2.9.6\n\n## 0.8.5\n\n### Patch Changes\n\n- [#2926](https://github.com/graphql/graphiql/pull/2926) [`10e97bbe`](https://github.com/graphql/graphiql/commit/10e97bbe6c9ff81bae73b11ba81ac2b69eca2772) Thanks [@elijaholmos](https://github.com/elijaholmos)! - support cts and mts file extensions\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- Updated dependencies [[`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147), [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b), [`f9aa87dc`](https://github.com/graphql/graphiql/commit/f9aa87dc6a88ed8a8a0a94de520c7a41fff8ffde), [`10e97bbe`](https://github.com/graphql/graphiql/commit/10e97bbe6c9ff81bae73b11ba81ac2b69eca2772), [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9), [`d502a33b`](https://github.com/graphql/graphiql/commit/d502a33b4332f1025e947c02d7cfdc5799365c8d), [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913), [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215), [`4ff2794c`](https://github.com/graphql/graphiql/commit/4ff2794c8b6032168e27252096cb276ce712878e)]:\n  - graphql-language-service-server@2.9.5\n\n## 0.8.4\n\n### Patch Changes\n\n- [#2901](https://github.com/graphql/graphiql/pull/2901) [`eff4fd6b`](https://github.com/graphql/graphiql/commit/eff4fd6b9087c2d9cdb260ee2502a31d23769c3f) Thanks [@acao](https://github.com/acao)! - Reload the language service when a legacy format .graphqlconfig file has changed\n\n- Updated dependencies [[`eff4fd6b`](https://github.com/graphql/graphiql/commit/eff4fd6b9087c2d9cdb260ee2502a31d23769c3f)]:\n  - graphql-language-service-server@2.9.4\n\n## 0.8.3\n\n### Patch Changes\n\n- Updated dependencies [[`8989ffce`](https://github.com/graphql/graphiql/commit/8989ffce7d6beca874e70f5a1ff066102580173a)]:\n  - graphql-language-service-server@2.9.3\n\n## 0.8.2\n\n### Patch Changes\n\n- [#2861](https://github.com/graphql/graphiql/pull/2861) [`bdd1bd04`](https://github.com/graphql/graphiql/commit/bdd1bd045fc6610ccaae4745b8ecc10004594274) Thanks [@aloker](https://github.com/aloker)! - add missing pieces for svelte language support\n\n* [#2488](https://github.com/graphql/graphiql/pull/2488) [`967006a6`](https://github.com/graphql/graphiql/commit/967006a68e56f8f3a605c69fee5f920afdb6d8cf) Thanks [@acao](https://github.com/acao)! - Disable`fillLeafsOnComplete` by default\n\n  Users found this generally annoying by default, especially when there are required arguments\n\n  Without automatically prompting autocompletion of required arguments as well as lead expansion, it makes the extension harder to use\n\n  You can now supply this in your graphql config:\n\n  `config.extensions.languageService.fillLeafsOnComplete`\n\n  Setting it to to `true` will enable this feature. Will soon add the ability to manually enable this in `monaco-graphql` as well.\n\n  For both, this kind of behavior would be better as a keyboard command, context menu item &/or codelens prompt\n\n- [#2849](https://github.com/graphql/graphiql/pull/2849) [`9b98c1b6`](https://github.com/graphql/graphiql/commit/9b98c1b63a184385d22a8457cfdfebf01387697f) Thanks [@acao](https://github.com/acao)! - docs typo bug - `/* GraphQL */` (not `/* GraphiQL */`) is the delimiter for `vscode-graphql-syntax` & `vscode-graphql` language support\n\n- Updated dependencies [[`bdd1bd04`](https://github.com/graphql/graphiql/commit/bdd1bd045fc6610ccaae4745b8ecc10004594274), [`967006a6`](https://github.com/graphql/graphiql/commit/967006a68e56f8f3a605c69fee5f920afdb6d8cf)]:\n  - graphql-language-service-server@2.9.2\n\n## 0.8.1\n\n### Patch Changes\n\n- [#2829](https://github.com/graphql/graphiql/pull/2829) [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10) Thanks [@acao](https://github.com/acao)! - major bugfixes with `onDidChange` and `onDidChangeWatchedFiles` events\n\n* [#2829](https://github.com/graphql/graphiql/pull/2829) [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10) Thanks [@acao](https://github.com/acao)! - svelte language support, using the vue sfc parser introduced for vue support\n\n* Updated dependencies [[`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10), [`c835ca87`](https://github.com/graphql/graphiql/commit/c835ca87e93e00713fbbbb2f4448db03f6b97b10)]:\n  - graphql-language-service-server@2.9.1\n\n## 0.8.0\n\n### Minor Changes\n\n- [#2827](https://github.com/graphql/graphiql/pull/2827) [`b422003c`](https://github.com/graphql/graphiql/commit/b422003c2403072e96d14f920a3f0f1dc1f4f708) Thanks [@acao](https://github.com/acao)! - Introducing vue.js support for intellisense! Thanks @AumyF\n\n### Patch Changes\n\n- Updated dependencies [[`b422003c`](https://github.com/graphql/graphiql/commit/b422003c2403072e96d14f920a3f0f1dc1f4f708)]:\n  - graphql-language-service-server@2.9.0\n\n## 0.7.13\n\n### Patch Changes\n\n- [#2818](https://github.com/graphql/graphiql/pull/2818) [`929152f8`](https://github.com/graphql/graphiql/commit/929152f8ea076ffa3bf34b83445473331c3bdb67) Thanks [@acao](https://github.com/acao)! - Workspaces support introduced a regression for no-config scenario. Reverting to fix bugs with no graphql config crashing the server.\n\n- Updated dependencies [[`929152f8`](https://github.com/graphql/graphiql/commit/929152f8ea076ffa3bf34b83445473331c3bdb67)]:\n  - graphql-language-service-server@2.8.9\n\n## 0.7.12\n\n### Patch Changes\n\n- [#2812](https://github.com/graphql/graphiql/pull/2812) [`cf2e3061`](https://github.com/graphql/graphiql/commit/cf2e3061f67ef5cf6b890e217d20915d0eaec1bd) Thanks [@acao](https://github.com/acao)! - fix a bundling bug for vscode, rolling back graphql-config upgrade\n\n- Updated dependencies [[`cf2e3061`](https://github.com/graphql/graphiql/commit/cf2e3061f67ef5cf6b890e217d20915d0eaec1bd)]:\n  - graphql-language-service-server@2.8.8\n\n## 0.7.11\n\n### Patch Changes\n\n- [#2810](https://github.com/graphql/graphiql/pull/2810) [`f688422e`](https://github.com/graphql/graphiql/commit/f688422ed87ddd411cf3552fa6d9a5a367cd8662) Thanks [@acao](https://github.com/acao)! - fix graphql exec extension, upgrade `graphql-config`, fix issue with graphql-config cosmiconfig typescript config loader.\n\n- Updated dependencies [[`f688422e`](https://github.com/graphql/graphiql/commit/f688422ed87ddd411cf3552fa6d9a5a367cd8662)]:\n  - graphql-language-service-server@2.8.7\n\n## 0.7.10\n\n### Patch Changes\n\n- [#2808](https://github.com/graphql/graphiql/pull/2808) [`a2071504`](https://github.com/graphql/graphiql/commit/a20715046fe7684bb9b17fbc9f5637b44e5210d6) Thanks [@acao](https://github.com/acao)! - fix graphql config init bug\n\n- Updated dependencies [[`a2071504`](https://github.com/graphql/graphiql/commit/a20715046fe7684bb9b17fbc9f5637b44e5210d6)]:\n  - graphql-language-service-server@2.8.6\n\n## 0.7.9\n\n### Patch Changes\n\n- [#2806](https://github.com/graphql/graphiql/pull/2806) [`5b991dc9`](https://github.com/graphql/graphiql/commit/5b991dc9540b5cd2204428e7c3f684480d498908) Thanks [@acao](https://github.com/acao)! - disable exec extension in vscode-graphql until stable\n\n## 0.7.8\n\n### Patch Changes\n\n- [#2616](https://github.com/graphql/graphiql/pull/2616) [`b0d7f06c`](https://github.com/graphql/graphiql/commit/b0d7f06cf9ec6fd6b1dcb61dd0273e37dd546ed5) Thanks [@acao](https://github.com/acao)! - support vscode multi-root workspaces! creates an LSP server instance for each workspace.\n\n  WARNING: large-scale vscode workspaces usage, and this in tandem with `graphql.config.*` multi-project configs could lead to excessive system resource usage. Optimizations coming soon.\n\n- Updated dependencies [[`b0d7f06c`](https://github.com/graphql/graphiql/commit/b0d7f06cf9ec6fd6b1dcb61dd0273e37dd546ed5)]:\n  - graphql-language-service-server@2.8.5\n\n## 0.7.7\n\n### Patch Changes\n\n- [#2802](https://github.com/graphql/graphiql/pull/2802) [`d291b768`](https://github.com/graphql/graphiql/commit/d291b768203e59bb80ec5312563fdc16bd16aeae) Thanks [@acao](https://github.com/acao)! - fix bug with vscode-graphql-execution\n\n## 0.7.6\n\n### Patch Changes\n\n- [#2665](https://github.com/graphql/graphiql/pull/2665) [`324fbedb`](https://github.com/graphql/graphiql/commit/324fbedb96839cff105a28fce4be0757044ba5a9) Thanks [@acao](https://github.com/acao)! - Port the inline query execution capability from the original `vscode-graphql` repository as promised. More improvements to come!\n\n## 0.7.5\n\n### Patch Changes\n\n- [#2759](https://github.com/graphql/graphiql/pull/2759) [`67b1e5e9`](https://github.com/graphql/graphiql/commit/67b1e5e933e3ca9e1f88d3ed6e1c70537c491e77) Thanks [@acao](https://github.com/acao)! - Fixes #2671 bug for SDL schema support and `.graphql` files! pin `vscode-languageclient` to 8.0.2 version. Thanks [@MariaSolOs](https://github.com/MariaSolOs) for the fix!\n\n## 0.7.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service-server@2.8.4\n\n## 0.7.3\n\n### Patch Changes\n\n- [#2664](https://github.com/graphql/graphiql/pull/2664) [`721425b3`](https://github.com/graphql/graphiql/commit/721425b3382e68dd4c7b883473e3eda38a9816ee) Thanks [@acao](https://github.com/acao)! - This reverts the bugfix for .graphqlrc.ts users, which broke the extension for schema url users\n\n- Updated dependencies [[`721425b3`](https://github.com/graphql/graphiql/commit/721425b3382e68dd4c7b883473e3eda38a9816ee)]:\n  - graphql-language-service-server@2.8.3\n\n## 0.7.2\n\n### Patch Changes\n\n- [#2660](https://github.com/graphql/graphiql/pull/2660) [`34d31fbc`](https://github.com/graphql/graphiql/commit/34d31fbce6c49c929b48bdf1a6b0cebc33d8bbbf) Thanks [@acao](https://github.com/acao)! - bump `ts-node` to 10.x, so that TypeScript based configs (i.e. `.graphqlrc.ts`) will continue to work. It also bumps to the latest patch releases of `graphql-config` fixed several issues with TypeScript loading ([v4.3.2](https://github.com/kamilkisiela/graphql-config/releases/tag/v4.3.2), [v4.3.3](https://github.com/kamilkisiela/graphql-config/releases/tag/v4.3.3)). We tested manually, but please open a bug if you encounter any with schema-as-url configs & schema introspection.\n\n- Updated dependencies [[`34d31fbc`](https://github.com/graphql/graphiql/commit/34d31fbce6c49c929b48bdf1a6b0cebc33d8bbbf)]:\n  - graphql-language-service-server@2.8.2\n\n## 0.7.1\n\n### Patch Changes\n\n- [#2623](https://github.com/graphql/graphiql/pull/2623) [`12cf4db0`](https://github.com/graphql/graphiql/commit/12cf4db006d1c058460bc04f51d8743fe1ac63bb) Thanks [@acao](https://github.com/acao)! - In #2624, fix introspection schema fetching regression in lsp server, and fix for users writing new .gql/.graphql files\n\n- Updated dependencies [[`12cf4db0`](https://github.com/graphql/graphiql/commit/12cf4db006d1c058460bc04f51d8743fe1ac63bb)]:\n  - graphql-language-service-server@2.8.1\n\n## 0.7.0\n\n### Minor Changes\n\n- [#2573](https://github.com/graphql/graphiql/pull/2573) [`a358ac1d`](https://github.com/graphql/graphiql/commit/a358ac1d00082643e124085bca09992adeef212a) Thanks [@acao](https://github.com/acao)! - ## Enhancement\n\n  Here we move vscode grammars and basic language support to a new [`GraphQL.vscode-graphql-syntax`](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql-syntax) extension. `GraphQL.vscode-graphql` now depends on this new syntax extension. This constitutes no breaking change for `vscode-graphql` users, as this extension will be installed automatically as an `extensionDependency` for `vscode-graphql`. Both extensions will now have independent release lifecycles, but vscode will keep them both up to date for you :)\n\n  Firstly, this allows users to only install the syntax highlighting extension if they don't need LSP server features.\n\n  Secondly, this subtle but important change allows alternative LSP servers and non-LSP graphql extensions to use (and contribute!) to our shared, graphql community syntax highlighting. In some ways, it acts as a shared tooling & annotation spec, though it is intended just for vscode, it perhaps can be used as a point of reference for others implementing (embedded) graphql syntax highlighting elsewhere!\n\n  If your language and/or library and/or framework would like vscode highlighting, come [join the party](https://github.com/graphql/graphiql/tree/main/packages/vscode-graphql-syntax#contributing)!\n\n  If you use relay, we would highly reccomend using the `relay-compiler lsp` extension for vscode [Relay Graphql](https://marketplace.visualstudio.com/items?itemName=meta.relay) (`meta.relay`). They will be [using the new standalone syntax extension](https://github.com/facebook/relay/pull/4032) very soon!\n\n  Even non-relay users may want to try this extension as an alternative to our reference implementation, as relay's configuration has relative similarity with `graphql-config`'s format, and doesn't necessitate the use of relay client afaik. We are working hard to optimize and improve `graphql-language-service-server` as a typescript reference implementation, and have some exciting features coming soon, however it's hard to offer more than a brand new & highly performant graphql LSP server written in Rust based on the latest graphql spec with a (mostly) paid team and dedicated open source ecosystem community of co-maintainers! And their implementation appears to allow you to opt out of any relay-specific conventions if you need more flexibility.\n\n## 0.6.0\n\n### Minor Changes\n\n- [#2556](https://github.com/graphql/graphiql/pull/2556) [`e04dd9c7`](https://github.com/graphql/graphiql/commit/e04dd9c774cfdb2897e48a67ab854c4a4bdaa9ef) Thanks [@qw-in](https://github.com/qw-in)! - Add support for syntax highlighting in python files\n\n## 0.5.0\n\n### Minor Changes\n\n- [#2557](https://github.com/graphql/graphiql/pull/2557) [`3304606d`](https://github.com/graphql/graphiql/commit/3304606d5130a745cbdab0e6c9182e75101ddde9) Thanks [@acao](https://github.com/acao)! - upgrades the `vscode-languageserver` and `vscode-jsonrpc` reference implementations for the lsp server to the latest. also upgrades `vscode-languageclient` in `vscode-graphql` to the latest 8.0.1. seems to work fine for IPC in `vscode-graphql` at least!\n\n  hopefully this solves #2230 once and for all!\n\n### Patch Changes\n\n- Updated dependencies [[`3304606d`](https://github.com/graphql/graphiql/commit/3304606d5130a745cbdab0e6c9182e75101ddde9)]:\n  - graphql-language-service-server@2.8.0\n\n## 0.4.15\n\n### Patch Changes\n\n- Updated dependencies [[`edc1c964`](https://github.com/graphql/graphiql/commit/edc1c96477cc2fbc2b6ac5d6195b8f9766a8c5d4)]:\n  - graphql-language-service-server@2.7.29\n\n## 0.4.14\n\n### Patch Changes\n\n- [#2519](https://github.com/graphql/graphiql/pull/2519) [`de5d5a07`](https://github.com/graphql/graphiql/commit/de5d5a07891fd49241a5abbb17eaf377a015a0a8) Thanks [@acao](https://github.com/acao)! - enable graphql-config legacy mode by default in the LSP server\n\n* [#2509](https://github.com/graphql/graphiql/pull/2509) [`737d4184`](https://github.com/graphql/graphiql/commit/737d4184f3af1d8fe9d64eb1b7e23dfcfbe640ea) Thanks [@Chnapy](https://github.com/Chnapy)! - Add `gql(``)`, `graphql(``)` call expressions support for highlighting & language\n\n* Updated dependencies [[`de5d5a07`](https://github.com/graphql/graphiql/commit/de5d5a07891fd49241a5abbb17eaf377a015a0a8), [`737d4184`](https://github.com/graphql/graphiql/commit/737d4184f3af1d8fe9d64eb1b7e23dfcfbe640ea)]:\n  - graphql-language-service-server@2.7.28\n\n## 0.4.13\n\n### Patch Changes\n\n- Updated dependencies [[`cccefa70`](https://github.com/graphql/graphiql/commit/cccefa70c0466d60e8496e1df61aeb1490af723c)]:\n  - graphql-language-service-server@2.7.27\n\n## 0.4.12\n\n### Patch Changes\n\n- Updated dependencies [[`c9c51b8a`](https://github.com/graphql/graphiql/commit/c9c51b8a98e1f0427272d3e9ad60989b32f1a1aa)]:\n  - graphql-language-service-server@2.7.26\n\n## 0.4.11\n\n### Patch Changes\n\n- Updated dependencies [[`cf092f59`](https://github.com/graphql/graphiql/commit/cf092f5960eae250bb193b9011b2fb883f797a99)]:\n  - graphql-language-service-server@2.7.25\n\n## 0.4.10\n\n### Patch Changes\n\n- [#2474](https://github.com/graphql/graphiql/pull/2474) [`70bc61ee`](https://github.com/graphql/graphiql/commit/70bc61ee78787132d5572ef5d1e81e7d6e3b13d2) Thanks [@acao](https://github.com/acao)! - Fix bug with typed parameters on the gql/graphql/etc tagged templates!\n\n## 0.4.8\n\n### Patch Changes\n\n- [#2470](https://github.com/graphql/graphiql/pull/2470) [`d0017a93`](https://github.com/graphql/graphiql/commit/d0017a93b818cf3119e51c2b6c4a19004f98e29b) Thanks [@acao](https://github.com/acao)! - Aims to resolve #2421\n\n  - graphql config errors only log to output channel, no longer crash the LSP\n  - more performant LSP request no-ops for failing/missing config\n\n  this used to fail silently in the output channel, but vscode introduced a new retry and notification for this\n\n  would like to provide more helpful graphql config DX in the future but this should be better for now\n\n- Updated dependencies [[`d0017a93`](https://github.com/graphql/graphiql/commit/d0017a93b818cf3119e51c2b6c4a19004f98e29b)]:\n  - graphql-language-service-server@2.7.24\n\n## 0.4.7\n\n### Patch Changes\n\n- [#2417](https://github.com/graphql/graphiql/pull/2417) [`6ca6a92d`](https://github.com/graphql/graphiql/commit/6ca6a92d0fd12af974683de9706c8e8e06c751c2) Thanks [@acao](https://github.com/acao)! - fix annoying trigger character on newline issue #2182\n\n- Updated dependencies [[`6ca6a92d`](https://github.com/graphql/graphiql/commit/6ca6a92d0fd12af974683de9706c8e8e06c751c2)]:\n  - graphql-language-service-server@2.7.23\n\n## 0.4.6\n\n### Patch Changes\n\n- [#2395](https://github.com/graphql/graphiql/pull/2395) [`f7f1e900`](https://github.com/graphql/graphiql/commit/f7f1e9001ba773bdccb29e513a188384cd805834) Thanks [@acao](https://github.com/acao)! - Release `vscode-graphql` changes since publishing was broken\n\n## 0.4.5\n\n### Patch Changes\n\n- [#2382](https://github.com/graphql/graphiql/pull/2382) [`1bea864d`](https://github.com/graphql/graphiql/commit/1bea864d05dee04bb20c06dc3c3d68675b87a50a) Thanks [@acao](https://github.com/acao)! - allow disabling query/SDL validation with `graphql-config` setting `{ extensions: { languageService: { enableValidation: false } } }`.\n\n  Currently, users receive duplicate validation messages when using our LSP alongside existing validation tools like `graphql-eslint`, and this allows them to disable the LSP feature in that case.\n\n- Updated dependencies [[`6db28447`](https://github.com/graphql/graphiql/commit/6db284479a14873fea3e359efd71be0b15ab3ee8), [`1bea864d`](https://github.com/graphql/graphiql/commit/1bea864d05dee04bb20c06dc3c3d68675b87a50a)]:\n  - graphql-language-service-server@2.7.22\n\n## 0.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`d22f6111`](https://github.com/graphql/graphiql/commit/d22f6111a60af25727d8dbc1058c79607df76af2)]:\n  - graphql-language-service-server@2.7.21\n\n## 0.4.3\n\n### Patch Changes\n\n- Updated dependencies []:\n  - graphql-language-service-server@2.7.20\n\n## 0.4.2\n\n### Patch Changes\n\n- [`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f) Thanks [@acao](https://github.com/acao)! - - upgrade `graphql-config` to latest in server\n  - remove `graphql-config` dependency from `vscode-graphql` and `graphql-language-service`\n  - fix `vscode-graphql` esbuild bundling bug in `vscode-graphql` [#2269](https://github.com/graphql/graphiql/issues/2269) by fixing `esbuild` version\n- Updated dependencies [[`c36504a8`](https://github.com/graphql/graphiql/commit/c36504a804d8cc54a5136340152999b4a1a2c69f)]:\n  - graphql-language-service-server@2.7.19\n\n## 0.4.0\n\n### Minor Changes\n\n- [#2276](https://github.com/graphql/graphiql/pull/2276) [`6973a20b`](https://github.com/graphql/graphiql/commit/6973a20bcd12a599acca7c5d6671ac49def2768c) Thanks [@acao](https://github.com/acao)! - Simplified, merged with monorepo, dropped operation execution feature, we will recommend an alternative instead.\n\n### Patch Changes\n\n- Updated dependencies [[`e15d1dae`](https://github.com/graphql/graphiql/commit/e15d1dae399a7d43d8d98f2ce431a9a1f0ba84ae)]:\n  - graphql-language-service-server@2.7.18\n\n## 0.3.52\n\n### Patch Changes\n\n- [#452](https://github.com/graphql/vscode-graphql/pull/452) [`8878e42`](https://github.com/graphql/vscode-graphql/commit/8878e428c83eed4f53510f9071e9964f48b5d214) Thanks [@acao](https://github.com/acao)! - Limit activation events for package.json file provided `graphql-config`\n\n## 0.3.50\n\n### Patch Changes\n\n- [#448](https://github.com/graphql/vscode-graphql/pull/448) [`f894dad`](https://github.com/graphql/vscode-graphql/commit/f894daddfe7382f7eb8e9c921c54904255a3557c) Thanks [@acao](https://github.com/acao)! - upgrade graphql-language-service-server to the latest patch version for windows path fix\n\n* [#436](https://github.com/graphql/vscode-graphql/pull/436) [`2370607`](https://github.com/graphql/vscode-graphql/commit/23706071c6338c05e951783a3e7dfd5000da6d02) Thanks [@orta](https://github.com/orta)! - Adds support for making clicking on the graphql status item show the output channel\n\n- [#277](https://github.com/graphql/vscode-graphql/pull/277) [`6017872`](https://github.com/graphql/vscode-graphql/commit/6017872b7f19ef5c3fcad404fca9ffd5b8ba5d87) Thanks [@AumyF](https://github.com/AumyF)! - provide 'Execute Query' for `/* GraphQL */` templates\n\n* [#422](https://github.com/graphql/vscode-graphql/pull/422) [`0e2235d`](https://github.com/graphql/vscode-graphql/commit/0e2235d7fa229b78fb330c337d14fabf679884c2) Thanks [@orta](https://github.com/orta)! - Use the vscode theme API to set the right colours for the status bar item\n\n## 0.3.48\n\n### Patch Changes\n\n- [#402](https://github.com/graphql/vscode-graphql/pull/402) [`a97e5df`](https://github.com/graphql/vscode-graphql/commit/a97e5df9933dfc79b06e5202c84216cfe2d5f865) Thanks [@acao](https://github.com/acao)! - thanks @markusjwetzel! Add directive highlighting for type system directives. [https://github.com/graphql/vscode-graphql/pull/326](https://github.com/graphql/vscode-graphql/pull/326)\n\n## 0.3.43\n\n### Patch Changes\n\n- [#391](https://github.com/graphql/vscode-graphql/pull/391) [`6be5593`](https://github.com/graphql/vscode-graphql/commit/6be5593a45a4629f3438f59223ecb04949cb48d2) Thanks [@acao](https://github.com/acao)! - LSP upgrades:\n\n  - bugfix for `insertText` & completion on invalid list types\n  - add support for template strings and tags with replacement expressions, so strings like these should work now:\n\n  ```js\n  const myQuery =\n    /* GraphQL */\n    `\n          ${myFragments}\n          query MyQuery {\n              something\n              ${anotherString}\n          }\n      `;\n  ```\n\n  ```js\n  const myQuery = gql`\n          ${myFragments}\n          query MyQuery {\n              something\n              ${anotherString}\n          }\n      `;\n  ```\n\nAll notable changes to the \"vscode-graphql\" extension will be manually documented in this file.\n\nCheck [Keep a Changelog](http://keepachangelog.com) for recommendations on how to structure this file.\n\nThe git log should show a fairly clean view of each of these new versions, and the issues/PRs associated.\n\n# 0.3.25\n\nRemove `node_modules` from bundle after adding `esbuild` to make the extension bundle smaller\n\n# 0.3.24\n\nAdd highlighting and language support for `.mjs`, `.cjs`, `.es6`, `.esm` and other similar extensions\n\n# 0.3.23\n\nMajor bugfixes for language features. Most bugs with language features not working should be resolved.\n\nThe `useSchemaFileDefinition` setting was deprecated, and SDL-driven projects work by default. If you want to opt-into an experimental feature to cache graphql-config schema result for definitions (useful for remote schemas), consult the readme on how to configure `cacheSchemaFileForLookup` option in vscode settings, or graphql config (yes you can enable/disable it per-project!)\n\nDefinition lookup works by default with SDL file schemas. `cacheSchemaFileForLookup` must be enabled if you have a remote schema want definition lookup for input types, etc in queries\n\n# 0.3.19\n\n- support `graphql-config` for `.ts` and `.toml` files by upgrading `graphql-config` & `graphql-language-service-server`\n- use `*` activation event, because `graphql-config` in `package.json` is impossible to detect otherwise using vscode `activationEvents`\n- support additional language features in `graphql-language-service-server` such as interface implements interfaces, etc\n- upgrade operation execution to use a new graphql client and support subscriptions\n- fix openvsx & vscode publish by re-creating PATs and signing new agreements\n\nNote: there are still some known bugs in the language server we will be fixing soon:\n\n- if you don't see editor output, please check your config\n- output channel may show errors even after your configuration works\n- there may be issues with schema file loading\n\n# 0.3.13\n\nLSP bugfixes:\n\n- [streaming interface bug](https://github.com/graphql/graphiql/blob/main/packages/graphql-language-service-server/CHANGELOG.md#256-2020-11-28)\n- bugfixes for windows filepaths in LSP server\n\n# 0.3.8\n\n- require `dotenv` in the server runtime (for loading graphql config values), and allow a `graphql-config.dotEnvPath` configuration to specify specific paths\n- reload server on workspace configuration changes\n- reload sever-side `graphql-config` and language service on config file changes. definitions cache/etc will be rebuilt\n  - note: client not configured to reload on graphql config changes yet (i.e endpoints)\n- accept all `graphql-config.loadConfig()` options\n\n# 0.3.7\n\n- update underlying `graphql-language-service-server` to allow .gql, .graphqls extensions\n\n# 0.3.6\n\n- documentation fix\n\n# 0.3.5\n\n- readme documentation improvements, more examples, FAQ, known issues\n- bump `graphql-language-service-server` to allow implicit fragment completion (non-inline fragments). just include your fragments file or string in the graphql-config `documents`\n\n# 0.3.4\n\n- remove insiders announcement until tooling is properly in place, and insiders extension is up to date\n\n# 0.3.3\n\n- `useSchemaFileDefinition` setting\n\n# 0.3.2\n\n- #213: bugfix for input validation on operation execution\n\n# 0.3.1 🎉\n\n- upgrade to `graphql-config@3`\n- upgrade to latest major version of `graphql-language-service-server`\n  - upgrades `graphql-config@3`\n  - remove watchman dependency 🎉\n  - introduce workspace symbol lookup, outline\n  - validation and completion for input variables\n  - generate a schema output by default, for code-first schemas. SDL first schemas have an override option now\n\n## Historical 0.2.x versions\n\n[todo]\n"
  },
  {
    "path": "packages/vscode-graphql/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/vscode-graphql/README.md",
    "content": "[Changelog](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql/CHANGELOG.md)\n| [Discord Channel](https://discord.gg/r4BxrAG6fN) |\n[LSP Server Docs](https://github.com/graphql/graphiql/blob/main/packages/graphql-language-service-server/README.md)\n\nGraphQL extension for VSCode built with the aim to tightly integrate the GraphQL\nEcosystem with VSCode for an awesome developer experience.\n\n![](https://camo.githubusercontent.com/97dc1080d5e6883c4eec3eaa6b7d0f29802e6b4b/687474703a2f2f672e7265636f726469742e636f2f497379504655484e5a342e676966)\n\n### `.graphql`, `.gql` file extension support and `gql`/`graphql` tagged template literal support for tsx, jsx, ts, js\n\n- syntax highlighting (provided by `vscode-graphql-syntax`)\n- autocomplete suggestions\n- validation against schema\n- snippets (interface, type, input, enum, union)\n- hover support\n- go to definition support (input, enum, type)\n- outline support\n\n## Getting Started\n\n> **This extension requires a graphql-config file**.\n\nTo support language features like completion and \"go-to definition\" across multiple files,\nplease include `documents` in the `graphql-config` file default or per-project\n\n### Simplest Config Example\n\n```yaml\n# .graphqlrc.yml or graphql.config.yml\nschema: 'schema.graphql'\ndocuments: 'src/**/*.{graphql,js,ts,jsx,tsx}'\n```\n\n`package.json`:\n\n```json\n\"graphql\": {\n  \"schema\": \"https://localhost:3001/graphql\",\n  \"documents\": \"**/*.{graphql,js,ts,jsx,tsx}\"\n},\n```\n\n```ts\n// .graphqlrc.ts or graphql.config.ts\nexport default {\n  schema: 'schema.graphql',\n  documents: '**/*.{graphql,js,ts,jsx,tsx}',\n};\n```\n\nsame for .json, .toml, etc\n\n## Additional Features\n\n- Loads the LSP server upon detecting a `graphql-config` file at root level or in a\n  parent level directory, or a `package.json` file with `graphql` config\n- Loads `.graphql`, `.gql` files, and detects `gql`, `graphql` tags and `/** GraphQL */` and `#graphql` comments in js, ts, jsx, tsx, vue files\n- pre-load schema and fragment definitions\n- Support [`graphql-config`](https://graphql-config.com/) files with one or multiple projects (multi-root workspaces are not yet supported)\n- the language service re-starts on saved changes to vscode settings and/or graphql config!\n\n## Configuration\n\n| Parameter                                 | Default                                           | Description                                                                                                                                                                                                                                                                                         |\n| ----------------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `graphql-config.load.baseDir`             | workspace root or process.cwd()                   | the path where graphql config looks for config files                                                                                                                                                                                                                                                |\n| `graphql-config.load.filePath`            | `null`                                            | exact filepath of the config file.                                                                                                                                                                                                                                                                  |\n| `graphql-config.load.configName`          | `graphql`                                         | config name prefix instead of `graphql`                                                                                                                                                                                                                                                             |\n| `graphql-config.load.legacy`              | `true`                                            | backwards compatibility with `graphql-config@2`                                                                                                                                                                                                                                                     |\n| `graphql-config.dotEnvPath`               | `null`                                            | backwards compatibility with `graphql-config@2`                                                                                                                                                                                                                                                     |\n| `vscode-graphql.cacheSchemaFileForLookup` | `true` if `schema` contains non-SDL files or URLs | generate an SDL file based on your graphql-config schema configuration for definition lookup and other features. enabled by default when your `schema` config are URLs or introspection JSON, or if you have any non-local SDL files in `schema`                                                    |\n| `vscode-graphql.schemaCacheTTL`           | `30000`                                           | an integer value in milliseconds for the desired minimum cache lifetime for all schemas, which also causes the generated file to be re-written. set to 30s by default. effectively a \"lazy\" form of polling. if you are developing a schema alongside client queries, you may want to decrease this |\n| `vscode-graphql.debug`                    | `false`                                           | show more verbose log output in the output channel                                                                                                                                                                                                                                                  |\n\n### Advanced Example\n\nMulti-project can be used for both local files, URL defined schema, or both\n\n```js\nimport dotenv from 'dotenv';\ndotenv.config();\n\n// .graphqlrc.ts or graphql.config.ts\nexport default {\n  projects: {\n    app: {\n      schema: ['src/schema.graphql', 'directives.graphql'],\n      documents: ['**/*.{graphql,js,ts,jsx,tsx}', 'my/fragments.graphql'],\n    },\n    db: {\n      schema: 'src/generated/db.graphql',\n      documents: ['src/db/**/*.graphql', 'my/fragments.graphql'],\n      extensions: {\n        endpoints: {\n          default: {\n            url: 'https://localhost:3001/graphql/',\n            headers: {\n              Authorization: `Bearer ${process.env.API_TOKEN}`,\n            },\n          },\n        },\n      },\n    },\n  },\n};\n```\n\nNotice that `documents` key supports glob pattern and hence `[\"**/*.graphql\"]`\nis also valid.\n\n## Frequently Asked Questions\n\n### The extension fails with errors about duplicate types\n\nYour object types must be unique per project (as they must be unique per schema), and your fragment names must also be unique per project.\n\n### The extension fails with errors about missing scalars, directives, etc\n\nMake sure that your `schema` pointers refer to a complete schema!\n\n### In JSX and TSX files I see completion items I don't need\n\nThe way vscode lets you filter these out is\n[on the user end](https://github.com/microsoft/vscode/issues/45039)\n\nSo you'll need to add something like this to your global vscode settings:\n\n```json\n\"[typescriptreact]\": {\n  \"editor.suggest.filteredTypes\": {\n    \"snippet\": false\n  }\n},\n\"[javascriptreact]\": {\n  \"editor.suggest.filteredTypes\": {\n    \"snippet\": false\n  }\n}\n```\n\n### My graphql config file is not at the root\n\nGood news, we have configs for this now!\n\nYou can search a folder for any of the matching config file names listed above:\n\n```json\n\"graphql-config.load.rootDir\": \"./config\"\n\"graphql-config.envFilePath\": \"./config/.dev.env\"\n```\n\nOr a specific filepath:\n\n```json\n\"graphql-config.load.filepath\": \"./config/my-graphql-config.js\"\n```\n\nOr a different `configName` that allows different formats:\n\n```json\n\"graphql-config.load.rootDir\": \"./config\",\n\"graphql-config.load.configName\": \"acme\"\n```\n\nwhich would search for `./config/.acmerc`, `.config/.acmerc.js`,\n`.config/acme.config.json`, etc matching the config paths above\n\nIf you have multiple projects, you need to define one top-level config that\ndefines all project configs using `projects`\n\n### How do I enable language features for an embedded graphql string?\n\nPlease refer to the `vscode-graphql-syntax` reference files ([js](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.js),[ts](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.ts),[svelte](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.svelte),[vue](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.vue)) to learn our template tag, comment and other graphql delimiter patterns for the file types that the language server supports. The syntax highlighter currently supports more languages than the language server. If you notice any places where one or the other doesn't work, please report it!\n\n## Known Issues\n\n- the locally generated schema file for definition lookup currently does not re-generate on schema changes. this will be fixed soon.\n- multi-root workspaces support will be added soon as well.\n- some graphql-config options aren't always honored, this will also be fixed soon\n\n## Attribution\n\nThanks to apollo for their\n[graphql-vscode grammars](https://github.com/apollographql/vscode-graphql/blob/main/syntaxes/graphql.js.json)!\nWe have borrowed from these on several occasions. If you are looking for the\nmost replete set of vscode grammars for writing your own extension, look no\nfurther!\n\n## Development\n\nThis plugin uses the\n[GraphQL language server](https://github.com/graphql/graphql-language-service-server)\n\n1.  Clone the repository - https://github.com/graphql/graphiql\n1.  `yarn`\n1.  Run \"VSCode Extension\" launcher in vscode\n1.  This will open another VSCode instance with extension enabled\n1.  Open a project with a graphql config file - \":electric_plug: graphql\" in\n    VSCode status bar indicates that the extension is in use\n1.  Logs for GraphQL language service will appear in output section under\n    GraphQL Language Service\n\n### Contributing back to this project\n\nThis repository is managed by EasyCLA. Project participants must sign the free\n([GraphQL Specification Membership agreement](https://preview-spec-membership.graphql.org))\nbefore making a contribution. You only need to do this one time, and it can be\nsigned by\n[individual contributors](http://individual-spec-membership.graphql.org) or\ntheir [employers](http://corporate-spec-membership.graphql.org).\n\nTo initiate the signature process please open a PR against this repo. The\nEasyCLA bot will block the merge if we still need a membership agreement from\nyou.\n\nYou can find\n[detailed information here](https://github.com/graphql/graphql-wg/tree/main/membership).\nIf you have issues, please email\n[operations@graphql.org](mailto:operations@graphql.org).\n\nIf your company benefits from GraphQL and you would like to provide essential\nfinancial support for the systems and people that power our community, please\nalso consider membership in the\n[GraphQL Foundation](https://foundation.graphql.org/join).\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/vscode-graphql/esbuild.js",
    "content": "const { build } = require('esbuild');\nconst [, , arg] = process.argv;\n\nconst logger = console;\n\nconst isWatchMode = arg === '--watch';\n\nbuild({\n  entryPoints: [\n    'src/extension.ts',\n    'src/serverIpc/index.ts',\n    'src/serverStdio/index.ts',\n  ],\n  bundle: true,\n  minify: arg === '--minify',\n  platform: 'node',\n  outdir: 'out/',\n  format: 'cjs',\n  sourcemap: true,\n  external: [\n    // Avoid bundling @vue/compiler-sfc's dynamic dependencies\n    'squirrelly',\n    'teacup',\n    'coffee-script',\n    'marko',\n    'slm',\n    'vash',\n    'plates',\n    'babel-core',\n    'htmling',\n    'ractive',\n    'mote',\n    'eco',\n    'jqtpl',\n    'hamljs',\n    'jazz',\n    'hamlet',\n    'whiskers',\n    'haml-coffee',\n    'hogan.js',\n    'templayed',\n    'walrus',\n    'mustache',\n    'just',\n    'ect',\n    'toffee',\n    'twing',\n    'dot',\n    'bracket-template',\n    'vscode',\n    'velocityjs',\n    'dustjs-linkedin',\n    'atpl',\n    'liquor',\n    'twig',\n  ],\n})\n  .then(({ errors, warnings }) => {\n    if (warnings.length) {\n      logger.warn(...warnings);\n    }\n    if (errors.length) {\n      logger.error(...errors);\n    }\n\n    logger.log('successfully bundled vscode-graphql 🚀');\n\n    if (isWatchMode) {\n      logger.log('watching... 🕰');\n    } else {\n      process.exit();\n    }\n  })\n  .catch(err => {\n    logger.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "packages/vscode-graphql/package.json",
    "content": "{\n  \"name\": \"vscode-graphql\",\n  \"version\": \"0.13.2\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"displayName\": \"GraphQL: Language Feature Support\",\n  \"keywords\": [\n    \"graphql\",\n    \"lsp\",\n    \"graph\"\n  ],\n  \"contributors\": [\n    {\n      \"name\": \"Divyendu Singh\",\n      \"url\": \"https://www.divyendusingh.com/\"\n    },\n    {\n      \"name\": \"Orta\",\n      \"url\": \"https://orta.io/\"\n    }\n  ],\n  \"description\": \"GraphQL LSP extension that adds autocompletion, validation, go to definition, hover, outline and more.\",\n  \"icon\": \"assets/images/logo.png\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/vscode-graphql\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql/README.md\",\n  \"galleryBanner\": {\n    \"color\": \"#032539\",\n    \"theme\": \"dark\"\n  },\n  \"publisher\": \"GraphQL\",\n  \"engines\": {\n    \"vscode\": \"^1.63.0\"\n  },\n  \"categories\": [\n    \"Programming Languages\",\n    \"Linters\",\n    \"Other\"\n  ],\n  \"activationEvents\": [\n    \"onCommand:vscode-graphql.isDebugging\",\n    \"onCommand:vscode-graphql.contentProvider\",\n    \"workspaceContains:**/.graphqlrc\",\n    \"workspaceContains:**/.graphqlrc.{json,yaml,yml,js,ts,toml}\",\n    \"workspaceContains:**/graphql.config.{json,yaml,yml,js,ts,toml}\",\n    \"workspaceContains:**/package.json\"\n  ],\n  \"main\": \"./out/extension.js\",\n  \"extensionDependencies\": [\n    \"GraphQL.vscode-graphql-syntax\"\n  ],\n  \"contributes\": {\n    \"icons\": {\n      \"graphql-logo\": {\n        \"description\": \"GraphQL Icon\",\n        \"default\": {\n          \"fontPath\": \"assets/graphql-fonts.woff\",\n          \"fontCharacter\": \"\\\\E900\"\n        }\n      },\n      \"graphql-loading\": {\n        \"description\": \"GraphQL Loading Icon\",\n        \"default\": {\n          \"fontPath\": \"assets/graphql-fonts.woff\",\n          \"fontCharacter\": \"\\\\E902\"\n        }\n      },\n      \"graphql-failed\": {\n        \"description\": \"GraphQL Failed Icon\",\n        \"default\": {\n          \"fontPath\": \"assets/graphql-fonts.woff\",\n          \"fontCharacter\": \"\\\\E901\"\n        }\n      }\n    },\n    \"configuration\": {\n      \"title\": \"VS Code GraphQL\",\n      \"properties\": {\n        \"vscode-graphql.debug\": {\n          \"type\": [\n            \"boolean\",\n            \"null\"\n          ],\n          \"default\": false,\n          \"description\": \"Enable debug logs and node debugger for client\"\n        },\n        \"vscode-graphql.cacheSchemaFileForLookup\": {\n          \"type\": [\n            \"boolean\"\n          ],\n          \"description\": \"Use a cached file output of your graphql-config schema result for definition lookups, symbols, outline, etc. Enabled by default when one or more schema entry is not a local file with SDL in it. Disable if you want to use SDL with a generated schema.\"\n        },\n        \"vscode-graphql.largeFileThreshold\": {\n          \"type\": [\n            \"number\"\n          ],\n          \"description\": \"Disables outlining and other expensive operations for files larger than this threshold (in bytes). Defaults to 1000000 (one million).\",\n          \"default\": 1000000\n        },\n        \"vscode-graphql.rejectUnauthorized\": {\n          \"type\": [\n            \"boolean\"\n          ],\n          \"description\": \"Fail the request on invalid certificate\",\n          \"default\": true\n        },\n        \"vscode-graphql.schemaCacheTTL\": {\n          \"type\": [\n            \"number\"\n          ],\n          \"description\": \"Schema cache ttl in milliseconds - the interval before requesting a fresh schema when caching the local schema file is enabled. Defaults to 30000 (30 seconds).\",\n          \"default\": 30000\n        },\n        \"vscode-graphql.transport\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"ipc\",\n            \"stdio\"\n          ],\n          \"description\": \"The transport used between the language server and the client.\",\n          \"default\": \"ipc\"\n        },\n        \"graphql-config.load.rootDir\": {\n          \"type\": [\n            \"string\"\n          ],\n          \"description\": \"Base dir for graphql config loadConfig(), to look for config files or package.json\"\n        },\n        \"graphql-config.load.filepath\": {\n          \"type\": [\n            \"string\"\n          ],\n          \"description\": \"exact filePath for a `graphql-config` file `loadConfig()`\",\n          \"default\": null\n        },\n        \"graphql-config.load.configName\": {\n          \"type\": [\n            \"string\"\n          ],\n          \"description\": \"optional <configName>.config.{js,ts,toml,yaml,json} & <configName>rc* instead of default `graphql`\",\n          \"default\": null\n        },\n        \"graphql-config.load.legacy\": {\n          \"type\": [\n            \"boolean\"\n          ],\n          \"description\": \"legacy mode for graphql config v2 config\",\n          \"default\": null\n        },\n        \"graphql-config.dotEnvPath\": {\n          \"type\": [\n            \"string\"\n          ],\n          \"description\": \"optional .env load file path, if not the default. specify a relative path to the .env file to be loaded by dotenv module. you can also import dotenv in the config file.\",\n          \"default\": null\n        }\n      }\n    },\n    \"commands\": [\n      {\n        \"command\": \"vscode-graphql.restart\",\n        \"title\": \"VSCode GraphQL: Manual Restart\"\n      },\n      {\n        \"command\": \"vscode-graphql.showOutputChannel\",\n        \"title\": \"VSCode GraphQL: Show output channel\"\n      }\n    ]\n  },\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"vscode:prepublish\": \"npm run compile -- --minify\",\n    \"compile\": \"node esbuild\",\n    \"build-bundles\": \"npm run compile -- --sourcemap\",\n    \"vsce:package\": \"vsce package --yarn\",\n    \"env:source\": \"export $(cat .envrc | xargs)\",\n    \"vsce:publish\": \"vsce publish --yarn\",\n    \"open-vsx:publish\": \"ovsx publish $(ls -1 *.vsix | sort -V | tail -n 1) --pat $OVSX_PAT\",\n    \"release\": \"npm run vsce:publish && npm run open-vsx:publish\"\n  },\n  \"devDependencies\": {\n    \"@types/capitalize\": \"2.0.0\",\n    \"@types/vscode\": \"1.62.0\",\n    \"@vscode/vsce\": \"^2.22.1-2\",\n    \"esbuild\": \"0.18.10\",\n    \"ovsx\": \"0.8.3\"\n  },\n  \"dependencies\": {\n    \"graphql\": \"^16.9.0 || ^17.0.0-alpha.2\",\n    \"graphql-language-service-server\": \"^2.14.2\",\n    \"typescript\": \"^5.3.3\",\n    \"vscode-languageclient\": \"8.0.2\"\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql/snippets/graphql.json",
    "content": "{\n  \".source.graphql\": {\n    \"Interface definition\": {\n      \"prefix\": \"int\",\n      \"body\": [\"interface ${1:IName} {\", \"\\t$2\", \"}\"]\n    },\n    \"Type definition\": {\n      \"prefix\": \"typ\",\n      \"body\": [\n        \"type ${1:TypeName} ${2:implements ${3:IName}${4: , ${5:IName}}}{\",\n        \"\\t$5\",\n        \"}\"\n      ]\n    },\n    \"Input Field definition\": {\n      \"prefix\": \"inp\",\n      \"body\": [\"input ${1:TypeInput} {\", \"\\t$2\", \"}\"]\n    },\n    \"Enum definition\": {\n      \"prefix\": \"enu\",\n      \"body\": [\"enum ${1:EnumName} {\", \"\\t$2\", \"}\"]\n    },\n    \"Union definition\": {\n      \"prefix\": \"uni\",\n      \"body\": [\"union ${1:UnionName} = $2 | $3\"]\n    },\n    \"Fragment definition\": {\n      \"prefix\": \"fra\",\n      \"body\": [\"fragment ${1:FragmentName} on ${2:TypeName} {\", \"\\t$3\", \"}\"]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql/src/apis/statusBar.ts",
    "content": "import {\n  StatusBarAlignment,\n  StatusBarItem,\n  TextEditor,\n  window,\n  ThemeColor,\n  version,\n} from 'vscode';\n\nimport { LanguageClient, State } from 'vscode-languageclient/node';\n\nenum Status {\n  INIT = 1,\n  RUNNING = 2,\n  ERROR = 3,\n}\n\n// const statusBarText = 'GraphQL';\n\nconst oldStatusBarUIElements = {\n  [Status.INIT]: {\n    icon: 'sync',\n    tooltip: 'GraphQL language server is initializing',\n  },\n  [Status.RUNNING]: {\n    icon: 'plug',\n    tooltip: 'GraphQL language server is running',\n  },\n  [Status.ERROR]: {\n    icon: 'stop',\n    color: new ThemeColor('list.warningForeground'),\n    tooltip: 'GraphQL language server has stopped',\n  },\n};\n\n// Uses an API added in Feb 2022\nconst statusBarUIElements = {\n  [Status.INIT]: {\n    icon: 'graphql-loading',\n    tooltip: 'GraphQL language server is starting up, click to show logs',\n  },\n  [Status.RUNNING]: {\n    icon: 'graphql-logo',\n    tooltip: 'GraphQL language server is running, click to show logs',\n  },\n  [Status.ERROR]: {\n    icon: 'graphql-error',\n    color: new ThemeColor('list.warningForeground'),\n    tooltip: 'GraphQL language server has stopped, click to show logs',\n  },\n};\n\n// const statusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 0);\nlet extensionStatus: Status = Status.RUNNING;\nlet serverRunning = true; // TODO: See comment with client.onNotification(\"init\".....\n\nconst statusBarActivationLanguageIds = [\n  'graphql',\n  'javascript',\n  'javascriptreact',\n  'typescript',\n  'typescriptreact',\n  'vue',\n  'svelte',\n  'astro',\n];\n\nexport const createStatusBar = () => {\n  return window.createStatusBarItem(StatusBarAlignment.Right, 0);\n};\n\nexport function initStatusBar(\n  statusBarItem: StatusBarItem,\n  client: LanguageClient,\n  editor: TextEditor | undefined,\n) {\n  extensionStatus = Status.INIT;\n\n  // TODO: Make graphql-language-service-server throw relevant\n  // notifications. Currently, it does not throw \"init\" or \"exit\"\n  // and status bar is hard coded to all greens.\n\n  client.onNotification('init', _params => {\n    extensionStatus = Status.RUNNING;\n    serverRunning = true;\n    updateStatusBar(statusBarItem, editor);\n  });\n\n  client.onNotification('exit', _params => {\n    extensionStatus = Status.ERROR;\n    serverRunning = false;\n    updateStatusBar(statusBarItem, editor);\n  });\n\n  client.onDidChangeState(event => {\n    if (event.newState === State.Running) {\n      extensionStatus = Status.RUNNING;\n      serverRunning = true;\n    } else {\n      extensionStatus = Status.ERROR;\n      client.info('The graphql server has stopped running');\n      serverRunning = false;\n    }\n    updateStatusBar(statusBarItem, editor);\n  });\n\n  updateStatusBar(statusBarItem, editor);\n\n  window.onDidChangeActiveTextEditor((activeEditor: TextEditor | undefined) => {\n    // update the status if the server is running\n    updateStatusBar(statusBarItem, activeEditor);\n  });\n}\n\nfunction updateStatusBar(\n  statusBarItem: StatusBarItem,\n  editor: TextEditor | undefined,\n) {\n  extensionStatus = serverRunning ? Status.RUNNING : Status.ERROR;\n\n  // Support two different versions of the status bar UI,\n  // a modern version which uses the new API which lets us use the GraphQL logo and\n  // a legacy version which says 'graphql' in text.\n\n  const [major, minor] = version.split('.');\n  const userNewVersion =\n    Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 65);\n  const statusBarUIElement = userNewVersion\n    ? statusBarUIElements\n    : oldStatusBarUIElements;\n  const message = userNewVersion ? '' : ' GraphQL';\n\n  const statusUI = statusBarUIElement[extensionStatus];\n  statusBarItem.text = `$(${statusUI.icon})${message}`;\n  statusBarItem.tooltip = statusUI.tooltip;\n  statusBarItem.command = 'vscode-graphql.showOutputChannel';\n  if ('color' in statusUI) {\n    statusBarItem.color = statusUI.color;\n  }\n\n  if (\n    editor &&\n    statusBarActivationLanguageIds.includes(editor.document.languageId)\n  ) {\n    statusBarItem.show();\n  } else {\n    statusBarItem.hide();\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql/src/extension.ts",
    "content": "import {\n  workspace,\n  ExtensionContext,\n  window,\n  commands,\n  OutputChannel,\n} from 'vscode';\n\nimport {\n  LanguageClientOptions,\n  ServerOptions,\n  TransportKind,\n  RevealOutputChannelOn,\n  LanguageClient,\n} from 'vscode-languageclient/node';\n\nimport * as path from 'node:path';\nimport { createStatusBar, initStatusBar } from './apis/statusBar';\n\nlet client: LanguageClient;\n\nexport async function activate(context: ExtensionContext) {\n  const outputChannel: OutputChannel = window.createOutputChannel(\n    'GraphQL Language Server',\n  );\n\n  const config = getConfig();\n  const { debug, transport } = config;\n  if (debug) {\n    // eslint-disable-next-line no-console\n    console.log(`Extension \"vscode-graphql\" is now activating (${transport})!`);\n  }\n\n  const debugOptions = {\n    execArgv: ['--nolazy', '--inspect=localhost:6009'],\n  };\n\n  let transportKind;\n  let server;\n  switch (transport) {\n    case 'ipc':\n      transportKind = TransportKind.ipc;\n      server = 'serverIpc';\n      break;\n    case 'stdio':\n      transportKind = TransportKind.stdio;\n      server = 'serverStdio';\n      break;\n    default:\n      if (debug) {\n        // eslint-disable-next-line no-console\n        console.log('Transport not recognized. Defaulting to IPC!');\n      }\n      transportKind = TransportKind.ipc;\n      server = 'serverIpc';\n      break;\n  }\n  const serverPath = path.join('out', server, 'index.js');\n  const serverModule = context.asAbsolutePath(serverPath);\n\n  const serverOptions: ServerOptions = {\n    run: {\n      module: serverModule,\n      transport: transportKind,\n    },\n    debug: {\n      module: serverModule,\n      transport: transportKind,\n      options: { ...(debug ? debugOptions : {}) },\n    },\n  };\n\n  const clientOptions: LanguageClientOptions = {\n    documentSelector: [\n      { scheme: 'file', language: 'graphql' },\n      { scheme: 'file', language: 'javascript' },\n      { scheme: 'file', language: 'javascriptreact' },\n      { scheme: 'file', language: 'typescript' },\n      { scheme: 'file', language: 'typescriptreact' },\n      { scheme: 'file', language: 'vue' },\n      { scheme: 'file', language: 'vue-html' },\n      { scheme: 'file', language: 'svelte' },\n      { scheme: 'file', language: 'astro' },\n    ],\n    synchronize: {\n      // TODO: This should include any referenced graphql files inside the graphql-config\n      fileEvents: [\n        workspace.createFileSystemWatcher(\n          '/{graphql.config.*,.graphqlrc,.graphqlrc.*,package.json}',\n          false,\n          // Ignore change events for graphql config, we only care about create, delete and save events\n          // otherwise, the underlying language service is re-started on every key change.\n          // also, it makes sense that it should only re-load on file save, but we need to document that.\n          // TODO: perhaps we can intercept change events, and remind the user\n          // to save for the changes to take effect\n          true,\n        ),\n        // TODO: load ignore\n        // These ignore node_modules and .git by default\n        workspace.createFileSystemWatcher(\n          '**/{*.graphql,*.graphqls,*.gql,*.js,*.mjs,*.cjs,*.esm,*.es,*.es6,*.jsx,*.ts,*.tsx,*.vue,*.svelte,*.cts,*.mts,*.json,*.astro}',\n        ),\n      ],\n    },\n    outputChannel,\n    outputChannelName: 'GraphQL Language Server',\n    revealOutputChannelOn: RevealOutputChannelOn.Never,\n    initializationFailedHandler(err) {\n      outputChannel.appendLine('Initialization failed');\n      outputChannel.appendLine(err.message);\n      if (err.stack) {\n        outputChannel.appendLine(err.stack);\n      }\n      if (debug) {\n        outputChannel.show();\n      }\n      return false;\n    },\n  };\n\n  client = new LanguageClient(\n    'vscode-graphql',\n    serverOptions,\n    clientOptions,\n    debug,\n  );\n\n  const statusBarItem = createStatusBar();\n  context.subscriptions.push(statusBarItem);\n\n  await client.start();\n  initStatusBar(statusBarItem, client, window.activeTextEditor);\n\n  const commandShowOutputChannel = commands.registerCommand(\n    'vscode-graphql.showOutputChannel',\n    () => outputChannel.show(),\n  );\n\n  context.subscriptions.push(commandShowOutputChannel);\n\n  commands.registerCommand('vscode-graphql.restart', async () => {\n    outputChannel.appendLine('Stopping GraphQL LSP');\n    await client.stop();\n\n    outputChannel.appendLine('Restarting GraphQL LSP');\n    await client.start();\n    outputChannel.appendLine('GraphQL LSP restarted');\n  });\n}\n\nexport function deactivate() {\n  if (!client) {\n    return;\n  }\n  // eslint-disable-next-line no-console\n  console.log('Extension \"vscode-graphql\" will be de-activated!');\n  return client.stop();\n}\n\nfunction getConfig() {\n  return workspace.getConfiguration(\n    'vscode-graphql',\n    window.activeTextEditor ? window.activeTextEditor.document.uri : null,\n  );\n}\n"
  },
  {
    "path": "packages/vscode-graphql/src/serverIpc/index.ts",
    "content": "// this lives in the same monorepo! most errors you see in\n// vscode that aren't highlighting or bracket completion\n// related are coming from our LSP server\nimport { startServer } from 'graphql-language-service-server';\n\n// The npm scripts are configured to only build this once before\n// watching the extension, so please restart the extension debugger for changes!\n\nasync function start() {\n  try {\n    await startServer({ method: 'node' });\n  } catch (err) {\n    // eslint-disable-next-line no-console\n    console.error(err);\n  }\n}\n\nvoid start();\n"
  },
  {
    "path": "packages/vscode-graphql/src/serverStdio/index.ts",
    "content": "// this lives in the same monorepo! most errors you see in\n// vscode that aren't highlighting or bracket completion\n// related are coming from our LSP server\nimport { startServer } from 'graphql-language-service-server';\n\n// The npm scripts are configured to only build this once before\n// watching the extension, so please restart the extension debugger for changes!\n\nasync function start() {\n  try {\n    await startServer({ method: 'stream' });\n  } catch (err) {\n    // eslint-disable-next-line no-console\n    console.error(err);\n  }\n}\n\nvoid start();\n"
  },
  {
    "path": "packages/vscode-graphql/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"CommonJS\",\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\"\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    },\n    {\n      \"path\": \"../graphql-language-service-server\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-execution/.vscodeignore",
    "content": "src/\ntsconfig.json\nyarn-error.log\n**/*.tsbuildinfo\n**/*.d.ts\nnode_modules\n!**/node_modules/ts-node\n"
  },
  {
    "path": "packages/vscode-graphql-execution/CHANGELOG.md",
    "content": "# vscode-graphql-execution\n\n## 0.3.2\n\n### Patch Changes\n\n- [#3896](https://github.com/graphql/graphiql/pull/3896) [`1adc40c`](https://github.com/graphql/graphiql/commit/1adc40cc56dbf79296bb857156e6adce1c44dcbe) Thanks [@dimaMachina](https://github.com/dimaMachina)! - bump eslint, eslint-plugins and fix new warnings\n\n## 0.3.1\n\n### Patch Changes\n\n- [#3773](https://github.com/graphql/graphiql/pull/3773) [`31edfab`](https://github.com/graphql/graphiql/commit/31edfab441304d8eb3358acebc475c51e5646e8b) Thanks [@yaacovCR](https://github.com/yaacovCR)! - use latest stable version of graphql 16.9.0 for bundled libraries & tests\n\n## 0.3.0\n\n### Minor Changes\n\n- [#3682](https://github.com/graphql/graphiql/pull/3682) [`6c9f0df`](https://github.com/graphql/graphiql/commit/6c9f0df83ea4afe7fa59f84d83d59fba73dc3931) Thanks [@yaacovCR](https://github.com/yaacovCR)! - Support v17 of `graphql-js` from `17.0.0-alpha.2` forward.\n\n  Includes support for the latest incremental delivery response format. For further details, see https://github.com/graphql/defer-stream-wg/discussions/69.\n\n## 0.2.6\n\n### Patch Changes\n\n- [#3519](https://github.com/graphql/graphiql/pull/3519) [`8188e3e6`](https://github.com/graphql/graphiql/commit/8188e3e6fd979bcf2fbdf9568deb0c88d0df99e2) Thanks [@acao](https://github.com/acao)! - bump ovsx\n\n## 0.2.5\n\n### Patch Changes\n\n- [#3480](https://github.com/graphql/graphiql/pull/3480) [`a1fced10`](https://github.com/graphql/graphiql/commit/a1fced10bf37a339709243a9576b3fdcae832fb8) Thanks [@craig-riecke](https://github.com/craig-riecke)! - Fix execution extension esbuild bundling\n\n## 0.2.4\n\n### Patch Changes\n\n- [#3274](https://github.com/graphql/graphiql/pull/3274) [`5e38ab6b`](https://github.com/graphql/graphiql/commit/5e38ab6b2235cb0dec4e7df42772680a1e905a1a) Thanks [@acao](https://github.com/acao)! - fix vscode-graphql-execution release\n\n## 0.2.3\n\n### Patch Changes\n\n- [#3271](https://github.com/graphql/graphiql/pull/3271) [`d29b3d8f`](https://github.com/graphql/graphiql/commit/d29b3d8f983b9ae306aeae4325203ddd7f4f127e) Thanks [@acao](https://github.com/acao)! - fix vscode-graphql-execution release\n\n## 0.2.2\n\n### Patch Changes\n\n- [#3269](https://github.com/graphql/graphiql/pull/3269) [`2fb7f1f5`](https://github.com/graphql/graphiql/commit/2fb7f1f5d8a69a5de572b783de7801d5993f758a) Thanks [@acao](https://github.com/acao)! - fix ovsx release\n\n## 0.2.1\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n## 0.2.1-alpha.0\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n## 0.2.0\n\n### Minor Changes\n\n- [#3143](https://github.com/graphql/graphiql/pull/3143) [`4c3a08b1`](https://github.com/graphql/graphiql/commit/4c3a08b1a99e0933362a1c93340b613730c90aa4) Thanks [@B2o5T](https://github.com/B2o5T)! - `GraphQLContentProvider.getCurrentHtml` should not return `Promise`\n\n### Patch Changes\n\n- [#3143](https://github.com/graphql/graphiql/pull/3143) [`4c3a08b1`](https://github.com/graphql/graphiql/commit/4c3a08b1a99e0933362a1c93340b613730c90aa4) Thanks [@B2o5T](https://github.com/B2o5T)! - [ESLint] enable `sonar/prefer-promise-shorthand` and `sonar/no-dead-store` rules\n\n## 0.1.9\n\n### Patch Changes\n\n- [#3113](https://github.com/graphql/graphiql/pull/3113) [`2e477eb2`](https://github.com/graphql/graphiql/commit/2e477eb24672a242ae4a4f2dfaeaf41152ed7ee9) Thanks [@B2o5T](https://github.com/B2o5T)! - replace `.forEach` with `for..of`\n\n- [#3120](https://github.com/graphql/graphiql/pull/3120) [`15c26eb6`](https://github.com/graphql/graphiql/commit/15c26eb6d621a85df9eecb2b8a5fa009fa2fe040) Thanks [@B2o5T](https://github.com/B2o5T)! - prefer await to then\n\n## 0.1.8\n\n### Patch Changes\n\n- [#2993](https://github.com/graphql/graphiql/pull/2993) [`bdc966cb`](https://github.com/graphql/graphiql/commit/bdc966cba6134a72ff7fe40f76543c77ba15d4a4) Thanks [@B2o5T](https://github.com/B2o5T)! - add `unicorn/consistent-destructuring` rule\n\n- [#3038](https://github.com/graphql/graphiql/pull/3038) [`708c428c`](https://github.com/graphql/graphiql/commit/708c428c9f7260989891db6ea37d1bc9ba5a439a) Thanks [@B2o5T](https://github.com/B2o5T)! - remove unused collection `operationNames` in `executeOperation()`\n\n- [#2940](https://github.com/graphql/graphiql/pull/2940) [`8725d1b6`](https://github.com/graphql/graphiql/commit/8725d1b6b686139286cf05dec6a84d89942128ba) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-node-protocol` rule\n\n## 0.1.7\n\n### Patch Changes\n\n- [#2931](https://github.com/graphql/graphiql/pull/2931) [`f7addb20`](https://github.com/graphql/graphiql/commit/f7addb20c4a558fbfb4112c8ff095bbc8f9d9147) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `no-negated-condition` and `no-else-return` rules\n\n- [#2922](https://github.com/graphql/graphiql/pull/2922) [`d1fcad72`](https://github.com/graphql/graphiql/commit/d1fcad72607e2789517dfe4936b5ec604e46762b) Thanks [@B2o5T](https://github.com/B2o5T)! - extends `plugin:import/recommended` and fix warnings\n\n- [#2966](https://github.com/graphql/graphiql/pull/2966) [`f9aa87dc`](https://github.com/graphql/graphiql/commit/f9aa87dc6a88ed8a8a0a94de520c7a41fff8ffde) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `sonarjs/no-small-switch` and `sonarjs/no-duplicated-branches` rules\n\n- [#2937](https://github.com/graphql/graphiql/pull/2937) [`c70d9165`](https://github.com/graphql/graphiql/commit/c70d9165cc1ef8eb1cd0d6b506ced98c626597f9) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-includes`\n\n- [#2965](https://github.com/graphql/graphiql/pull/2965) [`0669767e`](https://github.com/graphql/graphiql/commit/0669767e1e2196a78cbefe3679a52bcbb341e913) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `unicorn/prefer-optional-catch-binding` rule\n\n- [#2936](https://github.com/graphql/graphiql/pull/2936) [`18f8e80a`](https://github.com/graphql/graphiql/commit/18f8e80ae12edfd0c36adcb300cf9e06ac27ea49) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `lonely-if`/`unicorn/lonely-if` rules\n\n- [#2963](https://github.com/graphql/graphiql/pull/2963) [`f263f778`](https://github.com/graphql/graphiql/commit/f263f778cb95b9f413bd09ca56a43f5b9c2f6215) Thanks [@B2o5T](https://github.com/B2o5T)! - enable `prefer-destructuring` rule\n\n## 0.1.6\n\n### Patch Changes\n\n- [#2884](https://github.com/graphql/graphiql/pull/2884) [`74ea4ce1`](https://github.com/graphql/graphiql/commit/74ea4ce1cd1209b86cbf08bbece658c2b800617f) Thanks [@B2o5T](https://github.com/B2o5T)! - change severity of `radix` rule to `error` to clean up eslint output\n\n## 0.1.5\n\n### Patch Changes\n\n- [#2812](https://github.com/graphql/graphiql/pull/2812) [`cf2e3061`](https://github.com/graphql/graphiql/commit/cf2e3061f67ef5cf6b890e217d20915d0eaec1bd) Thanks [@acao](https://github.com/acao)! - fix a bundling bug for vscode, rolling back graphql-config upgrade\n\n## 0.1.4\n\n### Patch Changes\n\n- [#2810](https://github.com/graphql/graphiql/pull/2810) [`f688422e`](https://github.com/graphql/graphiql/commit/f688422ed87ddd411cf3552fa6d9a5a367cd8662) Thanks [@acao](https://github.com/acao)! - fix graphql exec extension, upgrade `graphql-config`, fix issue with graphql-config cosmiconfig typescript config loader.\n\n## 0.1.3\n\n### Patch Changes\n\n- [#2805](https://github.com/graphql/graphiql/pull/2805) [`e93a1484`](https://github.com/graphql/graphiql/commit/e93a1484683dc4011eb1c80f29c86ae12ba56b9f) Thanks [@acao](https://github.com/acao)! - ensure all node_modules resolve for exec extension with nohoist\n\n## 0.1.2\n\n### Patch Changes\n\n- [#2802](https://github.com/graphql/graphiql/pull/2802) [`d291b768`](https://github.com/graphql/graphiql/commit/d291b768203e59bb80ec5312563fdc16bd16aeae) Thanks [@acao](https://github.com/acao)! - fix bug with vscode-graphql-execution\n\n## 0.1.1\n\n### Patch Changes\n\n- [#2665](https://github.com/graphql/graphiql/pull/2665) [`324fbedb`](https://github.com/graphql/graphiql/commit/324fbedb96839cff105a28fce4be0757044ba5a9) Thanks [@acao](https://github.com/acao)! - Port the inline query execution capability from the original `vscode-graphql` repository as promised. More improvements to come!\n"
  },
  {
    "path": "packages/vscode-graphql-execution/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/vscode-graphql-execution/README.md",
    "content": "## `graphql.vscode-graphql-execution`\n\nThis extension provides standalone support for executing graphql operations\ninline in your code for:\n\n- .ts/.tsx\n- .js/.jsx\n- .graphql, .gql or .graphqls files\n\n## How it works\n\n1. A codelens will appear above all operations - clicking will begin executing\n   the operation.\n2. (If variables are specified in the operation), a dialog will prompt for these\n   variables\n3. Then, the results or network error should appear, voilà!\n4. If no endpoints are configured, it will exit early and tell you to define\n   them.\n\n## Configuring the extension\n\n### `graphql-config`\n\nYour graphql config file will need to contain either a schema-as-url OR an\nendpoints configuration. Either of the following are valid:\n\n```yaml\nschema: https://localhost:3000/graphql\n```\n\n```yaml\nschema: schema.graphql\nextensions:\n  endpoints:\n    default:\n      url: 'https://localhost:3000/graphql'\n```\n\n```yaml\nprojects:\n  app:\n    schema: schema.graphql\n    extensions:\n      endpoints:\n        default:\n          url: 'https://localhost:3000/graphql'\n```\n\n### Disable codelens\n\nTo disable the codelens, please specify this setting in `settings.json` or\n`user.json`:\n\n```json\n{\n  ...\n \"vscode-graphql-execution.showExecCodelens\": false\n}\n```\n\n### Self Signed Certificates\n\nEnable this (`false` by default) to allow node to use non-authorized SSL\ncertificates.\n\n```json\n{\n  \"vscode-graphql-execution.rejectUnauthorized\": true\n}\n```\n"
  },
  {
    "path": "packages/vscode-graphql-execution/esbuild.js",
    "content": "const { build } = require('esbuild');\nconst [, , arg] = process.argv;\n\nconst logger = console;\n\nconst isWatchMode = arg === '--watch';\n\nbuild({\n  entryPoints: ['src/extension.ts'],\n  bundle: true,\n  minify: arg === '--minify',\n  platform: 'node',\n  outdir: 'out/',\n  external: [\n    'squirrelly',\n    'teacup',\n    'coffee-script',\n    'marko',\n    'slm',\n    'vash',\n    'plates',\n    'babel-core',\n    'htmling',\n    'ractive',\n    'mote',\n    'eco',\n    'jqtpl',\n    'hamljs',\n    'jazz',\n    'hamlet',\n    'whiskers',\n    'haml-coffee',\n    'hogan.js',\n    'templayed',\n    'walrus',\n    'mustache',\n    'just',\n    'ect',\n    'toffee',\n    'twing',\n    'dot',\n    'bracket-template',\n    'vscode',\n    'velocityjs',\n    'dustjs-linkedin',\n    'atpl',\n    'liquor',\n    'twig',\n  ],\n  format: 'cjs',\n  sourcemap: true,\n  define: { 'import.meta.url': '_importMetaUrl' },\n  banner: {\n    js: \"const _importMetaUrl=require('url').pathToFileURL(__filename)\",\n  },\n})\n  .then(({ errors, warnings }) => {\n    if (warnings.length) {\n      logger.warn(...warnings);\n    }\n    if (errors.length) {\n      logger.error(...errors);\n    }\n\n    logger.log('successfully bundled vscode-graphql-execution 🚀');\n\n    if (isWatchMode) {\n      logger.log('watching... 🕰');\n    } else {\n      process.exit();\n    }\n  })\n  .catch(err => {\n    logger.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "packages/vscode-graphql-execution/package.json",
    "content": "{\n  \"name\": \"vscode-graphql-execution\",\n  \"version\": \"0.3.2\",\n  \"displayName\": \"GraphQL: Inline Operation Execution\",\n  \"description\": \"Execute graphql operations from your code (revived!)\",\n  \"publisher\": \"GraphQL\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"engines\": {\n    \"vscode\": \"^1.63.0\"\n  },\n  \"main\": \"./out/extension.js\",\n  \"icon\": \"assets/images/logo.png\",\n  \"contributors\": [\n    {\n      \"name\": \"Divyendu Singh\",\n      \"url\": \"https://www.divyendusingh.com/\"\n    }\n  ],\n  \"galleryBanner\": {\n    \"color\": \"#032539\",\n    \"theme\": \"dark\"\n  },\n  \"categories\": [\n    \"Programming Languages\"\n  ],\n  \"activationEvents\": [\n    \"onCommand:vscode-graphql-execution.contentProvider.isDebugging\",\n    \"onCommand:vscode-graphql-execution.contentProvidergit.contentProvider\",\n    \"workspaceContains:**/.graphqlrc\",\n    \"workspaceContains:**/.graphqlrc.{json,yaml,yml,js,ts,toml}\",\n    \"workspaceContains:**/graphql.config.{json,yaml,yml,js,ts,toml}\",\n    \"workspaceContains:**/package.json\"\n  ],\n  \"contributes\": {\n    \"commands\": [\n      {\n        \"command\": \"vscode-graphql-execution.isDebugging\",\n        \"title\": \"GraphQL Exec: Is Debugging?\"\n      },\n      {\n        \"command\": \"vscode-graphql-execution.showOutputChannel\",\n        \"title\": \"GraphQL Exec: Show output channel\"\n      },\n      {\n        \"command\": \"vscode-graphql-execution.contentProvider\",\n        \"title\": \"GraphQL Exec: Execute GraphQL Operations\"\n      }\n    ],\n    \"configuration\": {\n      \"title\": \"VSCode GraphQL: Inline Operation Execution\",\n      \"properties\": {\n        \"vscode-graphql-execution.debug\": {\n          \"type\": [\n            \"boolean\",\n            \"null\"\n          ],\n          \"default\": false,\n          \"description\": \"Enable debug logs\"\n        },\n        \"vscode-graphql-execution.showExecCodelens\": {\n          \"type\": [\n            \"boolean\"\n          ],\n          \"description\": \"Show codelens to execute operations inline\",\n          \"default\": true\n        },\n        \"vscode-graphql-execution.rejectUnauthorized\": {\n          \"type\": [\n            \"boolean\"\n          ],\n          \"description\": \"Fail the request on invalid certificate\",\n          \"default\": true\n        }\n      }\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/vscode-graphql-execution\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-execution/README.md\",\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"compile\": \"node esbuild.js\",\n    \"build-bundles\": \"yarn run compile\",\n    \"vsce:package\": \"yarn compile && vsce package --yarn\",\n    \"vsce:prepublish\": \"yarn run vsce:package\",\n    \"vsce:publish\": \"vsce publish --yarn\",\n    \"open-vsx:publish\": \"ovsx publish $(ls -1 *.vsix | sort -V | tail -n 1) --pat $OVSX_PAT\",\n    \"release\": \"yarn run compile && yarn run vsce:publish && yarn run open-vsx:publish\"\n  },\n  \"devDependencies\": {\n    \"@types/capitalize\": \"2.0.0\",\n    \"@types/dotenv\": \"8.2.0\",\n    \"@types/mocha\": \"5.2.7\",\n    \"@types/node\": \"^16.18.4\",\n    \"@types/vscode\": \"1.62.0\",\n    \"@types/ws\": \"8.2.2\",\n    \"@vscode/vsce\": \"^2.22.1-2\",\n    \"esbuild\": \"0.18.10\",\n    \"ovsx\": \"0.8.3\"\n  },\n  \"dependencies\": {\n    \"@graphql-tools/code-file-loader\": \"8.0.3\",\n    \"@urql/core\": \"2.6.1\",\n    \"@whatwg-node/fetch\": \"0.2.8\",\n    \"capitalize\": \"2.0.4\",\n    \"cosmiconfig\": \"8.2.0\",\n    \"cosmiconfig-toml-loader\": \"^1.0.0\",\n    \"dotenv\": \"10.0.0\",\n    \"graphql\": \"^16.9.0 || ^17.0.0-alpha.2\",\n    \"graphql-config\": \"5.0.3\",\n    \"graphql-tag\": \"2.12.6\",\n    \"graphql-ws\": \"5.10.0\",\n    \"nullthrows\": \"1.1.1\",\n    \"svelte\": \"^4.2.19\",\n    \"svelte2tsx\": \"^0.6.16\",\n    \"ws\": \"8.17.1\"\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-execution/src/extension.ts",
    "content": "import {\n  workspace,\n  ExtensionContext,\n  window,\n  commands,\n  OutputChannel,\n  languages,\n  Uri,\n  ViewColumn,\n} from 'vscode';\n\nimport { GraphQLContentProvider } from './providers/exec-content';\nimport { GraphQLCodeLensProvider } from './providers/exec-codelens';\nimport { ExtractedTemplateLiteral } from './helpers/source';\n\nfunction getConfig() {\n  return workspace.getConfiguration(\n    'vscode-graphql-execution',\n    window.activeTextEditor?.document.uri,\n  );\n}\n\nexport function activate(context: ExtensionContext) {\n  const outputChannel: OutputChannel = window.createOutputChannel(\n    'GraphQL Operation Execution',\n  );\n  const config = getConfig();\n\n  if (config.debug) {\n    // eslint-disable-next-line no-console\n    console.log('Extension \"vscode-graphql-execution\" is now active!');\n  }\n\n  const commandShowOutputChannel = commands.registerCommand(\n    'vscode-graphql-execution.showOutputChannel',\n    () => {\n      outputChannel.show();\n    },\n  );\n  context.subscriptions.push(commandShowOutputChannel);\n\n  // const settings = workspace.getConfiguration(\"vscode-graphql-execution\")\n  // let provider: GraphQLCodeLensProvider;\n  const registerCodeLens = () => {\n    context.subscriptions.push(\n      languages.registerCodeLensProvider(\n        [\n          'javascript',\n          'typescript',\n          'javascriptreact',\n          'typescriptreact',\n          'graphql',\n        ],\n        new GraphQLCodeLensProvider(outputChannel),\n      ),\n    );\n  };\n\n  // if (settings.showExecCodelens !== false) {\n  registerCodeLens();\n  // }\n\n  let commandContentProvider: GraphQLContentProvider;\n\n  const registerContentProvider = () => {\n    return commands.registerCommand(\n      'vscode-graphql-execution.contentProvider',\n      (literal: ExtractedTemplateLiteral) => {\n        const uri = Uri.parse('graphql://authority/graphql');\n\n        const panel = window.createWebviewPanel(\n          'vscode-graphql-execution.results-preview',\n          'GraphQL Execution Result',\n          ViewColumn.Two,\n          {},\n        );\n\n        commandContentProvider = new GraphQLContentProvider(\n          uri,\n          outputChannel,\n          literal,\n          panel,\n        );\n        const registration = workspace.registerTextDocumentContentProvider(\n          'graphql',\n          commandContentProvider,\n        );\n        context.subscriptions.push(registration);\n        panel.webview.html = commandContentProvider.getCurrentHtml();\n      },\n    );\n  };\n\n  const provider = registerContentProvider();\n  context.subscriptions.push(provider);\n\n  // workspace.onDidChangeConfiguration(async () => {\n  //   // const newSettings = workspace.getConfiguration(\"vscode-graphql-execution\")\n  //   // if (newSettings.showExecCodeLens !== false) {\n  //     commandContentProvider.dispose()\n  //   // }\n  // });\n  workspace.onDidSaveTextDocument(async e => {\n    if (\n      e.fileName.includes('graphql.config') ||\n      e.fileName.includes('graphqlrc')\n    ) {\n      await commandContentProvider.loadConfig();\n    }\n  });\n}\n\nexport function deactivate() {\n  // eslint-disable-next-line no-console\n  console.log('Extension \"vscode-graphql-execution\" is now de-active!');\n} // documents: [\"./src/*.ts\"],\n"
  },
  {
    "path": "packages/vscode-graphql-execution/src/helpers/extensions.ts",
    "content": "import { CodeFileLoader } from '@graphql-tools/code-file-loader';\nimport { GraphQLExtensionDeclaration } from 'graphql-config';\n\nexport declare type WithList<T> = T | T[];\n\nexport interface Endpoint {\n  url: string;\n  headers?: Record<string, WithList<string>>;\n  introspect?: boolean;\n  subscription?: {\n    url: string;\n    // TODO: remove undefined in v5\n    connectionParams?: Record<string, string | undefined>;\n  };\n}\n\nexport type Endpoints = Record<string, Endpoint>;\n\nexport const EndpointsExtension: GraphQLExtensionDeclaration = () => {\n  return {\n    name: 'endpoints',\n  };\n};\n\nexport const LanguageServiceExecutionExtension: GraphQLExtensionDeclaration =\n  api => {\n    // For schema\n    api.loaders.schema.register(new CodeFileLoader());\n    // For documents\n    api.loaders.documents.register(new CodeFileLoader());\n\n    return { name: 'languageServiceExecution' };\n  };\n"
  },
  {
    "path": "packages/vscode-graphql-execution/src/helpers/network.ts",
    "content": "import { visit, OperationTypeNode, GraphQLError } from 'graphql';\nimport { gql } from 'graphql-tag';\nimport { fetch } from '@whatwg-node/fetch';\nimport { Agent } from 'node:https';\nimport * as ws from 'ws';\n// eslint-disable-next-line import-x/no-extraneous-dependencies\nimport { pipe, subscribe } from 'wonka';\n\nimport { Endpoint } from './extensions';\nimport { OutputChannel, workspace } from 'vscode';\nimport { GraphQLProjectConfig } from 'graphql-config';\nimport { createClient as createWSClient, OperationResult } from 'graphql-ws';\nimport {\n  CombinedError,\n  createClient,\n  defaultExchanges,\n  subscriptionExchange,\n} from '@urql/core';\n\nimport {\n  ExtractedTemplateLiteral,\n  SourceHelper,\n  getFragmentDependenciesForAST,\n} from './source';\n\nimport { UserVariables } from '../providers/exec-content';\n\nexport class NetworkHelper {\n  private outputChannel: OutputChannel;\n  private sourceHelper: SourceHelper;\n\n  constructor(outputChannel: OutputChannel, sourceHelper: SourceHelper) {\n    this.outputChannel = outputChannel;\n    this.sourceHelper = sourceHelper;\n  }\n\n  private buildClient({\n    operation,\n    endpoint,\n  }: // updateCallback,\n  {\n    operation: string;\n    endpoint: Endpoint;\n    updateCallback: (data: string, operation: string) => void;\n  }) {\n    const { rejectUnauthorized } = workspace.getConfiguration('vscode-graphql');\n    // this is a node specific setting that can allow requests against servers using self-signed certificates\n    // it is similar to passing the nodejs env variable flag, except configured on a per-request basis here\n    const agent = new Agent({ rejectUnauthorized });\n\n    const exchanges = [...defaultExchanges];\n    if (operation === 'subscription') {\n      const wsEndpointURL = endpoint.url.replace(/^http/, 'ws');\n      const wsClient = createWSClient({\n        url: wsEndpointURL,\n        connectionAckWaitTimeout: 3000,\n        webSocketImpl: ws,\n      });\n      exchanges.push(\n        subscriptionExchange({\n          forwardSubscription: op => ({\n            subscribe: sink => ({\n              unsubscribe: wsClient.subscribe(op, sink),\n            }),\n          }),\n        }),\n      );\n    }\n\n    return createClient({\n      url: endpoint.url,\n      fetch: global.fetch ?? fetch,\n      fetchOptions: {\n        headers: endpoint.headers as HeadersInit,\n        // this is an option that's only available in `node-fetch`, not in the standard fetch API\n        // @ts-expect-error\n        agent: new URL(endpoint.url).protocol === 'https:' ? agent : undefined,\n      },\n      exchanges,\n    });\n  }\n\n  buildSubscribeConsumer =\n    (cb: ExecuteOperationOptions['updateCallback'], operation: string) =>\n    (result: OperationResult) => {\n      const { errors, data, error } = result as {\n        error?: CombinedError;\n        errors?: GraphQLError[];\n        data?: unknown;\n      };\n      if (errors || data) {\n        cb(formatData(result), operation);\n      }\n      if (error) {\n        if (error.graphQLErrors && error.graphQLErrors.length > 0) {\n          cb(\n            JSON.stringify({ errors: error.graphQLErrors }, null, 2),\n            operation,\n          );\n        }\n        if (error.networkError) {\n          cb(error.networkError.toString(), operation);\n        }\n      }\n    };\n\n  async executeOperation({\n    endpoint,\n    literal,\n    variables,\n    updateCallback,\n    projectConfig,\n  }: ExecuteOperationOptions) {\n    const operationTypes: OperationTypeNode[] = [];\n\n    visit(literal.ast, {\n      OperationDefinition(node) {\n        operationTypes.push(node.operation);\n      },\n    });\n    const fragmentDefinitions =\n      await this.sourceHelper.getFragmentDefinitions(projectConfig);\n\n    if (fragmentDefinitions) {\n      const fragmentInfos = await getFragmentDependenciesForAST(\n        literal.ast,\n        fragmentDefinitions,\n      );\n\n      for (const fragmentInfo of fragmentInfos) {\n        literal.content = fragmentInfo.content + '\\n' + literal.content;\n      }\n    }\n\n    const parsedOperation = gql`\n      ${literal.content}\n    `;\n    return Promise.all(\n      operationTypes.map(async operation => {\n        const subscriber = this.buildSubscribeConsumer(\n          updateCallback,\n          operation,\n        );\n        this.outputChannel.appendLine(`NetworkHelper: operation: ${operation}`);\n        this.outputChannel.appendLine(\n          `NetworkHelper: endpoint: ${endpoint.url}`,\n        );\n        try {\n          const urqlClient = this.buildClient({\n            operation,\n            endpoint,\n            updateCallback,\n          });\n          if (operation === 'subscription') {\n            pipe(\n              urqlClient.subscription(parsedOperation, variables),\n              subscribe(subscriber),\n            );\n          } else if (operation === 'query') {\n            pipe(\n              urqlClient.query(parsedOperation, variables),\n              subscribe(subscriber),\n            );\n          } else {\n            pipe(\n              urqlClient.mutation(parsedOperation, variables),\n              subscribe(subscriber),\n            );\n          }\n        } catch (err) {\n          this.outputChannel.appendLine(`error executing operation:\\n${err}`);\n        }\n      }),\n    );\n  }\n}\n\nexport interface ExecuteOperationOptions {\n  endpoint: Endpoint;\n  literal: ExtractedTemplateLiteral;\n  variables: UserVariables;\n  updateCallback: (data: string, operation: string) => void;\n  projectConfig: GraphQLProjectConfig;\n}\n\nfunction formatData({ data, errors }: any) {\n  return JSON.stringify({ data, errors }, null, 2);\n}\n"
  },
  {
    "path": "packages/vscode-graphql-execution/src/helpers/source.ts",
    "content": "import { Position, OutputChannel, TextDocument } from 'vscode';\nimport {\n  visit,\n  parse,\n  VariableDefinitionNode,\n  FragmentDefinitionNode,\n  NamedTypeNode,\n  ListTypeNode,\n  OperationDefinitionNode,\n  print,\n  ASTNode,\n  DocumentNode,\n} from 'graphql';\nimport { GraphQLProjectConfig } from 'graphql-config';\nimport nullthrows from 'nullthrows';\n\nexport type FragmentInfo = {\n  filePath?: string;\n  content: string;\n  definition: FragmentDefinitionNode;\n};\n\nexport class SourceHelper {\n  private outputChannel: OutputChannel;\n  private fragmentDefinitions: Map<string, FragmentInfo>;\n\n  constructor(outputChannel: OutputChannel) {\n    this.outputChannel = outputChannel;\n    this.fragmentDefinitions = new Map();\n  }\n\n  getTypeForVariableDefinitionNode(\n    node: VariableDefinitionNode,\n  ): GraphQLScalarType {\n    let namedTypeNode: NamedTypeNode | null = null;\n    let isList = false;\n    visit(node, {\n      ListType(_listNode: ListTypeNode) {\n        isList = true;\n      },\n      NamedType(namedNode: NamedTypeNode) {\n        namedTypeNode = namedNode;\n      },\n    });\n    if (isList) {\n      // TODO: This is not a name.value but a custom type that might confuse future programmers\n      return 'ListNode';\n    }\n    if (namedTypeNode) {\n      // TODO: Handle this for object types/ enums/ custom scalars\n      return (namedTypeNode as NamedTypeNode).name.value;\n    }\n    // TODO: Is handling all via string a correct fallback?\n    return 'String';\n  }\n\n  validate(value: string, type: GraphQLScalarType) {\n    try {\n      switch (type) {\n        case 'Int':\n          if (parseInt(value, 10)) {\n            return null;\n          }\n          break;\n        case 'Float':\n          if (parseFloat(value)) {\n            return null;\n          }\n          break;\n        case 'Boolean':\n          if (value === 'true' || value === 'false') {\n            return null;\n          }\n          break;\n        case 'String':\n        case 'ID':\n        case 'Enum':\n          if (value.length && !Array.isArray(value)) {\n            return null;\n          }\n          break;\n        default:\n          try {\n            JSON.parse(value);\n            return null;\n          } catch {\n            return;\n          }\n      }\n    } catch {\n      return `${value} is not a valid ${type}`;\n    }\n    return `${value} is not a valid ${type}`;\n  }\n\n  typeCast(value: string, type: GraphQLScalarType) {\n    if (type === 'Int') {\n      return parseInt(value, 10);\n    }\n    if (type === 'Float') {\n      return parseFloat(value);\n    }\n    if (type === 'Boolean') {\n      return Boolean(value);\n    }\n    if (type === 'String' || type === 'ID' || type === 'Enum') {\n      return value;\n    }\n\n    // TODO: Does this note need to have an impact?\n    // NOTE:\n    // -- We don't do anything for non-nulls - the backend will throw a meaningful error\n    // -- We treat custom types and lists similarly - as JSON - tedious for user to provide JSON but it works\n    // -- We treat enums as string and that fits\n\n    // Object type\n    try {\n      return JSON.parse(value);\n    } catch {\n      this.outputChannel.appendLine(\n        'Failed to parse user input as JSON, please use double quotes.',\n      );\n      return value;\n    }\n  }\n\n  async getFragmentDefinitions(\n    projectConfig: GraphQLProjectConfig,\n  ): Promise<Map<string, FragmentInfo> | void> {\n    try {\n      const sources = await projectConfig.getDocuments();\n      const { fragmentDefinitions } = this;\n      for (const source of sources) {\n        if (!source.document) {\n          continue;\n        }\n        visit(source.document, {\n          FragmentDefinition(node) {\n            const existingDef = fragmentDefinitions.get(node.name.value);\n            const newVal = print(node);\n            if (\n              (existingDef && existingDef.content !== newVal) ||\n              !existingDef\n            ) {\n              fragmentDefinitions.set(node.name.value, {\n                definition: node,\n                content: newVal,\n                filePath: source.location,\n              });\n            }\n          },\n        });\n      }\n      return fragmentDefinitions;\n    } catch (err) {\n      this.outputChannel.append(`${err}`);\n    }\n  }\n\n  extractAllTemplateLiterals(\n    document: TextDocument,\n    tags: string[] = ['gql'],\n  ): ExtractedTemplateLiteral[] {\n    const text = document.getText();\n    const documents: ExtractedTemplateLiteral[] = [];\n\n    if (document.languageId === 'graphql') {\n      try {\n        const documentText = document.getText();\n        processGraphQLString(documentText, 0);\n        return documents;\n      } catch {}\n    }\n\n    for (const tag of tags) {\n      // https://regex101.com/r/Pd5PaU/2\n      const regExpGQL = new RegExp(tag + '\\\\s*`([\\\\s\\\\S]+?)`', 'mg');\n\n      let result: RegExpExecArray | null;\n      while ((result = regExpGQL.exec(text)) !== null) {\n        const contents = result[1];\n\n        // https://regex101.com/r/KFMXFg/2\n        if (contents.match('/${(.+)?}/g')) {\n          // We are ignoring operations with template variables for now\n          continue;\n        }\n        try {\n          processGraphQLString(contents, result.index + tag.length + 1);\n          // no-op on exception, so that non-parse-able source files\n          // don't break the extension while editing\n        } catch {}\n      }\n    }\n    return documents;\n\n    function processGraphQLString(textString: string, offset: number) {\n      const ast = parse(textString);\n      const operations = ast.definitions.filter(\n        def => def.kind === 'OperationDefinition',\n      );\n      for (const operation of operations) {\n        const op = operation as any;\n        const filteredAst = {\n          ...ast,\n          definitions: ast.definitions.filter(def => {\n            if (def.kind === 'OperationDefinition' && def !== op) {\n              return false;\n            }\n            return true;\n          }),\n        };\n        documents.push({\n          content: print(filteredAst),\n          uri: document.uri.path,\n          position: document.positionAt(op.loc.start + offset),\n          definition: op,\n          ast: filteredAst,\n        });\n      }\n      // no-op, so that non-parse-able source files\n      // don't break the extension while editing\n    }\n  }\n}\n\nexport type GraphQLScalarType = 'String' | 'Float' | 'Int' | 'Boolean' | string;\nexport type GraphQLScalarTSType = string | number | boolean;\n\nexport interface ExtractedTemplateLiteral {\n  content: string;\n  uri: string;\n  position: Position;\n  ast: DocumentNode;\n  definition: OperationDefinitionNode;\n}\n\nexport const getFragmentDependencies = async (\n  query: string,\n  fragmentDefinitions?: Map<string, FragmentInfo> | null,\n): Promise<FragmentInfo[]> => {\n  // If there isn't context for fragment references,\n  // return an empty array.\n  if (!fragmentDefinitions) {\n    return [];\n  }\n  // If the query cannot be parsed, validations cannot happen yet.\n  // Return an empty array.\n  let parsedQuery;\n  try {\n    parsedQuery = parse(query);\n  } catch {\n    return [];\n  }\n  return getFragmentDependenciesForAST(parsedQuery, fragmentDefinitions);\n};\n\nexport const getFragmentDependenciesForAST = async (\n  parsedQuery: ASTNode,\n  fragmentDefinitions: Map<string, FragmentInfo>,\n): Promise<FragmentInfo[]> => {\n  if (!fragmentDefinitions) {\n    return [];\n  }\n\n  const existingFrags = new Map();\n  const referencedFragNames = new Set<string>();\n\n  visit(parsedQuery, {\n    FragmentDefinition(node) {\n      existingFrags.set(node.name.value, true);\n    },\n    FragmentSpread(node) {\n      if (!referencedFragNames.has(node.name.value)) {\n        referencedFragNames.add(node.name.value);\n      }\n    },\n  });\n\n  const asts = new Set<FragmentInfo>();\n  for (const name of referencedFragNames) {\n    if (!existingFrags.has(name) && fragmentDefinitions.has(name)) {\n      asts.add(nullthrows(fragmentDefinitions.get(name)));\n    }\n  }\n\n  const referencedFragments: FragmentInfo[] = [];\n\n  for (const ast of asts) {\n    visit(ast.definition, {\n      FragmentSpread(node) {\n        if (\n          !referencedFragNames.has(node.name.value) &&\n          fragmentDefinitions.get(node.name.value)\n        ) {\n          asts.add(nullthrows(fragmentDefinitions.get(node.name.value)));\n          referencedFragNames.add(node.name.value);\n        }\n      },\n    });\n    if (!existingFrags.has(ast.definition.name.value)) {\n      referencedFragments.push(ast);\n    }\n  }\n\n  return referencedFragments;\n};\n"
  },
  {
    "path": "packages/vscode-graphql-execution/src/providers/exec-codelens.ts",
    "content": "import {\n  OutputChannel,\n  CodeLensProvider,\n  TextDocument,\n  CancellationToken,\n  CodeLens,\n  Range,\n  Position,\n  ProviderResult,\n} from 'vscode';\n\nimport { SourceHelper, ExtractedTemplateLiteral } from '../helpers/source';\nimport capitalize from 'capitalize';\n\nexport class GraphQLCodeLensProvider implements CodeLensProvider {\n  outputChannel: OutputChannel;\n  sourceHelper: SourceHelper;\n\n  constructor(outputChannel: OutputChannel) {\n    this.outputChannel = outputChannel;\n    this.sourceHelper = new SourceHelper(this.outputChannel);\n  }\n\n  public provideCodeLenses(\n    document: TextDocument,\n    _token: CancellationToken,\n    // for some reason, ProviderResult<CodeLens[]> doesn't work here\n    // anymore after upgrading types\n  ): ProviderResult<[]> {\n    const literals: ExtractedTemplateLiteral[] =\n      this.sourceHelper.extractAllTemplateLiterals(document, [\n        'gql',\n        'graphql',\n        '/\\\\* GraphQL \\\\*/',\n      ]);\n    const results = literals.map(literal => {\n      return new CodeLens(\n        new Range(\n          new Position(literal.position.line, 0),\n          new Position(literal.position.line, 0),\n        ),\n        {\n          title: `Execute ${capitalize(literal.definition.operation)}`,\n          command: 'vscode-graphql-execution.contentProvider',\n          arguments: [literal],\n        },\n      );\n    });\n\n    return results as ProviderResult<[]>;\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-execution/src/providers/exec-content.ts",
    "content": "import {\n  workspace,\n  OutputChannel,\n  TextDocumentContentProvider,\n  EventEmitter,\n  Uri,\n  Event,\n  ProviderResult,\n  window,\n  WebviewPanel,\n  WorkspaceFolder,\n} from 'vscode';\nimport { loadConfig, GraphQLProjectConfig } from 'graphql-config';\nimport { visit, VariableDefinitionNode } from 'graphql';\nimport { NetworkHelper } from '../helpers/network';\nimport { SourceHelper, GraphQLScalarTSType } from '../helpers/source';\nimport {\n  LanguageServiceExecutionExtension,\n  EndpointsExtension,\n} from '../helpers/extensions';\n\nimport type { Endpoint, Endpoints } from '../helpers/extensions';\nimport type { ExtractedTemplateLiteral } from '../helpers/source';\n\nexport type UserVariables = { [key: string]: GraphQLScalarTSType };\n\n// TODO: remove residue of previewHtml API https://github.com/microsoft/vscode/issues/62630\n// We update the panel directly now in place of a event based update API (we might make a custom event updater and remove panel dep though)\nexport class GraphQLContentProvider implements TextDocumentContentProvider {\n  private uri: Uri;\n  private outputChannel: OutputChannel;\n  private networkHelper: NetworkHelper;\n  private sourceHelper: SourceHelper;\n  private panel: WebviewPanel;\n  private rootDir: WorkspaceFolder | undefined;\n  private literal: ExtractedTemplateLiteral;\n  private _projectConfig: GraphQLProjectConfig | undefined;\n\n  // Event emitter which invokes document updates\n  private _onDidChange = new EventEmitter<Uri>();\n\n  private html = ''; // HTML document buffer\n\n  timeout = (ms: number) => new Promise(res => setTimeout(res, ms));\n\n  getCurrentHtml(): string {\n    return this.html;\n  }\n\n  updatePanel() {\n    this.panel.webview.html = this.html;\n  }\n\n  async getVariablesFromUser(\n    variableDefinitionNodes: VariableDefinitionNode[],\n  ): Promise<UserVariables> {\n    await this.timeout(500);\n    let variables = {};\n    for await (const node of variableDefinitionNodes) {\n      const variableType =\n        this.sourceHelper.getTypeForVariableDefinitionNode(node);\n      variables = {\n        ...variables,\n        [node.variable.name.value]: this.sourceHelper.typeCast(\n          (await window.showInputBox({\n            ignoreFocusOut: true,\n            placeHolder: `Please enter the value for ${node.variable.name.value}`,\n            validateInput: (value: string) =>\n              this.sourceHelper.validate(value, variableType),\n          }))!,\n          variableType,\n        ),\n      };\n    }\n    return variables;\n  }\n\n  async getEndpointName(endpointNames: string[]) {\n    // Endpoints extensions docs say that at least \"default\" will be there\n    let [endpointName] = endpointNames;\n    if (endpointNames.length > 1) {\n      const pickedValue = await window.showQuickPick(endpointNames, {\n        canPickMany: false,\n        ignoreFocusOut: true,\n        placeHolder: 'Select an endpoint',\n      });\n\n      if (pickedValue) {\n        endpointName = pickedValue;\n      }\n    }\n    return endpointName;\n  }\n\n  constructor(\n    uri: Uri,\n    outputChannel: OutputChannel,\n    literal: ExtractedTemplateLiteral,\n    panel: WebviewPanel,\n  ) {\n    this.uri = uri;\n    this.outputChannel = outputChannel;\n    this.sourceHelper = new SourceHelper(this.outputChannel);\n    this.networkHelper = new NetworkHelper(\n      this.outputChannel,\n      this.sourceHelper,\n    );\n    this.panel = panel;\n    this.rootDir = workspace.getWorkspaceFolder(Uri.file(literal.uri));\n    this.literal = literal;\n    this.panel.webview.options = {\n      enableScripts: true,\n    };\n    this.loadProvider().catch(err => {\n      this.html = err.toString();\n    });\n  }\n\n  validUrlFromSchema(pathOrUrl: string) {\n    return /^https?:\\/\\//.test(pathOrUrl);\n  }\n\n  reportError(message: string) {\n    this.outputChannel.appendLine(message);\n    this.setContentAndUpdate(message);\n  }\n\n  setContentAndUpdate(html: string) {\n    this.html = html;\n    this.update(this.uri);\n    this.updatePanel();\n  }\n\n  async loadEndpoint(): Promise<Endpoint | null> {\n    let endpoints: Endpoints = this._projectConfig?.extensions?.endpoints;\n\n    if (!endpoints) {\n      endpoints = {\n        default: { url: '' },\n      } as Endpoints;\n\n      this.update(this.uri);\n      this.updatePanel();\n      if (this._projectConfig?.schema) {\n        this.outputChannel.appendLine(\n          \"Warning: endpoints missing from graphql config. will try 'schema' value(s) instead\",\n        );\n        const { schema } = this._projectConfig;\n        if (schema && Array.isArray(schema)) {\n          for (const s of schema) {\n            if (this.validUrlFromSchema(s as string)) {\n              endpoints.default.url = s.toString();\n            }\n          }\n        } else if (schema && this.validUrlFromSchema(schema as string)) {\n          endpoints.default.url = schema.toString();\n        }\n      } else if (endpoints?.default?.url) {\n        this.outputChannel.appendLine(\n          `Warning: No Endpoints configured. Attempting to execute operation with 'config.schema' value '${endpoints.default.url}'`,\n        );\n      } else {\n        this.reportError(\n          'Warning: No Endpoints configured. Config schema contains no URLs',\n        );\n        return null;\n      }\n    }\n    const endpointNames = Object.keys(endpoints);\n\n    if (endpointNames.length === 0) {\n      this.reportError(\n        'Error: endpoint data missing from graphql config endpoints extension',\n      );\n      return null;\n    }\n    const endpointName = await this.getEndpointName(endpointNames);\n    return endpoints[endpointName] || endpoints.default;\n  }\n\n  async loadProvider() {\n    try {\n      const rootDir = workspace.getWorkspaceFolder(Uri.file(this.literal.uri));\n      if (!rootDir) {\n        this.reportError('Error: this file is outside the workspace.');\n        return;\n      }\n\n      await this.loadConfig();\n      const projectConfig = this._projectConfig;\n\n      if (!projectConfig) {\n        return;\n      }\n\n      const endpoint = await this.loadEndpoint();\n      if (endpoint?.url) {\n        const variableDefinitionNodes: VariableDefinitionNode[] = [];\n        visit(this.literal.ast, {\n          VariableDefinition(node: VariableDefinitionNode) {\n            variableDefinitionNodes.push(node);\n          },\n        });\n\n        const updateCallback = (data: string, operation: string) => {\n          if (operation === 'subscription') {\n            this.html = `<pre>${data}</pre>` + this.html;\n          } else {\n            this.html += `<pre>${data}</pre>`;\n          }\n          this.update(this.uri);\n          this.updatePanel();\n        };\n\n        if (variableDefinitionNodes.length > 0) {\n          const variables = await this.getVariablesFromUser(\n            variableDefinitionNodes,\n          );\n\n          await this.networkHelper.executeOperation({\n            endpoint,\n            literal: this.literal,\n            variables,\n            updateCallback,\n            projectConfig,\n          });\n        } else {\n          await this.networkHelper.executeOperation({\n            endpoint,\n            literal: this.literal,\n            variables: {},\n            updateCallback,\n            projectConfig,\n          });\n        }\n      } else {\n        this.reportError('Error: no endpoint url provided');\n        return;\n      }\n    } catch (err: unknown) {\n      // @ts-expect-error\n      this.reportError(`Error: graphql operation failed\\n ${err.toString()}`);\n      return;\n    }\n  }\n\n  async loadConfig() {\n    const { rootDir, literal } = this;\n    if (!rootDir) {\n      this.reportError('Error: this file is outside the workspace.');\n      return;\n    }\n\n    const config = await loadConfig({\n      rootDir: rootDir.uri.fsPath,\n      throwOnEmpty: false,\n      throwOnMissing: false,\n      legacy: true,\n      extensions: [LanguageServiceExecutionExtension, EndpointsExtension],\n    });\n    this._projectConfig = config?.getProjectForFile(literal.uri);\n\n    // eslint-disable-next-line unicorn/consistent-destructuring\n    if (!this._projectConfig?.schema) {\n      this.reportError('Error: schema from graphql config');\n    }\n  }\n\n  get onDidChange(): Event<Uri> {\n    return this._onDidChange.event;\n  }\n\n  public update(uri: Uri) {\n    this._onDidChange.fire(uri);\n  }\n\n  provideTextDocumentContent(_: Uri): ProviderResult<string> {\n    return this.html;\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-execution/tsconfig.json",
    "content": "{\n  \"extends\": \"../../resources/tsconfig.base.esm.json\",\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"CommonJS\",\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./dist\"\n  },\n  \"references\": [\n    {\n      \"path\": \"../graphql-language-service\"\n    },\n    {\n      \"path\": \"../graphql-language-service-server\"\n    }\n  ],\n  \"include\": [\"src\"],\n  \"exclude\": [\"**/__tests__/**\", \"**/*.spec.*\"]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/.vscodeignore",
    "content": "node_modules\n**/.browserslistrc/**\ntests"
  },
  {
    "path": "packages/vscode-graphql-syntax/CHANGELOG.md",
    "content": "# vscode-graphql-syntax\n\n## 1.3.8\n\n### Patch Changes\n\n- [#3792](https://github.com/graphql/graphiql/pull/3792) [`40da77b`](https://github.com/graphql/graphiql/commit/40da77b32b35d33b5ebf883b60a6020de8d3be6c) Thanks [@idosela](https://github.com/idosela)! - Add syntax highlighting support for the repeatable keyword on a directive definition.\n\n## 1.3.7\n\n### Patch Changes\n\n- [#3773](https://github.com/graphql/graphiql/pull/3773) [`31edfab`](https://github.com/graphql/graphiql/commit/31edfab441304d8eb3358acebc475c51e5646e8b) Thanks [@yaacovCR](https://github.com/yaacovCR)! - use latest stable version of graphql 16.9.0 for bundled libraries & tests\n\n## 1.3.6\n\n### Patch Changes\n\n- [#3592](https://github.com/graphql/graphiql/pull/3592) [`5e521080`](https://github.com/graphql/graphiql/commit/5e52108038d8d5e97f8d21a9c22bb9048fa377f0) Thanks [@acao](https://github.com/acao)! - Remove ruby support for code highlighting, users should use `ruby-lsp` for graphql highlighting instead!\n\n## 1.3.5\n\n### Patch Changes\n\n- [#3545](https://github.com/graphql/graphiql/pull/3545) [`e9fc21ab`](https://github.com/graphql/graphiql/commit/e9fc21ab5f403a3e26cec555b29e5fb9db436838) Thanks [@kitten](https://github.com/kitten)! - Fix TextMate grammar to support string literals that don’t immediately follow a function call's left-parenthesis (`(`).\n\n## 1.3.4\n\n### Patch Changes\n\n- [#3543](https://github.com/graphql/graphiql/pull/3543) [`defc126b`](https://github.com/graphql/graphiql/commit/defc126b107961d7a4ba093b35b1d77bb7018a79) Thanks [@acao](https://github.com/acao)! - Temporarily revert a syntax highlighting bugfix that caused more bugs\n\n## 1.3.3\n\n### Patch Changes\n\n- [#3518](https://github.com/graphql/graphiql/pull/3518) [`e502c41e`](https://github.com/graphql/graphiql/commit/e502c41e68440e7331cfc74d8c78fd092f3354a8) Thanks [@kitten](https://github.com/kitten)! - Fix TextMate grammar to support string literals that don’t immediately follow a function call's left-parenthesis (`(`).\n\n## 1.3.2\n\n### Patch Changes\n\n- [#3529](https://github.com/graphql/graphiql/pull/3529) [`a38152ef`](https://github.com/graphql/graphiql/commit/a38152ef1248a480d5cad384780f82214a84f16d) Thanks [@acao](https://github.com/acao)! - fix triple double quote comment syntax by disabling inline double quote js strings for now\n\n## 1.3.1\n\n### Patch Changes\n\n- [#3519](https://github.com/graphql/graphiql/pull/3519) [`8188e3e6`](https://github.com/graphql/graphiql/commit/8188e3e6fd979bcf2fbdf9568deb0c88d0df99e2) Thanks [@acao](https://github.com/acao)! - bump ovsx\n\n## 1.3.0\n\n### Minor Changes\n\n- [#3475](https://github.com/graphql/graphiql/pull/3475) [`98af5307`](https://github.com/graphql/graphiql/commit/98af53071bb27afc0afc82d66f539c1ac08315b3) Thanks [@XiNiHa](https://github.com/XiNiHa)! - Add Astro file support\n\n## 1.2.3\n\n### Patch Changes\n\n- [#3490](https://github.com/graphql/graphiql/pull/3490) [`334224b4`](https://github.com/graphql/graphiql/commit/334224b4502fda9fd77684da63cac00b8a7c1ee7) Thanks [@acao](https://github.com/acao)! - - add ruby syntax support\n\n  - add graphql syntax support in markdown codeblocks for js, ts, jsx, tsx, svelte, vue, ruby, rescript, reason, ocaml, php and python\n  - make textmate injectors more performant and specific, eliminate redundant config\n\n  Big thanks to [@RedCMD](https://github.com/RedCMD) and [@aeschli](https://github.com/aeschli) for your help!\n\n## 1.2.2\n\n### Patch Changes\n\n- [#3269](https://github.com/graphql/graphiql/pull/3269) [`2fb7f1f5`](https://github.com/graphql/graphiql/commit/2fb7f1f5d8a69a5de572b783de7801d5993f758a) Thanks [@acao](https://github.com/acao)! - fix ovsx release\n\n## 1.2.1\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n## 1.2.1-alpha.0\n\n### Patch Changes\n\n- [#3224](https://github.com/graphql/graphiql/pull/3224) [`5971d528`](https://github.com/graphql/graphiql/commit/5971d528b0608e76d9d109103f64857a790a99b9) Thanks [@acao](https://github.com/acao)! - try removing some packages from pre.json\n\n## 1.2.0\n\n### Minor Changes\n\n- [#3106](https://github.com/graphql/graphiql/pull/3106) [`40690901`](https://github.com/graphql/graphiql/commit/40690901603a678ad6aa8e38f63b14e6b53d315c) Thanks [@hugo-vrijswijk](https://github.com/hugo-vrijswijk)! - Add syntax highlighting in Scala\n\n### Patch Changes\n\n- [#3133](https://github.com/graphql/graphiql/pull/3133) [`a8f21ad3`](https://github.com/graphql/graphiql/commit/a8f21ad3cf1c2ead95fa2c95372d01bafff8fee9) Thanks [@acao](https://github.com/acao)! - ci: test formatting fix with a changeset\n\n## 1.1.0\n\n### Minor Changes\n\n- [#3019](https://github.com/graphql/graphiql/pull/3019) [`ae43add6`](https://github.com/graphql/graphiql/commit/ae43add68c39825580fc8fc63a0b4c55f9fb70ad) Thanks [@mjmahone](https://github.com/mjmahone)! - Adds syntax highlighting for arguments on fragment spreads as well as variable definitions on fragments.\n\n## 1.0.6\n\n### Patch Changes\n\n- [#2926](https://github.com/graphql/graphiql/pull/2926) [`10e97bbe`](https://github.com/graphql/graphiql/commit/10e97bbe6c9ff81bae73b11ba81ac2b69eca2772) Thanks [@elijaholmos](https://github.com/elijaholmos)! - support cts and mts file extensions\n\n## 1.0.5\n\n### Patch Changes\n\n- [#2849](https://github.com/graphql/graphiql/pull/2849) [`9b98c1b6`](https://github.com/graphql/graphiql/commit/9b98c1b63a184385d22a8457cfdfebf01387697f) Thanks [@acao](https://github.com/acao)! - docs typo bug - `/* GraphQL */` (not `/* GraphiQL */`) is the delimiter for `vscode-graphql-syntax` & `vscode-graphql` language support\n\n## 1.0.4\n\n### Patch Changes\n\n- [#2573](https://github.com/graphql/graphiql/pull/2573) [`a358ac1d`](https://github.com/graphql/graphiql/commit/a358ac1d00082643e124085bca09992adeef212a) Thanks [@acao](https://github.com/acao)! - ## Enhancement\n\n  Here we move vscode grammars and basic language support to a new [`GraphQL.vscode-graphql-syntax`](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql-syntax) extension. `GraphQL.vscode-graphql` now depends on this new syntax extension. This constitutes no breaking change for `vscode-graphql` users, as this extension will be installed automatically as an `extensionDependency` for `vscode-graphql`. Both extensions will now have independent release lifecycles, but vscode will keep them both up to date for you :)\n\n  Firstly, this allows users to only install the syntax highlighting extension if they don't need LSP server features.\n\n  Secondly, this subtle but important change allows alternative LSP servers and non-LSP graphql extensions to use (and contribute!) to our shared, graphql community syntax highlighting. In some ways, it acts as a shared tooling & annotation spec, though it is intended just for vscode, it perhaps can be used as a point of reference for others implementing (embedded) graphql syntax highlighting elsewhere!\n\n  If your language and/or library and/or framework would like vscode highlighting, come [join the party](https://github.com/graphql/graphiql/tree/main/packages/vscode-graphql-syntax#contributing)!\n\n  If you use relay, we would highly reccomend using the `relay-compiler lsp` extension for vscode [Relay Graphql](https://marketplace.visualstudio.com/items?itemName=meta.relay) (`meta.relay`). They will be [using the new standalone syntax extension](https://github.com/facebook/relay/pull/4032) very soon!\n\n  Even non-relay users may want to try this extension as an alternative to our reference implementation, as relay's configuration has relative similarity with `graphql-config`'s format, and doesn't necessitate the use of relay client afaik. We are working hard to optimize and improve `graphql-language-service-server` as a typescript reference implementation, and have some exciting features coming soon, however it's hard to offer more than a brand new & highly performant graphql LSP server written in Rust based on the latest graphql spec with a (mostly) paid team and dedicated open source ecosystem community of co-maintainers! And their implementation appears to allow you to opt out of any relay-specific conventions if you need more flexibility.\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 GraphQL Contributors\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.\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/README.md",
    "content": "# GraphQL Syntax Support\n\nAdds full GraphQL syntax highlighting and language support such as bracket\nmatching.\n\n- Supports `.graphql`/`.gql`/`.graphqls` highlighting\n- Javascript, Typescript & JSX/TSX (examples: [test.js](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.js) & [test.ts](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.ts))\n- Vue (examples: [test-sfc-comp.vue](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test-sfc-comp.vue) & [test-sfc.vue](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test-sfc.vue))\n- Svelte (example: [test.svelte](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.svelte))\n- ReasonML/ReScript (`%graphql()` ) (example: [test.re](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.re))\n- Python (example: [test.py](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.py))\n- PHP (example: [test.php](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.php))\n- Markdown (examples: [test.md](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.md) & [test-py.md](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test-py.md))\n- Scala (example: [test.scala](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/tests/__fixtures__/test.scala))\n\nYou'll want to install this if you do not use `graphql-config`, or want to use\nthe highlighting with other extensions than `vscode-graphql`\n\n## Contributing\n\nFeel free to open a PR to fix, enhance any language support, or even add new\nlanguages 😍\n\nsee:\n\n- [the grammars](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/grammars/)\n- [the applicable vscode docs](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide)\n\n### Contributor Guide: Improving a Language\n\nWhether fixing a bug or adding a new delimiter for your language, here are a few tips for you:\n\n1. TDD approach: add your bug case or new delimiter example to the relevant file in `tests/__fixtures__`\n1. run `yarn test -u` in the syntax extension workspace, and observe whether vscode-textmate tokenizes your example properly\n1. fix/update/add the relevant pattern, and repeat the above to see if the tokenization changes. you should see `meta.embedded.block.graphql`\n1. to test manually, run `yarn vsce:package` in the workspace and right click to install the bundled vsix extension, and open the fixture file\n\n<span id=\"adding-a-lang\"></span>\n\n### Contributor Guide: Adding a Language\n\n1.  add a file to [grammars](https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/grammars/) following our other examples.\n1.  be sure to add it to `package.json` contributions as well, in the `grammars` section. the `text.html.markdown` is for applying to markdown codeblocks\n1.  use a scope ala `source.{lang}` from a vscode-provided syntax grammar, or a popular, official contributed grammar. To find the name of the scope for any token's highlighting, use `Developer: Inspect Editor Tokens & Scopes` from the vscode command palette.\n1.  name it `inline.graphql.{lang}` for consistency\n1.  add a test file `tests/__fixture__` to document example usage, and a test spec to `__tests__` to assert the snapshot, pointing to the source you created\n1.  run `yarn test -u` in the workspace to add the snapshot\n1.  use the snapshots to ensure your capture groups are working and serializing the graphql as expected\n1.  in the test fixture, document all working cases and non working cases with Todo comments for common usage in your language. be sure to think of cases such as string interpolation and generics for typed languages.\n1.  add it to the list above in the readme, with links to your test fixtures as usage documentation\n1.  to manually test it in vscode itself, run `yarn vsce:package` in the syntax extension workspace and right click and install the bundled vsix file, then view the test fixture\n\n## Usage Note\n\nWe would love for the other graphql extension authors to freely use this syntax\nextension as well! Even if your extension is designed to replace\n`vscode-graphql`, or if it's designed for other other purposes. It uses an MIT\nlicense, but attribution is always a nice gesture to the original authors :)\n\n## License\n\nMIT License\n\nCopyright 2022 GraphQL Contributors\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.js.json",
    "content": "{\n  \"scopeName\": \"inline.graphql\",\n  \"injectionSelector\": \"L:(meta.embedded.block.javascript | meta.embedded.block.typescript | source.js | source.ts | source.tsx | source.vue | source.svelte | source.astro) -source.graphql -inline.graphql -string -comment\",\n  \"patterns\": [\n    {\n      \"begin\": \"\\\\s*+(?:(Relay)\\\\??\\\\.)(QL)|(gql|graphql|graphql\\\\.experimental)\\\\s*(?:<.*>)?\\\\s*\\\\(\",\n      \"end\": \"\\\\)\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"variable.other.class.js\"\n        },\n        \"2\": {\n          \"name\": \"entity.name.function.tagged-template.js\"\n        },\n        \"3\": {\n          \"name\": \"entity.name.function.tagged-template.js\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"contentName\": \"meta.embedded.block.graphql\",\n          \"begin\": \"(`|')\",\n          \"end\": \"(`|')\",\n          \"beginCaptures\": {\n            \"0\": {\n              \"name\": \"punctuation.definition.string.template.begin.js\"\n            }\n          },\n          \"endCaptures\": {\n            \"0\": {\n              \"name\": \"punctuation.definition.string.template.end.js\"\n            }\n          },\n          \"patterns\": [\n            {\n              \"include\": \"source.graphql\"\n            }\n          ]\n        },\n        {\n          \"patterns\": [\n            { \"include\": \"source.js\" },\n            { \"include\": \"source.ts\" },\n            { \"include\": \"source.js.jsx\" },\n            { \"include\": \"source.tsx\" }\n          ]\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"\\\\s*+(?:(?:(?:(Relay)\\\\??\\\\.)(QL)|(gql|graphql|graphql\\\\.experimental)\\\\s*(?:<.*>)?\\\\s*)|(/\\\\* GraphQL \\\\*/))\\\\s*(`|')\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"variable.other.class.js\"\n        },\n        \"2\": {\n          \"name\": \"entity.name.function.tagged-template.js\"\n        },\n        \"3\": {\n          \"name\": \"entity.name.function.tagged-template.js\"\n        },\n        \"4\": {\n          \"name\": \"comment.graphql.js\"\n        },\n        \"5\": {\n          \"name\": \"punctuation.definition.string.template.begin.js\"\n        }\n      },\n      \"end\": \"(`|')\",\n      \"endCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.definition.string.template.end.js\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"name\": \"taggedTemplates\",\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(`|')(#graphql)\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"punctuation.definition.string.template.begin.js\"\n        },\n        \"2\": {\n          \"name\": \"comment.line.graphql.js\"\n        }\n      },\n      \"end\": \"(`|')\",\n      \"endCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.definition.string.template.end.js\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.json",
    "content": "{\n  \"name\": \"GraphQL\",\n  \"scopeName\": \"source.graphql\",\n  \"fileTypes\": [\"graphql\", \"graphqls\", \"gql\", \"graphcool\"],\n  \"patterns\": [{ \"include\": \"#graphql\" }],\n  \"repository\": {\n    \"graphql\": {\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-fragment-definition\" },\n        { \"include\": \"#graphql-directive-definition\" },\n        { \"include\": \"#graphql-type-interface\" },\n        { \"include\": \"#graphql-enum\" },\n        { \"include\": \"#graphql-scalar\" },\n        { \"include\": \"#graphql-union\" },\n        { \"include\": \"#graphql-schema\" },\n        { \"include\": \"#graphql-operation-def\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-operation-def\": {\n      \"patterns\": [\n        { \"include\": \"#graphql-query-mutation\" },\n        { \"include\": \"#graphql-name\" },\n        { \"include\": \"#graphql-variable-definitions\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-selection-set\" }\n      ]\n    },\n    \"graphql-fragment-definition\": {\n      \"name\": \"meta.fragment.graphql\",\n      \"begin\": \"\\\\s*(?:(\\\\bfragment\\\\b)\\\\s*([_A-Za-z][_0-9A-Za-z]*)?)\",\n      \"end\": \"(?<=})\",\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.fragment.graphql\" },\n        \"2\": { \"name\": \"entity.name.fragment.graphql\" }\n      },\n      \"patterns\": [\n        {\n          \"match\": \"\\\\s*(?:(\\\\bon\\\\b)\\\\s*([_A-Za-z][_0-9A-Za-z]*))\",\n          \"captures\": {\n            \"1\": { \"name\": \"keyword.on.graphql\" },\n            \"2\": { \"name\": \"support.type.graphql\" }\n          }\n        },\n        { \"include\": \"#graphql-variable-definitions\" },\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-selection-set\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-skip-newlines\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-query-mutation\": {\n      \"match\": \"\\\\s*\\\\b(query|mutation)\\\\b\",\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.operation.graphql\" }\n      }\n    },\n    \"graphql-type-interface\": {\n      \"name\": \"meta.type.interface.graphql\",\n      \"begin\": \"\\\\s*\\\\b(?:(extends?)?\\\\b\\\\s*\\\\b(type)|(interface)|(input))\\\\b\\\\s*([_A-Za-z][_0-9A-Za-z]*)?\",\n      \"end\": \"(?=.)\",\n      \"applyEndPatternLast\": 1,\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.type.graphql\" },\n        \"2\": { \"name\": \"keyword.type.graphql\" },\n        \"3\": { \"name\": \"keyword.interface.graphql\" },\n        \"4\": { \"name\": \"keyword.input.graphql\" },\n        \"5\": { \"name\": \"support.type.graphql\" }\n      },\n      \"patterns\": [\n        {\n          \"begin\": \"\\\\s*\\\\b(implements)\\\\b\\\\s*\",\n          \"end\": \"\\\\s*(?={)\",\n          \"beginCaptures\": {\n            \"1\": { \"name\": \"keyword.implements.graphql\" }\n          },\n          \"patterns\": [\n            {\n              \"match\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n              \"captures\": {\n                \"1\": { \"name\": \"support.type.graphql\" }\n              }\n            },\n            { \"include\": \"#graphql-comment\" },\n            { \"include\": \"#graphql-description-docstring\" },\n            { \"include\": \"#graphql-description-singleline\" },\n            { \"include\": \"#graphql-directive\" },\n            { \"include\": \"#graphql-ampersand\" },\n            { \"include\": \"#graphql-comma\" }\n          ]\n        },\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-type-object\" },\n        { \"include\": \"#literal-quasi-embedded\" },\n        { \"include\": \"#graphql-ignore-spaces\" }\n      ]\n    },\n    \"graphql-ignore-spaces\": {\n      \"match\": \"\\\\s*\"\n    },\n    \"graphql-type-object\": {\n      \"name\": \"meta.type.object.graphql\",\n      \"begin\": \"\\\\s*({)\",\n      \"end\": \"\\\\s*(})\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"punctuation.operation.graphql\" }\n      },\n      \"endCaptures\": {\n        \"1\": { \"name\": \"punctuation.operation.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-object-type\" },\n        { \"include\": \"#graphql-type-definition\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-type-definition\": {\n      \"comment\": \"key (optionalArgs): Type\",\n      \"begin\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)(?=\\\\s*\\\\(|:)\",\n      \"end\": \"(?=\\\\s*(([_A-Za-z][_0-9A-Za-z]*)\\\\s*(\\\\(|:)|(})))|\\\\s*(,)\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"variable.graphql\" }\n      },\n      \"endCaptures\": {\n        \"5\": { \"name\": \"punctuation.comma.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-variable-definitions\" },\n        { \"include\": \"#graphql-type-object\" },\n        { \"include\": \"#graphql-colon\" },\n        { \"include\": \"#graphql-input-types\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-schema\": {\n      \"begin\": \"\\\\s*\\\\b(schema)\\\\b\",\n      \"end\": \"(?<=})\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"keyword.schema.graphql\" }\n      },\n      \"patterns\": [\n        {\n          \"begin\": \"\\\\s*({)\",\n          \"end\": \"\\\\s*(})\",\n          \"beginCaptures\": {\n            \"1\": { \"name\": \"punctuation.operation.graphql\" }\n          },\n          \"endCaptures\": {\n            \"1\": { \"name\": \"punctuation.operation.graphql\" }\n          },\n          \"patterns\": [\n            {\n              \"begin\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)(?=\\\\s*\\\\(|:)\",\n              \"end\": \"(?=\\\\s*(([_A-Za-z][_0-9A-Za-z]*)\\\\s*(\\\\(|:)|(})))|\\\\s*(,)\",\n              \"beginCaptures\": {\n                \"1\": { \"name\": \"variable.arguments.graphql\" }\n              },\n              \"endCaptures\": {\n                \"5\": { \"name\": \"punctuation.comma.graphql\" }\n              },\n              \"patterns\": [\n                {\n                  \"match\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n                  \"captures\": {\n                    \"1\": { \"name\": \"support.type.graphql\" }\n                  }\n                },\n                { \"include\": \"#graphql-comment\" },\n                { \"include\": \"#graphql-description-docstring\" },\n                { \"include\": \"#graphql-description-singleline\" },\n                { \"include\": \"#graphql-colon\" },\n                { \"include\": \"#graphql-skip-newlines\" }\n              ]\n            },\n            { \"include\": \"#graphql-comment\" },\n            { \"include\": \"#graphql-description-docstring\" },\n            { \"include\": \"#graphql-description-singleline\" },\n            { \"include\": \"#graphql-skip-newlines\" }\n          ]\n        },\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-skip-newlines\" }\n      ]\n    },\n    \"graphql-comment\": {\n      \"patterns\": [\n        {\n          \"comment\": \"need to prefix comment space with a scope else Atom's reflow cmd doesn't work\",\n          \"name\": \"comment.line.graphql.js\",\n          \"match\": \"(\\\\s*)(#).*\",\n          \"captures\": {\n            \"1\": {\n              \"name\": \"punctuation.whitespace.comment.leading.graphql\"\n            }\n          }\n        },\n        {\n          \"name\": \"comment.line.graphql.js\",\n          \"begin\": \"(\\\"\\\"\\\")\",\n          \"end\": \"(\\\"\\\"\\\")\",\n          \"beginCaptures\": {\n            \"1\": {\n              \"name\": \"punctuation.whitespace.comment.leading.graphql\"\n            }\n          }\n        },\n        {\n          \"name\": \"comment.line.graphql.js\",\n          \"begin\": \"(\\\")\",\n          \"end\": \"(\\\")\",\n          \"beginCaptures\": {\n            \"1\": {\n              \"name\": \"punctuation.whitespace.comment.leading.graphql\"\n            }\n          }\n        }\n      ]\n    },\n    \"graphql-description-singleline\": {\n      \"name\": \"comment.line.number-sign.graphql\",\n      \"match\": \"#(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$).*$\"\n    },\n    \"graphql-description-docstring\": {\n      \"name\": \"comment.block.graphql\",\n      \"begin\": \"\\\"\\\"\\\"\",\n      \"end\": \"\\\"\\\"\\\"\"\n    },\n    \"graphql-variable-definitions\": {\n      \"begin\": \"\\\\s*(\\\\()\",\n      \"end\": \"\\\\s*(\\\\))\",\n      \"captures\": {\n        \"1\": { \"name\": \"meta.brace.round.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-variable-definition\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-variable-definition\": {\n      \"comment\": \"variable: type = value,.... which may be a list\",\n      \"name\": \"meta.variables.graphql\",\n      \"begin\": \"\\\\s*(\\\\$?[_A-Za-z][_0-9A-Za-z]*)(?=\\\\s*\\\\(|:)\",\n      \"end\": \"(?=\\\\s*((\\\\$?[_A-Za-z][_0-9A-Za-z]*)\\\\s*(\\\\(|:)|(}|\\\\))))|\\\\s*(,)\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"variable.parameter.graphql\" }\n      },\n      \"endCaptures\": {\n        \"5\": { \"name\": \"punctuation.comma.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-colon\" },\n        { \"include\": \"#graphql-input-types\" },\n        { \"include\": \"#graphql-variable-assignment\" },\n        { \"include\": \"#literal-quasi-embedded\" },\n        { \"include\": \"#graphql-skip-newlines\" }\n      ]\n    },\n    \"graphql-input-types\": {\n      \"patterns\": [\n        { \"include\": \"#graphql-scalar-type\" },\n        {\n          \"match\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)(?:\\\\s*(!))?\",\n          \"captures\": {\n            \"1\": { \"name\": \"support.type.graphql\" },\n            \"2\": { \"name\": \"keyword.operator.nulltype.graphql\" }\n          }\n        },\n        {\n          \"name\": \"meta.type.list.graphql\",\n          \"begin\": \"\\\\s*(\\\\[)\",\n          \"end\": \"\\\\s*(\\\\])(?:\\\\s*(!))?\",\n          \"captures\": {\n            \"1\": { \"name\": \"meta.brace.square.graphql\" },\n            \"2\": { \"name\": \"keyword.operator.nulltype.graphql\" }\n          },\n          \"patterns\": [\n            { \"include\": \"#graphql-comment\" },\n            { \"include\": \"#graphql-description-docstring\" },\n            { \"include\": \"#graphql-description-singleline\" },\n            { \"include\": \"#graphql-input-types\" },\n            { \"include\": \"#graphql-comma\" },\n            { \"include\": \"#literal-quasi-embedded\" }\n          ]\n        }\n      ]\n    },\n    \"graphql-scalar\": {\n      \"match\": \"\\\\s*\\\\b(scalar)\\\\b\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.scalar.graphql\" },\n        \"2\": { \"name\": \"entity.scalar.graphql\" }\n      }\n    },\n    \"graphql-scalar-type\": {\n      \"match\": \"\\\\s*\\\\b(Int|Float|String|Boolean|ID)\\\\b(?:\\\\s*(!))?\",\n      \"captures\": {\n        \"1\": { \"name\": \"support.type.builtin.graphql\" },\n        \"2\": { \"name\": \"keyword.operator.nulltype.graphql\" }\n      }\n    },\n    \"graphql-variable-assignment\": {\n      \"begin\": \"\\\\s(=)\",\n      \"end\": \"(?=[\\n,)])\",\n      \"applyEndPatternLast\": 1,\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"punctuation.assignment.graphql\" }\n      },\n      \"patterns\": [{ \"include\": \"#graphql-value\" }]\n    },\n    \"graphql-comma\": {\n      \"match\": \"\\\\s*(,)\",\n      \"captures\": {\n        \"1\": { \"name\": \"punctuation.comma.graphql\" }\n      }\n    },\n    \"graphql-ampersand\": {\n      \"match\": \"\\\\s*(&)\",\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.operator.logical.graphql\" }\n      }\n    },\n    \"graphql-colon\": {\n      \"match\": \"\\\\s*(:)\",\n      \"captures\": {\n        \"1\": { \"name\": \"punctuation.colon.graphql\" }\n      }\n    },\n    \"graphql-union-mark\": {\n      \"match\": \"\\\\s*(\\\\|)\",\n      \"captures\": {\n        \"1\": { \"name\": \"punctuation.union.graphql\" }\n      }\n    },\n    \"graphql-name\": {\n      \"match\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n      \"captures\": {\n        \"1\": { \"name\": \"entity.name.function.graphql\" }\n      }\n    },\n    \"graphql-directive\": {\n      \"begin\": \"\\\\s*((@)\\\\s*([_A-Za-z][_0-9A-Za-z]*))\",\n      \"end\": \"(?=.)\",\n      \"applyEndPatternLast\": 1,\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"entity.name.function.directive.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-arguments\" },\n        { \"include\": \"#literal-quasi-embedded\" },\n        { \"include\": \"#graphql-skip-newlines\" }\n      ]\n    },\n    \"graphql-directive-definition\": {\n      \"begin\": \"\\\\s*(\\\\bdirective\\\\b)\\\\s*(@[_A-Za-z][_0-9A-Za-z]*)\",\n      \"end\": \"(?=.)\",\n      \"applyEndPatternLast\": 1,\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"keyword.directive.graphql\"\n        },\n        \"2\": {\n          \"name\": \"entity.name.function.directive.graphql\"\n        },\n        \"3\": {\n          \"name\": \"keyword.repeatable.graphql\"\n        },\n        \"4\": {\n          \"name\": \"keyword.on.graphql\"\n        },\n        \"5\": {\n          \"name\": \"support.type.graphql\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"#graphql-variable-definitions\"\n        },\n        {\n          \"begin\": \"\\\\s*(\\\\brepeatable\\\\b)?\\\\s*(\\\\bon\\\\b)\\\\s*([_A-Za-z]*)\",\n          \"end\": \"(?=.)\",\n          \"applyEndPatternLast\": 1,\n          \"beginCaptures\": {\n            \"1\": {\n              \"name\": \"keyword.repeatable.graphql\"\n            },\n            \"2\": {\n              \"name\": \"keyword.on.graphql\"\n            },\n            \"3\": {\n              \"name\": \"support.type.location.graphql\"\n            }\n          },\n          \"patterns\": [\n            {\n              \"include\": \"#graphql-skip-newlines\"\n            },\n            {\n              \"include\": \"#graphql-comment\"\n            },\n            {\n              \"include\": \"#literal-quasi-embedded\"\n            },\n            {\n              \"match\": \"\\\\s*(\\\\|)\\\\s*([_A-Za-z]*)\",\n              \"captures\": {\n                \"2\": {\n                  \"name\": \"support.type.location.graphql\"\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"include\": \"#graphql-skip-newlines\"\n        },\n        {\n          \"include\": \"#graphql-comment\"\n        },\n        {\n          \"include\": \"#literal-quasi-embedded\"\n        }\n      ]\n    },\n    \"graphql-selection-set\": {\n      \"name\": \"meta.selectionset.graphql\",\n      \"begin\": \"\\\\s*({)\",\n      \"end\": \"\\\\s*(})\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"punctuation.operation.graphql\" }\n      },\n      \"endCaptures\": {\n        \"1\": { \"name\": \"punctuation.operation.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-field\" },\n        { \"include\": \"#graphql-fragment-spread\" },\n        { \"include\": \"#graphql-inline-fragment\" },\n        { \"include\": \"#graphql-comma\" },\n        { \"include\": \"#native-interpolation\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-field\": {\n      \"patterns\": [\n        {\n          \"match\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)\\\\s*(:)\",\n          \"captures\": {\n            \"1\": { \"name\": \"string.unquoted.alias.graphql\" },\n            \"2\": { \"name\": \"punctuation.colon.graphql\" }\n          }\n        },\n        {\n          \"match\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n          \"captures\": {\n            \"1\": { \"name\": \"variable.graphql\" }\n          }\n        },\n        { \"include\": \"#graphql-arguments\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-selection-set\" },\n        { \"include\": \"#literal-quasi-embedded\" },\n        { \"include\": \"#graphql-skip-newlines\" }\n      ]\n    },\n    \"graphql-fragment-spread\": {\n      \"begin\": \"\\\\s*(\\\\.\\\\.\\\\.)\\\\s*(?!\\\\bon\\\\b)([_A-Za-z][_0-9A-Za-z]*)\",\n      \"end\": \"(?=.)\",\n      \"applyEndPatternLast\": 1,\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.operator.spread.graphql\" },\n        \"2\": { \"name\": \"variable.fragment.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-arguments\" },\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-selection-set\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#literal-quasi-embedded\" },\n        { \"include\": \"#graphql-skip-newlines\" }\n      ]\n    },\n    \"graphql-inline-fragment\": {\n      \"begin\": \"\\\\s*(\\\\.\\\\.\\\\.)\\\\s*(?:(\\\\bon\\\\b)\\\\s*([_A-Za-z][_0-9A-Za-z]*))?\",\n      \"end\": \"(?=.)\",\n      \"applyEndPatternLast\": 1,\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.operator.spread.graphql\" },\n        \"2\": { \"name\": \"keyword.on.graphql\" },\n        \"3\": { \"name\": \"support.type.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-selection-set\" },\n        { \"include\": \"#graphql-directive\" },\n        { \"include\": \"#graphql-skip-newlines\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-arguments\": {\n      \"name\": \"meta.arguments.graphql\",\n      \"begin\": \"\\\\s*(\\\\()\",\n      \"end\": \"\\\\s*(\\\\))\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"meta.brace.round.directive.graphql\" }\n      },\n      \"endCaptures\": {\n        \"1\": { \"name\": \"meta.brace.round.directive.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        {\n          \"begin\": \"\\\\s*([_A-Za-z][_0-9A-Za-z]*)(?:\\\\s*(:))\",\n          \"end\": \"(?=\\\\s*(?:(?:([_A-Za-z][_0-9A-Za-z]*)\\\\s*(:))|\\\\)))|\\\\s*(,)\",\n          \"beginCaptures\": {\n            \"1\": { \"name\": \"variable.parameter.graphql\" },\n            \"2\": { \"name\": \"punctuation.colon.graphql\" }\n          },\n          \"endCaptures\": {\n            \"3\": { \"name\": \"punctuation.comma.graphql\" }\n          },\n          \"patterns\": [\n            { \"include\": \"#graphql-comment\" },\n            { \"include\": \"#graphql-description-docstring\" },\n            { \"include\": \"#graphql-description-singleline\" },\n            { \"include\": \"#graphql-directive\" },\n            { \"include\": \"#graphql-value\" },\n            { \"include\": \"#graphql-skip-newlines\" }\n          ]\n        },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-variable-name\": {\n      \"match\": \"\\\\s*(\\\\$[_A-Za-z][_0-9A-Za-z]*)\",\n      \"captures\": {\n        \"1\": { \"name\": \"variable.graphql\" }\n      }\n    },\n    \"graphql-float-value\": {\n      \"match\": \"\\\\s*(-?(0|[1-9][0-9]*)(\\\\.[0-9]+)?((e|E)(\\\\+|-)?[0-9]+)?)\",\n      \"captures\": {\n        \"1\": { \"name\": \"constant.numeric.float.graphql\" }\n      }\n    },\n    \"graphql-boolean-value\": {\n      \"match\": \"\\\\s*\\\\b(true|false)\\\\b\",\n      \"captures\": {\n        \"1\": { \"name\": \"constant.language.boolean.graphql\" }\n      }\n    },\n    \"graphql-null-value\": {\n      \"match\": \"\\\\s*\\\\b(null)\\\\b\",\n      \"captures\": {\n        \"1\": { \"name\": \"constant.language.null.graphql\" }\n      }\n    },\n    \"graphql-string-value\": {\n      \"contentName\": \"string.quoted.double.graphql\",\n      \"begin\": \"\\\\s*+((\\\"))\",\n      \"end\": \"\\\\s*+(?:((\\\"))|(\\n))\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"string.quoted.double.graphql\" },\n        \"2\": { \"name\": \"punctuation.definition.string.begin.graphql\" }\n      },\n      \"endCaptures\": {\n        \"1\": { \"name\": \"string.quoted.double.graphql\" },\n        \"2\": { \"name\": \"punctuation.definition.string.end.graphql\" },\n        \"3\": { \"name\": \"invalid.illegal.newline.graphql\" }\n      },\n      \"patterns\": [\n        { \"include\": \"#graphql-string-content\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-string-content\": {\n      \"patterns\": [\n        {\n          \"name\": \"constant.character.escape.graphql\",\n          \"match\": \"\\\\\\\\[/'\\\"\\\\\\\\nrtbf]\"\n        },\n        {\n          \"name\": \"constant.character.escape.graphql\",\n          \"match\": \"\\\\\\\\u([0-9a-fA-F]{4})\"\n        }\n      ]\n    },\n    \"graphql-enum\": {\n      \"name\": \"meta.enum.graphql\",\n      \"begin\": \"\\\\s*+\\\\b(enum)\\\\b\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n      \"end\": \"(?<=})\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"keyword.enum.graphql\" },\n        \"2\": { \"name\": \"support.type.enum.graphql\" }\n      },\n      \"patterns\": [\n        {\n          \"name\": \"meta.type.object.graphql\",\n          \"begin\": \"\\\\s*({)\",\n          \"end\": \"\\\\s*(})\",\n          \"beginCaptures\": {\n            \"1\": { \"name\": \"punctuation.operation.graphql\" }\n          },\n          \"endCaptures\": {\n            \"1\": { \"name\": \"punctuation.operation.graphql\" }\n          },\n          \"patterns\": [\n            { \"include\": \"#graphql-object-type\" },\n\n            { \"include\": \"#graphql-comment\" },\n            { \"include\": \"#graphql-description-docstring\" },\n            { \"include\": \"#graphql-description-singleline\" },\n            { \"include\": \"#graphql-directive\" },\n            { \"include\": \"#graphql-enum-value\" },\n            { \"include\": \"#literal-quasi-embedded\" }\n          ]\n        },\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-directive\" }\n      ]\n    },\n    \"graphql-enum-value\": {\n      \"name\": \"constant.character.enum.graphql\",\n      \"match\": \"\\\\s*(?!=\\\\b(true|false|null)\\\\b)([_A-Za-z][_0-9A-Za-z]*)\"\n    },\n    \"graphql-value\": {\n      \"patterns\": [\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-variable-name\" },\n        { \"include\": \"#graphql-float-value\" },\n        { \"include\": \"#graphql-string-value\" },\n        { \"include\": \"#graphql-boolean-value\" },\n        { \"include\": \"#graphql-null-value\" },\n        { \"include\": \"#graphql-enum-value\" },\n        { \"include\": \"#graphql-list-value\" },\n        { \"include\": \"#graphql-object-value\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"graphql-list-value\": {\n      \"patterns\": [\n        {\n          \"name\": \"meta.listvalues.graphql\",\n          \"begin\": \"\\\\s*+(\\\\[)\",\n          \"end\": \"\\\\s*(\\\\])\",\n          \"endCaptures\": {\n            \"1\": { \"name\": \"meta.brace.square.graphql\" }\n          },\n          \"beginCaptures\": {\n            \"1\": { \"name\": \"meta.brace.square.graphql\" }\n          },\n          \"patterns\": [{ \"include\": \"#graphql-value\" }]\n        }\n      ]\n    },\n    \"graphql-object-value\": {\n      \"patterns\": [\n        {\n          \"name\": \"meta.objectvalues.graphql\",\n          \"begin\": \"\\\\s*+({)\",\n          \"end\": \"\\\\s*(})\",\n          \"beginCaptures\": {\n            \"1\": { \"name\": \"meta.brace.curly.graphql\" }\n          },\n          \"endCaptures\": {\n            \"1\": { \"name\": \"meta.brace.curly.graphql\" }\n          },\n          \"patterns\": [\n            { \"include\": \"#graphql-object-field\" },\n            { \"include\": \"#graphql-value\" }\n          ]\n        }\n      ]\n    },\n    \"graphql-object-field\": {\n      \"match\": \"\\\\s*(([_A-Za-z][_0-9A-Za-z]*))\\\\s*(:)\",\n      \"captures\": {\n        \"1\": { \"name\": \"constant.object.key.graphql\" },\n        \"2\": { \"name\": \"string.unquoted.graphql\" },\n        \"3\": { \"name\": \"punctuation.graphql\" }\n      }\n    },\n    \"graphql-union\": {\n      \"begin\": \"\\\\s*\\\\b(union)\\\\b\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n      \"end\": \"(?=.)\",\n      \"applyEndPatternLast\": 1,\n      \"captures\": {\n        \"1\": { \"name\": \"keyword.union.graphql\" },\n        \"2\": { \"name\": \"support.type.graphql\" }\n      },\n      \"patterns\": [\n        {\n          \"begin\": \"\\\\s*(=)\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n          \"end\": \"(?=.)\",\n          \"applyEndPatternLast\": 1,\n          \"captures\": {\n            \"1\": { \"name\": \"punctuation.assignment.graphql\" },\n            \"2\": { \"name\": \"support.type.graphql\" }\n          },\n          \"patterns\": [\n            { \"include\": \"#graphql-comment\" },\n            { \"include\": \"#graphql-description-docstring\" },\n            { \"include\": \"#graphql-description-singleline\" },\n            { \"include\": \"#graphql-skip-newlines\" },\n            { \"include\": \"#literal-quasi-embedded\" },\n            {\n              \"match\": \"\\\\s*(\\\\|)\\\\s*([_A-Za-z][_0-9A-Za-z]*)\",\n              \"captures\": {\n                \"1\": { \"name\": \"punctuation.or.graphql\" },\n                \"2\": { \"name\": \"support.type.graphql\" }\n              }\n            }\n          ]\n        },\n        { \"include\": \"#graphql-comment\" },\n        { \"include\": \"#graphql-description-docstring\" },\n        { \"include\": \"#graphql-description-singleline\" },\n        { \"include\": \"#graphql-skip-newlines\" },\n        { \"include\": \"#literal-quasi-embedded\" }\n      ]\n    },\n    \"native-interpolation\": {\n      \"name\": \"native.interpolation\",\n      \"begin\": \"\\\\s*(\\\\${)\",\n      \"end\": \"(})\",\n      \"beginCaptures\": {\n        \"1\": { \"name\": \"keyword.other.substitution.begin\" }\n      },\n      \"endCaptures\": {\n        \"1\": { \"name\": \"keyword.other.substitution.end\" }\n      },\n      \"patterns\": [\n        { \"include\": \"source.js\" },\n        { \"include\": \"source.ts\" },\n        { \"include\": \"source.js.jsx\" },\n        { \"include\": \"source.tsx\" }\n      ]\n    },\n    \"graphql-skip-newlines\": {\n      \"match\": \"\\\\s*\\n\"\n    }\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.markdown.codeblock.json",
    "content": "{\n  \"scopeName\": \"inline.graphql.markdown.codeblock\",\n  \"injectionSelector\": \"L:text.html.markdown -meta.embedded.block\",\n  \"patterns\": [\n    {\n      \"begin\": \"(^|\\\\G)(\\\\s*)(\\\\`{3,}|~{3,})\\\\s*(?i:(graphql|gql|GraphQL)(\\\\s+[^`~]*)?$)\",\n      \"name\": \"markup.fenced_code.block.markdown\",\n      \"end\": \"(^|\\\\G)(\\\\2|\\\\s{0,3})(\\\\3)\\\\s*$\",\n      \"beginCaptures\": {\n        \"3\": {\n          \"name\": \"punctuation.definition.markdown\"\n        },\n        \"4\": {\n          \"name\": \"fenced_code.block.language.markdown\"\n        },\n        \"5\": {\n          \"name\": \"fenced_code.block.language.attributes.markdown\"\n        }\n      },\n      \"endCaptures\": {\n        \"3\": {\n          \"name\": \"punctuation.definition.markdown\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"begin\": \"(^|\\\\G)(\\\\s*)(.*)\",\n          \"while\": \"(^|\\\\G)(?!\\\\s*([`~]{3,})\\\\s*$)\",\n          \"contentName\": \"meta.embedded.block.graphql\",\n          \"patterns\": [\n            {\n              \"include\": \"source.graphql\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.php.json",
    "content": "{\n  \"scopeName\": \"inline.graphql.php\",\n  \"injectionSelector\": \"L:(meta.embedded.block.php | source.php -string -comment)\",\n  \"patterns\": [\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(<<<)\\\\s*(\\\"?)(GRAPHQL|GQL)(\\\\2)(\\\\s*)$\",\n      \"beginCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.section.embedded.begin.php\"\n        },\n        \"1\": {\n          \"name\": \"punctuation.definition.string.php\"\n        },\n        \"3\": {\n          \"name\": \"keyword.operator.heredoc.php\"\n        },\n        \"5\": {\n          \"name\": \"invalid.illegal.trailing-whitespace.php\"\n        }\n      },\n      \"end\": \"^\\\\s*(\\\\3)(?![A-Za-z0-9_\\\\x{7f}-\\\\x{10ffff}])\",\n      \"endCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.section.embedded.end.php\"\n        },\n        \"1\": {\n          \"name\": \"keyword.operator.heredoc.php\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"begin\": \"(<<<)\\\\s*'(GRAPHQL|GQL)'(\\\\s*)$\",\n      \"beginCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.section.embedded.begin.php\"\n        },\n        \"1\": {\n          \"name\": \"punctuation.definition.string.php\"\n        },\n        \"2\": {\n          \"name\": \"keyword.operator.nowdoc.php\"\n        },\n        \"3\": {\n          \"name\": \"invalid.illegal.trailing-whitespace.php\"\n        }\n      },\n      \"contentName\": \"source.graphql\",\n      \"end\": \"^\\\\s*(\\\\2)(?![A-Za-z0-9_\\\\x{7f}-\\\\x{10ffff}])\",\n      \"endCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.section.embedded.end.php\"\n        },\n        \"1\": {\n          \"name\": \"keyword.operator.nowdoc.php\"\n        }\n      },\n      \"name\": \"meta.embedded.graphql\",\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"begin\": \"(/\\\\*\\\\*\\\\s*(@lang\\\\s*GraphQL|Graphi?QL|graphql)\\\\s*\\\\*/)\\\\s*(')\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"punctuation.definition.comment.php\"\n        },\n        \"3\": {\n          \"name\": \"punctuation.definition.string.begin.php\"\n        }\n      },\n      \"contentName\": \"source.graphql\",\n      \"end\": \"'\",\n      \"endCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.definition.string.end.php\"\n        }\n      },\n      \"name\": \"meta.embedded.graphql\",\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"begin\": \"((/\\\\*\\\\*|//)\\\\s*(@lang\\\\s*GraphQL|Graphi?QL|graphql)\\\\s*(\\\\*/)?)(\\\\s*)$\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"punctuation.definition.comment.php\"\n        },\n        \"5\": {\n          \"name\": \"invalid.illegal.trailing-whitespace.php\"\n        }\n      },\n      \"end\": \"(?<=')\",\n      \"patterns\": [\n        {\n          \"begin\": \"'\",\n          \"beginCaptures\": {\n            \"0\": {\n              \"name\": \"punctuation.definition.string.begin.php\"\n            }\n          },\n          \"contentName\": \"source.graphql\",\n          \"end\": \"'\",\n          \"endCaptures\": {\n            \"0\": {\n              \"name\": \"punctuation.definition.string.end.php\"\n            }\n          },\n          \"name\": \"meta.embedded.graphql\",\n          \"patterns\": [\n            {\n              \"include\": \"source.graphql\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.python.json",
    "content": "{\n  \"scopeName\": \"inline.graphql.python\",\n  \"injectionSelector\": \"L:(meta.embedded.block.python | source.python -string -comment)\",\n  \"patterns\": [\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"\\\\s+(gql)\\\\s*\\\\(\\\\s*(''')\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"entity.name.function\"\n        },\n        \"2\": {\n          \"name\": \"string.quoted.multi.python\"\n        }\n      },\n      \"end\": \"(''')\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.multi.python\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"\\\\s+(gql)\\\\s*\\\\(\\\\s*(\\\"\\\"\\\")\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"entity.name.function\"\n        },\n        \"2\": {\n          \"name\": \"string.quoted.multi.python\"\n        }\n      },\n      \"end\": \"(\\\"\\\"\\\")\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.multi.python\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"\\\\s+(gql)\\\\s*\\\\(\\\\s*$\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"entity.name.function\"\n        }\n      },\n      \"end\": \"\\\\)|,\",\n      \"patterns\": [\n        {\n          \"begin\": \"^\\\\s*(''')\",\n          \"beginCaptures\": {\n            \"1\": {\n              \"name\": \"string.quoted.multi.python\"\n            }\n          },\n          \"end\": \"(''')\",\n          \"endCaptures\": {\n            \"1\": {\n              \"name\": \"string.quoted.multi.python\"\n            }\n          },\n          \"patterns\": [\n            {\n              \"include\": \"source.graphql\"\n            }\n          ]\n        },\n        {\n          \"begin\": \"^\\\\s*(\\\"\\\"\\\")\",\n          \"beginCaptures\": {\n            \"1\": {\n              \"name\": \"string.quoted.multi.python\"\n            }\n          },\n          \"end\": \"(\\\"\\\"\\\")\",\n          \"endCaptures\": {\n            \"1\": {\n              \"name\": \"string.quoted.multi.python\"\n            }\n          },\n          \"patterns\": [\n            {\n              \"include\": \"source.graphql\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"begin\": \"(''')(#graphql)\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.multi.python\"\n        },\n        \"2\": {\n          \"name\": \"comment.line.graphql.js\"\n        }\n      },\n      \"end\": \"(''')\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.multi.python\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"begin\": \"(\\\"\\\"\\\")(#graphql)\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.multi.python\"\n        },\n        \"2\": {\n          \"name\": \"comment.line.graphql.js\"\n        }\n      },\n      \"end\": \"(\\\"\\\"\\\")\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.multi.python\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.re.json",
    "content": "{\n  \"scopeName\": \"inline.graphql.re\",\n  \"injectionSelector\": \"L:(meta.embedded.block.reason | meta.embedded.block.ocaml | source.ocaml | source.reason -string -comment)\",\n  \"patterns\": [\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"({)(gql)(\\\\|)\",\n      \"end\": \"(\\\\|)(\\\\2)(})\",\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(\\\\[%graphql)s*$\",\n      \"end\": \"(?<=])\",\n      \"patterns\": [\n        {\n          \"begin\": \"^\\\\s*({\\\\|)$\",\n          \"end\": \"^\\\\s*(\\\\|})\",\n          \"patterns\": [{ \"include\": \"source.graphql\" }]\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(\\\\[%graphql {\\\\|)\",\n      \"end\": \"(\\\\|}( )?])\",\n      \"patterns\": [{ \"include\": \"source.graphql\" }]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.rescript.json",
    "content": "{\n  \"scopeName\": \"inline.graphql.res\",\n  \"injectionSelector\": \"L:(meta.embedded.block.rescript | source.rescript -string -comment)\",\n  \"patterns\": [\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(%graphql\\\\()\\\\s*$\",\n      \"end\": \"(?<=\\\\))\",\n      \"patterns\": [\n        {\n          \"begin\": \"^\\\\s*(`)$\",\n          \"end\": \"^\\\\s*(`)\",\n          \"patterns\": [{ \"include\": \"source.graphql\" }]\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(%graphql\\\\(`)\",\n      \"end\": \"(\\\\`( )?\\\\))\",\n      \"patterns\": [{ \"include\": \"source.graphql\" }]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/grammars/graphql.scala.json",
    "content": "{\n  \"scopeName\": \"inline.graphql.scala\",\n  \"injectionSelector\": \"L:(meta.embedded.block.scala | source.scala -string -comment)\",\n  \"patterns\": [\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(gql|graphql|schema)(\\\"\\\"\\\")\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"keyword.interpolation.scala\"\n        },\n        \"2\": {\n          \"name\": \"string.quoted.triple.scala\"\n        }\n      },\n      \"end\": \"(\\\"\\\"\\\")\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.triple.scala\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"contentName\": \"meta.embedded.block.graphql\",\n      \"begin\": \"(gql|graphql|schema)(\\\")\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"keyword.interpolation.scala\"\n        },\n        \"2\": {\n          \"name\": \"string.quoted.double.scala\"\n        }\n      },\n      \"end\": \"(\\\")\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.double.scala\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    },\n    {\n      \"begin\": \"(\\\"\\\"\\\")(#graphql)\",\n      \"beginCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.triple.scala\"\n        },\n        \"2\": {\n          \"name\": \"comment.line.graphql.js\"\n        }\n      },\n      \"end\": \"(\\\"\\\"\\\")\",\n      \"endCaptures\": {\n        \"1\": {\n          \"name\": \"string.quoted.triple.scala\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"source.graphql\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/language/language-configuration.json",
    "content": "{\n  \"comments\": {\n    \"lineComment\": \"#\",\n    \"blockComment\": [\"\\\"\\\"\\\"\", \"\\\"\\\"\\\"\"]\n  },\n  \"brackets\": [\n    [\"{\", \"}\"],\n    [\"[\", \"]\"],\n    [\"(\", \")\"]\n  ],\n  \"autoClosingPairs\": [\n    [\"{\", \"}\"],\n    [\"[\", \"]\"],\n    [\"(\", \")\"],\n    { \"open\": \"\\\"\", \"close\": \"\\\"\", \"notIn\": [\"string\", \"comment\"] },\n    [\"'\", \"'\"]\n  ],\n  \"surroundingPairs\": [\n    [\"{\", \"}\"],\n    [\"[\", \"]\"],\n    [\"(\", \")\"],\n    [\"\\\"\", \"\\\"\"],\n    [\"'\", \"'\"]\n  ]\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/package.json",
    "content": "{\n  \"name\": \"vscode-graphql-syntax\",\n  \"version\": \"1.3.8\",\n  \"displayName\": \"GraphQL: Syntax Highlighting\",\n  \"description\": \"Adds syntax highlighting support for .graphql & embedded support for javascript, typescript, vue, markdown, python, php, reason, ocaml and rescript\",\n  \"publisher\": \"GraphQL\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"engines\": {\n    \"vscode\": \"^1.63.0\"\n  },\n  \"files\": [\n    \"assets\",\n    \"grammars\",\n    \"language\",\n    \"README.md\",\n    \"LICENSE\",\n    \"CHANGELOG.md\",\n    \"package.json\"\n  ],\n  \"icon\": \"assets/images/logo.png\",\n  \"contributors\": [\n    {\n      \"name\": \"Divyendu Singh\",\n      \"url\": \"https://www.divyendusingh.com/\"\n    }\n  ],\n  \"galleryBanner\": {\n    \"color\": \"#032539\",\n    \"theme\": \"dark\"\n  },\n  \"categories\": [\n    \"Programming Languages\"\n  ],\n  \"contributes\": {\n    \"languages\": [\n      {\n        \"id\": \"graphql\",\n        \"extensions\": [\n          \".gql\",\n          \".graphql\",\n          \".graphqls\"\n        ],\n        \"aliases\": [\n          \"GraphQL\",\n          \"graphql\"\n        ],\n        \"configuration\": \"./language/language-configuration.json\"\n      }\n    ],\n    \"grammars\": [\n      {\n        \"language\": \"graphql\",\n        \"path\": \"./grammars/graphql.json\",\n        \"scopeName\": \"source.graphql\"\n      },\n      {\n        \"injectTo\": [\n          \"source.js\",\n          \"source.ts\",\n          \"source.js.jsx\",\n          \"source.tsx\",\n          \"source.vue\",\n          \"source.svelte\",\n          \"source.astro\",\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql\",\n        \"path\": \"./grammars/graphql.js.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      },\n      {\n        \"injectTo\": [\n          \"source.reason\",\n          \"source.ocaml\",\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql.re\",\n        \"path\": \"./grammars/graphql.re.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      },\n      {\n        \"injectTo\": [\n          \"source.rescript\",\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql.res\",\n        \"path\": \"./grammars/graphql.rescript.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      },\n      {\n        \"injectTo\": [\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql.markdown.codeblock\",\n        \"path\": \"./grammars/graphql.markdown.codeblock.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      },\n      {\n        \"injectTo\": [\n          \"source.python\",\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql.python\",\n        \"path\": \"./grammars/graphql.python.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      },\n      {\n        \"injectTo\": [\n          \"text.html.php\",\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql.php\",\n        \"path\": \"./grammars/graphql.php.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      },\n      {\n        \"injectTo\": [\n          \"source.scala\",\n          \"text.html.markdown\",\n          \"text.html.derivative\"\n        ],\n        \"scopeName\": \"inline.graphql.scala\",\n        \"path\": \"./grammars/graphql.scala.json\",\n        \"embeddedLanguages\": {\n          \"meta.embedded.block.graphql\": \"graphql\"\n        }\n      }\n    ]\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/graphql/graphiql\",\n    \"directory\": \"packages/vscode-graphql-syntax\"\n  },\n  \"devDependencies\": {\n    \"@vscode/vsce\": \"^2.22.1-2\",\n    \"ovsx\": \"^0.3.0\",\n    \"vscode-oniguruma\": \"^1.7.0\",\n    \"vscode-textmate\": \"^9.0.0\"\n  },\n  \"homepage\": \"https://github.com/graphql/graphiql/blob/main/packages/vscode-graphql-syntax/README.md\",\n  \"scripts\": {\n    \"types:check\": \"tsc --noEmit\",\n    \"vsce:package\": \"vsce package --yarn\",\n    \"vsce:prepublish\": \"npm run vsce:package\",\n    \"vsce:publish\": \"vsce publish --yarn\",\n    \"open-vsx:publish\": \"ovsx publish --yarn -i . --pat $OVSX_PAT\",\n    \"release\": \"npm run vsce:publish && npm run open-vsx:publish\",\n    \"test\": \"vitest run\"\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/StarWarsSchema.graphql",
    "content": "schema {\n  query: Query\n}\n\ndirective @test(testArg: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\ndirective @onArg on ARGUMENT_DEFINITION\ndirective @onAllDefs on SCHEMA | SCALAR | OBJECT | FIELD_DEFINITION | INTERFACE | UNION | ENUM_VALUE | INPUT_OBJECT | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\ndirective @onRepeatable repeatable on FIELD_DEFINITION\n\nenum Episode {\n  NEWHOPE\n  EMPIRE\n  JEDI\n}\n\ninterface Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Human implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n}\n\ntype Droid implements Character {\n  id: String!\n  name: String\n  friends: [Character]\n  appearsIn: [Episode]\n  secretBackstory: String\n  primaryFunction: String\n  instructions: [String]!\n}\n\ninput InputType {\n  key: String!\n  value: Int = 42\n}\n\ninterface TestInterface {\n  testField: String!\n}\n\ninterface AnotherInterface implements TestInterface {\n  testField: String!\n}\n\ntype TestType implements TestInterface & AnotherInterface {\n  testField: String!\n}\n\ntype Query {\n  hero(episode: Episode): Character\n  human(id: String!): Human\n  droid(id: String!): Droid\n  inputTypeTest(args: InputType = { key: \"key\" }): TestType\n  deprecatedField: TestType @deprecated(reason: \"Use test instead.\")\n}\n\nunion TestUnion = Droid | TestType\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/kitchen-sink.graphql",
    "content": "# Copyright (c) 2021 GraphQL Contributors\n# All rights reserved.\n#\n# This source code is licensed under the license found in the\n# LICENSE file in the root directory of this source tree.\n\nquery queryName($foo: TestInput, $site: TestEnum = RED) {\n  testAlias: hasArgs(string: \"testString\")\n  ... on Test {\n    hasArgs(\n      listEnum: [RED, GREEN, BLUE]\n      int: 1\n      listFloat: [1.23, 1.3e-1, -1.35384e+3]\n      boolean: true\n      id: 123\n      object: $foo\n      enum: $site\n    )\n  }\n  test @include(if: true) {\n    union {\n      __typename\n    }\n  }\n  ...frag\n  ... @skip(if: false) {\n    id\n  }\n  ... {\n    id\n  }\n}\n\nmutation mutationName {\n  setString(value: \"newString\")\n}\n\nsubscription subscriptionName {\n  subscribeToTest(id: \"anId\") {\n    ... on Test {\n      id\n    }\n  }\n}\n\nfragment frag on Test {\n  test @include(if: true) {\n    union {\n      __typename\n    }\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/query.graphql",
    "content": "query simple {\n  stuff(id: \"1\") {\n    id\n    name\n  }\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test-js.md",
    "content": "# TODO: get tags inside of other code blocks working\n\n```js\nconst variable = 1;\n\nconst query = graphql`\n  query {\n    something(arg: ${variable})\n  }\n`;\nconst Component = () => {\n  return <div>{query}</div>;\n};\n```\n\n```ts\nconst variable: number = 1;\n\ngraphql`\n    query {\n        something(variable: ${variable})\n    }\n`;\nconst Component = () => {\n  return <div> </div>;\n};\n```\n\n### svelte\n\n```svelte\n<script>\n    const query = gql`\n    query {\n        hello\n    }\n    `;\n\tlet name = 'world';\n    const query = ``\n</script>\n\n<h1>Hello {name}!</h1>\n```\n\n## vue\n\n```vue\n<script>\nconst query = gql`\n  query {\n    hello\n  }\n`;\nexport default {\n  data() {\n    return {\n      message: 'Hello World!',\n    };\n  },\n};\n</script>\n\n<template>\n  <h1>{{ message }}</h1>\n</template>\n```\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test-py.md",
    "content": "# Python\n\n```Python\n\nquery = gql(\n    \"\"\"\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n  \"\"\"\n)\n\nquery = gql('''\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n'''\n)\n\nquery = gql(\n'''\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n'''\n)\n\n'''#graphql\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n'''\n\nquery = '''#graphql query getContinents {\n    continents {\n        code\n        name\n    }\n}'''\n\n\"\"\"#graphql\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n\"\"\"\n\n\"\"\"#graphql query getContinents {\n    continents {\n        code\n        name\n    }\n}\"\"\"\n```\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test-sfc-comp.vue",
    "content": "<!--\nSay Hello World with Vue!\n-->\n\n<script setup>\nimport { ref } from 'vue';\nconst query = gql`\n  query {\n    hello\n  }\n`;\n\nconst message = ref('Hello World!');\n</script>\n\n<template>\n  <h1>{{ message }}</h1>\n</template>\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test-sfc.vue",
    "content": "<script>\nconst query = gql`\n  query {\n    hello\n  }\n`;\nexport default {\n  data() {\n    return {\n      message: 'Hello World!',\n    };\n  },\n};\n</script>\n\n<template>\n  <h1>{{ message }}</h1>\n</template>\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.astro",
    "content": "---\nconst gql = String.raw;\nconst response = await fetch(\n  'https://swapi-graphql.netlify.app/.netlify/functions/index',\n  {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      query: gql`\n        query getFilm($id: ID!) {\n          film(id: $id) {\n            title\n            releaseDate\n          }\n        }\n      `,\n      variables: {\n        id: 'ZmlsbXM6MQ==',\n      },\n    }),\n  },\n);\n\nconst json = await response.json();\nconst { film } = json.data;\n---\n\n<h1>Fetching information about Star Wars: A New Hope</h1>\n<h2>Title: {film.title}</h2>\n<p>Year: {film.releaseDate}</p>\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.js",
    "content": "/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n\nconst variable = 'test';\n\ngql`\n  query {\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n\ngraphql`\n  query {\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n\nconst graphql = graphql`\n  query {\n    user(id: \"5\", name: ${variable}) {\n      something\n    }\n  }\n`;\n\nconst graphql = graphql(`\n  \"\"\" this is a comment \"\"\"\n  query {\n    user(id: \"5\", name: ${variable}) {\n      something\n    }\n  }\n`);\n\nconst after1 = 'after';\n\nconst graphql = graphql(\n  `\n    query($id: ID!) { test }\n  `,\n  [var1, var2]\n);\n\nconst after2 = 'after';\n\nconst query = /* GraphQL */ 'query { id } ';\nconst query = graphql('query($id: ID!) { id } ');\nconst query = graphql(\n  'query($id: ID!) { test }'\n);\n\nconst queryWithInlineComment = `#graphql\n query {\n        user(id: \"5\", name: boolean) {\n            something\n        }\n    }\n`;\n\nconst queryWithInlineComment = '#graphql query { id } ';\n\nconst queryWithInlineComment = '#graphql query { id } ';\n\nconst queryWithInlineComment = `#graphql\n query {\n        user(id: \"5\", name: boolean) {\n            something\n        }\n    }\n`;\nconst queryWithInlineComment = `\n#graphql\n query {\n        user(id: \"5\", name: boolean) {\n            something\n        }\n    }\n`;\n\nconst queryWithLeadingComment = /* GraphQL */ `\n  query {\n    \"\"\" this is a comment \"\"\"\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n\n// TODO: fix this\nconst queryWithLeadingAboveComment =\n  /* GraphQL */\n  `\n    query {\n      user(id: \"5\", name: boolean) {\n        something\n      }\n    }\n  `;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.md",
    "content": "# this is an MD file\n\nIt would be a shame if the word `graphql` accidentally triggered highlighting\nLooks like it doesn't though! good\n\n```graphql\nquery {\n  something\n}\n```\n\n```gql\n# comment\nquery {\n  something\n}\n```\n\n```GraphQL\nquery {\n    something @directive(first: \"string\")\n}\n\ntype Example {\n    something\n}\n```\n\n```php\n<?php\n  $query = <<<GRAPHQL\n    query {\n      site {\n        name\n      }\n    }\n  GRAPHQL;\n?>\n```\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.php",
    "content": "<?php\n\n## TODO: not yet supported\n$graphql = graphql([\n    'query' => \"{\n  post(idType: SLUG, id: 2) {\n    title\n    content\n    date\n  }\n}\"\n]);\n\n$query = <<<GRAPHQL\n  query {\n    site {\n      name\n    }\n  }\nGRAPHQL;\n\n## TODO: not yet supported\n$gql = <<<QUERY\nquery {\n    pokemon(name: \"Pikachu\") {\n        id\n        number\n        name\n        attacks {\n            special {\n                name\n                type\n                damage\n            }\n        }\n    }\n}\nQUERY;\n\n?>\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.py",
    "content": "query = gql(\n    \"\"\"\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n\"\"\"\n)\n\nquery = gql('''\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n'''\n)\n\nquery = gql(\n'''\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n'''\n)\n\n'''#graphql\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n'''\n\nquery = '''#graphql query getContinents {\n    continents {\n        code\n        name\n    }\n}'''\n\n\"\"\"#graphql\n    query getContinents {\n      continents {\n        code\n        name\n      }\n    }\n\"\"\"\n\n\"\"\"#graphql query getContinents {\n    continents {\n        code\n        name\n    }\n}\"\"\"\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.re",
    "content": "module VideoGames = [%graphql\n  {|\n  query VideoGames {\n    videoGames {\n      id\n      title\n      developer\n      completed\n    }\n  }\n|}\n];\n\nmodule VideoGamesQuery = ReasonApollo.CreateQuery(VideoGames);\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.scala",
    "content": "val query = graphql\"\"\"\n  { id }\n\"\"\"\nval query2 = gql\"\"\"\n  { id }\n\"\"\"\nval query3 = schema\"\"\"\n  { id }\n\"\"\"\n\nval query = \"\"\"#graphql\n { id }\n\"\"\"\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.svelte",
    "content": "<script>\n    const query = gql`\n    query {\n        hello\n    }\n    `;\n\tlet name = 'world';\n    const query = ``\n</script>\n\n<h1>Hello {name}!</h1>\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__fixtures__/test.ts",
    "content": "/* eslint-disable */\n// @ts-nocheck\n\ngql`\n  query {\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n\ngraphql<SomeGeneric>`\n  query {\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n\nconst query = graphql<SomeGeneric>`\n  query {\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n\nconst query = graphql<Generic>('query { id }');\n\nconst query = graphql(\n  'query { id }'\n);\n\nconst query = graphql<Generic>(\n  'query { id }'\n);\n\nconst query = graphql(`\n  query { id }\n`);\n\nconst query = graphql(\n  `\n    query { id }\n  `,\n  [var1, var2]\n);\n\nconst queryWithInlineComment = `#graphql\n query {\n        user(id: \"5\", name: boolean) {\n            something\n        }\n    }\n`;\n\nconst queryWithLeadingComment = /* GraphQL */ `\n  query {\n    user(id: \"5\", name: boolean) {\n      something\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/graphql-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`source.graphql grammar > should tokenize a simple query 1`] = `\nquery  | keyword.operation.graphql\n       | \nsimple | entity.name.function.graphql\n       | meta.selectionset.graphql\n{      | meta.selectionset.graphql punctuation.operation.graphql\n       | meta.selectionset.graphql\nstuff  | meta.selectionset.graphql variable.graphql\n(      | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid     | meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:      | meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n       | meta.selectionset.graphql meta.arguments.graphql\n\"      | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n1      | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"      | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n)      | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n       | meta.selectionset.graphql meta.selectionset.graphql\n{      | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n       | meta.selectionset.graphql meta.selectionset.graphql\nid     | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n       | meta.selectionset.graphql meta.selectionset.graphql\nname   | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n       | meta.selectionset.graphql meta.selectionset.graphql\n}      | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n}      | meta.selectionset.graphql punctuation.operation.graphql\n       | \n`;\n\nexports[`source.graphql grammar > should tokenize an advanced query 1`] = `\n# Copyright (c) 2021 GraphQL Contributors                     | comment.line.graphql.js\n# All rights reserved.                                        | comment.line.graphql.js\n#                                                             | comment.line.graphql.js\n# This source code is licensed under the license found in the | comment.line.graphql.js\n# LICENSE file in the root directory of this source tree.     | comment.line.graphql.js\n                                                              | \nquery                                                         | keyword.operation.graphql\n                                                              | \nqueryName                                                     | entity.name.function.graphql\n(                                                             | meta.brace.round.graphql\n$foo                                                          | meta.variables.graphql variable.parameter.graphql\n:                                                             | meta.variables.graphql punctuation.colon.graphql\n                                                              | meta.variables.graphql\nTestInput                                                     | meta.variables.graphql support.type.graphql\n,                                                             | meta.variables.graphql punctuation.comma.graphql\n                                                              | meta.variables.graphql\n$site                                                         | meta.variables.graphql variable.parameter.graphql\n:                                                             | meta.variables.graphql punctuation.colon.graphql\n                                                              | meta.variables.graphql\nTestEnum                                                      | meta.variables.graphql support.type.graphql\n                                                              | meta.variables.graphql\n=                                                             | meta.variables.graphql punctuation.assignment.graphql\n RED                                                          | meta.variables.graphql constant.character.enum.graphql\n)                                                             | meta.brace.round.graphql\n                                                              | meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql\ntestAlias                                                     | meta.selectionset.graphql string.unquoted.alias.graphql\n:                                                             | meta.selectionset.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql\nhasArgs                                                       | meta.selectionset.graphql variable.graphql\n(                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nstring                                                        | meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.arguments.graphql\n\"                                                             | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\ntestString                                                    | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                                             | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n)                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.selectionset.graphql\n...                                                           | meta.selectionset.graphql keyword.operator.spread.graphql\n                                                              | meta.selectionset.graphql\non                                                            | meta.selectionset.graphql keyword.on.graphql\n                                                              | meta.selectionset.graphql\nTest                                                          | meta.selectionset.graphql support.type.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\nhasArgs                                                       | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n(                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nlistEnum                                                      | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n[                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql meta.brace.square.graphql\nRED                                                           | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql constant.character.enum.graphql\n,                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n GREEN                                                        | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql constant.character.enum.graphql\n,                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n BLUE                                                         | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql constant.character.enum.graphql\n]                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql meta.brace.square.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nint                                                           | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\n1                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql constant.numeric.float.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nlistFloat                                                     | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n[                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql meta.brace.square.graphql\n1.23                                                          | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql constant.numeric.float.graphql\n,                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n1.3e-1                                                        | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql constant.numeric.float.graphql\n,                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql\n-1.35384e+3                                                   | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql constant.numeric.float.graphql\n]                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.listvalues.graphql meta.brace.square.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nboolean                                                       | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\ntrue                                                          | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql constant.language.boolean.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nid                                                            | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\n123                                                           | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql constant.numeric.float.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nobject                                                        | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\n$foo                                                          | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\nenum                                                          | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\n$site                                                         | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql\n)                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql\ntest                                                          | meta.selectionset.graphql variable.graphql\n                                                              | meta.selectionset.graphql\n@include                                                      | meta.selectionset.graphql entity.name.function.directive.graphql\n(                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nif                                                            | meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.arguments.graphql\ntrue                                                          | meta.selectionset.graphql meta.arguments.graphql constant.language.boolean.graphql\n)                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\nunion                                                         | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n__typename                                                    | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql\n...                                                           | meta.selectionset.graphql keyword.operator.spread.graphql\nfrag                                                          | meta.selectionset.graphql variable.fragment.graphql\n                                                              | meta.selectionset.graphql\n...                                                           | meta.selectionset.graphql keyword.operator.spread.graphql\n                                                              | meta.selectionset.graphql\n@skip                                                         | meta.selectionset.graphql entity.name.function.directive.graphql\n(                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nif                                                            | meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.arguments.graphql\nfalse                                                         | meta.selectionset.graphql meta.arguments.graphql constant.language.boolean.graphql\n)                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\nid                                                            | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql\n...                                                           | meta.selectionset.graphql keyword.operator.spread.graphql\n                                                              | meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\nid                                                            | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n}                                                             | meta.selectionset.graphql punctuation.operation.graphql\n                                                              | \nmutation                                                      | keyword.operation.graphql\n                                                              | \nmutationName                                                  | entity.name.function.graphql\n                                                              | meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql\nsetString                                                     | meta.selectionset.graphql variable.graphql\n(                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nvalue                                                         | meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.arguments.graphql\n\"                                                             | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\nnewString                                                     | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                                             | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n)                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n}                                                             | meta.selectionset.graphql punctuation.operation.graphql\n                                                              | \nsubscription                                                  | entity.name.function.graphql\n                                                              | \nsubscriptionName                                              | entity.name.function.graphql\n                                                              | meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql\nsubscribeToTest                                               | meta.selectionset.graphql variable.graphql\n(                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                                            | meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.selectionset.graphql meta.arguments.graphql\n\"                                                             | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\nanId                                                          | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                                             | meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n)                                                             | meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n...                                                           | meta.selectionset.graphql meta.selectionset.graphql keyword.operator.spread.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\non                                                            | meta.selectionset.graphql meta.selectionset.graphql keyword.on.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\nTest                                                          | meta.selectionset.graphql meta.selectionset.graphql support.type.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\nid                                                            | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n}                                                             | meta.selectionset.graphql punctuation.operation.graphql\n                                                              | \nfragment                                                      | meta.fragment.graphql keyword.fragment.graphql\n                                                              | meta.fragment.graphql\nfrag                                                          | meta.fragment.graphql entity.name.fragment.graphql\n                                                              | meta.fragment.graphql\non                                                            | meta.fragment.graphql keyword.on.graphql\n                                                              | meta.fragment.graphql\nTest                                                          | meta.fragment.graphql support.type.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql\n{                                                             | meta.fragment.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql\ntest                                                          | meta.fragment.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql\n@include                                                      | meta.fragment.graphql meta.selectionset.graphql entity.name.function.directive.graphql\n(                                                             | meta.fragment.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nif                                                            | meta.fragment.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                             | meta.fragment.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.arguments.graphql\ntrue                                                          | meta.fragment.graphql meta.selectionset.graphql meta.arguments.graphql constant.language.boolean.graphql\n)                                                             | meta.fragment.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql\nunion                                                         | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                                             | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n__typename                                                    | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                                             | meta.fragment.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n}                                                             | meta.fragment.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                              | \n`;\n\nexports[`source.graphql grammar > should tokenize an advanced schema 1`] = `\nschema                 | keyword.schema.graphql\n                       | \n{                      | punctuation.operation.graphql\n                       | \nquery                  | variable.arguments.graphql\n:                      | punctuation.colon.graphql\n                       | \nQuery                  | support.type.graphql\n}                      | punctuation.operation.graphql\n                       | \ndirective              | keyword.directive.graphql\n                       | \n@test                  | entity.name.function.directive.graphql\n(                      | meta.brace.round.graphql\ntestArg                | meta.variables.graphql variable.parameter.graphql\n:                      | meta.variables.graphql punctuation.colon.graphql\n                       | meta.variables.graphql\nBoolean                | meta.variables.graphql support.type.builtin.graphql\n!                      | meta.variables.graphql keyword.operator.nulltype.graphql\n)                      | meta.brace.round.graphql\n                       | \non                     | keyword.on.graphql\n                       | \nFIELD                  | support.type.location.graphql\n |                     | \nFRAGMENT_SPREAD        | support.type.location.graphql\n |                     | \nINLINE_FRAGMENT        | support.type.location.graphql\ndirective              | keyword.directive.graphql\n                       | \n@onArg                 | entity.name.function.directive.graphql\n                       | \non                     | keyword.on.graphql\n                       | \nARGUMENT_DEFINITION    | support.type.location.graphql\ndirective              | keyword.directive.graphql\n                       | \n@onAllDefs             | entity.name.function.directive.graphql\n                       | \non                     | keyword.on.graphql\n                       | \nSCHEMA                 | support.type.location.graphql\n |                     | \nSCALAR                 | support.type.location.graphql\n |                     | \nOBJECT                 | support.type.location.graphql\n |                     | \nFIELD_DEFINITION       | support.type.location.graphql\n |                     | \nINTERFACE              | support.type.location.graphql\n |                     | \nUNION                  | support.type.location.graphql\n |                     | \nENUM_VALUE             | support.type.location.graphql\n |                     | \nINPUT_OBJECT           | support.type.location.graphql\n |                     | \nARGUMENT_DEFINITION    | support.type.location.graphql\n |                     | \nINPUT_FIELD_DEFINITION | support.type.location.graphql\ndirective              | keyword.directive.graphql\n                       | \n@onRepeatable          | entity.name.function.directive.graphql\n                       | \nrepeatable             | keyword.repeatable.graphql\n                       | \non                     | keyword.on.graphql\n                       | \nFIELD_DEFINITION       | support.type.location.graphql\n                       | \nenum                   | meta.enum.graphql keyword.enum.graphql\n                       | meta.enum.graphql\nEpisode                | meta.enum.graphql support.type.enum.graphql\n                       | meta.enum.graphql meta.type.object.graphql\n{                      | meta.enum.graphql meta.type.object.graphql punctuation.operation.graphql\n  NEWHOPE              | meta.enum.graphql meta.type.object.graphql constant.character.enum.graphql\n  EMPIRE               | meta.enum.graphql meta.type.object.graphql constant.character.enum.graphql\n  JEDI                 | meta.enum.graphql meta.type.object.graphql constant.character.enum.graphql\n}                      | meta.enum.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ninterface              | meta.type.interface.graphql keyword.interface.graphql\n                       | meta.type.interface.graphql\nCharacter              | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nid                     | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nname                   | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nfriends                | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nCharacter              | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nappearsIn              | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nEpisode                | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nsecretBackstory        | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ntype                   | meta.type.interface.graphql keyword.type.graphql\n                       | meta.type.interface.graphql\nHuman                  | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\nimplements             | meta.type.interface.graphql keyword.implements.graphql\n                       | meta.type.interface.graphql\nCharacter              | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nid                     | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nname                   | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nfriends                | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nCharacter              | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nappearsIn              | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nEpisode                | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nsecretBackstory        | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ntype                   | meta.type.interface.graphql keyword.type.graphql\n                       | meta.type.interface.graphql\nDroid                  | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\nimplements             | meta.type.interface.graphql keyword.implements.graphql\n                       | meta.type.interface.graphql\nCharacter              | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nid                     | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nname                   | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nfriends                | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nCharacter              | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nappearsIn              | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nEpisode                | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nsecretBackstory        | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nprimaryFunction        | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ninstructions           | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql\n[                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql support.type.builtin.graphql\n]                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql meta.brace.square.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql meta.type.list.graphql keyword.operator.nulltype.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ninput                  | meta.type.interface.graphql keyword.input.graphql\n                       | meta.type.interface.graphql\nInputType              | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nkey                    | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nvalue                  | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nInt                    | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n = 42                  | meta.type.interface.graphql meta.type.object.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ninterface              | meta.type.interface.graphql keyword.interface.graphql\n                       | meta.type.interface.graphql\nTestInterface          | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ntestField              | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ninterface              | meta.type.interface.graphql keyword.interface.graphql\n                       | meta.type.interface.graphql\nAnotherInterface       | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\nimplements             | meta.type.interface.graphql keyword.implements.graphql\n                       | meta.type.interface.graphql\nTestInterface          | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ntestField              | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ntype                   | meta.type.interface.graphql keyword.type.graphql\n                       | meta.type.interface.graphql\nTestType               | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\nimplements             | meta.type.interface.graphql keyword.implements.graphql\n                       | meta.type.interface.graphql\nTestInterface          | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\n&                      | meta.type.interface.graphql keyword.operator.logical.graphql\n                       | meta.type.interface.graphql\nAnotherInterface       | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ntestField              | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql keyword.operator.nulltype.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \ntype                   | meta.type.interface.graphql keyword.type.graphql\n                       | meta.type.interface.graphql\nQuery                  | meta.type.interface.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nhero                   | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n(                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\nepisode                | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql variable.parameter.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql\nEpisode                | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql support.type.graphql\n)                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nCharacter              | meta.type.interface.graphql meta.type.object.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nhuman                  | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n(                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\nid                     | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql variable.parameter.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql keyword.operator.nulltype.graphql\n)                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nHuman                  | meta.type.interface.graphql meta.type.object.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ndroid                  | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n(                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\nid                     | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql variable.parameter.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql\nString                 | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql support.type.builtin.graphql\n!                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql keyword.operator.nulltype.graphql\n)                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nDroid                  | meta.type.interface.graphql meta.type.object.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ninputTypeTest          | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n(                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\nargs                   | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql variable.parameter.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql\nInputType              | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql\n=                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql punctuation.assignment.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql\n{                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql meta.brace.curly.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql\nkey                    | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql punctuation.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql\n\"                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\nkey                    | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql string.quoted.double.graphql\n\"                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql meta.variables.graphql meta.objectvalues.graphql meta.brace.curly.graphql\n)                      | meta.type.interface.graphql meta.type.object.graphql meta.brace.round.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nTestType               | meta.type.interface.graphql meta.type.object.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\ndeprecatedField        | meta.type.interface.graphql meta.type.object.graphql variable.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\nTestType               | meta.type.interface.graphql meta.type.object.graphql support.type.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql\n@deprecated            | meta.type.interface.graphql meta.type.object.graphql entity.name.function.directive.graphql\n(                      | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nreason                 | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql variable.parameter.graphql\n:                      | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql punctuation.colon.graphql\n                       | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql\n\"                      | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\nUse test instead.      | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                      | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n)                      | meta.type.interface.graphql meta.type.object.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n}                      | meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n                       | \nunion                  | keyword.union.graphql\n                       | \nTestUnion              | support.type.graphql\n                       | \n=                      | punctuation.assignment.graphql\n                       | \nDroid                  | support.type.graphql\n                       | \n|                      | punctuation.or.graphql\n                       | \nTestType               | support.type.graphql\n                       | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/js-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`inline.graphql grammar > should tokenize a simple astro file 1`] = `\n---                                                             | \nconst gql = String.raw;                                         | \nconst response = await fetch(                                   | \n  'https://swapi-graphql.netlify.app/.netlify/functions/index', | \n  {                                                             | \n    method: 'POST',                                             | \n    headers: { 'Content-Type': 'application/json' },            | \n    body: JSON.stringify({                                      | \n      query:                                                    | \n                                                                | \ngql                                                             | entity.name.function.tagged-template.js\n\\`                                                               | punctuation.definition.string.template.begin.js\n                                                                | meta.embedded.block.graphql\nquery                                                           | meta.embedded.block.graphql keyword.operation.graphql\n                                                                | meta.embedded.block.graphql\ngetFilm                                                         | meta.embedded.block.graphql entity.name.function.graphql\n(                                                               | meta.embedded.block.graphql meta.brace.round.graphql\n$id                                                             | meta.embedded.block.graphql meta.variables.graphql variable.parameter.graphql\n:                                                               | meta.embedded.block.graphql meta.variables.graphql punctuation.colon.graphql\n                                                                | meta.embedded.block.graphql meta.variables.graphql\nID                                                              | meta.embedded.block.graphql meta.variables.graphql support.type.builtin.graphql\n!                                                               | meta.embedded.block.graphql meta.variables.graphql keyword.operator.nulltype.graphql\n)                                                               | meta.embedded.block.graphql meta.brace.round.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                                                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql\nfilm                                                            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                                              | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n$id                                                             | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.graphql\n)                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ntitle                                                           | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nreleaseDate                                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                                                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                | meta.embedded.block.graphql\n\\`                                                               | punctuation.definition.string.template.end.js\n,                                                               | \n      variables: {                                              | \n        id: 'ZmlsbXM6MQ==',                                     | \n      },                                                        | \n    }),                                                         | \n  },                                                            | \n);                                                              | \n                                                                | \nconst json = await response.json();                             | \nconst { film } = json.data;                                     | \n---                                                             | \n                                                                | \n<h1>Fetching information about Star Wars: A New Hope</h1>       | \n<h2>Title: {film.title}</h2>                                    | \n<p>Year: {film.releaseDate}</p>                                 | \n                                                                | \n`;\n\nexports[`inline.graphql grammar > should tokenize a simple ecmascript file 1`] = `\n/* eslint-disable */                   | \n/* prettier-ignore */                  | \n// @ts-nocheck                         | \n                                       | \nconst variable = 'test';               | \n                                       | \ngql                                    | entity.name.function.tagged-template.js\n\\`                                      | punctuation.definition.string.template.begin.js\n                                       | meta.embedded.block.graphql\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | punctuation.definition.string.template.end.js\n;                                      | \n                                       | \ngraphql                                | entity.name.function.tagged-template.js\n\\`                                      | punctuation.definition.string.template.begin.js\n                                       | meta.embedded.block.graphql\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | punctuation.definition.string.template.end.js\n;                                      | \n                                       | \nconst graphql =                        | \n                                       | \ngraphql                                | entity.name.function.tagged-template.js\n\\`                                      | punctuation.definition.string.template.begin.js\n                                       | meta.embedded.block.graphql\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n $                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.objectvalues.graphql meta.brace.curly.graphql\nvariable                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.objectvalues.graphql constant.character.enum.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.objectvalues.graphql meta.brace.curly.graphql\n)                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | punctuation.definition.string.template.end.js\n;                                      | \n                                       | \nconst graphql =                        | \ngraphql                                | entity.name.function.tagged-template.js\n(                                      | \n\\`                                      | punctuation.definition.string.template.begin.js\n                                       | meta.embedded.block.graphql\n\"\"\"                                    | meta.embedded.block.graphql comment.line.graphql.js punctuation.whitespace.comment.leading.graphql\n this is a comment                     | meta.embedded.block.graphql comment.line.graphql.js\n\"\"\"                                    | meta.embedded.block.graphql comment.line.graphql.js\n                                       | meta.embedded.block.graphql\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n $                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.objectvalues.graphql meta.brace.curly.graphql\nvariable                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.objectvalues.graphql constant.character.enum.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.objectvalues.graphql meta.brace.curly.graphql\n)                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | punctuation.definition.string.template.end.js\n)                                      | \n;                                      | \n                                       | \nconst after1 = 'after';                | \n                                       | \nconst graphql =                        | \ngraphql                                | entity.name.function.tagged-template.js\n(                                      | \n                                       | \n\\`                                      | punctuation.definition.string.template.begin.js\n                                       | meta.embedded.block.graphql\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n(                                      | meta.embedded.block.graphql meta.brace.round.graphql\n$id                                    | meta.embedded.block.graphql meta.variables.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.variables.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.variables.graphql\nID                                     | meta.embedded.block.graphql meta.variables.graphql support.type.builtin.graphql\n!                                      | meta.embedded.block.graphql meta.variables.graphql keyword.operator.nulltype.graphql\n)                                      | meta.embedded.block.graphql meta.brace.round.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\ntest                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql\n\\`                                      | punctuation.definition.string.template.end.js\n,                                      | \n  [var1, var2]                         | \n)                                      | \n;                                      | \n                                       | \nconst after2 = 'after';                | \n                                       | \nconst query =                          | \n                                       | \n/* GraphQL */                          | comment.graphql.js\n                                       | \n'                                      | punctuation.definition.string.template.begin.js\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql\n'                                      | punctuation.definition.string.template.end.js\n;                                      | \nconst query =                          | \ngraphql                                | entity.name.function.tagged-template.js\n(                                      | \n'                                      | punctuation.definition.string.template.begin.js\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n(                                      | meta.embedded.block.graphql meta.brace.round.graphql\n$id                                    | meta.embedded.block.graphql meta.variables.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.variables.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.variables.graphql\nID                                     | meta.embedded.block.graphql meta.variables.graphql support.type.builtin.graphql\n!                                      | meta.embedded.block.graphql meta.variables.graphql keyword.operator.nulltype.graphql\n)                                      | meta.embedded.block.graphql meta.brace.round.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql\n'                                      | punctuation.definition.string.template.end.js\n)                                      | \n;                                      | \nconst query =                          | \ngraphql                                | entity.name.function.tagged-template.js\n(                                      | \n                                       | \n'                                      | punctuation.definition.string.template.begin.js\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n(                                      | meta.embedded.block.graphql meta.brace.round.graphql\n$id                                    | meta.embedded.block.graphql meta.variables.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.variables.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.variables.graphql\nID                                     | meta.embedded.block.graphql meta.variables.graphql support.type.builtin.graphql\n!                                      | meta.embedded.block.graphql meta.variables.graphql keyword.operator.nulltype.graphql\n)                                      | meta.embedded.block.graphql meta.brace.round.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\ntest                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n'                                      | punctuation.definition.string.template.end.js\n)                                      | \n;                                      | \n                                       | \nconst queryWithInlineComment =         | \n\\`                                      | taggedTemplates punctuation.definition.string.template.begin.js\n#graphql                               | taggedTemplates comment.line.graphql.js\n                                       | taggedTemplates meta.embedded.block.graphql\nquery                                  | taggedTemplates meta.embedded.block.graphql keyword.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | taggedTemplates punctuation.definition.string.template.end.js\n;                                      | \n                                       | \nconst queryWithInlineComment =         | \n'                                      | taggedTemplates punctuation.definition.string.template.begin.js\n#graphql                               | taggedTemplates comment.line.graphql.js\n                                       | taggedTemplates meta.embedded.block.graphql\nquery                                  | taggedTemplates meta.embedded.block.graphql keyword.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\nid                                     | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql\n'                                      | taggedTemplates punctuation.definition.string.template.end.js\n;                                      | \n                                       | \nconst queryWithInlineComment =         | \n'                                      | taggedTemplates punctuation.definition.string.template.begin.js\n#graphql                               | taggedTemplates comment.line.graphql.js\n                                       | taggedTemplates meta.embedded.block.graphql\nquery                                  | taggedTemplates meta.embedded.block.graphql keyword.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\nid                                     | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql\n'                                      | taggedTemplates punctuation.definition.string.template.end.js\n;                                      | \n                                       | \nconst queryWithInlineComment =         | \n\\`                                      | taggedTemplates punctuation.definition.string.template.begin.js\n#graphql                               | taggedTemplates comment.line.graphql.js\n                                       | taggedTemplates meta.embedded.block.graphql\nquery                                  | taggedTemplates meta.embedded.block.graphql keyword.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | taggedTemplates punctuation.definition.string.template.end.js\n;                                      | \nconst queryWithInlineComment = \\`       | \n#graphql                               | \n query {                               | \n        user(id: \"5\", name: boolean) { | \n            something                  | \n        }                              | \n    }                                  | \n\\`;                                     | \n                                       | \nconst queryWithLeadingComment =        | \n                                       | \n/* GraphQL */                          | comment.graphql.js\n                                       | \n\\`                                      | punctuation.definition.string.template.begin.js\n                                       | meta.embedded.block.graphql\nquery                                  | meta.embedded.block.graphql keyword.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n\"\"\"                                    | meta.embedded.block.graphql meta.selectionset.graphql comment.line.graphql.js punctuation.whitespace.comment.leading.graphql\n this is a comment                     | meta.embedded.block.graphql meta.selectionset.graphql comment.line.graphql.js\n\"\"\"                                    | meta.embedded.block.graphql meta.selectionset.graphql comment.line.graphql.js\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\nuser                                   | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                                     | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                                   | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                      | punctuation.definition.string.template.end.js\n;                                      | \n                                       | \n// TODO: fix this                      | \nconst queryWithLeadingAboveComment =   | \n  /* GraphQL */                        | \n  \\`                                    | \n    query {                            | \n      user(id: \"5\", name: boolean) {   | \n        something                      | \n      }                                | \n    }                                  | \n  \\`;                                   | \n                                       | \n`;\n\nexports[`inline.graphql grammar > should tokenize a simple svelte file 1`] = `\n<script>               | \n    const query =      | \n                       | \ngql                    | entity.name.function.tagged-template.js\n\\`                      | punctuation.definition.string.template.begin.js\n                       | meta.embedded.block.graphql\nquery                  | meta.embedded.block.graphql keyword.operation.graphql\n                       | meta.embedded.block.graphql meta.selectionset.graphql\n{                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                       | meta.embedded.block.graphql meta.selectionset.graphql\nhello                  | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                       | meta.embedded.block.graphql meta.selectionset.graphql\n}                      | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                       | meta.embedded.block.graphql\n\\`                      | punctuation.definition.string.template.end.js\n;                      | \n\tlet name = 'world';   | \n    const query = \\`\\`   | \n</script>              | \n                       | \n<h1>Hello {name}!</h1> | \n                       | \n`;\n\nexports[`inline.graphql grammar > should tokenize a simple typescript file 1`] = `\n/* eslint-disable */            | \n// @ts-nocheck                  | \n                                | \ngql                             | entity.name.function.tagged-template.js\n\\`                               | punctuation.definition.string.template.begin.js\n                                | meta.embedded.block.graphql\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nuser                            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                            | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                        | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                               | punctuation.definition.string.template.end.js\n;                               | \n                                | \ngraphql                         | entity.name.function.tagged-template.js\n<SomeGeneric>                   | \n\\`                               | punctuation.definition.string.template.begin.js\n                                | meta.embedded.block.graphql\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nuser                            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                            | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                        | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                               | punctuation.definition.string.template.end.js\n;                               | \n                                | \nconst query =                   | \n                                | \ngraphql                         | entity.name.function.tagged-template.js\n<SomeGeneric>                   | \n\\`                               | punctuation.definition.string.template.begin.js\n                                | meta.embedded.block.graphql\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nuser                            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                            | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                        | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                               | punctuation.definition.string.template.end.js\n;                               | \n                                | \nconst query =                   | \ngraphql                         | entity.name.function.tagged-template.js\n<Generic>(                      | \n'                               | punctuation.definition.string.template.begin.js\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n'                               | punctuation.definition.string.template.end.js\n)                               | \n;                               | \n                                | \nconst query =                   | \ngraphql                         | entity.name.function.tagged-template.js\n(                               | \n                                | \n'                               | punctuation.definition.string.template.begin.js\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n'                               | punctuation.definition.string.template.end.js\n)                               | \n;                               | \n                                | \nconst query =                   | \ngraphql                         | entity.name.function.tagged-template.js\n<Generic>(                      | \n                                | \n'                               | punctuation.definition.string.template.begin.js\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n'                               | punctuation.definition.string.template.end.js\n)                               | \n;                               | \n                                | \nconst query =                   | \ngraphql                         | entity.name.function.tagged-template.js\n(                               | \n\\`                               | punctuation.definition.string.template.begin.js\n                                | meta.embedded.block.graphql\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                               | punctuation.definition.string.template.end.js\n)                               | \n;                               | \n                                | \nconst query =                   | \ngraphql                         | entity.name.function.tagged-template.js\n(                               | \n                                | \n\\`                               | punctuation.definition.string.template.begin.js\n                                | meta.embedded.block.graphql\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql\n\\`                               | punctuation.definition.string.template.end.js\n,                               | \n  [var1, var2]                  | \n)                               | \n;                               | \n                                | \nconst queryWithInlineComment =  | \n\\`                               | taggedTemplates punctuation.definition.string.template.begin.js\n#graphql                        | taggedTemplates comment.line.graphql.js\n                                | taggedTemplates meta.embedded.block.graphql\nquery                           | taggedTemplates meta.embedded.block.graphql keyword.operation.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n{                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\nuser                            | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                              | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                            | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                        | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                       | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql\n}                               | taggedTemplates meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                               | taggedTemplates punctuation.definition.string.template.end.js\n;                               | \n                                | \nconst queryWithLeadingComment = | \n                                | \n/* GraphQL */                   | comment.graphql.js\n                                | \n\\`                               | punctuation.definition.string.template.begin.js\n                                | meta.embedded.block.graphql\nquery                           | meta.embedded.block.graphql keyword.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\nuser                            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n(                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nid                              | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\n5                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n,                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.comma.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\nname                            | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n boolean                        | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql constant.character.enum.graphql\n)                               | meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nsomething                       | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                | meta.embedded.block.graphql meta.selectionset.graphql\n}                               | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                               | punctuation.definition.string.template.end.js\n;                               | \n                                | \n`;\n\nexports[`inline.graphql grammar > should tokenize a simple vue sfc comp file 1`] = `\n<!--                                 | \nSay Hello World with Vue!            | \n-->                                  | \n                                     | \n<script setup>                       | \nimport { ref } from 'vue';           | \nconst query =                        | \n                                     | \ngql                                  | entity.name.function.tagged-template.js\n\\`                                    | punctuation.definition.string.template.begin.js\n                                     | meta.embedded.block.graphql\nquery                                | meta.embedded.block.graphql keyword.operation.graphql\n                                     | meta.embedded.block.graphql meta.selectionset.graphql\n{                                    | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                     | meta.embedded.block.graphql meta.selectionset.graphql\nhello                                | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                     | meta.embedded.block.graphql meta.selectionset.graphql\n}                                    | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                                    | punctuation.definition.string.template.end.js\n;                                    | \n                                     | \nconst message = ref('Hello World!'); | \n</script>                            | \n                                     | \n<template>                           | \n  <h1>{{ message }}</h1>             | \n</template>                          | \n                                     | \n`;\n\nexports[`inline.graphql grammar > should tokenize a simple vue sfc file 1`] = `\n<script>                       | \nconst query =                  | \n                               | \ngql                            | entity.name.function.tagged-template.js\n\\`                              | punctuation.definition.string.template.begin.js\n                               | meta.embedded.block.graphql\nquery                          | meta.embedded.block.graphql keyword.operation.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql\n{                              | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql\nhello                          | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql\n}                              | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`                              | punctuation.definition.string.template.end.js\n;                              | \nexport default {               | \n  data() {                     | \n    return {                   | \n      message: 'Hello World!', | \n    };                         | \n  },                           | \n};                             | \n</script>                      | \n                               | \n<template>                     | \n  <h1>{{ message }}</h1>       | \n</template>                    | \n                               | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/markdown-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`inline.graphql.markdown.codeblock grammar > should tokenize a simple markdown file 1`] = `\n# this is an MD file                                                          | \n                                                                              | \nIt would be a shame if the word \\`graphql\\` accidentally triggered highlighting | \nLooks like it doesn't though! good                                            | \n                                                                              | \n\\`\\`\\`                                                                           | markup.fenced_code.block.markdown punctuation.definition.markdown\ngraphql                                                                       | markup.fenced_code.block.markdown fenced_code.block.language.markdown\nquery                                                                         | markup.fenced_code.block.markdown meta.embedded.block.graphql keyword.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\n{                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\nsomething                                                                     | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n}                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`\\`\\`                                                                           | markup.fenced_code.block.markdown punctuation.definition.markdown\n                                                                              | \n\\`\\`\\`                                                                           | markup.fenced_code.block.markdown punctuation.definition.markdown\ngql                                                                           | markup.fenced_code.block.markdown fenced_code.block.language.markdown\n# comment                                                                     | markup.fenced_code.block.markdown meta.embedded.block.graphql comment.line.graphql.js\nquery                                                                         | markup.fenced_code.block.markdown meta.embedded.block.graphql keyword.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\n{                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\nsomething                                                                     | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n}                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\\`\\`\\`                                                                           | markup.fenced_code.block.markdown punctuation.definition.markdown\n                                                                              | \n\\`\\`\\`                                                                           | markup.fenced_code.block.markdown punctuation.definition.markdown\nGraphQL                                                                       | markup.fenced_code.block.markdown fenced_code.block.language.markdown\nquery                                                                         | markup.fenced_code.block.markdown meta.embedded.block.graphql keyword.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\n{                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\nsomething                                                                     | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql\n@directive                                                                    | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql entity.name.function.directive.graphql\n(                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\nfirst                                                                         | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql variable.parameter.graphql\n:                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql punctuation.colon.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql\n\"                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.begin.graphql\nstring                                                                        | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql\n\"                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql string.quoted.double.graphql punctuation.definition.string.end.graphql\n)                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql meta.arguments.graphql meta.brace.round.directive.graphql\n}                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql\ntype                                                                          | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql keyword.type.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql\nExample                                                                       | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql support.type.graphql\n                                                                              | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql meta.type.object.graphql\n{                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n    something                                                                 | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql meta.type.object.graphql\n}                                                                             | markup.fenced_code.block.markdown meta.embedded.block.graphql meta.type.interface.graphql meta.type.object.graphql punctuation.operation.graphql\n\\`\\`\\`                                                                           | markup.fenced_code.block.markdown punctuation.definition.markdown\n                                                                              | \n\\`\\`\\`php                                                                        | \n<?php                                                                         | \n  $query = <<<GRAPHQL                                                         | \n    query {                                                                   | \n      site {                                                                  | \n        name                                                                  | \n      }                                                                       | \n    }                                                                         | \n  GRAPHQL;                                                                    | \n?>                                                                            | \n\\`\\`\\`                                                                           | \n                                                                              | \n`;\n\nexports[`inline.graphql.markdown.codeblock grammar js > should tokenize a markdown file with javascript & typescript 1`] = `\n# TODO: get tags inside of other code blocks working | \n                                                     | \n\\`\\`\\`js                                                | \nconst variable = 1;                                  | \n                                                     | \nconst query = graphql\\`                               | \n  query {                                            | \n    something(arg: \\${variable})                      | \n  }                                                  | \n\\`;                                                   | \nconst Component = () => {                            | \n  return <div>{query}</div>;                         | \n};                                                   | \n\\`\\`\\`                                                  | \n                                                     | \n\\`\\`\\`ts                                                | \nconst variable: number = 1;                          | \n                                                     | \ngraphql\\`                                             | \n    query {                                          | \n        something(variable: \\${variable})             | \n    }                                                | \n\\`;                                                   | \nconst Component = () => {                            | \n  return <div> </div>;                               | \n};                                                   | \n\\`\\`\\`                                                  | \n                                                     | \n### svelte                                           | \n                                                     | \n\\`\\`\\`svelte                                            | \n<script>                                             | \n    const query = gql\\`                               | \n    query {                                          | \n        hello                                        | \n    }                                                | \n    \\`;                                               | \n\tlet name = 'world';                                 | \n    const query = \\`\\`                                 | \n</script>                                            | \n                                                     | \n<h1>Hello {name}!</h1>                               | \n\\`\\`\\`                                                  | \n                                                     | \n## vue                                               | \n                                                     | \n\\`\\`\\`vue                                               | \n<script>                                             | \nconst query = gql\\`                                   | \n  query {                                            | \n    hello                                            | \n  }                                                  | \n\\`;                                                   | \nexport default {                                     | \n  data() {                                           | \n    return {                                         | \n      message: 'Hello World!',                       | \n    };                                               | \n  },                                                 | \n};                                                   | \n</script>                                            | \n                                                     | \n<template>                                           | \n  <h1>{{ message }}</h1>                             | \n</template>                                          | \n\\`\\`\\`                                                  | \n                                                     | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/php-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`inline.graphql.php grammar > should tokenize a simple php file 1`] = `\n<?php                          | \n                               | \n## TODO: not yet supported     | \n$graphql = graphql([           | \n    'query' => \"{              | \n  post(idType: SLUG, id: 2) {  | \n    title                      | \n    content                    | \n    date                       | \n  }                            | \n}\"                             | \n]);                            | \n                               | \n$query =                       | \n<<<                            | punctuation.section.embedded.begin.php punctuation.definition.string.php\nGRAPHQL                        | punctuation.section.embedded.begin.php keyword.operator.heredoc.php\n                               | meta.embedded.block.graphql\nquery                          | meta.embedded.block.graphql keyword.operation.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql\n{                              | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql\nsite                           | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nname                           | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                               | meta.embedded.block.graphql meta.selectionset.graphql\n}                              | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\nGRAPHQL                        | punctuation.section.embedded.end.php keyword.operator.heredoc.php\n;                              | \n                               | \n## TODO: not yet supported     | \n$gql = <<<QUERY                | \nquery {                        | \n    pokemon(name: \"Pikachu\") { | \n        id                     | \n        number                 | \n        name                   | \n        attacks {              | \n            special {          | \n                name           | \n                type           | \n                damage         | \n            }                  | \n        }                      | \n    }                          | \n}                              | \nQUERY;                         | \n                               | \n?>                             | \n                               | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/python-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`inline.graphql.python grammar > should tokenize a simple python file 1`] = `\nquery =       | \n              | \ngql           | entity.name.function\n(             | \n              | meta.embedded.block.graphql\n\"\"\"           | meta.embedded.block.graphql string.quoted.multi.python\n              | meta.embedded.block.graphql\nquery         | meta.embedded.block.graphql keyword.operation.graphql\n              | meta.embedded.block.graphql\ngetContinents | meta.embedded.block.graphql entity.name.function.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\ncontinents    | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | meta.embedded.block.graphql string.quoted.multi.python\n)             | \n              | \nquery =       | \n              | \ngql           | entity.name.function\n(             | \n'''           | string.quoted.multi.python\n              | meta.embedded.block.graphql\nquery         | meta.embedded.block.graphql keyword.operation.graphql\n              | meta.embedded.block.graphql\ngetContinents | meta.embedded.block.graphql entity.name.function.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\ncontinents    | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n'''           | string.quoted.multi.python\n)             | \n              | \nquery =       | \n              | \ngql           | entity.name.function\n(             | \n'''           | meta.embedded.block.graphql string.quoted.multi.python\n              | meta.embedded.block.graphql\nquery         | meta.embedded.block.graphql keyword.operation.graphql\n              | meta.embedded.block.graphql\ngetContinents | meta.embedded.block.graphql entity.name.function.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\ncontinents    | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n'''           | meta.embedded.block.graphql string.quoted.multi.python\n)             | \n              | \n'''           | string.quoted.multi.python\n#graphql      | comment.line.graphql.js\n              | \nquery         | keyword.operation.graphql\n              | \ngetContinents | entity.name.function.graphql\n              | meta.selectionset.graphql\n{             | meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\ncontinents    | meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\n}             | meta.selectionset.graphql punctuation.operation.graphql\n'''           | string.quoted.multi.python\n              | \nquery =       | \n'''           | string.quoted.multi.python\n#graphql      | comment.line.graphql.js\n              | \nquery         | keyword.operation.graphql\n              | \ngetContinents | entity.name.function.graphql\n              | meta.selectionset.graphql\n{             | meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\ncontinents    | meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n}             | meta.selectionset.graphql punctuation.operation.graphql\n'''           | string.quoted.multi.python\n              | \n\"\"\"           | string.quoted.multi.python\n#graphql      | comment.line.graphql.js\n              | \nquery         | keyword.operation.graphql\n              | \ngetContinents | entity.name.function.graphql\n              | meta.selectionset.graphql\n{             | meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\ncontinents    | meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\n}             | meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | string.quoted.multi.python\n              | \n\"\"\"           | string.quoted.multi.python\n#graphql      | comment.line.graphql.js\n              | \nquery         | keyword.operation.graphql\n              | \ngetContinents | entity.name.function.graphql\n              | meta.selectionset.graphql\n{             | meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\ncontinents    | meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n{             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\ncode          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\nname          | meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql meta.selectionset.graphql\n}             | meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n}             | meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | string.quoted.multi.python\n              | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/reason-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`inline.graphql.reason grammar > should tokenize a simple reasonML file 1`] = `\nmodule VideoGames =                                            | \n[%graphql                                                      | \n  {|                                                           | meta.embedded.block.graphql\n                                                               | meta.embedded.block.graphql\nquery                                                          | meta.embedded.block.graphql keyword.operation.graphql\n                                                               | meta.embedded.block.graphql\nVideoGames                                                     | meta.embedded.block.graphql entity.name.function.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql\n{                                                              | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql\nvideoGames                                                     | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n{                                                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\nid                                                             | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ntitle                                                          | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ndeveloper                                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\ncompleted                                                      | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql variable.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql\n}                                                              | meta.embedded.block.graphql meta.selectionset.graphql meta.selectionset.graphql punctuation.operation.graphql\n                                                               | meta.embedded.block.graphql meta.selectionset.graphql\n}                                                              | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n|}                                                             | meta.embedded.block.graphql\n]                                                              | meta.embedded.block.graphql\n;                                                              | \n                                                               | \nmodule VideoGamesQuery = ReasonApollo.CreateQuery(VideoGames); | \n                                                               | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__snapshots__/scala-grammar.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`inline.graphql.scala grammar > should tokenize a simple scala file 1`] = `\nval query =   | \ngraphql       | keyword.interpolation.scala\n\"\"\"           | string.quoted.triple.scala\n              | meta.embedded.block.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\nid            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | string.quoted.triple.scala\nval query2 =  | \ngql           | keyword.interpolation.scala\n\"\"\"           | string.quoted.triple.scala\n              | meta.embedded.block.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\nid            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | string.quoted.triple.scala\nval query3 =  | \nschema        | keyword.interpolation.scala\n\"\"\"           | string.quoted.triple.scala\n              | meta.embedded.block.graphql meta.selectionset.graphql\n{             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\nid            | meta.embedded.block.graphql meta.selectionset.graphql variable.graphql\n              | meta.embedded.block.graphql meta.selectionset.graphql\n}             | meta.embedded.block.graphql meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | string.quoted.triple.scala\n              | \nval query =   | \n\"\"\"           | string.quoted.triple.scala\n#graphql      | comment.line.graphql.js\n              | meta.selectionset.graphql\n{             | meta.selectionset.graphql punctuation.operation.graphql\n              | meta.selectionset.graphql\nid            | meta.selectionset.graphql variable.graphql\n              | meta.selectionset.graphql\n}             | meta.selectionset.graphql punctuation.operation.graphql\n\"\"\"           | string.quoted.triple.scala\n              | \n`;\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__utilities__/serializer.ts",
    "content": "import { Token } from './utilities';\n\nfunction formatTokens(tokens: Token[]): string {\n  const maxLength = Math.max(...tokens.map(token => token.text.length));\n\n  return tokens\n    .map(token => `${token.text.padEnd(maxLength)} | ${token.scopes.join(' ')}`)\n    .join('\\n');\n}\n\nexpect.addSnapshotSerializer({\n  test: value =>\n    Array.isArray(value) &&\n    value.every(\n      item =>\n        typeof item === 'object' &&\n        typeof item.text === 'string' &&\n        Array.isArray(item.scopes),\n    ),\n  serialize: value => formatTokens(value as Token[]),\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/__utilities__/utilities.ts",
    "content": "import { readFile } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as oniguruma from 'vscode-oniguruma';\nimport * as tm from 'vscode-textmate';\nimport packageJson from '../../package.json' assert { type: 'json' };\n\nexport type Token = {\n  text: string;\n  scopes: string[];\n};\n\nexport async function tokenizeFile(\n  file: string,\n  grammarScopeName: string,\n): Promise<Token[]> {\n  const grammar = await getGrammar(grammarScopeName);\n  const lines = (\n    await readFile(path.join(__dirname, '..', file), 'utf8')\n  ).split('\\n');\n\n  const tokens: Token[] = [];\n\n  let ruleStack = tm.INITIAL;\n  for (const line of lines) {\n    const result = grammar.tokenizeLine(line, ruleStack);\n\n    for (const token of result.tokens) {\n      tokens.push({\n        text: line.slice(token.startIndex, token.endIndex),\n        scopes: token.scopes.filter(scope => scope !== grammarScopeName),\n      });\n    }\n\n    ruleStack = result.ruleStack;\n  }\n\n  return tokens;\n}\n\nconst grammarCache: Record<string, tm.IGrammar> = Object.create(null);\n\nasync function getGrammar(scopeName: string) {\n  if (grammarCache[scopeName]) {\n    return grammarCache[scopeName];\n  }\n\n  const configuration = loadConfiguration();\n\n  const grammars = await Promise.all(\n    configuration.map(async grammar => ({\n      grammar,\n      content: await readFile(grammar.path, 'utf8'),\n    })),\n  );\n\n  const grammarMap: Record<string, tm.IRawGrammar> = Object.create(null);\n  const injections: { [scopeName: string]: string[] } = Object.create(null);\n\n  for (const { grammar, content } of grammars) {\n    const rawGrammar = tm.parseRawGrammar(content, grammar.path);\n    grammarMap[grammar.scopeName || rawGrammar.scopeName] = rawGrammar;\n\n    if (grammar.injectTo) {\n      for (const injectScope of grammar.injectTo) {\n        (injections[injectScope] ||= []).push(grammar.scopeName);\n      }\n    }\n  }\n\n  const registry = new tm.Registry({\n    onigLib: vscodeOnigurumaLib(),\n    loadGrammar: async scope => grammarMap[scope],\n    getInjections: scope =>\n      scope\n        .split('.')\n        .flatMap(\n          (_, i, parts) => injections[parts.slice(0, i + 1).join('.')] || [],\n        ),\n  } as tm.RegistryOptions);\n\n  const grammar = await registry.loadGrammar(scopeName);\n\n  if (!grammar) {\n    throw new Error(`Unknown grammar: ${scopeName}`);\n  }\n\n  grammarCache[scopeName] = grammar;\n  return grammar;\n}\n\nasync function vscodeOnigurumaLib() {\n  const wasmPath = require.resolve('vscode-oniguruma/release/onig.wasm');\n  await oniguruma.loadWASM((await readFile(wasmPath)).buffer);\n\n  return {\n    createOnigScanner(patterns: any) {\n      return new oniguruma.OnigScanner(patterns);\n    },\n    createOnigString(s: any) {\n      return new oniguruma.OnigString(s);\n    },\n  };\n}\n\nfunction loadConfiguration() {\n  return packageJson.contributes.grammars.map(grammar => ({\n    ...grammar,\n    path: path.join(__dirname, '..', '..', grammar.path),\n  }));\n}\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/graphql-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('source.graphql grammar', () => {\n  const scope = 'source.graphql';\n\n  it('should tokenize a simple query', async () => {\n    const result = await tokenizeFile('__fixtures__/query.graphql', scope);\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize an advanced query', async () => {\n    const result = await tokenizeFile(\n      '__fixtures__/kitchen-sink.graphql',\n      scope,\n    );\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize an advanced schema', async () => {\n    const result = await tokenizeFile(\n      '__fixtures__/StarWarsSchema.graphql',\n      scope,\n    );\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/js-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('inline.graphql grammar', () => {\n  const scope = 'inline.graphql';\n\n  it('should tokenize a simple typescript file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.ts', scope);\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize a simple ecmascript file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.js', scope);\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize a simple vue sfc file', async () => {\n    const result = await tokenizeFile('__fixtures__/test-sfc.vue', scope);\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize a simple vue sfc comp file', async () => {\n    const result = await tokenizeFile('__fixtures__/test-sfc-comp.vue', scope);\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize a simple svelte file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.svelte', scope);\n    expect(result).toMatchSnapshot();\n  });\n  it('should tokenize a simple astro file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.astro', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/markdown-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('inline.graphql.markdown.codeblock grammar', () => {\n  const scope = 'inline.graphql.markdown.codeblock';\n\n  it('should tokenize a simple markdown file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.md', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n\ndescribe('inline.graphql.markdown.codeblock grammar js', () => {\n  const scope = 'inline.graphql.markdown.codeblock';\n\n  it('should tokenize a markdown file with javascript & typescript', async () => {\n    const result = await tokenizeFile('__fixtures__/test-js.md', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/php-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('inline.graphql.php grammar', () => {\n  const scope = 'inline.graphql.php';\n\n  it('should tokenize a simple php file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.php', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/python-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('inline.graphql.python grammar', () => {\n  const scope = 'inline.graphql.python';\n\n  it('should tokenize a simple python file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.py', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/reason-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('inline.graphql.reason grammar', () => {\n  const scope = 'inline.graphql.re';\n\n  it('should tokenize a simple reasonML file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.re', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/tests/scala-grammar.spec.ts",
    "content": "import { tokenizeFile } from './__utilities__/utilities';\n\ndescribe('inline.graphql.scala grammar', () => {\n  const scope = 'inline.graphql.scala';\n\n  it('should tokenize a simple scala file', async () => {\n    const result = await tokenizeFile('__fixtures__/test.scala', scope);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/vscode-graphql-syntax/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    globals: true,\n    setupFiles: ['./tests/__utilities__/serializer.ts'],\n    include: ['**/*.spec.ts'],\n  },\n});\n"
  },
  {
    "path": "resources/README.md",
    "content": "# Typescript Configs\n\n`.build.*` - used for project references `.base.*` - used for extends for\ndownstream tsconfig files\n"
  },
  {
    "path": "resources/babel.config.js",
    "content": "module.exports = {\n  sourceMaps: true,\n  presets: [\n    [require.resolve('@babel/preset-env')],\n    require.resolve('@babel/preset-react'),\n  ],\n  plugins: [\n    require.resolve('@babel/plugin-proposal-class-properties'),\n    require.resolve('@babel/plugin-transform-class-static-block'),\n  ],\n};\n"
  },
  {
    "path": "resources/custom-words.txt",
    "content": "//   short for \"developer experience\":\n//   short for \"maintainers\":\n//   short for \"platform as a service\":\n//   these pop up when writing \"GraphQL___\"\n// (user-)names\n// abbreviations\n// companies and organizations\n// cspell en-us/en-gb edgecases?\n// fonts\n// identifiers used in code and configs\n// locations\n// other\n// other languages\n// packages and tools\n// phonetic notation\nˈɡrafək\nacao\nacmerc\naivazis\nakshat\nalexey\nalok\namfoss\narchitecting\nargparse\narminio\narrayish\narthurgeron\nasiandrummer\nastro\nastrojs\naumy\nAutopurge\nbehaviour\nbenjie\nbinti\nblockstring\nbobbybobby\nborggreve\nbram\nbrowserslistrc\ncalar\nchainable\nchangesets\nclsx\ncodebases\ncodegen\ncodemirror\ncodesandbox\ncodespaces\ncodicon\ncolmena\ncombobox\ncshaver\ndedenting\ndelivr\ndevx\ndhanani\ndima\ndirpath\ndivy\nDivyendu\ndivyenduz\ndompurify\ndotan\ndotansimha\nedcore\nenvrc\nesbuild\nestree\nexeca\nexfiltrate\nfilesfor\nfira\nfirecamp\nflowtests\nfoldgutter\nfoldmarker\ngdezerno\nghapi\ngillam\ngivatayim\ngoldshtein\ngoncharov\ngrafbase\ngraphi\ngraphile\nGraphiQL\ngraphqlconfig\ngraphqlrc\ngraphqls\nharshith\nheadlessui\nheyenbrock\nhola\nhtmling\nhurrell\nhyohyeon\nimportmap\nical\nimolorhe\ninno\nintellij\ninvalidchar\njammu\njeong\njiti\njonathanawesome\njsdelivr\nkumar\nlanguageservice\nleebyron\nLeko\nLekoArts\nlezer\nlinenumber\nlinenumbers\nlinkify\nlistbox\nlightningcss\nlistvalues\nlightningcss\nlostplan\nmaint\nmanypkg\nmarko\nmatchingbracket\nmedellín\nmenlo\nmeros\nmiddlewares\nmockfs\nmodulemap\nnauroze\nnewhope\nnextjs\nnishchit\nnocheck\nnocursor\nnonmatchingbracket\nnovvum\nnowdoc\nnrtbf\nnullthrows\nnulltype\nnvim\nobjectvalues\nonig\nooops\norche\norta\noutdir\noutlineable\novsx\npaas\npabbati\npicomatch\npieas\npnpm\npostbuild\npratap\nprebuild\nprettierignore\nproto\nqlapi\nqlid\nqlide\nquasis\nractive\nrandomthing\nravikoti\nresi\nresizer\nrikki\nroadmap\nroboto\nrodionov\nrohit\nrunmode\nruntimes\nsaihaj\nsaihajpreet\nscheer\nschulte\nschuster\nsearchcursor\nselectionset\nsfc's\nsgrove\nsimha\nsingleline\nsnyk\nsocker\nsonarjs\nsorare\nsquirrelly\nstonexer\nstreamable\nsubword\nsuchanek\nsvgr\ntanay\ntanaypratap\ntestid\ntestonly\ntherox\nthomasheyenbrock\ntimsuchanek\ntokenizes\ntsup\ntypeahead\ntypeaheads\ntypedoc\ntypeof\nturbopack\nunfocus\nunnormalized\nunparsable\nunsubscribable\nuncurried\nurigo\nurql\nusememo\nvash\nvite\nvitejs\nvitest\nvizag\nvsix\nwebp\nwebsockets\nwgutils\nwincent\nwonka\nyoshiakis\nzustand\nzdravo\nЗдорово\nأهلاً\nسلام\nहेलो\n"
  },
  {
    "path": "resources/patch-monaco-editor-type.mjs",
    "content": "import fs from 'node:fs';\nimport path from 'node:path';\n\nconst filePath = path.resolve(\n  './packages/monaco-graphql/esm/monaco-editor.d.ts',\n);\n\nconst newContent = fs\n  .readFileSync(filePath, 'utf8')\n  .replace('/esm/vs/editor/edcore.main.js', '');\n\nfs.writeFileSync(filePath, newContent);\n\nconsole.log(\n  `[patch-monaco-editor-type] Updated \"${path.relative(process.cwd(), filePath)}\"`,\n);\n"
  },
  {
    "path": "resources/patches/@changesets+assemble-release-plan+6.0.3.patch",
    "content": "diff --git a/node_modules/@changesets/assemble-release-plan/dist/changesets-assemble-release-plan.cjs.js b/node_modules/@changesets/assemble-release-plan/dist/changesets-assemble-release-plan.cjs.js\nindex 60427457c887f2d72168fecec83d79088c68e3a4..07565f3336140470e8ea0d7c1a9b09586f8e946e 100644\n--- a/node_modules/@changesets/assemble-release-plan/dist/changesets-assemble-release-plan.cjs.js\n+++ b/node_modules/@changesets/assemble-release-plan/dist/changesets-assemble-release-plan.cjs.js\n@@ -299,7 +299,7 @@ function shouldBumpMajor({\n   // we check if it is a peerDependency because if it is, our dependent bump type might need to be major.\n   return depType === \"peerDependencies\" && nextRelease.type !== \"none\" && nextRelease.type !== \"patch\" && ( // 1. If onlyUpdatePeerDependentsWhenOutOfRange set to true, bump major if the version is leaving the range.\n   // 2. If onlyUpdatePeerDependentsWhenOutOfRange set to false, bump major regardless whether or not the version is leaving the range.\n-  !onlyUpdatePeerDependentsWhenOutOfRange || !semverSatisfies__default[\"default\"](incrementVersion(nextRelease, preInfo), versionRange)) && ( // bump major only if the dependent doesn't already has a major release.\n+  !onlyUpdatePeerDependentsWhenOutOfRange) && ( // bump major only if the dependent doesn't already has a major release.\n   !releases.has(dependent) || releases.has(dependent) && releases.get(dependent).type !== \"major\");\n }\n \n@@ -396,7 +396,7 @@ function matchFixedConstraint(releases, packagesByName, config) {\n \n function getPreVersion(version) {\n   let parsed = semverParse__default[\"default\"](version);\n-  let preVersion = parsed.prerelease[1] === undefined ? -1 : parsed.prerelease[1];\n+  let preVersion = parsed?.prerelease[1] === undefined ? -1 : parsed.prerelease[1];\n \n   if (typeof preVersion !== \"number\") {\n     throw new errors.InternalError(\"preVersion is not a number\");\n"
  },
  {
    "path": "resources/tsconfig.base.cjs.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"target\": \"es6\",\n    \"module\": \"commonjs\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"resolveJsonModule\": true,\n    \"sourceMap\": true,\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"downlevelIteration\": true,\n    \"removeComments\": true,\n    \"strict\": true,\n    \"jsx\": \"react\",\n    \"noImplicitAny\": true,\n    \"noImplicitReturns\": false,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noUnusedParameters\": true,\n    \"noUnusedLocals\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"lib\": [\"dom\", \"es2017\", \"es2018\", \"es2021\", \"esnext\"],\n    \"types\": [\"node\", \"jest\"],\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\n    \"**/__tests__/**\",\n    \"**/dist/**.*\",\n    \"**/*.spec.ts\",\n    \"**/*.spec.js\",\n    \"**/*-test.ts\",\n    \"**/*-test.js\",\n    \"**/node_modules/**\"\n  ]\n}\n"
  },
  {
    "path": "resources/tsconfig.base.esm.json",
    "content": "{\n  \"extends\": \"./tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"module\": \"ESNext\",\n    \"target\": \"es6\"\n  }\n}\n"
  },
  {
    "path": "resources/tsconfig.build.cjs.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true\n  },\n  \"files\": [],\n  \"include\": [],\n  \"references\": [\n    {\n      \"path\": \"../packages/monaco-graphql\"\n    },\n    {\n      \"path\": \"../packages/codemirror-graphql\"\n    },\n    {\n      \"path\": \"../packages/cm6-graphql\"\n    },\n    {\n      \"path\": \"../packages/graphql-language-service\"\n    },\n    {\n      \"path\": \"../packages/graphql-language-service-server\"\n    },\n    {\n      \"path\": \"../packages/graphql-language-service-cli\"\n    },\n    {\n      \"path\": \"../packages/vscode-graphql\"\n    },\n    {\n      \"path\": \"../packages/vscode-graphql-execution\"\n    }\n  ]\n}\n"
  },
  {
    "path": "resources/tsconfig.build.esm.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true\n  },\n  \"files\": [],\n  \"include\": [],\n  \"references\": [\n    {\n      \"path\": \"../packages/cm6-graphql/tsconfig.esm.json\"\n    },\n    {\n      \"path\": \"../packages/codemirror-graphql/tsconfig.esm.json\"\n    },\n    {\n      \"path\": \"../packages/monaco-graphql/tsconfig.esm.json\"\n    },\n    {\n      \"path\": \"../packages/graphql-language-service/tsconfig.esm.json\"\n    },\n    {\n      \"path\": \"../packages/graphql-language-service-server/tsconfig.esm.json\"\n    },\n    {\n      \"path\": \"../packages/graphql-language-service-cli/tsconfig.esm.json\"\n    }\n  ]\n}\n"
  },
  {
    "path": "scripts/canary-release.js",
    "content": "/* eslint-disable */\nconst semver = require('semver');\nconst { execa } = import('execa');\nconst cp = require('child_process');\nconst { basename } = require('path');\n\nconst { read: readConfig } = require('@changesets/config');\nconst readChangesets = require('@changesets/read').default;\nconst assembleReleasePlan =\n  require('@changesets/assemble-release-plan').default;\nconst applyReleasePlan = require('@changesets/apply-release-plan').default;\nconst { getPackages } = require('@manypkg/get-packages');\n\nfunction getNewVersion(version, type) {\n  const gitHash = cp\n    .spawnSync('git', ['rev-parse', '--short', 'HEAD'])\n    .stdout.toString()\n    .trim();\n\n  return semver.inc(version, `pre${type}`, true, 'canary-' + gitHash);\n}\n\nconst execOpts = { stderr: 'inherit', stdout: 'inherit' };\n\nconst git = async (...commands) => execa('git', commands, execOpts);\n\n// TODO: canary --pre releases for vscode ?\n//\n// async function preReleaseVSCode(version) {\n//   try {\n//     await execa(\n//       'yarn',\n//       ['workspace', `vscode-graphql`, 'run', 'release', '--pre'],\n//       execOpts,\n//     );\n//   } catch (err) {\n//     console.error('vscode-graphql pre-release failed on publish:', err);\n//     process.exit(1);\n//   }\n//   try {\n//     await git('add', `packages/vscode-graphql/package.json`);\n//     await git('commit', `-m`, `pre-release \\`vscode-graphql@${version}\\``);\n//     await git('push');\n//   } catch (err) {\n//     console.error('vscode-graphql pre-release failed on git command:', err);\n//     process.exit(1);\n//   }\n// }\n\nfunction getRelevantChangesets(baseBranch) {\n  const comparePoint = cp\n    .spawnSync('git', ['merge-base', `origin/${baseBranch}`, 'HEAD'])\n    .stdout.toString()\n    .trim();\n  const listModifiedFiles = cp\n    .spawnSync('git', ['diff', '--name-only', comparePoint])\n    .stdout.toString()\n    .trim()\n    .split('\\n');\n\n  const items = listModifiedFiles\n    .filter(f => f.startsWith('.changeset'))\n    .map(f => basename(f, '.md'));\n\n  return items;\n}\n\nasync function updateVersions() {\n  const cwd = process.cwd();\n  const packages = await getPackages(cwd);\n  const config = await readConfig(cwd, packages);\n  const modifiedChangesets = getRelevantChangesets(config.baseBranch);\n  const changesets = (await readChangesets(cwd)).filter(change =>\n    modifiedChangesets.includes(change.id),\n  );\n\n  let vscodeRelease = false;\n\n  if (changesets.length === 0) {\n    console.warn(\n      `Unable to find any relevant package for canary publishing. Please make sure changesets exists!`,\n    );\n    process.exit(1);\n  } else {\n    const releasePlan = assembleReleasePlan(\n      changesets,\n      packages,\n      config,\n      [],\n      false,\n    );\n\n    if (releasePlan.releases.length === 0) {\n      console.warn(\n        `Unable to find any relevant package for canary releasing. Please make sure changesets exists!`,\n      );\n      process.exit(1);\n    } else {\n      for (const release of releasePlan.releases) {\n        if (\n          release.name.includes('vscode-graphql') &&\n          release.changesets?.type !== 'none'\n        ) {\n          // vsce pre-release only accept x.y.z versions\n          release.newVersion = vscodeRelease = semver.patch(release.oldVersion);\n        }\n        if (release.type !== 'none') {\n          release.newVersion = getNewVersion(release.oldVersion, release.type);\n        }\n      }\n\n      await applyReleasePlan(\n        releasePlan,\n        packages,\n        {\n          ...config,\n          commit: false,\n        },\n        false,\n        true,\n      );\n      // TODO: get this working\n      // if(vscodeRelease) {\n      //   await preReleaseVSCode(vscodeRelease)\n      // }\n    }\n  }\n}\n\nupdateVersions()\n  .then(() => {\n    console.info(`Done!`);\n  })\n  .catch(err => {\n    console.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "scripts/prepublish.sh",
    "content": "# Because of a long-running npm issue (https://github.com/npm/npm/issues/3059)\n# prepublish runs after `npm install` and `npm pack`.\n# In order to only run prepublish before `npm publish`, we have to check argv.\nif node -e \"process.exit(($npm_config_argv).original.length > 0 && ($npm_config_argv).original[0].indexOf('pu') === 0)\"; then\n  exit 0;\nfi\n\n# Publishing to NPM is currently supported by Travis CI, which ensures that all\n# tests pass first and the deployed module contains the correct file structure.\n# In order to prevent inadvertently circumventing this, we ensure that a CI\n# environment exists before continuing.\nif [ \"$CI\" != true ]; then\n  echo \"\\n\\n\\n  \\033[101;30m Only CI can publish to NPM. \\033[0m\" 1>&2;\n  echo \"  Ensure git is left is a good state by backing out any commits and deleting any tags.\" 1>&2;\n  echo \"  Then read CONTRIBUTING.md to learn how to publish to NPM.\\n\\n\\n\" 1>&2;\n  exit 1;\nfi;\n\nyarn lint && yarn build && yarn build-bundles && yarn test && yarn e2e;\n"
  },
  {
    "path": "scripts/renameFileExtensions.js",
    "content": "const copy = require('copy');\nconst path = require('node:path');\nconst fs = require('node:fs');\nconst mkdirp = require('mkdirp');\nconst crypto = require('node:crypto');\nconst rimraf = require('rimraf');\n\nconst [, , src, dest, destExtension] = process.argv;\nif (!src || !dest || !destExtension) {\n  console.error(\n    \"\\nMissing arguments.\\n\\nUsage:\\nnode renameFileExtensions.js './dist/**/*.js' './dest-dir' .new.extension.js\",\n  );\n  process.exit(1);\n}\n\nconst coveragePath = path.join(__dirname, '../coverage');\n\nconst tempRenamePath = path.join(\n  coveragePath,\n  '.temp',\n  crypto.randomBytes(20).toString('hex'),\n);\n\nif (fs.existsSync(tempRenamePath)) {\n  rimraf.sync(tempRenamePath);\n}\n\nconst tempPath = mkdirp.sync(tempRenamePath);\n\nif (tempPath) {\n  copy(src, tempRenamePath, (error, files) => {\n    if (error) {\n      throw error;\n    }\n    for (const file of files) {\n      if (file.dest) {\n        const srcExt = path.parse(file.dest).ext;\n        const destinationPath = path.resolve(\n          file.dest\n            .replace(srcExt, destExtension) // rewrite extension\n            .replace(tempRenamePath, dest), // and destination path\n        );\n\n        mkdirp.sync(path.dirname(destinationPath));\n        // move the files and rename them... by renaming them :)\n        fs.renameSync(file.dest, destinationPath);\n      }\n    }\n    // should cleanup temp directory after renaming\n    // every file to the destination path\n    rimraf.sync(tempRenamePath);\n  });\n} else {\n  throw new Error(`Could not generate temporary path\\n${tempRenamePath}`);\n}\n"
  },
  {
    "path": "scripts/set-resolution.js",
    "content": "const { readFile, writeFile } = require('node:fs/promises');\nconst path = require('node:path');\n\nasync function setResolution() {\n  const [, , tag] = process.argv;\n  if (!tag) {\n    throw new Error('no tag provided');\n  }\n\n  const [package, version] = tag.split('@');\n  if (!package || !version) {\n    throw new Error(`Invalid tag ${tag}`);\n  }\n  const pkgPath = path.resolve(path.join(process.cwd(), 'package.json'));\n  const pkg = JSON.parse((await readFile(pkgPath, 'utf-8')).toString());\n\n  if (pkg.resolutions) {\n    pkg.resolutions[package] = version;\n  } else {\n    pkg.resolutions = { [package]: version };\n  }\n  await writeFile(pkgPath, JSON.stringify(pkg, null, 2), 'utf-8');\n}\n\nsetResolution()\n  .then()\n  .catch(err => {\n    console.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"./resources/tsconfig.base.cjs.json\",\n  \"compilerOptions\": {\n    \"composite\": true\n  },\n  \"files\": [],\n  \"references\": [\n    {\n      \"path\": \"resources/tsconfig.build.esm.json\"\n    },\n    {\n      \"path\": \"resources/tsconfig.build.cjs.json\"\n    }\n  ]\n}\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"globalDependencies\": [\"yarn.lock\", \"resources/patches/*\"],\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\n        // Run `build` in workspaces I depend on first\n        \"^build\"\n      ],\n      // Cache all files emitted to the packages's directories\n      \"outputs\": [\"dist/**\"]\n    },\n    \"dev\": {\n      \"dependsOn\": [\n        // Run `build` in workspaces I depend on first\n        \"^build\"\n      ],\n      \"cache\": false\n    },\n    \"types:check\": {\n      \"dependsOn\": [\n        // Run `build` in workspaces I depend on first\n        \"^build\"\n      ],\n      \"outputs\": [\"dist/**\"]\n    },\n    \"test\": {\n      \"outputs\": [\"dist/**\"]\n    }\n  }\n}\n"
  },
  {
    "path": "typedoc.json",
    "content": "{\n  \"name\": \"GraphQL Official LSP Documentation\",\n  \"theme\": \"default\",\n  \"mode\": \"modules\",\n  \"out\": \"packages/graphiql/typedoc\",\n  \"inputFiles\": [\n    \"**/node_modules/vscode*/**\",\n    \"**/node_modules/@types/node/**\"\n  ],\n  \"exclude\": \"**/__tests__/**,*.spec.*,**/*-test.*,**/esm/**,**/dist/**,**/node_modules/**,packages/graphiql-2-rfc-*/**\",\n  \"excludePrivate\": true,\n  \"excludeNotExported\": true,\n  \"external-modulemap\": \".*/packages/([\\\\w\\\\-_]+)/\",\n  \"ignoreCompilerErrors\": true,\n  \"includeDeclarations\": true,\n  \"preserveConstEnums\": true,\n  \"readme\": \"./README.md\"\n}\n"
  },
  {
    "path": "wg.config.js",
    "content": "// @ts-check\n\n/** @type {import('wgutils').Config} */\nconst config = {\n  name: 'GraphiQL WG',\n  repoUrl: 'https://github.com/graphql/graphiql',\n  repoSubpath: 'working-group',\n  videoConferenceDetails: `https://zoom.us/j/760146252\n  - _Password:_ graphiql`,\n  liveNotesUrl:\n    'https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing',\n  timezone: 'UTC',\n  frequency: 'monthly',\n  nth: 2,\n  weekday: 'Tu', // M, Tu, W, Th, F, Sa, Su\n  time: '16:00-17:00', // 24-hour clock, range\n  attendeesTemplate: `\\\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n`,\n  agendasFolder: 'agendas',\n  dateAndTimeLocations: 'p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152',\n  description: `\\\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n`,\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "working-group/README.md",
    "content": "# GraphiQL & GraphQL LSP Working Group\n\nThe GraphiQL and GraphQL Working Group focuses on fielding and fostering proposals and specifications for plugin interfaces and other user/developer-facing interfaces, as well as overall features, decisions about lifecycle, etc. This doesn't mean we will make decisions about every PR we merge, but it's a chance to have stake in the roadmap and how commonly used interfaces change.\n\nAll users of GraphiQL, the LSP, GraphQL IDE extensions, developer users, all GraphQL community members are welcome. There is no official list of members, though you can add yourself to the monthly meeting agendas (see below)\n\nThis working group is focused on usage of the entire monorepo - GraphiQL and plugins, codemirror-graphql, to the new monaco mode, the LSP service interface, the LSP server and the LSP server CLI.\n\n## Monthly Working Group Meeting\n\n> **Second Tuesday of Every month at 16GMT/12EST** [(GraphQL Foundation Google Calendar)](https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com)\n\nThese are monthly sessions designed to work similarly to the official `graphql/graphql-wg` working group. The goal is decision making, setting specifications and navigating feature proposals for our shared graphql web and desktop IDE experiences as a community.\n\nMany of the underlying packages used for graphql web/desktop IDE tooling are in this very monorepo!\n\nIn the [`'agendas'`](/working-group/agendas) directory you can introduce PRs to add yourself as an attendee to each agenda, and optionally add an agenda item or two.\n\n## Get Involved\n\nYou can also find us on [discord](https://discord.gg/NP5vbPeUFp), in github via issues or PRs!\n\nSee the Community section at the bottom of [the root level readme](../README.md) for more information.\n\nAside from these two recurring zoom sessions, those two places in public (discord & github) are where the working group activity happens.\n"
  },
  {
    "path": "working-group/agendas/2019/2019-05-14.md",
    "content": "The GraphiQL Working Group will begin meeting to plan work for GraphiQL. The meetings will be modelled on the GraphQL Working Group meetings, but will be less formalized as this is not a spec body, just a working group for re-building a contributor community, prioritizing every few weeks and deciding on what new features we want in GraphiQL.\n\n- **Video Conference Link:** https://zoom.us/j/428907595\n- **Live Notes:**\n- **Date & Time:** May 14th 2019 16:00 - 19:00 UTC\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n- Orta (@orta) - ex-Artsy\n- Lee Byron (@leebyron) - GraphQL Foundation, Robin Hood\n- Benjie Gillam (@benjie) - PostGraphile\n- Sean Grove (@sgrove) - OneGraph Explorer\n- Jake Dawkins (@JakeDawkins) - Apollo\n- Trevor Scheer (@trevor-scheer) - Apollo\n- Tanay Pratap (@tanaypratap) - Microsoft\n- Alexey Rodionov (@FluorescentHallucinogen) - GdeZerno\n- Samuel (@imolorhe) - Altair Client\n- Rohit Ravikoti (@rohit-ravikoti) - Novvum\n- Hyo Jeong (@asiandrummer) - Facebook\n- Rikki Schulte (@acao) - Independent Maintainer\n\n## Agenda\n\n- Who has the npm keys? [#818](https://github.com/graphql/graphiql/issues/818)\n- How will we organize/delegate work for GraphiQL WG\n- Who will review work for new contributors to GraphiQL\n- Should codemirror-graphql work be inclusive in the GraphiQL WG\n- Should we update Contributing.md and how?\n- (potentially) triage existing issues, PRs\n- (potentially) decide on what needs to be accomplished before beginning new UI design\n- (from Hyo) Transferring ownership to GraphQL foundation\n"
  },
  {
    "path": "working-group/agendas/2019/2019-06-18.md",
    "content": "The 2nd GraphiQL Working Group meeting will involve updates on current progress, further discussion of the next major version of GraphiQL in terms of plugin system, desired features, and discussing options in terms of the language server and codemirror/monaco, etc\n\n- **Video Conference Link:** https://zoom.us/j/300773607\n- **Live Notes:**\n- **Date & Time:** [June 18th 2019 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2019&month=6&day=18&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n| Name                 | Organization         | Location              |\n| -------------------- | -------------------- | --------------------- |\n| Rikki Schulte        | GraphiQL Maint. Team | Cleveland, OH, US     |\n| Alec Aivazis         | Ind. Contributor     | Los Angeles, CA, US   |\n| ~Orta Therox~        | ~Microsoft~          | ~Redmond, US~         |\n| Nigel Schuster       | Facebook             | New York, NY, US      |\n| Josh Lear            | Facebook             | Menlo Park, CA, US    |\n| Tanay Pratap         | Microsoft            | Bangalore, India      |\n| Benjie Gillam        | GraphiQL Maint. Team | Southampton, UK       |\n| Trevor Scheer        | Apollo               | San Francisco, CA, US |\n| Jake Dawkins         | Apollo               | New York, NY, US      |\n| _ADD YOUR NAME HERE_ | _COMPANY / ORG_      | _WHERE YOU ARE_       |\n\n## Agenda\n\n1. Introductions\n1. Updates\n   - Access\n   - Licensing\n   - Monorepo\n1. Plugin System, Separate package for reusable UI\n1. Language Server (Microsoft LSP?) & Codemirror or Monaco?\n1. Propose using ISO8601 for wg agenda file naming ;)\n"
  },
  {
    "path": "working-group/agendas/2019/2019-08-21.md",
    "content": "The 3rd GraphiQL Working Group meeting will involve updates on current progress with graphiql 0.13.x, codemirror-graphql-2 and graphql-language-service-\\* 2.0.x releases. We've also introduced a new approach for extending the LSP, starting with schema loading.\nFurther discussion of the next major version of GraphiQL and progress with the IDE ecosystem in terms of an official vscode-graphql-language-service, graphql-monaco, and an official vscode-extension.\n\n- **Video Conference Link:** https://zoom.us/s/153260376\n- **Live Notes:**\n- **Date & Time:** [August 21st 2019 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2019&month=8&day=21&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n| Name                 | Organization         | Location              |\n| -------------------- | -------------------- | --------------------- |\n| Rikki Schulte        | GraphiQL Maint. Team | Cleveland, OH, US     |\n| Trevor Scheer        | Apollo               | San Francisco, CA, US |\n| Benjie Gillam        | GraphiQL Maint. Team | Southampton, UK       |\n| Orta Therox.         | Microsoft            | NYC, US               |\n| _ADD YOUR NAME HERE_ | _COMPANY / ORG_      | _WHERE YOU ARE_       |\n\n## Agenda\n\n1. Introductions\n"
  },
  {
    "path": "working-group/agendas/2020/2020-03-10.md",
    "content": "# 4th GraphiQL Working Group\n\nIt's been a while! We have a lot to catch up on:\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Live Notes:**\n- **Date & Time:** [March 10th 2020 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2020&month=3&day=10&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n| Name           | Organization      | Location          |\n| -------------- | ----------------- | ----------------- |\n| Rikki Schulte  | GraphiQL, GraphQL | Cleveland, OH, US |\n| Benjie Gillam  | Graphile          | Southampton, UK   |\n| Orta Therox    | Self / Microsoft  | NYC, US           |\n| Justin Bennett | Artsy             | NYC, US           |\n| Sean Grove     | OneGraph          | SF, US            |\n| Alok Kumar     | Student           | Jammu, India      |\n\n## Agenda\n\n1. Introductions\n2. re-architecting GraphiQL\n3. GraphiQL Plugins\n4. Redesign implementation\n5. Surprise Item 😀\n"
  },
  {
    "path": "working-group/agendas/2020/2020-04-14.md",
    "content": "# 5th GraphiQL Working Group\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Live Notes:**\n- **Date & Time:** [April 14th 2020 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2020&month=4&day=14&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to add to this document, we ignore prettier for attendees and agenda section. this will prevent CI breakages if you accidentally add extra whitespace, etc. enjoy!-->\n<!-- prettier-ignore-start -->\n\n\n| Name                 | Organization      | Location                |\n| -------------------- | ----------------- | ------------------------|\n| Rikki Schulte        | GraphiQL, GraphQL | Cleveland, OH, US       |\n| Akshat Jain          | IIT Patna         | Rajasthan, India        |\n| Cristina Shaver      | Airbnb            | San Francisco, CA, US   |\n| Nishchit Dhanani     | Firecamp          | Gujarat, India.         |\n| Alok Kumar           | Student           | Jammu, India            |\n| Nick Cuthbert        | Stitch            | Cape Town, South Africa |\n| Bram Borggreve       | Colmena           | Medellín, Colombia      |\n| Benjie Gillam        | Graphile          | Southampton, UK         |\n| Ryan Walker          | UrbanCode         | Cleveland, OH, US       |\n| _ADD YOUR NAME HERE_ | _COMPANY / ORG_   | _WHERE YOU ARE_         |\n\n## Agenda\n\n> This month it's all about the GraphiQL Monaco/Redesign/Plugins effort!\n\n- Introductions\n- Brief discussion of Playground transition as it relates to new features and plugin API\n- Review Plugins Meta Issue: https://github.com/graphql/graphiql/pull/983\n- Demonstrate Monaco Mode RFC PR: https://github.com/graphql/graphiql/pull/1459\n- Demonstrate/Discuss GraphiQL Context Rewrite RFC PR: https://github.com/graphql/graphiql/pull/1468\n  - IMPORTANT NOTE: this PR will be the base for other PRs for redesign, and is the first draft of the underlying APIs that plugins would consume via context/hooks! Please give feedback and start opening your own PRs!\n- Decide how we will begin to organize & address Plugin API Proposals, RFCs.\n  - Should actual Plugin Proposals and RFCs be handled differently from Plugin API Proposals and RFCs?\n  - See [this planning project](https://github.com/graphql/graphiql/projects/10), though many feature requests have not been added to this yet.\n  - all issues/PRs labelled 'potential plugin' (and more) should be reviewed, as well as graphql playground features to adopt\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2020/2020-05-21.md",
    "content": "# 6th GraphiQL Working Group\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Live Notes:**\n- **Date & Time:** [May 21th 2020 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2020&month=5&day=21&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | Organization      | Location            |\n| -------------------- | ----------------- | ------------------- |\n| Rikki Schulte        | GraphiQL, GraphQL | Cleveland, OH, US   |\n| Ali Nauroze          | PIEAS             | Islamabad, ICT, Pak |\n| Nishchit Dhanani     | Firecamp          | Surat, GJ, India    |\n| Harshith Pabbati     | amFOSS            | Vizag, AP, India    |\n\n## Agenda\n\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2021/2021-10-12.md",
    "content": "# 7th GraphiQL Working Group\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Live Notes:** https://hackmd.io/@patrickpy/HkKEO5WHt/edit\n- **Date & Time:** [October 12th 2021 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | Organization      | Location            |\n| -------------------- | ----------------- | ------------------- |\n| Saihajpreet Singh    | The Guild         | Minnesota, United States|\n| Dotan Simha          | The Guild         | Givatayim, Israel   |\n| ...                  | ....              | ...                 |\n\n\n## Agenda\n\n1. GraphiQL v2\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-01-11.md",
    "content": "# 8th GraphiQL Working Group\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Live Notes:** https://docs.google.com/document/d/1ZPSBIpvALncgfNXaoYNhYemUbDK7zDlLdXsdyDH5ZW4/edit?usp=sharing\n- **Date & Time:** [January 11th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | Organization      | Location            |\n| -------------------- | ----------------- | ------------------- |\n| Rikki Schulte        | Research Gate     | Berlin, Germany     |\n| Michelle Garrett     | Twitter           | London, UK          |\n| Tim Suchanek         | GraphCDN          | Berlin, Germany     |\n\n\n\n## Agenda\n\n1. How to make contributions accessible\n2. Decision making processes\n3. Roadmap\n\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-02-22-monaco.md",
    "content": "## Ad-Hoc `monaco-graphql` WG pairing session re: SDL editing\n\n### In Attendance\n\n- [@cshaver](github.com/cshaver)\n- [@acao](github.com/acao)\n\n### Agenda\n\n- Review bugs with an SDL editing implementation of `monaco-graphql`\n- Determine what RFCs we can present to make this problem easier to solve\n\n### Minutes\n\nwe looked at:\n\n- confirmed on the latest vite example, too many workers is triggered by schema changes\n- look at how schema is shared with the worker, since this can change often\n  - e.g. innoDB, cache api\n\nfound some bugs:\n\n- (monaco-editor) bg missing on autocomplete box - need to create a bug ticket for them!\n- repro'd https://github.com/graphql/graphiql/pull/2171/files\n- monaco-react webpack example has some bugs that vite doesn't\n  - would be cool to get a basic cypress test (get model markers from monaco), visual diff testing\n- (monaco?) lots of logs from monarchCommon on parsing directives\n- improve webpack example config, so the web workers output name aren't hashed\n- devx of running examples from root maybe: `yarn run example:<example name>`\n\n### Recording\n\nhttps://www.dropbox.com/s/scsdezmvwor1ico/wholeaugustsoptfree%20on%202022-02-22%2020-13.mp4?dl=0\n"
  },
  {
    "path": "working-group/agendas/2022/2022-03-08.md",
    "content": "# 9th GraphiQL Working Group\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** https://docs.google.com/document/d/1Jz0STnSDiEjFTj6mGzvdjoQ2VR01o5it26GgiBC4j5I/edit?usp=sharing\n- **Date & Time:** [March 8th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | Organization      | Location            |\n| -------------------- | ----------------- | ------------------- |\n| Tim Suchanek         | GraphCDN          | Berlin, Germany     |\n| ...                  | ....              | ...                 |\n\n\n## Agenda\n\n1. Review v2 design\n2. Decide v2 minimal scope\n3. Plan implementation\n - Schedule pair programming\n - Distribute work\n - What is needed missing from the toolkit?\n4. Plan communication to community\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-04-12.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – April 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** [Google Docs](https://docs.google.com/document/d/1JoXLt9f9G3u-pZ0J7Xeii23RLpGHIf_lqeoMWGcKXw4/edit?usp=sharing)\n- **Date & Time:** [April 12th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Tim)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Tim)\n1. Determine volunteers for note taking (1m, Tim)\n1. Review agenda (2m, Tim)\n1. Quick [design](https://github.com/graphql/graphiql/discussions/2216) update (5m, Tim)\n1. Planning the path to v2 (40m, Tim)\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-05-10.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – May 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** https://docs.google.com/document/d/1328tJZmU3p4oRXjkt053DHuLDD4g71h7nfn1XRJ8DI8/edit?usp=sharing\n- **Date & Time:** [May 10th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n| Thomas Heyenbrock    | @thomasheyenbrock | GraphCDN          | Munich, DE          |\n| Jonathan Brennan     | @jonathanawesome  | Independent       | Austin, US          |\n\n\n## Agenda\n\n1. Updates on [Path to V2](https://github.com/graphql/graphiql/issues/2328) by Thomas and Tim (10min)\n1. Updates from Jonathan (20min)\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-06-14.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – June 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:** [June 14th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-07-12.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – July 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** [Google Docs](https://docs.google.com/document/d/184pean6xLSixwvf0wT3wUdndzzMXiDtoRCDQbrzl1qs/edit)\n- **Date & Time:** [July 12th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | Stellate          | Berlin, DE          |\n\n\n## Agenda\n\n1. Jon's prototype (Jon, 30 min)\n2. Path to GraphiQL 2 release (Thomas, 20 min)\n3. Docs site for mono repo (Rikki, 10 min)\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-08-09.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – August 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:** [August 9th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-09-13.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – September 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:** [September 13th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-10-11.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – October 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** [Google Docs](https://docs.google.com/document/d/1IpAwIhfX5gGnqF6CLqkbYwl77VvUJ0LgKsjaktKarzM/edit#)\n- **Date & Time:** [October 11th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-11-08.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – November 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:** [November 8th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2022/2022-12-13.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – December 2022\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:** [December 13th 2022 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting. Please check the agenda the week of the meeting to confirm.\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-01-10.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – January 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [January 10th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=1&day=9&hour=17&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Tim Suchanek         | @timsuchanek      | GraphCDN          | Berlin, DE          |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. Working group meeting schedule/cadence (10min)\n2. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-02-14.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – February 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [February 14th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=2&day=14&hour=17&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. Working group meeting schedule/cadence (2min, Jonathan)\n2. Triage open issues (20min, Jonathan)\n3. Review open PRs (20min, Jonathan)\n4. Status of Monaco editor integration (10min, Jonathan)\n5. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-04-11.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – April 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [April 11th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=4&day=11&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-05-09.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – May 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [May 9th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=5&day=9&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-06-13.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – June 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [June 13th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=6&day=13&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-07-11.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – July 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [July 11th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=7&day=11&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-08-08.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – August 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [August 8th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=8&day=8&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-09-12.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – September 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [September 12th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=9&day=12&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-10-10.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – October 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [October 10th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=10&day=10&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-11-14.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – November 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [November 14th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=11&day=14&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2023/2023-12-12.md",
    "content": "<!--\n\nHello! You're welcome to join our working group meeting and add to the agenda\nby following these three steps:\n\n   1. Add your name to the list of attendees (in alphabetical order).\n\n      - To respect meeting size, attendees should be relevant to the agenda.\n        That means we expect most who join the meeting to participate in\n        discussion. If you'd rather just watch, check out our YouTube[1].\n\n      - Please include the organization (or project) you represent, and the\n        location (including country code[2]) you expect to be located in during\n        the meeting.\n\n      - If you're willing to help take notes, add \"✏️\" after your name\n        (eg. Ada Lovelace ✏). This is hugely helpful!\n\n   2. If relevant, add your topic to the agenda (sorted by expected time).\n\n      - Every agenda item has four parts: 1) the topic, 2) an expected time\n        constraint, 3) who's leading the discussion, and 4) a list of any\n        relevant links (RFC docs, issues, PRs, presentations, etc). Follow the\n        format of existing agenda items.\n\n      - Know what you want to get out of the agenda topic - what feedback do you\n        need? What questions do you need answered? Are you looking for consensus\n        or just directional feedback?\n\n      - If your topic is a new proposal it's likely an \"RFC 0\"[3]. The barrier\n        of entry for documenting new proposals is intentionally low, writing a\n        few sentences about the problem you're trying to solve and the rough\n        shape of your proposed solution is normally sufficient.\n\n        You can create a link for this:\n          - As an issue against the graphiql repo.\n          - As a GitHub discussion in the graphiql repo.\n          - As an RFC document into the rfcs/ folder of the graphiql repo.\n\n   3. Review our guidelines and agree to our Spec Membership & CLA.\n\n      - Review and understand our Spec Membership Agreement, Participation &\n        Contribution Guidelines, and Code of Conduct. You'll find links to these\n        in the first agenda item of every meeting.\n\n      - If this is your first time, our bot will comment on your Pull Request\n        with a link to our Spec Membership & CLA. Please follow along and agree\n        before your PR is merged.\n\n        Your organization may sign this for all of its members. To set this up,\n        please ask operations@graphql.org.\n\nPLEASE TAKE NOTE:\n\n  - By joining this meeting you must agree to the Specification Membership\n    Agreement and Code of Conduct.\n\n  - Meetings are recorded and made available on YouTube[1], by joining you\n    consent to being recorded.\n\n[1] Youtube: https://www.youtube.com/channel/UCERcwLeheOXp_u61jEXxHMA\n[2] Country codes: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes#Current_ISO_3166_country_codes\n[3] RFC stages: https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md#rfc-contribution-stages\n\n-->\n\n# GraphiQL WG – December 2023\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Password:** `graphiql`\n- **Live Notes:** Google Docs\n- **Date & Time:**\n  [December 12th 2023 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2023&month=12&day=12&hour=16&min=0&sec=0&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n- **NOTE:** Meeting date and time may change up to a week before the meeting.\n  Please check the agenda the week of the meeting to confirm.\n\n[calendar]:\n  https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]:\n  https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]:\n  https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | GitHub            | Organization      | Location            |\n| -------------------- | ----------------- | ----------------- | ------------------- |\n| Jonathan Brennan     | jonathanawesome   | Grafbase          | Austin, TX, US      |\n\n\n## Agenda\n\n1. ...\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "working-group/agendas/2024/08-Aug/13-graphiql-wg-august-2024.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — August 2024\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [August 13, 2024, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20240813T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2024/09-Sep/10-graphiql-wg-september-2024.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — September 2024\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [September 10, 2024, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20240910T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2024/10-Oct/08-graphiql-wg-october-2024.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — October 2024\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [October 8, 2024, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20241008T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2024/11-Nov/12-graphiql-wg-november-2024.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — November 2024\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [November 12, 2024, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20241112T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2024/12-Dec/10-graphiql-wg-december-2024.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — December 2024\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [December 10, 2024, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20241210T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2025/01-Jan/14-graphiql-wg-january-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — January 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [January 14, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250114T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2025/02-Feb/11-graphiql-wg-february-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — February 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [February 11, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250211T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n"
  },
  {
    "path": "working-group/agendas/2025/03-Mar/11-graphiql-wg-march-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — March 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [March 11, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250311T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n| Benjie Gillam              | @benjie              | Graphile           | Chandler's Ford, UK      |\n| Dimitri Postolov           | @dimaMachina         | independant        | Paris, France            |\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Review previous meeting's action items (5m, Host)\n   - [Ready for review](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc)\n   - [All open action items (by last update)](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Action+item+%3Aclapper%3A%22+sort%3Aupdated-desc)\n1. Archiving GraphQL Playground (15m, Benjie)\n"
  },
  {
    "path": "working-group/agendas/2025/04-Apr/08-graphiql-wg-april-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — April 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [April 8, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250408T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/05-May/13-graphiql-wg-may-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — May 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [May 13, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250513T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/06-Jun/10-graphiql-wg-june-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — June 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [June 10, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250610T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/07-Jul/08-graphiql-wg-july-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — July 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [July 8, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250708T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/08-Aug/12-graphiql-wg-august-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — August 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [August 12, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250812T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/09-Sep/09-graphiql-wg-september-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — September 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [September 9, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20250909T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/10-Oct/14-graphiql-wg-october-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — October 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [October 14, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20251014T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/11-Nov/11-graphiql-wg-november-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — November 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [November 11, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20251111T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2025/12-Dec/09-graphiql-wg-december-2025.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — December 2025\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [December 9, 2025, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20251209T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2026/01-Jan/13-graphiql-wg-january-2026.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — January 2026\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [January 13, 2026, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20260113T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2026/02-Feb/10-graphiql-wg-february-2026.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — February 2026\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [February 10, 2026, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20260210T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2026/03-Mar/10-graphiql-wg-march-2026.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — March 2026\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [March 10, 2026, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20260310T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2026/04-Apr/14-graphiql-wg-april-2026.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — April 2026\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [April 14, 2026, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20260414T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2026/05-May/12-graphiql-wg-may-2026.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — May 2026\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [May 12, 2026, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20260512T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/agendas/2026/06-Jun/09-graphiql-wg-june-2026.md",
    "content": "| This is an open meeting: To attend, edit and PR this file. (Edit: ✎ above, or press \"e\") |\n| ---------------------------------------------------------------------------------------- |\n\n# GraphiQL WG — June 2026\n\nTo read about the purpose of this subcommittee, please see [the README](../../README.md).\n\n\n- **Date & Time**: [June 9, 2026, 4:00 – 5:00 PM UTC](https://www.timeanddate.com/worldclock/converter.html?iso=20260609T160000&p1=224&p2=24&p3=179&p4=136&p5=37&p6=239&p7=101&p8=152)\n  - View the [calendar][], or subscribe ([Google Calendar][], [ical file][]).\n  - _Please Note:_ The date or time may change. Please check this agenda the\n    week of the meeting to confirm. While we try to keep all calendars accurate,\n    this agenda document is the source of truth.\n- **Video Conference Link**: https://zoom.us/j/760146252\n  - _Password:_ graphiql\n- **Live Notes**: [Live Notes][]\n\n[calendar]: https://calendar.google.com/calendar/embed?src=linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com\n[google calendar]: https://calendar.google.com/calendar?cid=bGludXhmb3VuZGF0aW9uLm9yZ19pazc5dDl1dWoycDMyaTNyMjAzZGd2NW1vOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t\n[ical file]: https://calendar.google.com/calendar/ical/linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8%40group.calendar.google.com/public/basic.ics\n[live notes]: https://docs.google.com/document/d/1AjbUDhfQV2TXn13RZqrmL7PfETTslzkbVZGtNl_SLcU/edit?usp=sharing\n\n## Attendees\n\n<!-- prettier-ignore -->\n| Name                       | GitHub               | Organization       | Location                 |\n| :------------------------- | :------------------- | :----------------- | :----------------------- |\n\n\n## Agenda\n\n1. Agree to Membership Agreement, Participation & Contribution Guidelines and Code of Conduct (1m, Host)\n   - [Specification Membership Agreement](https://github.com/graphql/foundation)\n   - [Participation Guidelines](https://github.com/graphql/graphql-wg#participation-guidelines)\n   - [Contribution Guide](https://github.com/graphql/graphql-spec/blob/main/CONTRIBUTING.md)\n   - [Code of Conduct](https://github.com/graphql/foundation/blob/master/CODE-OF-CONDUCT.md)\n   - Meetings are [published to YouTube](https://www.youtube.com/@GraphQLFoundation/videos) and we may use LLM/AI summary tools\n1. Introduction of attendees (5m, Host)\n1. Determine volunteers for note taking (1m, Host)\n1. Review agenda (2m, Host)\n1. Check for [ready for review agenda items](https://github.com/graphql/graphiql/issues?q=is%3Aissue+is%3Aopen+label%3A%22Ready+for+review+%F0%9F%99%8C%22+sort%3Aupdated-desc) (5m, Host)\n"
  },
  {
    "path": "working-group/minutes/2019-05-14.md",
    "content": "## 1st GraphiQL Working Group Minutes\n\n- GraphiQL 1.0 re-architecture: will ship with a plugin system, and a leaner query tool as it's base\n- Design / Architecture discussions and concrete decisions will continue to occur in github issues for GraphiQL, and ad-hoc WG meetings as necessary\n- Decided on new contributing guidelines:\n  - Every PR should have at least one peer review before merge (enforced via github config)\n  - This review should not come from a member of the same company\n  - Rebase and merge should be used, squash if necessary. Multiple individual commits for review changes, requested changes, or to split up a major PR make sense.\n  - Clean git history is preferred\n  - As much automation as possible will be provided to minimize the review effort\n  - Hyo reminded us that performance and large-scale concerns are important. Performance impact should always be a consideration.\n- Contributing.md will be updated to reflect these guidelines\n- We would like to propose to the GraphQL Foundation itself that the group be renamed and/or our scope be redefined to be for all GraphQL ide tooling. Thus the \"GraphQL IDE Tooling WG\" or \"GraphQL Tooling WG\". We would like to be responsible for `codemirror-graphql` and `graphql-language-services`.\n- We will prepare a prioritized list of technical debt items for contributors to work on.\n  - A GH label for this perhaps?\n"
  },
  {
    "path": "working-group/minutes/2019-06-18.md",
    "content": "## 2nd GraphiQL Working Group Minutes\n"
  },
  {
    "path": "working-group/minutes/2019-08-21.md",
    "content": "## 3rd GraphiQL Working Group Minutes\n"
  },
  {
    "path": "working-group/minutes/2020-03-10.md",
    "content": "# GraphiQL Working Group 10th March 2020\n\n## Agenda\n\n1. Introductions\n2. re-architecting GraphiQL\n3. GraphiQL Plugins\n4. Redesign implementation\n5. Surprise Item\n\n## Promoting the WG Meetings & Scheduling\n\n- Rikki:\n- Initially announced this via Twitter and Discord; that was not sufficient - sorry!\n- Emailed people directly yesterday, but unfortunately late notice for some\n- Plan to make an email chain\n- There’s support for a bi-monthly working group (every fortnight / two weeks)\n- Orta: who’s interested in that?\n- Justin: increased cadence may be better for people actively working on the project\n- Rikki: another option is once a month for LSP, another for GraphiQL\n- Justin: Relay integration at Artsy is important; there’s a lot of things happening in the Relay ecosystem - we’re keeping an eye on it and will look to get involved in future if need be.\n- Rikki: awesome! Help on the LSP in particular would be helpful\n- Justin: there’s no committed resources at this time, but it’s something that we’re keeping an eye on and may be able to help in future\n- Benjie: we can spawn out sub-groups to work together more tightly on specific issues, like the GraphQL WG does.\n- Benjie: I think we should differentiate between what should be done (responsibility of the working group) to how it should be done (responsibility of individuals within WG, who can self-organize through GitHub/Discord/etc)\n- Rikki: I was considering doing “office hours” - an open zoom call for an hour every week where people can ask questions/learn how to collaborate whilst I work on stuff.\n- [RELEVANT TO NON-ATTENDEES] Rikki: let us know if this timezone doesn’t work for you.\n\n## Re-architecting GraphiQL\n\n- Rikki: GraphiQL launched in 2015, did a great job of using the first class features of React at the time like this.setState, which worked well. However, the more modern React state management capabilities combined with context and things like useReducer might be one of the best ways to share state and event handlers/capabilities with plugins without having to pass props around a bunch. State is best kept within a component, so useReducer is probably better for more complex state management concerns - this is the approach we’re taking.\n- There’s a working PR #1359\n  - Breaks some interfaces\n  - Re-architects how state is managed\n  - See “useSessionContext” from “GraphiQLSessionProvider”\n  - This branch works; not for multiple operations in a query, but it does work.\n  - We’re removing state from the root GraphiQL component.\n  - A lot of progress has been made.\n  - The goal is to get an API like [INSERT NOTION LINK]\n- Justin: how are the phases defined?\n- Rikki: See the “Feature Roundup” GitHub project in the GraphiQL repo - this is effectively the MVP for v1.0\n  - We may move some of these features out if we need to\n  - Maybe we’ll assign them to milestones?\n- Justin: that makes sense - having an idea of what items need to be fixed to get to alpha/beta would help people know what’s going on.\n- Rikki: right now we’re focussed on core\n- There’s an alpha release of GraphiQL out there - conversion to TypeScript and some bugfixes. After the state refactor we’ll release another alpha so people can start testing it for regressions. Then we’ll start integrating Monaco with GraphiQL for the next alpha release.\n- The reason we are adding Monaco so early on is because the plugin API will be building heavily on Monaco.\n- One issue with Monaco is that it relies on web workers, so we’re going to make sure there’s some nice abstractions and that we can leverage the webpack plugin and have guides for other bundlers to show how to put GraphiQL Beta into your project and ensure all the web-workers are working.\n- Justin: we need to be careful to not re-render too frequently with reducers.\n- Justin: I’m concerned about the complexity of exposing too much external state from plugins.\n- Rikki: I wanted to try and keep it simple at first, but because there was complex demands with GraphQL Explorer and various other IDE projects that need access to the deeper internals.\n- Justin: my main concern is the specific reducers because it means that plugins need to have knowledge of the state, and then the internal state becomes an API which means we cannot change things easily.\n- Benjie: we shouldn’t expose the reducers directly, and we should expose something like selectors rather than the state itself - that way we can change how the underlying state is structured without breaking downstream applications.\n- Benjie: all callbacks should be passed an object argument so that more properties can be added later.\n- Lazy AST generation should be done in such a way that intermediate states can be skipped (e.g. if a user types 12 characters quickly whilst the first AST is still being generated, the next AST can skip to the end rather than having to be built for each character added)\n- onChange callbacks need both the text and the cursor position\n- Rikki: I’m trying to use “operation” rather than “query” because it could be a mutation too\n- Benjie: agreed; the GraphQL HTTP Spec uses query/variables/operationName for backwards compatibility; if you think this is worth changing we should raise it as an issue for GraphQL HTTP 1.0 spec.\n- Justin: exposing hooks that abstract away what we’re doing under the hood gives us the ability to refactor internals for performance. We need to be careful that things don’t misuse context and cause serious performance issues.\n- Two important things raised - useReducers - does it have negatives? And context - does it introduce performance issues?\n- We won’t merge the PR until we’ve fully evaluated these things. We need to profile it and test performance and make sure that the React profiler is happy.\n\n## GraphiQL Plugins\n\n## Redesign Implementation\n\n- Rikki: Laura has been using theme-ui to build Orta’s design system for the new GraphiQL in Storybook. That includes a ThemeProvider in context for managing your theme object, this allows you to register themes as plugins - really exciting.\n- Cosmetic changes need to be put on the back burner because we’ll be stripping out CSS and making significant changes using different components.\n- This design system allows plugins to use these styles to add tabs, views, etc. Plugin developers shouldn’t have to think about theming. (They _can_ if they want, but they don’t have to.)\n\n## Documentation\n\n- We’ll have a Gatsby documentation site\n- We already have a TSDoc documentation which is a great way to keep abreast of how GraphiQL is advancing\n- What do we think about ide.graphql.org? Devtools.graphql.org? graphql.org/dev ? graphiql.graphql.org ? dev.graphql.org?\n-\n\n## Surprise item\n\n- GraphQL Playground is merging efforts with GraphiQL\n- GraphQL Playground will become a set of plugins, themes and configuration for the new GraphiQL\n\n## Other\n\n- [https://hotchocolate.io/docs/batching](https://hotchocolate.io/docs/batching)\n- Defer/stream\n- AST should be generated in a debounced way, e.g. using a background worker or idle callback, so that we don’t suffer performance issues\n- Multiple operations can use the debounced AST, or calculate AST when clicked\n- Introspection queries are becoming dynamic\n\n## Google Summer of Code\n\n- Deadlines\n- Interns for GraphiQL plugins\n- Rikki is taking time to help people form proposals for plugins that they can write to help with GraphiQL v1.0 via GSoC.\n- Rikki plans to tag tickets with “good first time plugin” / “good first time issue” to help people find things to do\n- Sean: recovering parser could be a good GSoC task because currently prettifying drops comments\n"
  },
  {
    "path": "working-group/minutes/2021-10-12.md",
    "content": "# 7th GraphiQL Working Group\n\n- **Video Conference Link:** https://zoom.us/j/760146252\n- **Live Notes:** https://hackmd.io/@patrickpy/HkKEO5WHt/edit\n- **Date & Time:** [October 12th 2021 16:00 - 18:00 UTC](https://www.timeanddate.com/worldclock/meetingdetails.html?year=2021&month=10&day=12&hour=16&min=0&sec=0&p1=224&p2=179&p3=136&p4=37&p5=239&p6=101&p7=152)\n\n## Attendees\n\n<!-- NOTE: because we expect you to use github UI to do this, we ignore prettier for attendees and agenda section. this will prevent CI breakages. enjoy!-->\n<!-- prettier-ignore-start -->\n\n| Name                 | Organization      | Location            |\n| -------------------- | ----------------- | ------------------- |\n| Patrick Arminio      | Pollen            | London, UK          |\n| Saihajpreet Singh    | The Guild         | Minnesota, US       |\n| Dotan Simha          | The Guild         | Israel              |\n| Uri Goldshtein       | The Guild         | Israel              |\n\n## Agenda\n\n1. GraphiQL v2\n\n<!-- prettier-ignore-end -->\n\n## Notes\n\n### GraphiQL V2\n\nWe discussed a plan on how to get to GraphiQL v2, @acao already had some work done here:\n\nhttps://github.com/acao/graphiql/tree/feat/use-context-hooks\n\nAnd there's also some information about the structure and plan in the following links:\n\nhttps://github.com/graphql/graphiql/tree/main/packages/graphiql-2-rfc-context#features\nhttps://github.com/graphql/graphiql/issues/983\nhttps://github.com/graphql/graphiql#proposed-ecosystem\n\n\nWe talked about splitting the initial work into tasks:\n\n### Tasks for getting to v2 \n\nStart with following without breaking v1 (based on existing implementing of `graphiql` package): \n\n- Review https://github.com/graphql/graphiql/compare/main...acao:feat/use-context-hooks?expand=1\n- Upgrade React to latest\n- Use hooks API (potentially done in https://github.com/acao/graphiql/tree/feat/use-context-hooks)\n\nWe could split @acao's changes to multiple PR (first the migration to hooks)\n\nTasks do after the clean up above:\n\n- Use monaco instead of codemirror\n\n\n### Things to discuss for later\n\n- Replace babel with esbuild (?)\n- Upstream https://github.com/the-guild-org/the-guild-components/tree/main/packages/monaco-graphql-editor (this could be super useful for the plugin system)\n- We need to define what we want to use for theming and ui\n\n\n## Actions:\n\n- @patrick91 Add zoom password to readme and find how to add it to calendar\n- @dotansimha https://github.com/graphql/graphiql/pull/1975\n- Sync with @acao regarding the state of GitHub project: https://github.com/graphql/graphiql/projects\n\n"
  },
  {
    "path": "working-group/minutes/2022-01-11.md",
    "content": "# 8th GraphiQL Working Group\n\n## Recording\nhttps://grain.co/share/recording/5c63d2aa-31be-4660-b4d8-308c55d7f89d/bM7hfzgwr12UGT3U3WC9Mw3cFbv9h8KtTahXPKI8\n\n## Agenda\n1. How to make contributions accessible\n2. Decision making processes\n3. Roadmap\n\n## Notes\n- Contributions\n- Split CONTRIBUTING doc up\n- Layers of specialization\n- There are only certain layers you need to care about\n\n## Actionable Steps\n- Tim: Will make sure to get a design ready asap\n- Once we have consent for that design, we can start implementing it and move forward with a minimal v2 alpha\n- For that implementation, pairing is a great opportunity, as Rikki has a lot of context to share\n- We'll look into theming systems, like `theme-ui`\n- Rikki: Will mark what is required for GraphiQL@2 with labels\n- Rikki: Start writing plan (which so far was mostly verbal)\n"
  },
  {
    "path": "working-group/proposals/.gitkeep",
    "content": ""
  }
]