Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/router-bridge@v0.6.0-beta.1+v2.9…
Browse files Browse the repository at this point in the history
….0-beta.0' into create-pull-request/router-bridge
  • Loading branch information
tninesling committed Aug 27, 2024
2 parents 54370f2 + 0f1ae38 commit dcad968
Show file tree
Hide file tree
Showing 12 changed files with 597 additions and 109 deletions.
3 changes: 2 additions & 1 deletion router-bridge/js-src/plan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
import {
Operation,
operationFromDocument,
printSchema as printSchemaWithDirectives,
Supergraph,
} from "@apollo/federation-internals";
import {
Expand Down Expand Up @@ -281,7 +282,7 @@ export class BridgeQueryPlanner {
let result = new Map<string, string>();

subgraphs.names().forEach((name) => {
let sdl = printSchema(subgraphs.get(name).schema.toGraphQLJSSchema({}));
let sdl = printSchemaWithDirectives(subgraphs.get(name).schema);
result.set(name, sdl);
});

Expand Down
2 changes: 2 additions & 0 deletions router-bridge/js-src/supported_features.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
REQUIRES_SCOPES_VERSIONS,
SOURCE_VERSIONS,
CONTEXT_VERSIONS,
COST_VERSIONS,
} from "@apollo/federation-internals";

export const ROUTER_SUPPORTED_SUPERGRAPH_FEATURES: Set<string> = new Set(
Expand All @@ -32,3 +33,4 @@ addToRouterFeatures(REQUIRES_SCOPES_VERSIONS);
addToRouterFeatures(POLICY_VERSIONS);
addToRouterFeatures(SOURCE_VERSIONS);
addToRouterFeatures(CONTEXT_VERSIONS);
addToRouterFeatures(COST_VERSIONS);
13 changes: 13 additions & 0 deletions router-bridge/src/planner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2466,4 +2466,17 @@ feature https://specs.apollo.dev/unsupported-feature/v0.1 is for: SECURITY but i
)
.unwrap());
}

