Skip to content

GraphiQL v6 - #4228

Draft
trevor-scheer wants to merge 177 commits into
mainfrom
graphiql-6
Draft

trevor-scheer wants to merge 177 commits into
mainfrom
graphiql-6

Conversation

@trevor-scheer

@trevor-scheer trevor-scheer commented May 7, 2026 •

Copy link
Copy Markdown
Contributor

Tracking PR for the GraphiQL v6 redesign effort. This is the long-running integration branch that hosts work-in-progress against main.

Individual PRs target graphiql-6 and produce alpha releases via changesets pre-mode. When v6 is ready to ship, this branch will be merged into main.

See discussion #4219 for background and progress updates.

Closes #734 — the visual query builder ships in v6 as @graphiql/plugin-query-builder.

## Summary

- Swap the vestigial `graphiql-5` reference in
`.github/workflows/release.yml` for `graphiql-6` so the
changesets-action runs on pushes to the integration branch.
- Enter changesets pre-mode with the `alpha` tag so merges aggregate
into `6.0.0-alpha.N` prereleases.
- Add a changeset that seeds the alpha release line by bumping
`graphiql` to v6. No functional change — subsequent alphas accumulate
the redesign work.

## Test plan

- [ ] On merge: changesets-action opens a "Version Packages (alpha)" PR
bumping `graphiql` to `6.0.0-alpha.0`.
- [ ] Merging the version PR publishes `graphiql@6.0.0-alpha.0` to npm
with the `alpha` dist-tag.

Refs: #4219
@changeset-bot

changeset-bot Bot commented May 7, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 50841a3

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 16 packages
Name Type
@graphiql/react Major
@graphiql/plugin-history Major
graphiql Major
@graphiql/plugin-doc-explorer Major
@graphiql/plugin-collections Major
@graphiql/toolkit Major
@graphiql/plugin-query-builder Major
@graphiql/plugin-code-exporter Major
cm6-graphql Major
codemirror-graphql Major
graphql-language-service Major
graphql-language-service-cli Major
graphql-language-service-server Major
monaco-graphql Major
vscode-graphql Major
vscode-graphql-execution Major

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented May 7, 2026

Copy link
Copy Markdown
Contributor

The latest changes of this PR are not available as canary, since there are no linked changesets for this PR.

## Summary

- Introduce a new `packages/graphiql-react/src/style/tokens.css` with
the v6 OKLCH-based design token system. Both dark and light palettes
ship together.
- Light theme activates explicitly via `data-theme="light"` or
automatically via `prefers-color-scheme: light` when no theme is pinned.
Dark remains the default.
- Existing v5 HSL variables are unchanged; nothing in `@graphiql/react`
references the new tokens yet.
- Future PRs will restyle components to consume the new tokens and shim
the v5 variables.

Refs: #4219
## Summary

Storybook gives us a fast feedback loop for iterating on the look of the
app and individual components — flipping themes/density/font-size
without spinning up the full GraphiQL shell.

- Bootstrap Storybook 10 in `@graphiql/react`. Stories colocated as
`<component>.stories.tsx`; ships one starter (`Spinner`) to validate the
pipeline.
- A global decorator wraps every story in `.graphiql-container` with
`data-theme` / `data-density` / `data-font-size` attributes, toggleable
from the Storybook toolbar.
- Move `Uri`, `KeyMod`, `KeyCode`, and `Range` out of the `utility`
barrel into direct imports from `utility/monaco-ssr`. The barrel was
bundling two unrelated concerns — lightweight UI helpers (`cn`, `pick`,
etc.) and heavy Monaco re-exports — so any story reaching for `cn`
transitively pulled Monaco's ESM bundle, which doesn't initialize
cleanly inside Storybook's preview iframe. Splitting them keeps UI
primitives lightweight.

## Run locally

From the repo root:

```
yarn storybook         # dev server on http://localhost:6006
yarn build-storybook   # static build under packages/graphiql-react/storybook-static
```

Refs: #4219
## Summary

Component a11y is covered by Storybook + axe; this is the full-app
counterpart. `cypress-axe` runs axe at four checkpoints during a normal
session (initial render, after running a query, with the docs panel
open, with the history panel open) and gates PRs against a committed
baseline.

`cypress/.a11y-baseline.json` pins today's accepted violations —
color-contrast in several spots, a couple of nested-interactive cases,
link-in-text-block in the docs panel. CI fails on net-new only.

The spec lives alongside the existing Cypress suite, so it runs as part
of the normal `yarn e2e` flow. `cypress.config.ts` gets a small
`writeBaseline` Node task so the spec can persist baseline updates from
inside the browser.

## Refresh baseline

```
yarn workspace graphiql test:a11y:update
```

Refs: #4219
)

## Summary

Component-level a11y for v6. `@storybook/addon-a11y` surfaces axe
results next to each story while you're working on it;
`@storybook/addon-vitest` folds those same checks into the existing
Vitest suite so they run as part of `yarn test` in CI.

The model is per-story `parameters.a11y.test`:

- `'error'` (default) — axe violations fail the test
- `'todo'` — warn only, for stories with known issues we plan to fix
- `'off'` — skip a11y for the story

`vitest.config.mts` is split into two projects:

- `unit` — existing jsdom suite, unchanged behavior
- `storybook` — Vitest browser mode (Playwright Chromium), picks up
`.stories.*` files

The PR CI workflow gets one new step: `yarn playwright install
--with-deps chromium` ahead of `yarn test`.

## Run locally

```
yarn workspace @graphiql/react test                       # both projects
yarn workspace @graphiql/react vitest run --project=unit  # unit only
yarn workspace @graphiql/react vitest run --project=storybook
```

The Storybook a11y panel surfaces the same axe results live during `yarn
workspace @graphiql/react storybook`.

Refs: #4219
## Summary

