#!/usr/bin/env node // Генерирует типы TypeScript из публичной OpenAPI-спеки openrusrouter.ru. // Источник переопределяется переменной SPEC_URL (например, локальный стенд). // Результат коммитится: сборка пакета не должна зависеть от сети. import { mkdirSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import openapiTS, { astToString } from "openapi-typescript"; const DEFAULT_SPEC_URL = "https://openrusrouter.ru/docs/spec.json"; const specUrl = new URL(process.env.SPEC_URL || DEFAULT_SPEC_URL); if (specUrl.protocol !== "https:" && specUrl.protocol !== "file:" && !(specUrl.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(specUrl.hostname))) { console.error(`gen-types: недопустимый SPEC_URL (${specUrl.protocol}//${specUrl.host}) — нужен https или http://localhost`); process.exit(1); } const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const out = resolve(root, "src/generated/openapi.d.ts"); const ast = await openapiTS(specUrl); const header = "/**\n" + " * Сгенерировано scripts/gen-types.mjs из OpenAPI-спеки openrusrouter.ru — не править руками.\n" + " * Внимание: спека расходится с реальными ответами в части полей (см. test/fixtures);\n" + " * источник правды о форме ответа — фикстуры живых ответов, а не эти типы.\n" + " */\n"; mkdirSync(dirname(out), { recursive: true }); writeFileSync(out, header + astToString(ast)); console.error(`gen-types: записано ${out}`);