@terabits/grapi
Version:
Grapi Schema Generator For GraphQL Server
175 lines (174 loc) • 8.68 kB
JavaScript
;
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;