Skip to content

Commit 518f17f

Browse files
committed
feat(apollo,yoga,core): use graphql child injector context as graphql context
1 parent b572b73 commit 518f17f

File tree

8 files changed

+37
-40
lines changed

8 files changed

+37
-40
lines changed

packages/apollo/src/lib/apollo-graphql-driver.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { InjectorContext } from '@deepkit/injector';
55
import { GraphQLSchema } from 'graphql';
66
import { WebWorkerFactory, ApplicationServer } from '@deepkit/framework';
77
import { HttpBadRequestError, httpWorkflow } from '@deepkit/http';
8-
import { Driver } from '@deepkit-graphql/core';
8+
import { Driver, GraphQLContext } from '@deepkit-graphql/core';
99

1010
import { ApolloGraphQLConfig } from './apollo-graphql-config';
1111
import { ApolloServerPlugins } from './plugins';
@@ -53,7 +53,7 @@ export class ApolloDriver extends Driver {
5353

5454
const response = await this.server!.executeHTTPGraphQLRequest({
5555
httpGraphQLRequest,
56-
context: async () => injectorContext,
56+
context: async (): Promise<GraphQLContext> => ({ injectorContext }),
5757
});
5858
if (!response) {
5959
throw new HttpBadRequestError(JSON.stringify(httpGraphQLRequest));

packages/core/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ export * from './lib/decorators';
22
export * from './lib/types-builder';
33
export * from './lib/schema-builder';
44
export * from './lib/graphql.module';
5-
export * from './lib/graphql-http-context';
65
export * from './lib/driver';
76
export * from './lib/types';
87
export * from './lib/resolvers';

packages/core/src/lib/decorators.spec.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ test('middleware errors', async () => {
7979

8080
await executeGraphQL({
8181
schema,
82-
contextValue: injectorContext,
82+
contextValue: { injectorContext },
8383
source: `{ get }`,
8484
});
8585

@@ -124,7 +124,7 @@ test('resolver middleware is invoked', async () => {
124124

125125
await executeGraphQL({
126126
schema,
127-
contextValue: injectorContext,
127+
contextValue: { injectorContext },
128128
source: `{ get }`,
129129
});
130130

@@ -169,7 +169,7 @@ test('query middleware is invoked', async () => {
169169

170170
await executeGraphQL({
171171
schema,
172-
contextValue: injectorContext,
172+
contextValue: { injectorContext },
173173
source: `{ get }`,
174174
});
175175

@@ -214,7 +214,7 @@ test('mutation middleware is invoked', async () => {
214214

215215
await executeGraphQL({
216216
schema,
217-
contextValue: injectorContext,
217+
contextValue: { injectorContext },
218218
source: `mutation { create }`,
219219
});
220220

@@ -259,7 +259,7 @@ test('subscription middleware is invoked', async () => {
259259

260260
await executeGraphQL({
261261
schema,
262-
contextValue: injectorContext,
262+
contextValue: { injectorContext },
263263
source: `subscription { create }`,
264264
});
265265

@@ -298,7 +298,7 @@ test('mutation', async () => {
298298
await expect(
299299
executeGraphQL({
300300
schema,
301-
contextValue: injectorContext,
301+
contextValue: { injectorContext },
302302
source: `mutation { createUser(data: { username: "Test" }) { id } }`,
303303
}),
304304
).resolves.toMatchSnapshot();
@@ -329,7 +329,7 @@ test('query', async () => {
329329
await expect(
330330
executeGraphQL({
331331
schema,
332-
contextValue: injectorContext,
332+
contextValue: { injectorContext },
333333
source: `{ getUser(id: 1) { id } }`,
334334
rootValue: {},
335335
}),
@@ -364,7 +364,7 @@ test('mutation args validation', async () => {
364364

365365
await expect(
366366
executeGraphQL({
367-
contextValue: injectorContext,
367+
contextValue: { injectorContext },
368368
source: `mutation { createUser(data: { username: "Test" }) { username } }`,
369369
schema,
370370
}),
@@ -403,7 +403,7 @@ test.skip('Context', async () => {
403403

404404
await expect(
405405
executeGraphQL({
406-
contextValue: injectorContext,
406+
contextValue: { injectorContext },
407407
source: `
408408
{
409409
info {
@@ -468,7 +468,7 @@ describe('resolveField', () => {
468468
await expect(
469469
executeGraphQL({
470470
schema,
471-
contextValue: injectorContext,
471+
contextValue: { injectorContext },
472472
source: `
473473
{
474474
getUser(id: "9f617521-b9c2-4ab9-a339-3c551c799027") {
@@ -529,7 +529,7 @@ describe('resolveField', () => {
529529

530530
await expect(
531531
executeGraphQL({
532-
contextValue: injectorContext,
532+
contextValue: { injectorContext },
533533
source: `
534534
{
535535
getUser(id: "398cdf36-e3ac-475c-90aa-c70f99add874") {

packages/core/src/lib/graphql-http-context.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

packages/core/src/lib/schema-builder.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import { Resolvers } from './resolvers';
1313
import { TypesBuilder } from './types-builder';
1414
import { gqlClassDecorator } from './decorators';
15+
import { GraphQLContext } from './types';
1516

1617
export interface SchemaBuilderOptions {
1718
readonly inputTypes?: readonly Type[];
@@ -56,10 +57,10 @@ export class SchemaBuilder {
5657

5758
generateMutationResolverFields(): GraphQLFieldConfigMap<
5859
unknown,
59-
InjectorContext
60+
GraphQLContext
6061
> {
6162
return [...this.resolvers].reduce<
62-
GraphQLFieldConfigMap<unknown, InjectorContext>
63+
GraphQLFieldConfigMap<unknown, GraphQLContext>
6364
>(
6465
(fields, resolver) => ({
6566
// TODO: validate that fields don't override each other
@@ -72,10 +73,10 @@ export class SchemaBuilder {
7273

7374
generateSubscriptionResolverFields(): GraphQLFieldConfigMap<
7475
unknown,
75-
InjectorContext
76+
GraphQLContext
7677
> {
7778
return [...this.resolvers].reduce<
78-
GraphQLFieldConfigMap<unknown, InjectorContext>
79+
GraphQLFieldConfigMap<unknown, GraphQLContext>
7980
>(
8081
(fields, resolver) => ({
8182
// TODO: validate that fields don't override each other
@@ -88,10 +89,10 @@ export class SchemaBuilder {
8889

8990
generateQueryResolverFields(): GraphQLFieldConfigMap<
9091
unknown,
91-
InjectorContext
92+
GraphQLContext
9293
> {
9394
return [...this.resolvers].reduce<
94-
GraphQLFieldConfigMap<unknown, InjectorContext>
95+
GraphQLFieldConfigMap<unknown, GraphQLContext>
9596
>(
9697
(fields, resolver) => ({
9798
// TODO: validate that fields don't override each other

packages/core/src/lib/types-builder.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
GraphQLUnionType,
4545
} from 'graphql';
4646

47-
import { Context, GraphQLFields, Instance, InternalMiddleware } from './types';
47+
import { Context, GraphQLContext, GraphQLFields, Instance, InternalMiddleware } from './types';
4848
import { typeResolvers } from './decorators';
4949
import { Resolver, Resolvers } from './resolvers';
5050
import { InvalidSubscriptionTypeError, TypeNameRequiredError } from './errors';
@@ -612,7 +612,7 @@ export class TypesBuilder {
612612
reflectionMethod: ReflectionMethod,
613613
middlewares: readonly InternalMiddleware[],
614614
type: 'query' | 'mutation' | 'subscription' | 'resolveField',
615-
): GraphQLFieldResolver<unknown, InjectorContext, any> {
615+
): GraphQLFieldResolver<unknown, GraphQLContext, any> {
616616
const resolve = (injectorContext: InjectorContext) => {
617617
const instance = injectorContext.get(
618618
resolver.controller,
@@ -670,7 +670,7 @@ export class TypesBuilder {
670670
returnType,
671671
);
672672

673-
return async (parent, _args, injectorContext) => {
673+
return async (parent, _args, { injectorContext }: GraphQLContext) => {
674674
const args = deserializeArgs(_args, { loosely: false }) as Record<string, unknown>;
675675
const argsValidationErrors = validateArgs(args);
676676
if (argsValidationErrors.length) {
@@ -734,14 +734,14 @@ export class TypesBuilder {
734734

735735
generateSubscriptionResolverFields<T>(
736736
resolver: Resolver<T>,
737-
): GraphQLFieldConfigMap<unknown, InjectorContext> {
737+
): GraphQLFieldConfigMap<unknown, GraphQLContext> {
738738
const metadata = getClassDecoratorMetadata(resolver.controller);
739739
const resolverType = reflect(resolver.controller);
740740
const reflectionClass = ReflectionClass.from(resolverType);
741741

742742
const fields = new Map<
743743
string,
744-
GraphQLFieldConfig<unknown, InjectorContext>
744+
GraphQLFieldConfig<unknown, GraphQLContext>
745745
>();
746746

747747
// eslint-disable-next-line functional/no-loop-statement
@@ -775,14 +775,14 @@ export class TypesBuilder {
775775

776776
generateMutationResolverFields<T>(
777777
resolver: Resolver<T>,
778-
): GraphQLFieldConfigMap<unknown, InjectorContext> {
778+
): GraphQLFieldConfigMap<unknown, GraphQLContext> {
779779
const metadata = getClassDecoratorMetadata(resolver.controller);
780780
const resolverType = reflect(resolver.controller);
781781
const reflectionClass = ReflectionClass.from(resolverType);
782782

783783
const fields = new Map<
784784
string,
785-
GraphQLFieldConfig<unknown, InjectorContext>
785+
GraphQLFieldConfig<unknown, GraphQLContext>
786786
>();
787787

788788
// eslint-disable-next-line functional/no-loop-statement
@@ -817,7 +817,7 @@ export class TypesBuilder {
817817
generateFieldResolver<T>(
818818
resolver: Resolver<T>,
819819
fieldName: string,
820-
): Pick<GraphQLFieldConfig<unknown, InjectorContext>, 'args' | 'resolve'> {
820+
): Pick<GraphQLFieldConfig<unknown, GraphQLContext>, 'args' | 'resolve'> {
821821
const metadata = getClassDecoratorMetadata(resolver.controller);
822822
const resolverType = reflect(resolver.controller);
823823
const reflectionClass = ReflectionClass.from(resolverType);
@@ -852,14 +852,14 @@ export class TypesBuilder {
852852

853853
generateQueryResolverFields<T>(
854854
resolver: Resolver<T>,
855-
): GraphQLFieldConfigMap<unknown, InjectorContext> {
855+
): GraphQLFieldConfigMap<unknown, GraphQLContext> {
856856
const metadata = getClassDecoratorMetadata(resolver.controller);
857857
const resolverType = reflect(resolver.controller);
858858
const reflectionClass = ReflectionClass.from(resolverType);
859859

860860
const fields = new Map<
861861
string,
862-
GraphQLFieldConfig<unknown, InjectorContext>
862+
GraphQLFieldConfig<unknown, GraphQLContext>
863863
>();
864864

865865
// eslint-disable-next-line functional/no-loop-statement

packages/core/src/lib/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ClassType, AbstractClassType } from '@deepkit/core';
22
import { TypeAnnotation } from '@deepkit/type';
3+
import { InjectorContext } from '@deepkit/injector';
34

45
export type GraphQLFields<T> = Record<string, { readonly type: T }>;
56

@@ -29,3 +30,7 @@ export type GraphQLMiddlewareFn = (
2930
export type InternalMiddleware =
3031
| ClassType<GraphQLMiddleware>
3132
| GraphQLMiddlewareFn;
33+
34+
export interface GraphQLContext {
35+
readonly injectorContext: InjectorContext;
36+
}

packages/yoga/src/lib/yoga-graphql-driver.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { GraphQLSchema } from 'graphql';
22
import { WebWorkerFactory, ApplicationServer } from '@deepkit/framework';
33
import { httpWorkflow } from '@deepkit/http';
4-
import { Driver } from '@deepkit-graphql/core';
4+
import { Driver, GraphQLContext } from '@deepkit-graphql/core';
55
import { createYoga, YogaServerInstance } from 'graphql-yoga';
66
import { InjectorContext } from '@deepkit/injector';
77
import { Logger } from '@deepkit/logger';
@@ -29,7 +29,7 @@ export class YogaDriver extends Driver {
2929
): Promise<void> {
3030
if (!event.request.method || !this.server) return;
3131

32-
await this.server.handle(event.request, event.response, injectorContext);
32+
await this.server.handle(event.request, event.response, <GraphQLContext>{ injectorContext });
3333
}
3434

3535
async start(schema: GraphQLSchema): Promise<void> {

0 commit comments

Comments
 (0)