회사에서 하반기에 어드민용 신규 레포를 생성하게 되면서 그동안 도입해보고팠으나 레거시 코드베이스의 압박으로 시도해보지 못 했던 🥲 이런저런 기술들을 신규 레포에서 선 적용해보기로 했습니다. 그리고 그 중 하나가 Swagger 문서로 API 타입 정의 자동화
하는 태스크였습니다.
why swagger-typescript-api ? 굳이 open api 타입 전부 지원할 필요 없기에 우리 스택(문서:swagger REST api & 스키마 : typescript 조합)에 딱 맞아서 커스터마이징의 수고가 적은 라이브러리로 정했다. 버그 업데이트도 부지런히 하고 있는 것 같아서 라이브러리 자체에 대한 불만은 크게 없다.
기존에 swagger 문서화 자체가 많이 되어있지 않았음.
문서화가 덜(ㅠㅠ)된 채로 타입을 생성해내다보니 결과물도 구멍이 많아서 예상한 것 만큼
(코드 복붙을 원한다면 글 가장 아래에 스니펫 추가해뒀습니당. raw 코드는 가독성이 안 좋아서 캡쳐로 보여드립니다!)
node genApi.node.js 스크립트로 추가해서 사용중
const { generateApi } = require('swagger-typescript-api')
const path = require('path')
const fs = require('fs')
generateApi({
url: 'apidoc의 url',
httpClientType: 'axios',
generateClient: true,
generateRouteTypes: false,
generateResponses: true,
toJS: false,
extractRequestBody: true,
defaultResponseType: 'any',
enumNamesAsValues: true,
modular: true,
hooks: {
onParseSchema: (originalSchema, parsedSchema) => {
if (originalSchema.type === 'json') {
parsedSchema.content = 'JSON'
}
return parsedSchema
},
},
})
.then(({ files, configuration }) => {
files.forEach(({ content, name }) => {
const fileContent = name === 'http-client.ts' ? `// @ts-nocheck \n${content}` : content
fs.writeFile(`${path.resolve()}/src/apis/generated/${name}`, fileContent, (err, result) => {
if (err) console.log('error', err)
else {
console.log(`✅ ${name} generated!`)
}
})
})
})
.catch((e) => console.error(e))
저는 OpenAPI Generator 와 swagger-typescript-api 사이에서 어떠한 도구를 선택할지 고민중인데요!
swagger-typescript-api 잘 쓰고계신지 근황이 궁금하네용.. ㅎㅎ 🤤