跳转到正文

fixtures.ts ​

源文件: examples/_shared/tools/content/fixtures.ts · 下载原文件 · 示例使用说明

ts
import { mkdir, writeFile, readFile } from "node:fs/promises";
import { join } from "node:path";
import { randomUUID, randomInt } from "node:crypto";
import { digest, request, type Mode, type Request } from "./domain.ts";
export async function createFixture(
  directory: string,
  mode: Mode,
): Promise<Request> {
  await mkdir(join(directory, "inputs"), { recursive: true });
  const product = `ND-${randomInt(10000, 99999)}`,
    date = `2026-10-${randomInt(10, 28)}`,
    quota = String(randomInt(25, 85));
  const facts = [
    `NimbusDesk ${product} 是面向已登记团队的杭州试点服务。`,
    `试点开放日期为 ${date}。`,
    `每个团队每天最多可提交 ${quota} 个任务。`,
    `启用前必须获得人工审批;试点不提供自动数据导出。`,
  ];
  const content: Record<string, string> = {
    brief: "# 已批准的试点资料\n" + facts.join("\n") + "\n",
    draft: `# NimbusDesk 试点通知\nNimbusDesk ${product} 是面向已登记团队的杭州试点服务。\n我们这边已经确认了,试点开放日期就是 ${date},请大家留意一下。\n关于任务数量,每个团队每天最多可提交 ${quota} 个任务,请大家不要超出这个数量。\n还有一个事情要特别说一下:启用前必须获得人工审批;试点不提供自动数据导出。\n`,
    notes:
      "# 启用讨论纪要\n申请步骤:提交租户编号并选择杭州试点,审批通过后才可启用。\n维护说明:遇到启用问题时联系团队管理员,不自行绕过审批。\n" +
      Array.from(
        { length: 18 },
        () =>
          "会议讨论了通知的排版和发送顺序;这些讨论不改变已批准的开放日期、配额和审批规则。",
      ).join("\n") +
      "\n",
  };
  const sources = [];
  for (const id of ["brief", "notes", "draft"]) {
    const file = id + ".md";
    await writeFile(join(directory, "inputs", file), content[id]!);
    sources.push({ id, file, sha256: digest(content[id]!) });
  }
  const r: Request = {
    id: randomUUID(),
    tenant: "team-a",
    mode,
    anchors: [product, date, quota],
    sources,
  };
  await writeFile(join(directory, "request.json"), JSON.stringify(r));
  return r;
}
export async function resumeFixture(directory: string) {
  return request(
    JSON.parse(await readFile(join(directory, "request.json"), "utf8")),
  );
}

Ditto · @codesoul-co/ditto · Node.js 24+