## Problem
The Windows variant of the `Execution tests > Executes external commands
> handles timeouts` test (`test/exec-tests.ts`) is flaky on CI. It ran:
```ts
exec.execute('powershell', ['-Command', '"sleep 5"'], {timeoutMs: 10})
```
The embedded double-quotes make `"sleep 5"` a **string literal** that
PowerShell just echoes and exits immediately — it never sleeps. The test
only "passed" by racing the 10 ms timeout against PowerShell's startup.
When PowerShell wins the race it returns `code: 0` / `stdout: "sleep 5"`
instead of the expected killed result, intermittently failing the
Windows `test` job.
(Spotted while verifying CI on #8737 — the only failure there was this
test, unrelated to that PR.)
## Fix
Use `Start-Sleep -Seconds 5`, which actually blocks, so the 10 ms
timeout deterministically kills it. The expected result block is
unchanged (`code: 1` is what `taskkill` yields for an externally-killed
process on Windows). Added a comment explaining the rationale, and fixed
the `timouts` → `timeouts` typo in both the Windows and POSIX test
names.
## Testing
- POSIX branch runs locally: `npx vitest run test/exec-tests.ts` → 22
passed.
- The Windows branch can only run on a Windows runner; the change is
confined to the command string and leaves the assertion identical.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Maps env vars just like we map everything else, to catch all cases where
"app dir" is an input to jailed processes, the jailed process only sees
the "right" path (`/app/something`).
Tested locally and fixes the dot net "read only `/nosym`" thing while
keeping the `/nosym` behaviour etc
Some operations set `exec`'s `maxOutput` to a value larger than the max
string length. This change ensures we always cap output to the engine's
string limit (currently 512 MB in recent Node versions).
This also tweaks handling when reaching the string limit to ensure
adding the "truncated" message itself does not send us beyond the limit.
Makes the Compiler Explorer app, and all the tooling ESM compatible.
Things that have been done:
1. The package.json has `type: module` now
2. All relative imports have a .js ending
3. All directory imports are now directory/index.js to comply with ESM
standards
4. Dependency node-graceful is now imported into tree, because the
package is broken under esm
5. Dependency p-queue has been bumped to 7.x with ESM support
6. Dependency profanities has been bumped to 3.x with ESM support
7. Webpack config is now both ESM and CommonJS compatible
8. Non-ESM compatible imports have been rewritten
9. ESLint configuration has been tweaked to not fail on .js imports
10. Mocha is now hacked together and ran with ts-node-esm
11. Webpack is now hacked together and ran with ts-node-esm
12. Webpack config is now ESM compatible, so that it can be used in the
dev server
13. Cypress code still runs commonjs, and has been excluded from the
tsconfig
14. All sinon mock tests have been commented out, because sinon module
mocks do not work with ESModules (because ESModules are immutable)
A lot of tests are now giving warnings/errors to stdout, yet still pass.
Docenizer codegenerator scripts have been updated, but I did not re-run
them, and instead just changed their code.
---------
Co-authored-by: Matt Godbolt <matt@godbolt.org>