UNPKG

@graphql-hive/federation-gateway-audit

Version:
305 lines (287 loc) 5.41 kB
import { c as createSubgraph, a as createTest, s as serve } from './testkit-BtZjdl4n.js'; import '@apollo/composition'; import 'graphql'; import 'fets'; import '@apollo/subgraph'; import 'graphql-yoga'; const users = [ { id: "u1", name: "u1-name", address: "a1" }, { id: "u2", name: "u2-name", address: "a2" } ]; const addresses = [ { __typename: "HomeAddress", id: "a1", city: "a1-city", country: "a1-country" }, { __typename: "WorkAddress", id: "a2", city: "a2-city", country: "a2-country" } ]; var a = createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@requires", "@external", "@shareable"] ) type Query { a: User } interface Address { id: ID! } type HomeAddress implements Address @key(fields: "id") { id: ID! city: String @shareable } type WorkAddress implements Address @key(fields: "id") { id: ID! city: String @shareable } type User @key(fields: "id") { id: ID! name: String! @shareable address: Address @external city: String @requires(fields: "address { id }") country: String @requires(fields: "address { ... on WorkAddress { id } }") } ` ), resolvers: { Query: { a() { const user = users[0]; return { id: user.id, name: user.name }; } }, User: { __resolveReference(key) { const user = users.find((user2) => user2.id === key.id); if (!user) { return null; } if (key.address?.id) { return { id: user.id, name: user.name, address: { id: user.address } }; } return { id: user.id, name: user.name }; }, city(user) { return addresses.find((address) => address.id === user.address.id)?.city; }, country(user) { return addresses.find((address) => address.id === user?.address?.id)?.country; } }, HomeAddress: { __resolveReference(key) { return addresses.find((address) => address.id === key.id); } }, WorkAddress: { __resolveReference(key) { return addresses.find((address) => address.id === key.id); } } } }); var b = createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) type Query { b: User } interface Address { id: ID! } type HomeAddress implements Address @key(fields: "id") { id: ID! city: String @shareable } type WorkAddress implements Address @key(fields: "id") { id: ID! city: String @shareable } type SecondAddress implements Address @key(fields: "id") { id: ID! city: String @shareable } type User @key(fields: "id") { id: ID! name: String! @shareable address: Address @shareable } ` ), resolvers: { Query: { b() { const user = users[1]; return { id: user.id, name: user.name, address: user.address }; } }, User: { __resolveReference(key) { const user = users.find((user2) => user2.id === key.id); if (!user) { return null; } return { id: user.id, name: user.name, address: user.address }; }, address(user) { return addresses.find((address) => address.id === user.address); } }, HomeAddress: { __resolveReference(key) { return addresses.find((address) => address.id === key.id); } }, WorkAddress: { __resolveReference(key) { return addresses.find((address) => address.id === key.id); } } } }); var test = [ createTest( /* GraphQL */ ` query { a { city } } `, { data: { a: { city: "a1-city" } } } ), createTest( /* GraphQL */ ` query { b { city } } `, { data: { b: { city: "a2-city" } } } ), createTest( /* GraphQL */ ` query { a { country } } `, { data: { a: { country: null } } } ), createTest( /* GraphQL */ ` query { a { address { __typename id } } } `, { data: { a: { address: { __typename: "HomeAddress", id: "a1" } } } } ), createTest( /* GraphQL */ ` query { b { address { __typename id } } } `, { data: { b: { address: { __typename: "WorkAddress", id: "a2" } } } } ) ]; var index = serve("requires-interface", [a, b], test); export { index as default };