- Migrate `Button`, `UnStyledButton`, `ToolbarButton`, and
`ExecuteButton` CSS to v6 OKLCH tokens.
- Add `variant?: 'default' | 'primary'` to `Button`; `primary` renders
the Run-button style.
- Switch `:focus` to `:focus-visible` on interactive states so the focus
ring no longer fires on mouse click. Aligns with [MDN
`:focus-visible`](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible)
and WCAG 2.4.7 (Focus Visible).
- Import `clsx` directly in `button` and `toolbar-button`, following the
leaf-module pattern from #4272. A follow-up PR will convert remaining
callers and remove the `cn` re-export.
- Add Storybook stories: `Primitives/Button` (Default, Primary, Success,
Error, Disabled) and `Primitives/ToolbarButton` (Default).

## Test plan

- [x] Open Storybook `Primitives/Button` and verify each variant matches
the design.
- [x] Tab into the buttons, then mouse-click them. Focus ring appears on
Tab only, not on click.
- [x] Open `Primitives/ToolbarButton`. Hover the icon button; a v6
tooltip appears.
- [x] Run `yarn dev:graphiql`. The Run button and toolbar buttons match
the new design.

Refs: #4219
trevor-scheer and others added 30 commits September 27, 2026 12:04
Reopening a saved operation or switching tabs can replace the editor
text before the selected operation updates. Clicking Run immediately can
then send the new document with the previous operation's name. Run now
reads the document being sent and uses it to choose the operation and
its required fragments.

Saved tab selections, explicit dropdown selections, and operation names
supplied by the host are preserved. Keyboard Run uses current document
ranges. Cursor selection updates immediately so a queued cursor update
can't undo a later dropdown choice. Mutations still require selecting
POST before running.

To exercise the original failure, switch between two named saved
operations and click Run immediately. The outgoing document and
operation name should agree. The first commit contains the failing
examples; the following commit fixes selection.

Refs: #4219
The keyboard-picker check could press Enter before focus moved to B. It
also checked a response shared by both operations, which couldn't tell
us which one ran.

The test now establishes browser focus, waits for the focused menu item
before each key press, and checks the outgoing operation name. It
controls the clock so an older cursor update runs after explicitly
choosing B, then checks that a second Run still sends B. This keeps the
application race visible instead of depending on how quickly the browser
executes the test.

This is a test-only change stacked on #4573, which fixes operation
selection. With the old cursor handler, the second request sends A.

Refs: #4571, #4219
Installing an exact GraphiQL beta can still select incompatible canary
packages through its internal dependency ranges. Those packages are
missing worker paths and language-service exports that GraphiQL needs.
This pins the internal beta package family to compatible versions while
keeping support for Monaco 0.56 and 0.57. We can restore ordinary
dependency ranges after stable releases exist.

Monaco now includes the source files referenced by its source maps so
debugging doesn't produce missing-source warnings. The corrected
published beta still needs a fresh-install check using actual npm
versions after release.

Refs: #4219
Custom Monaco theme names passed to `editorTheme` were replaced by
GraphiQL's built-in colors. The registered light and dark themes now
stay active when GraphiQL opens, restores saved settings, and follows
changes made in Settings or the system appearance. Apps without custom
themes keep the built-in colors.

Manual check: register a light and dark Monaco theme with visibly
different keyword and background colors, pass their names through
`editorTheme`, then open Settings and select Light, Dark, and Auto. The
editor should keep those registered colors, including after a reload and
a system appearance change.

Refs: #4219
`createTransport` currently accepts a sink-based `subscribe(request,
sink)` API and converts it into an async iterator. That conversion makes
GraphiQL responsible for subscription queueing and lifecycle details. In
particular, an iterator waiting for its next event cannot be stopped
promptly without adding a second state machine inside the toolkit.

Because `Transport` and `SubscriptionClient` are new on `graphiql-6`,
this instead requires `subscriptionClient.iterate(request)`.
`graphql-ws` v6 and `graphql-sse` already expose that API.
`createTransport` now only starts the client iterator lazily, maps each
result into a `TransportResponse`, and forwards `.return()` directly to
the client. Older `graphql-ws` clients remain supported by the
deprecated `createGraphiQLFetcher` API, but not by the new `Transport`
subscription contract.

The first commit reproduces cancellation getting stuck between
subscription events. The second commit changes the contract and keeps
the same behavior covered using a controllable async iterator.

Supersedes #4572.
…4588)

Saving a collection item could leave its linked tab on older contents
for another half second. Reloading during that gap restored the older
tab instead of the saved operation.

Save now captures the current query, variables, and headers and writes
the tab before it finishes. It cancels older queued writes, and provider
initialization no longer schedules writes from a render that React
abandons. Opening an item that already has a tab preserves that tab's
unsaved edits.

