This commit is contained in:
john 2025-05-03 20:18:13 +02:00
parent e84cf232a5
commit 5595d0ace0
3 changed files with 156 additions and 0 deletions

7
.prettierrc Normal file
View file

@ -0,0 +1,7 @@
{
"semi": false,
"singleQuote": true,
"endOfLine": "auto",
"trailingComma": "all",
"printWidth": 100
}

View file

@ -0,0 +1,29 @@
import openapiTS, { astToString } from 'openapi-typescript'
import prettier from 'prettier'
import path from 'path'
import fs from 'node:fs/promises'
import { fileURLToPath } from 'url'
const { format, resolveConfig } = prettier
/**
* @param openapiUrl {string}
* @param outputFilePath {string}
* @param pathToPrettierRc {string}
*/
export async function generateApiSchema(openapiUrl, outputFilePath, pathToPrettierRc) {
const request = new Request(openapiUrl)
const response = await fetch(request)
const json = await response.text()
const ast = await openapiTS(json, {})
const prettierConfig = await resolveConfig(pathToPrettierRc, {
useCache: true,
})
let schemaCode = astToString(ast)
schemaCode = await format(schemaCode, { parser: 'typescript', ...prettierConfig })
await fs.writeFile(path.join(outputFilePath), schemaCode)
}
if (fileURLToPath(import.meta.url) === process.argv[1]) {
if (!process.env.OPENAPI_URL) throw new Error('OPENAPI_URL is not defined')
await generateApiSchema(process.env.OPENAPI_URL, './src/api/schema.ts', './.prettierrc')
}

120
src/api/schema.ts Normal file
View file

@ -0,0 +1,120 @@
export interface paths {
'/posts': {
parameters: {
query?: never
header?: never
path?: never
cookie?: never
}
get?: never
put?: never
post: {
parameters: {
query?: never
header?: never
path?: never
cookie?: never
}
requestBody: {
content: {
'application/json': components['schemas']['CreatePostRequest']
'text/json': components['schemas']['CreatePostRequest']
'application/*+json': components['schemas']['CreatePostRequest']
}
}
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown
}
content: {
'text/plain': components['schemas']['CreatePostResponse']
'application/json': components['schemas']['CreatePostResponse']
'text/json': components['schemas']['CreatePostResponse']
}
}
}
}
delete?: never
options?: never
head?: never
patch?: never
trace?: never
}
'/authors/{username}/posts': {
parameters: {
query?: never
header?: never
path?: never
cookie?: never
}
get: {
parameters: {
query?: {
Cursor?: string
Count?: number
}
header?: never
path: {
username: string
}
cookie?: never
}
requestBody?: never
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown
}
content: {
'text/plain': components['schemas']['GetAuthorPostsResponse']
'application/json': components['schemas']['GetAuthorPostsResponse']
'text/json': components['schemas']['GetAuthorPostsResponse']
}
}
}
}
put?: never
post?: never
delete?: never
options?: never
head?: never
patch?: never
trace?: never
}
}
export type webhooks = Record<string, never>
export interface components {
schemas: {
AuthorPostDto: {
/** Format: uuid */
postId: string
content: string
media: string[]
/** Format: date-time */
createdAt: string
}
CreatePostRequest: {
/** Format: uuid */
authorId: string
content: string
media: string[]
}
CreatePostResponse: {
/** Format: uuid */
postId: string
}
GetAuthorPostsResponse: {
posts: components['schemas']['AuthorPostDto'][]
}
}
responses: never
parameters: never
requestBodies: never
headers: never
pathItems: never
}
export type $defs = Record<string, never>
export type operations = Record<string, never>