@neo4j/graphql
Version:
A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations
163 lines • 7.29 kB
JavaScript
/*
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.graphqlArgsToCompose = graphqlArgsToCompose;
exports.graphqlDirectivesToCompose = graphqlDirectivesToCompose;
exports.attributeAdapterToComposeFields = attributeAdapterToComposeFields;
exports.concreteEntityToCreateInputFields = concreteEntityToCreateInputFields;
exports.concreteEntityToUpdateInputFields = concreteEntityToUpdateInputFields;
exports.withMathOperators = withMathOperators;
exports.withArrayOperators = withArrayOperators;
const graphql_1 = require("graphql");
const constants_1 = require("../constants");
const ArgumentAdapter_1 = require("../schema-model/argument/model-adapters/ArgumentAdapter");
const parse_value_node_1 = require("../schema-model/parser/parse-value-node");
const constants_2 = require("./constants");
const get_mutation_input_from_attribute_type_1 = require("./generation/get-mutation-input-from-attribute-type");
const utils_1 = require("./generation/utils");
const id_1 = require("./resolvers/field/id");
const numerical_1 = require("./resolvers/field/numerical");
function graphqlArgsToCompose(args) {
return args.reduce((res, arg) => {
const inputValueAdapter = new ArgumentAdapter_1.ArgumentAdapter(arg);
return {
...res,
[arg.name]: {
type: inputValueAdapter.getTypePrettyName(),
description: inputValueAdapter.description,
...(inputValueAdapter.defaultValue !== undefined
? { defaultValue: inputValueAdapter.defaultValue }
: {}),
},
};
}, {});
}
function graphqlDirectivesToCompose(directives) {
return directives.map((directive) => ({
args: (directive.arguments || [])?.reduce((r, d) => ({ ...r, [d.name.value]: (0, parse_value_node_1.parseValueNode)(d.value) }), {}),
name: directive.name.value,
}));
}
function attributeAdapterToComposeFields(objectFields, userDefinedFieldDirectives) {
const composeFields = {};
for (const field of objectFields) {
if (field.isReadable() === false) {
continue;
}
const newField = {
type: field.getTypePrettyName(),
args: {},
description: field.description,
};
const userDefinedDirectivesOnField = userDefinedFieldDirectives.get(field.name);
if (userDefinedDirectivesOnField) {
newField.directives = graphqlDirectivesToCompose(userDefinedDirectivesOnField);
}
if (field.typeHelper.isInt() || field.typeHelper.isFloat()) {
newField.resolve = numerical_1.numericalResolver;
}
if (field.typeHelper.isID()) {
newField.resolve = id_1.idResolver;
}
if (field.args) {
newField.args = graphqlArgsToCompose(field.args);
}
composeFields[field.name] = newField;
}
return composeFields;
}
function concreteEntityToCreateInputFields(objectFields, userDefinedFieldDirectives) {
const createInputFields = {};
for (const field of objectFields) {
const newInputField = {
type: field.getInputTypeNames().create.pretty,
defaultValue: field.getDefaultValue(),
directives: [],
};
const userDefinedDirectivesOnField = userDefinedFieldDirectives.get(field.name);
if (userDefinedDirectivesOnField) {
newInputField.directives = graphqlDirectivesToCompose(userDefinedDirectivesOnField.filter((directive) => directive.name.value === constants_1.DEPRECATED));
}
createInputFields[field.name] = newInputField;
}
return createInputFields;
}
function concreteEntityToUpdateInputFields({ objectFields, userDefinedFieldDirectives, additionalFieldsCallbacks = [], features, }) {
let updateInputFields = {};
for (const field of objectFields) {
const newInputField = {
type: field.getInputTypeNames().update.pretty,
directives: [(0, constants_2.DEPRECATE_SET_MUTATION)(field.name)],
};
const userDefinedDirectivesOnField = userDefinedFieldDirectives.get(field.name);
let userDefinedDirectives = [];
if (userDefinedDirectivesOnField) {
userDefinedDirectives = graphqlDirectivesToCompose(userDefinedDirectivesOnField.filter((directive) => directive.name.value === constants_1.DEPRECATED));
newInputField.directives = userDefinedDirectives;
}
updateInputFields[field.name] = {
type: (0, get_mutation_input_from_attribute_type_1.getMutationInputFromAttributeType)(field),
directives: userDefinedDirectives,
};
if ((0, utils_1.shouldAddDeprecatedFields)(features, "mutationOperations")) {
updateInputFields[`${field.name}_SET`] = newInputField;
}
for (const cb of additionalFieldsCallbacks) {
const additionalFields = cb(field, newInputField);
updateInputFields = { ...updateInputFields, ...additionalFields };
}
}
return updateInputFields;
}
function withMathOperators() {
return (attribute, fieldDefinition) => {
const fields = {};
if (attribute.mathModel) {
for (const operation of attribute.mathModel.getMathOperations()) {
const newFieldDefinition = typeof fieldDefinition === "string" ? { type: fieldDefinition } : { ...fieldDefinition };
const operationNameUpperCase = operation.split("_")[1];
if (!operationNameUpperCase) {
throw new Error(`Invalid operation: ${operation}`);
}
const newOperationName = operationNameUpperCase.toLowerCase();
newFieldDefinition.directives = [(0, constants_2.DEPRECATE_MATH_MUTATIONS)(attribute.name, newOperationName)];
fields[operation] = newFieldDefinition;
}
}
return fields;
};
}
function withArrayOperators() {
return (attribute) => {
const fields = {};
if (attribute.listModel) {
fields[attribute.listModel.getPop()] = {
type: graphql_1.GraphQLInt,
directives: [(0, constants_2.DEPRECATE_ARRAY_MUTATIONS)(attribute.name, "pop")],
};
fields[attribute.listModel.getPush()] = {
type: attribute.getInputTypeNames().update.pretty,
directives: [(0, constants_2.DEPRECATE_ARRAY_MUTATIONS)(attribute.name, "push")],
};
}
return fields;
};
}
//# sourceMappingURL=to-compose.js.map
;