@abdwhb-png/pi-test-harness 0.7.0 → 0.8.0
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/CHANGELOG.md +19 -0
- package/dist/sandbox.d.ts +30 -0
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +38 -1
- package/dist/sandbox.js.map +1 -1
- package/package.json +1 -1
- package/src/sandbox.ts +45 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @abdwhb-png/pi-test-harness
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Load extensions in Pi's shipped loader configuration, and move the supported Pi line to 0.85.
|
|
8
|
+
|
|
9
|
+
Path-loaded extensions (`extensions: [...]`) could fail with `Cannot access 'x' before initialization` when the test runner was Bun. Pi builds its jiti options from how Pi itself is running, and the branch an in-process harness lands on left jiti's native import fast-path at its default — enabled when Bun is detected, off under Node. Under Bun that path handed Pi a factory for an entrypoint whose module body had not finished evaluating, so any extension using a module-level `await import(...)` threw a TDZ error instead of loading. The harness now pins the choice Pi's shipped runtimes make (`tryNative: false`) around extension evaluation, so loading behaves the same under vitest and `bun test`.
|
|
10
|
+
|
|
11
|
+
Also in this change:
|
|
12
|
+
|
|
13
|
+
- The supported Pi line is now `^0.85.0` (`devDependencies` locked to 0.85.1), replacing `^0.84.0`.
|
|
14
|
+
- New path-loaded extension coverage: a top-level-await fixture, static-import and plain-factory controls, and a failing-implementation case. It runs under vitest (`__tests__/extension-loading.test.ts`) and under Bun (`npm run test:bun`), with a CI job for the Bun side.
|
|
15
|
+
- The packed-consumer smoke now installs peers declared in `package.json` instead of a hardcoded Pi version.
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Upgrade the harness to Pi 0.84 and keep runtime API-key initialization offline through Pi's native synchronization path.
|
|
20
|
+
- Clear all open dependency advisories, and take vitest to 5. The suite needed no configuration change for vitest 5.
|
|
21
|
+
|
|
3
22
|
## 0.7.0
|
|
4
23
|
|
|
5
24
|
### Major Changes
|
package/dist/sandbox.d.ts
CHANGED
|
@@ -23,5 +23,35 @@ import type { SandboxOptions, SandboxResult } from "./types.js";
|
|
|
23
23
|
* @internal
|
|
24
24
|
*/
|
|
25
25
|
export declare function _resolveExecutable(command: string, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): string;
|
|
26
|
+
/**
|
|
27
|
+
* How to launch a resolved command, without Node's deprecated shell form.
|
|
28
|
+
*
|
|
29
|
+
* **Why**: on Windows a `.cmd`/`.bat` is not an executable image — it needs a
|
|
30
|
+
* terminal. Since the CVE-2024-27980 fix, child_process refuses to launch one
|
|
31
|
+
* with `shell: false` and fails with `EINVAL`, so resolving `sfw` to `sfw.CMD`
|
|
32
|
+
* was necessary but not sufficient.
|
|
33
|
+
*
|
|
34
|
+
* Node documents three ways to launch it: `exec()`, `{ shell: true }`, or
|
|
35
|
+
* spawning `cmd.exe` with the script as an argument. The shell option is
|
|
36
|
+
* deprecated as a *runtime* warning in Node 24 (DEP0190) because an argument
|
|
37
|
+
* array passed that way is only space-joined, never escaped. This takes the
|
|
38
|
+
* third route — what `exec()` does internally — so the argument array reaches the
|
|
39
|
+
* child intact and no deprecated form is used.
|
|
40
|
+
*
|
|
41
|
+
* Real binaries (`.exe`, or a path with no shim extension) spawn directly and
|
|
42
|
+
* stay shell-free on every platform.
|
|
43
|
+
*
|
|
44
|
+
* Known limitation, unchanged from the shell form: cmd.exe applies its own
|
|
45
|
+
* parsing to the arguments that follow the script, so an argument containing
|
|
46
|
+
* spaces has to survive it. Only the script path is guaranteed, because Node
|
|
47
|
+
* quotes an argument that contains spaces when it builds the command line.
|
|
48
|
+
*
|
|
49
|
+
* Exported for unit testing — not part of the public API contract.
|
|
50
|
+
* @internal
|
|
51
|
+
*/
|
|
52
|
+
export declare function _spawnTarget(resolved: string, args: string[], platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): {
|
|
53
|
+
command: string;
|
|
54
|
+
args: string[];
|
|
55
|
+
};
|
|
26
56
|
export declare function verifySandboxInstall(options: SandboxOptions): Promise<SandboxResult>;
|
|
27
57
|
//# sourceMappingURL=sandbox.d.ts.map
|
package/dist/sandbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAShE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CA0BR;
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAShE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CA0BR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAUrC;AAyED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,cAAc,GACrB,OAAO,CAAC,aAAa,CAAC,CA2LxB"}
|
package/dist/sandbox.js
CHANGED
|
@@ -61,14 +61,51 @@ export function _resolveExecutable(command, platform = process.platform, env = p
|
|
|
61
61
|
}
|
|
62
62
|
return command;
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* How to launch a resolved command, without Node's deprecated shell form.
|
|
66
|
+
*
|
|
67
|
+
* **Why**: on Windows a `.cmd`/`.bat` is not an executable image — it needs a
|
|
68
|
+
* terminal. Since the CVE-2024-27980 fix, child_process refuses to launch one
|
|
69
|
+
* with `shell: false` and fails with `EINVAL`, so resolving `sfw` to `sfw.CMD`
|
|
70
|
+
* was necessary but not sufficient.
|
|
71
|
+
*
|
|
72
|
+
* Node documents three ways to launch it: `exec()`, `{ shell: true }`, or
|
|
73
|
+
* spawning `cmd.exe` with the script as an argument. The shell option is
|
|
74
|
+
* deprecated as a *runtime* warning in Node 24 (DEP0190) because an argument
|
|
75
|
+
* array passed that way is only space-joined, never escaped. This takes the
|
|
76
|
+
* third route — what `exec()` does internally — so the argument array reaches the
|
|
77
|
+
* child intact and no deprecated form is used.
|
|
78
|
+
*
|
|
79
|
+
* Real binaries (`.exe`, or a path with no shim extension) spawn directly and
|
|
80
|
+
* stay shell-free on every platform.
|
|
81
|
+
*
|
|
82
|
+
* Known limitation, unchanged from the shell form: cmd.exe applies its own
|
|
83
|
+
* parsing to the arguments that follow the script, so an argument containing
|
|
84
|
+
* spaces has to survive it. Only the script path is guaranteed, because Node
|
|
85
|
+
* quotes an argument that contains spaces when it builds the command line.
|
|
86
|
+
*
|
|
87
|
+
* Exported for unit testing — not part of the public API contract.
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
export function _spawnTarget(resolved, args, platform = process.platform, env = process.env) {
|
|
91
|
+
if (platform !== "win32" || !/\.(cmd|bat)$/i.test(resolved)) {
|
|
92
|
+
return { command: resolved, args };
|
|
93
|
+
}
|
|
94
|
+
// `/d` skips AutoRun scripts, `/s` keeps cmd's parsing of the rest as-is.
|
|
95
|
+
return {
|
|
96
|
+
command: env.ComSpec ?? "cmd.exe",
|
|
97
|
+
args: ["/d", "/s", "/c", resolved, ...args],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
64
100
|
/**
|
|
65
101
|
* Run a command via execFileSync with safe string conversion for the full
|
|
66
102
|
* command line in the error message.
|
|
67
103
|
*/
|
|
68
104
|
function run(args, cwd, label) {
|
|
69
105
|
const [cmd, ...cmdArgs] = args;
|
|
106
|
+
const target = _spawnTarget(_resolveExecutable(cmd), cmdArgs);
|
|
70
107
|
try {
|
|
71
|
-
return execFileSync(
|
|
108
|
+
return execFileSync(target.command, target.args, {
|
|
72
109
|
cwd,
|
|
73
110
|
encoding: "utf-8",
|
|
74
111
|
stdio: ["pipe", "pipe", "pipe"],
|
package/dist/sandbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACN,qBAAqB,EACrB,eAAe,GACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,qEAAqE;AACrE,SAAS,iBAAiB,CAAC,UAAqB;IAC/C,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3D,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CACjC,OAAe,EACf,WAA4B,OAAO,CAAC,QAAQ,EAC5C,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACzC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC;IAEjD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC;SACvD,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,8EAA8E;IAC9E,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;YAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAChD,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3E,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC;YACjE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAChD,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,KAAa;IACtD,MAAM,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/B,
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abdwhb-png/pi-test-harness",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Test harness for pi extensions — in-process session testing, package install verification, and subprocess mocking",
|
|
5
5
|
"author": "Abdullah Alblushi (fork)",
|
|
6
6
|
"license": "MIT",
|
package/src/sandbox.ts
CHANGED
|
@@ -72,14 +72,58 @@ export function _resolveExecutable(
|
|
|
72
72
|
return command;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
/**
|
|
76
|
+
* How to launch a resolved command, without Node's deprecated shell form.
|
|
77
|
+
*
|
|
78
|
+
* **Why**: on Windows a `.cmd`/`.bat` is not an executable image — it needs a
|
|
79
|
+
* terminal. Since the CVE-2024-27980 fix, child_process refuses to launch one
|
|
80
|
+
* with `shell: false` and fails with `EINVAL`, so resolving `sfw` to `sfw.CMD`
|
|
81
|
+
* was necessary but not sufficient.
|
|
82
|
+
*
|
|
83
|
+
* Node documents three ways to launch it: `exec()`, `{ shell: true }`, or
|
|
84
|
+
* spawning `cmd.exe` with the script as an argument. The shell option is
|
|
85
|
+
* deprecated as a *runtime* warning in Node 24 (DEP0190) because an argument
|
|
86
|
+
* array passed that way is only space-joined, never escaped. This takes the
|
|
87
|
+
* third route — what `exec()` does internally — so the argument array reaches the
|
|
88
|
+
* child intact and no deprecated form is used.
|
|
89
|
+
*
|
|
90
|
+
* Real binaries (`.exe`, or a path with no shim extension) spawn directly and
|
|
91
|
+
* stay shell-free on every platform.
|
|
92
|
+
*
|
|
93
|
+
* Known limitation, unchanged from the shell form: cmd.exe applies its own
|
|
94
|
+
* parsing to the arguments that follow the script, so an argument containing
|
|
95
|
+
* spaces has to survive it. Only the script path is guaranteed, because Node
|
|
96
|
+
* quotes an argument that contains spaces when it builds the command line.
|
|
97
|
+
*
|
|
98
|
+
* Exported for unit testing — not part of the public API contract.
|
|
99
|
+
* @internal
|
|
100
|
+
*/
|
|
101
|
+
export function _spawnTarget(
|
|
102
|
+
resolved: string,
|
|
103
|
+
args: string[],
|
|
104
|
+
platform: NodeJS.Platform = process.platform,
|
|
105
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
106
|
+
): { command: string; args: string[] } {
|
|
107
|
+
if (platform !== "win32" || !/\.(cmd|bat)$/i.test(resolved)) {
|
|
108
|
+
return { command: resolved, args };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// `/d` skips AutoRun scripts, `/s` keeps cmd's parsing of the rest as-is.
|
|
112
|
+
return {
|
|
113
|
+
command: env.ComSpec ?? "cmd.exe",
|
|
114
|
+
args: ["/d", "/s", "/c", resolved, ...args],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
75
118
|
/**
|
|
76
119
|
* Run a command via execFileSync with safe string conversion for the full
|
|
77
120
|
* command line in the error message.
|
|
78
121
|
*/
|
|
79
122
|
function run(args: string[], cwd: string, label: string): string {
|
|
80
123
|
const [cmd, ...cmdArgs] = args;
|
|
124
|
+
const target = _spawnTarget(_resolveExecutable(cmd), cmdArgs);
|
|
81
125
|
try {
|
|
82
|
-
return execFileSync(
|
|
126
|
+
return execFileSync(target.command, target.args, {
|
|
83
127
|
cwd,
|
|
84
128
|
encoding: "utf-8",
|
|
85
129
|
stdio: ["pipe", "pipe", "pipe"],
|