Skip to content
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

feat: implement @defer directive #1178

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions composition-go/composition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ func TestFederateSubgraphs(t *testing.T) {
expectedSDL = `
directive @authenticated on ENUM | FIELD_DEFINITION | INTERFACE | OBJECT | SCALAR

directive @defer(if: Boolean! = true, label: String) on FRAGMENT_SPREAD | INLINE_FRAGMENT

directive @deprecated(reason: String = "No longer supported") on ARGUMENT_DEFINITION | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION

directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
Expand Down
120 changes: 60 additions & 60 deletions composition-go/index.global.js

Large diffs are not rendered by default.

7 changes: 5 additions & 2 deletions composition/src/federation/federation-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ import {
import {
AUTHENTICATED_DEFINITION,
BASE_SCALARS,
DEFER_DEFINITION,
DEPRECATED_DEFINITION,
INACCESSIBLE_DEFINITION,
REQUIRES_SCOPES_DEFINITION,
Expand Down Expand Up @@ -193,7 +194,7 @@ import { Warning } from '../warnings/warnings';
export class FederationFactory {
authorizationDataByParentTypeName: Map<string, AuthorizationData>;
concreteTypeNamesByAbstractTypeName: Map<string, Set<string>>;
clientDefinitions: MutableTypeDefinitionNode[] = [DEPRECATED_DEFINITION];
clientDefinitions: MutableTypeDefinitionNode[] = [DEFER_DEFINITION, DEPRECATED_DEFINITION];
currentSubgraphName = '';
entityDataByTypeName: Map<string, EntityData>;
entityInterfaceFederationDataByTypeName: Map<string, EntityInterfaceFederationData>;
Expand All @@ -220,7 +221,7 @@ export class FederationFactory {
]);
persistedDirectiveDefinitions = new Set<string>([AUTHENTICATED, DEPRECATED, INACCESSIBLE, TAG, REQUIRES_SCOPES]);
potentialPersistedDirectiveDefinitionDataByDirectiveName = new Map<string, PersistedDirectiveDefinitionData>();
routerDefinitions: MutableTypeDefinitionNode[] = [DEPRECATED_DEFINITION, TAG_DEFINITION];
routerDefinitions: MutableTypeDefinitionNode[] = [DEFER_DEFINITION, DEPRECATED_DEFINITION, TAG_DEFINITION];
shareableErrorTypeNames = new Map<string, Set<string>>();
subscriptionFilterDataByFieldPath = new Map<string, SubscriptionFilterData>();
isMaxDepth = false;
Expand Down Expand Up @@ -1546,6 +1547,7 @@ export class FederationFactory {
}
this.routerDefinitions = [
AUTHENTICATED_DEFINITION,
DEFER_DEFINITION,
DEPRECATED_DEFINITION,
INACCESSIBLE_DEFINITION,
REQUIRES_SCOPES_DEFINITION,
Expand All @@ -1554,6 +1556,7 @@ export class FederationFactory {
];
this.clientDefinitions = [
AUTHENTICATED_DEFINITION,
DEFER_DEFINITION,
DEPRECATED_DEFINITION,
REQUIRES_SCOPES_DEFINITION,
SCOPE_SCALAR_DEFINITION,
Expand Down
33 changes: 33 additions & 0 deletions composition/src/utils/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
CONDITION,
CONSUMER_NAME,
DEFAULT_EDFS_PROVIDER_ID,
DEFER,
DEPRECATED,
EDFS_KAFKA_PUBLISH,
EDFS_KAFKA_SUBSCRIBE,
Expand All @@ -30,14 +31,18 @@ import {
FIELD_PATH,
FIELD_SET_SCALAR,
FIELDS,
FRAGMENT_SPREAD_UPPER,
FROM,
IF,
IN_UPPER,
INACCESSIBLE,
INLINE_FRAGMENT_UPPER,
INPUT_FIELD_DEFINITION_UPPER,
INPUT_OBJECT_UPPER,
INTERFACE_OBJECT,
INTERFACE_UPPER,
KEY,
LABEL,
LINK,
NAME,
NOT_UPPER,
Expand Down Expand Up @@ -769,6 +774,34 @@ export const EDFS_NATS_STREAM_CONFIGURATION_DEFINITION: MutableInputObjectNode =
],
};

export const DEFER_DEFINITION: MutableDirectiveDefinitionNode = {
arguments: [
{
directives: [],
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(IF),
type: {
kind: Kind.NON_NULL_TYPE,
type: stringToNamedTypeNode(BOOLEAN_SCALAR),
},
defaultValue: {
kind: Kind.BOOLEAN,
value: true,
},
},
{
directives: [],
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(LABEL),
type: stringToNamedTypeNode(STRING_SCALAR),
},
],
kind: Kind.DIRECTIVE_DEFINITION,
locations: stringArrayToNameNodeArray([FRAGMENT_SPREAD_UPPER, INLINE_FRAGMENT_UPPER]),
name: stringToNameNode(DEFER),
repeatable: false,
};

export const INHERITABLE_DIRECTIVE_NAMES = [EXTERNAL, SHAREABLE];

export const baseDirectives = `
Expand Down
3 changes: 3 additions & 0 deletions composition/src/utils/string-constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const DEFAULT_EDFS_PROVIDER_ID = 'default';
export const DEFAULT_MUTATION = 'Mutation';
export const DEFAULT_QUERY = 'Query';
export const DEFAULT_SUBSCRIPTION = 'Subscription';
export const DEFER = 'defer';
export const DEPRECATED = 'deprecated';
export const DEPRECATED_DEFAULT_ARGUMENT_VALUE = 'No longer supported';
export const DIRECTIVE_DEFINITION = 'directive definition';
Expand Down Expand Up @@ -43,6 +44,7 @@ export const FLOAT_SCALAR = 'Float';
export const FRAGMENT_DEFINITION_UPPER = 'FRAGMENT_DEFINITION';
export const FRAGMENT_SPREAD_UPPER = 'FRAGMENT_SPREAD';
export const FROM = 'from';
export const IF = 'if';
export const IN_UPPER = 'IN';
export const INACCESSIBLE = 'inaccessible';
export const INLINE_FRAGMENT = 'inlineFragment';
Expand All @@ -57,6 +59,7 @@ export const INTERFACE = `Interface`;
export const INTERFACE_UPPER = 'INTERFACE';
export const INTERFACE_OBJECT = 'interfaceObject';
export const KEY = 'key';
export const LABEL = 'label';
export const LINK = 'link';
export const LIST = 'list';
export const LITERAL_SPACE = ' ';
Expand Down
Loading
Loading