UNPKG

@graphql-hive/federation-gateway-audit

Version:
195 lines (184 loc) 3.57 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 books = [ { __typename: "Book", id: "1", price: 10.99 }, { __typename: "Book", id: "2", price: 5.99 }, { __typename: "Book", id: "3", price: 10.99 } ]; var a = createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@external", "@provides"] ) type Query { product: Product } interface Product { samePriceProduct: Product } type Book implements Product @key(fields: "id") { id: ID! samePriceProduct: Book @provides(fields: "price") price: Float @external } ` ), resolvers: { Query: { product() { const book = books[0]; return { __typename: book.__typename, id: book.id, price: book.price }; } }, Book: { samePriceProduct(book) { const samePriceBook = books.find( (b) => b.price === book.price && b.id !== book.id ); if (!samePriceBook) { return null; } return { __typename: samePriceBook.__typename, id: samePriceBook.id, price: samePriceBook.price }; } } } }); var b = createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) type Book @key(fields: "id") { id: ID! price: Float @shareable } ` ), resolvers: { Book: { __resolveReference(key) { const book = books.find((b) => b.id === key.id); if (!book) { return null; } return { __typename: book.__typename, id: book.id, price: book.price }; } } } }); var test = [ createTest( /* GraphQL */ ` query { product { samePriceProduct { ... on Product { samePriceProduct { __typename } } } } } `, { data: { product: { samePriceProduct: { samePriceProduct: { __typename: "Book" } } } } } ), createTest( /* GraphQL */ ` query { product { __typename samePriceProduct { __typename ... on Book { id } samePriceProduct { __typename ... on Book { id } } } ... on Book { __typename id price samePriceProduct { id price } } } } `, { data: { product: { __typename: "Book", samePriceProduct: { __typename: "Book", id: "3", samePriceProduct: { __typename: "Book", id: "1" }, price: 10.99 }, id: "1", price: 10.99 } } } ) ]; var index = serve("circular-reference-interface", [a, b], test); export { index as default };