Files
MorphDoc/scripts/stage-release.test.mjs
T
SkyJourney 01b06abc2c release: 发布字体直接内置版 v0.6.1
新增能力:14 套主题按纵横方向与五组页边距组成的 140 场景视觉矩阵全部通过,封面执行整页严格门禁,正文执行分页无关的语义块门禁。

问题修复:统一 CSS 到 WordprocessingML 的通用翻译,修复字体嵌入、中文标点字距、精确行距、打印媒体与行内代码连续性,不包含按主题 ID 的特调。

发行变化:Desktop 安装器与免安装 ZIP 直接内置 Serif、Sans、Mono 三套字体包;NSIS 移除字体选择和伴随安装逻辑,不再发布独立字体安装器或字体 ZIP。正式附件收敛为 Desktop 安装器、Desktop ZIP、Docker 离线镜像、Web 部署包和发行说明。

部署兼容:Docker 镜像 md-to-pdf:v0.6.1 使用完整无缓存路径构建,固定 Chromium、Pandoc 3.9.0.2 和三套内置字体包;支持覆盖安装 v0.6.0,Windows 安装器保持未签名的内部发布状态。

验证结果:116 个测试文件、616 项测试、全项目类型检查、生产构建和 git diff --check 全部通过;140/140 视觉矩阵阻断失败和诊断失败均为 0;源码服务、Docker Web API 与实际安装 Desktop 的 DOCX 字体嵌入链路均通过。
2026-08-04 12:25:02 +08:00

68 lines
2.2 KiB
JavaScript

import assert from "node:assert/strict";
import { mkdtemp, readFile, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import test from "node:test";
import { unzipSync } from "fflate";
import {
checksumText,
createDeploymentArchive,
normalizeVersion,
parseArguments
} from "./stage-release.mjs";
const stageReleaseSource = await readFile(
new URL("./stage-release.mjs", import.meta.url),
"utf8"
);
test("normalizeVersion 接受语义版本并移除 v 前缀", () => {
assert.equal(normalizeVersion("v0.6.0"), "0.6.0");
assert.equal(normalizeVersion("1.2.3-beta.1"), "1.2.3-beta.1");
assert.throws(() => normalizeVersion("latest"), /无效发布版本/u);
});
test("parseArguments 拒绝不完整参数", () => {
assert.deepEqual(
[...parseArguments(["--version", "0.6.0", "--image", "test:1"])],
[
["version", "0.6.0"],
["image", "test:1"]
]
);
assert.throws(() => parseArguments(["--version"]), /无效命令参数/u);
});
test("checksumText 生成标准 SHA256SUMS 格式", () => {
assert.equal(
checksumText([{ name: "artifact.zip", sha256: "abc" }]),
"abc artifact.zip\n"
);
});
test("Web 离线部署 ZIP 包含 Compose 和导入说明", async () => {
const directory = await mkdtemp(join(tmpdir(), "morphdoc-release-test-"));
const output = join(directory, "deploy.zip");
try {
await createDeploymentArchive("0.6.0", output);
const entries = unzipSync(new Uint8Array(await readFile(output)));
const names = Object.keys(entries).sort();
assert.ok(names.includes("MorphDoc-Web-0.6.0-deploy/compose.yaml"));
assert.ok(names.includes("MorphDoc-Web-0.6.0-deploy/.env.example"));
assert.ok(names.includes("MorphDoc-Web-0.6.0-deploy/OFFLINE-README.md"));
assert.match(
Buffer.from(
entries["MorphDoc-Web-0.6.0-deploy/OFFLINE-README.md"]
).toString("utf8"),
/docker load/u
);
} finally {
await rm(directory, { recursive: true, force: true });
}
});
test("正式发布不再拆分独立字体安装器和 ZIP", () => {
assert.doesNotMatch(stageReleaseSource, /MorphDoc-FontPack-/u);
assert.doesNotMatch(stageReleaseSource, /fontPackArtifacts/u);
});