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

Open
#14,214 0 comments 0 reactions 1 assignee Claimed by @MattieTK View on GitHub
awaiting-response:cloudflare package:vitest 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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.