package.json, tsconfig, eslint, генерация типов из OpenAPI-спеки, модули config/redact/errors/money/sanitize/cache с тестами и обезличенные фикстуры живых ответов API openrusrouter.ru. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.8 KiB
JavaScript
31 lines
1.8 KiB
JavaScript
#!/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}`);
|