shyft
Version:
Model driven GraphQL API framework
205 lines (204 loc) • 10.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processEntityMutations = exports.isMutation = exports.Mutation = exports.defaultEntityMutations = exports.mutationTypes = exports.MUTATION_TYPE_DELETE = exports.MUTATION_TYPE_UPDATE = exports.MUTATION_TYPE_CREATE = void 0;
var lodash_1 = require("lodash");
var util_1 = require("../util");
exports.MUTATION_TYPE_CREATE = 'create';
exports.MUTATION_TYPE_UPDATE = 'update';
exports.MUTATION_TYPE_DELETE = 'delete';
exports.mutationTypes = [
exports.MUTATION_TYPE_CREATE,
exports.MUTATION_TYPE_UPDATE,
exports.MUTATION_TYPE_DELETE,
];
exports.defaultEntityMutations = [
{
name: 'create',
type: exports.MUTATION_TYPE_CREATE,
description: function (typeName) { return "Create a new **`" + typeName + "`**"; },
hasAttributes: true,
},
{
name: 'update',
type: exports.MUTATION_TYPE_UPDATE,
description: function (typeName) {
return "Update a single **`" + typeName + "`** using its node ID and a data patch";
},
hasAttributes: true,
},
{
name: 'delete',
description: function (typeName) {
return "Delete a single **`" + typeName + "`** using its node ID";
},
type: exports.MUTATION_TYPE_DELETE,
},
];
var Mutation = /** @class */ (function () {
function Mutation(setup) {
var _this = this;
if (setup === void 0) { setup = {}; }
var name = setup.name, type = setup.type, description = setup.description, attributes = setup.attributes, preProcessor = setup.preProcessor, postProcessor = setup.postProcessor, fromState = setup.fromState, toState = setup.toState;
util_1.passOrThrow(name, function () { return 'Missing mutation name'; });
util_1.passOrThrow(type, function () { return "Missing type for mutation '" + name + "'"; });
util_1.passOrThrow(exports.mutationTypes.indexOf(type) >= 0, function () {
return "Unknown mutation type '" + type + "' used, try one of these: '" + exports.mutationTypes.join(', ') + "'";
});
util_1.passOrThrow(description, function () { return "Missing description for mutation '" + name + "'"; });
this.name = name;
this.type = type;
this.description = description;
if (this.type === exports.MUTATION_TYPE_CREATE ||
this.type === exports.MUTATION_TYPE_UPDATE) {
this.attributes = attributes;
}
if (this.type === exports.MUTATION_TYPE_CREATE) {
this.isTypeCreate = true;
}
if (this.type === exports.MUTATION_TYPE_UPDATE) {
this.needsInstance = true;
this.ignoreRequired = true;
this.isTypeUpdate = true;
}
if (this.type === exports.MUTATION_TYPE_DELETE) {
this.needsInstance = true;
this.isTypeDelete = true;
}
if (preProcessor) {
util_1.passOrThrow(util_1.isFunction(preProcessor), function () { return "preProcessor of mutation '" + name + "' needs to be a valid function"; });
this.preProcessor = preProcessor;
}
if (postProcessor) {
util_1.passOrThrow(util_1.isFunction(postProcessor), function () {
return "postProcessor of mutation '" + name + "' needs to be a valid function";
});
this.postProcessor = postProcessor;
}
if (fromState) {
util_1.passOrThrow(this.type !== exports.MUTATION_TYPE_CREATE, function () {
return "Mutation '" + _this.name + "' cannot define fromState as it is a 'create' type mutation";
});
util_1.passOrThrow(typeof fromState === 'string' || util_1.isArray(fromState), function () {
return "fromState in mutation '" + name + "' needs to be the name of a state or a list of state names as a precondition to the mutation";
});
if (this.type !== exports.MUTATION_TYPE_DELETE) {
util_1.passOrThrow(toState, function () {
return "Mutation '" + _this.name + "' has a fromState defined but misses a toState definition";
});
}
this.fromState = fromState;
}
if (toState) {
util_1.passOrThrow(this.type !== exports.MUTATION_TYPE_DELETE, function () {
return "Mutation '" + _this.name + "' cannot define toState as it is a 'delete' type mutation";
});
util_1.passOrThrow(typeof toState === 'string' || util_1.isArray(toState), function () {
return "toState in mutation '" + _this.name + "' needs to be the name of a state or a list of state names the mutation can transition to";
});
if (this.type !== exports.MUTATION_TYPE_CREATE) {
util_1.passOrThrow(fromState, function () {
return "Mutation '" + _this.name + "' has a toState defined but misses a fromState definition";
});
}
this.toState = toState;
}
}
Mutation.prototype.toString = function () {
return this.name;
};
return Mutation;
}());
exports.Mutation = Mutation;
var isMutation = function (obj) {
return obj instanceof Mutation;
};
exports.isMutation = isMutation;
var processEntityMutations = function (entity, mutations) {
util_1.passOrThrow(util_1.isArray(mutations), function () {
return "Entity '" + entity.name + "' mutations definition needs to be an array of mutations";
});
mutations.map(function (mutation, idx) {
util_1.passOrThrow(exports.isMutation(mutation), function () {
return "Invalid mutation definition for entity '" + entity.name + "' at position '" + idx + "'";
});
});
var entityAttributes = entity.getAttributes();
var entityStates = entity.getStates();
var requiredAttributeNames = [];
util_1.mapOverProperties(entityAttributes, function (attribute, attributeName) {
if (!attribute.isSystemAttribute) {
if (attribute.required && !attribute.defaultValue) {
requiredAttributeNames.push(attributeName);
}
}
});
var mutationNames = [];
mutations.map(function (mutation) {
util_1.passOrThrow(!mutationNames.includes(mutation.name), function () {
return "Duplicate mutation name '" + mutation.name + "' found in '" + entity.name + "'";
});
mutationNames.push(mutation.name);
if (mutation.attributes) {
util_1.passOrThrow((util_1.isArray(mutation.attributes, true) &&
mutation.type === exports.MUTATION_TYPE_CREATE) ||
util_1.isArray(mutation.attributes, false), function () {
return "Mutation '" + entity.name + "." + mutation.name + "' needs to have a list of attributes";
});
mutation.attributes.map(function (attribute) {
util_1.passOrThrow(typeof attribute === 'string', function () {
return "Mutation '" + entity.name + "." + mutation.name + "' needs to have a list of attribute names";
});
});
util_1.passOrThrow(mutation.attributes.length === lodash_1.uniq(mutation.attributes).length, function () {
return "Mutation '" + entity.name + "." + mutation.name + "' needs to have a list of unique attribute names";
});
mutation.attributes.map(function (attributeName) {
util_1.passOrThrow(entityAttributes[attributeName], function () {
return "Cannot use attribute '" + entity.name + "." + attributeName + "' in mutation '" + entity.name + "." + mutation.name + "' as it does not exist";
});
});
if (mutation.type === exports.MUTATION_TYPE_CREATE) {
var missingAttributeNames_1 = requiredAttributeNames.filter(function (requiredAttributeName) {
return !mutation.attributes.includes(requiredAttributeName);
});
util_1.passOrThrow(missingAttributeNames_1.length === 0, function () {
return "Missing required attributes in mutation '" + entity.name + "." + mutation.name + "' need to have a defaultValue() function: [ " + missingAttributeNames_1.join(', ') + " ]";
});
}
}
else if (mutation.type === exports.MUTATION_TYPE_CREATE ||
mutation.type === exports.MUTATION_TYPE_UPDATE) {
var nonSystemAttributeNames_1 = [];
util_1.mapOverProperties(entityAttributes, function (attribute, attributeName) {
if (!attribute.isSystemAttribute) {
nonSystemAttributeNames_1.push(attributeName);
}
});
mutation.attributes = nonSystemAttributeNames_1;
}
var checkMutationStates = function (stateStringOrArray) {
var stateNames = util_1.isArray(stateStringOrArray)
? stateStringOrArray
: [stateStringOrArray];
stateNames.map(function (stateName) {
util_1.passOrThrow(entityStates[stateName], function () {
return "Unknown state '" + stateName + "' used in mutation '" + entity.name + "." + mutation.name + "'";
});
});
};
if (mutation.fromState) {
util_1.passOrThrow(entity.hasStates(), function () {
return "Mutation '" + entity.name + "." + mutation.name + "' cannot define fromState as the entity is stateless";
});
checkMutationStates(mutation.fromState);
}
if (mutation.toState) {
util_1.passOrThrow(entity.hasStates(), function () {
return "Mutation '" + entity.name + "." + mutation.name + "' cannot define toState as the entity is stateless";
});
checkMutationStates(mutation.toState);
}
});
return mutations;
};
exports.processEntityMutations = processEntityMutations;