Skip to content

Commit 8e18593

Browse files
authored
chore: selectively inject directive defs/deps (#2307)
1 parent 7852d42 commit 8e18593

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+5743
-6960
lines changed

composition-go/composition_test.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,9 @@ func normalizeWhiteSpace(s string) string {
7070
func TestFederateSubgraphs(t *testing.T) {
7171
const (
7272
expectedSDL = `
73-
directive @authenticated on ENUM | FIELD_DEFINITION | INTERFACE | OBJECT | SCALAR
74-
75-
directive @deprecated(reason: String = "No longer supported") on ARGUMENT_DEFINITION | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION
76-
77-
directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
78-
7973
directive @requiresScopes(scopes: [[openfed__Scope!]!]!) on ENUM | FIELD_DEFINITION | INTERFACE | OBJECT | SCALAR
80-
81-
directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
74+
75+
directive @authenticated on ENUM | FIELD_DEFINITION | INTERFACE | OBJECT | SCALAR
8276
8377
scalar openfed__Scope
8478

composition-go/index.global.js

Lines changed: 185 additions & 185 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

composition/src/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,19 @@ export * from './schema-building/utils';
2121
export * from './subgraph/types';
2222
export * from './types/types';
2323
export * from './utils/composition-version';
24+
export * from './utils/params';
2425
export * from './utils/string-constants';
2526
export * from './utils/types';
2627
export * from './utils/utils';
2728
export * from './warnings/types';
2829

2930
// v1
31+
export * from './v1/constants/constants';
32+
export * from './v1/constants/directive-definitions';
33+
export * from './v1/constants/integers';
34+
export * from './v1/constants/non-directive-definitions';
35+
export * from './v1/constants/strings';
36+
export * from './v1/constants/type-nodes';
3037
export * from './v1/federation/utils';
3138
export * from './v1/federation/walkers';
3239
export * from './v1/federation/types';
@@ -36,7 +43,5 @@ export * from './v1/normalization/types';
3643
export * from './v1/normalization/walkers';
3744
export * from './v1/schema-building/type-merging';
3845
export * from './v1/subgraph/subgraph';
39-
export * from './v1/utils/constants';
4046
export * from './v1/utils/utils';
41-
export * from './v1/utils/string-constants';
4247
export * from './v1/warnings/warnings';

composition/src/normalization/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from '../schema-building/types';
1212
import { Graph } from '../resolvability-graph/graph';
1313
import { InternalSubgraph } from '../subgraph/types';
14-
import { DirectiveName } from '../types/types';
14+
import { DirectiveName, TypeName } from '../types/types';
1515

1616
export type NormalizationFailure = {
1717
errors: Array<Error>;
@@ -23,8 +23,8 @@ export type NormalizationSuccess = {
2323
authorizationDataByParentTypeName: Map<string, AuthorizationData>;
2424
concreteTypeNamesByAbstractTypeName: Map<string, Set<string>>;
2525
conditionalFieldDataByCoordinates: Map<string, ConditionalFieldData>;
26-
configurationDataByTypeName: Map<string, ConfigurationData>;
27-
directiveDefinitionByDirectiveName: Map<DirectiveName, DirectiveDefinitionNode>;
26+
configurationDataByTypeName: Map<TypeName, ConfigurationData>;
27+
directiveDefinitionByName: Map<DirectiveName, DirectiveDefinitionNode>;
2828
entityInterfaces: Map<string, EntityInterfaceSubgraphData>;
2929
entityDataByTypeName: Map<string, EntityData>;
3030
fieldCoordsByNamedTypeName: Map<string, Set<string>>;

composition/src/schema-building/ast.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ export function getMutableUnionNode(nameNode: NameNode): MutableUnionNode {
263263
};
264264
}
265265

266-
export type MutableTypeDefinitionNode =
266+
export type MutableDefinitionNode =
267267
| MutableDirectiveDefinitionNode
268268
| MutableEnumNode
269269
| MutableInputObjectNode

composition/src/schema-building/utils.ts

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
BooleanValueNode,
33
ConstDirectiveNode,
44
ConstValueNode,
5+
DefinitionNode,
56
DirectiveDefinitionNode,
67
EnumValueDefinitionNode,
78
EnumValueNode,
@@ -26,6 +27,7 @@ import {
2627
ExtensionType,
2728
ExternalFieldData,
2829
FieldData,
30+
InputObjectDefinitionData,
2931
InputValueData,
3032
InterfaceDefinitionData,
3133
NodeData,
@@ -35,7 +37,7 @@ import {
3537
PersistedDirectivesData,
3638
SchemaData,
3739
} from './types';
38-
import { MutableFieldNode, MutableInputValueNode, MutableTypeDefinitionNode } from './ast';
40+
import { MutableDefinitionNode, MutableFieldNode, MutableInputValueNode } from './ast';
3941
import { ObjectTypeNode, setToNameNodeArray, stringToNameNode } from '../ast/utils';
4042
import {
4143
incompatibleInputValueDefaultValuesError,
@@ -46,7 +48,6 @@ import { SubscriptionFilterValue } from '../router-configuration/types';
4648
import {
4749
ARGUMENT,
4850
AUTHENTICATED,
49-
AUTHORIZATION_DIRECTIVES,
5051
BOOLEAN_SCALAR,
5152
DEPRECATED,
5253
DEPRECATED_DEFAULT_ARGUMENT_VALUE,
@@ -58,7 +59,6 @@ import {
5859
INPUT_NODE_KINDS,
5960
INT_SCALAR,
6061
MUTATION,
61-
NON_REPEATABLE_PERSISTED_DIRECTIVES,
6262
OUTPUT_NODE_KINDS,
6363
PERSISTED_CLIENT_DIRECTIVES,
6464
QUERY,
@@ -69,7 +69,6 @@ import {
6969
SHAREABLE,
7070
STRING_SCALAR,
7171
SUBSCRIPTION,
72-
TAG,
7372
} from '../utils/string-constants';
7473
import {
7574
generateRequiresScopesDirective,
@@ -285,7 +284,7 @@ export function setParentDataExtensionType(existingData: ParentDefinitionData, i
285284
existingData.extensionType = ExtensionType.NONE;
286285
}
287286

288-
function upsertDeprecatedDirective(
287+
export function upsertDeprecatedDirective(
289288
persistedDirectivesData: PersistedDirectivesData,
290289
incomingDirectiveNode: ConstDirectiveNode,
291290
) {
@@ -299,7 +298,7 @@ function upsertDeprecatedDirective(
299298
}
300299
}
301300

302-
function upsertTagDirectives(
301+
export function upsertTagDirectives(
303302
persistedDirectivesData: PersistedDirectivesData,
304303
incomingDirectiveNodes: ConstDirectiveNode[],
305304
) {
@@ -310,42 +309,6 @@ function upsertTagDirectives(
310309
}
311310
}
312311

313-
export function extractPersistedDirectives(
314-
persistedDirectivesData: PersistedDirectivesData,
315-
directivesByDirectiveName: Map<DirectiveName, ConstDirectiveNode[]>,
316-
persistedDirectiveDefinitionByDirectiveName: Map<DirectiveName, DirectiveDefinitionNode>,
317-
): PersistedDirectivesData {
318-
for (const [directiveName, directiveNodes] of directivesByDirectiveName) {
319-
// @authenticated and @requiresScopes are handled differently
320-
if (
321-
AUTHORIZATION_DIRECTIVES.has(directiveName) ||
322-
!persistedDirectiveDefinitionByDirectiveName.has(directiveName)
323-
) {
324-
continue;
325-
}
326-
if (directiveName === DEPRECATED) {
327-
persistedDirectivesData.isDeprecated = true;
328-
upsertDeprecatedDirective(persistedDirectivesData, directiveNodes[0]);
329-
continue;
330-
}
331-
if (directiveName === TAG) {
332-
upsertTagDirectives(persistedDirectivesData, directiveNodes);
333-
continue;
334-
}
335-
const existingDirectives = persistedDirectivesData.directivesByDirectiveName.get(directiveName);
336-
if (!existingDirectives) {
337-
persistedDirectivesData.directivesByDirectiveName.set(directiveName, [...directiveNodes]);
338-
continue;
339-
}
340-
// Only add one instance of certain directives.
341-
if (NON_REPEATABLE_PERSISTED_DIRECTIVES.has(directiveName)) {
342-
continue;
343-
}
344-
existingDirectives.push(...directiveNodes);
345-
}
346-
return persistedDirectivesData;
347-
}
348-
349312
export function propagateAuthDirectives(parentData: ParentDefinitionData, authData?: AuthorizationData) {
350313
if (!authData) {
351314
return;
@@ -468,17 +431,6 @@ export function getClientPersistedDirectiveNodes<T extends NodeData>(nodeData: T
468431
return persistedDirectiveNodes;
469432
}
470433

471-
export function getNodeForRouterSchemaByData<T extends ParentDefinitionData | EnumValueData>(
472-
data: T,
473-
persistedDirectiveDefinitionByDirectiveName: Map<DirectiveName, DirectiveDefinitionNode>,
474-
errors: Error[],
475-
): T['node'] {
476-
data.node.name = stringToNameNode(data.name);
477-
data.node.description = data.description;
478-
data.node.directives = getRouterPersistedDirectiveNodes(data, persistedDirectiveDefinitionByDirectiveName, errors);
479-
return data.node;
480-
}
481-
482434
export function getClientSchemaFieldNodeByFieldData(fieldData: FieldData): MutableFieldNode {
483435
const directives = getClientPersistedDirectiveNodes(fieldData);
484436
const argumentNodes: MutableInputValueNode[] = [];
@@ -557,7 +509,7 @@ function addValidatedArgumentNodes(
557509
}
558510

559511
export function addValidPersistedDirectiveDefinitionNodeByData(
560-
definitions: MutableTypeDefinitionNode[],
512+
definitions: (MutableDefinitionNode | DefinitionNode)[],
561513
data: PersistedDirectiveDefinitionData,
562514
persistedDirectiveDefinitionByDirectiveName: Map<DirectiveName, DirectiveDefinitionNode>,
563515
errors: Error[],
@@ -783,6 +735,10 @@ export function isFieldData(data: ChildData | NodeData | SchemaData): data is Fi
783735
return data.kind === Kind.FIELD_DEFINITION;
784736
}
785737

738+
export function isInputObjectDefinitionData(data: ParentDefinitionData): data is InputObjectDefinitionData {
739+
return data.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION;
740+
}
741+
786742
export function isInputNodeKind(kind: Kind): kind is InputNodeKind {
787743
return INPUT_NODE_KINDS.has(kind);
788744
}

composition/src/subgraph/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ export type Subgraph = {
1616

1717
export type SubgraphConfig = {
1818
configurationDataByTypeName: Map<TypeName, ConfigurationData>;
19-
directiveDefinitionByDirectiveName: Map<DirectiveName, DirectiveDefinitionNode>;
19+
directiveDefinitionByName: Map<DirectiveName, DirectiveDefinitionNode>;
2020
isVersionTwo: boolean;
2121
parentDefinitionDataByTypeName: Map<TypeName, ParentDefinitionData>;
2222
schema: GraphQLSchema;
2323
};
2424

2525
export type InternalSubgraph = {
2626
conditionalFieldDataByCoordinates: Map<string, ConditionalFieldData>;
27-
configurationDataByTypeName: Map<string, ConfigurationData>;
27+
configurationDataByTypeName: Map<TypeName, ConfigurationData>;
2828
definitions: DocumentNode;
29-
directiveDefinitionByDirectiveName: Map<DirectiveName, DirectiveDefinitionNode>;
29+
directiveDefinitionByName: Map<DirectiveName, DirectiveDefinitionNode>;
3030
entityInterfaces: Map<string, EntityInterfaceSubgraphData>;
3131
isVersionTwo: boolean;
3232
keyFieldNamesByParentTypeName: Map<string, Set<string>>;

composition/src/utils/params.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export type AddToSetParams<T> = {
2+
source: Iterable<T>;
3+
target: Set<T>;
4+
};
5+
6+
export type AddOptionalToSetParams<T> = {
7+
target: Set<T>;
8+
source?: Iterable<T>;
9+
};
10+
11+
export type AddMapEntriesParams<K, V> = {
12+
source: Map<K, V>;
13+
target: Map<K, V>;
14+
};

composition/src/utils/utils.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
} from './string-constants';
2222
import { invalidKeyFatalError } from '../errors/errors';
2323
import { stringToNameNode } from '../ast/utils';
24+
import { AddMapEntriesParams, AddOptionalToSetParams, AddToSetParams } from './params';
2425

2526
export function getOrThrowError<K, V>(map: Map<K, V>, key: K, mapName: string): V {
2627
const value = map.get(key);
@@ -55,7 +56,16 @@ export function numberToOrdinal(num: number): string {
5556
}
5657
}
5758

58-
export function addIterableValuesToSet<T>(source: Array<T> | Iterable<T>, target: Set<T>) {
59+
export function addIterableToSet<T>({ source, target }: AddToSetParams<T>) {
60+
for (const value of source) {
61+
target.add(value);
62+
}
63+
}
64+
65+
export function addOptionalIterableToSet<T>({ source, target }: AddOptionalToSetParams<T>) {
66+
if (!source) {
67+
return;
68+
}
5969
for (const value of source) {
6070
target.add(value);
6171
}
@@ -242,7 +252,7 @@ export function copyArrayValueMap<K, V>(source: Map<K, Array<V>>): Map<K, Array<
242252
return output;
243253
}
244254

245-
export function addMapEntries<K, V>(source: Map<K, V>, target: Map<K, V>) {
255+
export function addMapEntries<K, V>({ source, target }: AddMapEntriesParams<K, V>) {
246256
for (const [key, value] of source) {
247257
target.set(key, value);
248258
}

0 commit comments

Comments
 (0)