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

Commit

Permalink
Merge pull request #140 from kellyselden/preserveSymlinks
Browse files Browse the repository at this point in the history
respect `preserveSymlinks` option from upstream
  • Loading branch information
keithamus authored Mar 7, 2018
2 parents 634dfae + 93dedb0 commit c609f8f
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 60 deletions.
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

0 comments on commit c609f8f

Please sign in to comment.