So, I've got a Node/TS project which unit test suite was using uvu
, and I'm migrating it to vitest
to try it out.
In one of my tests, I have the following:
const presetPath = path.resolve(__dirname, './fixtures/basic-preset.ts')
const preset = await importPresetFile(presetPath)
There is an issue with __dirname
there, it returns /D:/Code/projects/preset/preset/packages/core/test
instead of D:/Code/projects/preset/preset/packages/core/test
(there is a leading /
).
This leads to another error where I can't import the preset (using egoist/bundle-require
, not sure if relevant here).
Full trace
➜ p vitest import
Vitest is currently in closed beta exclusively for Sponsors
Become a Sponsor of https://github.com/sponsors/patak-js or https://github.com/sponsors/antfu
to access the source code and issues tracker 💖
Running tests under D:\Code\projects\preset\preset\packages\core
preset:core:import /D:/Code/projects/preset/preset/packages/core/test D:\D:\Code\projects\preset\preset\packages\core\test\fixtures\basic-preset.ts +0ms
preset:core:import Importing "D:\D:\Code\projects\preset\preset\packages\core\test\fixtures\basic-preset.ts" with bundle-require." +0ms
> test\import.test.ts
\ typescript presets can be imported
> test\import.test.ts
× typescript presets can be imported
→ error: Could not resolve "D:\\D:\\Code\\projects\\preset\\preset\\packages\\core\\test\\fixtures\\basic-preset.ts"
Failed Tests (1)
✖ FAIL typescript presets can be imported
Error: Build failed with 1 error:
error: Could not resolve "D:\\D:\\Code\\projects\\preset\\preset\\packages\\core\\test\\fixtures\\basic-preset.ts"
at failureErrorWithLog (D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:1493:15)
at D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:1151:28
at runOnEndCallbacks (D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:941:63)
at buildResponseToResult (D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:1149:7)
at D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:1258:14
at D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:629:9
at handleIncomingPacket (D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:726:9)
at Socket.readFromStdout (D:\Code\projects\preset\preset\packages\core\node_modules\.pnpm\[email protected]\node_modules\esbuild\lib\main.js:596:7)
at Socket.emit (node:events:390:28)
at addChunk (node:internal/streams/readable:315:12) {
errors: [
{
detail: undefined,
location: null,
notes: [],
pluginName: '',
text: 'Could not resolve "D:\\\\D:\\\\Code\\\\projects\\\\preset\\\\preset\\\\packages\\\\core\\\\test\\\\fixtures\\\\basic-preset.ts"'
}
],
warnings: []
}
Passed 0 / 1
Failed 1 / 1
Time 737.49ms
The filepath
given to bundleRequire
is simply presetPath
, shown in the first snippet, so the path with the leading /
. When manually removing the leading /
and trying to import my TypeScript file with bundleRequire
, everything works as expected.
I tried patching https://github.com/antfu-sponsors/vitest/blob/36604be3496eaa6949443138b93310fdc7310ae1/src/node/node.ts#L96 but it doesn't work either, given how Vite works:
node:internal/errors:464
ErrorCaptureStackTrace(err);
^
Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only file and data URLs are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'd:'
at new NodeError (node:internal/errors:371:5)
at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:1016:11)
at Loader.resolve (node:internal/modules/esm/loader:89:40)
at Loader.getModuleJob (node:internal/modules/esm/loader:242:28)
at Loader.import (node:internal/modules/esm/loader:177:28)
at importModuleDynamically (node:internal/modules/esm/translators:115:35)
at exports.importModuleDynamicallyCallback (node:internal/process/esm_loader:30:14)
at cachedRequest (file:///D:/Code/projects/preset/preset/packages/core/node_modules/.pnpm/[email protected][email protected]/node_modules/vitest/dist/node/node.js:137:13)
at request (file:///D:/Code/projects/preset/preset/packages/core/node_modules/.pnpm/[email protected][email protected]/node_modules/vitest/dist/node/node.js:104:20)
at D:/Code/projects/preset/preset/packages/core/node_modules/.pnpm/[email protected][email protected]/node_modules/vitest/dist/run/index.js:1:196 {
code: 'ERR_UNSUPPORTED_ESM_URL_SCHEME'
}
So, not exactly sure how to fix this. Maybe it's just a matter of properly configuring vite.config.ts
?