@graphql-hive/federation-gateway-audit
Version:
Audit tool for Apollo Federation Gateway
225 lines (211 loc) • 4.43 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 data = {
a: {
"1": {
id: "1",
pId: "a.1.pId",
name: "a.1",
compositeId: {
one: "a.1.compositeId.one",
two: "a.1.compositeId.two",
three: "a.1.compositeId.three"
}
},
"2": {
id: "2",
pId: "a.2.pId",
name: "a.2",
compositeId: {
one: "a.2.compositeId.one",
two: "a.2.compositeId.two",
three: "a.2.compositeId.three"
}
}
},
b: {
"100": { id: "100", a: ["1"] },
"200": { id: "200", a: ["1", "2"] }
}
};
var a = testkit.createSubgraph("a", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(url: "https://specs.apollo.dev/federation/v2.5", import: ["@key"])
type A
@key(fields: "id", resolvable: true)
@key(fields: "pId", resolvable: false)
@key(fields: "compositeId { one two }", resolvable: false)
@key(fields: "id compositeId { two three }", resolvable: false) {
id: ID!
pId: ID!
compositeId: CompositeID!
name: String!
}
type CompositeID {
one: ID!
two: ID!
three: ID!
}
`
),
resolvers: {
A: {
__resolveReference: (reference) => {
const obj = data.a[reference.id];
if (!obj) {
return null;
}
return {
__typename: "A",
id: obj.id,
pId: obj.pId,
compositeId: obj.compositeId,
name: obj.name
};
}
}
}
});
var b = testkit.createSubgraph("b", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.5"
import: ["@key", "@requires", "@external"]
)
type Query {
b: B
}
type B @key(fields: "id") {
id: ID!
a: [A!]!
}
type A
@key(fields: "compositeId { one two }", resolvable: false)
@key(fields: "id compositeId { two three }", resolvable: true)
@key(fields: "pId", resolvable: false)
@key(fields: "id", resolvable: false) {
id: ID!
pId: ID!
compositeId: CompositeID!
name: String! @external
nameInB: String! @requires(fields: "name")
}
type CompositeID {
one: ID!
two: ID!
three: ID!
}
`
),
resolvers: {
Query: {
b: () => {
return {
__typename: "B",
id: data.b["100"].id,
a: data.b["100"].a
};
}
},
B: {
__resolveReference: (reference) => {
const obj = data.b[reference.id];
if (!obj) {
return null;
}
return {
__typename: "B",
id: obj.id,
a: obj.a
};
},
a: ({ a }) => {
return a.map((id) => {
const obj = data.a[id];
if (!obj) {
return null;
}
return {
__typename: "A",
id: obj.id,
pId: obj.pId,
compositeId: obj.compositeId
};
});
}
},
A: {
__resolveReference: (reference) => {
const obj = data.a[reference.id];
if (!obj) {
return null;
}
if (reference.name) {
return {
__typename: "A",
id: obj.id,
pId: obj.pId,
compositeId: obj.compositeId,
name: reference.name
};
}
return {
__typename: "A",
id: obj.id,
pId: obj.pId,
compositeId: obj.compositeId
};
},
nameInB: ({ name }) => {
if (!name) {
throw new Error("A.name was not provided");
}
return `b.a.nameInB ${name}`;
}
}
}
});
var test = [
testkit.createTest(
/* GraphQL */
`
query {
b {
id
a {
id
name
nameInB
}
}
}
`,
{
data: {
b: {
id: "100",
a: [
{
id: "1",
name: "a.1",
nameInB: "b.a.nameInB a.1"
}
]
}
}
}
)
];
var index = testkit.serve("keys-mashup", [a, b], test);
exports.default = index;