Skip to content

Commit 7ecc905

Browse files
committed
fix: fix a missing package alias when main file is requested from an explicit require('packageName/main/path');
1 parent 99b4bba commit 7ecc905

2 files changed

Lines changed: 109 additions & 12 deletions

File tree

lib/package-reader.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,7 @@ module.exports = class PackageReader {
4040

4141
readMain() {
4242
return this.ensureMainPath()
43-
.then(() => this._readFile(this.mainPath))
44-
.then(unit => {
45-
// add alias from package name to main file module id.
46-
// but don't add alias from "foo" to "foo/main.css".
47-
const mExt = ext(unit.moduleId);
48-
const pExt = ext(this.name);
49-
if (mExt === pExt || (pExt === '.js' && !mExt)) {
50-
unit.alias = this.name;
51-
}
52-
return unit;
53-
});
43+
.then(() => this._readFile(this.mainPath));
5444
}
5545

5646
readResource(resource) {
@@ -91,7 +81,11 @@ module.exports = class PackageReader {
9181
// The requested id could be different from real id.
9282
// for example, some browser replacement.
9383
// e.g. readable-stream/readable -> readable-stream/readable-browser
94-
unit.alias = requested;
84+
if (unit.alias) {
85+
unit.alias = [unit.alias, requested];
86+
} else {
87+
unit.alias = requested;
88+
}
9589
}
9690
return unit;
9791
});
@@ -136,6 +130,17 @@ module.exports = class PackageReader {
136130

137131
// the replacement will be picked up by transformers/replace.js
138132
if (replacement) unit.replacement = replacement;
133+
134+
if (unit.moduleId === this.name + '/' + this.parsedMainId.bareId) {
135+
// add alias from package name to main file module id.
136+
// but don't add alias from "foo" to "foo/main.css".
137+
const mExt = ext(unit.moduleId);
138+
const pExt = ext(this.name);
139+
if (mExt === pExt || (pExt === '.js' && !mExt)) {
140+
unit.alias = this.name;
141+
}
142+
}
143+
139144
return unit;
140145
});
141146
}

test/package-reader.spec.js

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,35 @@ test('packageReader reads main file', t => {
137137
});
138138
});
139139

140+
test('packageReader reads resource file which is actually main', t => {
141+
getReader('foo', {
142+
'node_modules/foo/package.json': '{"name":"foo", "main": "index"}',
143+
'node_modules/foo/index.js': "lorem"
144+
}).then(r => {
145+
r.readResource('index').then(
146+
unit => {
147+
t.equal(r.version, 'N/A');
148+
t.deepEqual(unit, {
149+
path: 'node_modules/foo/index.js',
150+
contents: 'lorem',
151+
moduleId: 'foo/index',
152+
packageName: 'foo',
153+
packageMainPath: 'index.js',
154+
alias: 'foo',
155+
sourceMap: undefined
156+
});
157+
158+
t.equal(r.name, 'foo');
159+
t.equal(r.mainPath, 'index.js');
160+
t.deepEqual(r.browserReplacement, {});
161+
},
162+
err => {
163+
t.fail(err.message);
164+
}
165+
).then(t.end);
166+
});
167+
});
168+
140169
test('packageReader rejects invalid package.json', t => {
141170
getReader('foo', {
142171
'node_modules/foo/package.json': '{"name":"foo", "main": "index"',
@@ -427,6 +456,34 @@ test('packageReader reads deep relative resource', t => {
427456
});
428457
});
429458

459+
test('packageReader reads deep relative resource which is actually main', t => {
460+
getReader('foo', {
461+
'node_modules/foo/package.json': '{"name":"foo", "main": "dist/cjs/main"}',
462+
'node_modules/foo/dist/cjs/main.js': 'lorem',
463+
}).then(r => {
464+
r.readResource('main').then(
465+
unit => {
466+
t.deepEqual(unit, {
467+
path: 'node_modules/foo/dist/cjs/main.js',
468+
contents: 'lorem',
469+
moduleId: 'foo/dist/cjs/main',
470+
packageName: 'foo',
471+
packageMainPath: 'dist/cjs/main.js',
472+
alias: ['foo', 'foo/main'],
473+
sourceMap: undefined
474+
});
475+
476+
t.equal(r.name, 'foo');
477+
t.equal(r.mainPath, 'dist/cjs/main.js');
478+
t.deepEqual(r.browserReplacement, {});
479+
},
480+
err => {
481+
t.fail(err.message);
482+
}
483+
).then(t.end);
484+
});
485+
});
486+
430487
test('packageReader reads json resouce', t => {
431488
getReader('foo', {
432489
'node_modules/foo/package.json': '{"name":"foo", "main": "dist/cjs/main"}',
@@ -684,6 +741,41 @@ test('packageReader uses browser replacement in package.json to normalize main r
684741
});
685742
});
686743

744+
test('packageReader uses browser replacement in package.json to normalize resource read which is actually main', t => {
745+
getReader('foo', {
746+
'node_modules/foo/package.json': `{
747+
"name": "foo",
748+
"main": "index",
749+
"browser": {
750+
"./index.js": "./browser.js"
751+
}
752+
}`,
753+
'node_modules/foo/index.js': "index",
754+
'node_modules/foo/browser.js': "browser"
755+
}).then(r => {
756+
r.readResource('browser').then(
757+
unit => {
758+
t.deepEqual(unit, {
759+
path: 'node_modules/foo/browser.js',
760+
contents: "browser",
761+
moduleId: 'foo/browser',
762+
packageName: 'foo',
763+
packageMainPath: 'browser.js',
764+
alias: 'foo',
765+
replacement: { './index': './browser' },
766+
sourceMap: undefined
767+
});
768+
769+
t.equal(r.name, 'foo');
770+
t.equal(r.mainPath, 'browser.js');
771+
},
772+
err => {
773+
t.fail(err.message);
774+
}
775+
).then(t.end);
776+
});
777+
});
778+
687779
test('packageReader uses browser replacement in package.json to normalize main replacement', t => {
688780
getReader('foo', {
689781
'node_modules/foo/package.json': `{

0 commit comments

Comments
 (0)