Skip to content

Commit 73d26d8

Browse files
committed
fix: fix browser replacement on direct resource require
1 parent 9fc6bc0 commit 73d26d8

3 files changed

Lines changed: 46 additions & 3 deletions

File tree

spec/package-reader.spec.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,39 @@ test('packageReader reads browser replacement in package.json', t => {
509509
});
510510
});
511511

512+
test('packageReader uses browser replacement in package.json to normalize resource read', t => {
513+
getReader('foo', {
514+
'node_modules/foo/package.json': `{
515+
"name": "foo",
516+
"main": "index",
517+
"browser": {
518+
"module-a": false,
519+
"module-b.js": "./shims/module/b.js",
520+
"./server/only.js": "./shims/client-only.js"
521+
}
522+
}`,
523+
'node_modules/foo/shims/client-only.js': "require('module-a');require('module-b.js');require('module-c');"
524+
}).then(r => {
525+
r.readResource('server/only').then(
526+
unit => {
527+
t.deepEqual(unit, {
528+
path: 'node_modules/foo/shims/client-only.js',
529+
contents: "require('__ignore__');require('./module/b');require('module-c');",
530+
moduleId: 'foo/shims/client-only',
531+
packageName: 'foo'
532+
});
533+
534+
t.equal(r.name, 'foo');
535+
t.equal(r.mainPath, 'index.js');
536+
},
537+
err => {
538+
t.fail(err.message);
539+
}
540+
).then(t.end);
541+
});
542+
});
543+
544+
512545
test('packageReader uses browser replacement in package.json to normalize file contents', t => {
513546
getReader('foo', {
514547
'node_modules/foo/package.json': `{

src/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ export default class Bundler {
160160
return reader.readMain()
161161
.then(unit => this.capture(unit))
162162
.then(tracedUnit => {
163-
this._ensureNpmMainAlias(tracedUnit, pkg.name);
163+
this._ensureNpmAlias(tracedUnit, pkg.name);
164164
});
165165
}
166166
});
@@ -186,7 +186,10 @@ export default class Bundler {
186186
})
187187
}
188188

189-
_ensureNpmMainAlias(tracedUnit, id) {
189+
// this ensures alias to package main, and alias to direct require
190+
// to some browser replacement.
191+
// e.g. readable-stream/readable -> readable-stream/readable-browser
192+
_ensureNpmAlias(tracedUnit, id) {
190193
if (this._moduleId_done.has(id)) return;
191194

192195
const defined = tracedUnit.defined;
@@ -290,7 +293,7 @@ export default class Bundler {
290293
.then(unit => this.capture(unit))
291294
.then(tracedUnit => {
292295
if (!resource) {
293-
this._ensureNpmMainAlias(tracedUnit, bareId);
296+
this._ensureNpmAlias(tracedUnit, bareId);
294297
}
295298
})
296299
.catch(err => {

src/package-reader.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ export default class PackageReader {
5454

5555
let fullResource = resParts.join('/');
5656

57+
if (ext(fullResource) === '.js') fullResource = fullResource.slice(-3);
58+
const replacement = this.browserReplacement['./' + fullResource];
59+
if (replacement) {
60+
// replacement is always local, remove leading ./
61+
fullResource = replacement.slice(2);
62+
}
63+
5764
return this._nodejsLoad(fullResource).then(
5865
filePath => this._readFile(filePath),
5966
() => {

0 commit comments

Comments
 (0)