graphql-2-json-schema
Version:
`graphql-2-json-schema` package
135 lines (134 loc) • 5.44 kB
JavaScript
;
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;