sofa-api
Version:
Create REST APIs with GraphQL
72 lines (71 loc) • 2.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSchemaObjectFromType = buildSchemaObjectFromType;
exports.resolveFieldType = resolveFieldType;
const graphql_1 = require("graphql");
const utils_js_1 = require("./utils.js");
function buildSchemaObjectFromType(type, opts) {
const required = [];
const properties = {};
const fields = type.getFields();
for (const fieldName in fields) {
const field = fields[fieldName];
if ((0, graphql_1.isNonNullType)(field.type)) {
required.push(field.name);
}
properties[fieldName] = resolveField(field, opts);
if (field.description) {
properties[fieldName].description = field.description;
}
}
return {
type: 'object',
...(required.length ? { required } : {}),
properties,
...(type.description ? { description: type.description } : {}),
};
}
function resolveField(field, opts) {
return resolveFieldType(field.type, opts);
}
// array -> [type]
// type -> $ref
// scalar -> swagger primitive
function resolveFieldType(type, opts) {
if ((0, graphql_1.isNonNullType)(type)) {
return resolveFieldType(type.ofType, opts);
}
if ((0, graphql_1.isListType)(type)) {
return {
type: 'array',
items: resolveFieldType(type.ofType, opts),
};
}
if ((0, graphql_1.isObjectType)(type)) {
return {
$ref: (0, utils_js_1.mapToRef)(type.name),
};
}
if ((0, graphql_1.isScalarType)(type)) {
const resolved = (0, utils_js_1.mapToPrimitive)(type.name) ||
opts.customScalars[type.name] ||
type.extensions?.jsonSchema || {
type: 'object',
};
return { ...resolved };
}
if ((0, graphql_1.isEnumType)(type)) {
return {
type: 'string',
enum: type.getValues().map((value) => value.name),
};
}
if ((0, graphql_1.isUnionType)(type)) {
return {
oneOf: type.getTypes().map((type) => resolveFieldType(type, opts)),
};
}
return {
type: 'object',
};
}