From b58d3e50dc9672a1047ef192587849fbbfc42281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20My=C5=9Bliwiec?= Date: Sun, 2 Sep 2018 14:45:35 +0200 Subject: [PATCH] chore: publish 5.1.0 release --- lib/decorators/resolvers.decorators.ts | 6 +---- lib/graphql.factory.ts | 5 +++- .../gql-module-options.interface.ts | 1 + lib/services/base-explorer.service.ts | 15 ++++++++++- lib/services/delegates-explorer.service.ts | 11 +++++--- lib/services/resolvers-explorer.service.ts | 27 ++++++++++++++----- lib/services/scalars-explorer.service.ts | 19 +++++++++---- lib/utils/extract-metadata.util.ts | 13 +++++++-- package.json | 6 ++--- 9 files changed, 77 insertions(+), 26 deletions(-) diff --git a/lib/decorators/resolvers.decorators.ts b/lib/decorators/resolvers.decorators.ts index 5aea79790..faae66f00 100644 --- a/lib/decorators/resolvers.decorators.ts +++ b/lib/decorators/resolvers.decorators.ts @@ -30,11 +30,7 @@ export function createPropertyDecorator( key, descriptor, ); - ReflectMetadata(RESOLVER_PROPERTY_METADATA, propertyName)( - target, - key, - descriptor, - ); + ReflectMetadata(RESOLVER_PROPERTY_METADATA, true)(target, key, descriptor); }; } diff --git a/lib/graphql.factory.ts b/lib/graphql.factory.ts index f229d05b0..5abf4aad1 100644 --- a/lib/graphql.factory.ts +++ b/lib/graphql.factory.ts @@ -3,6 +3,7 @@ import { gql, makeExecutableSchema } from 'apollo-server-express'; import * as fs from 'fs'; import * as glob from 'glob'; import { MergeInfo } from 'graphql-tools/dist/Interfaces'; +import { flatten } from 'lodash'; import { mergeTypes } from 'merge-graphql-schemas'; import { GqlModuleOptions } from './interfaces/gql-module-options.interface'; import { DelegatesExplorerService } from './services/delegates-explorer.service'; @@ -40,7 +41,9 @@ export class GraphQLFactory { } mergeTypesByPaths(...pathsToTypes: string[]): string { - return mergeTypes(...pathsToTypes.map(pattern => this.loadFiles(pattern))); + return mergeTypes( + flatten(pathsToTypes.map(pattern => this.loadFiles(pattern))), + ); } private loadFiles(pattern: string): any[] { diff --git a/lib/interfaces/gql-module-options.interface.ts b/lib/interfaces/gql-module-options.interface.ts index d8c55e49b..059bfdb37 100644 --- a/lib/interfaces/gql-module-options.interface.ts +++ b/lib/interfaces/gql-module-options.interface.ts @@ -8,6 +8,7 @@ export interface GqlModuleOptions Pick > { typePaths?: string[]; + include?: Function[]; installSubscriptionHandlers?: boolean; } diff --git a/lib/services/base-explorer.service.ts b/lib/services/base-explorer.service.ts index 283d7cead..e8a260cee 100644 --- a/lib/services/base-explorer.service.ts +++ b/lib/services/base-explorer.service.ts @@ -1,7 +1,20 @@ -import { flattenDeep, groupBy, identity, mapValues } from 'lodash'; +import { flattenDeep, groupBy, identity, isEmpty, mapValues } from 'lodash'; import { ResolverMetadata } from '../interfaces/resolver-metadata.interface'; export class BaseExplorerService { + getModules(modulesContainer: Map, include: Function[]) { + const mapToProviders = (list: any[]) => + list.map(module => module.components); + if (!include || isEmpty(include)) { + return mapToProviders([...modulesContainer.values()]); + } + return mapToProviders( + [...modulesContainer.values()].filter(({ metatype }) => + include.some(item => item === metatype), + ), + ); + } + flatMap( modules: Map[], callback: (instance: any) => T, diff --git a/lib/services/delegates-explorer.service.ts b/lib/services/delegates-explorer.service.ts index 90d21ede9..8d73c4542 100644 --- a/lib/services/delegates-explorer.service.ts +++ b/lib/services/delegates-explorer.service.ts @@ -1,8 +1,10 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { ModulesContainer } from '@nestjs/core/injector/modules-container'; import { MetadataScanner } from '@nestjs/core/metadata-scanner'; import { MergeInfo } from 'graphql-tools/dist/Interfaces'; import { mapValues } from 'lodash'; +import { GRAPHQL_MODULE_OPTIONS } from '../graphql.constants'; +import { GqlModuleOptions } from '../interfaces/gql-module-options.interface'; import { ResolverMetadata } from '../interfaces/resolver-metadata.interface'; import { extractMetadata } from '../utils/extract-metadata.util'; import { BaseExplorerService } from './base-explorer.service'; @@ -12,13 +14,16 @@ export class DelegatesExplorerService extends BaseExplorerService { constructor( private readonly modulesContainer: ModulesContainer, private readonly metadataScanner: MetadataScanner, + @Inject(GRAPHQL_MODULE_OPTIONS) + private readonly gqlOptions: GqlModuleOptions, ) { super(); } explore() { - const modules = [...this.modulesContainer.values()].map( - module => module.components, + const modules = this.getModules( + this.modulesContainer, + this.gqlOptions.include || [], ); const delegates = this.flatMap(modules, instance => this.filterDelegates(instance), diff --git a/lib/services/resolvers-explorer.service.ts b/lib/services/resolvers-explorer.service.ts index 582d9d06c..764649267 100644 --- a/lib/services/resolvers-explorer.service.ts +++ b/lib/services/resolvers-explorer.service.ts @@ -1,10 +1,16 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { isUndefined } from '@nestjs/common/utils/shared.utils'; import { ExternalContextCreator } from '@nestjs/core/helpers/external-context-creator'; import { ModulesContainer } from '@nestjs/core/injector/modules-container'; import { MetadataScanner } from '@nestjs/core/metadata-scanner'; +import { GqlModuleOptions } from '..'; +import { Resolvers } from '../enums/resolvers.enum'; import { GqlParamsFactory } from '../factories/params.factory'; -import { PARAM_ARGS_METADATA, SUBSCRIPTION_TYPE } from '../graphql.constants'; +import { + GRAPHQL_MODULE_OPTIONS, + PARAM_ARGS_METADATA, + SUBSCRIPTION_TYPE, +} from '../graphql.constants'; import { ResolverMetadata } from '../interfaces/resolver-metadata.interface'; import { extractMetadata } from '../utils/extract-metadata.util'; import { BaseExplorerService } from './base-explorer.service'; @@ -17,13 +23,16 @@ export class ResolversExplorerService extends BaseExplorerService { private readonly modulesContainer: ModulesContainer, private readonly metadataScanner: MetadataScanner, private readonly externalContextCreator: ExternalContextCreator, + @Inject(GRAPHQL_MODULE_OPTIONS) + private readonly gqlOptions: GqlModuleOptions, ) { super(); } explore() { - const modules = [...this.modulesContainer.values()].map( - module => module.components, + const modules = this.getModules( + this.modulesContainer, + this.gqlOptions.include || [], ); const resolvers = this.flatMap(modules, instance => this.filterResolvers(instance), @@ -36,8 +45,14 @@ export class ResolversExplorerService extends BaseExplorerService { return undefined; } const prototype = Object.getPrototypeOf(instance); - const predicate = (resolverType, isDelegated) => - isUndefined(resolverType) || isDelegated; + const predicate = (resolverType, isDelegated, isPropertyResolver) => + isUndefined(resolverType) || + isDelegated || + (!isPropertyResolver && + ![Resolvers.MUTATION, Resolvers.QUERY, Resolvers.SUBSCRIPTION].some( + type => type === resolverType, + )); + const resolvers = this.metadataScanner.scanFromPrototype( instance, prototype, diff --git a/lib/services/scalars-explorer.service.ts b/lib/services/scalars-explorer.service.ts index 768652bb9..9502c12c9 100644 --- a/lib/services/scalars-explorer.service.ts +++ b/lib/services/scalars-explorer.service.ts @@ -1,17 +1,26 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { ModulesContainer } from '@nestjs/core/injector/modules-container'; -import { SCALAR_NAME_METADATA } from '../graphql.constants'; +import { GqlModuleOptions } from '..'; +import { + GRAPHQL_MODULE_OPTIONS, + SCALAR_NAME_METADATA, +} from '../graphql.constants'; import { BaseExplorerService } from './base-explorer.service'; @Injectable() export class ScalarsExplorerService extends BaseExplorerService { - constructor(private readonly modulesContainer: ModulesContainer) { + constructor( + private readonly modulesContainer: ModulesContainer, + @Inject(GRAPHQL_MODULE_OPTIONS) + private readonly gqlOptions: GqlModuleOptions, + ) { super(); } explore() { - const modules = [...this.modulesContainer.values()].map( - module => module.components, + const modules = this.getModules( + this.modulesContainer, + this.gqlOptions.include || [], ); return this.flatMap(modules, instance => this.filterScalar(instance)); } diff --git a/lib/utils/extract-metadata.util.ts b/lib/utils/extract-metadata.util.ts index 07e37dc7e..889e91891 100644 --- a/lib/utils/extract-metadata.util.ts +++ b/lib/utils/extract-metadata.util.ts @@ -2,6 +2,7 @@ import 'reflect-metadata'; import { RESOLVER_DELEGATE_METADATA, RESOLVER_NAME_METADATA, + RESOLVER_PROPERTY_METADATA, RESOLVER_TYPE_METADATA, } from '../graphql.constants'; import { ResolverMetadata } from '../interfaces/resolver-metadata.interface'; @@ -10,19 +11,27 @@ export function extractMetadata( instance, prototype, methodName: string, - filterPredicate: (resolverType: string, isDelegated: boolean) => boolean, + filterPredicate: ( + resolverType: string, + isDelegated: boolean, + isPropertyResolver?: boolean, + ) => boolean, ): ResolverMetadata { const callback = prototype[methodName]; const resolverType = Reflect.getMetadata(RESOLVER_TYPE_METADATA, callback) || Reflect.getMetadata(RESOLVER_TYPE_METADATA, instance.constructor); + const isPropertyResolver = Reflect.getMetadata( + RESOLVER_PROPERTY_METADATA, + callback, + ); const resolverName = Reflect.getMetadata(RESOLVER_NAME_METADATA, callback); const isDelegated = !!Reflect.getMetadata( RESOLVER_DELEGATE_METADATA, callback, ); - if (filterPredicate(resolverType, isDelegated)) { + if (filterPredicate(resolverType, isDelegated, isPropertyResolver)) { return null; } return { diff --git a/package.json b/package.json index 01ac5ec98..1218b31b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/graphql", - "version": "5.0.0", + "version": "5.1.0", "description": "Nest - modern, fast, powerful node.js web framework (@graphql)", "author": "Kamil Mysliwiec", @@ -31,8 +31,8 @@ "merge-graphql-schemas": "^1.3.0" }, "peerDependencies": { - "@nestjs/common": "^5.0.0", - "@nestjs/core": "^5.0.0", + "@nestjs/common": "^5.3.0", + "@nestjs/core": "^5.3.0", "apollo-server-express": "^2.0.4", "graphql": "^0.13.2", "reflect-metadata": "^0.1.12"