@scalars/grapi
Version:
Grapi Schema Generator For GraphQL Server
120 lines (119 loc) • 5.38 kB
JavaScript
"use strict";
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
to[j] = from[i];
return to;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.__esModule = true;
exports.Grapi = void 0;
var chalk_1 = __importDefault(require("chalk"));
var constants_1 = require("./constants");
var dataModel_1 = require("./dataModel");
var generator_1 = __importDefault(require("./generator"));
var mergeHooks_1 = __importDefault(require("./hooks/mergeHooks"));
var relationHook_1 = require("./hooks/relationHook");
var lodash_1 = require("./lodash");
var parse_1 = require("./parse");
var plugins_1 = require("./plugins");
var constants_2 = require("./plugins/constants");
var printer_1 = require("./printer");
var combine_1 = __importDefault(require("./resolver/combine"));
var scalars_1 = require("./scalars");
var Grapi = (function () {
function Grapi(_a) {
var sdl = _a.sdl, dataSources = _a.dataSources, scalars = _a.scalars, enums = _a.enums, context = _a.context, skipPrint = _a.skipPrint, rootNode = _a.rootNode, models = _a.models, plugins = _a.plugins, schemaDirectives = _a.schemaDirectives;
this.sdl = sdl ? sdl.concat.apply(sdl, [constants_2.scalarSchema]) : "";
this.dataSources = dataSources;
this.scalars = 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();
}
Grapi.prototype.createServerConfig = function () {
var _this = this;
var ifSkipPrint = lodash_1.get(this, 'skipPrint', false);
if (!ifSkipPrint) {
console.log(chalk_1["default"].magenta("Starting Grapi...\n"));
}
var rootNode;
var models;
if (lodash_1.isUndefined(this.rootNode) || lodash_1.isEmpty(this.models)) {
var parseResult = parse_1.parse(this.sdl);
rootNode = parseResult.rootNode;
models = parseResult.models;
}
else {
rootNode = this.rootNode;
models = this.models;
}
var modelMap = {};
models.forEach(function (model) {
modelMap[model.getName()] = model;
if (!model.getDataSource()) {
var dataSourceArgs = model.getMetadata(constants_1.MODEL_DIRECTIVE) || model.getMetadata(constants_1.OBJECT_DIRECTIVE);
var dataSourceIdentifier = dataSourceArgs[constants_1.MODEL_DIRECTIVE_SOURCE_NAME];
var createDataSource = _this.dataSources[dataSourceIdentifier];
if (!createDataSource) {
throw new Error("dataSource " + dataSourceIdentifier + " does not exist");
}
var args = lodash_1.omit(dataSourceArgs, constants_1.MODEL_DIRECTIVE_SOURCE_NAME);
var dataSource = createDataSource(args);
model.setDataSource(dataSource);
}
});
var relations = dataModel_1.createRelation(models);
var relationHooks = relationHook_1.createRelationHooks(relations);
if (!ifSkipPrint) {
printer_1.printModels(models);
printer_1.printRelations(relations);
}
var hookMap = mergeHooks_1["default"](relationHooks);
var plugins = __spreadArray([
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 || []);
lodash_1.forEach(hookMap, function (hook, key) {
if (!modelMap[key]) {
throw new Error("model " + key + " not found for hooks");
}
modelMap[key].mergeResolver(hook.resolveFields);
});
models.forEach(function (model) {
if (model.getDataSource().resolveFields) {
model.mergeResolver(model.getDataSource().resolveFields());
}
});
rootNode.addEnum(constants_2.orderByInputEnum);
rootNode.addInput(constants_2.inputIntBetween);
rootNode.addInput(constants_2.inputFloatBetween);
rootNode.addInput(constants_2.inputDateTimeBetween);
var generator = new generator_1["default"]({ plugins: plugins, rootNode: rootNode });
var resolvers = combine_1["default"](plugins, models);
var typeDefs = generator.generate(models);
this.config = {
typeDefs: typeDefs.concat(constants_2.scalarSchema),
resolvers: lodash_1.assign(resolvers, this.scalars),
schemaDirectives: this.schemaDirectives,
context: this.context
};
};
Grapi.prototype.createApolloConfig = function () {
return this.config;
};
return Grapi;
}());
exports.Grapi = Grapi;