import openapiTS, { astToString } from 'openapi-typescript' import { writeFile, mkdir } from 'node:fs/promises' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' const __dirname = dirname(fileURLToPath(import.meta.url)) const output = join(__dirname, '..', 'src', 'api', 'generated', 'schema.d.ts') // 接口契约唯一来源:后端运行时提供的 OpenAPI 文档端点。 // 生成前需先启动后端(pnpm dev:server)。 const openapiUrl = process.env.OPENAPI_URL ?? 'http://localhost:3000/api/openapi.json' const HEADER = `// 本文件由 openapi-typescript 自动生成,请勿手工修改。 // 重新生成:pnpm --filter @gwy/client api:generate(需后端服务运行中) // 来源:${openapiUrl} ` async function main() { let spec try { const res = await fetch(openapiUrl) if (!res.ok) { console.error(`[api:generate] 获取 OpenAPI 文档失败:HTTP ${res.status} ${openapiUrl}`) console.error('请确认后端服务已启动(pnpm dev:server)。') process.exit(1) } spec = await res.json() } catch (err) { console.error(`[api:generate] 无法获取 OpenAPI 文档:${openapiUrl}`) console.error(err instanceof Error ? err.message : err) console.error('请确认后端服务已启动(pnpm dev:server)。') process.exit(1) } try { const nodes = await openapiTS(spec, {}) const ast = astToString(nodes) await mkdir(dirname(output), { recursive: true }) await writeFile(output, HEADER + ast, 'utf8') console.log(`[api:generate] 已生成 ${output}(来源:${openapiUrl})`) } catch (err) { console.error('[api:generate] 类型生成失败:', err instanceof Error ? err.message : err) process.exit(1) } } await main()