UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

125 lines (124 loc) 5.12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Grapi = void 0; const schema_1 = require("@graphql-tools/schema"); const constants_1 = require("./constants"); const dataModel_1 = require("./dataModel"); const generator_1 = __importDefault(require("./generator")); const mergeHooks_1 = __importDefault(require("./hooks/mergeHooks")); const relationHook_1 = require("./hooks/relationHook"); const lodash_1 = require("./lodash"); const parse_1 = require("./parse"); const plugins_1 = require("./plugins"); const constants_2 = require("./plugins/constants"); const printer_1 = require("./printer"); const combine_1 = __importDefault(require("./resolver/combine")); const scalars_1 = require("./scalars"); class Grapi { sdl; dataSources; scalars; enums; schemaDirectives; context; rootNode; models; userDefinedPlugins; config; skipPrint; constructor({ sdl, dataSources, scalars, enums, context, skipPrint, rootNode, models, plugins, schemaDirectives, }) { this.sdl = sdl ? sdl.concat(...[constants_2.scalarSchema]) : ``; this.dataSources = dataSources; this.scalars = (0, lodash_1.assign)(scalars_1.customScalars, scalars); this.enums = enums; this.context = context; this.skipPrint = skipPrint; this.rootNode = rootNode; this.models = models; this.userDefinedPlugins = plugins; this.schemaDirectives = schemaDirectives; this.createServerConfig(); } bindDataSourceInModels(models, modelMap) { models.forEach(model => { modelMap[model.getName()] = model; if (!model.getDataSource()) { const dataSourceArgs = model.getMetadata(constants_1.MODEL_DIRECTIVE); const dataSourceIdentifier = dataSourceArgs[constants_1.MODEL_DIRECTIVE_SOURCE_NAME]; const createDataSource = this.dataSources[dataSourceIdentifier]; if (!createDataSource) { throw new Error(`dataSource ${dataSourceIdentifier} does not exist`); } const args = (0, lodash_1.omit)(dataSourceArgs, constants_1.MODEL_DIRECTIVE_SOURCE_NAME); const dataSource = createDataSource(args); model.setDataSource(dataSource); } }); } createServerConfig() { const ifSkipPrint = this.skipPrint || false; let rootNode; let models; if ((0, lodash_1.isUndefined)(this.rootNode) || (0, lodash_1.isEmpty)(this.models)) { const parseResult = (0, parse_1.parse)(this.sdl); rootNode = parseResult.rootNode; models = parseResult.models; } else { rootNode = this.rootNode; models = this.models; } const modelMap = {}; this.bindDataSourceInModels(models, modelMap); const relations = (0, dataModel_1.createRelation)(models); const relationHooks = (0, relationHook_1.createRelationHooks)(relations); if (!ifSkipPrint) { (0, printer_1.printModels)(models); (0, printer_1.printRelations)(relations); } const hookMap = (0, mergeHooks_1.default)(relationHooks); const plugins = [ new plugins_1.BaseTypePlugin(), new plugins_1.WhereInputPlugin(), new plugins_1.OrderInputPlugin(), new plugins_1.QueryPlugin(), new plugins_1.RelayPlugin(), new plugins_1.CreatePlugin({ hook: hookMap }), new plugins_1.UpdatePlugin({ hook: hookMap }), new plugins_1.DeletePlugin({ hook: hookMap }), ...this.userDefinedPlugins || [], ]; (0, lodash_1.forEach)(hookMap, (hook, key) => { if (!modelMap[key]) { throw new Error(`model ${key} not found for hooks`); } modelMap[key].mergeResolver(hook.resolveFields); }); models.forEach(model => { if (model.getDataSource().resolveFields) { model.mergeResolver(model.getDataSource().resolveFields()); } }); rootNode.addSdl(constants_2.orderByInputEnum); rootNode.addInput(constants_2.inputIntBetween); rootNode.addInput(constants_2.inputFloatBetween); rootNode.addInput(constants_2.inputDateTimeBetween); const generator = new generator_1.default({ plugins, rootNode }); const resolvers = (0, combine_1.default)(plugins, models); const typeDefs = generator.generate(models); this.config = { schema: (0, schema_1.makeExecutableSchema)({ resolvers: (0, lodash_1.assign)(resolvers, this.scalars), typeDefs: typeDefs.concat(constants_2.scalarSchema), }), context: this.context }; } createApolloConfig() { return this.config; } } exports.Grapi = Grapi;