UNPKG

@grace-js/grace

Version:

An opinionated API framework

84 lines 3.12 kB
"use strict"; 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