連合の共通語を、型として話せます。NoteやFollowをふつうのオブジェクトとして組み立てれば、正しいJSON-LDになって海を渡る。綴りを間違えればビルドが教えてくれて、エディタの補完が仕様書の代わりになります。
そしてこの経は、手書きではありません。一語につき一枚のYAMLから、コード生成で書き写されます——写経が、比喩ではなくビルド工程として実在します。辞書にはtoot:やmisskey:といった現実の方言までぜんぶ載っている。連合の言葉は、生きている言葉です。
見どころ
- 経のもとは packages/vocab/src/*.yaml。name/uri/extends/defaultContext/propertiesを宣言し、vocab-toolsのschema.yamlで検分される
- 写経机はcodegen.ts——mkdirロックとmtimeの鮮度確認つきで、変わっていなければ焼き直さない
- 生成器の部品はclass.ts/codec.ts/constructor.ts/property.ts。クラスも、encoder/decoderも、cloneも、inspectorも、みんな生成物
- 実行時の台はべつの包み @fedify/vocab-runtime(jsonldを同梱)
経文の一節
export default async function generateVocab(
schemaDir: string,
generatedPath: string,
): Promise<void> {
const types = await loadSchemaFiles(schemaDir);
const encoder = new TextEncoder();
const file = await open(generatedPath, "w");
const writer = file.createWriteStream();
for await (const code of generateClasses(types)) {
writer.write(encoder.encode(code));
} さわってみる
あなたの一言が海を渡るときの、実際の形(Create + Note)です。黄色く光るのが、いま変わったところ。