Skip to content

Commit 89d804b

Browse files
authored
Add Items connection mode (#151)
* Add Items connection mode * Fixes erroneous reference to edges
1 parent e146c92 commit 89d804b

File tree

7 files changed

+41
-7
lines changed

7 files changed

+41
-7
lines changed

docs/guide/connection-mode.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ It seems that there are several standards within the GraphQL community how conne
66
records) are designed. Some do this via a `nodes` field, some via a `edges { nodes }` query and some do neither of them.
77
Vuex-ORM-GraphQL tries to be flexible and supports all of them.
88

9-
There are four possible modes: `AUTO`, `NODES`, `EDGES`, `PLAIN`. The Adapter you use will tell the
9+
There are four possible modes: `AUTO`, `NODES`, `EDGES`, `PLAIN`, `ITEMS`. The Adapter you use will tell the
1010
plugin which ConnectionMode to use. In the DefaultAdapter this is `AUTO`.
1111

1212

@@ -22,7 +22,7 @@ In rare cases the automatic detection might fail or report the wrong mode. In th
2222
manually set the connection mode via a custom adapter. The modes and the resulting
2323
queries are explained in the next sections.
2424

25-
## Mode 1: `plain`
25+
## Mode 1: `plain`
2626

2727
The third mode is the less preferred one due to the lack of meta information. In this case we just plain pass the field
2828
queries:
@@ -54,8 +54,8 @@ query Users {
5454
}
5555
```
5656

57-
58-
## Mode 3: `edges`
57+
58+
## Mode 3: `edges`
5959

6060
This mode uses a `edges` not to query the edge an then query the `node` within that edge:
6161

@@ -72,3 +72,19 @@ query Users {
7272
}
7373
}
7474
```
75+
76+
## Mode 4: `items`
77+
78+
This is the mode used for handling the shape of AWS AppSync queries. Using `items` (or letting the plugin auto detect this mode) will lead to the following query when calling `User.fetch()`:
79+
80+
```
81+
query Users {
82+
users {
83+
items {
84+
id
85+
email
86+
name
87+
}
88+
}
89+
}
90+
```

docs/guide/setup.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const options = {
6969
fetchPolicy: 'cache-and-network'
7070
}
7171
},
72-
connectionQueryMode: 'nodes',
72+
connectionQueryMode: 'items',
7373
database: database,
7474
url: awsexports.aws_appsync_graphqlEndpoint,
7575
includeExtensions: true,

src/adapters/adapter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ export enum ConnectionMode {
44
AUTO,
55
PLAIN,
66
NODES,
7-
EDGES
7+
EDGES,
8+
ITEMS
89
}
910

1011
export enum ArgumentMode {

src/common/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export default class Context {
8585
private schemaWillBeLoaded: Promise<Schema> | undefined;
8686

8787
/**
88-
* Defines how to query connections. 'auto' | 'nodes' | 'edges' | 'plain'
88+
* Defines how to query connections. 'auto' | 'nodes' | 'edges' | 'plain' | 'items'
8989
*/
9090
public connectionMode: ConnectionMode = ConnectionMode.AUTO;
9191

src/graphql/query-builder.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ export default class QueryBuilder {
7171
}
7272
}
7373
`;
74+
} else if (context.connectionMode === ConnectionMode.ITEMS) {
75+
return `
76+
${header} {
77+
items {
78+
${fields}
79+
}
80+
}
81+
`;
7482
} else {
7583
return `
7684
${header} {

src/graphql/schema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ export default class Schema {
5555
return ConnectionMode.NODES;
5656
} else if (connection!.fields!.find(f => f.name === "edges")) {
5757
return ConnectionMode.EDGES;
58+
} else if (connection!.fields!.find(f => f.name === "items")) {
59+
return ConnectionMode.ITEMS;
5860
} else {
5961
return ConnectionMode.PLAIN;
6062
}

src/graphql/transformer.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ export default class Transformer {
162162
);
163163
} else if (data["node"] && context.connectionMode === ConnectionMode.EDGES) {
164164
result = this.transformIncomingData(data["node"], localModel, mutation, true);
165+
} else if (data[key].items && context.connectionMode === ConnectionMode.ITEMS) {
166+
result[pluralize(key)] = this.transformIncomingData(
167+
data[key].items,
168+
localModel,
169+
mutation,
170+
true
171+
);
165172
} else {
166173
let newKey = key;
167174

0 commit comments

Comments
 (0)