import { expect, test } from "bun:test"; import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { pathToFileURL } from "node:url"; import { compileWireFile } from "@wrnexus/compiler"; import { mountHtml } from "@wrnexus/test"; const root = join(import.meta.dir, ".."); const frameworkVersion = JSON.parse(readFileSync(join(root, "package.json"), "utf8")).wrnexus .version as string; const packagePages = join(root, "app", "pages", "packages"); const expected = [ "ai", "auth", "authz", "benchmark", "cache", "captcha", "cli", "compiler", "content", "core", "csr", "db", "dev-server", "dev-toolbar", "encryption", "graphql", "helpers", "i18n", "identity", "image", "jwt", "language-server", "mcp", "mobile", "native", "oauth", "observability", "playground", "plugin", "pubsub", "pwa", "queue", "reactive", "realtime", "router", "security", "ssr", "store", "styles", "syntax", "test", "tracking", "typecheck", "ui", "uploader", "validation", ]; test("generates one detailed page for every published package", () => { const generated = readdirSync(packagePages) .filter((file) => file.endsWith(".wrn")) .map((file) => file.replace(/\.wrn$/, "")) .sort(); expect(generated).toEqual([...expected].sort()); }); test("every package page contains installation, guide, and complete API sections", () => { for (const name of expected) { const source = readFileSync(join(packagePages, `${name}.wrn`), "utf8"); expect(source).toContain(`bun add @wrnexus/${name}@${frameworkVersion}`); expect(source).toContain('id="guide"'); expect(source).toContain('id="api"'); expect(source).toContain("Complete TypeScript API"); expect(source).toContain('class="on-this-page"'); expect(source).toContain('id="examples"'); expect(source).toContain('class="example-card"'); } }); test("UI components use the dedicated external showcase", () => { const reference = JSON.parse( readFileSync(join(root, "node_modules", "@wrnexus", "ui", "component-reference.json"), "utf8"), ) as { count: number; components: Array<{ name: string; props: unknown[] }> }; expect(existsSync(join(root, "app", "pages", "components.wrn"))).toBe(false); expect( readdirSync(join(root, "app", "pages", "components")).filter((file) => file.endsWith(".wrn")), ).toHaveLength(0); const uiPackage = readFileSync(join(packagePages, "ui.wrn"), "utf8"); expect(uiPackage).toContain('href="https://component.wrnexusjs.dev/"'); expect(reference.count).toBeGreaterThan(0); expect(uiPackage).not.toContain("All 901 UI components and props"); }); test("primary navigation exposes the component catalog", () => { for (const file of [ join(root, "app", "pages", "index.wrn"), join(root, "app", "pages", "getting-started.wrn"), join(root, "app", "pages", "packages", "core.wrn"), ]) { expect(readFileSync(file, "utf8")).toContain( 'Components', ); } }); test("every package page shows multiple named usage examples", () => { for (const name of expected) { const source = readFileSync(join(packagePages, `${name}.wrn`), "utf8"); expect(source.match(/class="example-card"/g)?.length ?? 0).toBeGreaterThanOrEqual(2); expect(source).not.toContain("
");
expect(source).toContain("Verification checklist");
}
const security = readFileSync(join(root, "app", "pages", "security.wrn"), "utf8");
expect(security).toContain("contentSecurityPolicy: true");
expect(security).toContain("What you can change");
expect(security).toContain("wrnexus security audit .");
});
test("documentation navigation exposes every package and uses the full-width shell", () => {
const core = readFileSync(join(root, "app", "pages", "packages", "core.wrn"), "utf8");
const index = readFileSync(join(root, "app", "pages", "packages.wrn"), "utf8");
for (const name of expected) {
expect(core).toContain(`href="/packages/${name}"`);
expect(index).toContain(`href="/packages/${name}"`);
}
expect(core).toContain("docs-layout--navigation");
expect(index).toContain("package-index-document");
});
test("package index includes searchable category filters", () => {
const source = readFileSync(join(root, "app", "pages", "packages.wrn"), "utf8");
expect(source).toContain('state category = "All"');
expect(source).toContain("category = 'Security'");
expect(source).toContain("category = 'Native'");
expect(source).toContain("category === 'All'");
expect(source).not.toContain("category === 'All' ||");
expect(source).not.toContain(") && (query");
expect(source.match(/class="package-card"/g)).toHaveLength(expected.length);
});
test("clicking a category hides packages from other categories", async () => {
const source = readFileSync(join(root, "app", "pages", "packages.wrn"), "utf8");
const directory = join(tmpdir(), "wrnexus-doc-tests");
mkdirSync(directory, { recursive: true });
const modulePath = join(directory, `packages-${Date.now()}.ts`);
writeFileSync(modulePath, compileWireFile(source));
const page = (await import(pathToFileURL(modulePath).href)).default as () => string;
const mounted = mountHtml(page());
const dataButton = mounted
.querySelectorAll(".category-row button")
.find((button) => button.textContent?.startsWith("Data"));
expect(dataButton).toBeDefined();
(dataButton as HTMLElement).click();
const visible = mounted
.querySelectorAll(".package-card")
.filter((card) => (card as HTMLElement).style.display !== "none")
.map((card) => card.getAttribute("href"));
expect(visible).toEqual([
"/packages/cache",
"/packages/content",
"/packages/db",
"/packages/graphql",
"/packages/queue",
"/packages/store",
"/packages/uploader",
]);
});