1import { assert, describe } from "@effect/vitest";
2
3import { createOxlintRuleHarness } from "../test/utils.ts";
4
5const rule = createOxlintRuleHarness("t3code/no-global-process-runtime");
6
7describe("t3code/no-global-process-runtime", () => {
8 rule.valid(
9 "allows injected host process references",
10 `
11 import * as HostProcess from "@t3tools/shared/HostProcess";
12 import * as Effect from "effect/Effect";
13
14 export const isWindows = Effect.map(HostProcess.Platform, (platform) => platform === "win32");
15 `,
16 );
17
18 rule.valid(
19 "allows unrelated process members",
20 `
21 process.exitCode = 1;
22 const nodeEnv = process.env.NODE_ENV;
23 `,
24 );
25
26 rule.valid(
27 "allows unrelated node os imports",
28 `
29 import { tmpdir } from "node:os";
30
31 export const tempDirectory = tmpdir();
32 `,
33 );
34
35 rule.invalid(
36 "reports direct platform reads",
37 `
38 export const isWindows = process.platform === "win32";
39 `,
40 (output) => {
41 assert.match(output, /Use HostProcess\.Platform/);
42 },
43 );
44
45 rule.invalid(
46 "reports direct architecture reads",
47 `
48 export const isArm = process.arch === "arm64";
49 `,
50 (output) => {
51 assert.match(output, /Use HostProcess\.Architecture/);
52 },
53 );
54
55 rule.invalid(
56 "reports globalThis process platform reads",
57 `
58 export const terminalName = globalThis.process.platform === "win32" ? "xterm-color" : "xterm-256color";
59 `,
60 );
61
62 rule.invalid(
63 "reports node os namespace platform reads",
64 `
65 import * as NodeOS from "node:os";
66
67 export const isWindows = NodeOS.platform() === "win32";
68 `,
69 (output) => {
70 assert.match(output, /Use HostProcess\.Platform/);
71 },
72 );
73
74 rule.invalid(
75 "reports renamed node os architecture imports",
76 `
77 import { arch as hostArch } from "node:os";
78
79 export const isArm = hostArch() === "arm64";
80 `,
81 (output) => {
82 assert.match(output, /Use HostProcess\.Architecture/);
83 },
84 );
85
86 rule.invalid(
87 "reports default node os platform reads",
88 `
89 import os from "node:os";
90
91 export const isWindows = os.platform() === "win32";
92 `,
93 );
94});