Skip to content

Commit c2169b3

Browse files
committed
fix: add extension when relative import already have an extension
1 parent 3ad28c1 commit c2169b3

File tree

6 files changed

+39
-13
lines changed

6 files changed

+39
-13
lines changed

e2e/cases/bundle-false/index.test.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,21 @@ test('auto add extension for relative import', async () => {
4444
const fixturePath = join(__dirname, 'relative-import');
4545
const { contents } = await buildAndGetResults(fixturePath);
4646

47-
expect(Object.values(contents.esm)[1]).toContain(
47+
for (const importer of [
4848
'import * as __WEBPACK_EXTERNAL_MODULE__bar_js__ from "./bar.js";',
49-
);
50-
expect(Object.values(contents.cjs)[1]).toContain(
49+
'import * as __WEBPACK_EXTERNAL_MODULE__baz_js__ from "./baz.js";',
50+
'import * as __WEBPACK_EXTERNAL_MODULE__foo_js__ from "./foo.js";',
51+
'import * as __WEBPACK_EXTERNAL_MODULE__qux_js__ from "./qux.js";',
52+
]) {
53+
expect(Object.values(contents.esm)[3]).toContain(importer);
54+
}
55+
56+
for (const requirer of [
5157
'var external_bar_cjs_namespaceObject = require("./bar.cjs");',
52-
);
58+
'var external_baz_cjs_namespaceObject = require("./baz.cjs");',
59+
'var external_foo_cjs_namespaceObject = require("./foo.cjs");',
60+
'var external_qux_cjs_namespaceObject = require("./qux.cjs");',
61+
]) {
62+
expect(Object.values(contents.cjs)[3]).toContain(requirer);
63+
}
5364
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const baz = 'baz';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const foo = 'foo';
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
import { bar } from './bar';
2+
import { baz } from './baz.js';
3+
// @ts-ignore
4+
import { foo } from './foo.js';
5+
// @ts-ignore
6+
import { qux } from './qux.cjs';
27

3-
export const foo = 'foo' + bar;
8+
export const text = foo + bar + baz + qux;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
qux: 'qux',
3+
};

packages/core/src/config.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import fs from 'node:fs';
2-
import path, { dirname, isAbsolute, join } from 'node:path';
2+
import path, { dirname, extname, isAbsolute, join } from 'node:path';
33
import {
44
type RsbuildConfig,
55
type RsbuildInstance,
@@ -475,13 +475,18 @@ const composeBundleConfig = (
475475
// Prevent from externalizing entry modules here.
476476
if (data.contextInfo.issuer) {
477477
// Node.js ECMAScript module loader does no extension searching.
478-
// So we add a file extension here when data.request is a relative path
479-
return callback(
480-
null,
481-
data.request[0] === '.'
482-
? `${data.request}${jsExtension}`
483-
: data.request,
484-
);
478+
// Add a file extension according to autoExtension config
479+
// when data.request is a relative path and do not have an extension.
480+
// If data.request already have an extension, we replace it with new extension
481+
// This may result in a change in semantics,
482+
// user should use copy to keep origin file or use another separate entry to deal this
483+
let request = data.request;
484+
if (data.request[0] === '.') {
485+
request = extname(data.request)
486+
? request.replace(/\.[^.]+$/, jsExtension)
487+
: `${request}${jsExtension}`;
488+
}
489+
return callback(null, request);
485490
}
486491
callback();
487492
},

0 commit comments

Comments
 (0)