node-modules-paths.js
1 var test = require('tape'); 2 var path = require('path'); 3 var parse = path.parse || require('path-parse'); 4 var keys = require('object-keys'); 5 6 var nodeModulesPaths = require('../lib/node-modules-paths'); 7 8 var verifyDirs = function verifyDirs(t, start, dirs, moduleDirectories, paths) { 9 var moduleDirs = [].concat(moduleDirectories || 'node_modules'); 10 if (paths) { 11 for (var k = 0; k < paths.length; ++k) { 12 moduleDirs.push(path.basename(paths[k])); 13 } 14 } 15 16 var foundModuleDirs = {}; 17 var uniqueDirs = {}; 18 var parsedDirs = {}; 19 for (var i = 0; i < dirs.length; ++i) { 20 var parsed = parse(dirs[i]); 21 if (!foundModuleDirs[parsed.base]) { foundModuleDirs[parsed.base] = 0; } 22 foundModuleDirs[parsed.base] += 1; 23 parsedDirs[parsed.dir] = true; 24 uniqueDirs[dirs[i]] = true; 25 } 26 t.equal(keys(parsedDirs).length >= start.split(path.sep).length, true, 'there are >= dirs than "start" has'); 27 var foundModuleDirNames = keys(foundModuleDirs); 28 t.deepEqual(foundModuleDirNames, moduleDirs, 'all desired module dirs were found'); 29 t.equal(keys(uniqueDirs).length, dirs.length, 'all dirs provided were unique'); 30 31 var counts = {}; 32 for (var j = 0; j < foundModuleDirNames.length; ++j) { 33 counts[foundModuleDirs[j]] = true; 34 } 35 t.equal(keys(counts).length, 1, 'all found module directories had the same count'); 36 }; 37 38 test('node-modules-paths', function (t) { 39 t.test('no options', function (t) { 40 var start = path.join(__dirname, 'resolver'); 41 var dirs = nodeModulesPaths(start); 42 43 verifyDirs(t, start, dirs); 44 45 t.end(); 46 }); 47 48 t.test('empty options', function (t) { 49 var start = path.join(__dirname, 'resolver'); 50 var dirs = nodeModulesPaths(start, {}); 51 52 verifyDirs(t, start, dirs); 53 54 t.end(); 55 }); 56 57 t.test('with paths=array option', function (t) { 58 var start = path.join(__dirname, 'resolver'); 59 var paths = ['a', 'b']; 60 var dirs = nodeModulesPaths(start, { paths: paths }); 61 62 verifyDirs(t, start, dirs, null, paths); 63 64 t.end(); 65 }); 66 67 t.test('with paths=function option', function (t) { 68 var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { 69 return getNodeModulesDirs().concat(path.join(absoluteStart, 'not node modules', request)); 70 }; 71 72 var start = path.join(__dirname, 'resolver'); 73 var dirs = nodeModulesPaths(start, { paths: paths }, 'pkg'); 74 75 verifyDirs(t, start, dirs, null, [path.join(start, 'not node modules', 'pkg')]); 76 77 t.end(); 78 }); 79 80 t.test('with paths=function skipping node modules resolution', function (t) { 81 var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { 82 return []; 83 }; 84 var start = path.join(__dirname, 'resolver'); 85 var dirs = nodeModulesPaths(start, { paths: paths }); 86 t.deepEqual(dirs, [], 'no node_modules was computed'); 87 t.end(); 88 }); 89 90 t.test('with moduleDirectory option', function (t) { 91 var start = path.join(__dirname, 'resolver'); 92 var moduleDirectory = 'not node modules'; 93 var dirs = nodeModulesPaths(start, { moduleDirectory: moduleDirectory }); 94 95 verifyDirs(t, start, dirs, moduleDirectory); 96 97 t.end(); 98 }); 99 100 t.test('with 1 moduleDirectory and paths options', function (t) { 101 var start = path.join(__dirname, 'resolver'); 102 var paths = ['a', 'b']; 103 var moduleDirectory = 'not node modules'; 104 var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectory }); 105 106 verifyDirs(t, start, dirs, moduleDirectory, paths); 107 108 t.end(); 109 }); 110 111 t.test('with 1+ moduleDirectory and paths options', function (t) { 112 var start = path.join(__dirname, 'resolver'); 113 var paths = ['a', 'b']; 114 var moduleDirectories = ['not node modules', 'other modules']; 115 var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); 116 117 verifyDirs(t, start, dirs, moduleDirectories, paths); 118 119 t.end(); 120 }); 121 122 t.test('combine paths correctly on Windows', function (t) { 123 var start = 'C:\\Users\\username\\myProject\\src'; 124 var paths = []; 125 var moduleDirectories = ['node_modules', start]; 126 var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); 127 128 t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); 129 130 t.end(); 131 }); 132 133 t.test('combine paths correctly on non-Windows', { skip: process.platform === 'win32' }, function (t) { 134 var start = '/Users/username/git/myProject/src'; 135 var paths = []; 136 var moduleDirectories = ['node_modules', '/Users/username/git/myProject/src']; 137 var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); 138 139 t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); 140 141 t.end(); 142 }); 143 });