UNPKG

@neo4j/graphql

Version:

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

200 lines 7.7 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.withCreateInputType = withCreateInputType; exports.augmentCreateInputTypeWithRelationshipsInput = augmentCreateInputTypeWithRelationshipsInput; exports.withFieldInputType = withFieldInputType; const ConcreteEntityAdapter_1 = require("../../schema-model/entity/model-adapters/ConcreteEntityAdapter"); const InterfaceEntityAdapter_1 = require("../../schema-model/entity/model-adapters/InterfaceEntityAdapter"); const UnionEntityAdapter_1 = require("../../schema-model/entity/model-adapters/UnionEntityAdapter"); const RelationshipAdapter_1 = require("../../schema-model/relationship/model-adapters/RelationshipAdapter"); const to_compose_1 = require("../to-compose"); const connect_input_1 = require("./connect-input"); const relation_input_1 = require("./relation-input"); function withCreateInputType({ entityAdapter, userDefinedFieldDirectives, composer, }) { if (composer.has(entityAdapter.operations.createInputTypeName)) { return composer.getITC(entityAdapter.operations.createInputTypeName); } const createInputType = composer.createInputTC({ name: entityAdapter.operations.createInputTypeName, fields: {}, }); if (entityAdapter instanceof ConcreteEntityAdapter_1.ConcreteEntityAdapter || entityAdapter instanceof RelationshipAdapter_1.RelationshipAdapter) { createInputType.addFields((0, to_compose_1.concreteEntityToCreateInputFields)(entityAdapter.createInputFields, userDefinedFieldDirectives)); } else { createInputType.addFields(makeCreateInputFields(entityAdapter)); } // ensureNonEmptyInput(composer, createInputType); - not for relationshipAdapter return createInputType; } function makeCreateInputFields(wrapperEntity) { const wrappedEntities = wrapperEntity instanceof InterfaceEntityAdapter_1.InterfaceEntityAdapter ? wrapperEntity.concreteEntities : wrapperEntity.relationshipImplementations; const fields = {}; for (const entityAdapter of wrappedEntities) { fields[entityAdapter.name] = { type: entityAdapter.operations.createInputTypeName, }; } return fields; } function augmentCreateInputTypeWithRelationshipsInput({ relationshipAdapter, composer, userDefinedFieldDirectives, deprecatedDirectives, features, }) { if (!relationshipAdapter.isCreatable()) { return; } if (relationshipAdapter.source instanceof InterfaceEntityAdapter_1.InterfaceEntityAdapter) { // Interface CreateInput does not require relationship input fields // These are specified on the concrete nodes. return; } const relationshipsInput = makeRelationshipsInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }); if (!relationshipsInput) { return; } const createInput = withCreateInputType({ entityAdapter: relationshipAdapter.source, userDefinedFieldDirectives, composer, }); if (!createInput) { return; } createInput.addFields({ [relationshipAdapter.name]: { type: relationshipsInput, directives: deprecatedDirectives, }, }); } function makeRelationshipsInputType({ relationshipAdapter, composer, userDefinedFieldDirectives, deprecatedDirectives, features, }) { if (relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter) { return withUnionCreateInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }); } else { return withFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives }); } } function withUnionCreateInputType({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }) { const typeName = relationshipAdapter.operations.unionCreateInputTypeName; if (composer.has(typeName)) { return composer.getITC(typeName); } const fields = makeUnionCreateInputTypeFields({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, features, }); if (!Object.keys(fields).length) { return; } const createInput = composer.createInputTC({ name: typeName, fields, }); return createInput; } function makeUnionCreateInputTypeFields({ relationshipAdapter, composer, deprecatedDirectives, userDefinedFieldDirectives, }) { const fields = {}; if (!(relationshipAdapter.target instanceof UnionEntityAdapter_1.UnionEntityAdapter)) { throw new Error("Expected union target"); } for (const memberEntity of relationshipAdapter.target.concreteEntities) { const fieldInput = withFieldInputType({ relationshipAdapter, ifUnionMemberEntity: memberEntity, composer, userDefinedFieldDirectives, }); if (fieldInput) { fields[memberEntity.name] = { type: fieldInput, directives: deprecatedDirectives, }; } } return fields; } function withFieldInputType({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, }) { const typeName = relationshipAdapter.operations.getFieldInputTypeName(ifUnionMemberEntity); if (composer.has(typeName)) { return composer.getITC(typeName); } if (!relationshipAdapter.shouldGenerateFieldInputType()) { return; } const fields = makeFieldInputTypeFields({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, }); if (!Object.keys(fields).length) { return; } const fieldInput = composer.createInputTC({ name: typeName, fields, }); return fieldInput; } function makeFieldInputTypeFields({ relationshipAdapter, composer, userDefinedFieldDirectives, ifUnionMemberEntity, }) { const fields = {}; const connectFieldInputType = (0, connect_input_1.withConnectFieldInputType)({ relationshipAdapter, ifUnionMemberEntity, composer, }); if (connectFieldInputType) { fields["connect"] = { type: relationshipAdapter.isList ? connectFieldInputType.NonNull.List : connectFieldInputType, directives: [], }; } const createFieldInputType = (0, relation_input_1.withCreateFieldInputType)({ relationshipAdapter, ifUnionMemberEntity, composer, userDefinedFieldDirectives, }); if (createFieldInputType) { fields["create"] = { type: relationshipAdapter.isList ? createFieldInputType.NonNull.List : createFieldInputType, directives: [], }; } return fields; } //# sourceMappingURL=create-input.js.map