48 lines
1.7 KiB
JavaScript
48 lines
1.7 KiB
JavaScript
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()
|