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

Move __resolveReference resolvers on to extensions #1746

Merged
merged 3 commits into from
Apr 20, 2022
Merged
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
26 changes: 24 additions & 2 deletions gateway-js/src/schema-helper/addResolversToSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,18 @@ export function addResolversToSchema(

if (isAbstractType(type)) {
for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {
if (fieldName.startsWith("__")) {
if (fieldName === "__resolveReference") {
type.extensions = {
...type.extensions,
apollo: {
...type.extensions.apollo,
subgraph: {
...type.extensions.apollo?.subgraph,
resolveReference: fieldConfig,
}
},
};
} else if (fieldName.startsWith("__")) {
(type as any)[fieldName.substring(2)] = fieldConfig;
Copy link
Member

Choose a reason for hiding this comment

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

@trevor-scheer is this basically just for resolveType on abstract types and isTypeOf on object types? wonder if we should just special case them (which lets us drop the type as any).

Copy link
Member

Choose a reason for hiding this comment

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

Also it looks like this entire directory (gateway-js/src/schema-helper, not to be confused with subgraph-js/src/schema-helper) is only used in tests? Can it be moved into gateway-js/src/__tests__, or maybe you can just use the version in subgraph-js directly from the tests?

}
}
Expand Down Expand Up @@ -65,7 +76,18 @@ export function addResolversToSchema(
const fieldMap = type.getFields();

for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {
if (fieldName.startsWith("__")) {
if (fieldName === "__resolveReference") {
type.extensions = {
...type.extensions,
apollo: {
...type.extensions.apollo,
subgraph: {
...type.extensions.apollo?.subgraph,
resolveReference: fieldConfig,
}
},
};
} else if (fieldName.startsWith("__")) {
(type as any)[fieldName.substring(2)] = fieldConfig;
continue;
}
Expand Down
31 changes: 31 additions & 0 deletions gateway-js/src/typings/graphql.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { GraphQLResolveInfo } from 'graphql';

type GraphQLReferenceResolver<TContext> = (
Copy link
Member

Choose a reason for hiding this comment

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

This file isn't imported from anywhere? Is it referenced in some config file that I'm missing? Why is it in gateway-js rather than subgraph-js?

Copy link
Member

Choose a reason for hiding this comment

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

oh, i see, there's a second copy in subgraph-js. well, maybe my other suggestion will let us remove the duplication. and i guess as long as a file is included in the tsconfig'd project, it doesn't have to be imported for its declare module to work?

Copy link
Member

Choose a reason for hiding this comment

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

i do wonder though — if the file's not imported from anywhere, will the declare modules work across package? ie, this file generates a .d.ts that isn't sourced from index.d.ts, will it 'take effect' in the same way that it takes effect when you're actively building the package itself?

i mean maybe it doesn't matter since this is kinda an internal implementation detail of @apollo/subgraph anyway.

reference: object,
context: TContext,
info: GraphQLResolveInfo,
) => any;

interface ApolloSubgraphExtensions<TContext> {
resolveReference?: GraphQLReferenceResolver<TContext>;
}

declare module 'graphql/type/definition' {
interface GraphQLObjectTypeExtensions<_TSource = any, _TContext = any> {
apollo?: {
subgraph?: ApolloSubgraphExtensions<_TContext>;
}
}

interface GraphQLInterfaceTypeExtensions<_TSource = any, _TContext = any> {
apollo?: {
subgraph?: ApolloSubgraphExtensions<_TContext>;
}
}

interface GraphQLUnionTypeExtensions<_TSource = any, _TContext = any> {
apollo?: {
subgraph?: ApolloSubgraphExtensions<_TContext>;
}
}
}
26 changes: 24 additions & 2 deletions subgraph-js/src/schema-helper/buildSchemaFromSDL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,18 @@ export function addResolversToSchema(

if (isAbstractType(type)) {
for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {
if (fieldName.startsWith("__")) {
if (fieldName === "__resolveReference") {
type.extensions = {
...type.extensions,
apollo: {
...type.extensions.apollo,
subgraph: {
...type.extensions.apollo?.subgraph,
resolveReference: fieldConfig,
}
},
};
} else if (fieldName.startsWith("__")) {
(type as any)[fieldName.substring(2)] = fieldConfig;
}
}
Expand Down Expand Up @@ -154,7 +165,18 @@ export function addResolversToSchema(
const fieldMap = type.getFields();

for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {
if (fieldName.startsWith("__")) {
if (fieldName === "__resolveReference") {
type.extensions = {
...type.extensions,
apollo: {
...type.extensions.apollo,
subgraph: {
...type.extensions.apollo?.subgraph,
resolveReference: fieldConfig,
}
},
};
} else if (fieldName.startsWith("__")) {
(type as any)[fieldName.substring(2)] = fieldConfig;
continue;
}
Expand Down
22 changes: 18 additions & 4 deletions subgraph-js/src/schemaExtensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,26 @@ type GraphQLReferenceResolver<TContext> = (
info: GraphQLResolveInfo,
) => any;

interface ApolloSubgraphExtensions<TContext> {
resolveReference?: GraphQLReferenceResolver<TContext>;
}

declare module 'graphql/type/definition' {
interface GraphQLObjectType {
resolveReference?: GraphQLReferenceResolver<any>;
interface GraphQLObjectTypeExtensions<_TSource = any, _TContext = any> {
apollo?: {
subgraph?: ApolloSubgraphExtensions<_TContext>;
};
}

interface GraphQLInterfaceTypeExtensions<_TSource = any, _TContext = any> {
apollo?: {
subgraph?: ApolloSubgraphExtensions<_TContext>;
};
}

interface GraphQLObjectTypeConfig<TSource, TContext> {
resolveReference?: GraphQLReferenceResolver<TContext>;
interface GraphQLUnionTypeExtensions<_TSource = any, _TContext = any> {
apollo?: {
subgraph?: ApolloSubgraphExtensions<_TContext>;
};
}
}
6 changes: 3 additions & 3 deletions subgraph-js/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ export function entitiesResolver({
}
}

const resolveReference = type.resolveReference
? type.resolveReference
: function defaultResolveReference() {
const resolveReference =
type.extensions.apollo?.subgraph?.resolveReference ??
function defaultResolveReference() {
return reference;
};

Expand Down