Skip to content
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
9 changes: 8 additions & 1 deletion composition/src/utils/string-constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Kind } from 'graphql';
import { DirectiveName } from '../types/types';

export const AS = 'as';
export const ASSUMED_SIZE = 'assumedSize';
export const AND_UPPER = 'AND';
export const ANY_SCALAR = '_Any';
export const ARGUMENT = 'argument';
Expand All @@ -19,6 +20,7 @@ export const CONSUMER_INACTIVE_THRESHOLD = 'consumerInactiveThreshold';
export const CONSUMER_NAME = 'consumerName';
export const CONNECT_FIELD_RESOLVER = 'connect__fieldResolver';
export const CONTEXT = 'context';
export const COST = 'cost';
export const DEFAULT = 'default';
export const DEFAULT_EDFS_PROVIDER_ID = 'default';
export const DEFAULT_MUTATION = 'Mutation';
Expand Down Expand Up @@ -81,6 +83,7 @@ export const KEY = 'key';
export const LEFT_PARENTHESIS = '(';
export const LEVELS = 'levels';
export const LINK = 'link';
export const LIST_SIZE = 'listSize';
export const LINK_IMPORT = 'link__Import';
export const LINK_PURPOSE = 'link__Purpose';
export const LIST = 'list';
Expand Down Expand Up @@ -120,6 +123,7 @@ export const QUOTATION_JOIN = `", "`;
export const REASON = 'reason';
export const REQUEST = 'request';
export const REQUIRE_FETCH_REASONS = 'openfed__requireFetchReasons';
export const REQUIRE_ONE_SLICING_ARGUMENT = 'requireOneSlicingArgument';
export const REQUIRES = 'requires';
export const REQUIRES_SCOPES = 'requiresScopes';
export const RESOLVABLE = 'resolvable';
Expand All @@ -135,6 +139,8 @@ export const SEMANTIC_NON_NULL = 'semanticNonNull';
export const SERVICE_OBJECT = '_Service';
export const SERVICE_FIELD = '_service';
export const SHAREABLE = 'shareable';
export const SIZED_FIELDS = 'sizedFields';
export const SLICING_ARGUMENTS = 'slicingArguments';
export const SPECIFIED_BY = 'specifiedBy';
export const STREAM_CONFIGURATION = 'streamConfiguration';
export const STREAM_NAME = 'streamName';
Expand All @@ -159,6 +165,7 @@ export const UNION_UPPER = 'UNION';
export const URL_LOWER = 'url';
export const VALUES = 'values';
export const VARIABLE_DEFINITION_UPPER = 'VARIABLE_DEFINITION';
export const WEIGHT = 'weight';

