-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
First draft for upgrade guide to v17 #4310
base: 16.x.x
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,129 @@ | ||||||
--- | ||||||
title: Upgrading from v16 to v17 | ||||||
sidebarTitle: v16 to v17 | ||||||
--- | ||||||
|
||||||
import { Tabs } from 'nextra/components'; | ||||||
|
||||||
# Breaking changes | ||||||
|
||||||
## Default values | ||||||
|
||||||
Previously default-values were assumed to be coerced internal values, now | ||||||
we will treat them like a pre-coerced external input value. This equalises | ||||||
how we treat default-values in SDL and variables over JSON. | ||||||
|
||||||
This goes hand-in-hand with the deprecation of `astFromValue` in favor of `valueToLiteral`. | ||||||
|
||||||
## GraphQLError constructor arguments | ||||||
|
||||||
The `GraphQLError` constructor now only accepts a message and options object as arguments. Previously, it also accepted positional arguments. | ||||||
|
||||||
```diff | ||||||
- new GraphQLError('message', 'source', 'positions', 'path', 'originalError', 'extensions'); | ||||||
+ new GraphQLError('message', { source, positions, path, originalError, extensions }); | ||||||
``` | ||||||
|
||||||
## `createSourceEventStream` arguments | ||||||
|
||||||
The `createSourceEventStream` function now only accepts an object as an argument. Previously, it also accepted positional arguments. | ||||||
|
||||||
```diff | ||||||
- createSourceEventStream(schema, document, rootValue, contextValue, variableValues, operationName); | ||||||
+ createSourceEventStream({ schema, document, rootValue, contextValue, variableValues, operationName }); | ||||||
``` | ||||||
|
||||||
## `execute` will error for incremental delivery | ||||||
|
||||||
The `execute` function will now throw an error if it sees a `@defer` or `@stream` directive. Use `experimentalExecuteIncrementally` instead. | ||||||
If you know you are dealing with incremental delivery requests, you can replace the import. | ||||||
|
||||||
```diff | ||||||
- import { execute } from 'graphql'; | ||||||
+ import { experimentalExecuteIncrementally as execute } from 'graphql'; | ||||||
``` | ||||||
|
||||||
## Remove incremental delivery support from `subscribe` | ||||||
|
||||||
In case you have fragments that you use with `defer/stream` that end up in a subscription, | ||||||
use the `if` argument of the directive to disable it in your subscription operation | ||||||
|
||||||
## `subscribe` return type | ||||||
|
||||||
The `subscribe` function can now also return a non-Promise value, previously this was only a Promise. | ||||||
This shouldn't change a lot as `await value` will still work as expected. This could lead to | ||||||
some typing inconsistencies though. | ||||||
|
||||||
## Remove `singleResult` from incremental results | ||||||
|
||||||
You can remove branches that check for `singleResult` in your code, as it is no longer used. | ||||||
|
||||||
## Node support | ||||||
|
||||||
Dropped support for Node 14 (subject to change) | ||||||
|
||||||
## Removed `TokenKindEnum`, `KindEnum` and `DirectiveLocationEnum` types | ||||||
|
||||||
We have removed the `TokenKindEnum`, `KindEnum` and `DirectiveLocationEnum` types, | ||||||
use `Kind`, `TokenKind` and `DirectiveLocation` instead. https://github.com/graphql/graphql-js/pull/3579 | ||||||
|
||||||
## Removed `graphql/subscription` module | ||||||
|
||||||
use `graphql/execution` instead for subscriptions, all execution related exports have been | ||||||
unified there. | ||||||
|
||||||
## Removed `GraphQLInterfaceTypeNormalizedConfig` export | ||||||
|
||||||
Use `ReturnType<GraphQLInterfaceType['toConfig']>` if you really need this | ||||||
|
||||||
## Empty AST collections will be undefined | ||||||
|
||||||
Empty AST collections will be presented by `undefined` rather than an empty array. | ||||||
|
||||||
## `Info.variableValues` | ||||||
|
||||||
The shape of `Info.variableValues` has changed to be an object containing | ||||||
`sources` and `coerced` as keys. | ||||||
|
||||||
A Source contains the `signature` and provided `value` pre-coercion for the | ||||||
variable. A `signature` is an object containing the `name`, `input-type` and | ||||||
`defaultValue` for the variable. | ||||||
|
||||||
## Removals | ||||||
|
||||||
- Removed exported `getOperationType` function | ||||||
- Removed exported `getVisitFn` function | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
- Removed exported `printError` and `formatError` utilities | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
- Removed exported `assertValidName` and `isValidNameError` utilities | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we have a standard of doing empty braces? Feels a bit redundant There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. removed, to each their own! |
||||||
- Removed exported `assertValidExecutionArguments` function | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We haven't actually deprecated this in v16 I think, I will submit a PR to do this. All the additional checks in that function are now just performed by TS. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||
- Removed `getFieldDefFn` from `TypeInfo` | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would heavily avoid subjective strengtheners like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I switched it to the "if you really need this" construction used elsewhere |
||||||
- Removed `TypeInfo` from `validate` https://github.com/graphql/graphql-js/pull/4187 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
I removed the reference to the PR which has no additional info, and we didn't link to PRs generally, but it's fine really to keep. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mean, the PR's having no context is its own issue. You're right though, none of the PR's give the context we require to pick all of this up. Not sure whether we need to specify whether it was deprecated though, I don't think that matters at all There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The advantage of sprinkling the word deprecating in is that it hopefully gives the reader the (correct) understanding that although the list of breaking changes may be lengthy, it is shorter if they are not using deprecated functionality. This might be immediately helpful to those who know that they are not using deprecated functionality and might encourage those still using deprecated functionality to migrate off of it if they have not done so. I have changed elsewhere In terms of the no context on the linked PR, that is certainly my bad as it is mine, I take that constructive criticism, will try to improve in the future. I have edited suggestion above to give more context inline. |
||||||
|
||||||
## Deprecations | ||||||
|
||||||
- Deprecated `astFromValue` use `valueToLiteral` instead, when leveraging `valueToLiteral` ensure | ||||||
that you are working with externally provided values i.e. the SDL provided defaultValue to a variable. | ||||||
- Deprecated `valueFormAST` use `coerceInputLiteral` instead | ||||||
|
||||||
## New Features | ||||||
|
||||||
- Added `hideSuggestions` option to `execute`/`validate`/`subscribe`/... to hide schema-suggestions in error messages | ||||||
- Added `abortSignal` option to `graphql()`, `execute()`, and `subscribe()` allows cancellation of these methods; | ||||||
the `abortSignal` can also be passed to field resolvers to cancel asynchronous work that they initiate. | ||||||
- `extensions` support `symbol` keys, in addition to the normal string keys. | ||||||
|
||||||
## New Experimental Features | ||||||
|
||||||
### Experimental Support for Incremental Delivery | ||||||
|
||||||
- [Spec PR](https://github.com/graphql/graphql-spec/pull/1110) / [RFC](https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md) | ||||||
- enabled only when using `experimentalExecuteIncrementally()`, use of a schema or operation with `@defer`/`@stream` directives within `execute()` will now throw. | ||||||
- enable early execution with the new `enableEarlyExecution` configuration option for `experimentalExecuteIncrementally()`. | ||||||
|
||||||
### Experimental Support for Fragment Arguments | ||||||
|
||||||
- [Spec PR](https://github.com/graphql/graphql-spec/pull/1081) | ||||||
- enable with the new `experimentalFragmentArguments` configuration option for `parse()`. | ||||||
- new experimental `Kind.FRAGMENT_ARGUMENT` for visiting | ||||||
- new experimental `TypeInfo` methods and options for handling fragment arguments. | ||||||
- coerce AST via new function `coerceInputLiteral()` with experimental fragment variables argument (as opposed to deprecated `valueFromAST()` function). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.