@graphql-hive/federation-gateway-audit
Version:
Audit tool for Apollo Federation Gateway
340 lines (319 loc) • 7.01 kB
JavaScript
'use strict';
var testkit = require('./testkit-CAf-AsDy.cjs');
require('@apollo/composition');
require('graphql');
require('fets');
require('@apollo/subgraph');
require('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 = testkit.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 = testkit.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 = testkit.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 = testkit.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 = [
testkit.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 = testkit.serve(
"complex-entity-call",
[link, list, price, products],
test
);
exports.default = index;