import fs from "node:fs"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import { buildOfficialChannelCatalog, OFFICIAL_CHANNEL_CATALOG_RELATIVE_PATH, writeOfficialChannelCatalog, } from "../scripts/write-official-channel-catalog.mjs"; import { cleanupTempDirs, makeTempRepoRoot, writeJsonFile } from "./helpers/temp-repo.js"; const tempDirs: string[] = []; function makeRepoRoot(prefix: string): string { return makeTempRepoRoot(tempDirs, prefix); } function writeJson(filePath: string, value: unknown): void { writeJsonFile(filePath, value); } afterEach(() => { cleanupTempDirs(tempDirs); }); describe("buildOfficialChannelCatalog", () => { it("includes publishable official channel plugins and skips non-publishable entries", () => { const repoRoot = makeRepoRoot("openclaw-official-channel-catalog-"); writeJson(path.join(repoRoot, "extensions", "whatsapp", "package.json"), { name: "@openclaw/whatsapp", version: "2026.3.23", description: "OpenClaw WhatsApp channel plugin", openclaw: { channel: { id: "whatsapp", label: "WhatsApp", selectionLabel: "WhatsApp (QR link)", detailLabel: "WhatsApp Web", docsPath: "/channels/whatsapp", blurb: "works with your own number; recommend a separate phone + eSIM.", }, install: { npmSpec: "@openclaw/whatsapp", localPath: "extensions/whatsapp", defaultChoice: "npm", }, release: { publishToNpm: true, }, }, }); writeJson(path.join(repoRoot, "extensions", "local-only", "package.json"), { name: "@openclaw/local-only", openclaw: { channel: { id: "local-only", label: "Local Only", selectionLabel: "Local Only", docsPath: "/channels/local-only", blurb: "dev only", }, install: { localPath: "extensions/local-only", }, release: { publishToNpm: false, }, }, }); expect(buildOfficialChannelCatalog({ repoRoot })).toEqual({ entries: [ { name: "@openclaw/whatsapp", version: "2026.3.23", description: "OpenClaw WhatsApp channel plugin", openclaw: { channel: { id: "whatsapp", label: "WhatsApp", selectionLabel: "WhatsApp (QR link)", detailLabel: "WhatsApp Web", docsPath: "/channels/whatsapp", blurb: "works with your own number; recommend a separate phone + eSIM.", }, install: { npmSpec: "@openclaw/whatsapp", localPath: "extensions/whatsapp", defaultChoice: "npm", }, }, }, ], }); }); it("writes the official catalog under dist", () => { const repoRoot = makeRepoRoot("openclaw-official-channel-catalog-write-"); writeJson(path.join(repoRoot, "extensions", "whatsapp", "package.json"), { name: "@openclaw/whatsapp", openclaw: { channel: { id: "whatsapp", label: "WhatsApp", selectionLabel: "WhatsApp", docsPath: "/channels/whatsapp", blurb: "wa", }, install: { npmSpec: "@openclaw/whatsapp", }, release: { publishToNpm: true, }, }, }); writeOfficialChannelCatalog({ repoRoot }); const outputPath = path.join(repoRoot, OFFICIAL_CHANNEL_CATALOG_RELATIVE_PATH); expect(fs.existsSync(outputPath)).toBe(true); expect(JSON.parse(fs.readFileSync(outputPath, "utf8"))).toEqual({ entries: [ { name: "@openclaw/whatsapp", openclaw: { channel: { id: "whatsapp", label: "WhatsApp", selectionLabel: "WhatsApp", docsPath: "/channels/whatsapp", blurb: "wa", }, install: { npmSpec: "@openclaw/whatsapp", }, }, }, ], }); }); });