Document result shapes and practical calls for all built-in actions, including prerequisites, streaming workflows and compatibility limits. Preserve existing interfaces and execution behavior, and verify the catalog against action validation and representative responses.
43 lines
2.0 KiB
TypeScript
43 lines
2.0 KiB
TypeScript
// 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',
|
|
);
|
|
});
|