gwy-exam/client/scripts/generate-api.mjs
2026-08-31 16:50:38 +08:00

48 lines
1.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()