Skip to content

Commit 226823c

Browse files
committed
feat(graphql): migrate to type-graphql 2.0.0-rc.2
Signed-off-by: Leonty Chudinov <leonty.chudinov@gmail.com>
1 parent 5564a92 commit 226823c

File tree

17 files changed

+162
-95
lines changed

17 files changed

+162
-95
lines changed

examples/graphql/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"!*/__tests__"
5050
],
5151
"dependencies": {
52+
"@graphql-yoga/subscription": "^5.0.5",
5253
"@loopback/boot": "^8.0.9",
5354
"@loopback/core": "^7.0.8",
5455
"@loopback/graphql": "^0.12.9",

examples/graphql/src/__tests__/acceptance/graphql-context.acceptance.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {createPubSub} from '@graphql-yoga/subscription';
67
import {createBindingFromClass} from '@loopback/core';
78
import {GraphQLBindings, GraphQLServer} from '@loopback/graphql';
89
import {expect, supertest} from '@loopback/testlab';
@@ -45,6 +46,7 @@ describe('GraphQL context', () => {
4546
});
4647

4748
server.bind('recipes').to([...sampleRecipes]);
49+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
4850
const repoBinding = createBindingFromClass(RecipeRepository);
4951
server.add(repoBinding);
5052
server.add(createBindingFromClass(RecipesDataSource));

examples/graphql/src/__tests__/acceptance/graphql-middleware-options.acceptance.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {createPubSub} from '@graphql-yoga/subscription';
67
import {createBindingFromClass} from '@loopback/core';
7-
import {GraphQLServer} from '@loopback/graphql';
8+
import {GraphQLBindings, GraphQLServer} from '@loopback/graphql';
89
import {supertest} from '@loopback/testlab';
910
import {RecipesDataSource} from '../../datasources';
1011
import {RecipeResolver} from '../../graphql-resolvers/recipe-resolver';
@@ -38,6 +39,7 @@ describe('GraphQL middleware', () => {
3839
});
3940
server.resolver(RecipeResolver);
4041
server.bind('recipes').to([...sampleRecipes]);
42+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
4143
const repoBinding = createBindingFromClass(RecipeRepository);
4244
server.add(repoBinding);
4345
server.add(createBindingFromClass(RecipesDataSource));

examples/graphql/src/__tests__/acceptance/graphql-middleware.acceptance.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {createPubSub} from '@graphql-yoga/subscription';
67
import {createBindingFromClass} from '@loopback/core';
78
import {GraphQLBindings, GraphQLServer} from '@loopback/graphql';
89
import {expect, supertest} from '@loopback/testlab';
@@ -76,6 +77,7 @@ describe('GraphQL middleware', () => {
7677
server = new GraphQLServer({host: '127.0.0.1', port: 0});
7778
server.resolver(RecipeResolver);
7879
server.bind('recipes').to([...sampleRecipes]);
80+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
7981
const repoBinding = createBindingFromClass(RecipeRepository);
8082
server.add(repoBinding);
8183
server.add(createBindingFromClass(RecipesDataSource));

examples/graphql/src/__tests__/acceptance/graphql-subscription.acceptance.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {createPubSub} from '@graphql-yoga/subscription';
67
import {Application, createBindingFromClass} from '@loopback/core';
7-
import {GraphQLServer} from '@loopback/graphql';
8+
import {GraphQLBindings, GraphQLServer} from '@loopback/graphql';
89
import {
910
createRestAppClient,
1011
expect,
@@ -51,6 +52,7 @@ describe('GraphQL server subscription', () => {
5152
server.bind('recipes').to([...sampleRecipes]);
5253
const repoBinding = createBindingFromClass(RecipeRepository);
5354
server.add(repoBinding);
55+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
5456
server.add(createBindingFromClass(RecipesDataSource));
5557
server.add(createBindingFromClass(RecipeService));
5658
await server.start();
@@ -99,6 +101,7 @@ describe('GraphQL application subscription', () => {
99101
app.bind('recipes').to([...sampleRecipes]);
100102
const repoBinding = createBindingFromClass(RecipeRepository);
101103
app.add(repoBinding);
104+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
102105
app.add(createBindingFromClass(RecipesDataSource));
103106
app.add(createBindingFromClass(RecipeService));
104107
await app.start();

examples/graphql/src/__tests__/acceptance/graphql.acceptance.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {createPubSub} from '@graphql-yoga/subscription';
67
import {Application, createBindingFromClass} from '@loopback/core';
7-
import {GraphQLServer} from '@loopback/graphql';
8+
import {GraphQLBindings, GraphQLServer} from '@loopback/graphql';
89
import {
910
createRestAppClient,
1011
givenHttpServerConfig,
@@ -35,6 +36,7 @@ describe('GraphQL server', () => {
3536
server.resolver(RecipeResolver);
3637

3738
server.bind('recipes').to([...sampleRecipes]);
39+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
3840
const repoBinding = createBindingFromClass(RecipeRepository);
3941
server.add(repoBinding);
4042
server.add(createBindingFromClass(RecipesDataSource));
@@ -68,6 +70,7 @@ describe('GraphQL application', () => {
6870
server.resolver(RecipeResolver);
6971

7072
app.bind('recipes').to([...sampleRecipes]);
73+
server.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
7174
const repoBinding = createBindingFromClass(RecipeRepository);
7275
app.add(repoBinding);
7376
app.add(createBindingFromClass(RecipesDataSource));

examples/graphql/src/application.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {createPubSub} from '@graphql-yoga/subscription';
67
import {BootMixin} from '@loopback/boot';
78
import {ApplicationConfig} from '@loopback/core';
89
import {GraphQLBindings, GraphQLComponent} from '@loopback/graphql';
@@ -30,6 +31,8 @@ export class GraphqlDemoApplication extends BootMixin(
3031

3132
this.expressMiddleware('middleware.express.GraphQL', server.expressApp);
3233

34+
this.bind(GraphQLBindings.PUB_SUB).to(createPubSub());
35+
3336
// It's possible to register a graphql context resolver
3437
this.bind(GraphQLBindings.GRAPHQL_CONTEXT_RESOLVER).to(async context => {
3538
return {...context};

examples/graphql/src/graphql-resolvers/recipe-resolver.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import {
1111
GraphQLBindings,
1212
Int,
1313
mutation,
14-
Publisher,
15-
pubSub,
14+
PubSub,
1615
query,
1716
resolver,
1817
ResolverData,
@@ -33,6 +32,8 @@ export class RecipeResolver implements ResolverInterface<Recipe> {
3332
@repository('RecipeRepository')
3433
private readonly recipeRepo: RecipeRepository,
3534
@service(RecipeService) private readonly recipeService: RecipeService,
35+
// inject pubSub for publishing a notification
36+
@inject(GraphQLBindings.PUB_SUB) private pubSub: PubSub,
3637
// It's possible to inject the resolver data
3738
@inject(GraphQLBindings.RESOLVER_DATA) private resolverData: ResolverData,
3839
) {}
@@ -49,12 +50,9 @@ export class RecipeResolver implements ResolverInterface<Recipe> {
4950
}
5051

5152
@mutation(returns => Recipe)
52-
async addRecipe(
53-
@arg('recipe') recipe: RecipeInput,
54-
@pubSub('recipeCreated') publish: Publisher<Recipe>,
55-
): Promise<Recipe> {
53+
async addRecipe(@arg('recipe') recipe: RecipeInput): Promise<Recipe> {
5654
const result = await this.recipeRepo.add(recipe);
57-
await publish(result);
55+
this.pubSub.publish('recipeCreated', result);
5856
return result;
5957
}
6058

extensions/graphql/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@
5252
"debug": "^4.4.3",
5353
"express": "^4.22.1",
5454
"graphql": "^16.12.0",
55-
"graphql-subscriptions": "^2.0.0",
5655
"graphql-ws": "^5.16.2",
57-
"type-graphql": "^2.0.0-beta.2",
56+
"type-graphql": "^2.0.0-rc.2",
5857
"ws": "^8.19.0"
5958
},
6059
"devDependencies": {
60+
"@graphql-yoga/subscription": "^5.0.5",
6161
"@loopback/boot": "^8.0.9",
6262
"@loopback/build": "^12.0.8",
6363
"@loopback/core": "^7.0.8",

extensions/graphql/src/__tests__/fixtures/graphql-resolvers/recipe/recipe.resolver.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
// This file is licensed under the MIT License.
44
// License text available at https://opensource.org/licenses/MIT
55

6+
import {inject} from '@loopback/core';
67
import {
78
arg,
89
fieldResolver,
9-
Publisher,
10-
pubSub,
10+
GraphQLBindings,
11+
PubSub,
1112
query,
1213
resolver,
1314
} from '../../../../';
@@ -17,7 +18,7 @@ import {Recipe} from './recipe.model';
1718

1819
@resolver(of => Recipe)
1920
export class RecipeResolver {
20-
constructor() {}
21+
constructor(@inject(GraphQLBindings.PUB_SUB) private pubSub: PubSub) {}
2122

2223
@query(returns => [Recipe])
2324
async recipes(): Promise<Recipe[]> {
@@ -30,13 +31,10 @@ export class RecipeResolver {
3031
}
3132

3233
@mutation(returns => Recipe)
33-
async addRecipe(
34-
@arg('recipe') recipe: RecipeInput,
35-
@pubSub('recipeCreated') publish: Publisher<Recipe>,
36-
): Promise<Recipe> {
34+
async addRecipe(@arg('recipe') recipe: RecipeInput): Promise<Recipe> {
3735
const result = new Recipe();
3836
result.title = recipe.title;
39-
await publish(result);
37+
this.pubSub.publish('recipeCreated', result);
4038
return result;
4139
}
4240
}

0 commit comments

Comments
 (0)