import assert from "node:assert/strict"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { syncPublicAssets } from "./fast-public-assets.ts"; const root = fs.mkdtempSync(path.join(os.tmpdir(), "freecad-public-sync-")); try { const source = path.join(root, "public"); const output = path.join(root, "dist"); fs.mkdirSync(path.join(source, "kernel"), { recursive: true }); const asset = path.join(source, "kernel", "module.wasm"); fs.writeFileSync(asset, "first wasm"); syncPublicAssets(source, output); const destination = path.join(output, "kernel", "module.wasm"); assert.equal(fs.readFileSync(destination, "utf8"), "first wasm"); const inode = fs.statSync(destination).ino; const modified = fs.statSync(destination).mtimeMs; fs.writeFileSync(path.join(output, "stale-bundle.js"), "old bundle"); fs.writeFileSync(path.join(output, "kernel", "obsolete.wasm"), "old module"); syncPublicAssets(source, output); assert.equal(fs.statSync(destination).ino, inode); assert.equal(fs.statSync(destination).mtimeMs, modified); assert.equal(fs.existsSync(path.join(output, "stale-bundle.js")), false); assert.equal(fs.existsSync(path.join(output, "kernel", "obsolete.wasm")), false); fs.writeFileSync(asset, "other wasm"); const withinSameSecond = Math.floor(modified / 1000) + 0.123456; fs.utimesSync(asset, withinSameSecond, withinSameSecond); syncPublicAssets(source, output); assert.equal(fs.readFileSync(destination, "utf8"), "other wasm"); fs.writeFileSync(asset, "new wasm with changes"); syncPublicAssets(source, output); assert.equal(fs.readFileSync(destination, "utf8"), "new wasm with changes"); assert.throws(() => syncPublicAssets(source, root), /disjoint/); fs.symlinkSync(source, path.join(root, "linked")); assert.throws(() => syncPublicAssets(source, path.join(root, "linked")), /symlink/); console.log("PASS: incremental asset reuse, replacement, stale cleanup and path guards"); } finally { fs.rmSync(root, { recursive: true, force: true }); }