-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into pr-9136-imports
- Loading branch information
Showing
260 changed files
with
3,469 additions
and
7,816 deletions.
There are no files selected for viewing
5 changes: 5 additions & 0 deletions
5
.changeset/@graphql-codegen_client-preset-9137-dependencies.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"@graphql-codegen/client-preset": patch | ||
--- | ||
dependencies updates: | ||
- Updated dependency [`@graphql-typed-document-node/[email protected]` ↗︎](https://www.npmjs.com/package/@graphql-typed-document-node/core/v/3.2.0) (from `3.1.2`, in `dependencies`) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
--- | ||
'@graphql-codegen/visitor-plugin-common': patch | ||
'@graphql-codegen/typescript-resolvers': patch | ||
--- | ||
|
||
Fix `ResolversUnionTypes` being used in `ResolversParentTypes` | ||
|
||
Previously, objects with mappable fields are converted to Omit format that references its own type group or `ResolversTypes` or `ResolversParentTypes` e.g. | ||
|
||
```ts | ||
export type ResolversTypes = { | ||
Book: ResolverTypeWrapper<BookMapper>; | ||
BookPayload: ResolversTypes["BookResult"] | ResolversTypes["StandardError"]; | ||
// Note: `result` on the next line references `ResolversTypes["Book"]` | ||
BookResult: ResolverTypeWrapper<Omit<BookResult, "result"> & { result?: Maybe<ResolversTypes["Book"]> }>; | ||
StandardError: ResolverTypeWrapper<StandardError>; | ||
}; | ||
|
||
export type ResolversParentTypes = { | ||
Book: BookMapper; | ||
BookPayload: ResolversParentTypes["BookResult"] | ResolversParentTypes["StandardError"]; | ||
// Note: `result` on the next line references `ResolversParentTypes["Book"]` | ||
BookResult: Omit<BookResult, "result"> & { result?: Maybe<ResolversParentTypes["Book"]> }; | ||
StandardError: StandardError; | ||
}; | ||
``` | ||
|
||
In https://github.com/dotansimha/graphql-code-generator/pull/9069, we extracted resolver union types to its own group: | ||
|
||
```ts | ||
export type ResolversUnionTypes = { | ||
// Note: `result` on the next line references `ResolversTypes["Book"]` which is only correct for the `ResolversTypes` case | ||
BookPayload: (Omit<BookResult, "result"> & { result?: Maybe<ResolversTypes["Book"]> }) | StandardError; | ||
}; | ||
|
||
export type ResolversTypes = { | ||
Book: ResolverTypeWrapper<BookMapper>; | ||
BookPayload: ResolverTypeWrapper<ResolversUnionTypes["BookPayload"]>; | ||
BookResult: ResolverTypeWrapper<Omit<BookResult, "result"> & { result?: Maybe<ResolversTypes["Book"]> }>; | ||
StandardError: ResolverTypeWrapper<StandardError>; | ||
}; | ||
|
||
export type ResolversParentTypes = { | ||
Book: BookMapper; | ||
BookPayload: ResolversUnionTypes["BookPayload"]; | ||
BookResult: Omit<BookResult, "result"> & { result?: Maybe<ResolversParentTypes["Book"]> }; | ||
StandardError: StandardError; | ||
}; | ||
``` | ||
|
||
This change creates an extra `ResolversUnionParentTypes` that is referenced by `ResolversParentTypes` to ensure backwards compatibility: | ||
|
||
```ts | ||
export type ResolversUnionTypes = { | ||
BookPayload: (Omit<BookResult, "result"> & { result?: Maybe<ResolversParentTypes["Book"]> }) | StandardError; | ||
}; | ||
|
||
// ... and the reference is changed in ResolversParentTypes: | ||
export type ResolversParentTypes = { | ||
// ... other fields | ||
BookPayload: ResolversUnionParentTypes["BookPayload"]; | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
--- | ||
'@graphql-codegen/plugin-helpers': minor | ||
'@graphql-codegen/cli': minor | ||
--- | ||
|
||
Add `watchPattern` config option for `generates` sections. | ||
|
||
By default, `watch` mode automatically watches all GraphQL schema and document files. This means when a change is detected, Codegen CLI is run. | ||
|
||
A user may want to run Codegen CLI when non-schema and non-document files are changed. Each `generates` section now has a `watchPattern` option to allow more file patterns to be added to the list of patterns to watch. | ||
|
||
In the example below, mappers are exported from `schema.mappers.ts` files. We want to re-run Codegen if the content of `*.mappers.ts` files change because they change the generated types file. To solve this, we can add mapper file patterns to watch using the glob pattern used for schema and document files. | ||
|
||
```ts | ||
// codegen.ts | ||
const config: CodegenConfig = { | ||
schema: 'src/schema/**/*.graphql', | ||
generates: { | ||
'src/schema/types.ts': { | ||
plugins: ['typescript', 'typescript-resolvers'], | ||
config: { | ||
mappers: { | ||
User: './user/schema.mappers#UserMapper', | ||
Book: './book/schema.mappers#BookMapper', | ||
}, | ||
} | ||
watchPattern: 'src/schema/**/*.mappers.ts', // Watches mapper files in `watch` mode. Use an array for multiple patterns e.g. `['src/*.pattern1.ts','src/*.pattern2.ts']` | ||
}, | ||
}, | ||
}; | ||
``` | ||
|
||
Then, run Codegen CLI in `watch` mode: | ||
|
||
```shell | ||
yarn graphql-codegen --watch | ||
``` | ||
|
||
Now, updating `*.mappers.ts` files re-runs Codegen! 🎉 | ||
|
||
Note: `watchPattern` is only used in `watch` mode i.e. running CLI with `--watch` flag. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@graphql-codegen/typescript': patch | ||
--- | ||
|
||
Properly escape enum identifiers when enumsAsConst is used |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
--- | ||
'@graphql-codegen/typed-document-node': major | ||
'@graphql-codegen/gql-tag-operations': major | ||
'@graphql-codegen/client-preset': major | ||
--- | ||
|
||
Add `TypedDocumentNode` string alternative that doesn't require GraphQL AST on the client. This change requires `@graphql-typed-document-node/core` in version `3.2.0` or higher. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@graphql-codegen/testing': patch | ||
--- | ||
|
||
Add complex test cases for resolvers tests |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
--- | ||
'@graphql-codegen/visitor-plugin-common': minor | ||
'@graphql-codegen/typescript-resolvers': minor | ||
--- | ||
|
||
[typescript-resolvers] Add `resolversNonOptionalTypename` config option. | ||
|
||
This is extending on `ResolversUnionTypes` implemented in https://github.com/dotansimha/graphql-code-generator/pull/9069 | ||
|
||
`resolversNonOptionalTypename` adds non-optional `__typename` to union members of `ResolversUnionTypes`, without affecting the union members' base intefaces. | ||
|
||
A common use case for non-optional `__typename` of union members is using it as the common field to work out the final schema type. This makes implementing the union's `__resolveType` very simple as we can use `__typename` to decide which union member the resolved object is. Without this, we have to check the existence of field/s on the incoming object which could be verbose. | ||
|
||
For example, consider this schema: | ||
|
||
```graphql | ||
type Query { | ||
book(id: ID!): BookPayload! | ||
} | ||
|
||
type Book { | ||
id: ID! | ||
isbn: String! | ||
} | ||
|
||
type BookResult { | ||
node: Book | ||
} | ||
|
||
type PayloadError { | ||
message: String! | ||
} | ||
|
||
union BookPayload = BookResult | PayloadError | ||
``` | ||
|
||
*With optional `__typename`:* We need to check existence of certain fields to resolve type in the union resolver: | ||
|
||
```ts | ||
// Query/book.ts | ||
export const book = async () => { | ||
try { | ||
const book = await fetchBook(); | ||
// 1. No `__typename` in resolver results... | ||
return { | ||
node: book | ||
} | ||
} catch(e) { | ||
return { | ||
message: "Failed to fetch book" | ||
} | ||
} | ||
} | ||
|
||
// BookPayload.ts | ||
export const BookPayload = { | ||
__resolveType: (parent) => { | ||
// 2. ... means more checks in `__resolveType` | ||
if('message' in parent) { | ||
return 'PayloadError'; | ||
} | ||
return 'BookResult' | ||
} | ||
} | ||
``` | ||
|
||
*With non-optional `__typename`:* Resolvers declare the type. This which gives us better TypeScript support in resolvers and simplify `__resolveType` implementation: | ||
|
||
```ts | ||
// Query/book.ts | ||
export const book = async () => { | ||
try { | ||
const book = await fetchBook(); | ||
// 1. `__typename` is declared in resolver results... | ||
return { | ||
__typename: 'BookResult', // 1a. this also types `node` for us 🎉 | ||
node: book | ||
} | ||
} catch(e) { | ||
return { | ||
__typename: 'PayloadError', | ||
message: "Failed to fetch book" | ||
} | ||
} | ||
} | ||
|
||
// BookPayload.ts | ||
export const BookPayload = { | ||
__resolveType: (parent) => parent.__typename, // 2. ... means a very simple check in `__resolveType` | ||
} | ||
``` | ||
|
||
*Using `resolversNonOptionalTypename`:* add it into `typescript-resolvers` plugin config: | ||
|
||
```ts | ||
// codegen.ts | ||
const config: CodegenConfig = { | ||
schema: 'src/schema/**/*.graphql', | ||
generates: { | ||
'src/schema/types.ts': { | ||
plugins: ['typescript', 'typescript-resolvers'], | ||
config: { | ||
resolversNonOptionalTypename: true // Or `resolversNonOptionalTypename: { unionMember: true }` | ||
} | ||
}, | ||
}, | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
43 changes: 0 additions & 43 deletions
43
dev-test/gql-tag-operations-masking-star-wars/gql/fragment-masking.ts
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.