@wirecat/cli-base 0.43.1 → 0.43.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/testing/network.d.ts.map +1 -1
- package/dist/testing/network.js +5 -2
- package/dist/testing/network.js.map +1 -1
- package/dist/testing/sandbox.d.ts +3 -1
- package/dist/testing/sandbox.d.ts.map +1 -1
- package/dist/testing/sandbox.js +36 -2
- package/dist/testing/sandbox.js.map +1 -1
- package/docs/standards/style.md +4 -1
- package/docs/standards/testing.md +8 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/testing/network.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/testing/network.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,KAI3C,CAAA;AA2DH;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,QAAO,IAgCtC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,CAAC,MAAM,IAAI,CAQ1C,CAAA"}
|
package/dist/testing/network.js
CHANGED
|
@@ -2,7 +2,10 @@ import http from "node:http";
|
|
|
2
2
|
import https from "node:https";
|
|
3
3
|
import { syncBuiltinESMExports } from "node:module";
|
|
4
4
|
import net from "node:net";
|
|
5
|
-
const
|
|
5
|
+
const isLocal = (host) => {
|
|
6
|
+
const name = host.toLowerCase().replace(/^\[(.*)\]$/, "$1");
|
|
7
|
+
return name === "localhost" || name === "::1" || (net.isIPv4(name) && name.startsWith("127."));
|
|
8
|
+
};
|
|
6
9
|
const STATE = Symbol.for("@wirecat/cli-base/testing/network");
|
|
7
10
|
const state = () => {
|
|
8
11
|
const holder = globalThis;
|
|
@@ -12,7 +15,7 @@ const state = () => {
|
|
|
12
15
|
export const networkRefused = (host) => new Error(`a test tried to reach ${host} — tests use a local server or a scripted adapter; ` +
|
|
13
16
|
"the one test that must reach the network calls onTestFinished(allowNetwork())");
|
|
14
17
|
const refuseUnlessLocal = (host) => {
|
|
15
|
-
if (state().allowed > 0 ||
|
|
18
|
+
if (state().allowed > 0 || isLocal(host))
|
|
16
19
|
return;
|
|
17
20
|
throw networkRefused(host);
|
|
18
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/testing/network.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,GAAG,MAAM,UAAU,CAAA;AAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/testing/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,10 @@ export interface Sandbox {
|
|
|
8
8
|
* folder and its XDG and Windows folders, and every `<APP>_CONFIG_DIR`, `_STATE_DIR` and
|
|
9
9
|
* `_CACHE_DIR` already set. One that is not set falls back to the sandboxed home, so a CLI needs no
|
|
10
10
|
* list of its own prefixes; one set in the developer's shell would otherwise point at the real one.
|
|
11
|
+
* npm's and pnpm's update check is off: with a fresh home it would reach the registry from a child
|
|
12
|
+
* process, past the network guard, and print its notice into output the test parses.
|
|
11
13
|
*/
|
|
12
|
-
export declare const enterSandbox: (env?: NodeJS.ProcessEnv) => Sandbox;
|
|
14
|
+
export declare const enterSandbox: (env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform) => Sandbox;
|
|
13
15
|
export declare const REAL_KEYRING_REACHED = "a test reached the real OS keyring \u2014 pass memoryKeyring() instead";
|
|
14
16
|
/**
|
|
15
17
|
* `systemKeyring` loads `@napi-rs/keyring` through `createRequire`, which `vi.mock` does not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,OAAO,IAAI,IAAI,CAAA;CAChB;
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,OAAO,IAAI,IAAI,CAAA;CAChB;AAkCD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,SAClB,MAAM,CAAC,UAAU,aACZ,MAAM,CAAC,QAAQ,KACxB,OAsCF,CAAA;AAED,eAAO,MAAM,oBAAoB,2EAAsE,CAAA;AAQvG;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAO,IAgBzC,CAAA"}
|
package/dist/testing/sandbox.js
CHANGED
|
@@ -3,14 +3,45 @@ import { createRequire } from "node:module";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
const OVERRIDE = /_(CONFIG|STATE|CACHE)_DIR$/;
|
|
6
|
+
// macOS keeps a Unix socket path under 104 bytes, and its per-user temporary folder alone takes about 50.
|
|
7
|
+
const baseFor = (platform) => (platform === "darwin" ? "/tmp" : tmpdir());
|
|
8
|
+
const LEFT = Symbol.for("@wirecat/cli-base/testing/sandboxes");
|
|
9
|
+
/**
|
|
10
|
+
* vitest skips a file's afterAll when the file throws while loading or an earlier afterAll throws,
|
|
11
|
+
* and then ends the worker with SIGTERM, which fires no `exit`. The signal is raised again once the
|
|
12
|
+
* folders are gone, so the worker still ends the way it would have.
|
|
13
|
+
*/
|
|
14
|
+
const removeOnExit = (dir) => {
|
|
15
|
+
const holder = globalThis;
|
|
16
|
+
if (!holder[LEFT]) {
|
|
17
|
+
const left = new Set();
|
|
18
|
+
holder[LEFT] = left;
|
|
19
|
+
const removeLeft = () => {
|
|
20
|
+
for (const path of left)
|
|
21
|
+
rmSync(path, { recursive: true, force: true });
|
|
22
|
+
left.clear();
|
|
23
|
+
};
|
|
24
|
+
process.once("exit", removeLeft);
|
|
25
|
+
process.once("SIGTERM", () => {
|
|
26
|
+
removeLeft();
|
|
27
|
+
process.kill(process.pid, "SIGTERM");
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const left = holder[LEFT];
|
|
31
|
+
left.add(dir);
|
|
32
|
+
return () => left.delete(dir);
|
|
33
|
+
};
|
|
6
34
|
/**
|
|
7
35
|
* Points everything a test could write to at a fresh directory: the temporary folder, the home
|
|
8
36
|
* folder and its XDG and Windows folders, and every `<APP>_CONFIG_DIR`, `_STATE_DIR` and
|
|
9
37
|
* `_CACHE_DIR` already set. One that is not set falls back to the sandboxed home, so a CLI needs no
|
|
10
38
|
* list of its own prefixes; one set in the developer's shell would otherwise point at the real one.
|
|
39
|
+
* npm's and pnpm's update check is off: with a fresh home it would reach the registry from a child
|
|
40
|
+
* process, past the network guard, and print its notice into output the test parses.
|
|
11
41
|
*/
|
|
12
|
-
export const enterSandbox = (env = process.env) => {
|
|
13
|
-
const dir = mkdtempSync(join(
|
|
42
|
+
export const enterSandbox = (env = process.env, platform = process.platform) => {
|
|
43
|
+
const dir = mkdtempSync(join(baseFor(platform), "wirecat-test-"));
|
|
44
|
+
const forget = removeOnExit(dir);
|
|
14
45
|
const home = join(dir, "home");
|
|
15
46
|
mkdirSync(home);
|
|
16
47
|
const wanted = {
|
|
@@ -25,6 +56,8 @@ export const enterSandbox = (env = process.env) => {
|
|
|
25
56
|
XDG_CACHE_HOME: join(home, ".cache"),
|
|
26
57
|
APPDATA: join(home, "AppData", "Roaming"),
|
|
27
58
|
LOCALAPPDATA: join(home, "AppData", "Local"),
|
|
59
|
+
npm_config_update_notifier: "false",
|
|
60
|
+
NO_UPDATE_NOTIFIER: "1",
|
|
28
61
|
};
|
|
29
62
|
for (const key of Object.keys(env))
|
|
30
63
|
if (OVERRIDE.test(key) || key === "MESSAGING_STORE")
|
|
@@ -41,6 +74,7 @@ export const enterSandbox = (env = process.env) => {
|
|
|
41
74
|
env[key] = value;
|
|
42
75
|
}
|
|
43
76
|
rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
|
|
77
|
+
forget();
|
|
44
78
|
},
|
|
45
79
|
};
|
|
46
80
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAQhC,MAAM,QAAQ,GAAG,4BAA4B,CAAA;AAE7C
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"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"}
|
package/docs/standards/style.md
CHANGED
|
@@ -105,7 +105,10 @@ formatting, so this page does not repeat it.
|
|
|
105
105
|
- **Enforced by:** review only.
|
|
106
106
|
- **Example:** `feat(standards): add the verb scan`, `docs(standards): toolchain rules`,
|
|
107
107
|
`feat!: remove the --take alias`. The body says why. A title marked breaking needs a changelog line; the
|
|
108
|
-
changelog rules are on the [Documents page](docs.md).
|
|
108
|
+
changelog rules are on the [Documents page](docs.md). Every WireCat repository merges pull requests by squash
|
|
109
|
+
only, with the pull request's title and body as the commit message; merge commits and rebase merges are off
|
|
110
|
+
(repository settings, set for all repositories on 2026-10-17). So the pull request title is the commit title on
|
|
111
|
+
`main`, and its body is the commit body.
|
|
109
112
|
- **Exceptions:** none.
|
|
110
113
|
- **Applies to:** all repositories. **Since:** cli-base 0.41.0. **Rulings:** none.
|
|
111
114
|
|
|
@@ -35,9 +35,13 @@ and which run after merge is in [CI](ci.md).
|
|
|
35
35
|
file gets a fresh directory: `TMPDIR`, `TMP`, `TEMP`, `HOME`, `USERPROFILE`, the XDG and Windows folders, and
|
|
36
36
|
every `<APP>_CONFIG_DIR`, `_STATE_DIR` and `_CACHE_DIR` already set, with the store variables
|
|
37
37
|
([WC-STORE-14](store.md#wc-store-14--tests-never-open-the-owners-store)), point into it. One that is not set falls
|
|
38
|
-
back to the sandboxed home.
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
back to the sandboxed home. npm's and pnpm's update check is off (`npm_config_update_notifier=false`,
|
|
39
|
+
`NO_UPDATE_NOTIFIER=1`): with a fresh home, a child `npm` would reach the registry past the network guard and print
|
|
40
|
+
its notice into output a test parses. On macOS the directory is made under `/tmp`, so a Unix socket path under the
|
|
41
|
+
sandboxed home stays within the 104-byte limit. When the file is done, after its own hooks have closed their
|
|
42
|
+
resources, the setup restores the variables and removes the directory; when the file fails while loading or its
|
|
43
|
+
own `afterAll` throws, vitest skips that step and the directory is removed as the worker ends. A CLI's own setup
|
|
44
|
+
file, listed after the shared one, adds only what is its own, such as a default profile.
|
|
41
45
|
- **Exceptions:** keep coverage reports and debug traces outside the sandbox, with bounded retention. Never clean
|
|
42
46
|
another session's scratch directory as test teardown.
|
|
43
47
|
- **Applies to:** all CLIs and the shared packages. cli-base uses the shared setup; the CLIs keep their own sandboxes
|
|
@@ -61,7 +65,7 @@ and which run after merge is in [CI](ci.md).
|
|
|
61
65
|
- **Enforced by:** `src/testing/network.test.ts`, `max-cli: src/testing/unscripted.ts`.
|
|
62
66
|
- **Example:** the shared setup
|
|
63
67
|
([WC-TEST-1](#wc-test-1--point-every-path-a-test-could-write-at-a-temporary-directory)) refuses every connection
|
|
64
|
-
to anything but `localhost`, `127.
|
|
68
|
+
to anything but `localhost`, any `127.x.x.x` address and `::1` before a name is looked up: `net` and `tls` connects,
|
|
65
69
|
`http(s)` requests, `fetch` and `WebSocket` throw an error that names the host. A test talks to a local server or
|
|
66
70
|
a scripted adapter instead. max-cli's `src/testing/mock-max.ts` scripts the service: an answer per request, a
|
|
67
71
|
refusal, or silence to test a timeout, and a request with no scripted answer fails the test that sent it. tg's
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wirecat/cli-base",
|
|
3
|
-
"version": "0.43.
|
|
3
|
+
"version": "0.43.2",
|
|
4
4
|
"description": "The parts every command line tool needs: output modes, terminal rendering, error model, exit codes, credentials, clocks",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|