UNPKG

@nestjs/graphql

Version:

Nest - modern, fast, powerful node.js web framework (@graphql)

98 lines (97 loc) 4.69 kB
var GraphQLSchemaFactory_1; import { __decorate, __metadata } from "tslib"; import { Injectable, Logger } from '@nestjs/common'; import { isEmpty, isFunction } from '@nestjs/common/utils/shared.utils.js'; import { getIntrospectionQuery, graphql, GraphQLSchema, specifiedDirectives, } from 'graphql'; import { SCALAR_NAME_METADATA, SCALAR_TYPE_METADATA, } from '../graphql.constants.js'; import { createScalarType } from '../utils/scalar-types.utils.js'; import { SchemaGenerationError } from './errors/schema-generation.error.js'; import { MutationTypeFactory } from './factories/mutation-type.factory.js'; import { OrphanedTypesFactory } from './factories/orphaned-types.factory.js'; import { QueryTypeFactory } from './factories/query-type.factory.js'; import { SubscriptionTypeFactory } from './factories/subscription-type.factory.js'; import { LazyMetadataStorage } from './storages/lazy-metadata.storage.js'; import { TypeMetadataStorage } from './storages/type-metadata.storage.js'; import { TypeDefinitionsGenerator } from './type-definitions.generator.js'; let GraphQLSchemaFactory = GraphQLSchemaFactory_1 = class GraphQLSchemaFactory { constructor(queryTypeFactory, mutationTypeFactory, subscriptionTypeFactory, orphanedTypesFactory, typeDefinitionsGenerator) { this.queryTypeFactory = queryTypeFactory; this.mutationTypeFactory = mutationTypeFactory; this.subscriptionTypeFactory = subscriptionTypeFactory; this.orphanedTypesFactory = orphanedTypesFactory; this.typeDefinitionsGenerator = typeDefinitionsGenerator; this.logger = new Logger(GraphQLSchemaFactory_1.name); } async create(resolvers, scalarsOrOptions = [], options = {}) { if (Array.isArray(scalarsOrOptions)) { this.assignScalarObjects(scalarsOrOptions, options); } else { options = scalarsOrOptions; } LazyMetadataStorage.load(resolvers); TypeMetadataStorage.compile(options.orphanedTypes); // includeModules is passed internally from GraphQLSchemaBuilder const internalOptions = options; this.typeDefinitionsGenerator.generate(options, internalOptions.includeModules); const schema = new GraphQLSchema({ mutation: this.mutationTypeFactory.create(resolvers, options), query: this.queryTypeFactory.create(resolvers, options), subscription: this.subscriptionTypeFactory.create(resolvers, options), types: [ ...this.orphanedTypesFactory.create(options.orphanedTypes), ...(options.scalarsMap ?? []).map(({ scalar }) => scalar), ], directives: [...specifiedDirectives, ...(options.directives ?? [])], }); if (!options.skipCheck) { const introspectionQuery = getIntrospectionQuery(); const executionResult = await graphql({ schema, source: introspectionQuery, }); const errors = executionResult.errors; if (errors) { throw new SchemaGenerationError(errors); } } return schema; } assignScalarObjects(scalars, options) { if (isEmpty(scalars)) { return; } const scalarsMap = options.scalarsMap || []; scalars .filter((classRef) => classRef) .forEach((classRef) => this.addScalarTypeByClassRef(classRef, scalarsMap)); options.scalarsMap = scalarsMap; } addScalarTypeByClassRef(classRef, scalarsMap) { try { const scalarNameMetadata = Reflect.getMetadata(SCALAR_NAME_METADATA, classRef); const scalarTypeMetadata = Reflect.getMetadata(SCALAR_TYPE_METADATA, classRef); if (!scalarNameMetadata) { return; } const instance = new classRef(); const type = (isFunction(scalarTypeMetadata) && scalarTypeMetadata()) || classRef; scalarsMap.push({ type, scalar: createScalarType(scalarNameMetadata, instance), }); } catch { this.logger.error(`Cannot generate a GraphQLScalarType for "${classRef.name}" scalar. Make sure to put any initialization logic in the lifecycle hooks instead of a constructor.`); } } }; GraphQLSchemaFactory = GraphQLSchemaFactory_1 = __decorate([ Injectable(), __metadata("design:paramtypes", [QueryTypeFactory, MutationTypeFactory, SubscriptionTypeFactory, OrphanedTypesFactory, TypeDefinitionsGenerator]) ], GraphQLSchemaFactory); export { GraphQLSchemaFactory };