Files
yawn/vendor/fxnode/tools/check-readme.ts
T

46 lines
1.9 KiB
TypeScript

import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { join } from "node:path";
const root = new URL("..", import.meta.url).pathname;
const readme = readFileSync(join(root, "README.md"), "utf8");
const fixture = readFileSync(join(root, "test/readme-snippets.compile.ts"), "utf8");
const links = [...readme.matchAll(/!?\[[^\]]*\]\(([^)]+)\)/g)].map((match) => match[1]!);
for (const link of links) {
if (/^(?:https:\/\/|LICENSE$|NOTICE\.md$)/.test(link)) continue;
assert.fail(`README link is not package-safe: ${link}`);
}
for (const stale of ["docs/reference/generated", "docs/.vitepress", "](docs/", "](examples/", "](src/"]) {
assert(!readme.includes(stale), `README contains generated, VitePress-root, or unpacked path: ${stale}`);
}
for (const required of [
"theme: exampleTheme",
"createFxNodeHeadless({",
"api.composeSocket(...numberSocket)",
"api.composeNode(...valueNode)",
'window.addEventListener("pagehide", cleanup)',
"if (cleaned) created.destroy()",
"api = null",
"host.destroy()",
"const gradingWheelsRow = {",
'satisfies FxNodeDefinition["ui"][number]',
"async function installColorBalance(api: FxNode)",
]) {
assert(readme.includes(required), `README current-API regression: ${required}`);
if (
["theme: exampleTheme", "const gradingWheelsRow = {", "async function installColorBalance(api: FxNode)"].includes(
required,
)
)
assert(
fixture.includes(
required
.replace("const gradingWheelsRow", "export const gradingWheelsRow")
.replace("async function", "export async function"),
),
`compile fixture is not synchronized: ${required}`,
);
}
assert(!readme.includes("Immutable current graph snapshot"), "getState must not claim runtime immutability");
console.log(`README checks passed (${readme.split("\n").length - 1} lines, ${links.length} links).`);