UNPKG

@graphql-hive/federation-gateway-audit

Version:
338 lines (318 loc) 6.98 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 products$1 = [ { id: "1", pid: "p1", categoryId: "c1", price: 100 }, { id: "2", pid: "p2", categoryId: "c2", price: 200 } ]; const categories = [ { id: "c1", tag: "t1", mainProduct: "1" }, { id: "c2", tag: "t2", mainProduct: "2" } ]; var link = createSubgraph("link", { typeDefs: ( /* GraphQL */ ` extend schema @link(url: "https://specs.apollo.dev/federation/v2.0", import: ["@key"]) type Product @key(fields: "id") @key(fields: "id pid") { id: String! pid: String! } ` ), resolvers: { Product: { __resolveReference(key) { if ("pid" in key) { return products$1.find( (product) => product.id === key.id && product.pid === key.pid ); } return products$1.find((product) => product.id === key.id); } } } }); var list = createSubgraph("list", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.0" import: ["@key", "@shareable"] ) type ProductList @key(fields: "products{id pid}") { products: [Product!]! first: Product @shareable selected: Product @shareable } type Product @key(fields: "id pid") { id: String! pid: String } ` ), resolvers: { ProductList: { __resolveReference(key) { const prods = products$1.filter( (p) => key.products.some((k) => k.id === p.id && k.pid === p.pid) ); return { products: prods, first: prods[0], selected: prods[1] }; } }, Product: { __resolveReference(key) { return products$1.find( (product) => product.id === key.id && product.pid === key.pid ); } } } }); var price = createSubgraph("price", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.0" import: ["@key", "@shareable"] ) type ProductList @key(fields: "products{id pid category{id tag}} selected{id}") { products: [Product!]! first: Product @shareable selected: Product @shareable } type Product @key(fields: "id pid category{id tag}") { id: String! price: Price pid: String category: Category } type Category @key(fields: "id tag") { id: String! tag: String } type Price { price: Float! } ` ), resolvers: { Product: { __resolveReference(key) { return products$1.find((p) => { if (p.id === key.id && p.pid === key.pid) { const cat = categories.find((c) => c.id === p.categoryId); if (cat && cat.id === key.category.id && cat.tag === key.category.tag) { return true; } } return false; }); }, price(product) { return { price: product.price }; }, category(product) { return categories.find((c) => c.id === product.categoryId); } }, Category: { __resolveReference(key) { return categories.find((c) => c.id === key.id); } }, ProductList: { __resolveReference(key) { const prods = products$1.filter( (p) => key.products.some((k) => { if (p.id === k.id && p.pid === k.pid) { const cat = categories.find((c) => c.id === p.categoryId); if (cat && cat.id === k.category.id && cat.tag === k.category.tag) { return true; } } return false; }) ); return { products: prods, first: prods[0], selected: products$1.find((p) => p.id === key.selected.id) }; } } } }); var products = createSubgraph("products", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.0" import: ["@key", "@external", "@extends", "@shareable"] ) type Query { topProducts: ProductList! } type ProductList @key(fields: "products{id}") { products: [Product!]! } type Product @extends @key(fields: "id") { id: String! @external category: Category @shareable } type Category @key(fields: "id") { mainProduct: Product! @shareable id: String! tag: String @shareable } ` ), resolvers: { Query: { topProducts() { return { products: products$1 }; } }, ProductList: { __resolveReference(key) { return { products: products$1.filter( (p) => key.products.some((k) => k.id === p.id) ) }; } }, Product: { __resolveReference(key) { return products$1.find((product) => product.id === key.id); }, category(product) { return categories.find((c) => c.id === product.categoryId); } }, Category: { __resolveReference(key) { return categories.find((c) => c.id === key.id); }, mainProduct(category) { return products$1.find((p) => p.id === category.mainProduct); } } } }); var test = [ createTest( /* GraphQL */ ` query { topProducts { products { id pid price { price } category { mainProduct { id } id tag } } selected { id } first { id } } } `, { data: { topProducts: { products: [ { id: "1", pid: "p1", price: { price: 100 }, category: { mainProduct: { id: "1" }, id: "c1", tag: "t1" } }, { id: "2", pid: "p2", price: { price: 200 }, category: { mainProduct: { id: "2" }, id: "c2", tag: "t2" } } ], selected: { id: "2" }, first: { id: "1" } } } } ) ]; var index = serve( "complex-entity-call", [link, list, price, products], test ); export { index as default };