-
Notifications
You must be signed in to change notification settings - Fork 251
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support @join__directive(graphs, name, args)
directives
#2894
Conversation
This comment was marked as resolved.
This comment was marked as resolved.
✅ Deploy Preview for apollo-federation-docs canceled.
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. |
Marking this PR as ready for review despite known/unknown remaining gaps (reversibility, additional tests, 100% code coverage, to name a few), because I'd love some directional feedback from the team. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, make sure we're merging to next
, rather than main
.
Missed that you should add the directives in |
This PR was opened by the [Changesets release](https:/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to next, this PR will be updated. # Releases ## @apollo/[email protected] ### Minor Changes - Implement progressive `@override` functionality ([#2911](#2911)) The progressive `@override` feature brings a new argument to the `@override` directive: `label: String`. When a label is added to an `@override` application, the override becomes conditional, depending on parameters provided to the query planner (a set of which labels should be overridden). Note that this feature will be supported in router for enterprise users only. Out-of-the-box, the router will support a percentage-based use case for progressive `@override`. For example: ```graphql type Query { hello: String @OverRide(from: "original", label: "percent(5)") } ``` The above example will override the root `hello` field from the "original" subgraph 5% of the time. More complex use cases will be supported by the router via the use of coprocessors/rhai to resolve arbitrary labels to true/false values (i.e. via a feature flag service). - Support `@join__directive(graphs, name, args)` directives ([#2894](#2894)) ### Patch Changes - Allow known `FeatureDefinition` subclasses to define custom subgraph schema validation rules ([#2910](#2910)) - Updated dependencies \[[`6ae42942b13dccd246ccc994faa2cb36cd62cb3c`](6ae4294), [`66833fb8d04c9376f6ed476fed6b1ca237f477b7`](66833fb), [`931f87c6766c7439936df706727cbdc0cd6bcfd8`](931f87c)]: - @apollo/[email protected] - @apollo/[email protected] ## @apollo/[email protected] ### Minor Changes - Implement progressive `@override` functionality ([#2911](#2911)) The progressive `@override` feature brings a new argument to the `@override` directive: `label: String`. When a label is added to an `@override` application, the override becomes conditional, depending on parameters provided to the query planner (a set of which labels should be overridden). Note that this feature will be supported in router for enterprise users only. Out-of-the-box, the router will support a percentage-based use case for progressive `@override`. For example: ```graphql type Query { hello: String @OverRide(from: "original", label: "percent(5)") } ``` The above example will override the root `hello` field from the "original" subgraph 5% of the time. More complex use cases will be supported by the router via the use of coprocessors/rhai to resolve arbitrary labels to true/false values (i.e. via a feature flag service). ### Patch Changes - Updated dependencies \[[`6ae42942b13dccd246ccc994faa2cb36cd62cb3c`](6ae4294), [`66833fb8d04c9376f6ed476fed6b1ca237f477b7`](66833fb), [`931f87c6766c7439936df706727cbdc0cd6bcfd8`](931f87c)]: - @apollo/[email protected] - @apollo/[email protected] - @apollo/[email protected] ## @apollo/[email protected] ### Minor Changes - Implement progressive `@override` functionality ([#2911](#2911)) The progressive `@override` feature brings a new argument to the `@override` directive: `label: String`. When a label is added to an `@override` application, the override becomes conditional, depending on parameters provided to the query planner (a set of which labels should be overridden). Note that this feature will be supported in router for enterprise users only. Out-of-the-box, the router will support a percentage-based use case for progressive `@override`. For example: ```graphql type Query { hello: String @OverRide(from: "original", label: "percent(5)") } ``` The above example will override the root `hello` field from the "original" subgraph 5% of the time. More complex use cases will be supported by the router via the use of coprocessors/rhai to resolve arbitrary labels to true/false values (i.e. via a feature flag service). - Allow known `FeatureDefinition` subclasses to define custom subgraph schema validation rules ([#2910](#2910)) - Support `@join__directive(graphs, name, args)` directives ([#2894](#2894)) ## @apollo/[email protected] ### Minor Changes - Implement progressive `@override` functionality ([#2911](#2911)) The progressive `@override` feature brings a new argument to the `@override` directive: `label: String`. When a label is added to an `@override` application, the override becomes conditional, depending on parameters provided to the query planner (a set of which labels should be overridden). Note that this feature will be supported in router for enterprise users only. Out-of-the-box, the router will support a percentage-based use case for progressive `@override`. For example: ```graphql type Query { hello: String @OverRide(from: "original", label: "percent(5)") } ``` The above example will override the root `hello` field from the "original" subgraph 5% of the time. More complex use cases will be supported by the router via the use of coprocessors/rhai to resolve arbitrary labels to true/false values (i.e. via a feature flag service). ### Patch Changes - Updated dependencies \[[`6ae42942b13dccd246ccc994faa2cb36cd62cb3c`](6ae4294), [`66833fb8d04c9376f6ed476fed6b1ca237f477b7`](66833fb), [`931f87c6766c7439936df706727cbdc0cd6bcfd8`](931f87c)]: - @apollo/[email protected] ## @apollo/[email protected] ### Minor Changes - Implement progressive `@override` functionality ([#2911](#2911)) The progressive `@override` feature brings a new argument to the `@override` directive: `label: String`. When a label is added to an `@override` application, the override becomes conditional, depending on parameters provided to the query planner (a set of which labels should be overridden). Note that this feature will be supported in router for enterprise users only. Out-of-the-box, the router will support a percentage-based use case for progressive `@override`. For example: ```graphql type Query { hello: String @OverRide(from: "original", label: "percent(5)") } ``` The above example will override the root `hello` field from the "original" subgraph 5% of the time. More complex use cases will be supported by the router via the use of coprocessors/rhai to resolve arbitrary labels to true/false values (i.e. via a feature flag service). ### Patch Changes - Updated dependencies \[[`6ae42942b13dccd246ccc994faa2cb36cd62cb3c`](6ae4294), [`66833fb8d04c9376f6ed476fed6b1ca237f477b7`](66833fb), [`931f87c6766c7439936df706727cbdc0cd6bcfd8`](931f87c)]: - @apollo/[email protected] - @apollo/[email protected] ## @apollo/[email protected] ### Minor Changes - Implement progressive `@override` functionality ([#2911](#2911)) The progressive `@override` feature brings a new argument to the `@override` directive: `label: String`. When a label is added to an `@override` application, the override becomes conditional, depending on parameters provided to the query planner (a set of which labels should be overridden). Note that this feature will be supported in router for enterprise users only. Out-of-the-box, the router will support a percentage-based use case for progressive `@override`. For example: ```graphql type Query { hello: String @OverRide(from: "original", label: "percent(5)") } ``` The above example will override the root `hello` field from the "original" subgraph 5% of the time. More complex use cases will be supported by the router via the use of coprocessors/rhai to resolve arbitrary labels to true/false values (i.e. via a feature flag service). ### Patch Changes - Updated dependencies \[[`6ae42942b13dccd246ccc994faa2cb36cd62cb3c`](6ae4294), [`66833fb8d04c9376f6ed476fed6b1ca237f477b7`](66833fb), [`931f87c6766c7439936df706727cbdc0cd6bcfd8`](931f87c)]: - @apollo/[email protected] ## [email protected] Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This new
@join__directive
directive, like other@join__
directives, is a mechanism for linking supergraph schema elements back to their originating subgraph elements.In the case of
@join__directive
, the specific kind of subgraph schema elements to be linked are directive applications. In addition to itsgraphs: [join__Graph!]!
argument,@join__directive
represents thename
andargs
of directive applications found in subgraphs, without literally reapplying the directives in the supergraph, as@composeDirective
would do.Since directive applications can appear on a variety of schema elements in subgraphs,
@join__directive
is allowed on a similar variety of locations in the supergraph schema (anywhere@join__type
or@join__field
can appear, plus onschema
definitions).In principle, this new
@join__directive
behavior can be enabled at the granularity of any@link
specification URL, and is initially enabled for directives imported from the hypotheticalhttps://specs.apollo.dev/source
URL, as well as for any@link
directives involved in those imports. This limited initial usage of@join__directive
allows preserving/recovering accurate per-subgraph information about the original directive applications.We can extend this behavior to other specification URLs in the future if it works and proves useful, and we might consider opening the behavior up to subgraph authors by allowing, say,
@composeDirective
to generate@join__directive
applications instead of reapplying subgraph directives verbatim (as it does by default), perhaps with an optional@composeDirective(name: "someDirective", strategy: "@join__directive")
argument.One way
@join__directive
deviates from the rest of the@join__
directives is in taking a pluralgraphs: [join__Graph!]!
argument, rather than a singlegraph: join__Graph!
argument. This API allows directives that are repeated exactly in different subgraphs (same name, deep-equal arguments) to be represented with a single@join__directive
directive in the supergraph (with multiple graph names in thegraphs
list), which tends to save a bunch of repetition of@join__directive
in the supergraph.