UNPKG

shyft

Version:

Model driven GraphQL API framework

345 lines (344 loc) 15.5 kB
"use strict"; 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 __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.generateOutput = exports.generateNestedDataOutput = exports.generateDataOutput = exports.generateInput = exports.generateNestedDataInput = exports.generateDataInput = void 0; var graphql_1 = require("graphql"); var _ = __importStar(require("lodash")); var ListDataType_1 = require("../engine/datatype/ListDataType"); var ObjectDataType_1 = require("../engine/datatype/ObjectDataType"); var Entity_1 = require("../engine/entity/Entity"); var util_1 = require("../engine/util"); var ProtocolGraphQL_1 = require("./ProtocolGraphQL"); var registry_1 = require("./registry"); var resolver_1 = require("./resolver"); var generateDataInputField = function (param, paramName, baseName, level) { var _a; if (level === void 0) { level = 0; } var paramType = param.type; var fieldName = paramName; var baseFieldType; var isList = false; if (!paramType) { throw new Error("Param '" + baseName + "." + paramName + "' in generateDataInputField() has no type"); } if (ListDataType_1.isListDataType(paramType)) { isList = true; paramType = paramType.getItemType(); } if (ObjectDataType_1.isObjectDataType(paramType)) { // eslint-disable-next-line @typescript-eslint/no-use-before-define baseFieldType = exports.generateNestedDataInput(baseName, paramType, paramName, level + 1); } else if (Entity_1.isEntity(paramType)) { var targetEntity = paramType; var primaryAttribute = targetEntity.getPrimaryAttribute(); baseFieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(primaryAttribute.type, baseName, true); } else if (param.i18n) { // const protocolConfiguration = ProtocolGraphQL.getProtocolConfiguration(); var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var languages_1 = protocolConfiguration .getParentConfiguration() .getLanguages(); param.gqlFieldNameI18n = protocolConfiguration.generateI18nFieldName(param); var i18nFieldTypeName = protocolConfiguration.generateOperationI18nAttributeInputTypeName({ name: baseName, }, { name: paramName, }, { name: level, }); var fieldType_1 = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(paramType, baseName, true); var i18nFieldType = new graphql_1.GraphQLInputObjectType({ name: i18nFieldTypeName, description: "**`" + baseName + "`** action translations input type for **`" + param.gqlFieldNameI18n + "`**", fields: function () { var i18nFields = {}; languages_1.map(function (language, langIdx) { var type = langIdx === 0 && param.required ? new graphql_1.GraphQLNonNull(fieldType_1) : fieldType_1; i18nFields[language] = { type: type, }; }); return i18nFields; }, }); baseFieldType = i18nFieldType; fieldName = param.gqlFieldNameI18n; } else { baseFieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(paramType, baseName, true); } var fieldType = isList ? new graphql_1.GraphQLList(baseFieldType) : baseFieldType; var field = { type: param.required && !param.defaultValue ? new graphql_1.GraphQLNonNull(fieldType) : fieldType, description: param.description, }; return _a = {}, _a[fieldName] = field, _a; }; var generateDataInputFields = function (inputParams, baseName, level) { if (level === void 0) { level = 0; } var fields = {}; _.forEach(inputParams, function (param, paramName) { var generated = generateDataInputField(param, paramName, baseName, level); Object.keys(generated).map(function (paramN) { fields[paramN] = generated[paramN]; }); }); return fields; }; //GraphQLInputObjectType | ? var generateDataInput = function (baseName, inputParams, singleParam) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); if (singleParam) { // eslint-disable-next-line no-use-before-define var generated = generateDataInputField(inputParams, inputParams.name || '', baseName); // eslint-disable-line no-use-before-define return Object.values(generated)[0]; } var dataInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateDataInputTypeName(baseName), description: "Mutation data input type for **`" + baseName + "`**", fields: function () { return generateDataInputFields(inputParams, baseName); // eslint-disable-line no-use-before-define }, }); dataInputType.getFields(); return dataInputType; }; exports.generateDataInput = generateDataInput; var generateNestedDataInput = function (baseName, nestedParam, nestedParamName, level) { if (level === void 0) { level = 1; } var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var dataInputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateNestedDataInputTypeName(baseName, nestedParamName, level), description: nestedParam.description, fields: function () { var inputParams = nestedParam.getAttributes(); // eslint-disable-next-line no-use-before-define return generateDataInputFields(inputParams, baseName + "-" + nestedParamName, level); // eslint-disable-line no-use-before-define }, }); return dataInputType; }; exports.generateNestedDataInput = generateNestedDataInput; var generateInput = function (baseName, dataInputType, isField, includeClientMutationId) { if (includeClientMutationId === void 0) { includeClientMutationId = false; } var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var inputType = new graphql_1.GraphQLInputObjectType({ name: protocolConfiguration.generateInputTypeName(baseName), description: "Mutation input type for **`" + baseName + "`**", fields: function () { var fields = {}; // const fields = {}; if (includeClientMutationId) { fields.clientMutationId = { type: graphql_1.GraphQLString, }; } if (dataInputType) { fields.data = isField ? dataInputType : { type: new graphql_1.GraphQLNonNull(dataInputType), }; } return fields; }, }); return inputType; }; exports.generateInput = generateInput; var wrapFieldInFieldName = function (fieldName, field) { var _a; return _a = {}, _a[fieldName] = field, _a; }; var generateDataOutputField = function (param, paramName, baseName, graphRegistry, level, returnAsFieldNameMap) { if (level === void 0) { level = 0; } if (returnAsFieldNameMap === void 0) { returnAsFieldNameMap = false; } var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var paramType = param.type; var baseFieldType; var isList = false; if (!paramType) { throw new Error("Param '" + baseName + "." + paramName + "' in generateDataOutputField() has no type"); } if (ListDataType_1.isListDataType(paramType)) { isList = true; paramType = paramType.getItemType(); } if (ObjectDataType_1.isObjectDataType(paramType)) { // eslint-disable-next-line @typescript-eslint/no-use-before-define baseFieldType = exports.generateNestedDataOutput(baseName, paramType, paramName, graphRegistry, level + 1); } else if (Entity_1.isEntity(paramType)) { if (!returnAsFieldNameMap) { throw new Error("Param '" + baseName + "." + paramName + "' in generateDataOutputField() needs to return multiple fields but returnAsFieldNameMap is set to false"); } var result = {}; var targetEntity = paramType; var targetTypeName = registry_1.getRegisteredEntity(targetEntity.name).typeName; var primaryAttribute = targetEntity.getPrimaryAttribute(); var simpleFieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(primaryAttribute.type, baseName, false); var simpleField = { description: param.description, type: simpleFieldType, }; if (isList) { var simpleFieldList = { type: new graphql_1.GraphQLList(simpleFieldType), }; result[paramName] = simpleFieldList; } else { result[paramName] = simpleField; } var referenceField_1 = { description: param.description, type: graphRegistry.types[targetTypeName].type, }; referenceField_1.resolve = resolver_1.resolveByFindOne(targetEntity, function (_a) { var source = _a.source; return source[paramName]; }); if (isList) { var referenceFieldList = { type: new graphql_1.GraphQLList(referenceField_1.type), resolve: function (source, args, context) { var referenceIds = source[paramName]; if (!util_1.isArray(referenceIds)) { return Promise.resolve(null); } return referenceIds.map(function (referenceId) { var _a; return referenceField_1.resolve((_a = {}, _a[paramName] = referenceId, _a), args, context); }); }, }; var referenceFieldListName = protocolConfiguration.generateReferenceFieldListName(targetEntity, { name: paramName, }); result[referenceFieldListName] = referenceFieldList; } else { var referenceFieldName = protocolConfiguration.generateReferenceFieldName(targetEntity, { name: paramName, }); result[referenceFieldName] = referenceField_1; } return result; } else { baseFieldType = ProtocolGraphQL_1.ProtocolGraphQL.convertToProtocolDataType(paramType, baseName, false); } var fieldType = isList ? new graphql_1.GraphQLList(baseFieldType) : baseFieldType; var field = { type: fieldType, description: param.description, }; if (param.resolve) { field.resolve = function (obj, args, context, info) { return param.resolve({ obj: obj, args: args, context: context, info: info }); }; } return returnAsFieldNameMap ? wrapFieldInFieldName(paramName, field) : field; }; var generateDataOutputFields = function (outputParams, baseName, graphRegistry, level) { if (level === void 0) { level = 0; } var fields = {}; _.forEach(outputParams, function (param, paramName) { fields = __assign(__assign({}, fields), generateDataOutputField(param, paramName, baseName, graphRegistry, level, true)); }); return fields; }; var generateDataOutput = function (baseName, outputParams, graphRegistry, singleParam) { var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); if (singleParam) { // eslint-disable-next-line no-use-before-define return generateDataOutputField(outputParams, outputParams.name || '', baseName, graphRegistry); // eslint-disable-line no-use-before-define } var actionDataOutputType = new graphql_1.GraphQLObjectType({ name: protocolConfiguration.generateDataOutPutTypeName(baseName), description: "Mutation data output type for **`" + baseName + "`**", fields: function () { return generateDataOutputFields(outputParams, baseName, graphRegistry); // eslint-disable-line no-use-before-define }, }); return actionDataOutputType; }; exports.generateDataOutput = generateDataOutput; var generateNestedDataOutput = function (baseName, nestedParam, nestedParamName, graphRegistry, level) { if (level === void 0) { level = 1; } var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var dataOutputType = new graphql_1.GraphQLObjectType({ name: protocolConfiguration.generateNestedDataOutPutTypeName(baseName, nestedParamName, level), description: nestedParam.description, fields: function () { var outputParams = nestedParam.getAttributes(); // eslint-disable-next-line no-use-before-define return generateDataOutputFields(outputParams, baseName + "-" + nestedParamName, graphRegistry, level); // eslint-disable-line no-use-before-define }, }); return dataOutputType; }; exports.generateNestedDataOutput = generateNestedDataOutput; var generateOutput = function (baseName, dataOutputType, isField, includeClientMutationId) { if (includeClientMutationId === void 0) { includeClientMutationId = false; } var protocolConfiguration = ProtocolGraphQL_1.ProtocolGraphQL.getProtocolConfiguration(); var outputType = new graphql_1.GraphQLObjectType({ name: protocolConfiguration.generateOutPutTypeName(baseName), description: "Mutation output type for **`" + baseName + "`**", fields: function () { var fields = {}; if (includeClientMutationId) { fields.clientMutationId = { type: graphql_1.GraphQLString, }; } if (dataOutputType) { fields.result = isField ? dataOutputType : { type: dataOutputType, }; } return fields; }, }); return outputType; }; exports.generateOutput = generateOutput;