WHY
This commit is contained in:
parent
e84cf232a5
commit
5595d0ace0
3 changed files with 156 additions and 0 deletions
7
.prettierrc
Normal file
7
.prettierrc
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"endOfLine": "auto",
|
||||
"trailingComma": "all",
|
||||
"printWidth": 100
|
||||
}
|
29
scripts/generate-schema.mjs
Normal file
29
scripts/generate-schema.mjs
Normal 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
120
src/api/schema.ts
Normal 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>
|
Loading…
Add table
Add a link
Reference in a new issue