|
|
- var path = require('path');
- var fs = require('fs');
- var test = require('tape');
- var map = require('array.prototype.map');
- var resolve = require('../');
-
- var symlinkDir = path.join(__dirname, 'resolver', 'symlinked', 'symlink');
- var packageDir = path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'package');
- var modADir = path.join(__dirname, 'symlinks', 'source', 'node_modules', 'mod-a');
- var symlinkModADir = path.join(__dirname, 'symlinks', 'dest', 'node_modules', 'mod-a');
- try {
- fs.unlinkSync(symlinkDir);
- } catch (err) {}
- try {
- fs.unlinkSync(packageDir);
- } catch (err) {}
- try {
- fs.unlinkSync(modADir);
- } catch (err) {}
- try {
- fs.unlinkSync(symlinkModADir);
- } catch (err) {}
-
- try {
- fs.symlinkSync('./_/symlink_target', symlinkDir, 'dir');
- } catch (err) {
- // if fails then it is probably on Windows and lets try to create a junction
- fs.symlinkSync(path.join(__dirname, 'resolver', 'symlinked', '_', 'symlink_target') + '\\', symlinkDir, 'junction');
- }
- try {
- fs.symlinkSync('../../package', packageDir, 'dir');
- } catch (err) {
- // if fails then it is probably on Windows and lets try to create a junction
- fs.symlinkSync(path.join(__dirname, '..', '..', 'package') + '\\', packageDir, 'junction');
- }
- try {
- fs.symlinkSync('../../source/node_modules/mod-a', symlinkModADir, 'dir');
- } catch (err) {
- // if fails then it is probably on Windows and lets try to create a junction
- fs.symlinkSync(path.join(__dirname, '..', '..', 'source', 'node_modules', 'mod-a') + '\\', symlinkModADir, 'junction');
- }
-
- test('symlink', function (t) {
- t.plan(2);
-
- resolve('foo', { basedir: symlinkDir, preserveSymlinks: false }, function (err, res, pkg) {
- t.error(err);
- t.equal(res, path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js'));
- });
- });
-
- test('sync symlink when preserveSymlinks = true', function (t) {
- t.plan(4);
-
- resolve('foo', { basedir: symlinkDir }, function (err, res, pkg) {
- t.ok(err, 'there is an error');
- t.notOk(res, 'no result');
-
- t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve');
- t.equal(
- err && err.message,
- 'Cannot find module \'foo\' from \'' + symlinkDir + '\'',
- 'can not find nonexistent module'
- );
- });
- });
-
- test('sync symlink', function (t) {
- var start = new Date();
- t.doesNotThrow(function () {
- t.equal(resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }), path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js'));
- });
- t.ok(new Date() - start < 50, 'resolve.sync timedout');
- t.end();
- });
-
- test('sync symlink when preserveSymlinks = true', function (t) {
- t.throws(function () {
- resolve.sync('foo', { basedir: symlinkDir });
- }, /Cannot find module 'foo'/);
- t.end();
- });
-
- test('sync symlink from node_modules to other dir when preserveSymlinks = false', function (t) {
- var basedir = path.join(__dirname, 'resolver', 'symlinked', '_');
- var fn = resolve.sync('package', { basedir: basedir, preserveSymlinks: false });
-
- t.equal(fn, path.resolve(__dirname, 'resolver/symlinked/package/bar.js'));
- t.end();
- });
-
- test('async symlink from node_modules to other dir when preserveSymlinks = false', function (t) {
- t.plan(2);
- var basedir = path.join(__dirname, 'resolver', 'symlinked', '_');
- resolve('package', { basedir: basedir, preserveSymlinks: false }, function (err, result) {
- t.notOk(err, 'no error');
- t.equal(result, path.resolve(__dirname, 'resolver/symlinked/package/bar.js'));
- });
- });
-
- test('packageFilter', function (t) {
- function relative(x) {
- return path.relative(__dirname, x);
- }
-
- function testPackageFilter(preserveSymlinks) {
- return function (st) {
- st.plan('is 1.x' ? 3 : 5); // eslint-disable-line no-constant-condition
-
- var destMain = 'symlinks/dest/node_modules/mod-a/index.js';
- var destPkg = 'symlinks/dest/node_modules/mod-a/package.json';
- var sourceMain = 'symlinks/source/node_modules/mod-a/index.js';
- var sourcePkg = 'symlinks/source/node_modules/mod-a/package.json';
- var destDir = path.join(__dirname, 'symlinks', 'dest');
-
- /* eslint multiline-comment-style: 0 */
- /* v2.x will restore these tests
- var packageFilterPath = [];
- var actualPath = resolve.sync('mod-a', {
- basedir: destDir,
- preserveSymlinks: preserveSymlinks,
- packageFilter: function (pkg, pkgfile, dir) {
- packageFilterPath.push(pkgfile);
- }
- });
- st.equal(
- relative(actualPath),
- path.normalize(preserveSymlinks ? destMain : sourceMain),
- 'sync: actual path is correct'
- );
- st.deepEqual(
- map(packageFilterPath, relative),
- map(preserveSymlinks ? [destPkg, destPkg] : [sourcePkg, sourcePkg], path.normalize),
- 'sync: packageFilter pkgfile arg is correct'
- );
- */
-
- var asyncPackageFilterPath = [];
- resolve(
- 'mod-a',
- {
- basedir: destDir,
- preserveSymlinks: preserveSymlinks,
- packageFilter: function (pkg, pkgfile) {
- asyncPackageFilterPath.push(pkgfile);
- }
- },
- function (err, actualPath) {
- st.error(err, 'no error');
- st.equal(
- relative(actualPath),
- path.normalize(preserveSymlinks ? destMain : sourceMain),
- 'async: actual path is correct'
- );
- st.deepEqual(
- map(asyncPackageFilterPath, relative),
- map(
- preserveSymlinks ? [destPkg, destPkg, destPkg] : [sourcePkg, sourcePkg, sourcePkg],
- path.normalize
- ),
- 'async: packageFilter pkgfile arg is correct'
- );
- }
- );
- };
- }
-
- t.test('preserveSymlinks: false', testPackageFilter(false));
-
- t.test('preserveSymlinks: true', testPackageFilter(true));
-
- t.end();
- });
|