all repos — kitten @ 2cfb642564d47a1fa377ea7ba2adc345b6706f68

pkgs/types/scripts/generate.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
import * as fs from "node:fs/promises";
import * as path from "node:path";
import { generateModelsSpec, generateRoutesSpec } from "../src/generator/generator";
import type { OpenAPISpec } from "../src/generator/types";

const SPEC_URL =
	"https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json";

async function main() {
	console.log("fetching OpenAPI spec...");
	const res = await fetch(SPEC_URL);

	if (!res.ok) {
		throw new Error(`failed to fetch spec: ${res.status}`);
	}

	const spec = (await res.json()) as OpenAPISpec;

	const schemas = spec.components?.schemas || {};
	const paths = spec.paths || {};

	console.log("generating models.ts...");
	const modelsCode = generateModelsSpec(schemas);
	const modelsPath = path.join(process.cwd(), "src", "models.ts");
	await fs.writeFile(modelsPath, modelsCode, "utf-8");

	console.log("generating routes.ts...");
	const routesCode = generateRoutesSpec(paths, "Models");
	const routesPath = path.join(process.cwd(), "src", "routes.ts");
	await fs.writeFile(routesPath, routesCode, "utf-8");

	console.log("\ntype generation complete!");
	console.log(`- models generated at: ${modelsPath}`);
	console.log(`- routes generated at: ${routesPath}`);
}

main().catch((err) => {
	console.error("fatal error during generation:", err);
	process.exit(1);
});