Skip to content

Commit

Permalink
Fix __typename addition for InlineFragments (#1286)
Browse files Browse the repository at this point in the history
* Fix __typename addition for InlineFragments

We need operation registration's __typename adding to match how
Apollo Client does this in order for query hashes to match.

In order to achieve parity here, I've added the __typename field
to InlineFragments as well. While the __typename on an interface
may be redundant (see new tests for example), it's also a safer
change for me to recommend than anything within Apollo Client.

* Update changelog

* Ignore test files in config

* Update string literals to use Kind
  • Loading branch information
trevor-scheer committed May 21, 2019
1 parent 8e3efb5 commit f4a5c8d
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 3 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
- `apollo-graphql`
- <First `apollo-graphql` related entry goes here>
- `apollo-language-server`
- <First `apollo-language-server` related entry goes here>
- Fix \_\_typename addition for InlineFragments [#1286](https://github.com/apollographql/apollo-tooling/pull/1286)
- `apollo-tools`
- <First `apollo-tools` related entry goes here>
- `vscode-apollo`
Expand Down
3 changes: 2 additions & 1 deletion apollo.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ module.exports = {
client: {
name: "Apollo CLI",
service: "engine@master",
includes: ["./packages/apollo-language-server/**/*.ts"]
includes: ["./packages/apollo-language-server/**/*.ts"],
excludes: ["**/*.test.ts", "**/__tests__/*"]
},
engine: {
frontend: "https://engine-staging.apollographql.com",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import gql from "graphql-tag";
import { print } from "graphql";
import { withTypenameFieldAddedWhereNeeded } from "../graphql";

describe("withTypenameFieldAddedWhereNeeded", () => {
it("properly adds __typename to each selectionSet", () => {
const query = gql`
query Product {
product {
sku
color {
id
value
}
}
}
`;

const withTypenames = withTypenameFieldAddedWhereNeeded(query);

expect(print(withTypenames)).toMatchInlineSnapshot(`
"query Product {
product {
__typename
sku
color {
__typename
id
value
}
}
}
"
`);
});

it("adds __typename to InlineFragment nodes (as ApolloClient does)", () => {
const query = gql`
query CartItems {
product {
items {
... on Table {
material
}
... on Paint {
color
}
}
}
}
`;

const withTypenames = withTypenameFieldAddedWhereNeeded(query);

expect(print(withTypenames)).toMatchInlineSnapshot(`
"query CartItems {
product {
__typename
items {
__typename
... on Table {
__typename
material
}
... on Paint {
__typename
color
}
}
}
}
"
`);
});
});
9 changes: 8 additions & 1 deletion packages/apollo-language-server/src/utilities/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,15 @@ export function withTypenameFieldAddedWhereNeeded(ast: ASTNode) {
}
},
leave(node: ASTNode) {
if (!(node.kind === "Field" || node.kind === "FragmentDefinition"))
if (
!(
node.kind === Kind.FIELD ||
node.kind === Kind.FRAGMENT_DEFINITION ||
node.kind === Kind.INLINE_FRAGMENT
)
) {
return undefined;
}
if (!node.selectionSet) return undefined;

if (true) {
Expand Down

0 comments on commit f4a5c8d

Please sign in to comment.