UNPKG

@graphql-hive/federation-gateway-audit

Version:
229 lines (211 loc) 4.2 kB
import { c as createSubgraph, a as createTest, s as serve } from './testkit-BtZjdl4n.js'; import { s as shouldPunishForPoorPlans } from './env-j1f_SZtG.js'; import '@apollo/composition'; import 'graphql'; import 'fets'; import '@apollo/subgraph'; import 'graphql-yoga'; const medias = [ { __typename: "Book", id: "m1", title: "Book 1" }, { __typename: "Movie", id: "m2", title: "Movie 1" } ]; var a = createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable", "@external"] ) type Query { media: [Media] @shareable } union Media = Book | Movie type Book @key(fields: "id") { id: ID! } type Movie @key(fields: "id") { id: ID! } ` ), resolvers: { Query: { media(_p, _a, context) { if (shouldPunishForPoorPlans()) { throw new Error("You should not be using the 'a' subgraph!"); } return medias.map((media) => ({ __typename: media.__typename, id: media.id })); } } } }); var b = createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable", "@provides", "@external"] ) type Query { media: [Media] @shareable @provides(fields: "... on Book { title }") } union Media = Book | Movie type Book @key(fields: "id") { id: ID! title: String @external } type Movie @key(fields: "id") { id: ID! } ` ), resolvers: { Query: { media() { return medias.map((media) => { if (media.__typename === "Book") { return { __typename: media.__typename, id: media.id, title: media.title }; } return { __typename: media.__typename, id: media.id }; }); } } } }); var c = createSubgraph("c", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) type Book @key(fields: "id") { id: ID! title: String @shareable } type Movie @key(fields: "id") { id: ID! title: String @shareable } ` ), resolvers: { Book: { __resolveReference(key, context) { if (shouldPunishForPoorPlans()) { throw new Error("You should be using the 'b' subgraph!"); } const media = medias.find((media2) => media2.id === key.id); if (!media) { return null; } return { __typename: media.__typename, id: media.id, title: media.title }; } }, Movie: { __resolveReference(key) { const media = medias.find((media2) => media2.id === key.id); if (!media) { return null; } return { __typename: media.__typename, id: media.id, title: media.title }; } } } }); var test = [ createTest( /* GraphQL */ ` query { media { ... on Book { id title } ... on Movie { id } } } `, { data: { media: [ { id: "m1", title: "Book 1" }, { id: "m2" } ] } } ), createTest( /* GraphQL */ ` query { media { ... on Book { id title } ... on Movie { id title } } } `, { data: { media: [ { id: "m1", title: "Book 1" }, { id: "m2", title: "Movie 1" } ] } } ) ]; var index = serve("provides-on-union", [a, b, c], test); export { index as default };