shyft
Version:
Model driven GraphQL API framework
129 lines (128 loc) • 5.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProtocolGraphQL = void 0;
var graphql_1 = require("graphql");
var ProtocolType_1 = require("../engine/protocol/ProtocolType");
var dataTypes_1 = require("../engine/datatype/dataTypes");
var DataTypeState_1 = require("../engine/datatype/DataTypeState");
var DataTypeEnum_1 = require("../engine/datatype/DataTypeEnum");
var ObjectDataType_1 = require("../engine/datatype/ObjectDataType");
var ListDataType_1 = require("../engine/datatype/ListDataType");
var graphRegistry_1 = require("./graphRegistry");
var dataTypes_2 = require("./dataTypes");
var io_1 = require("./io");
exports.ProtocolGraphQL = new ProtocolType_1.ProtocolType({
name: 'ProtocolGraphQL',
description: 'GraphQL API protocol',
isProtocolDataType: function (protocolDataType) {
return protocolDataType instanceof graphql_1.GraphQLScalarType;
},
});
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeID, graphql_1.GraphQLID);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeInteger, graphql_1.GraphQLInt);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeBigInt, dataTypes_2.GraphQLBigInt);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeFloat, graphql_1.GraphQLFloat);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeDouble, graphql_1.GraphQLFloat);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeBoolean, graphql_1.GraphQLBoolean);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeString, graphql_1.GraphQLString);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeJson, dataTypes_2.GraphQLJSON);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeTimestamp, dataTypes_2.GraphQLDateTime);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeTimestampTz, dataTypes_2.GraphQLDateTime);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeTime, dataTypes_2.GraphQLTime);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeTimeTz, dataTypes_2.GraphQLTime);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeDate, dataTypes_2.GraphQLDate);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeUUID, graphql_1.GraphQLID);
exports.ProtocolGraphQL.addDataTypeMap(dataTypes_1.DataTypeI18n, dataTypes_2.GraphQLJSON);
var dataTypesRegistry = {
object: {},
enum: {},
};
exports.ProtocolGraphQL.addDynamicDataTypeMap(DataTypeState_1.isDataTypeState, function (attributeType) {
var name = attributeType.name;
var values = {};
if (dataTypesRegistry.enum[name]) {
if (attributeType === dataTypesRegistry.enum[name].attributeType) {
return dataTypesRegistry.enum[name].type;
}
}
var states = attributeType.states;
var stateNames = Object.keys(states);
stateNames.map(function (stateName) {
values[stateName] = {
value: states[stateName],
};
});
var type = new graphql_1.GraphQLEnumType({
name: name,
values: values,
});
dataTypesRegistry.enum[name] = {
type: type,
attributeType: attributeType,
};
return type;
});
exports.ProtocolGraphQL.addDynamicDataTypeMap(DataTypeEnum_1.isDataTypeEnum, function (attributeType) {
var name = attributeType.name;
var values = {};
if (dataTypesRegistry.enum[name]) {
if (attributeType === dataTypesRegistry.enum[name].attributeType) {
return dataTypesRegistry.enum[name].type;
}
}
var enumValues = attributeType.values;
var enumValuesNames = Object.keys(enumValues);
enumValuesNames.map(function (valueName) {
values[valueName] = {
value: enumValues[valueName],
};
});
var type = new graphql_1.GraphQLEnumType({
name: name,
values: values,
});
dataTypesRegistry.enum[name] = {
type: type,
attributeType: attributeType,
};
return type;
});
exports.ProtocolGraphQL.addDynamicDataTypeMap(ObjectDataType_1.isObjectDataType, function (attributeType, sourceName, asInput) {
var name = attributeType.name;
var uniqueName = name + "-" + sourceName + "-" + (asInput ? 'Input' : 'Output');
if (asInput) {
if (!dataTypesRegistry.object[uniqueName]) {
var dataInputType = io_1.generateDataInput(sourceName + "-" + name, attributeType.getAttributes());
dataTypesRegistry.object[uniqueName] = dataInputType;
}
return dataTypesRegistry.object[uniqueName];
}
if (!dataTypesRegistry.object[uniqueName]) {
var dataOutputType = io_1.generateDataOutput(sourceName + "-" + name, attributeType.getAttributes(), graphRegistry_1.graphRegistry);
dataTypesRegistry.object[uniqueName] = dataOutputType;
}
return dataTypesRegistry.object[uniqueName];
});
exports.ProtocolGraphQL.addDynamicDataTypeMap(ListDataType_1.isListDataType, function (attributeType, sourceName, asInput) {
var name = attributeType.name;
var uniqueName = name + "-" + sourceName + "-" + (asInput ? 'Input' : 'Output');
// hack: wrap list type into an object data type and extract later that single field
// to reuse the same input / ouput logic as with object data types
var params = {
wrapped: {
type: attributeType,
},
};
if (asInput) {
if (!dataTypesRegistry.object[uniqueName]) {
var dataInputType = io_1.generateDataInput(sourceName + "-" + name, params);
dataTypesRegistry.object[uniqueName] = dataInputType.getFields().wrapped.type;
}
return dataTypesRegistry.object[uniqueName];
}
if (!dataTypesRegistry.object[uniqueName]) {
var dataOutputType = io_1.generateDataOutput(sourceName + "-" + name, params, graphRegistry_1.graphRegistry);
dataTypesRegistry.object[uniqueName] = dataOutputType.getFields().wrapped.type;
}
return dataTypesRegistry.object[uniqueName];
});