新增通用 CSS 到 OOXML 翻译修复,统一字体、字距、精确行距、段落、列表、表格、引用、代码块与行内代码连续性,不引入按主题 ID 分支。 新增 MdTP Mono 并统一 Serif、Sans、Mono 三字体包的 Chromium 与 DOCX 使用链;字体声明、嵌入部件和 Word/WPS 实际采用均进入硬门禁。 重建封面整页及正文语义块视觉差分,14 套主题、纵横两个方向、五组页边距共 140 个真实场景全部通过,阻断失败和诊断失败均为零。 源码服务、Docker Web API 与实际安装 Desktop 的 red-briefing 导出均包含 5 个字体部件;Word/WPS 原生渲染和逐页复核通过。修复 Docker 构建上下文与运行层复用软链接,并完善 v0.6.1 版本、发行说明和发布归集。 验证:npm test(116 个文件、616 项测试)、npm run typecheck、npm run build、git diff --check 全部通过。Desktop 安装器与 ZIP、Docker v0.6.1 镜像已生成;Windows 产物仍为未签名内部发行。
75 lines
2.3 KiB
JavaScript
75 lines
2.3 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.match(
|
|
stageReleaseSource,
|
|
/MorphDoc-FontPack-mdtp-serif-sc-1\.0\.0-x86_64-Setup\.exe/u
|
|
);
|
|
assert.match(
|
|
stageReleaseSource,
|
|
/MorphDoc-FontPack-mdtp-serif-sc-1\.0\.0\.zip/u
|
|
);
|
|
assert.match(stageReleaseSource, /fontPackArtifacts\.map/u);
|
|
});
|