Skip to content

Commit 79a55f3

Browse files
authored
adding docs for JsonToTypedObjectRewriter (#12)
1 parent eb14db1 commit 79a55f3

File tree

3 files changed

+83
-8
lines changed

3 files changed

+83
-8
lines changed

README.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,81 @@ query getUser(id: ID!) {
298298
}
299299
```
300300
301+
### JsonToTypedObjectRewriter
302+
303+
`JsonToTypedObjectRewriter` can be used to rewrite a field that previously is just freeform JSON into a typed graphQL field with proper selections and subseelctions. For example, imagine there's a `user` query with type JSON, like `user: { type: GraphQLJSON }`. However, we'd like to improve our API by properly typing the fields within `user` using a graphQL type named `User` with fields `id`, `name`, `isAdmin`, etc.... For example, we have:
304+
305+
```graphql
306+
query {
307+
user
308+
}
309+
```
310+
311+
and we want to change it to
312+
313+
```graphql
314+
query {
315+
user {
316+
id
317+
name
318+
isAdmin
319+
}
320+
}
321+
```
322+
323+
we can make this change with the following rewriter:
324+
325+
```js
326+
import { JsonToTypedObjectRewriter } from 'graphql-query-rewriter';
327+
328+
// add this to the rewriters array in graphqlRewriterMiddleware(...)
329+
const rewriter = new JsonToTypedObjectRewriter({
330+
fieldName: 'user',
331+
objectFields: [
332+
{ name: 'id' },
333+
{ name: 'name' },
334+
{ name: 'isAdmin' },
335+
]
336+
});
337+
```
338+
339+
This rewriter also supports rewriting subfields recursively by adding a `subfields` array inside of an object field. For example, the rewriter below:
340+
341+
```js
342+
import { JsonToTypedObjectRewriter } from 'graphql-query-rewriter';
343+
344+
// add this to the rewriters array in graphqlRewriterMiddleware(...)
345+
const rewriter = new JsonToTypedObjectRewriter({
346+
fieldName: 'user',
347+
objectFields: [
348+
{ name: 'id' },
349+
{ name: 'name' },
350+
{
351+
name: 'posts'
352+
subfields: [
353+
{ name: 'id' },
354+
{ name: 'title' },
355+
]
356+
},
357+
]
358+
});
359+
```
360+
361+
would rewrite `query { user }` into:
362+
363+
```graphql
364+
query {
365+
user {
366+
id
367+
name
368+
posts {
369+
id
370+
title
371+
}
372+
}
373+
}
374+
```
375+
301376
### NestFieldOutputsRewriter
302377
303378
`NestFieldOutputsRewriter` can be used to move mutation outputs into a nested payload object. It's a best-practice for each mutation in GraphQL to have its own output type, and it's required by the [Relay GraphQL Spec](https://facebook.github.io/relay/docs/en/graphql-server-specification.html#mutations). For example, to migrate the mutation `createUser(input: CreateUserInput!): User!` to a mutation with a proper output payload type like:

src/rewriters/JsonToTypedObjectRewriter.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Rewriter, { RewriterOpts } from './Rewriter';
44

55
interface ObjectField {
66
name: string;
7-
subFields?: ObjectField[];
7+
subfields?: ObjectField[];
88
}
99

1010
interface JsonToTypedObjectRewriterOpts extends RewriterOpts {
@@ -44,11 +44,11 @@ export default class JsonToTypedObjectRewriter extends Rewriter {
4444
private generateSelectionSet(fields: ObjectField[]): SelectionSetNode {
4545
return {
4646
kind: 'SelectionSet',
47-
selections: fields.map(({ name, subFields }) => ({
47+
selections: fields.map(({ name, subfields }) => ({
4848
kind: 'Field',
4949
name: { kind: 'Name', value: name },
50-
...(subFields && {
51-
selectionSet: this.generateSelectionSet(subFields)
50+
...(subfields && {
51+
selectionSet: this.generateSelectionSet(subfields)
5252
})
5353
}))
5454
} as SelectionSetNode;

test/functional/rewriteJsonToTypedObjectRewriter.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ describe('Rewrite query for GraphQLJSON field to be a query for a nested object
4949
objectFields: [
5050
{
5151
name: 'user',
52-
subFields: [
52+
subfields: [
5353
{ name: 'userId' },
5454
{ name: 'userHandle' },
5555
{
5656
name: 'item',
57-
subFields: [{ name: 'itemMeta' }]
57+
subfields: [{ name: 'itemMeta' }]
5858
}
5959
]
6060
}
@@ -146,12 +146,12 @@ describe('Rewrite query for GraphQLJSON field to be a query for a nested object
146146
objectFields: [
147147
{
148148
name: 'user',
149-
subFields: [
149+
subfields: [
150150
{ name: 'userId' },
151151
{ name: 'userHandle' },
152152
{
153153
name: 'item',
154-
subFields: [{ name: 'itemMeta' }]
154+
subfields: [{ name: 'itemMeta' }]
155155
}
156156
]
157157
}

0 commit comments

Comments
 (0)