新增能力:实现可编辑 DOCX 导出、通用主题样式翻译、Markdown 基础工具栏、统一导出菜单与导出进度提示;14 套主题支持纸张、页边距、字体、段落、代码、图片、图表、封面、页眉页脚和页码映射。 问题修复:修复精确预览放大后的右侧留白、保存与导出默认路径、Desktop DOCX 媒体捕获超时、品牌改名后的安装目录迁移,并统一主题展示名称。 兼容与部署:产品更名为墨呈/MorphDoc,保留 NSIS 安装身份;Desktop 内置 Pandoc 3.9.0.2,字体包支持安装向导可选与独立分发;Docker 内置 Chromium、Pandoc 和正式字体,支持离线部署。 发布规则:新增 release/v<version> 唯一产物目录、Docker 镜像 tar.gz、Web 部署 ZIP、manifest.json 和 SHA256SUMS.txt;正式字体迁入版本化仓库目录并由 Git LFS 管理。 验证结果:全项目测试、类型检查、生产构建、git diff --check、14 主题 DOCX 与视觉矩阵、Web API、Desktop 安装版、Word/WPS 可编辑性和字体门禁全部通过;离线镜像经 docker load 复验且容器保持 healthy。 发布产物:Desktop 安装器与 ZIP、字体安装器与 ZIP、Web 镜像压缩包、离线部署包、发行说明和校验清单已整理至本地 release/v0.6.0。Windows EXE 当前未进行 Authenticode 签名,仅按公司内部发布风险规则分发。
58 lines
1.9 KiB
JavaScript
58 lines
1.9 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";
|
|
|
|
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 });
|
|
}
|
|
});
|