UNPKG

graphql-2-json-schema

Version:
135 lines (134 loc) 5.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.introspectionTypeReducer = exports.resolveDefaultValue = exports.introspectionFieldReducerGenerator = exports.getRequiredFields = void 0; const json5_1 = __importDefault(require("json5")); const lodash_1 = require("lodash"); const typeGuards_1 = require("./typeGuards"); const typesMapping_1 = require("./typesMapping"); const getRequiredFields = (fields) => lodash_1.reduce(fields, (acc, f) => { if (typeGuards_1.isNonNullIntrospectionType(f.type)) { acc.push(f.name); } return acc; }, []); exports.getRequiredFields = getRequiredFields; const introspectionFieldReducerGenerator = (options) => { const introspectionFieldReducer = (acc, curr) => { if (typeGuards_1.isIntrospectionField(curr)) { const returnType = typeGuards_1.isNonNullIntrospectionType(curr.type) ? typesMapping_1.graphqlToJSONType(curr.type.ofType, options) : typesMapping_1.graphqlToJSONType(curr.type, options); acc[curr.name] = { type: 'object', properties: { return: returnType, arguments: { type: 'object', properties: lodash_1.reduce(curr.args, introspectionFieldReducer, {}), required: exports.getRequiredFields(curr.args), }, }, required: [], }; } else if (typeGuards_1.isIntrospectionInputValue(curr)) { const returnType = typeGuards_1.isNonNullIntrospectionType(curr.type) ? typesMapping_1.graphqlToJSONType(curr.type.ofType, options) : typesMapping_1.graphqlToJSONType(curr.type, options); if (curr.defaultValue) { returnType.default = exports.resolveDefaultValue(curr); } acc[curr.name] = returnType; } acc[curr.name].description = curr.description || undefined; return acc; }; return introspectionFieldReducer; }; exports.introspectionFieldReducerGenerator = introspectionFieldReducerGenerator; const resolveDefaultValue = (curr) => { let type = curr.type; let isList = false; while (true) { if (typeGuards_1.isIntrospectionListTypeRef(type)) { isList = true; type = type.ofType; } else if (typeGuards_1.isNonNullIntrospectionType(type)) { type = type.ofType; } else { break; } } if (typeof curr.defaultValue === 'string' && !typeGuards_1.isIntrospectionEnumType(type)) { return json5_1.default.parse(curr.defaultValue); } if (!isList || !curr.defaultValue || typeof curr.defaultValue !== 'string') { return curr.defaultValue; } return curr.defaultValue .substr(1, curr.defaultValue.length - 2) .split(',') .map((val) => val.trim()); }; exports.resolveDefaultValue = resolveDefaultValue; const introspectionTypeReducer = (type, options) => (acc, curr) => { const isQueriesOrMutations = type === 'properties'; if (typeGuards_1.isIntrospectionObjectType(curr)) { acc[curr.name] = { type: 'object', properties: lodash_1.reduce(curr.fields, exports.introspectionFieldReducerGenerator(options), {}), required: isQueriesOrMutations ? [] : exports.getRequiredFields(curr.fields), }; } else if (typeGuards_1.isIntrospectionInputObjectType(curr)) { acc[curr.name] = { type: 'object', properties: lodash_1.reduce(curr.inputFields, exports.introspectionFieldReducerGenerator(options), {}), required: exports.getRequiredFields(curr.inputFields), }; } else if (typeGuards_1.isIntrospectionInterfaceType(curr)) { acc[curr.name] = { type: 'object', properties: lodash_1.reduce(curr.fields, exports.introspectionFieldReducerGenerator(options), {}), required: type === 'definitions' ? exports.getRequiredFields(curr.fields) : [], }; } else if (typeGuards_1.isIntrospectionUnionType(curr)) { acc[curr.name] = { oneOf: curr.possibleTypes.map((type) => typesMapping_1.graphqlToJSONType(type, options)), }; } else if (typeGuards_1.isIntrospectionEnumType(curr)) { acc[curr.name] = { type: 'string', anyOf: curr.enumValues.map((item) => { return { enum: [item.name], title: item.description || item.name, description: item.description || undefined, }; }), }; } else if (typeGuards_1.isIntrospectionDefaultScalarType(curr)) { acc[curr.name] = { type: typesMapping_1.typesMapping[curr.name], title: curr.name, }; } else if (typeGuards_1.isIntrospectionScalarType(curr)) { acc[curr.name] = { type: 'object', title: curr.name, }; } acc[curr.name].description = curr.description || undefined; return acc; }; exports.introspectionTypeReducer = introspectionTypeReducer;