@graphql-hive/federation-gateway-audit
Version:
Audit tool for Apollo Federation Gateway
383 lines (364 loc) • 6.43 kB
JavaScript
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 entities = [
{
id: "e1",
data: "b1"
},
{
id: "e2",
data: "q1"
}
];
const bazs = [
{
__typename: "Baz",
id: "b1",
foo: "b1-foo",
bar: "b1-bar",
baz: "b1-baz"
}
];
const quxs = [
{
__typename: "Qux",
id: "q1",
foo: "q1-foo",
bar: "q1-bar",
qux: "q1-qux"
}
];
var a = createSubgraph("a", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.5"
import: ["@key", "@shareable"]
)
type Query @shareable {
a: Entity
}
type Entity @key(fields: "id") {
id: ID!
data: Foo
}
interface Foo {
foo: String!
}
interface Bar implements Foo {
foo: String!
bar: String!
}
type Baz implements Foo & Bar @shareable {
foo: String!
bar: String!
baz: String!
}
type Qux implements Foo & Bar @shareable {
foo: String!
bar: String!
qux: String!
}
`
),
resolvers: {
Query: {
a() {
return entities[1];
}
},
Entity: {
__resolveReference(key) {
const entity = entities.find((e) => e.id === key.id);
if (!entity) {
return null;
}
return entity;
},
data(entity) {
const data = entities.find((e) => e.id === entity.id)?.data;
if (!data) {
return null;
}
const baz = bazs.find((b) => b.id === data);
if (baz) {
return baz;
}
const qux = quxs.find((q) => q.id === data);
if (qux) {
return qux;
}
throw new Error("Invalid data");
}
}
}
});
var b = createSubgraph("b", {
typeDefs: (
/* GraphQL */
`
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.5"
import: [
"@key"
"@shareable"
"@inaccessible"
"@external"
"@requires"
]
)
type Query @shareable {
b: Entity
bb: Entity
}
type Entity @key(fields: "id") {
id: ID!
data: Foo @external
requirer: String!
@requires(
fields: """
data {
foo
... on Bar {
bar
... on Baz {
baz
}
... on Qux {
qux
}
}
}
"""
)
requirer2: String!
@requires(
fields: """
data {
... on Foo {
foo
}
}
"""
)
}
interface Foo {
foo: String!
}
interface Bar implements Foo {
foo: String!
bar: String!
}
type Baz implements Foo & Bar @shareable @inaccessible {
foo: String!
bar: String!
baz: String!
}
type Qux implements Foo & Bar @shareable {
foo: String!
bar: String!
qux: String!
}
`
),
resolvers: {
Query: {
b() {
return entities[0];
},
bb() {
return entities[1];
}
},
Entity: {
__resolveReference(key) {
const entity = entities.find((e) => e.id === key.id);
if (!entity) {
return null;
}
return {
...entity,
...key
};
},
data(entity) {
const data = entities.find((e) => e.id === entity.id)?.data;
if (!data) {
return null;
}
const baz = bazs.find((b) => b.id === data);
if (baz) {
return baz;
}
const qux = quxs.find((q) => q.id === data);
if (qux) {
return qux;
}
throw new Error("Invalid data");
},
requirer(entity) {
if (!("data" in entity)) {
throw new Error("Expected entity to have a data field");
}
return entity.data.foo + "_requirer";
},
requirer2(entity) {
if (!("data" in entity)) {
throw new Error("Expected entity to have a data field");
}
return entity.data.foo + "_requirer2";
}
}
}
});
var test = [
createTest(
/* GraphQL */
`
query {
b {
id
data {
__typename
}
}
bb {
id
data {
__typename
}
}
}
`,
{
data: {
b: {
id: "e1",
data: null
},
bb: {
id: "e2",
data: {
__typename: "Qux"
}
}
}
}
),
createTest(
/* GraphQL */
`
query {
a {
requirer
}
}
`,
{
data: {
a: {
requirer: "q1-foo_requirer"
}
}
}
),
createTest(
/* GraphQL */
`
query {
a {
data {
__typename
}
requirer
}
}
`,
{
data: {
a: {
data: {
__typename: "Qux"
},
requirer: "q1-foo_requirer"
}
}
}
),
createTest(
/* GraphQL */
`
query {
bb {
data {
__typename
}
requirer
}
}
`,
{
data: {
bb: {
data: {
__typename: "Qux"
},
requirer: "q1-foo_requirer"
}
}
}
),
createTest(
/* GraphQL */
`
query {
b {
data {
__typename
}
requirer
}
}
`,
{
data: {
b: {
data: null,
requirer: "b1-foo_requirer"
}
}
}
),
createTest(
/* GraphQL */
`
query {
bb {
data {
__typename
}
requirer2
}
}
`,
{
data: {
bb: {
data: {
__typename: "Qux"
},
requirer2: "q1-foo_requirer2"
}
}
}
)
];
var index = serve("requires-with-fragments", [a, b], test);
export { index as default };