UNPKG

@neo4j/graphql

Version:

A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations

163 lines 7.29 kB
"use strict"; /* * 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