Skip to content

Commit

Permalink
Merge pull request #123 from Davide-Gheri/feature/remove-validation-r…
Browse files Browse the repository at this point in the history
…ule-class

Feature/remove validation rule class
  • Loading branch information
Davide-Gheri authored Jun 16, 2021
2 parents a0f9df9 + daf7afb commit 391bc49
Show file tree
Hide file tree
Showing 22 changed files with 122 additions and 255 deletions.
4 changes: 1 addition & 3 deletions lib/base-mercurius.module.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import { MercuriusModuleOptions } from './interfaces';
import { loadPackage } from '@nestjs/common/utils/load-package.util';
import { FastifyInstance } from 'fastify';
import { MercuriusOptions } from 'mercurius';
import { normalizeRoutePath } from '@nestjs/graphql/dist/utils';
import { ApplicationConfig, HttpAdapterHost } from '@nestjs/core';
import { BaseMercuriusModuleOptions } from './interfaces/base-mercurius-module-options.interface';
import { HookExplorerService } from './services';

export abstract class BaseMercuriusModule<
Opts extends BaseMercuriusModuleOptions
Opts extends BaseMercuriusModuleOptions,
> {
constructor(
protected readonly httpAdapterHost: HttpAdapterHost,
Expand Down
1 change: 0 additions & 1 deletion lib/decorators/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export * from './resolve-loader.decorator';
export * from './validation-rule.decorator';
export * from './resolve-reference-loader.decorator';
export * from './hook.decorator';
8 changes: 0 additions & 8 deletions lib/decorators/validation-rule.decorator.ts

This file was deleted.

22 changes: 1 addition & 21 deletions lib/factories/graphql.factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,7 @@ import {
} from '@nestjs/graphql/dist/services';
import { GraphQLSchemaBuilder } from '@nestjs/graphql/dist/graphql-schema.builder';
import { MercuriusModuleOptions } from '../interfaces';
import { ValidationRules } from '../interfaces/base-mercurius-module-options.interface';
import {
LoadersExplorerService,
ValidationRuleExplorerService,
} from '../services';
import { LoadersExplorerService } from '../services';
import { transformFederatedSchema } from '../utils/faderation-factory.util';

@Injectable()
Expand All @@ -31,7 +27,6 @@ export class GraphQLFactory extends NestGraphQLFactory {
gqlSchemaBuilder: GraphQLSchemaBuilder,
gqlSchemaHost: GraphQLSchemaHost,
protected readonly loaderExplorerService: LoadersExplorerService,
protected readonly validationRuleExplorerService: ValidationRuleExplorerService,
) {
super(
resolversExplorerService,
Expand Down Expand Up @@ -68,25 +63,10 @@ export class GraphQLFactory extends NestGraphQLFactory {
}
delete parentOptions.plugins;
parentOptions.loaders = this.loaderExplorerService.explore();
parentOptions.validationRules = this.mergeValidationRules(
options.validationRules,
);

if (options.federationMetadata) {
parentOptions.schema = transformFederatedSchema(parentOptions.schema);
}

return parentOptions;
}

mergeValidationRules(existingValidationRules?: ValidationRules) {
const rules = this.validationRuleExplorerService.explore();
if (rules.length === 0 && !existingValidationRules) {
return;
}
return (params) => [
...(existingValidationRules ? existingValidationRules(params) : []),
...rules.map((rule) => (context) => rule.validate(params, context)),
];
}
}
8 changes: 0 additions & 8 deletions lib/interfaces/base-mercurius-module-options.interface.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { MercuriusCommonOptions } from 'mercurius';
import { ValidationRule } from 'graphql';

export interface BaseMercuriusModuleOptions extends MercuriusCommonOptions {
path?: string;
useGlobalPrefix?: boolean;
uploads?: boolean | FileUploadOptions;
validationRules?: ValidationRules;
altair?: boolean | any;
}

Expand All @@ -17,9 +15,3 @@ export interface FileUploadOptions {
//Max allowed number of files (default: Infinity).
maxFiles?: number;
}

export type ValidationRules = (params: {
source: string;
variables?: Record<string, any>;
operationName?: string;
}) => ValidationRule[];
1 change: 0 additions & 1 deletion lib/interfaces/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export * from './mercurius-module-options.interface';
export * from './mercurius-gateway-module-options.interface';
export * from './loader.interface';
export * from './validation-rule-host';
export * from './reference.interface';
12 changes: 0 additions & 12 deletions lib/interfaces/validation-rule-host.ts

This file was deleted.

14 changes: 5 additions & 9 deletions lib/mercurius.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,7 @@ import {
MercuriusModuleOptions,
MercuriusOptionsFactory,
} from './interfaces';
import {
HookExplorerService,
LoadersExplorerService,
ValidationRuleExplorerService,
} from './services';
import { HookExplorerService, LoadersExplorerService } from './services';
import { mergeDefaults } from './utils/merge-defaults';
import { MercuriusCoreModule } from './mercurius-core.module';
import { GraphQLFactory } from './factories/graphql.factory';
Expand All @@ -53,13 +49,13 @@ import { BaseMercuriusModule } from './base-mercurius.module';
GraphQLSchemaBuilder,
GraphQLSchemaHost,
LoadersExplorerService,
ValidationRuleExplorerService,
HookExplorerService,
],
})
export class MercuriusModule
extends BaseMercuriusModule<MercuriusModuleOptions>
implements OnModuleInit {
implements OnModuleInit
{
constructor(
private readonly graphqlFactory: GraphQLFactory,
private readonly graphqlTypesLoader: GraphQLTypesLoader,
Expand Down Expand Up @@ -147,10 +143,10 @@ export class MercuriusModule
)) || [];
const mergedTypeDefs = extend(typeDefs, this.options.typeDefs);

const mercuriusOptions = ((await this.graphqlFactory.mergeOptions({
const mercuriusOptions = (await this.graphqlFactory.mergeOptions({
...this.options,
typeDefs: mergedTypeDefs,
} as any)) as unknown) as MercuriusModuleOptions;
} as any)) as unknown as MercuriusModuleOptions;

if (
this.options.definitions &&
Expand Down
1 change: 0 additions & 1 deletion lib/services/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export * from './loaders-explorer.service';
export * from './validation-rule-explorer.service';
export * from './gql-execution-context';
export * from './gql-arguments-host';
export * from './pub-sub-host';
Expand Down
41 changes: 0 additions & 41 deletions lib/services/validation-rule-explorer.service.ts

This file was deleted.

8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,11 @@
"eslint-plugin-import": "^2.22.1",
"fastify": "^3.15.1",
"graphql": "^15.5.0",
"graphql-query-complexity": "^0.8.0",
"graphql-scalars": "^1.9.0",
"graphql-tag": "^2.11.0",
"husky": "6",
"lint-staged": "^11.0.0",
"mercurius": "^7.3.0",
"mercurius": "^7.9.0",
"mercurius-integration-testing": "^3.1.3",
"mercurius-upload": "^1.1.1",
"pinst": "^2.1.6",
Expand All @@ -60,7 +59,8 @@
"supertest": "^6.1.3",
"ts-node": "^9.1.1",
"typescript": "^4.2.4",
"uvu": "^0.5.1"
"uvu": "^0.5.1",
"ws": "^7.4.6"
},
"dependencies": {
"@nestjs/graphql": "~7.10.6"
Expand All @@ -73,7 +73,7 @@
"altair-fastify-plugin": "^3.2.2",
"fastify": "^3.15.1",
"graphql": "^15.5.0",
"mercurius": "^7.3.0",
"mercurius": "^7.7.0",
"mercurius-upload": "^1.1.1",
"reflect-metadata": "^0.1.13"
},
Expand Down
1 change: 1 addition & 0 deletions tests/code-first/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { UpperCaseDirective } from '../example/directives/upper-case.directive';
schemaDirectives: {
uppercase: UpperCaseDirective,
},
subscription: true,
}),
],
providers: [CatService, DogService, AnimalResolver, CatResolver],
Expand Down
20 changes: 18 additions & 2 deletions tests/code-first/resolvers/cat.resolver.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
import { Args, ID, Parent, Query, Resolver } from '@nestjs/graphql';
import {
Args,
Context,
ID,
Parent,
Query,
Resolver,
Subscription,
} from '@nestjs/graphql';
import { Cat } from '../types/cat';
import { CatService } from '../services/cat.service';
import { ParseIntPipe } from '@nestjs/common';
import { LoaderQuery, ResolveLoader } from '../../../lib';
import { LoaderQuery, ResolveLoader, toAsyncIterator } from '../../../lib';
import { PubSub } from 'mercurius';

