// Catalog generator. Runs under vitest (so @snowluma/onebot/action-docs resolves // via the proton plugin, exactly as onebot's own tests do) and writes a build-time // snapshot of the OneBot action catalog into src/generated/catalog.ts. // // This is the whole "auto-track Action 增减" mechanic: the snapshot is regenerated // from the live specs on every build, so it can never describe a stale action set. import { mkdirSync, writeFileSync } from 'node:fs'; import { it, expect } from 'vitest'; import { collectActionDocs, collectCategories } from '@snowluma/onebot/action-docs'; it('generates src/generated/catalog.ts from the live action specs', () => { const actions = collectActionDocs(); const categories = collectCategories(); expect(actions.length).toBeGreaterThan(100); // every action must carry a composed input schema (the MCP's payoff) for (const a of actions) { expect(a.inputSchema).toBeTypeOf('object'); expect(a.name).toBeTruthy(); expect(a.returnsSchema, `${a.name} result schema`).toBeTypeOf('object'); expect(a.examples?.length, `${a.name} invocation examples`).toBeGreaterThan(0); } const body = '// GENERATED by scripts/gen-catalog.test.ts — do not edit. Run `pnpm gen`.\n' + '/* eslint-disable */\n' + "import type { CatalogAction, CatalogCategory } from '../types.js';\n\n" + `export const ACTIONS: CatalogAction[] = ${JSON.stringify(actions, null, 2)};\n\n` + `export const CATEGORIES: CatalogCategory[] = ${JSON.stringify(categories, null, 2)};\n`; const dir = new URL('../src/generated/', import.meta.url); mkdirSync(dir, { recursive: true }); writeFileSync(new URL('../src/generated/catalog.ts', import.meta.url), body); // Plain-JSON twin of the catalog, consumed by the docs site (SnowLumaDocs) // via the sync-docs-catalog workflow. Same data as catalog.ts. writeFileSync( new URL('../src/generated/catalog.json', import.meta.url), JSON.stringify({ actions, categories }, null, 2) + '\n', ); });