UNPKG

shyft

Version:

Model driven GraphQL API framework

412 lines (411 loc) 22 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractIdFromNodeId = exports.generateOperationOutput = exports.generateOperationNestedInput = exports.generateOperationInstanceNestedInput = exports.generateInstanceUniquenessInputs = exports.generateInstanceUniquenessInput = exports.generateOperationByPrimaryAttributeInput = exports.generateOperationInput = exports.generateOperationInstanceInput = void 0; var graphql_1 = require("graphql"); var graphql_relay_1 = require("graphql-relay"); var _ = __importStar(require("lodash")); var ProtocolGraphQL_1 = require("./ProtocolGraphQL"); var helper_1 = require("./helper"); var Entity_1 = require("../engine/entity/Entity"); var Mutation_1 = require("../engine/mutation/Mutation"); var Subscription_1 = require("../engine/subscription/Subscription"); var registry_1 = require("./registry"); var i18nInputFieldTypesCache = {}; var generateI18nInputFieldType = function (entity, entityOperation, attribute) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var i18nFieldTypeName = protocolConfiguration.generateOperationI18nAttributeInputTypeName(entity, entityOperation, attribute); if (i18nInputFieldTypesCache[i18nFieldTypeName]) { return i18nInputFieldTypesCache[i18nFieldTypeName]; } var attributeType = attribute.type; var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var languages = protocolConfiguration .getParentConfiguration() .getLanguages(); var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(attributeType, entity.name, true); var gqlFieldName = registry_1.getRegisteredEntityAttribute(entity.name, attribute.name).fieldName; var i18nFieldType = new graphql_1.GraphQLInputObjectType({ name: i18nFieldTypeName, description: "**`" + entityOperation.name + "`** operation translations input type for **`" + typeNamePascalCase + "." + gqlFieldName + "`**", fields: function () { var i18nFields = {}; languages.map(function (language, langIdx) { var type = langIdx === 0 && attribute.required && !entityOperation.ignoreRequired ? new graphql_1.GraphQLNonNull(fieldType) : fieldType; i18nFields[language] = { type: type, }; }); return i18nFields; }, }); i18nInputFieldTypesCache[i18nFieldTypeName] = i18nFieldType; return i18nFieldType; }; var generateOperationInstanceInput = function (entity, entityOperation) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var entityOperationInstanceInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateOperationInstanceInputTypeName(entity, entityOperation), description: "**`" + entityOperation.name + "`** operation input type for **`" + typeNamePascalCase + "`**", fields: function () { var fields = {}; var entityAttributes = entity.getAttributes(); _.forEach(entityOperation.attributes, function (attributeName) { var attribute = entityAttributes[attributeName]; var _a = registry_1.getRegisteredEntityAttribute(entity.name, attribute.name), gqlFieldName = _a.fieldName, gqlFieldNameI18n = _a.fieldNameI18n; var attributeType = attribute.type; // it's a reference if (Entity_1.isEntity(attributeType)) { var targetEntity = attributeType; var primaryAttribute = targetEntity.getPrimaryAttribute(); attributeType = primaryAttribute.type; } var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(attributeType, entity.name, true); fields[gqlFieldName] = { type: attribute.required && !entityOperation.ignoreRequired && !attribute.i18n && !attribute.defaultValue ? new graphql_1.GraphQLNonNull(fieldType) : fieldType, }; if (attribute.i18n) { var i18nFieldType = generateI18nInputFieldType(entity, entityOperation, attribute); fields[gqlFieldNameI18n] = { type: i18nFieldType, }; } }); return fields; }, }); return entityOperationInstanceInputType; }; exports.generateOperationInstanceInput = generateOperationInstanceInput; var generateOperationInput = function (entity, typeName, entityOperation, entityOperationInstanceInputType) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var entityOperationInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateOperationInputTypeName(entity, entityOperation), description: "Operation input type for **`" + typeNamePascalCase + "`**", fields: function () { var fields = {}; if (Mutation_1.isMutation(entityOperation)) { fields.clientMutationId = { type: graphql_1.GraphQLString, }; } else if (Subscription_1.isSubscription(entityOperation)) { fields.clientSubscriptionId = { type: graphql_1.GraphQLString, }; } if (entityOperation.needsInstance) { fields.nodeId = { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID), }; } if (entityOperationInstanceInputType) { fields[typeName] = { type: new graphql_1.GraphQLNonNull(entityOperationInstanceInputType), }; } return fields; }, }); return entityOperationInputType; }; exports.generateOperationInput = generateOperationInput; var generateOperationByPrimaryAttributeInput = function (entity, typeName, entityOperation, entityOperationInstanceInputType, primaryAttribute) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var fieldName = registry_1.getRegisteredEntityAttribute(entity.name, primaryAttribute.name).fieldName; var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(primaryAttribute.type, entity.name, true); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var entityOperationInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateOperationByPrimaryAttributeInputTypeName(entity, entityOperation, primaryAttribute), description: "Operation input type for **`" + typeNamePascalCase + "`** using the **`" + fieldName + "`**", fields: function () { var fields = {}; if (Mutation_1.isMutation(entityOperation)) { fields.clientMutationId = { type: graphql_1.GraphQLString, }; } else if (Subscription_1.isSubscription(entityOperation)) { fields.clientSubscriptionId = { type: graphql_1.GraphQLString, }; } if (entityOperation.needsInstance) { fields[fieldName] = { type: new graphql_1.GraphQLNonNull(fieldType), }; } if (entityOperationInstanceInputType) { fields[typeName] = { type: new graphql_1.GraphQLNonNull(entityOperationInstanceInputType), }; } return fields; }, }); return entityOperationInputType; }; exports.generateOperationByPrimaryAttributeInput = generateOperationByPrimaryAttributeInput; var generateInstanceUniquenessInput = function (entity, uniquenessAttributes, graphRegistry) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; // todo watch out for duplicate ! var entityInstanceInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateInstanceUniquenessInputTypeName(entity, uniquenessAttributes.uniquenessName), description: "Input type for **`" + typeNamePascalCase + "`** using data uniqueness (" + uniquenessAttributes.attributes + ") to resolve the ID", fields: function () { var fields = {}; var entityAttributes = entity.getAttributes(); _.forEach(uniquenessAttributes.attributes, function (attributeName) { var attribute = entityAttributes[attributeName]; var gqlFieldName = registry_1.getRegisteredEntityAttribute(entity.name, attribute.name).fieldName; var attributeType = attribute.type; if (Entity_1.isEntity(attributeType)) { var targetEntity = attributeType; var primaryAttribute = targetEntity.getPrimaryAttribute(); var targetTypeName = registry_1.getRegisteredEntity(targetEntity.name).typeName; attributeType = primaryAttribute.type; var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(attributeType, entity.name, true); var uniquenessAttributesList = helper_1.getEntityUniquenessAttributes(targetEntity); if (uniquenessAttributesList.length === 0) { fields[gqlFieldName] = { type: attribute.required ? new graphql_1.GraphQLNonNull(fieldType) : fieldType, }; } else { fields[gqlFieldName] = { type: fieldType, }; var registryType_1 = graphRegistry.types[targetTypeName]; registryType_1.instanceUniquenessInputs = registryType_1.instanceUniquenessInputs || {}; uniquenessAttributesList.map(function (_a) { var uniquenessName = _a.uniquenessName; var fieldName = protocolConfiguration.generateUniquenessAttributesFieldName(entity, attribute, uniquenessName); fields[fieldName] = { type: registryType_1.instanceUniquenessInputs[uniquenessName], }; }); } } else { var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(attributeType, entity.name, true); fields[gqlFieldName] = { type: new graphql_1.GraphQLNonNull(fieldType), }; } }); return fields; }, }); return entityInstanceInputType; }; exports.generateInstanceUniquenessInput = generateInstanceUniquenessInput; var generateInstanceUniquenessInputs = function (graphRegistry) { _.forEach(graphRegistry.types, function (_a, typeName) { var entity = _a.entity; var uniquenessAttributesList = helper_1.getEntityUniquenessAttributes(entity); var registryType = graphRegistry.types[typeName]; registryType.instanceUniquenessInputs = registryType.instanceUniquenessInputs || {}; uniquenessAttributesList.map(function (uniquenessAttributes) { var instanceUniquenessInput = exports.generateInstanceUniquenessInput(entity, uniquenessAttributes, graphRegistry); // watching out for duplicate if (!registryType.instanceUniquenessInputs[uniquenessAttributes.uniquenessName]) { registryType.instanceUniquenessInputs[uniquenessAttributes.uniquenessName] = instanceUniquenessInput; } }); }); }; exports.generateInstanceUniquenessInputs = generateInstanceUniquenessInputs; var generateOperationInstanceNestedInput = function (entity, entityOperation, graphRegistry) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var entityOperationInstanceInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateOperationInstanceNestedInputTypeName(entity, entityOperation), description: "**`" + entityOperation.name + "`** operation input type for **`" + typeNamePascalCase + "`** using data uniqueness to resolve references", fields: function () { var fields = {}; var entityAttributes = entity.getAttributes(); _.forEach(entityOperation.attributes, function (attributeName) { var attribute = entityAttributes[attributeName]; var _a = registry_1.getRegisteredEntityAttribute(entity.name, attribute.name), gqlFieldName = _a.fieldName, gqlFieldNameI18n = _a.fieldNameI18n; var attributeType = attribute.type; if (Entity_1.isEntity(attributeType)) { var targetEntity = attributeType; var primaryAttribute = targetEntity.getPrimaryAttribute(); var targetTypeName = registry_1.getRegisteredEntity(targetEntity.name).typeName; attributeType = primaryAttribute.type; var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(attributeType, entity.name, true); var uniquenessAttributesList = helper_1.getEntityUniquenessAttributes(targetEntity); if (uniquenessAttributesList.length === 0) { fields[gqlFieldName] = { type: attribute.required && !entityOperation.ignoreRequired && !attribute.defaultValue ? new graphql_1.GraphQLNonNull(fieldType) : fieldType, }; } else { fields[gqlFieldName] = { type: fieldType, }; var registryType_2 = graphRegistry.types[targetTypeName]; registryType_2.instanceUniquenessInputs = registryType_2.instanceUniquenessInputs || {}; uniquenessAttributesList.map(function (_a) { var uniquenessName = _a.uniquenessName; var fieldName = protocolConfiguration.generateUniquenessAttributesFieldName(entity, attribute, uniquenessName); fields[fieldName] = { type: registryType_2.instanceUniquenessInputs[uniquenessName], }; }); } } else { var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(attributeType, entity.name, true); fields[gqlFieldName] = { type: attribute.required && !entityOperation.ignoreRequired && !attribute.i18n && !attribute.defaultValue ? new graphql_1.GraphQLNonNull(fieldType) : fieldType, }; if (attribute.i18n) { var i18nFieldType = generateI18nInputFieldType(entity, entityOperation, attribute); fields[gqlFieldNameI18n] = { type: i18nFieldType, }; } } }); return fields; }, }); return entityOperationInstanceInputType; }; exports.generateOperationInstanceNestedInput = generateOperationInstanceNestedInput; var generateOperationNestedInput = function (entity, typeName, entityOperation, entityOperationInstanceUniquenessInputType) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var entityOperationInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateOperationNestedInputTypeName(entity, entityOperation), description: "Operation input type for **`" + typeNamePascalCase + "`** using data uniqueness to resolve references", fields: function () { var fields = {}; if (Mutation_1.isMutation(entityOperation)) { fields.clientMutationId = { type: graphql_1.GraphQLString, }; } else if (Subscription_1.isSubscription(entityOperation)) { fields.clientSubscriptionId = { type: graphql_1.GraphQLString, }; } if (entityOperation.needsInstance) { fields.nodeId = { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID), }; } if (entityOperationInstanceUniquenessInputType) { fields[typeName] = { type: new graphql_1.GraphQLNonNull(entityOperationInstanceUniquenessInputType), }; } return fields; }, }); return entityOperationInputType; }; exports.generateOperationNestedInput = generateOperationNestedInput; var generateOperationOutput = function (entity, typeName, type, entityOperation) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var typeNamePascalCase = registry_1.getRegisteredEntity(entity.name).typeNamePascalCase; var entityOperationOutputType = new graphql_1.GraphQLObjectType({ name: protocolConfiguration.generateOperationOutputTypeName(entity, entityOperation), description: "Operation output type for **`" + typeNamePascalCase + "`**", fields: function () { var fields = {}; if (Mutation_1.isMutation(entityOperation)) { fields.clientMutationId = { type: graphql_1.GraphQLString, }; } else if (Subscription_1.isSubscription(entityOperation)) { fields.clientSubscriptionId = { type: graphql_1.GraphQLString, }; } if (entityOperation.isTypeDelete) { fields.deleteRowCount = { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLInt), description: 'Number of deleted rows', }; var primaryAttribute = entity.getPrimaryAttribute(); if (primaryAttribute) { var fieldName = registry_1.getRegisteredEntityAttribute(entity.name, primaryAttribute.name).fieldName; var fieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(primaryAttribute.type, entity.name, false); fields[fieldName] = { type: new graphql_1.GraphQLNonNull(fieldType), description: primaryAttribute.description, }; } } else { fields[typeName] = { type: new graphql_1.GraphQLNonNull(type), }; } return fields; }, }); return entityOperationOutputType; }; exports.generateOperationOutput = generateOperationOutput; var extractIdFromNodeId = function (graphRegistry, sourceEntityName, nodeId) { var instanceId; if (nodeId) { var _a = graphql_relay_1.fromGlobalId(nodeId), type = _a.type, id = _a.id; instanceId = id; var entity = graphRegistry.types[type] ? graphRegistry.types[type].entity : null; if (!entity || entity.name !== sourceEntityName) { throw new Error('Incompatible nodeId used with this mutation'); } } return instanceId; }; exports.extractIdFromNodeId = extractIdFromNodeId;