Skip to content

Commit

Permalink
feat(federation): update Apollo Federation v2 definitions (#2635)
Browse files Browse the repository at this point in the history
* feat(federation): update Apollo Federation v2 definitions

Fix Apollo Federation v2 directive definitions:
* `_FieldSet` was renamed `FieldSet`
* new `@composeDirective` (fed v2.1 change)
* `@shareable` is now repeatable (fed v2.2 change)
* new `@interfaceObject` directive (fed v2.3 change)

NOTE: definitions are updated to the latest Federation v2 spec. Users might specify old version import (i.e. `@link` import v2.0) trying to use new federation features (e.g. `@interfaceObject`) which may lead to potential composition errors (i.e. server starts up fine but cannot be federated into a "supergraph").

* regenerate examples
  • Loading branch information
dariuszkuc committed May 15, 2023
1 parent 9796f91 commit 4d945da
Show file tree
Hide file tree
Showing 14 changed files with 173 additions and 66 deletions.
7 changes: 3 additions & 4 deletions _examples/embedding/subdir/gendir/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions _examples/embedding/subdir/root_.generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions _examples/federation/accounts/graph/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions _examples/federation/products/graph/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions _examples/federation/reviews/graph/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

88 changes: 63 additions & 25 deletions api/testdata/federation2/graph/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 39 additions & 12 deletions plugin/federation/federation.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,28 +86,55 @@ func (f *federation) MutateConfig(cfg *config.Config) error {
}

func (f *federation) InjectSourceEarly() *ast.Source {
input := `
scalar _Any
scalar _FieldSet
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
directive @extends on OBJECT | INTERFACE
`
input := ``

// add version-specific changes on key directive, as well as adding the new directives for federation 2
if f.Version == 1 {
input += `
directive @key(fields: _FieldSet!) repeatable on OBJECT | INTERFACE
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
directive @extends on OBJECT | INTERFACE
directive @external on FIELD_DEFINITION
scalar _Any
scalar _FieldSet
`
} else if f.Version == 2 {
input += `
directive @key(fields: _FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE
directive @external on FIELD_DEFINITION | OBJECT
directive @composeDirective(name: String!) repeatable on SCHEMA
directive @extends on OBJECT | INTERFACE
directive @external on OBJECT | FIELD_DEFINITION
directive @key(fields: FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE
directive @inaccessible on
| ARGUMENT_DEFINITION
| ENUM
| ENUM_VALUE
| FIELD_DEFINITION
| INPUT_FIELD_DEFINITION
| INPUT_OBJECT
| INTERFACE
| OBJECT
| SCALAR
| UNION
directive @interfaceObject on OBJECT
directive @link(import: [String!], url: String!) repeatable on SCHEMA
directive @shareable on OBJECT | FIELD_DEFINITION
directive @tag(name: String!) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
directive @override(from: String!) on FIELD_DEFINITION
directive @inaccessible on SCALAR | OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | INTERFACE | UNION | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
directive @provides(fields: FieldSet!) on FIELD_DEFINITION
directive @requires(fields: FieldSet!) on FIELD_DEFINITION
directive @shareable repeatable on FIELD_DEFINITION | OBJECT
directive @tag(name: String!) repeatable on
| ARGUMENT_DEFINITION
| ENUM
| ENUM_VALUE
| FIELD_DEFINITION
| INPUT_FIELD_DEFINITION
| INPUT_OBJECT
| INTERFACE
| OBJECT
| SCALAR
| UNION
scalar _Any
scalar FieldSet
`
}
return &ast.Source{
Expand Down
48 changes: 48 additions & 0 deletions plugin/federation/test_data/model2/federation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package model2

type FieldSet string //nolint:deadcode,unused

type Hello struct {
Name string
Secondary string
}

func (Hello) IsEntity() {}

type World struct {
Foo string
Bar int
}

func (World) IsEntity() {}

type ExternalExtension struct {
UPC string
Reviews []*World
}

func (ExternalExtension) IsEntity() {}

type NestedKey struct {
ID string
Hello *Hello
}

func (NestedKey) IsEntity() {}

type MoreNesting struct {
ID string
World *World
}

func (MoreNesting) IsEntity() {}

type VeryNestedKey struct {
ID string
Hello *Hello
World *World
Nested *NestedKey
More *MoreNesting
}

func (VeryNestedKey) IsEntity() {}
7 changes: 3 additions & 4 deletions plugin/federation/testdata/entityresolver/generated/exec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion plugin/federation/testdata/federation2/federation2.graphql
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
extend schema
@link(url: "https://specs.apollo.dev/federation/v2.0",
@link(url: "https://specs.apollo.dev/federation/v2.3",
import: ["@key", "@shareable", "@provides", "@external", "@tag", "@extends", "@override", "@inaccessible"])

schema {
Expand Down
2 changes: 1 addition & 1 deletion plugin/federation/testdata/federation2/federation2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ federation:
version: 2

autobind:
- "github.com/99designs/gqlgen/plugin/federation/test_data/model"
- "github.com/99designs/gqlgen/plugin/federation/test_data/model2"

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 4d945da

Please sign in to comment.