Z ZPI 文档 v0.3.8
介绍页

源码

tests/helpers/unit-environment.ts

typescript53 行查看原文
import { mkdirSync, mkdtempSync, realpathSync } from "node:fs";
import { rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";

// Each isolated test file owns its home and temp files, including shell-tool logs.
export function isolateUnitEnvironment(env: NodeJS.ProcessEnv = process.env) {
  const root = realpathSync(mkdtempSync(join(tmpdir(), "zpi-unit-")));
  const home = join(root, "home");
  const temp = join(root, "tmp");
  mkdirSync(home);
  mkdirSync(temp);
  const overrides: NodeJS.ProcessEnv = {
    HOME: home,
    USERPROFILE: home,
    APPDATA: join(home, "AppData", "Roaming"),
    LOCALAPPDATA: join(home, "AppData", "Local"),
    XDG_CONFIG_HOME: join(home, ".config"),
    XDG_DATA_HOME: join(home, ".local", "share"),
    XDG_CACHE_HOME: join(home, ".cache"),
    ZDOTDIR: home,
    TMPDIR: temp,
    TMP: temp,
    TEMP: temp,
    ZPI_TEST_MODE: "1",
    ZPI_DATA_DIR: home,
    ZPI_TEST_DATA_DIR: home,
    ZPI_DEV_URL: undefined,
    ZPI_TEST_SHOW_WINDOW: undefined,
    ZPI_TEST_INTERACTIVE: undefined,
    BASH_ENV: undefined,
    ENV: undefined,
  };
  const original = new Map(Object.keys(overrides).map((key) => [key, env[key]]));
  for (const [key, value] of Object.entries(overrides)) {
    if (value === undefined) delete env[key];
    else env[key] = value;
  }
  return {
    root,
    async close() {
      try {
        await rm(root, { recursive: true, force: true });
      } finally {
        for (const [key, value] of original) {
          if (value === undefined) delete env[key];
          else env[key] = value;
        }
      }
    },
  };
}