diff --git a/.changeset/fix-raw-imports.md b/.changeset/fix-raw-imports.md new file mode 100644 index 000000000000..e2a54c2c68c2 --- /dev/null +++ b/.changeset/fix-raw-imports.md @@ -0,0 +1,10 @@ +--- +"@cloudflare/vitest-pool-workers": patch +--- + +fix: allow Vite query parameters like `?raw` on `.sql` file imports + +Importing `.sql` files with Vite query parameters (e.g., `import sql from "./query.sql?raw"`) would fail with "No such module" errors in vitest-pool-workers 0.12.x. Both import styles now work: + +- `import sql from "./query.sql?raw"` (Vite handles the `?raw` transform) +- `import sql from "./query.sql"` (loaded as Text module) diff --git a/fixtures/vitest-pool-workers-examples/module-resolution/src/test.sql b/fixtures/vitest-pool-workers-examples/module-resolution/src/test.sql new file mode 100644 index 000000000000..c0e59fb9efa9 --- /dev/null +++ b/fixtures/vitest-pool-workers-examples/module-resolution/src/test.sql @@ -0,0 +1 @@ +SELECT * FROM users WHERE id = 1; diff --git a/fixtures/vitest-pool-workers-examples/module-resolution/test/index.d.ts b/fixtures/vitest-pool-workers-examples/module-resolution/test/index.d.ts index 606ef3c0e836..f20a62840b48 100644 --- a/fixtures/vitest-pool-workers-examples/module-resolution/test/index.d.ts +++ b/fixtures/vitest-pool-workers-examples/module-resolution/test/index.d.ts @@ -2,3 +2,9 @@ declare module "ext-dep" { var x: number; export default x; } + +// .sql files are loaded as Text modules by default in wrangler +declare module "*.sql" { + const content: string; + export default content; +} diff --git a/fixtures/vitest-pool-workers-examples/module-resolution/test/index.spec.ts b/fixtures/vitest-pool-workers-examples/module-resolution/test/index.spec.ts index 3b1ce706d030..e312272d5b0a 100644 --- a/fixtures/vitest-pool-workers-examples/module-resolution/test/index.spec.ts +++ b/fixtures/vitest-pool-workers-examples/module-resolution/test/index.spec.ts @@ -2,6 +2,8 @@ import { instrument } from "@microlabs/otel-cf-workers"; import { Utils } from "discord-api-types/v10"; import dep from "ext-dep"; import { assert, describe, test } from "vitest"; +import sqlPlain from "../src/test.sql"; +import sqlRaw from "../src/test.sql?raw"; describe("test", () => { test("resolves commonjs directory dependencies correctly", async () => { @@ -17,4 +19,10 @@ describe("test", () => { test("resolves dependency with mapping on the browser field", async () => { assert.isFunction(instrument); }); + + // Regression test for https://github.com/cloudflare/workers-sdk/issues/12049 + // Vite query parameters like ?raw should be handled by Vite, not module rules + test("resolves file with ?raw query parameter", async () => { + assert.equal(sqlRaw, sqlPlain); + }); }); diff --git a/fixtures/vitest-pool-workers-examples/tsconfig.workerd-test.json b/fixtures/vitest-pool-workers-examples/tsconfig.workerd-test.json index 892fbc62ea4b..61e1dbcf9d75 100644 --- a/fixtures/vitest-pool-workers-examples/tsconfig.workerd-test.json +++ b/fixtures/vitest-pool-workers-examples/tsconfig.workerd-test.json @@ -3,7 +3,8 @@ "compilerOptions": { "types": [ "@cloudflare/workers-types/experimental", - "@cloudflare/vitest-pool-workers" // For `cloudflare:test` types + "@cloudflare/vitest-pool-workers", // For `cloudflare:test` types + "vite/client" // For `?raw`, `?url`, etc. import types ] } } diff --git a/packages/vitest-pool-workers/src/pool/index.ts b/packages/vitest-pool-workers/src/pool/index.ts index 373d710f93a7..e4ecf1ac68d2 100644 --- a/packages/vitest-pool-workers/src/pool/index.ts +++ b/packages/vitest-pool-workers/src/pool/index.ts @@ -936,7 +936,9 @@ async function runTests( const maybeRule = compiledRules.find((rule) => testRegExps(rule.include, specifier) ); - if (maybeRule !== undefined) { + + // Skip if specifier already has query params (e.g. `?raw`), letting Vite handle it. + if (maybeRule !== undefined && !specifier.includes("?")) { const externalize = specifier + `?mf_vitest_force=${maybeRule.type}`; return { externalize }; }