@Resolver(() => Cat)
export class CatResolver {
Expand All @@ -22,4 +31,11 @@ export class CatResolver {
hasFur(@Parent() queries: LoaderQuery<Cat>[]) {
return queries.map(({ obj }) => obj.lives > 1);
}

@Subscription(() => Cat, {
resolve: (payload) => payload,
})
onCatSub(@Context('pubsub') pubSub: PubSub) {
return toAsyncIterator(pubSub.subscribe('CAT_SUB_TOPIC'));
}
}
71 changes: 71 additions & 0 deletions tests/e2e/code-first.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import { suite } from 'uvu';
import * as assert from 'uvu/assert';
import { Test } from '@nestjs/testing';
import { AppModule } from '../code-first/app.module';
import * as Websocket from 'ws';
import { FastifyInstance } from 'fastify';
import { cats } from '../code-first/services/cat.service';

interface Context {
app: NestFastifyApplication;
Expand Down Expand Up @@ -262,4 +265,72 @@ gqlSuite(
},
);

gqlSuite('subscriber should work', async ({ app }) => {
return new Promise<void>((resolve, reject) => {
app.listen(0, (err) => {
if (err) {
return reject(err);
}
const port = app.getHttpServer().address().port;
const fastifyApp = app.getHttpAdapter().getInstance() as FastifyInstance;

const ws = new Websocket(`ws://localhost:${port}/graphql`, 'graphql-ws');

const client = Websocket.createWebSocketStream(ws, {
encoding: 'utf8',
objectMode: true,
});
client.setEncoding('utf8');
client.write(
JSON.stringify({
type: 'connection_init',
}),
);

client.write(
JSON.stringify({
id: 1,
type: 'start',
payload: {
query: `
subscription {
onCatSub {
id
lives
name
hasFur
}
}
`,
},
}),
);

client.on('data', (chunk) => {
const data = JSON.parse(chunk);

if (data.type === 'connection_ack') {
fastifyApp.graphql.pubsub.publish({
topic: 'CAT_SUB_TOPIC',
payload: cats[0],
});
} else if (data.id === 1) {
const expectedCat = expectedCats[0];
const receivedCat = data.payload.data?.onCatSub;
assert.ok(receivedCat);
assert.equal(expectedCat.id, receivedCat.id);
assert.type(receivedCat.hasFur, 'boolean');

client.end();
}
});

client.on('end', () => {
client.destroy();
app.close().then(resolve).catch(reject);
});
});
});
});

gqlSuite.run();
6 changes: 2 additions & 4 deletions tests/example/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { ImageResolver } from './resolvers/image.resolver';
import { HashScalar } from './scalars/hash.scalar';
import { JSONResolver } from 'graphql-scalars';
import { UpperCaseDirective } from './directives/upper-case.directive';
import { ComplexityModule } from './modules/complexity/complexity.module';
import { UserModule } from './modules/user/user.module';

@Module({
Expand All @@ -27,8 +26,8 @@ import { UserModule } from './modules/user/user.module';
const value = await next();

const { info } = ctx;
const extensions = info?.parentType.getFields()[info.fieldName]
.extensions;
const extensions =
info?.parentType.getFields()[info.fieldName].extensions;
//...

return value;
Expand All @@ -51,7 +50,6 @@ import { UserModule } from './modules/user/user.module';
};
},
}),
ComplexityModule,
UserModule,
],
controllers: [AppController],
Expand Down
8 changes: 0 additions & 8 deletions tests/example/modules/complexity/complexity.module.ts

This file was deleted.

Loading

0 comments on commit 391bc49

Please sign in to comment.