UNPKG

@terabits/grapi

Version:

Grapi Schema Generator For GraphQL Server

175 lines (174 loc) 8.68 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; exports.__esModule = true; exports.parse = exports.createDataModelFromSdlObjectType = exports.createDataFieldFromSdlField = exports.parseDataModelScalarType = void 0; var graphql_1 = require("graphql"); var constants_1 = require("./constants"); var dataModel_1 = require("./dataModel"); var type_1 = require("./dataModel/type"); var lodash_1 = require("./lodash"); var rootNode_1 = __importDefault(require("./rootNode")); var interface_1 = require("./sdlParser/field/interface"); var middlewares_1 = require("./sdlParser/middlewares"); var namedType_1 = require("./sdlParser/namedType"); var parser_1 = require("./sdlParser/parser"); var isGrapiDataModel = function (sdlNamedType) { return Boolean(sdlNamedType.getDirectives()[constants_1.MODEL_DIRECTIVE]); }; var isGrapiDataObject = function (sdlNamedType) { return Boolean(sdlNamedType.getDirectives()[constants_1.OBJECT_DIRECTIVE]); }; var isRelationType = function (sdlObjectType) { return Boolean(sdlObjectType.getInterfaces().find(function (interfaceName) { return interfaceName === constants_1.RELATION_INTERFACE_NAME; })); }; var parseDataModelScalarType = function (field) { switch (field.getTypeName()) { case graphql_1.GraphQLString.name: return type_1.DataModelType.STRING; case graphql_1.GraphQLInt.name: return type_1.DataModelType.INT; case graphql_1.GraphQLFloat.name: return type_1.DataModelType.FLOAT; case graphql_1.GraphQLBoolean.name: return type_1.DataModelType.BOOLEAN; case graphql_1.GraphQLID.name: return type_1.DataModelType.ID; default: throw new Error("cant parse dataModel type for field type: ".concat(field.getTypeName())); } }; exports.parseDataModelScalarType = parseDataModelScalarType; var createDataFieldFromSdlField = function (field, getModel, getNamedType, getRelationConfig) { var fieldMeta = { nonNull: field.isNonNull(), list: field.isList(), nonNullItem: field.isItemNonNull() }; switch (field.getFieldType()) { case interface_1.SdlFieldType.SCALAR: return new dataModel_1.ScalarField(__assign({ type: (0, exports.parseDataModelScalarType)(field) }, fieldMeta)); case interface_1.SdlFieldType.CUSTOM_SCALAR: return new dataModel_1.CustomScalarField(__assign({ typename: field.getTypeName() }, fieldMeta)); case interface_1.SdlFieldType.ENUM: return new dataModel_1.EnumField(__assign({ enumType: function () { return getNamedType(field.getTypeName()); } }, fieldMeta)); case interface_1.SdlFieldType.OBJECT: var objectField_1 = field; if (isGrapiDataModel(objectField_1.getObjectType())) { var relationWith = (0, lodash_1.get)(objectField_1.getDirective(constants_1.RELATION_DIRECTIVE_NAME), "".concat(constants_1.RELATION_ARGS, ".").concat(constants_1.RELATION_WITH, ".").concat(constants_1.RELATION_VALUE)); var relationConfig_1 = (0, lodash_1.mapValues)(getRelationConfig(relationWith), function (value) { if (value instanceof Object) { return (0, lodash_1.mapValues)(value, function (data) { return (0, lodash_1.get)(data, "value", data); }); } return value; }); return new dataModel_1.RelationField(__assign({ relationTo: function () { return getModel(objectField_1.getTypeName()); }, relationConfig: relationWith === undefined ? null : function () { return relationConfig_1; } }, fieldMeta)); } else { return new dataModel_1.ObjectField(__assign({ objectType: function () { return getNamedType(field.getTypeName()); } }, fieldMeta)); } } }; exports.createDataFieldFromSdlField = createDataFieldFromSdlField; var parseRelationConfig = function (sdlObjectType) { return (0, lodash_1.mapValues)((0, lodash_1.get)(sdlObjectType.getDirectives(), 'config.args'), function (inputValue) { return inputValue.getValue(); }); }; var createDataModelFromSdlObjectType = function (sdlObjectType, getModel, getNamedType, getRelationConfig, isObject) { var model = new dataModel_1.Model({ name: sdlObjectType.getName(), isObject: isObject }); (0, lodash_1.forEach)(sdlObjectType.getFields(), function (sdlField, key) { model.appendField(key, (0, exports.createDataFieldFromSdlField)(sdlField, getModel, getNamedType, getRelationConfig)); }); return model; }; exports.createDataModelFromSdlObjectType = createDataModelFromSdlObjectType; var parse = function (sdl) { var parser = new parser_1.SdlParser(); var sdlNamedTypes = parser.parse(sdl); var rootNode = new rootNode_1["default"](); var namedTypes = {}; var models = {}; var relationConfigMap = {}; var getModel = function (name) { return models[name]; }; var getNamedType = function (name) { return namedTypes[name]; }; var getRelationConfig = function (name) { return relationConfigMap[name]; }; sdlNamedTypes.forEach(function (sdlNamedType) { var name = sdlNamedType.getName(); if (sdlNamedType instanceof namedType_1.SdlDirectiveType) { rootNode.addSdl((0, parser_1.parseDefinitionNodeToSdl)(sdlNamedType.getTypeDef()), false); } if (sdlNamedType instanceof namedType_1.SdlEnumType) { var enumType = new dataModel_1.EnumType({ name: name, values: sdlNamedType.getValues(), description: sdlNamedType.getDescription() }); namedTypes[name] = enumType; rootNode.addEnum(enumType); } if (sdlNamedType instanceof namedType_1.SdlObjectType && !isGrapiDataModel(sdlNamedType) && !isRelationType(sdlNamedType)) { var objectType = new dataModel_1.ObjectType({ name: name, fields: (0, lodash_1.mapValues)(sdlNamedType.getFields(), function (sdlField) { return (0, exports.createDataFieldFromSdlField)(sdlField, getModel, getNamedType, getRelationConfig); }) }); namedTypes[name] = objectType; rootNode.addObjectType(objectType); } if (sdlNamedType instanceof namedType_1.SdlObjectType && (isGrapiDataModel(sdlNamedType) || isGrapiDataObject(sdlNamedType))) { var isObject = isGrapiDataObject(sdlNamedType); models[name] = (0, exports.createDataModelFromSdlObjectType)(sdlNamedType, getModel, getNamedType, getRelationConfig, isObject); } if (sdlNamedType instanceof namedType_1.SdlObjectType && isRelationType(sdlNamedType)) { relationConfigMap[name] = parseRelationConfig(sdlNamedType); } }); var middlewares = [ new middlewares_1.BasicFieldMiddware(), new middlewares_1.MetadataMiddleware(), ]; (0, lodash_1.forEach)(namedTypes, function (namedType) { if (namedType instanceof namedType_1.SdlObjectType) { middlewares.forEach(function (mid) { return mid.visitObjectType && mid.visitObjectType(namedType); }); } }); (0, lodash_1.forEach)(models, function (model, key) { var sdlObjectType = parser.getSdlNamedType(key); middlewares.forEach(function (middleware) { return middleware.visitGrapiDataModel && middleware.visitGrapiDataModel({ model: model, sdlObjectType: sdlObjectType }); }); (0, lodash_1.forEach)(model.getFields(), function (dataModelField, name) { var sdlField = sdlObjectType.getField(name); middlewares.forEach(function (mid) { return mid.visitField && mid.visitField({ model: model, field: dataModelField, sdlObjectType: sdlObjectType, sdlField: sdlField }); }); }); }); return { rootNode: rootNode, models: (0, lodash_1.values)(models) }; }; exports.parse = parse;