@grace-js/grace
Version:
An opinionated API framework
84 lines • 3.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.graceToOpenAPISpec = void 0;
const zod_to_json_schema_1 = require("zod-to-json-schema");
const zod_1 = require("zod");
function zodSchemaToOpenAPISchemaObject(zodSchema) {
const jsonSchema = (0, zod_to_json_schema_1.zodToJsonSchema)(zodSchema, 'mySchema');
return jsonSchema.definitions.mySchema;
}
function graceToOpenAPISpec(grace) {
const paths = {};
grace.routes.forEach((route) => {
const path = route.path || '/';
const method = route.method?.toLowerCase();
const responses = {};
Object.entries(route.schema?.response || {}).forEach(([statusCode, schema]) => {
if (schema instanceof zod_1.ZodSchema) {
const content = {
schema: zodSchemaToOpenAPISchemaObject(schema),
};
responses[statusCode] = {
description: (schema instanceof zod_1.ZodObject ? schema.shape.description : undefined) || '',
content: {
'application/json': content,
},
};
}
});
const parameters = [];
if (route.schema?.params && route.schema.params instanceof zod_1.ZodObject) {
Object.keys(route.schema.params.shape).forEach((paramName) => {
if (!(route.schema?.params && route.schema.params instanceof zod_1.ZodObject)) {
return;
}
parameters.push({
name: paramName,
in: 'path',
required: true,
schema: zodSchemaToOpenAPISchemaObject(route.schema?.params.shape[paramName]),
});
});
}
if (route.schema?.query && route.schema.query instanceof zod_1.ZodObject) {
Object.keys(route.schema.query.shape).forEach((queryName) => {
if (!(route.schema?.query && route.schema.query instanceof zod_1.ZodObject)) {
return;
}
parameters.push({
name: queryName,
in: 'query',
required: false,
schema: zodSchemaToOpenAPISchemaObject(route.schema?.query.shape[queryName]),
});
});
}
const requestBody = route.schema?.body
? {
content: {
'application/json': {
schema: zodSchemaToOpenAPISchemaObject(route.schema.body),
},
},
}
: undefined;
if (!paths[path]) {
paths[path] = {};
}
paths[path][method] = {
responses,
parameters,
requestBody,
};
});
return {
openapi: '3.0.0',
info: {
title: 'Generated API',
version: '1.0.0',
},
paths,
};
}
exports.graceToOpenAPISpec = graceToOpenAPISpec;
//# sourceMappingURL=openapi.js.map