import path from 'node:path' import fs from 'node:fs' import { buildExpressRouter, loadRoutesFromProject } from "++/libs/router" import { getCustomExpress } from '++/libs/custom' export async function dumpRoutes() { const requiredRoutes = await loadRoutesFromProject() if (requiredRoutes.errorID !== undefined) { console.log(requiredRoutes) process.exit(1) } const { router } = await getCustomExpress() const buildedRouter = await buildExpressRouter(requiredRoutes, router) if (buildedRouter.errorID !== undefined) { console.log(buildedRouter) process.exit(1) } const dumpedRoutes: SwaggerGen.Route[] = [] const regex = /:(.*?)\??\//g for (const r of buildedRouter.routes) { if (r.swaggerHide) { continue } r.path = path.normalize(`${r.path ?? '/'}/`).replace(/\\/g, '/') const dumpedRouteParams: SwaggerGen.RouteParameter[] = [] const urlParms = r.path.match(regex) ?? [] for (const p of urlParms) { dumpedRouteParams.push({ name: p.replace(regex, '$1'), required: p[p.length - 2] !== '?', in: 'path', type: 'string' }) } dumpedRoutes.push({ httpRoute: r.path.replace(regex, '{$1}/'), method: r.method, params: dumpedRouteParams, }) } return dumpedRoutes } export async function toProjectSwagger(file: string, content: any): Promise { try { const p = path.resolve(Plata.ProjectDir, 'swagger', file) if (!fs.existsSync(p)) { fs.mkdirSync(path.dirname(p), { recursive: true }) fs.writeFileSync(p, JSON.stringify(content, null, 4)) } } catch (e) { console.log(e) process.exit(1) } } export const main = async () => { const routes = await dumpRoutes() const templateFolder = path.join(Plata.PlataDir, 'templates', 'swagger-cli') const files: SwaggerGen.Files = { swaggerHeader: require(path.join(templateFolder, 'header.json')), route: { header: require(path.join(templateFolder, 'route', 'header.json')), body: require(path.join(templateFolder, 'route', 'body.json')), response: require(path.join(templateFolder, 'route', 'response.json')), } } for (const route of routes) { // https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy const fileCopy:SwaggerGen.Files = JSON.parse(JSON.stringify(files)) for(const json in fileCopy.route) { await toProjectSwagger( path.join('routes', route.httpRoute, route.method.toLowerCase(), `${json}.json`), fileCopy.route[json] ) } } await toProjectSwagger( 'header.json', files.swaggerHeader ) console.log('Done') process.exit(0) }