Skip to content
This repository was archived by the owner on Aug 4, 2021. It is now read-only.

Commit 4d5bf63

Browse files
committed
Merge pull request #14 from rollup/gh-8
support browser field
2 parents 45bb5e9 + 93df9c9 commit 4d5bf63

File tree

21 files changed

+183
-61
lines changed

21 files changed

+183
-61
lines changed

package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
"description": "Bundle third-party dependencies in node_modules",
44
"version": "1.1.0",
55
"devDependencies": {
6+
"babel-preset-es2015": "^6.3.13",
67
"babel-preset-es2015-rollup": "^1.0.0",
8+
"babel-register": "^6.3.13",
79
"es5-ext": "^0.10.11",
810
"eslint": "^1.7.3",
911
"mocha": "^2.3.3",
@@ -16,7 +18,7 @@
1618
"main": "dist/rollup-plugin-npm.cjs.js",
1719
"jsnext:main": "dist/rollup-plugin-npm.es6.js",
1820
"scripts": {
19-
"test": "mocha",
21+
"test": "mocha --compilers js:babel-register",
2022
"pretest": "npm run build",
2123
"build": "rollup -c -f cjs -o dist/rollup-plugin-npm.cjs.js && rollup -c -f es6 -o dist/rollup-plugin-npm.es6.js",
2224
"prepublish": "npm test"
@@ -27,6 +29,7 @@
2729
"README.md"
2830
],
2931
"dependencies": {
32+
"browser-resolve": "^1.11.0",
3033
"builtin-modules": "^1.1.0",
3134
"resolve": "^1.1.6"
3235
},

src/empty.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default {};

src/index.js

+23-8
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
1-
import { dirname } from 'path';
1+
import { dirname, resolve } from 'path';
22
import builtins from 'builtin-modules';
3-
import resolve from 'resolve';
3+
import nodeResolve from 'resolve';
4+
import browserResolve from 'browser-resolve';
5+
6+
const COMMONJS_BROWSER_EMPTY = nodeResolve.sync( 'browser-resolve/empty.js', __dirname );
7+
const ES6_BROWSER_EMPTY = resolve( __dirname, '../src/empty.js' );
48

59
export default function npm ( options ) {
610
options = options || {};
711

812
const skip = options.skip || [];
913
const useMain = options.main !== false;
1014

15+
const resolveId = options.browser ? browserResolve : nodeResolve;
16+
1117
return {
12-
resolveId( importee, importer ) {
18+
resolveId ( importee, importer ) {
1319
const parts = importee.split( /[\/\\]/ );
1420
const id = parts.shift();
1521

1622
if ( ~skip.indexOf(id) ) return null;
1723

18-
// disregard entry modules and builtins
19-
if ( !importer || ~builtins.indexOf( importee ) ) return null;
24+
// disregard entry module
25+
if ( !importer ) return null;
2026

2127
return new Promise( ( accept, reject ) => {
22-
resolve(
28+
resolveId(
2329
importee,
2430
{
2531
basedir: dirname( importer ),
26-
packageFilter( pkg ) {
32+
packageFilter ( pkg ) {
2733
const id = pkg[ 'name' ];
2834
if ( options.jsnext ) {
2935
const main = pkg[ 'jsnext:main' ];
@@ -38,7 +44,16 @@ export default function npm ( options ) {
3844
return pkg;
3945
}
4046
},
41-
( err, resolved ) => err ? reject( err ) : accept( resolved )
47+
( err, resolved ) => {
48+
if ( err ) {
49+
reject( err );
50+
} else {
51+
if ( resolved === COMMONJS_BROWSER_EMPTY ) resolved = ES6_BROWSER_EMPTY;
52+
if ( ~builtins.indexOf( resolved ) ) resolved = null;
53+
54+
accept( resolved );
55+
}
56+
}
4257
);
4358
});
4459
}

test/.babelrc

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"presets": [ "es2015-rollup" ]
3+
}

test/node_modules/isomorphic-object/browser-dep.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic-object/browser-test.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic-object/browser.js

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic-object/dep.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic-object/index.js

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic-object/package.json

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic/browser.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic/node.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/isomorphic/package.json

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/test/index.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/uses-buffer/index.js

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/node_modules/uses-buffer/package.json

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/samples/browser-false/main.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import thing from 'uses-buffer';
2+
3+
assert.deepEqual( thing, {} );

test/samples/browser-object/main.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import { env, dep, test } from 'isomorphic-object';
2+
export { env, dep, test };

test/samples/browser/main.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import env from 'isomorphic';
2+
3+
export default env;

test/samples/builtins/main.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import { sep } from 'path';
2+
export default sep;

test/test.js

+107-52
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
var path = require( 'path' );
12
var assert = require( 'assert' );
23
var rollup = require( 'rollup' );
34
var commonjs = require( 'rollup-plugin-commonjs' );
@@ -6,23 +7,27 @@ var npm = require( '..' );
67

78
process.chdir( __dirname );
89

10+
function executeBundle ( bundle ) {
11+
const generated = bundle.generate({
12+
format: 'cjs'
13+
});
14+
15+
const fn = new Function ( 'module', 'exports', 'assert', generated.code );
16+
let module = { exports: {} };
17+
18+
fn( module, module.exports, assert );
19+
20+
return module;
21+
}
22+
923
describe( 'rollup-plugin-npm', function () {
1024
it( 'finds a module with jsnext:main', function () {
1125
return rollup.rollup({
1226
entry: 'samples/jsnext/main.js',
1327
plugins: [
1428
npm({ jsnext: true })
1529
]
16-
}).then( function ( bundle ) {
17-
var generated = bundle.generate({
18-
format: 'cjs'
19-
});
20-
21-
var fn = new Function ( 'module', generated.code );
22-
var module = {};
23-
24-
fn( module );
25-
30+
}).then( executeBundle ).then( module => {
2631
assert.equal( module.exports, '2H' );
2732
});
2833
});
@@ -34,18 +39,9 @@ describe( 'rollup-plugin-npm', function () {
3439
npm({ main: true }),
3540
commonjs()
3641
]
37-
}).then( function ( bundle ) {
38-
var generated = bundle.generate({
39-
format: 'cjs'
40-
});
41-
42-
var fn = new Function ( 'module', generated.code );
43-
var module = {};
44-
45-
fn( module );
46-
42+
}).then( executeBundle ).then( module => {
4743
assert.equal( module.exports, 'It works!' );
48-
})
44+
});
4945
});
5046

5147
it( 'handles a trailing slash', function () {
@@ -55,18 +51,9 @@ describe( 'rollup-plugin-npm', function () {
5551
npm({ main: true }),
5652
commonjs()
5753
]
58-
}).then( function ( bundle ) {
59-
var generated = bundle.generate({
60-
format: 'cjs'
61-
});
62-
63-
var fn = new Function ( 'module', generated.code );
64-
var module = {};
65-
66-
fn( module );
67-
54+
}).then( executeBundle ).then( module => {
6855
assert.equal( module.exports, 'It works!' );
69-
})
56+
});
7057
});
7158

7259
it( 'finds a file inside a package directory', function () {
@@ -76,16 +63,7 @@ describe( 'rollup-plugin-npm', function () {
7663
npm(),
7764
babel()
7865
]
79-
}).then( function ( bundle ) {
80-
var generated = bundle.generate({
81-
format: 'cjs'
82-
});
83-
84-
var fn = new Function ( 'module', generated.code );
85-
var module = {};
86-
87-
fn( module );
88-
66+
}).then( executeBundle ).then( module => {
8967
assert.equal( module.exports, 'FOO' );
9068
});
9169
});
@@ -96,16 +74,7 @@ describe( 'rollup-plugin-npm', function () {
9674
plugins: [
9775
npm()
9876
]
99-
}).then( function ( bundle ) {
100-
var generated = bundle.generate({
101-
format: 'cjs'
102-
});
103-
104-
var fn = new Function ( 'module', generated.code );
105-
var module = {};
106-
107-
fn( module );
108-
77+
}).then( executeBundle ).then( module => {
10978
assert.equal( module.exports, 42 );
11079
});
11180
});
@@ -142,4 +111,90 @@ describe( 'rollup-plugin-npm', function () {
142111
assert.ok( generated.code.indexOf( 'encode' ) < 0 );
143112
});
144113
});
114+
115+
it( 'disregards top-level browser field by default', function () {
116+
return rollup.rollup({
117+
entry: 'samples/browser/main.js',
118+
plugins: [
119+
npm({
120+
main: true,
121+
browser: false
122+
})
123+
]
124+
}).then( executeBundle ).then( module => {
125+
assert.equal( module.exports, 'node' );
126+
});
127+
});
128+
129+
it( 'allows use of the top-level browser field', function () {
130+
return rollup.rollup({
131+
entry: 'samples/browser/main.js',
132+
plugins: [
133+
npm({
134+
main: true,
135+
browser: true
136+
})
137+
]
138+
}).then( executeBundle ).then( module => {
139+
assert.equal( module.exports, 'browser' );
140+
});
141+
});
142+
143+
it( 'disregards object browser field by default', function () {
144+
return rollup.rollup({
145+
entry: 'samples/browser-object/main.js',
146+
plugins: [
147+
npm({
148+
main: true,
149+
browser: false
150+
})
151+
]
152+
}).then( executeBundle ).then( module => {
153+
assert.equal( module.exports.env, 'node' );
154+
assert.equal( module.exports.dep, 'node-dep' );
155+
assert.equal( module.exports.test, 42 );
156+
});
157+
});
158+
159+
it( 'allows use of the object browser field', function () {
160+
return rollup.rollup({
161+
entry: 'samples/browser-object/main.js',
162+
plugins: [
163+
npm({
164+
main: true,
165+
browser: true
166+
})
167+
]
168+
}).then( executeBundle ).then( module => {
169+
assert.equal( module.exports.env, 'browser' );
170+
assert.equal( module.exports.dep, 'browser-dep' );
171+
assert.equal( module.exports.test, 43 );
172+
});
173+
});
174+
175+
it( 'supports `false` in browser field', function () {
176+
return rollup.rollup({
177+
entry: 'samples/browser-false/main.js',
178+
plugins: [
179+
npm({
180+
main: true,
181+
browser: true
182+
})
183+
]
184+
}).then( executeBundle );
185+
});
186+
187+
it( 'skips builtins', function () {
188+
return rollup.rollup({
189+
entry: 'samples/builtins/main.js',
190+
plugins: [ npm() ]
191+
}).then( bundle => {
192+
const { code } = bundle.generate({ format: 'cjs' });
193+
const fn = new Function ( 'module', 'exports', 'require', code );
194+
195+
fn( module, module.exports, id => require( id ) );
196+
197+
assert.equal( module.exports, path.sep );
198+
});
199+
});
145200
});

0 commit comments

Comments
 (0)