import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join, relative } from "node:path"; import AdmZip from "adm-zip"; import { createPublishArchive, getPublishApiBaseUrl, localizeExternalAssets, publishProjectArchive, uploadTimeoutMs, } from "./publishProject.js"; function makeProjectDir(): string { return mkdtempSync(join(tmpdir(), "hf-publish-")); } describe("createPublishArchive", () => { it("packages the project and skips hidden files and node_modules", () => { const dir = makeProjectDir(); try { writeFileSync(join(dir, "index.html"), "", "utf-8"); mkdirSync(join(dir, "assets")); writeFileSync(join(dir, "assets/logo.svg"), "", "utf-8"); mkdirSync(join(dir, ".git")); writeFileSync(join(dir, ".env"), "SECRET=1", "utf-8"); mkdirSync(join(dir, "node_modules")); writeFileSync(join(dir, "node_modules/ignored.js"), "console.log('ignore')", "utf-8"); const archive = createPublishArchive(dir); expect(archive.fileCount).toBe(2); expect(archive.buffer.byteLength).toBeGreaterThan(0); } finally { rmSync(dir, { recursive: true, force: true }); } }); }); describe("localizeExternalAssets", () => { it("copies external src/href assets and rewrites HTML paths", () => { const projectDir = makeProjectDir(); const extDir = mkdtempSync(join(tmpdir(), "hf-ext-")); try { writeFileSync(join(extDir, "logo.png"), "PNG_DATA", "utf-8"); const relToExt = relative(projectDir, join(extDir, "logo.png")).replaceAll("\\", "/"); const html = `