shyft
Version:
Model driven GraphQL API framework
412 lines (411 loc) • 22 kB
JavaScript
"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;