UNPKG

@quinck/fastify-openapi-typescript-generator

Version:

Contains utilities to generate fastify types from openapi definition for the fastify framework.

58 lines (53 loc) 2.31 kB
import fs from 'fs'; import path from 'path'; import { disableLinter, fastifyRouteOptionsImports } from '../utils/consts.js'; import { mkdirIfNotExists } from '../utils/fs.js'; import { Parser } from './fastify-openapi-glue/Parser.js'; import { allowedProperties, commonTypesFileName, configsFolder, } from './generate-routes-options.consts.js'; const { writeFile } = fs.promises; export const fastifyOpenapiGlue = ({ openapi, outputDirectory, }) => { const generateRoutesOptions = async (operationIds) => { await mkdirIfNotExists(outputDirectory); const configsPath = path.join(outputDirectory, configsFolder); await mkdirIfNotExists(configsPath); const parser = new Parser(); const config = await parser.parse(openapi); let parsedRoutes = config.routes; if (operationIds && operationIds.length > 0) parsedRoutes = parsedRoutes.filter(item => operationIds.includes(item.operationId)); const routes = parsedRoutes.map((item) => { const routeCfg = { method: item.method, url: item.url, schema: parseSchema(item.schema), config: item.config, }; const routesString = JSON.stringify(routeCfg, null, 2); const fileContent = `${disableLinter} import { GenericRouteOptions } from '../${commonTypesFileName}' export const ${item.operationId}RouteConfig: GenericRouteOptions = ${routesString} `; return writeFile(path.join(configsPath, `${item.operationId}.ts`), fileContent); }); await Promise.all(routes); await writeFile(path.join(outputDirectory, `${commonTypesFileName}.ts`), `${disableLinter} ${fastifyRouteOptionsImports} `); await writeFile(path.join(outputDirectory, 'index.ts'), getIndexFileContent(parsedRoutes)); }; return { generateRoutesOptions }; }; const getIndexFileContent = (routes) => { const routesExports = routes .map(item => `export * from './${path.join(configsFolder, item.operationId)}'`) .join('\n'); return `${disableLinter} ${routesExports} `; }; const parseSchema = (schema) => allowedProperties.reduce((acc, prop) => { if (prop in schema) acc[prop] = schema[prop]; return acc; }, {});