import {
existsSync,
mkdirSync,
readFileSync,
rmSync,
writeFileSync,
} from "node:fs";
import { readFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, describe, expect, mock, test } from "bun:test";
import JSZip from "jszip";
// Temp directory for fake app data used in packageApp tests
const testAppsDir = join(tmpdir(), `app-bundler-test-${Date.now()}`);
// Mock app-store so packageApp can find our test apps
const mockApps = new Map
", ' \n ', ); writeFileSync(join(distDir, "index.html"), html); writeFileSync(join(distDir, "main.js"), "console.log('compiled');"); return { ok: true, errors: [], warnings: [], durationMs: 1 }; } mock.module("../bundler/app-compiler.js", () => ({ compileApp: compileAppFixture, })); // Mock bundle-signer (not exercised in these tests) mock.module("./bundle-signer.js", () => ({ signBundle: async () => ({}), })); import { packageApp } from "../bundler/app-bundler.js"; import type { AppManifest } from "../bundler/manifest.js"; // --------------------------------------------------------------------------- // packageApp // --------------------------------------------------------------------------- describe("packageApp", () => { afterEach(() => { compileAppOverride = undefined; mockApps.clear(); try { rmSync(testAppsDir, { recursive: true, force: true }); } catch { // ignore cleanup errors } }); /** * Helper: set up a fake app on disk with src/ and dist/ dirs * so that compileApp can succeed. */ function setupApp(appId: string, opts?: { withCss?: boolean }) { const appDir = join(testAppsDir, appId); const srcDir = join(appDir, "src"); mkdirSync(srcDir, { recursive: true }); // Write minimal src/ so the app directory looks valid if (opts?.withCss) { writeFileSync(join(srcDir, "styles.css"), "body { margin: 0; }"); writeFileSync( join(srcDir, "main.tsx"), 'import "./styles.css";\nexport default () => "hi";', ); } else { writeFileSync(join(srcDir, "main.tsx"), 'export default () => "hi";'); } writeFileSync( join(srcDir, "index.html"), "