Skip to content

Commit 9c414e3

Browse files
committed
Align codegen and language server inline fragment __typename use
The `withTypenameFieldAddedWhereNeeded` utility in `apollo-language-server` was updated in #1286 to make sure `__typename`'s are added to inline fragments, when used by commands like `client:push`. The `apollo-codegen-core` package currently uses its own copy of `withTypenameFieldAddedWhereNeeded` however, which was not updated. This means that operations can be registered (in Apollo's operation registry) via `client:push` that don't line up with the operations output by codegen. This commit adjusts the `apollo-codegen-core` package to use the same `withTypenameFieldAddedWhereNeeded` function as `apollo-language-server` (which is already a dependency of codegen), to make sure the operations output from codegen line up with the operations pushed via `client:push`.
1 parent 6bcaa78 commit 9c414e3

7 files changed

Lines changed: 19 additions & 45 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
- Export useful operation sanitization transforms [PR #2057](https://github.com/apollographql/apollo-tooling/pull/2057)
99
- Preserve directive usages on SchemaDefinition nodes in `buildSchemaFromSDL` [PR #2457](https://github.com/apollographql/apollo-tooling/pull/2457)
1010

11+
- `apollo-language-server` / `apollo-codegen-core`
12+
- Adjust `apollo-codegen-core` to use the same `withTypenameFieldAddedWhereNeeded` utility as `apollo-language-server`, to make sure modified operations align between codegen and anything leveraging the language server utility functions (like the `client:push` command). <br/>
13+
[@hwillson](https://github.com/hwillson) in [#2473](https://github.com/apollographql/apollo-tooling/pull/2473)
14+
1115
## `apollo@2.33.7`
1216

1317
- `apollo-graphql@0.9.4`

packages/apollo-codegen-core/src/__tests__/__snapshots__/jsonOutput.ts.snap

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ exports[`JSON output should generate JSON output for a query with a fragment spr
202202
\\"fragmentsReferenced\\": [
203203
\\"CharacterDetails\\"
204204
],
205-
\\"sourceWithFragments\\": \\"query HeroAndDetails {\\\\n hero {\\\\n __typename\\\\n id\\\\n ...CharacterDetails\\\\n }\\\\n}\\\\nfragment CharacterDetails on Character {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n primaryFunction\\\\n }\\\\n ... on Human {\\\\n height\\\\n }\\\\n}\\",
206-
\\"operationId\\": \\"9ea2d583a2bcf98ddcedc95a807e34011ff3c0f66fabaf01fa0169e4a4159121\\"
205+
\\"sourceWithFragments\\": \\"query HeroAndDetails {\\\\n hero {\\\\n __typename\\\\n id\\\\n ...CharacterDetails\\\\n }\\\\n}\\\\nfragment CharacterDetails on Character {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n __typename\\\\n primaryFunction\\\\n }\\\\n ... on Human {\\\\n __typename\\\\n height\\\\n }\\\\n}\\",
206+
\\"operationId\\": \\"8382c257b6468c99d5f57b35465ec8b2f8ad6cba4ea6f7dbf4040894787c8e02\\"
207207
}
208208
],
209209
\\"fragments\\": [
@@ -215,7 +215,7 @@ exports[`JSON output should generate JSON output for a query with a fragment spr
215215
],
216216
\\"fragmentName\\": \\"CharacterDetails\\",
217217
\\"filePath\\": \\"GraphQL request\\",
218-
\\"source\\": \\"fragment CharacterDetails on Character {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n primaryFunction\\\\n }\\\\n ... on Human {\\\\n height\\\\n }\\\\n}\\",
218+
\\"source\\": \\"fragment CharacterDetails on Character {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n __typename\\\\n primaryFunction\\\\n }\\\\n ... on Human {\\\\n __typename\\\\n height\\\\n }\\\\n}\\",
219219
\\"fields\\": [
220220
{
221221
\\"responseName\\": \\"__typename\\",
@@ -707,7 +707,7 @@ exports[`JSON output should list all interfaces and their implementing types und
707707
\\"operationType\\": \\"query\\",
708708
\\"rootType\\": \\"Query\\",
709709
\\"variables\\": [],
710-
\\"source\\": \\"query HeroForEpisode {\\\\n hero(episode: JEDI) {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n primaryFunction\\\\n }\\\\n }\\\\n}\\",
710+
\\"source\\": \\"query HeroForEpisode {\\\\n hero(episode: JEDI) {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n __typename\\\\n primaryFunction\\\\n }\\\\n }\\\\n}\\",
711711
\\"fields\\": [
712712
{
713713
\\"responseName\\": \\"hero\\",
@@ -779,8 +779,8 @@ exports[`JSON output should list all interfaces and their implementing types und
779779
\\"fragmentSpreads\\": [],
780780
\\"inlineFragments\\": [],
781781
\\"fragmentsReferenced\\": [],
782-
\\"sourceWithFragments\\": \\"query HeroForEpisode {\\\\n hero(episode: JEDI) {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n primaryFunction\\\\n }\\\\n }\\\\n}\\",
783-
\\"operationId\\": \\"173a7ebf41abd014f3fc54ddd007f6182fca738bd44a1e2d1bb75503c8bf79f6\\"
782+
\\"sourceWithFragments\\": \\"query HeroForEpisode {\\\\n hero(episode: JEDI) {\\\\n __typename\\\\n name\\\\n ... on Droid {\\\\n __typename\\\\n primaryFunction\\\\n }\\\\n }\\\\n}\\",
783+
\\"operationId\\": \\"ea3ecdd4626f2b1423ed6c91cf4a0f1b506b66391c6ab2bb67f1c605bcdcaf8e\\"
784784
}
785785
],
786786
\\"fragments\\": [],
@@ -807,7 +807,7 @@ exports[`JSON output should list all unions and their types under a \`unionTypes
807807
\\"operationType\\": \\"query\\",
808808
\\"rootType\\": \\"Query\\",
809809
\\"variables\\": [],
810-
\\"source\\": \\"query Search {\\\\n search(text: \\\\\\"an\\\\\\") {\\\\n __typename\\\\n ... on Human {\\\\n name\\\\n height\\\\n }\\\\n ... on Droid {\\\\n name\\\\n primaryFunction\\\\n }\\\\n ... on Starship {\\\\n name\\\\n length\\\\n }\\\\n }\\\\n}\\",
810+
\\"source\\": \\"query Search {\\\\n search(text: \\\\\\"an\\\\\\") {\\\\n __typename\\\\n ... on Human {\\\\n __typename\\\\n name\\\\n height\\\\n }\\\\n ... on Droid {\\\\n __typename\\\\n name\\\\n primaryFunction\\\\n }\\\\n ... on Starship {\\\\n __typename\\\\n name\\\\n length\\\\n }\\\\n }\\\\n}\\",
811811
\\"fields\\": [
812812
{
813813
\\"responseName\\": \\"search\\",
@@ -935,8 +935,8 @@ exports[`JSON output should list all unions and their types under a \`unionTypes
935935
\\"fragmentSpreads\\": [],
936936
\\"inlineFragments\\": [],
937937
\\"fragmentsReferenced\\": [],
938-
\\"sourceWithFragments\\": \\"query Search {\\\\n search(text: \\\\\\"an\\\\\\") {\\\\n __typename\\\\n ... on Human {\\\\n name\\\\n height\\\\n }\\\\n ... on Droid {\\\\n name\\\\n primaryFunction\\\\n }\\\\n ... on Starship {\\\\n name\\\\n length\\\\n }\\\\n }\\\\n}\\",
939-
\\"operationId\\": \\"9887ff0652e14d678a66769b853c41293d4afb1d1338bbbdb9f84e66979605dd\\"
938+
\\"sourceWithFragments\\": \\"query Search {\\\\n search(text: \\\\\\"an\\\\\\") {\\\\n __typename\\\\n ... on Human {\\\\n __typename\\\\n name\\\\n height\\\\n }\\\\n ... on Droid {\\\\n __typename\\\\n name\\\\n primaryFunction\\\\n }\\\\n ... on Starship {\\\\n __typename\\\\n name\\\\n length\\\\n }\\\\n }\\\\n}\\",
939+
\\"operationId\\": \\"4e878da6864f199125278cef600dbd9609d553cec95f363324dea5ca7410e4c5\\"
940940
}
941941
],
942942
\\"fragments\\": [],

packages/apollo-codegen-core/src/compiler/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ import {
3636
getFieldDef,
3737
valueFromValueNode,
3838
filePathForNode,
39-
withTypenameFieldAddedWhereNeeded,
4039
isMetaFieldName
4140
} from "../utilities/graphql";
4241

42+
import { withTypenameFieldAddedWhereNeeded } from "apollo-language-server";
43+
4344
export interface CompilerOptions {
4445
addTypename?: boolean;
4546
mergeInFieldsFromFragmentSpreads?: boolean;

packages/apollo-codegen-core/src/utilities/__tests__/graphql.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { parse, print } from "graphql";
22
import {
3-
withTypenameFieldAddedWhereNeeded,
43
removeConnectionDirectives,
54
removeClientDirectives
65
} from "../graphql";
6+
import { withTypenameFieldAddedWhereNeeded } from "apollo-language-server";
77

88
describe("typename additions", () => {
99
it("adds typenames to selectionSets", () => {

packages/apollo-codegen-core/src/utilities/graphql.ts

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -81,38 +81,6 @@ const typenameField = {
8181
name: { kind: Kind.NAME, value: "__typename" }
8282
};
8383

84-
export function withTypenameFieldAddedWhereNeeded(ast: ASTNode) {
85-
return visit(ast, {
86-
enter: {
87-
SelectionSet(node: SelectionSetNode) {
88-
return {
89-
...node,
90-
selections: node.selections.filter(
91-
selection =>
92-
!(
93-
selection.kind === "Field" &&
94-
(selection as FieldNode).name.value === "__typename"
95-
)
96-
)
97-
};
98-
}
99-
},
100-
leave(node: ASTNode) {
101-
if (!(node.kind === "Field" || node.kind === "FragmentDefinition"))
102-
return undefined;
103-
if (!node.selectionSet) return undefined;
104-
105-
return {
106-
...node,
107-
selectionSet: {
108-
...node.selectionSet,
109-
selections: [typenameField, ...node.selectionSet.selections]
110-
}
111-
};
112-
}
113-
});
114-
}
115-
11684
export function sourceAt(location: Location) {
11785
return location.source.body.slice(location.start, location.end);
11886
}

packages/apollo-language-server/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ export * from "./config";
2525
import * as graphqlTypes from "./graphqlTypes";
2626
export { graphqlTypes };
2727

28-
// debug logger
29-
export { Debug } from "./utilities";
28+
// GraphQL utilities
29+
export { Debug, withTypenameFieldAddedWhereNeeded } from "./utilities";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from "./debouncer";
22
export * from "./uri";
33
export { Debug } from "./debug";
4+
export { withTypenameFieldAddedWhereNeeded } from "./graphql";

0 commit comments

Comments
 (0)