UNPKG

shyft

Version:

Model driven GraphQL API framework

129 lines (128 loc) 5.96 kB
"use strict"; 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]; });