Skip to content

Commit 9d1e9ab

Browse files
authored
fix: cjs import.meta.url shims in async chunks (#1281)
1 parent 2fcdaa4 commit 9d1e9ab

File tree

5 files changed

+52
-27
lines changed

5 files changed

+52
-27
lines changed

packages/core/src/plugins/EntryChunkPlugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,11 @@ class EntryChunkPlugin {
109109
const isJs = JS_EXTENSIONS_PATTERN.test(filename);
110110
if (!isJs) return;
111111

112+
this.shimsInjectedAssets.add(filename);
113+
112114
const name = chunk.name;
113115
if (!name) return;
114116

115-
this.shimsInjectedAssets.add(filename);
116-
117117
const shebangEntry = this.shebangEntries[name];
118118
if (shebangEntry) {
119119
this.shebangEntries[filename] = shebangEntry;

tests/integration/shims/cjs/rslib.config.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ export default defineConfig({
66
generateBundleEsmConfig(),
77
generateBundleCjsConfig({
88
shims: {
9-
cjs: { 'import.meta.url': true },
9+
cjs: {
10+
'import.meta.url': true,
11+
},
1012
},
1113
}),
1214
],
1315
output: {
14-
copy: [{ from: 'src/ok.cjs' }],
16+
copy: [
17+
{
18+
from: 'src/ok.cjs',
19+
},
20+
],
1521
},
1622
source: {
1723
entry: {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const dynamic = import.meta.url;
2+
3+
export { dynamic };

tests/integration/shims/cjs/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ const importMetaUrl = import.meta.url;
44
const require = createRequire(import.meta.url);
55
const requiredModule = require('./ok.cjs');
66

7+
const dynamicImportMetaUrl = async () => {
8+
const { dynamic } = await import('./dynamic');
9+
return dynamic;
10+
};
11+
712
// https://github.com/web-infra-dev/rslib/issues/425
813
import { fileURLToPath } from 'url';
914

@@ -13,4 +18,4 @@ console.log(__filename);
1318
// https://github.com/web-infra-dev/rslib/pull/399
1419
export const module = null;
1520

16-
export { importMetaUrl, requiredModule, __filename };
21+
export { importMetaUrl, requiredModule, dynamicImportMetaUrl, __filename };

tests/integration/shims/index.test.ts

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import fs from 'node:fs';
2+
import { createRequire } from 'node:module';
23
import path, { join } from 'node:path';
34
import { pathToFileURL } from 'node:url';
45
import vm from 'node:vm';
56
import { describe, expect, test } from '@rstest/core';
6-
import { buildAndGetResults } from 'test-helper';
7+
import { buildAndGetResults, queryContent } from 'test-helper';
78

89
describe('ESM shims', async () => {
910
const fixturePath = join(__dirname, 'esm');
@@ -107,42 +108,52 @@ describe('ESM shims disabled', async () => {
107108
describe('CJS shims', () => {
108109
test('import.meta.url', async () => {
109110
const fixturePath = join(__dirname, 'cjs');
110-
const { entryFiles, entries } = await buildAndGetResults({ fixturePath });
111+
const { entryFiles, entries, contents } = await buildAndGetResults({
112+
fixturePath,
113+
});
111114
// `module.require` is not available in Rstest runner context. Manually create a context to run the CJS code.
112115
// As a temporary solution, we use `module.require` to avoid potential collision with module scope variable `require`.
113116
const cjsCode = entries.cjs;
117+
const req = createRequire(entryFiles.cjs);
114118
const context = vm.createContext({
115-
require,
119+
require: req,
116120
exports,
117-
module: { require },
121+
module: { require: req },
118122
__filename: entryFiles.cjs,
119123
});
120-
const { importMetaUrl, requiredModule } = vm.runInContext(cjsCode, context);
124+
const { importMetaUrl, dynamicImportMetaUrl, requiredModule } =
125+
vm.runInContext(cjsCode, context);
121126
const fileUrl = pathToFileURL(entryFiles.cjs).href;
127+
const dynamicUrl = await dynamicImportMetaUrl();
128+
const { content: dynamicContent } = queryContent(
129+
contents.cjs!,
130+
/cjs\/1~7\.cjs/,
131+
);
132+
122133
expect(importMetaUrl).toBe(fileUrl);
134+
expect(dynamicUrl).toBe(fileUrl.replace('index.cjs', '1~7.cjs'));
123135
expect(requiredModule).toBe('ok');
124-
expect(
125-
cjsCode.startsWith(
126-
`"use strict";\nconst __rslib_import_meta_url__ = /*#__PURE__*/ function() {`,
127-
),
128-
).toBe(true);
136+
137+
for (const code of [cjsCode, dynamicContent]) {
138+
expect(
139+
code.startsWith(
140+
`"use strict";\nconst __rslib_import_meta_url__ = /*#__PURE__*/ function() {`,
141+
),
142+
).toBe(true);
143+
}
129144
});
130145

131146
test('ESM should not be affected by CJS shims configuration', async () => {
132147
const fixturePath = join(__dirname, 'cjs');
133148
const { entries } = await buildAndGetResults({ fixturePath });
134-
expect(entries.esm).toMatchInlineSnapshot(`
135-
"import { createRequire } from "node:module";
136-
import { fileURLToPath } from "url";
137-
const importMetaUrl = import.meta.url;
138-
const src_require = createRequire(import.meta.url);
139-
const requiredModule = src_require('./ok.cjs');
140-
const src_filename = fileURLToPath(import.meta.url);
141-
console.log(src_filename);
142-
const src_module = null;
143-
export { src_filename as __filename, importMetaUrl, src_module as module, requiredModule };
144-
"
145-
`);
149+
150+
for (const code of [
151+
'const importMetaUrl = import.meta.url;',
152+
'const src_require = createRequire(import.meta.url);',
153+
'const src_filename = fileURLToPath(import.meta.url);',
154+
]) {
155+
expect(entries.esm).toContain(code);
156+
}
146157
});
147158
});
148159

0 commit comments

Comments
 (0)