UNPKG

@omnigraph/json-schema

Version:

This package generates GraphQL Schema from JSON Schema and sample JSON request and responses. You can define your root field endpoints like below in your GraphQL Config for example;

86 lines (85 loc) 3.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getUnionTypeComposers = exports.getContainerTC = void 0; const graphql_compose_1 = require("graphql-compose"); const directives_js_1 = require("./directives.js"); function getContainerTC(schemaComposer, output) { const containerTypeName = `${output.getTypeName()}_container`; return schemaComposer.getOrCreateOTC(containerTypeName, otc => otc.addFields({ [output.getTypeName()]: { type: output, resolve: root => root, }, })); } exports.getContainerTC = getContainerTC; function getUnionTypeComposers({ schemaComposer, typeComposersList, subSchemaAndTypeComposers, logger, }) { var _a; if (new Set(typeComposersList).size === 1) { return typeComposersList[0]; } const unionInputFields = {}; const outputTypeComposers = []; typeComposersList.forEach(typeComposers => { const { input, output } = typeComposers; if ((0, graphql_compose_1.isSomeInputTypeComposer)(output)) { outputTypeComposers.push(getContainerTC(schemaComposer, output)); } else { outputTypeComposers.push(output); } if (input) { unionInputFields[input.getTypeName()] = { type: input, }; } if (!input) { logger.debug(`No input type composer found for ${output.getTypeName()}, skipping...`); } }); if (Object.keys(unionInputFields).length === 1) { subSchemaAndTypeComposers.input = Object.values(unionInputFields)[0].type; } else { subSchemaAndTypeComposers.input.addFields(unionInputFields); } if (new Set(outputTypeComposers).size === 1) { subSchemaAndTypeComposers.output = outputTypeComposers[0]; } else { const directives = subSchemaAndTypeComposers.output.getDirectives() || []; const statusCodeOneOfIndexMap = subSchemaAndTypeComposers.output.getExtension('statusCodeOneOfIndexMap'); const statusCodeOneOfIndexMapEntries = Object.entries(statusCodeOneOfIndexMap || {}); for (const outputTypeComposerIndex in outputTypeComposers) { const outputTypeComposer = outputTypeComposers[outputTypeComposerIndex]; const statusCode = (_a = statusCodeOneOfIndexMapEntries.find(([statusCode, index]) => index.toString() === outputTypeComposerIndex.toString())) === null || _a === void 0 ? void 0 : _a[0]; if ('getFields' in outputTypeComposer) { if (statusCode != null) { schemaComposer.addDirective(directives_js_1.StatusCodeTypeNameDirective); directives.push({ name: 'statusCodeTypeName', args: { statusCode, typeName: outputTypeComposer.getTypeName(), }, }); } subSchemaAndTypeComposers.output.addType(outputTypeComposer); } else { for (const possibleType of outputTypeComposer.getTypes()) { subSchemaAndTypeComposers.output.addType(possibleType); } } } subSchemaAndTypeComposers.output.setDirectives(directives); } return { input: subSchemaAndTypeComposers.input, output: subSchemaAndTypeComposers.output, nullable: subSchemaAndTypeComposers.nullable, readOnly: subSchemaAndTypeComposers.readOnly, writeOnly: subSchemaAndTypeComposers.writeOnly, }; } exports.getUnionTypeComposers = getUnionTypeComposers;