import assert from "node:assert/strict"; import test from "node:test"; import { strFromU8, unzipSync } from "fflate"; import { buildRecoveryWorkbook } from "../lib/recovery-workbook.ts"; const tinyPng = Uint8Array.from([ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, ]); test("creates an xlsx archive whose pictures are embedded in worksheet cells", () => { const workbook = buildRecoveryWorkbook({ sheetName: "数据回收", headers: ["序号", "标题", "原图", "笔记截图"], columnWidths: [8, 24, 24, 24], rows: [ { cells: [1, "测试笔记", "见图", "见图"], images: [ { column: 2, image: { bytes: tinyPng, contentType: "image/png", width: 1, height: 1, description: "原图1", }, }, { column: 3, image: { bytes: tinyPng, contentType: "image/png", width: 1, height: 1, description: "发布截图", }, }, ], }, ], }); const archive = unzipSync(workbook); assert.ok(archive["xl/media/image1.png"]); assert.ok(archive["xl/media/image2.png"]); assert.match(strFromU8(archive["xl/worksheets/sheet1.xml"]), //); assert.match(strFromU8(archive["xl/drawings/drawing1.xml"]), /oneCellAnchor/); assert.match(strFromU8(archive["xl/drawings/_rels/drawing1.xml.rels"]), /image2\.png/); }); test("creates clickable external hyperlinks for resource exports", () => { const workbook = buildRecoveryWorkbook({ sheetName: "KOC资源库", headers: ["账号名称", "账号主页"], columnWidths: [20, 40], rows: [ { cells: ["小满的轻生活", "https://www.xiaohongshu.com/user/profile/test?x=1&y=2"], images: [], hyperlinks: [ { column: 1, url: "https://www.xiaohongshu.com/user/profile/test?x=1&y=2", }, ], }, ], }); const archive = unzipSync(workbook); const sheet = strFromU8(archive["xl/worksheets/sheet1.xml"]); const relationships = strFromU8( archive["xl/worksheets/_rels/sheet1.xml.rels"], ); assert.match(sheet, //); assert.match(sheet, //); assert.match(relationships, /relationships\/hyperlink/); assert.match(relationships, /TargetMode="External"/); assert.match(relationships, /x=1&y=2/); });