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

respect preserveSymlinks option from upstream #140

Merged
merged 2 commits into from
Mar 7, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"es5-ext": "^0.10.39",
"eslint": "^4.18.0",
"mocha": "^5.0.1",
"rollup": "^0.54.1",
"rollup": "^0.56.3",
"rollup-plugin-buble": "^0.19.2",
"rollup-plugin-commonjs": "^8.3.0",
"string-capitalize": "^1.0.1",
Expand Down
84 changes: 48 additions & 36 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,15 @@ export default function nodeResolve ( options = {} ) {
throw new Error( `At least one of options.module, options.main or options.jsnext must be true` );
}

let preserveSymlinks;

return {
name: 'node-resolve',

options ( options ) {
preserveSymlinks = options.preserveSymlinks;
},

resolveId ( importee, importer ) {
if ( /\0/.test( importee ) ) return null; // ignore IDs with null character, these belong to other plugins

Expand Down Expand Up @@ -64,43 +70,49 @@ export default function nodeResolve ( options = {} ) {
let disregardResult = false;
let packageBrowserField = false;

resolveId(
importee,
Object.assign({
basedir: dirname( importer ),
packageFilter ( pkg, pkgPath ) {
const pkgRoot = dirname( pkgPath );
if (options.browser && typeof pkg[ 'browser' ] === 'object') {
packageBrowserField = Object.keys(pkg[ 'browser' ]).reduce((browser, key) => {
const resolved = pkg[ 'browser' ][ key ] === false ? false : resolve( pkgRoot, pkg[ 'browser' ][ key ] );
browser[ key ] = resolved;
if ( key[0] === '.' ) {
const absoluteKey = resolve( pkgRoot, key );
browser[ absoluteKey ] = resolved;
if ( !extname(key) ) {
exts.reduce( ( browser, ext ) => {
browser[ absoluteKey + ext ] = browser[ key ];
return browser;
}, browser );
}
const resolveOptions = {
basedir: dirname( importer ),
packageFilter ( pkg, pkgPath ) {
const pkgRoot = dirname( pkgPath );
if (options.browser && typeof pkg[ 'browser' ] === 'object') {
packageBrowserField = Object.keys(pkg[ 'browser' ]).reduce((browser, key) => {
const resolved = pkg[ 'browser' ][ key ] === false ? false : resolve( pkgRoot, pkg[ 'browser' ][ key ] );
browser[ key ] = resolved;
if ( key[0] === '.' ) {
const absoluteKey = resolve( pkgRoot, key );
browser[ absoluteKey ] = resolved;
if ( !extname(key) ) {
exts.reduce( ( browser, ext ) => {
browser[ absoluteKey + ext ] = browser[ key ];
return browser;
}, browser );
}
return browser;
}, {});
}
}
return browser;
}, {});
}

if (options.browser && typeof pkg[ 'browser' ] === 'string') {
pkg[ 'main' ] = pkg[ 'browser' ];
} else if ( useModule && pkg[ 'module' ] ) {
pkg[ 'main' ] = pkg[ 'module' ];
} else if ( useJsnext && pkg[ 'jsnext:main' ] ) {
pkg[ 'main' ] = pkg[ 'jsnext:main' ];
} else if ( ( useJsnext || useModule ) && !useMain ) {
disregardResult = true;
}
return pkg;
},
extensions: options.extensions
};

if (options.browser && typeof pkg[ 'browser' ] === 'string') {
pkg[ 'main' ] = pkg[ 'browser' ];
} else if ( useModule && pkg[ 'module' ] ) {
pkg[ 'main' ] = pkg[ 'module' ];
} else if ( useJsnext && pkg[ 'jsnext:main' ] ) {
pkg[ 'main' ] = pkg[ 'jsnext:main' ];
} else if ( ( useJsnext || useModule ) && !useMain ) {
disregardResult = true;
}
return pkg;
},
extensions: options.extensions
}, customResolveOptions ),
if (preserveSymlinks !== undefined) {
resolveOptions.preserveSymlinks = preserveSymlinks;
}

resolveId(
importee,
Object.assign( resolveOptions, customResolveOptions ),
( err, resolved ) => {
if (options.browser && packageBrowserField) {
if (packageBrowserField[ resolved ]) {
Expand All @@ -110,7 +122,7 @@ export default function nodeResolve ( options = {} ) {
}

if ( !disregardResult && !err ) {
if ( resolved && fs.existsSync( resolved ) ) {
if ( !preserveSymlinks && resolved && fs.existsSync( resolved ) ) {
resolved = fs.realpathSync( resolved );
}

Expand Down
55 changes: 35 additions & 20 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ function executeBundle ( bundle ) {
}).then( generated => {
const fn = new Function ( 'module', 'exports', 'assert', generated.code );
const module = { exports: {} };

fn( module, module.exports, assert );

return module;
});
}
Expand Down Expand Up @@ -436,24 +436,7 @@ describe( 'rollup-plugin-node-resolve', function () {
});
});

it( 'resolves symlinked packages', () => {
createMissingDirectories();
linkDirectories();

return rollup.rollup({
input: 'samples/symlinked/first/index.js',
plugins: [
nodeResolve()
]
}).then( executeBundle ).then( module => {
assert.equal( module.exports.number1, module.exports.number2 );
}).then(() => {
unlinkDirectories();
}).catch(err => {
unlinkDirectories();
throw err;
});

describe( 'symlinks', () => {
function createMissingDirectories () {
createDirectory( './samples/symlinked/first/node_modules' );
createDirectory( './samples/symlinked/second/node_modules' );
Expand All @@ -477,6 +460,38 @@ describe( 'rollup-plugin-node-resolve', function () {
fs.unlinkSync('./samples/symlinked/first/node_modules/third');
fs.unlinkSync('./samples/symlinked/second/node_modules/third');
}

beforeEach( () => {
createMissingDirectories();
linkDirectories();
});

afterEach( () => {
unlinkDirectories();
});

it( 'resolves symlinked packages', () => {
return rollup.rollup({
input: 'samples/symlinked/first/index.js',
plugins: [
nodeResolve()
]
}).then( executeBundle ).then( module => {
assert.equal( module.exports.number1, module.exports.number2 );
});
});

it( 'preserves symlinks if `preserveSymlinks` is true', () => {
return rollup.rollup({
input: 'samples/symlinked/first/index.js',
plugins: [
nodeResolve()
],
preserveSymlinks: true
}).then( executeBundle ).then( module => {
assert.notEqual( module.exports.number1, module.exports.number2 );
});
});
});

it( 'prefers jsnext:main field over main', () => {
Expand Down