@sealevel-dev/sdk
Version:
TypeScript SDK for Sealevel.
85 lines (68 loc) • 2.15 kB
text/typescript
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();