To try it, run `pnpm build:graphiql`, then `pnpm --filter graphiql-e2e
server:built`. Open [the test app](http://localhost:8080/), open
Collections, enter an operation, and save it. Reload immediately and
reopen the item: the saved contents should still be there. Edit and save
that linked item, then repeat. Finally, edit it without saving and click
its collection entry again: those unsaved edits should remain.

The reproduction commits cover immediate reload, an older queued write,
and an abandoned provider render before the fix.

Refs: #4219
Cypress currently treats the first Monaco model with a matching URI, or
its rendered `.view-lines`, as an editor readiness boundary. That
couples setup and assertions to layout, and it can select a detached or
inactive model once a test opens multiple tabs.

This adds helpers around the model attached to the active editor.
`visitGraphiQL` waits for an explicitly supplied query, setup-only tab
tests set model values directly, and shared value assertions no longer
read Monaco's rendered DOM. Trusted keyboard input remains available for
tests where typing is the behavior under test.

This is the first PR in the Cypress flake stack and is intended to be
reviewed by commit.

<sub>Stack created with <a
href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback">Give Feedback</a></sub>
Several Cypress tests still use elapsed time or a one-shot snapshot as a
proxy for asynchronous Monaco and application work. That is the same
mechanism behind the recent lint hover, DocExplorer debounce, and
operation-picker flakes.

This waits on the resulting state instead. Incremental delivery
assertions retry the response model with a test-specific timeout, the
query-builder focus regression waits for its debounced URL update, and
lint assertions find diagnostics by message and severity rather than
marker position. Negative lint cases first introduce a known-invalid
sentinel and then remove it, proving validation completed before
asserting that no markers remain. The hover assertion retriggers its
mouse event through Cypress's retry loop without fixed sleeps.

This is the second PR in the Cypress flake stack and is intended to be
reviewed by commit.

Refs #4348, #4358, #4574.

<sub>Stack created with <a
href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback">Give Feedback</a></sub>
The DocExplorer flake fixed in #4348 showed that a positional selector
can resolve successfully while pointing at stale state. Similar
activity-rail, search-result, and history-item selectors remain
elsewhere in the suite.

This adds shared plugin show/hide commands that select by accessible
name and wait for the panel state. DocExplorer results are selected by
their semantic text, and history actions locate the item by label before
choosing its action. The assertions continue to cover ordering and
grouping where those are the behavior under test, without using position
to identify the item being changed.

This is the third PR in the Cypress flake stack and is intended to be
reviewed by commit.

<sub>Stack created with <a
href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback">Give Feedback</a></sub>
GraphiQL's Vite worker graph currently reaches the CommonJS-only
`nullthrows` and `picomatch-browser` packages. Vite doesn't reliably
discover those dependencies inside workers under pnpm's isolated layout,
so applications have to name GraphiQL's transitive dependency paths in
`optimizeDeps.include`.

`nullthrows` only asserts fragment map lookups that the surrounding
control flow already guards, so this removes that dependency and narrows
the values directly. `monaco-graphql` now uses the dual ESM/CommonJS
`minimatch` package for `fileMatch`; the added test exercises multiple
schema selection through URI glob patterns.

I packed both changed packages and installed them into a fresh pnpm
application using the published GraphiQL beta. With
`graphiql/setup-workers/vite`, Vite now starts all three workers with
only the two setup-helper exclusions and no forced dependency includes.
Explicit worker factories work with no `optimizeDeps` configuration at
all.

This doesn't remove the helper exclusions themselves. Vite must still
transform their `?worker` imports instead of pre-bundling those modules.
#4589 is stacked on this PR and reduces its Vite guidance to that
boundary.
This PR is stacked on #4590, which removes the two CommonJS dependencies
that previously had to be forced into Vite's development optimizer.

The migration guide now targets the intended stable v6 API. Its examples
use a valid transport, handle HTTP failures, describe the standard UI
accurately, use registered editor theme names, guard custom actions, and
rely on the exported `COLLECTIONS_PLUGIN` rather than documenting
beta-version compatibility.

GraphiQL now exports an immutable `DEFAULT_PLUGINS` array and re-exports
the Query Builder and Collections plugin constants. Applications can
omit `plugins` for the standard setup, or filter, map, and extend the
defaults without declaring direct dependencies on every built-in plugin
package. A direct plugin dependency is only shown when an application
uses plugin-specific configuration such as `collectionsPlugin(...)`.

The CSS guidance uses the single `graphiql/style.css` entry, which
already contains the default first-party plugin styles. The Vite example
only excludes the two worker setup modules from pre-bundling so Vite can
process their `?worker` imports. Applications that configure the
explicit worker factories can omit `optimizeDeps` entirely.

The guide also explains that users must select POST before running a
mutation; dropdown and keyboard execution follow the same rule.

Manual check: start the Vite example with a fresh dependency cache, try
schema completion and an unknown field, enter invalid Variables JSON,
and select Prettify. Repeat against its production preview. With GET
selected, a mutation should remain blocked until you explicitly select
POST.

Refs: #4219
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to graphiql-6, this
PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`graphiql-6` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `graphiql-6`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## graphiql@6.0.0-beta.3

### Minor Changes

- [#4589](#4589)
[`7f9e0cc`](7f9e0cc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Export the
immutable `DEFAULT_PLUGINS` array and the default Query Builder and
Collections plugin constants. Customize GraphiQL's defaults without
importing its plugin packages directly.

### Patch Changes

- [#4570](#4570)
[`c7d5295`](c7d5295)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Export
`COLLECTIONS_PLUGIN` for the default collections configuration. Use
`collectionsPlugin(options)` when you need custom storage or
permissions.

- Updated dependencies
[[`c7d5295`](c7d5295),
[`9d9790d`](9d9790d)]:
  - @graphiql/plugin-collections@1.0.0-beta.3
  - @graphiql/react@1.0.0-beta.3
  - @graphiql/plugin-doc-explorer@1.0.0-beta.3
  - @graphiql/plugin-history@1.0.0-beta.3
  - @graphiql/plugin-query-builder@1.0.0-beta.3
## @graphiql/plugin-collections@1.0.0-beta.3

### Minor Changes

- [#4570](#4570)
[`c7d5295`](c7d5295)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Export
`COLLECTIONS_PLUGIN` for the default collections configuration. Use
`collectionsPlugin(options)` when you need custom storage or
permissions.

### Patch Changes

- Updated dependencies
[[`9d9790d`](9d9790d)]:
  - @graphiql/react@1.0.0-beta.3
## cm6-graphql@1.0.0-beta.1

### Patch Changes

- Updated dependencies
[[`5affc68`](5affc68)]:
  - graphql-language-service@6.0.0-beta.1
## codemirror-graphql@3.0.0-beta.1

### Patch Changes

- Updated dependencies
[[`5affc68`](5affc68)]:
  - graphql-language-service@6.0.0-beta.1
## @graphiql/plugin-code-exporter@6.0.0-beta.3

### Patch Changes

- Updated dependencies
[[`9d9790d`](9d9790d)]:
  - @graphiql/react@1.0.0-beta.3
## @graphiql/plugin-doc-explorer@1.0.0-beta.3

### Patch Changes

- Updated dependencies
[[`9d9790d`](9d9790d)]:
  - @graphiql/react@1.0.0-beta.3
## @graphiql/plugin-history@1.0.0-beta.3

### Patch Changes

- Updated dependencies
[[`9d9790d`](9d9790d)]:
  - @graphiql/react@1.0.0-beta.3
## @graphiql/plugin-query-builder@1.0.0-beta.3

### Patch Changes

- Updated dependencies
[[`9d9790d`](9d9790d)]:
  - @graphiql/react@1.0.0-beta.3
## @graphiql/react@1.0.0-beta.3

### Patch Changes

- [#4557](#4557)
[`9d9790d`](9d9790d)
Thanks [@vishwakt](https://github.com/vishwakt)! - Improve the error
shown when the Variables or Headers pane contains invalid JSON. The
message now uses plain language with a line and column (for example
`expected a value at line 1, column 8`) instead of the bare
`jsonc-parser` error code (`ValueExpected`), and is prefixed with
`Request not sent.` so it is not mistaken for a server response.

- Updated dependencies
[[`5affc68`](5affc68)]:
  - graphql-language-service@6.0.0-beta.1
  - monaco-graphql@2.0.0-beta.1
## graphql-language-service@6.0.0-beta.1

### Patch Changes

- [#4590](#4590)
[`5affc68`](5affc68)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Remove the
CommonJS-only `nullthrows` dependency and replace `picomatch-browser`
with an ESM-compatible glob matcher.
## graphql-language-service-cli@4.0.0-beta.1

### Patch Changes

- Updated dependencies
[[`5affc68`](5affc68)]:
  - graphql-language-service@6.0.0-beta.1
  - graphql-language-service-server@3.0.0-beta.1
## graphql-language-service-server@3.0.0-beta.1

### Patch Changes

- Updated dependencies
[[`5affc68`](5affc68)]:
  - graphql-language-service@6.0.0-beta.1
## monaco-graphql@2.0.0-beta.1

### Patch Changes

- [#4590](#4590)
[`5affc68`](5affc68)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Remove the
CommonJS-only `nullthrows` dependency and replace `picomatch-browser`
with an ESM-compatible glob matcher.

- Updated dependencies
[[`5affc68`](5affc68)]:
  - graphql-language-service@6.0.0-beta.1
## vscode-graphql@1.0.0-beta.1

### Patch Changes

- Updated dependencies []:
  - graphql-language-service-server@3.0.0-beta.1

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
[#4578](#4578) changed transport
subscriptions to require `subscriptionClient.iterate(request)`, but
`@graphiql/toolkit@1.0.0-beta.1` is still the published beta. That PR
updated `.changeset/transport-api.md`, which `.changeset/pre.json`
already lists as consumed. The beta.3 version PR therefore had no new
toolkit release entry, and `@graphiql/react@1.0.0-beta.3` still pins
toolkit beta.1.

This removes `transport-api` from the prerelease consumed list so
Changesets applies its final wording to the next beta. The release plan
schedules toolkit beta.2, React beta.4, GraphiQL beta.4, and dependent
plugin bumps. The same `transport-api.md` remains the single entry for
the stable changelog.

The first commit on this branch added a separate changeset; the second
undoes that approach. The net diff is the one-line change in `pre.json`.
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to graphiql-6, this
PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`graphiql-6` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `graphiql-6`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## graphiql@6.0.0-beta.4

### Minor Changes

- [#4333](#4333)
[`093cb10`](093cb10)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Add a
structured `Transport` API alongside the existing `Fetcher`.
`createTransport({...})` performs the GraphQL request and returns a
`TransportResponse` carrying the real HTTP wire metadata (status,
headers, timing, size) for queries, mutations, subscriptions, and
incremental delivery, so the response pane can surface those values
directly instead of fabricating them. That metadata is there even when
the response body isn't valid JSON (an HTML error page from a proxy, a
plain-text 401), so a broken response still shows its real status code
instead of a generic error. `<GraphiQL>` accepts a new `transport` prop,
mutually exclusive with `fetcher` at the type level.

Transports support GET, POST, and the [HTTP
`QUERY`](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/)
method per the GraphQL over HTTP spec. Pass `method` /
`supportedMethods` to choose; GET encodes the query into the URL with no
body, `QUERY` sends a JSON body but is safe and idempotent, and
mutations are always sent over POST (or blocked when POST is
unavailable). `Transport` exposes `url`, `method`, `supportedMethods`,
and an optional `setMethod`, and the top bar shows the active method and
endpoint with an inline switcher that cycles through the supported
methods. Every request, incremental delivery on or off, sends
`application/graphql-response+json` in its `accept` header alongside
`application/json`, so spec-compliant servers don't fall back to legacy
response semantics. Subscriptions require an explicit
`subscriptionClient` satisfying a small `SubscriptionClient` contract: a
single `.iterate(request)` method that `graphql-ws` v6 and `graphql-sse`
clients meet directly. The low-level `simpleHttpTransport` and
`multipartHttpTransport` primitives also accept an optional `method`.

`TransportRequest` carries `extensions` for GraphQL-over-HTTP extensions
such as automatic persisted queries (encoded into the URL for `GET`,
included in the JSON body for `POST` and `QUERY`), and `signal`, an
`AbortSignal` that cancels an in-flight query or mutation. Stopping a
running query or mutation aborts the request; stopping a subscription
closes the underlying socket or SSE connection. `TransportResponse.ok`
reflects both layers: the HTTP status and the absence of top-level
GraphQL errors, so a 401 or 500 is never `ok: true` just because its
body happens to parse as JSON with no `errors`.

Plugins can observe and transform traffic through
`transport.onBeforeSend`, `transport.onResponse`, and
`transport.onError`, available via `useGraphiQLPluginContext()` (all
three return a cleanup function; the `transport` field is `undefined`
under the legacy `fetcher` path, so guard with optional chaining).
`onError` fires when a request fails outright, such as a network error,
so plugins can react to failures the same way they observe successful
responses.

`createGraphiQLFetcher`, the `Fetcher` type and its companions, and
`<GraphiQL fetcher={...}>` are deprecated but continue to work
unchanged. Consumers on the deprecated path see a one-time dismissible
banner in the response pane pointing at
`docs/migration/graphiql-6.0.0.md` rather than fabricated
status/timing/size values.

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/react@1.0.0-beta.4
  - @graphiql/plugin-history@1.0.0-beta.4
  - @graphiql/plugin-collections@1.0.0-beta.4
  - @graphiql/plugin-doc-explorer@1.0.0-beta.4
  - @graphiql/plugin-query-builder@1.0.0-beta.4
## @graphiql/react@1.0.0-beta.4

### Minor Changes

- [#4333](#4333)
[`093cb10`](093cb10)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Add a
structured `Transport` API alongside the existing `Fetcher`.
`createTransport({...})` performs the GraphQL request and returns a
`TransportResponse` carrying the real HTTP wire metadata (status,
headers, timing, size) for queries, mutations, subscriptions, and
incremental delivery, so the response pane can surface those values
directly instead of fabricating them. That metadata is there even when
the response body isn't valid JSON (an HTML error page from a proxy, a
plain-text 401), so a broken response still shows its real status code
instead of a generic error. `<GraphiQL>` accepts a new `transport` prop,
mutually exclusive with `fetcher` at the type level.

Transports support GET, POST, and the [HTTP
`QUERY`](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/)
method per the GraphQL over HTTP spec. Pass `method` /
`supportedMethods` to choose; GET encodes the query into the URL with no
body, `QUERY` sends a JSON body but is safe and idempotent, and
mutations are always sent over POST (or blocked when POST is
unavailable). `Transport` exposes `url`, `method`, `supportedMethods`,
and an optional `setMethod`, and the top bar shows the active method and
endpoint with an inline switcher that cycles through the supported
methods. Every request, incremental delivery on or off, sends
`application/graphql-response+json` in its `accept` header alongside
`application/json`, so spec-compliant servers don't fall back to legacy
response semantics. Subscriptions require an explicit
`subscriptionClient` satisfying a small `SubscriptionClient` contract: a
single `.iterate(request)` method that `graphql-ws` v6 and `graphql-sse`
clients meet directly. The low-level `simpleHttpTransport` and
`multipartHttpTransport` primitives also accept an optional `method`.

`TransportRequest` carries `extensions` for GraphQL-over-HTTP extensions
such as automatic persisted queries (encoded into the URL for `GET`,
included in the JSON body for `POST` and `QUERY`), and `signal`, an
`AbortSignal` that cancels an in-flight query or mutation. Stopping a
running query or mutation aborts the request; stopping a subscription
closes the underlying socket or SSE connection. `TransportResponse.ok`
reflects both layers: the HTTP status and the absence of top-level
GraphQL errors, so a 401 or 500 is never `ok: true` just because its
body happens to parse as JSON with no `errors`.

Plugins can observe and transform traffic through
`transport.onBeforeSend`, `transport.onResponse`, and
`transport.onError`, available via `useGraphiQLPluginContext()` (all
three return a cleanup function; the `transport` field is `undefined`
under the legacy `fetcher` path, so guard with optional chaining).
`onError` fires when a request fails outright, such as a network error,
so plugins can react to failures the same way they observe successful
responses.

`createGraphiQLFetcher`, the `Fetcher` type and its companions, and
`<GraphiQL fetcher={...}>` are deprecated but continue to work
unchanged. Consumers on the deprecated path see a one-time dismissible
banner in the response pane pointing at
`docs/migration/graphiql-6.0.0.md` rather than fabricated
status/timing/size values.

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/toolkit@1.0.0-beta.2
## @graphiql/toolkit@1.0.0-beta.2

### Minor Changes

- [#4333](#4333)
[`093cb10`](093cb10)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Add a
structured `Transport` API alongside the existing `Fetcher`.
`createTransport({...})` performs the GraphQL request and returns a
`TransportResponse` carrying the real HTTP wire metadata (status,
headers, timing, size) for queries, mutations, subscriptions, and
incremental delivery, so the response pane can surface those values
directly instead of fabricating them. That metadata is there even when
the response body isn't valid JSON (an HTML error page from a proxy, a
plain-text 401), so a broken response still shows its real status code
instead of a generic error. `<GraphiQL>` accepts a new `transport` prop,
mutually exclusive with `fetcher` at the type level.

Transports support GET, POST, and the [HTTP
`QUERY`](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/)
method per the GraphQL over HTTP spec. Pass `method` /
`supportedMethods` to choose; GET encodes the query into the URL with no
body, `QUERY` sends a JSON body but is safe and idempotent, and
mutations are always sent over POST (or blocked when POST is
unavailable). `Transport` exposes `url`, `method`, `supportedMethods`,
and an optional `setMethod`, and the top bar shows the active method and
endpoint with an inline switcher that cycles through the supported
methods. Every request, incremental delivery on or off, sends
`application/graphql-response+json` in its `accept` header alongside
`application/json`, so spec-compliant servers don't fall back to legacy
response semantics. Subscriptions require an explicit
`subscriptionClient` satisfying a small `SubscriptionClient` contract: a
single `.iterate(request)` method that `graphql-ws` v6 and `graphql-sse`
clients meet directly. The low-level `simpleHttpTransport` and
`multipartHttpTransport` primitives also accept an optional `method`.

`TransportRequest` carries `extensions` for GraphQL-over-HTTP extensions
such as automatic persisted queries (encoded into the URL for `GET`,
included in the JSON body for `POST` and `QUERY`), and `signal`, an
`AbortSignal` that cancels an in-flight query or mutation. Stopping a
running query or mutation aborts the request; stopping a subscription
closes the underlying socket or SSE connection. `TransportResponse.ok`
reflects both layers: the HTTP status and the absence of top-level
GraphQL errors, so a 401 or 500 is never `ok: true` just because its
body happens to parse as JSON with no `errors`.

Plugins can observe and transform traffic through
`transport.onBeforeSend`, `transport.onResponse`, and
`transport.onError`, available via `useGraphiQLPluginContext()` (all
three return a cleanup function; the `transport` field is `undefined`
under the legacy `fetcher` path, so guard with optional chaining).
`onError` fires when a request fails outright, such as a network error,
so plugins can react to failures the same way they observe successful
responses.

`createGraphiQLFetcher`, the `Fetcher` type and its companions, and
`<GraphiQL fetcher={...}>` are deprecated but continue to work
unchanged. Consumers on the deprecated path see a one-time dismissible
banner in the response pane pointing at
`docs/migration/graphiql-6.0.0.md` rather than fabricated
status/timing/size values.
## @graphiql/plugin-code-exporter@6.0.0-beta.4

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/react@1.0.0-beta.4
## @graphiql/plugin-collections@1.0.0-beta.4

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/react@1.0.0-beta.4
## @graphiql/plugin-doc-explorer@1.0.0-beta.4

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/react@1.0.0-beta.4
## @graphiql/plugin-history@1.0.0-beta.4

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/toolkit@1.0.0-beta.2
  - @graphiql/react@1.0.0-beta.4
## @graphiql/plugin-query-builder@1.0.0-beta.4

### Patch Changes

- Updated dependencies
[[`093cb10`](093cb10)]:
  - @graphiql/react@1.0.0-beta.4

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Changesets documents changing prerelease stages by updating the `tag` in
`.changeset/pre.json` directly. This moves the existing prerelease state
from `beta` to `rc` without resetting or rewriting its recorded initial
versions. The resulting version PR will show which packages Changesets
advances under the new tag.
Changing the prerelease tag tells Changesets how to label the next
release, but doesn’t create release intent by itself. This adds a
temporary patch changeset covering every package currently on a beta
version so the next version PR moves the whole package family to RC
versions.

After Changesets consumes this into `.changeset/pre`, we’ll remove the
archived promotion changeset before exiting prerelease mode so it isn’t
included in the final release changelogs.
The esm.sh worker helper imports `monaco-graphql` without a version.
esm.sh resolves that to 1.9.0, while GraphiQL 6 uses Monaco Editor 0.57
and `monaco-graphql` 2. The old worker can leave GraphQL completion and
diagnostics broken in CDN setups.

Use the `@rc` tag for the GraphQL worker during the GraphiQL 6 release
candidate, and keep the ambient module declaration in sync. The React
changeset publishes the updated helper (and bumps its dependents). The
final cleanup in #4587 will switch the URL to `@latest` once v2 is
stable.

This must remain a draft until the `monaco-graphql@rc` dist-tag points
to a v2 RC. At the time of this update, npm still points `rc` to
1.7.1-rc.0. After the RC publish, verify the esm.sh worker wrapper
resolves to that RC and check schema completion and diagnostics in a
browser.

Refs: #4219
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to graphiql-6, this
PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`graphiql-6` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `graphiql-6`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## cm6-graphql@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - graphql-language-service@6.0.0-rc.0
## codemirror-graphql@3.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - graphql-language-service@6.0.0-rc.0
## graphiql@6.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`5081f23`](5081f23),
[`bcd13dc`](bcd13dc)]:
  - @graphiql/react@1.0.0-rc.0
  - @graphiql/plugin-collections@1.0.0-rc.0
  - @graphiql/plugin-doc-explorer@1.0.0-rc.0
  - @graphiql/plugin-history@1.0.0-rc.0
  - @graphiql/plugin-query-builder@1.0.0-rc.0
## @graphiql/plugin-code-exporter@6.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`5081f23`](5081f23),
[`bcd13dc`](bcd13dc)]:
  - @graphiql/react@1.0.0-rc.0
## @graphiql/plugin-collections@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`5081f23`](5081f23),
[`bcd13dc`](bcd13dc)]:
  - @graphiql/react@1.0.0-rc.0
## @graphiql/plugin-doc-explorer@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`5081f23`](5081f23),
[`bcd13dc`](bcd13dc)]:
  - @graphiql/react@1.0.0-rc.0
## @graphiql/plugin-history@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`5081f23`](5081f23),
[`bcd13dc`](bcd13dc)]:
  - @graphiql/react@1.0.0-rc.0
  - @graphiql/toolkit@1.0.0-rc.0
## @graphiql/plugin-query-builder@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`5081f23`](5081f23),
[`bcd13dc`](bcd13dc)]:
  - @graphiql/react@1.0.0-rc.0
## @graphiql/react@1.0.0-rc.0

### Patch Changes

- [#4594](#4594)
[`5081f23`](5081f23)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Load a
GraphQL worker from the matching `monaco-graphql` major in the esm.sh
worker setup helper. This keeps GraphQL completion and diagnostics
compatible with the bundled Monaco Editor.

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - @graphiql/toolkit@1.0.0-rc.0
  - graphql-language-service@6.0.0-rc.0
  - monaco-graphql@2.0.0-rc.0
## @graphiql/toolkit@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.
## graphql-language-service@6.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.
## graphql-language-service-cli@4.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - graphql-language-service-server@3.0.0-rc.0
  - graphql-language-service@6.0.0-rc.0
## graphql-language-service-server@3.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - graphql-language-service@6.0.0-rc.0
## monaco-graphql@2.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - graphql-language-service@6.0.0-rc.0
## vscode-graphql@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

- Updated dependencies
[[`bcd13dc`](bcd13dc)]:
  - graphql-language-service-server@3.0.0-rc.0
## vscode-graphql-execution@1.0.0-rc.0

### Patch Changes

- [#4595](#4595)
[`bcd13dc`](bcd13dc)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Move the
GraphiQL 6 package family from beta to release candidate versions.

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Trevor Scheer <trevor.scheer@gmail.com>
During the beta, caret ranges for internal packages could resolve to
stale canary or `next` builds because those prerelease identifiers
sorted after `beta`. We pinned the package family to exact compatible
versions to avoid selecting those builds.

The `rc` identifier sorts after the stale prerelease identifiers, so
this restores the caret ranges across the published packages and
examples without waiting for GA. A fresh install of
`graphiql@^6.0.0-rc.0` resolves the complete internal package family to
the RC versions.

Refs: #4471, #4571, #4219
## What was wrong

Each part of GraphiQL using `useGraphiQLSettings()` kept its own copy of
the preferences. Changing the theme in the Settings dialog did not
update a plugin that was already open. If that plugin then changed
another setting, such as density, it could save its outdated theme value
and undo the change.

The GraphiQL shell could also show an old theme when the editor finished
loading after a theme change.

## What changed

Settings are now shared between callers on the same page. When one
caller changes a preference, the change is combined with the latest
settings, saved, and sent to the other callers. Changes made in another
browser tab are picked up as well. Each caller then applies the current
appearance settings to its own part of the interface.

During server rendering, the hook uses defaults so preferences are not
shared between visitors.

## Coverage and scope

Tests cover the Settings dialog and another caller staying in sync,
changes to different preferences preserving each other, and the editor
loading after a theme change.

The older theme actions in `stores/theme.ts` still use their separate
storage key and are unchanged here. Their interaction with these
settings needs a separate compatibility decision.
)

The [custom `Transport`
example](https://github.com/graphql/graphiql/blob/a539b83cac07d3987a8098346b1647a0ddec67f4/docs/migration/graphiql-6.0.0.md#L346)
calls `JSON.parse` before returning its HTTP metadata. If a server
responds with HTML for a 503, `send()` throws `SyntaxError` and the
integration loses the actual status, headers, timing, and byte counts.

This keeps the sample's successful JSON path and converts only a parse
failure into a client-generated `GraphQLError` with an explicit HTTP
message. The result still carries the original response metadata, and
`ok` is false. Fetch and abort failures continue to reject. The text
below the sample explains that the fallback error came from the client
rather than the GraphQL server.
With Vite 7.3.1, the published v6 RC's Prettify action leaves GraphQL
queries and JSONC variables unchanged unless consumers force Vite to
optimize `prettier/parser-graphql` and `prettier/parser-babel`. The
console reports `Couldn't resolve parser "graphql"` and `Couldn't
resolve parser "jsonc"`.

`@graphiql/react` currently imports those legacy parser paths and
assembles partial plugin objects. This switches the lazy imports to
Prettier's ESM `plugins/graphql`, `plugins/babel`, and `plugins/estree`
modules and passes the complete plugins to `prettier.format`. It sets
`trailingComma: 'none'` for JSONC so the modern plugin retains
GraphiQL's existing output. In a clean standalone Vite consumer with
only the guide's worker exclusions, the published RC reproduces both
parser failures; a package built from this branch formats both editors
in development and production preview without those optimizer includes.
The changeset releases the fix in `@graphiql/react`.

The first commit makes the import change. The second captures the JSONC
output regression exposed by Cypress, and the third preserves the
existing output.
The GraphiQL 6 migration guide explains the major breaking changes and
new APIs, but readers have no short inventory of smaller features they
can adopt after upgrading. This adds an optional-features section near
the end, with brief entries for response views, custom saving, plugin
transport hooks, and display settings.

The response-view and settings entries describe behavior already present
on `graphiql-6`. The plugin-hooks link targets the section in draft
#4605, and the custom-saving link targets `#custom-save-handlers` in
draft #4608. Merge this PR after those sections land so both local links
resolve.
The GraphiQL 6 migration guide covers host-side `transport` setup but
omits the [plugin transport
hooks](https://github.com/graphql/graphiql/blob/a539b83cac07d3987a8098346b1647a0ddec67f4/packages/graphiql-react/src/transport-hooks.context.ts#L15-L46).
Plugin authors need to know when the hooks exist and how to register
them without leaving duplicate callbacks behind.

This adds a short subsection beside the transport guidance. Its header
example uses an always-mounted `sessionActions` component, preserves
existing request headers, and returns the registration cleanup from
`useEffect`. It also distinguishes resolved HTTP or GraphQL error
responses observed by `onResponse` from rejected requests or streams
observed by `onError`.
The migration guide says theme overrides work regardless of stylesheet
order, but its example has the same specificity as the built-in token
selector. Tell readers to load custom CSS after `graphiql/style.css`, or
use a more specific selector.

Also document that appearance preferences use the shared
`graphiql:settings` localStorage key rather than GraphiQL's `storage`
prop. This makes the scope clear for hosts embedding multiple instances
or supplying a custom storage adapter.
`GraphiQLProps` is now a union that accepts either `fetcher` or
`transport`, but not both. If your wrapper uses `interface AppProps
extends GraphiQLProps`, switch to a type intersection such as `type
AppProps = GraphiQLProps & { applicationName: string }`, even if you
keep using `fetcher`.
GraphiQL added the `operationName` prop in 2016, before tabs existed, so
an embedder could choose which operation to send. With multiple tabs,
one top-level name now overrides requests from every active document.
The same name can refer to different operations in different tabs, or to
nothing in the active tab. It also hides the Run picker and freezes
cursor-driven selection (the case found in #4604). As the editor gained
tab-specific selections, a Run picker, and run-at-cursor, the usefulness
and expected behavior of a global override became less clear.

This removes the prop from `GraphiQL` and `GraphiQLProvider`. Run sends
the operation selected in the active tab through either `transport` or
`fetcher`. Embedders can still observe changes with
`onEditOperationName` and select an operation in the active tab with
`useGraphiQLActions().setOperationName()`. The migration guide explains
the removal. TypeScript integrations will see the removed prop in their
type checks; for JavaScript integrations it is ignored. The execution
test covers two tabs with overlapping operation names.

Tab switches now refresh operation facts immediately. The Run control
and method warning use the active document even when another tab has an
operation with the same name.

Refs #4604
On the v6 branch, one Save action calls every registered plugin handler
and `onSaveQuery`. A host with its own saving behavior and the default
Collections plugin can write to two destinations. Collections also
reports a linked save complete before an asynchronous storage adapter
commits, and a later completion can mark newer editor text as saved.

This makes `registerSaveHandler` the only Save hook and rejects a second
registration. Custom save plugins replace `COLLECTIONS_PLUGIN` in
`DEFAULT_PLUGINS`; the migration guide shows a complete `sessionActions`
recipe. A handler returns `Promise<boolean>`: `true` records the
submitted query snapshot after persistence, `false` leaves it dirty, and
a rejection shows an error. Repeated saves of one tab run in order.
Collections now waits for its adapter for linked operations and the save
dialog, so cancellation and storage failure leave the tab unsaved.

The dirty indicator still compares query text; variables and headers
travel in the submitted tab but do not independently change that
indicator. The release note is folded into the existing Collections
changeset.

The first commit reproduces competing and asynchronous saves. Later
commits remove the top-level prop and make promise completion the only
save handler contract.
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to graphiql-6, this
PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`graphiql-6` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `graphiql-6`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## graphiql@6.0.0-rc.1

### Major Changes

- [#4610](#4610)
[`b40d7fe`](b40d7fe)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Remove the
`operationName` prop from `GraphiQL` and `GraphiQLProvider`. Each
request now uses the operation selected in the active tab. Use the
cursor, Run picker, or `useGraphiQLActions().setOperationName(name)` to
select an operation; `onEditOperationName` still reports selection
changes.

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.

- [#4601](#4601)
[`abf1c84`](abf1c84)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Keep
appearance settings synchronized between `useGraphiQLSettings`
consumers, including the built-in Settings dialog and plugins.

- Updated dependencies
[[`541682b`](541682b),
[`b40d7fe`](b40d7fe),
[`a539b83`](a539b83),
[`abf1c84`](abf1c84)]:
  - @graphiql/react@1.0.0-rc.1
  - @graphiql/plugin-collections@1.0.0-rc.1
  - @graphiql/plugin-doc-explorer@1.0.0-rc.1
  - @graphiql/plugin-history@1.0.0-rc.1
  - @graphiql/plugin-query-builder@1.0.0-rc.1
## @graphiql/react@1.0.0-rc.1

### Major Changes

- [#4610](#4610)
[`b40d7fe`](b40d7fe)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Remove the
`operationName` prop from `GraphiQL` and `GraphiQLProvider`. Each
request now uses the operation selected in the active tab. Use the
cursor, Run picker, or `useGraphiQLActions().setOperationName(name)` to
select an operation; `onEditOperationName` still reports selection
changes.

### Patch Changes

- [#4606](#4606)
[`541682b`](541682b)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Load
Prettier's ESM plugins so GraphQL queries and JSONC variables and
headers can be prettified in Vite development builds without forced
dependency optimization.

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.

- [#4601](#4601)
[`abf1c84`](abf1c84)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Keep
appearance settings synchronized between `useGraphiQLSettings`
consumers, including the built-in Settings dialog and plugins.

- Updated dependencies
[[`a539b83`](a539b83)]:
  - monaco-graphql@2.0.0-rc.1
## cm6-graphql@1.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## @graphiql/plugin-code-exporter@6.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## @graphiql/plugin-collections@1.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## @graphiql/plugin-doc-explorer@1.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## @graphiql/plugin-history@1.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## @graphiql/plugin-query-builder@1.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## graphql-language-service-cli@4.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.

- Updated dependencies
[[`a539b83`](a539b83)]:
  - graphql-language-service-server@3.0.0-rc.1
## graphql-language-service-server@3.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## monaco-graphql@2.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.
## vscode-graphql@1.0.0-rc.1

### Patch Changes

- [#4474](#4474)
[`a539b83`](a539b83)
Thanks [@trevor-scheer](https://github.com/trevor-scheer)! - Restore
caret ranges for internal GraphiQL dependencies. The RC versions sort
after the stale canary and `next` versions that beta ranges selected, so
the exact pins from the beta cycle are no longer necessary.

- Updated dependencies
[[`a539b83`](a539b83)]:
  - graphql-language-service-server@3.0.0-rc.1

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
The optional-features list links to `#custom-save-handlers`, but that
section was replaced by [Saving with your own
plugin](https://github.com/graphql/graphiql/blob/d3f2e0ff74e4a2b3c39d590c4e431fca1ccada79/docs/migration/graphiql-6.0.0.md#saving-with-your-own-plugin).
It also still describes host and plugin save hooks.

Point the link at the existing section and describe the single
registered custom save handler.

This branch was successfully deployed

1 active deployment
deploy — 50841a36 Deployed Oct 1, 2026 by trevor-scheer via Release #1659
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Visual query builder from Graphql schema

1 participant