11import { join } from 'node:path' ;
22import { pathToFileURL } from 'node:url' ;
3+ import vm from 'node:vm' ;
34import { buildAndGetResults } from 'test-helper' ;
45import { describe , expect , test } from 'vitest' ;
56
@@ -22,20 +23,31 @@ test('shims for __dirname and __filename in ESM', async () => {
2223describe ( 'shims for `import.meta.url` in CJS' , ( ) => {
2324 test ( 'CJS should apply shims' , async ( ) => {
2425 const fixturePath = join ( __dirname , 'cjs' ) ;
25- const { entryFiles } = await buildAndGetResults ( fixturePath ) ;
26- const exported = await import ( entryFiles . cjs ) ;
26+ const { entryFiles, entries } = await buildAndGetResults ( fixturePath ) ;
27+ // `module.require` is not available in Vitest runner context. Manually create a context to run the CJS code.
28+ // As a temporary solution, we use `module.require` to avoid potential collision with module scope variable `require`.
29+ const cjsCode = entries . cjs ;
30+ const context = vm . createContext ( {
31+ require,
32+ exports,
33+ module : { require } ,
34+ __filename : entryFiles . cjs ,
35+ } ) ;
36+ const { importMetaUrl, requiredModule } = vm . runInContext ( cjsCode , context ) ;
2737 const fileUrl = pathToFileURL ( entryFiles . cjs ) . href ;
28- expect ( exported . default ) . toBe ( fileUrl ) ;
38+ expect ( importMetaUrl ) . toBe ( fileUrl ) ;
39+ expect ( requiredModule ) . toBe ( 'ok' ) ;
2940 } ) ;
3041
3142 test ( 'ESM should not be affected by CJS shims configuration' , async ( ) => {
3243 const fixturePath = join ( __dirname , 'cjs' ) ;
3344 const { entries } = await buildAndGetResults ( fixturePath ) ;
3445 expect ( entries . esm ) . toMatchInlineSnapshot ( `
35- "const url = import.meta.url;
36- const readUrl = url;
37- /* harmony default export */ const src = readUrl;
38- export { src as default };
46+ "import * as __WEBPACK_EXTERNAL_MODULE_node_module__ from \\"node:module\\";
47+ const importMetaUrl = import.meta.url;
48+ const src_require = (0, __WEBPACK_EXTERNAL_MODULE_node_module__.createRequire)(import.meta.url);
49+ const requiredModule = src_require('./ok.cjs');
50+ export { importMetaUrl, requiredModule };
3951 "
4052 ` ) ;
4153 } ) ;
0 commit comments