export const EXECUTABLE_DIRECTIVE_LOCATIONS = new Set<string>([
FIELD_UPPER,
Expand All @@ -172,7 +179,7 @@ export const EXECUTABLE_DIRECTIVE_LOCATIONS = new Set<string>([

export const ROOT_TYPE_NAMES = new Set<string>([MUTATION, QUERY, SUBSCRIPTION]);
export const AUTHORIZATION_DIRECTIVES = new Set<string>([AUTHENTICATED, REQUIRES_SCOPES]);
export const PERSISTED_CLIENT_DIRECTIVES = new Set<string>([DEPRECATED, ONE_OF, SEMANTIC_NON_NULL]);
export const PERSISTED_CLIENT_DIRECTIVES = new Set<string>([COST, DEPRECATED, LIST_SIZE, ONE_OF, SEMANTIC_NON_NULL]);
export const INHERITABLE_DIRECTIVE_NAMES = new Set<string>([EXTERNAL, REQUIRE_FETCH_REASONS, SHAREABLE]);
export const IGNORED_FIELDS = new Set<string>([ENTITIES_FIELD, SERVICE_FIELD]);

Expand Down
6 changes: 6 additions & 0 deletions composition/src/v1/constants/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
CONFIGURE_CHILD_DESCRIPTIONS,
CONFIGURE_DESCRIPTION,
CONNECT_FIELD_RESOLVER,
COST,
DEPRECATED,
EDFS_KAFKA_PUBLISH,
EDFS_KAFKA_SUBSCRIBE,
Expand All @@ -24,6 +25,7 @@ import {
INTERFACE_OBJECT,
KEY,
LINK,
LIST_SIZE,
ONE_OF,
OVERRIDE,
PROVIDES,
Expand All @@ -45,6 +47,7 @@ import {
CONFIGURE_CHILD_DESCRIPTIONS_DEFINITION,
CONFIGURE_DESCRIPTION_DEFINITION,
CONNECT_FIELD_RESOLVER_DEFINITION,
COST_DEFINITION,
DEPRECATED_DEFINITION,
EDFS_KAFKA_PUBLISH_DEFINITION,
EDFS_KAFKA_SUBSCRIBE_DEFINITION,
Expand All @@ -59,6 +62,7 @@ import {
INTERFACE_OBJECT_DEFINITION,
KEY_DEFINITION,
LINK_DEFINITION,
LIST_SIZE_DEFINITION,
ONE_OF_DEFINITION,
OVERRIDE_DEFINITION,
PROVIDES_DEFINITION,
Expand All @@ -81,6 +85,7 @@ export const DIRECTIVE_DEFINITION_BY_NAME: ReadonlyMap<DirectiveName, DirectiveD
[CONFIGURE_DESCRIPTION, CONFIGURE_DESCRIPTION_DEFINITION],
[CONFIGURE_CHILD_DESCRIPTIONS, CONFIGURE_CHILD_DESCRIPTIONS_DEFINITION],
[CONNECT_FIELD_RESOLVER, CONNECT_FIELD_RESOLVER_DEFINITION],
[COST, COST_DEFINITION],
[DEPRECATED, DEPRECATED_DEFINITION],
[EDFS_KAFKA_PUBLISH, EDFS_KAFKA_PUBLISH_DEFINITION],
[EDFS_KAFKA_SUBSCRIBE, EDFS_KAFKA_SUBSCRIBE_DEFINITION],
Expand All @@ -95,6 +100,7 @@ export const DIRECTIVE_DEFINITION_BY_NAME: ReadonlyMap<DirectiveName, DirectiveD
[INTERFACE_OBJECT, INTERFACE_OBJECT_DEFINITION],
[KEY, KEY_DEFINITION],
[LINK, LINK_DEFINITION],
[LIST_SIZE, LIST_SIZE_DEFINITION],
[ONE_OF, ONE_OF_DEFINITION],
[OVERRIDE, OVERRIDE_DEFINITION],
[PROVIDES, PROVIDES_DEFINITION],
Expand Down
82 changes: 82 additions & 0 deletions composition/src/v1/constants/directive-definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { stringArrayToNameNodeArray, stringToNamedTypeNode, stringToNameNode } f
import {
ARGUMENT_DEFINITION_UPPER,
AS,
ASSUMED_SIZE,
AUTHENTICATED,
BOOLEAN_SCALAR,
CHANNEL,
Expand All @@ -16,6 +17,7 @@ import {
CONFIGURE_DESCRIPTION,
CONNECT_FIELD_RESOLVER,
CONTEXT,
COST,
DEFAULT_EDFS_PROVIDER_ID,
DEPRECATED,
DESCRIPTION_OVERRIDE,
Expand Down Expand Up @@ -47,6 +49,7 @@ import {
LINK,
LINK_IMPORT,
LINK_PURPOSE,
LIST_SIZE,
NAME,
OBJECT_UPPER,
ONE_OF,
Expand All @@ -56,6 +59,7 @@ import {
PROVIDES,
REASON,
REQUIRE_FETCH_REASONS,
REQUIRE_ONE_SLICING_ARGUMENT,
REQUIRES,
REQUIRES_SCOPES,
RESOLVABLE,
Expand All @@ -65,6 +69,8 @@ import {
SCOPES,
SEMANTIC_NON_NULL,
SHAREABLE,
SIZED_FIELDS,
SLICING_ARGUMENTS,
SPECIFIED_BY,
STREAM_CONFIGURATION,
STRING_SCALAR,
Expand All @@ -77,6 +83,7 @@ import {
TOPICS,
UNION_UPPER,
URL_LOWER,
WEIGHT,
} from '../../utils/string-constants';
import { REQUIRED_FIELDSET_TYPE_NODE, REQUIRED_STRING_TYPE_NODE } from './type-nodes';

Expand Down Expand Up @@ -200,6 +207,28 @@ export const CONNECT_FIELD_RESOLVER_DEFINITION: DirectiveDefinitionNode = {
repeatable: false,
};

// directive @cost(weight: String!) on ARGUMENT_DEFINITION | ENUM | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | OBJECT | SCALAR
export const COST_DEFINITION: DirectiveDefinitionNode = {
arguments: [
{
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(WEIGHT),
type: REQUIRED_STRING_TYPE_NODE,
},
],
kind: Kind.DIRECTIVE_DEFINITION,
locations: stringArrayToNameNodeArray([
ARGUMENT_DEFINITION_UPPER,
ENUM_UPPER,
FIELD_DEFINITION_UPPER,
INPUT_FIELD_DEFINITION_UPPER,
OBJECT_UPPER,
SCALAR_UPPER,
]),
name: stringToNameNode(COST),
repeatable: false,
};

export const DEPRECATED_DEFINITION: DirectiveDefinitionNode = {
arguments: [
{
Expand Down Expand Up @@ -529,6 +558,59 @@ export const LINK_DEFINITION: DirectiveDefinitionNode = {
repeatable: true,
};

/*
* directive @listSize(
* assumedSize: Int,
* slicingArguments: [String!],
* sizedFields: [String!],
* requireOneSlicingArgument: Boolean = true
* ) on FIELD_DEFINITION
*/
export const LIST_SIZE_DEFINITION: DirectiveDefinitionNode = {
arguments: [
{
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(ASSUMED_SIZE),
type: stringToNamedTypeNode(INT_SCALAR),
},
{
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(SLICING_ARGUMENTS),
type: {
kind: Kind.LIST_TYPE,
type: {
kind: Kind.NON_NULL_TYPE,
type: stringToNamedTypeNode(STRING_SCALAR),
},
},
},
{
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(SIZED_FIELDS),
type: {
kind: Kind.LIST_TYPE,
type: {
kind: Kind.NON_NULL_TYPE,
type: stringToNamedTypeNode(STRING_SCALAR),
},
},
},
{
kind: Kind.INPUT_VALUE_DEFINITION,
name: stringToNameNode(REQUIRE_ONE_SLICING_ARGUMENT),
type: stringToNamedTypeNode(BOOLEAN_SCALAR),
defaultValue: {
kind: Kind.BOOLEAN,
value: true,
},
},
],
kind: Kind.DIRECTIVE_DEFINITION,
locations: stringArrayToNameNodeArray([FIELD_DEFINITION_UPPER]),
name: stringToNameNode(LIST_SIZE),
repeatable: false,
};

// directive @oneOf on INPUT_OBJECT
export const ONE_OF_DEFINITION: DirectiveDefinitionNode = {
kind: Kind.DIRECTIVE_DEFINITION,
Expand Down
4 changes: 4 additions & 0 deletions composition/src/v1/constants/strings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
BOOLEAN_SCALAR,
CONNECT_FIELD_RESOLVER,
CONSUMER_INACTIVE_THRESHOLD,
COST,
CONSUMER_NAME,
DEPRECATED,
EDFS_KAFKA_PUBLISH,
Expand All @@ -29,6 +30,7 @@ import {
LINK,
LINK_IMPORT,
LINK_PURPOSE,
LIST_SIZE,
NOT_UPPER,
OBJECT_UPPER,
ONE_OF,
Expand Down Expand Up @@ -142,7 +144,9 @@ export const IGNORED_FEDERATED_TYPE_NAMES: ReadonlySet<TypeName> = new Set<TypeN
]);

export const CLIENT_PERSISTED_DIRECTIVE_NAMES: ReadonlySet<DirectiveName> = new Set<DirectiveName>([
COST,
DEPRECATED,
LIST_SIZE,
ONE_OF,
SEMANTIC_NON_NULL,
]);
6 changes: 6 additions & 0 deletions composition/src/v1/federation/federation-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ import {
AUTHENTICATED,
AUTHORIZATION_DIRECTIVES,
CONDITION,
COST,
DEPRECATED,
ENUM_VALUE,
FIELD,
Expand All @@ -199,6 +200,7 @@ import {
INPUT_OBJECT,
LEFT_PARENTHESIS,
LIST,
LIST_SIZE,
NON_REPEATABLE_PERSISTED_DIRECTIVES,
NOT_UPPER,
OBJECT,
Expand Down Expand Up @@ -243,8 +245,10 @@ import { singleFederatedInputFieldOneOfWarning } from '../warnings/warnings';
import { ExtractPersistedDirectivesParams, ValidateOneOfDirectiveParams } from './params';
import {
AUTHENTICATED_DEFINITION,
COST_DEFINITION,
DEPRECATED_DEFINITION,
INACCESSIBLE_DEFINITION,
LIST_SIZE_DEFINITION,
ONE_OF_DEFINITION,
REQUIRES_SCOPES_DEFINITION,
SEMANTIC_NON_NULL_DEFINITION,
Expand Down Expand Up @@ -278,8 +282,10 @@ export class FederationFactory {
parentTagDataByTypeName = new Map<TypeName, ParentTagData>();
persistedDirectiveDefinitionByDirectiveName = new Map<DirectiveName, DirectiveDefinitionNode>([
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These directives are not persisted in the client schema, so they don't need to go in here.

[AUTHENTICATED, AUTHENTICATED_DEFINITION],
[COST, COST_DEFINITION],
[DEPRECATED, DEPRECATED_DEFINITION],
[INACCESSIBLE, INACCESSIBLE_DEFINITION],
[LIST_SIZE, LIST_SIZE_DEFINITION],
[ONE_OF, ONE_OF_DEFINITION],
[REQUIRES_SCOPES, REQUIRES_SCOPES_DEFINITION],
[SEMANTIC_NON_NULL, SEMANTIC_NON_NULL_DEFINITION],
Expand Down
Loading
Loading