#[tokio::test]
async fn extracts_cost_directives() {
let schema = include_str!("testdata/custom_cost_schema.graphql");
let planner = Planner::<serde_json::Value>::new(schema.to_string(), Default::default())
.await
.expect("can create planner");
let subgraphs = planner.subgraphs().await.expect("can extract subgraphs");

for (name, schema) in subgraphs {
insta::assert_snapshot!(name, schema);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
---
source: router-bridge/src/planner.rs
expression: schema
---
schema
@link(url: "https://specs.apollo.dev/link/v1.0")
@link(url: "https://specs.apollo.dev/federation/v2.9", import: ["@key", "@requires", "@provides", "@external", "@tag", "@extends", "@shareable", "@inaccessible", "@override", "@composeDirective", "@interfaceObject"])
{
query: Query
}

directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA

directive @key(fields: federation__FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE

directive @requires(fields: federation__FieldSet!) on FIELD_DEFINITION

directive @provides(fields: federation__FieldSet!) on FIELD_DEFINITION

directive @external(reason: String) on OBJECT | FIELD_DEFINITION

directive @tag(name: String!) repeatable on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION | SCHEMA

directive @extends on OBJECT | INTERFACE

directive @shareable repeatable on OBJECT | FIELD_DEFINITION

directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION

directive @override(from: String!, label: String) on FIELD_DEFINITION

directive @composeDirective(name: String) repeatable on SCHEMA

directive @interfaceObject on OBJECT

directive @federation__authenticated on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM

directive @federation__requiresScopes(scopes: [[federation__Scope!]!]!) on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM

directive @federation__policy(policies: [[federation__Policy!]!]!) on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM

directive @federation__sourceAPI repeatable on SCHEMA

directive @federation__sourceType repeatable on OBJECT | INTERFACE

directive @federation__sourceField repeatable on FIELD_DEFINITION

directive @federation__context(name: String!) repeatable on INTERFACE | OBJECT | UNION

directive @federation__fromContext(field: federation__ContextFieldValue) on ARGUMENT_DEFINITION

directive @federation__cost(weight: Int!) on ARGUMENT_DEFINITION | ENUM | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | OBJECT | SCALAR

directive @federation__listSize(assumedSize: Int, slicingArguments: [String!], sizedFields: [String!], requireOneSlicingArgument: Boolean = true) on FIELD_DEFINITION

enum link__Purpose {
"""
`SECURITY` features provide metadata necessary to securely resolve fields.
"""
SECURITY

"""
`EXECUTION` features provide metadata necessary for operation execution.
"""
EXECUTION
}

scalar link__Import

scalar federation__FieldSet

scalar federation__Scope

scalar federation__Policy

scalar federation__ContextFieldValue

enum AorB
@federation__cost(weight: 15)
{
A
B
}

scalar ExpensiveInt
@federation__cost(weight: 30)

type ExpensiveObject
@federation__cost(weight: 40)
{
id: ID
}

input InputTypeWithCost {
somethingWithCost: Int @federation__cost(weight: 20)
}

type Query {
fieldWithCost: Int @federation__cost(weight: 5)
argWithCost(arg: Int @federation__cost(weight: 10)): Int
enumWithCost: AorB
inputWithCost(someInput: InputTypeWithCost): Int
scalarWithCost: ExpensiveInt
objectWithCost: ExpensiveObject
_service: _Service!
}

scalar _Any

type _Service {
sdl: String
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
source: router-bridge/src/planner.rs
expression: schema
---
schema
@link(url: "https://specs.apollo.dev/link/v1.0")
@link(url: "https://specs.apollo.dev/federation/v2.9", import: ["@key", "@requires", "@provides", "@external", "@tag", "@extends", "@shareable", "@inaccessible", "@override", "@composeDirective", "@interfaceObject"])
{
query: Query
}

directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA

directive @key(fields: federation__FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE

directive @requires(fields: federation__FieldSet!) on FIELD_DEFINITION

directive @provides(fields: federation__FieldSet!) on FIELD_DEFINITION

directive @external(reason: String) on OBJECT | FIELD_DEFINITION

directive @tag(name: String!) repeatable on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION | SCHEMA

directive @extends on OBJECT | INTERFACE

directive @shareable repeatable on OBJECT | FIELD_DEFINITION

directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION

directive @override(from: String!, label: String) on FIELD_DEFINITION

directive @composeDirective(name: String) repeatable on SCHEMA

directive @interfaceObject on OBJECT

directive @federation__authenticated on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM

directive @federation__requiresScopes(scopes: [[federation__Scope!]!]!) on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM

directive @federation__policy(policies: [[federation__Policy!]!]!) on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM

directive @federation__sourceAPI repeatable on SCHEMA

directive @federation__sourceType repeatable on OBJECT | INTERFACE

directive @federation__sourceField repeatable on FIELD_DEFINITION

directive @federation__context(name: String!) repeatable on INTERFACE | OBJECT | UNION

directive @federation__fromContext(field: federation__ContextFieldValue) on ARGUMENT_DEFINITION

directive @federation__cost(weight: Int!) on ARGUMENT_DEFINITION | ENUM | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | OBJECT | SCALAR

directive @federation__listSize(assumedSize: Int, slicingArguments: [String!], sizedFields: [String!], requireOneSlicingArgument: Boolean = true) on FIELD_DEFINITION

enum link__Purpose {
"""
`SECURITY` features provide metadata necessary to securely resolve fields.
"""
SECURITY

"""
`EXECUTION` features provide metadata necessary for operation execution.
"""
EXECUTION
}

scalar link__Import

scalar federation__FieldSet

scalar federation__Scope

scalar federation__Policy

scalar federation__ContextFieldValue

type A {
id: ID
}

type Query {
fieldWithListSize: [String!] @federation__listSize(assumedSize: 2000, requireOneSlicingArgument: false)
fieldWithDynamicListSize(first: Int = 10): SizedField @federation__listSize(slicingArguments: ["first"], sizedFields: ["items"], requireOneSlicingArgument: true)
_service: _Service!
}

type SizedField {
items: [A]
}

scalar _Any

type _Service {
sdl: String
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
source: router-bridge/src/planner.rs
expression: schema
---
schema
@link(url: "https://specs.apollo.dev/link/v1.0")
@link(url: "https://specs.apollo.dev/federation/v2.9", import: ["@key", "@requires", "@provides", "@external", "@tag", "@extends", "@shareable", "@inaccessible", "@override", "@composeDirective", "@interfaceObject"])
{
query: Query
}

directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA

directive @key(fields: federation__FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE
Expand Down Expand Up @@ -42,6 +49,10 @@ directive @federation__context(name: String!) repeatable on INTERFACE | OBJECT |

directive @federation__fromContext(field: federation__ContextFieldValue) on ARGUMENT_DEFINITION

directive @federation__cost(weight: Int!) on ARGUMENT_DEFINITION | ENUM | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | OBJECT | SCALAR

directive @federation__listSize(assumedSize: Int, slicingArguments: [String!], sizedFields: [String!], requireOneSlicingArgument: Boolean = true) on FIELD_DEFINITION

directive @stream on FIELD

directive @transform(from: String!) on FIELD
Expand All @@ -68,31 +79,35 @@ scalar federation__Policy

scalar federation__ContextFieldValue

type Book implements Product {
type Book implements Product
@key(fields: "isbn")
{
isbn: String!
title: String
year: Int
similarBooks: [Book]!
metadata: [MetadataOrError]
upc: String!
sku: String!
name: String
price: String
details: ProductDetails
inStock: Boolean
upc: String! @external
sku: String! @external
name: String @external
price: String @external
details: ProductDetails @external
inStock: Boolean @external
}

type Error {
code: Int
message: String
code: Int @shareable
message: String @shareable
}

type KeyValue {
key: String!
value: String!
key: String! @shareable
value: String! @shareable
}

type Library {
type Library
@key(fields: "id")
{
id: ID!
name: String
}
Expand All @@ -113,13 +128,13 @@ interface ProductDetails {
}

type ProductDetailsBook implements ProductDetails {
country: String
pages: Int
country: String @shareable
pages: Int @shareable
}

type ProductDetailsFurniture implements ProductDetails {
country: String
color: String
country: String @shareable
color: String @shareable
}

type Query {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
source: router-bridge/src/planner.rs
expression: schema
---
schema
@link(url: "https://specs.apollo.dev/link/v1.0")
@link(url: "https://specs.apollo.dev/federation/v2.9", import: ["@key", "@requires", "@provides", "@external", "@tag", "@extends", "@shareable", "@inaccessible", "@override", "@composeDirective", "@interfaceObject"])
{
query: Query
}

directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA

directive @key(fields: federation__FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE
Expand Down Expand Up @@ -42,6 +49,10 @@ directive @federation__context(name: String!) repeatable on INTERFACE | OBJECT |

directive @federation__fromContext(field: federation__ContextFieldValue) on ARGUMENT_DEFINITION

directive @federation__cost(weight: Int!) on ARGUMENT_DEFINITION | ENUM | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | OBJECT | SCALAR

directive @federation__listSize(assumedSize: Int, slicingArguments: [String!], sizedFields: [String!], requireOneSlicingArgument: Boolean = true) on FIELD_DEFINITION

directive @stream on FIELD

directive @transform(from: String!) on FIELD
Expand Down
Loading

0 comments on commit dcad968

Please sign in to comment.