UNPKG

@sealevel-dev/sdk

Version:

TypeScript SDK for Sealevel.

85 lines (68 loc) 2.15 kB
import { createEnv } from "@t3-oss/env-core"; import { config } from "dotenv"; import fs from "fs"; import openapiTS, { astToString, type OpenAPI3 } from "openapi-typescript"; import path from "path"; import { z } from "zod"; import { API_DEFAULT_BASE_URL } from "~/api/const"; config(); const env = createEnv({ server: { API_BASE_URL: z.string().default(API_DEFAULT_BASE_URL), OUTPUT_DIR: z.string().default("src/api"), }, runtimeEnvStrict: { API_BASE_URL: process.env.API_BASE_URL, OUTPUT_DIR: process.env.OUTPUT_DIR, }, }); const API_VERSIONS = ["v1"]; const SCHEMA_FILE_NAME = "schema.ts"; const TYPES_FILE_NAME = "types.ts"; const FILE_HEADER = `/** * This file was generated by codegen/openapi.ts * Do not edit this file manually. */ /* eslint-disable */ `; const TYPES_HEADER = `import type { components } from "./schema"; `; function capitalize(str: string) { return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); } export async function main() { for (const version of API_VERSIONS) { const url = `${env.API_BASE_URL}/${version}/openapi.json`; const schemaResponse = await fetch(url); if (!schemaResponse.ok) { console.error(`Failed to fetch schema: ${schemaResponse.statusText}`); process.exit(1); } const schema = (await schemaResponse.json()) as OpenAPI3; const ast = await openapiTS(schema); const schemaOutput = FILE_HEADER + astToString(ast); let typesOutput = FILE_HEADER + TYPES_HEADER; if (schema.components?.schemas) { for (const key in schema.components.schemas) { const typeName = capitalize(version) + key; typesOutput += `export type ${typeName} = components["schemas"]["${key}"]\n`; } } const outputDir = path.join( import.meta.dirname, "..", env.OUTPUT_DIR, version, ); await fs.promises.mkdir(outputDir, { recursive: true }); await fs.promises.writeFile( path.join(outputDir, SCHEMA_FILE_NAME), schemaOutput, ); await fs.promises.writeFile( path.join(outputDir, TYPES_FILE_NAME), typesOutput, ); } } void main();