Skip to content

Commit 87c26db

Browse files
committed
feat(vitest-pool-workers): add vite pre-bundling support
1 parent 5ed2744 commit 87c26db

File tree

9 files changed

+548
-542
lines changed

9 files changed

+548
-542
lines changed

fixtures/vitest-pool-workers-examples/external-package-resolution/src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { Toucan } from "toucan-js";
2+
// Test pre-bundling dependency relies on exports field without a default entrypoint
3+
// @see https://github.com/cloudflare/workers-sdk/issues/6591
4+
import "discord-api-types/v10";
5+
// Test pre-bundling dependencies with browser field mapping
6+
// @see https://github.com/cloudflare/workers-sdk/issues/6581
7+
import "@microlabs/otel-cf-workers";
28

39
export default {
410
async fetch(): Promise<Response> {

fixtures/vitest-pool-workers-examples/external-package-resolution/vitest.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ import { defineWorkersProject } from "@cloudflare/vitest-pool-workers/config";
22

33
export default defineWorkersProject({
44
test: {
5+
deps: {
6+
optimizer: {
7+
ssr: {
8+
enabled: true,
9+
include: ["discord-api-types/v10", "@microlabs/otel-cf-workers"],
10+
},
11+
},
12+
},
513
poolOptions: {
614
workers: {
715
wrangler: { configPath: "./wrangler.toml" },

fixtures/vitest-pool-workers-examples/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@
1313
"devDependencies": {
1414
"@cloudflare/vitest-pool-workers": "workspace:*",
1515
"@cloudflare/workers-types": "^4.20250204.0",
16+
"@microlabs/otel-cf-workers": "1.0.0-rc.45",
1617
"@types/node": "catalog:default",
18+
"discord-api-types": "0.37.98",
1719
"ext-dep": "file:./internal-module-resolution/vendor/ext-dep",
1820
"jose": "^5.2.2",
1921
"miniflare": "workspace:*",
2022
"run-script-os": "^1.1.6",
21-
"toucan-js": "^3.3.1",
23+
"toucan-js": "3.4.0",
2224
"typescript": "catalog:default",
25+
"vite": "catalog:default",
2326
"vitest": "catalog:default",
2427
"wrangler": "workspace:*"
2528
},

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"tree-kill": "^1.2.2",
5050
"turbo": "^2.2.3",
5151
"typescript": "catalog:default",
52-
"vite": "^5.0.12",
52+
"vite": "catalog:default",
5353
"vitest": "catalog:default"
5454
},
5555
"packageManager": "[email protected]",

packages/vitest-pool-workers/src/config/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import assert from "node:assert";
22
import crypto from "node:crypto";
33
import fs from "node:fs/promises";
4+
import { builtinModules } from "node:module";
45
import path from "node:path";
56
import { MessageChannel, receiveMessageOnPort } from "node:worker_threads";
67
import type {
@@ -110,6 +111,13 @@ function ensureArrayExcludes<T>(array: T[], items: T[]) {
110111
const requiredConditions = ["workerd", "worker", "browser"];
111112
const requiredMainFields = ["browser", "module", "jsnext:main", "jsnext"];
112113

114+
const cloudflareBuiltInModules = [
115+
"cloudflare:email",
116+
"cloudflare:sockets",
117+
"cloudflare:workers",
118+
"cloudflare:workflows",
119+
];
120+
113121
function createConfigPlugin(): Plugin<WorkersConfigPluginAPI> {
114122
// Use a unique ID for each `cloudflare:test` module so updates in one `main`
115123
// don't trigger re-runs in all other projects, just the one that changed.
@@ -147,6 +155,17 @@ function createConfigPlugin(): Plugin<WorkersConfigPluginAPI> {
147155
// https://github.com/vitejs/vite/blob/v5.1.4/packages/vite/src/node/plugins/resolve.ts#L175
148156
config.ssr.target = "webworker";
149157

158+
// Pre-bundling dependencies with vite
159+
config.test.deps ??= {};
160+
config.test.deps.optimizer ??= {};
161+
config.test.deps.optimizer.ssr ??= {};
162+
config.test.deps.optimizer.ssr.enabled ??= true;
163+
config.test.deps.optimizer.ssr.exclude ??= [];
164+
ensureArrayIncludes(config.test.deps.optimizer.ssr.exclude, [
165+
...cloudflareBuiltInModules,
166+
...builtinModules.concat(builtinModules.map((m) => `node:${m}`)),
167+
]);
168+
150169
// Ideally, we would force `pool` to be @cloudflare/vitest-pool-workers here,
151170
// but the tests in `packages/vitest-pool-workers` define `pool` as "../..".
152171
config.test.pool ??= "@cloudflare/vitest-pool-workers";

packages/vitest-pool-workers/src/pool/module-fallback.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ function trimSuffix(suffix: string, value: string) {
4141
return value.substring(0, value.length - suffix.length);
4242
}
4343

44+
/**
45+
* When pre-bundling is enabled, Vite will add a hash to the end of the file path
46+
* e.g. `/node_modules/.vite/deps/my-dep.js?v=f3sf2ebd`
47+
*
48+
* @see https://vite.dev/guide/features.html#npm-dependency-resolving-and-pre-bundling
49+
* @see https://github.com/cloudflare/workers-sdk/pull/5673
50+
*/
51+
const versionHashRegExp = /\?v=[0-9a-f]+$/;
52+
53+
function trimViteVersionHash(filePath: string) {
54+
return filePath.replace(versionHashRegExp, "");
55+
}
56+
4457
// RegExp for path suffix to force loading module as specific type.
4558
// (e.g. `/path/to/module.wasm?mf_vitest_force=CompiledWasm`)
4659
// This suffix will be added by the pool when fetching a module that matches a
@@ -323,7 +336,8 @@ async function viteResolve(
323336
// (Specifically, the "tinyrainbow" module imports `node:tty` as `tty`)
324337
return id;
325338
}
326-
return resolved.id;
339+
340+
return trimViteVersionHash(resolved.id);
327341
}
328342

329343
type ResolveMethod = "import" | "require";

packages/workers-editor-shared/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"eslint": "^8.49.0",
4343
"react": "^18.3.1",
4444
"react-dom": "^18.3.1",
45-
"vite": "^5.0.12",
45+
"vite": "catalog:default",
4646
"vite-plugin-dts": "^4.0.1"
4747
},
4848
"peerDependencies": {

0 commit comments

Comments
 (0)