shyft
Version:
Model driven GraphQL API framework
345 lines (344 loc) • 15.5 kB
JavaScript
;
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;