Skip to content

Commit

Permalink
Add ES6 modules resolver tests (#359)
Browse files Browse the repository at this point in the history
  • Loading branch information
fathyb authored and devongovett committed Dec 21, 2017
1 parent 6c96b65 commit 7618677
Show file tree
Hide file tree
Showing 20 changed files with 196 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/Resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,11 @@ class Resolver {
// Expose the path to the package.json file
pkg.pkgfile = pkgfile;

// npm libraries can specify alternative main fields in their package.json,
// we resolve the "module" and "jsnext:main" in priority of "browser" to get the full dependency tree.
// libraries like d3.js specifies node.js specific files in the "main" which breaks the build
const main = pkg.module || pkg['jsnext:main'] || pkg.browser;
// we use the "module" or "jsnext:main" field to get the full dependency tree if available
const main = [pkg.module, pkg['jsnext:main']].find(
entry => typeof entry === 'string'
);

if (main) {
pkg.main = main;
Expand Down
7 changes: 7 additions & 0 deletions test/integration/resolve-entries/both-fields.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const required = require('./pkg-both')

if(required.test() !== 'pkg-es6-module') {
throw new Error('Invalid module')
}

export const test = required.test
7 changes: 7 additions & 0 deletions test/integration/resolve-entries/browser-multiple.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const required = require('./pkg-browser-multiple/projected')

if(required.test() !== 'pkg-browser-multiple') {
throw new Error('Invalid module')
}

export const test = required.test
7 changes: 7 additions & 0 deletions test/integration/resolve-entries/browser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const required = require('./pkg-browser')

if(required.test() !== 'pkg-browser') {
throw new Error('Invalid module')
}

export const test = required.test
7 changes: 7 additions & 0 deletions test/integration/resolve-entries/jsnext-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const required = require('./pkg-jsnext-module')

if(required.test() !== 'pkg-jsnext-module') {
throw new Error('Invalid module')
}

export const test = required.test
7 changes: 7 additions & 0 deletions test/integration/resolve-entries/main-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const required = require('./pkg-main')

if(required.test() !== 'pkg-main-module') {
throw new Error('Invalid module')
}

export const test = required.test
7 changes: 7 additions & 0 deletions test/integration/resolve-entries/module-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const required = require('./pkg-es6-module')

if(required.test() !== 'pkg-es6-module') {
throw new Error('Invalid module')
}

export const test = required.test
3 changes: 3 additions & 0 deletions test/integration/resolve-entries/pkg-both/es6.module.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function test() {
return 'pkg-es6-module'
}
6 changes: 6 additions & 0 deletions test/integration/resolve-entries/pkg-both/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "pkg-both",
"main": "./does-not-exist.js",
"jsnext:main": "./jsnext.module.js",
"module": "./es6.module.js"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "pkg-browser-multiple",
"main": "./does-not-exist.js",
"browser": {
"./projected.js": "./projected-module.js"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function test() {
return 'pkg-browser-multiple'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function test() {
return 'pkg-browser'
}
5 changes: 5 additions & 0 deletions test/integration/resolve-entries/pkg-browser/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "pkg-browser",
"main": "./does-not-exist.js",
"browser": "./browser-module.js"
}
3 changes: 3 additions & 0 deletions test/integration/resolve-entries/pkg-es6-module/es6.module.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function test() {
return 'pkg-es6-module'
}
5 changes: 5 additions & 0 deletions test/integration/resolve-entries/pkg-es6-module/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "pkg-es6-module",
"main": "./does-not-exist.js",
"module": "./es6.module.js"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function test() {
return 'pkg-jsnext-module'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "pkg-jsnext-module",
"main": "./does-not-exist.js",
"jsnext:main": "./jsnext.module.js"
}
3 changes: 3 additions & 0 deletions test/integration/resolve-entries/pkg-main/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function test() {
return 'pkg-main-module'
}
4 changes: 4 additions & 0 deletions test/integration/resolve-entries/pkg-main/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "pkg-main",
"main": "./main.js"
}
100 changes: 100 additions & 0 deletions test/javascript.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,4 +257,104 @@ describe('javascript', function() {
assert.equal(typeof output, 'function');
assert.equal(output(), 3);
});

it('should resolve the browser field before main', async function() {
let b = await bundle(__dirname + '/integration/resolve-entries/browser.js');

assertBundleTree(b, {
name: 'browser.js',
assets: ['browser.js', 'browser-module.js'],
childBundles: []
});

let output = run(b);

assert.equal(typeof output.test, 'function');
assert.equal(output.test(), 'pkg-browser');
});

it('should resolve advanced browser resolution', async function() {
let b = await bundle(
__dirname + '/integration/resolve-entries/browser-multiple.js'
);

assertBundleTree(b, {
name: 'browser-multiple.js',
assets: ['browser-multiple.js', 'projected-module.js'],
childBundles: []
});

let output = run(b);

assert.equal(typeof output.test, 'function');
assert.equal(output.test(), 'pkg-browser-multiple');
});

it('should resolve the module field before main', async function() {
let b = await bundle(
__dirname + '/integration/resolve-entries/module-field.js'
);

assertBundleTree(b, {
name: 'module-field.js',
assets: ['module-field.js', 'es6.module.js'],
childBundles: []
});

let output = run(b);

assert.equal(typeof output.test, 'function');
assert.equal(output.test(), 'pkg-es6-module');
});

it('should resolve the jsnext:main field before main', async function() {
let b = await bundle(
__dirname + '/integration/resolve-entries/jsnext-field.js'
);

assertBundleTree(b, {
name: 'jsnext-field.js',
assets: ['jsnext-field.js', 'jsnext.module.js'],
childBundles: []
});

let output = run(b);

assert.equal(typeof output.test, 'function');
assert.equal(output.test(), 'pkg-jsnext-module');
});

it('should resolve the module field before jsnext:main', async function() {
let b = await bundle(
__dirname + '/integration/resolve-entries/both-fields.js'
);

assertBundleTree(b, {
name: 'both-fields.js',
assets: ['both-fields.js', 'es6.module.js'],
childBundles: []
});

let output = run(b);

assert.equal(typeof output.test, 'function');
assert.equal(output.test(), 'pkg-es6-module');
});

it('should resolve the main field', async function() {
let b = await bundle(
__dirname + '/integration/resolve-entries/main-field.js'
);

assertBundleTree(b, {
name: 'main-field.js',
assets: ['main-field.js', 'main.js'],
childBundles: []
});

let output = run(b);

assert.equal(typeof output.test, 'function');
assert.equal(output.test(), 'pkg-main-module');
});
});

0 comments on commit 7618677

Please sign in to comment.