From 5595d0ace0393f0a0de26ba1ccaafbf0b34e600d Mon Sep 17 00:00:00 2001 From: john Date: Sat, 3 May 2025 20:18:13 +0200 Subject: [PATCH] WHY --- .prettierrc | 7 +++ scripts/generate-schema.mjs | 29 +++++++++ src/api/schema.ts | 120 ++++++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 .prettierrc create mode 100644 scripts/generate-schema.mjs create mode 100644 src/api/schema.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..2eceeac --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": false, + "singleQuote": true, + "endOfLine": "auto", + "trailingComma": "all", + "printWidth": 100 +} diff --git a/scripts/generate-schema.mjs b/scripts/generate-schema.mjs new file mode 100644 index 0000000..8c3c78b --- /dev/null +++ b/scripts/generate-schema.mjs @@ -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') +} diff --git a/src/api/schema.ts b/src/api/schema.ts new file mode 100644 index 0000000..e210c68 --- /dev/null +++ b/src/api/schema.ts @@ -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 +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 +export type operations = Record