cloudflare / cloudflare/workers-sdk
[vitest-pool-workers] No such module "cloudflare:test-internal" with Vitest 4.1.8 and Wrangler 4.98.0 on Windows
- Dominant language
- TypeScript
- Stars
- 4.5k
- Forks
- 1.5k
- Avg merge
- 3d 8h
- Merged PRs (30d)
- 187
Description
### What versions & operating system are you using?
```text
OS: Windows, running from PowerShell
Node.js: v24.14.1
npm: 11.11.0
wrangler: 4.98.0
vitest: 4.1.8
@cloudflare/vitest-pool-workers: 0.16.13
miniflare: 4.20260603.0
workerd: 1.20260603.1
```
Dependency tree:
```text
vouch-monorepo@1.0.0
+-- @vouch/cloudflare-api@1.0.0 -> ./workers/cloudflare-api
| +-- @cloudflare/vitest-pool-workers@0.16.13
| | +-- miniflare@4.20260603.0 deduped
| | +-- vitest@4.1.8 deduped
| | `-- wrangler@4.98.0 deduped
| `-- vitest@4.1.8 deduped
+-- vitest@4.1.8
`-- wrangler@4.98.0
+-- @cloudflare/unenv-preset@2.16.1
| `-- workerd@1.20260603.1 deduped
+-- miniflare@4.20260603.0
| `-- workerd@1.20260603.1 deduped
`-- workerd@1.20260603.1
```
### Please provide a link to a minimal reproduction
https://github.com/daejunnom/cloudflare-vitest-test-internal-repro
### Describe the Bug
I am trying to run Cloudflare Workers runtime tests using `@cloudflare/vitest-pool-workers` with Vitest 4 and Wrangler 4 on Windows.
The project has a separate Cloudflare Workers Vitest config and script:
```json
"test:worker:cf": "vitest run -c workers/cloudflare-api/vitest.cloudflare.config.mts --max-workers=1"
```
The Cloudflare-specific Vitest config uses the root import from `@cloudflare/vitest-pool-workers` and points to a committed Wrangler config file used for local type generation/testing:
```ts
import { fileURLToPath } from 'node:url';
import { defineConfig } from 'vitest/config';
import { cloudflareTest } from '@cloudflare/vitest-pool-workers';
const fromRoot = (targetPath: string) =>
fileURLToPath(new URL(`../../${targetPath}`, import.meta.url));
export default defineConfig({
plugins: [
cloudflareTest({
main: fromRoot('workers/cloudflare-api/src/index.ts'),
wrangler: {
configPath: fromRoot('workers/cloudflare-api/wrangler.types.jsonc'),
},
}),
],
test: {
include: ['workers/cloudflare-api/src/**/*.cf.test.ts'],
globals: true,
},
});
```
The test is intentionally minimal and only checks that configured Worker bindings are exposed:
```ts
import { describe, expect, it } from 'vitest';
import { env } from 'cloudflare:test';
describe('Cloudflare Workers runtime bindings', () => {
it('exposes configured Worker bindings', () => {
expect(env.DB).toBeDefined();
expect(env.ARTIFACTS).toBeDefined();
expect(env.TASK_QUEUE).toBeDefined();
});
});
```
The Wrangler config appears to be valid. `wrangler types` succeeds and generates the expected bindings:
```text
ARTIFACTS: R2Bucket;
DB: D1Database;
TASK_QUEUE: Queue;
VOUCH_API_URL: "http://localhost:3000";
VOUCH_ADMIN_EMAIL: "admin@vouch.security";
```
Command:
```bash
npm run cf:types
```
Result:
```text
Types written to workers/cloudflare-api/src/worker-configuration.d.ts
```
However, running the Cloudflare Workers Vitest pool test fails before any test file actually runs. The pool worker fails to start because the runtime cannot resolve the internal virtual module `cloudflare:test-internal`.
This does not appear to be a normal test assertion failure. It looks like the Cloudflare Vitest pool runner/runtime bootstrapping fails while trying to inject or resolve `cloudflare:test-internal`.
I have already tried the following:
* Using `@cloudflare/vitest-pool-workers` root import instead of the old `@cloudflare/vitest-pool-workers/config` path.
* Renaming the Vitest config to `.mts` to avoid ESM/CJS config loading issues.
* Removing `deps.optimizer` settings, because bundling `@cloudflare/vitest-pool-workers` itself caused Node built-in module resolution errors such as `node:util`, `node:net`, and `node:module`.
* Running `wrangler types` successfully before running the test.
* Separating regular Node-based Worker smoke tests from Cloudflare runtime tests.
The failure still happens at Cloudflare pool startup.
### Please provide any relevant error logs
Environment commands:
```powershell
PS C:\Users\...\Vouch> node -v
v24.14.1
PS C:\Users\...\Vouch> npm -v
11.11.0
PS C:\Users\...\Vouch> npx wrangler --version
⛅️ wrangler 4.98.0
───────────────────
```
Dependency versions:
```powershell
PS C:\Users\...\Vouch> npm ls vitest @cloudflare/vitest-pool-workers wrangler miniflare workerd
vouch-monorepo@1.0.0 C:\Users\...\Vouch
+-- @vouch/cloudflare-api@1.0.0 -> .\workers\cloudflare-api
| +-- @cloudflare/vitest-pool-workers@0.16.13
| | +-- miniflare@4.20260603.0 deduped
| | +-- vitest@4.1.8 deduped
| | `-- wrangler@4.98.0 deduped
| `-- vitest@4.1.8 deduped
+-- vitest@4.1.8
`-- wrangler@4.98.0
+-- @cloudflare/unenv-preset@2.16.1
| `-- workerd@1.20260603.1 deduped
+-- miniflare@4.20260603.0
| `-- workerd@1.20260603.1 deduped
`-- workerd@1.20260603.1
```
`wrangler types` succeeds:
```powershell
PS C:\Users\...\Vouch> npm run cf:types
> vouch-monorepo@1.0.0 cf:types
> wrangler types --config workers/cloudflare-api/wrangler.types.jsonc workers/cloudflare-api/src/worker-configuration.d.ts
⛅️ wrangler 4.98.0
───────────────────
Generating project types...
interface __BaseEnv_Env {
ARTIFACTS: R2Bucket;
DB: D1Database;
TASK_QUEUE: Queue;
VOUCH_API_URL: "http://localhost:3000";
VOUCH_ADMIN_EMAIL: "admin@vouch.security";
}
declare namespace Cloudflare {
interface GlobalProps {
mainModule: typeof import("./index");
}
interface Env extends __BaseEnv_Env {}
}
interface Env extends __BaseEnv_Env {}
Generating runtime types...
Runtime types generated.
────────────────────────────────────────────────────────────
✨ Types written to workers/cloudflare-api/src/worker-configuration.d.ts
```
Cloudflare Vitest pool fails:
```powershell
PS C:\Users\...\Vouch> npm run test:worker:cf
> vouch-monorepo@1.0.0 test:worker:cf
> vitest run -c workers/cloudflare-api/vitest.cloudflare.config.mts --max-workers=1
RUN v4.1.8 C:/Users/.../Vouch
[vitest-pool-workers] Failed to import "cloudflare:test-internal" from "index.mjs". To resolve this, try bundling the relevant dependency with Vite.
[vitest-pool-workers] Failed to import "cloudflare:test-internal" from "index.mjs". To resolve this, try bundling the relevant dependency with Vite.
Fallback service failed to fetch module; payload = ; spec = /?specifier=cloudflare%3Atest-internal&referrer=%2Findex.mjs&rawSpecifier=cloudflare%3Atest-internal
Fallback service failed to fetch module; payload = ; spec = /?specifier=cloudflare%3Atest-internal&referrer=%2Findex.mjs&rawSpecifier=cloudflare%3Atest-internal
service core:user:vitest-pool-workers-runner-: Uncaught Error: No such module "cloudflare:test-internal".
imported from "index.mjs"
Unhandled Error:
Error: [vitest-pool]: Failed to start cloudflare-pool worker for test files C:/Users/.../Vouch/workers/cloudflare-api/src/runtime/bindings.cf.test.ts.
Caused by: MiniflareCoreError [ERR_RUNTIME_FAILURE]: The Workers runtime failed to start. There was likely a problem with the workerd binary or your configuration.
Runtime stderr:
{"timestamp":"1780770952174","level":"error","source":"src/workerd/server/json-logger.c++:127","message":"service core:user:vitest-pool-workers-runner-: Uncaught Error: No such module \"cloudflare:test-internal\".\n imported from \"index.mjs\"","context_depth":0}
Serialized Error: { code: 'ERR_RUNTIME_FAILURE' }
Test Files no tests
Tests no tests
Errors 1 error
```
After the failure, Vitest also reports a delayed shutdown:
```text
close timed out after 10000ms
Tests closed successfully but something prevents Vite server from exiting
You can try to identify the cause by enabling "hanging-process" reporter.
```
Contributor guide
Assessment
This issue has not been assessed yet.