UNPKG

@graphql-hive/federation-gateway-audit

Version:
383 lines (364 loc) 6.43 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 entities = [ { id: "e1", data: "b1" }, { id: "e2", data: "q1" } ]; const bazs = [ { __typename: "Baz", id: "b1", foo: "b1-foo", bar: "b1-bar", baz: "b1-baz" } ]; const quxs = [ { __typename: "Qux", id: "q1", foo: "q1-foo", bar: "q1-bar", qux: "q1-qux" } ]; var a = createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.5" import: ["@key", "@shareable"] ) type Query @shareable { a: Entity } type Entity @key(fields: "id") { id: ID! data: Foo } interface Foo { foo: String! } interface Bar implements Foo { foo: String! bar: String! } type Baz implements Foo & Bar @shareable { foo: String! bar: String! baz: String! } type Qux implements Foo & Bar @shareable { foo: String! bar: String! qux: String! } ` ), resolvers: { Query: { a() { return entities[1]; } }, Entity: { __resolveReference(key) { const entity = entities.find((e) => e.id === key.id); if (!entity) { return null; } return entity; }, data(entity) { const data = entities.find((e) => e.id === entity.id)?.data; if (!data) { return null; } const baz = bazs.find((b) => b.id === data); if (baz) { return baz; } const qux = quxs.find((q) => q.id === data); if (qux) { return qux; } throw new Error("Invalid data"); } } } }); var b = createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.5" import: [ "@key" "@shareable" "@inaccessible" "@external" "@requires" ] ) type Query @shareable { b: Entity bb: Entity } type Entity @key(fields: "id") { id: ID! data: Foo @external requirer: String! @requires( fields: """ data { foo ... on Bar { bar ... on Baz { baz } ... on Qux { qux } } } """ ) requirer2: String! @requires( fields: """ data { ... on Foo { foo } } """ ) } interface Foo { foo: String! } interface Bar implements Foo { foo: String! bar: String! } type Baz implements Foo & Bar @shareable @inaccessible { foo: String! bar: String! baz: String! } type Qux implements Foo & Bar @shareable { foo: String! bar: String! qux: String! } ` ), resolvers: { Query: { b() { return entities[0]; }, bb() { return entities[1]; } }, Entity: { __resolveReference(key) { const entity = entities.find((e) => e.id === key.id); if (!entity) { return null; } return { ...entity, ...key }; }, data(entity) { const data = entities.find((e) => e.id === entity.id)?.data; if (!data) { return null; } const baz = bazs.find((b) => b.id === data); if (baz) { return baz; } const qux = quxs.find((q) => q.id === data); if (qux) { return qux; } throw new Error("Invalid data"); }, requirer(entity) { if (!("data" in entity)) { throw new Error("Expected entity to have a data field"); } return entity.data.foo + "_requirer"; }, requirer2(entity) { if (!("data" in entity)) { throw new Error("Expected entity to have a data field"); } return entity.data.foo + "_requirer2"; } } } }); var test = [ createTest( /* GraphQL */ ` query { b { id data { __typename } } bb { id data { __typename } } } `, { data: { b: { id: "e1", data: null }, bb: { id: "e2", data: { __typename: "Qux" } } } } ), createTest( /* GraphQL */ ` query { a { requirer } } `, { data: { a: { requirer: "q1-foo_requirer" } } } ), createTest( /* GraphQL */ ` query { a { data { __typename } requirer } } `, { data: { a: { data: { __typename: "Qux" }, requirer: "q1-foo_requirer" } } } ), createTest( /* GraphQL */ ` query { bb { data { __typename } requirer } } `, { data: { bb: { data: { __typename: "Qux" }, requirer: "q1-foo_requirer" } } } ), createTest( /* GraphQL */ ` query { b { data { __typename } requirer } } `, { data: { b: { data: null, requirer: "b1-foo_requirer" } } } ), createTest( /* GraphQL */ ` query { bb { data { __typename } requirer2 } } `, { data: { bb: { data: { __typename: "Qux" }, requirer2: "q1-foo_requirer2" } } } ) ]; var index = serve("requires-with-fragments", [a, b], test); export { index as default };