resolver_sync.js
1 var path = require('path'); 2 var test = require('tape'); 3 var resolve = require('../'); 4 5 test('foo', function (t) { 6 var dir = path.join(__dirname, 'resolver'); 7 8 t.equal( 9 resolve.sync('./foo', { basedir: dir }), 10 path.join(dir, 'foo.js') 11 ); 12 13 t.equal( 14 resolve.sync('./foo.js', { basedir: dir }), 15 path.join(dir, 'foo.js') 16 ); 17 18 t.equal( 19 resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }), 20 path.join(dir, 'foo.js') 21 ); 22 23 t.throws(function () { 24 resolve.sync('foo', { basedir: dir }); 25 }); 26 27 // Test that filename is reported as the "from" value when passed. 28 t.throws( 29 function () { 30 resolve.sync('foo', { basedir: dir, filename: path.join(dir, 'bar.js') }); 31 }, 32 { 33 name: 'Error', 34 message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'" 35 } 36 ); 37 38 t.end(); 39 }); 40 41 test('bar', function (t) { 42 var dir = path.join(__dirname, 'resolver'); 43 44 t.equal( 45 resolve.sync('foo', { basedir: path.join(dir, 'bar') }), 46 path.join(dir, 'bar/node_modules/foo/index.js') 47 ); 48 t.end(); 49 }); 50 51 test('baz', function (t) { 52 var dir = path.join(__dirname, 'resolver'); 53 54 t.equal( 55 resolve.sync('./baz', { basedir: dir }), 56 path.join(dir, 'baz/quux.js') 57 ); 58 t.end(); 59 }); 60 61 test('biz', function (t) { 62 var dir = path.join(__dirname, 'resolver/biz/node_modules'); 63 t.equal( 64 resolve.sync('./grux', { basedir: dir }), 65 path.join(dir, 'grux/index.js') 66 ); 67 68 t.equal( 69 resolve.sync('tiv', { basedir: path.join(dir, 'grux') }), 70 path.join(dir, 'tiv/index.js') 71 ); 72 73 t.equal( 74 resolve.sync('grux', { basedir: path.join(dir, 'tiv') }), 75 path.join(dir, 'grux/index.js') 76 ); 77 t.end(); 78 }); 79 80 test('normalize', function (t) { 81 var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); 82 t.equal( 83 resolve.sync('../grux', { basedir: dir }), 84 path.join(dir, 'index.js') 85 ); 86 t.end(); 87 }); 88 89 test('cup', function (t) { 90 var dir = path.join(__dirname, 'resolver'); 91 t.equal( 92 resolve.sync('./cup', { 93 basedir: dir, 94 extensions: ['.js', '.coffee'] 95 }), 96 path.join(dir, 'cup.coffee') 97 ); 98 99 t.equal( 100 resolve.sync('./cup.coffee', { basedir: dir }), 101 path.join(dir, 'cup.coffee') 102 ); 103 104 t.throws(function () { 105 resolve.sync('./cup', { 106 basedir: dir, 107 extensions: ['.js'] 108 }); 109 }); 110 111 t.end(); 112 }); 113 114 test('mug', function (t) { 115 var dir = path.join(__dirname, 'resolver'); 116 t.equal( 117 resolve.sync('./mug', { basedir: dir }), 118 path.join(dir, 'mug.js') 119 ); 120 121 t.equal( 122 resolve.sync('./mug', { 123 basedir: dir, 124 extensions: ['.coffee', '.js'] 125 }), 126 path.join(dir, 'mug.coffee') 127 ); 128 129 t.equal( 130 resolve.sync('./mug', { 131 basedir: dir, 132 extensions: ['.js', '.coffee'] 133 }), 134 path.join(dir, 'mug.js') 135 ); 136 137 t.end(); 138 }); 139 140 test('other path', function (t) { 141 var resolverDir = path.join(__dirname, 'resolver'); 142 var dir = path.join(resolverDir, 'bar'); 143 var otherDir = path.join(resolverDir, 'other_path'); 144 145 t.equal( 146 resolve.sync('root', { 147 basedir: dir, 148 paths: [otherDir] 149 }), 150 path.join(resolverDir, 'other_path/root.js') 151 ); 152 153 t.equal( 154 resolve.sync('lib/other-lib', { 155 basedir: dir, 156 paths: [otherDir] 157 }), 158 path.join(resolverDir, 'other_path/lib/other-lib.js') 159 ); 160 161 t.throws(function () { 162 resolve.sync('root', { basedir: dir }); 163 }); 164 165 t.throws(function () { 166 resolve.sync('zzz', { 167 basedir: dir, 168 paths: [otherDir] 169 }); 170 }); 171 172 t.end(); 173 }); 174 175 test('path iterator', function (t) { 176 var resolverDir = path.join(__dirname, 'resolver'); 177 178 var exactIterator = function (x, start, getPackageCandidates, opts) { 179 return [path.join(resolverDir, x)]; 180 }; 181 182 t.equal( 183 resolve.sync('baz', { packageIterator: exactIterator }), 184 path.join(resolverDir, 'baz/quux.js') 185 ); 186 187 t.end(); 188 }); 189 190 test('incorrect main', function (t) { 191 var resolverDir = path.join(__dirname, 'resolver'); 192 var dir = path.join(resolverDir, 'incorrect_main'); 193 194 t.equal( 195 resolve.sync('./incorrect_main', { basedir: resolverDir }), 196 path.join(dir, 'index.js') 197 ); 198 199 t.end(); 200 }); 201 202 var stubStatSync = function stubStatSync(fn) { 203 var fs = require('fs'); 204 var statSync = fs.statSync; 205 try { 206 fs.statSync = function () { 207 throw new EvalError('Unknown Error'); 208 }; 209 return fn(); 210 } finally { 211 fs.statSync = statSync; 212 } 213 }; 214 215 test('#79 - re-throw non ENOENT errors from stat', function (t) { 216 var dir = path.join(__dirname, 'resolver'); 217 218 stubStatSync(function () { 219 t.throws(function () { 220 resolve.sync('foo', { basedir: dir }); 221 }, /Unknown Error/); 222 }); 223 224 t.end(); 225 }); 226 227 test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { 228 var dir = path.join(__dirname, 'resolver'); 229 230 t.equal( 231 resolve.sync('./foo', { basedir: path.join(dir, 'same_names') }), 232 path.join(dir, 'same_names/foo.js') 233 ); 234 t.equal( 235 resolve.sync('./foo/', { basedir: path.join(dir, 'same_names') }), 236 path.join(dir, 'same_names/foo/index.js') 237 ); 238 t.end(); 239 }); 240 241 test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { 242 var dir = path.join(__dirname, 'resolver'); 243 244 t.equal( 245 resolve.sync('./', { basedir: path.join(dir, 'same_names/foo') }), 246 path.join(dir, 'same_names/foo/index.js') 247 ); 248 t.equal( 249 resolve.sync('.', { basedir: path.join(dir, 'same_names/foo') }), 250 path.join(dir, 'same_names/foo/index.js') 251 ); 252 t.end(); 253 }); 254 255 test('sync: #121 - treating an existing file as a dir when no basedir', function (t) { 256 var testFile = path.basename(__filename); 257 258 t.test('sanity check', function (st) { 259 st.equal( 260 resolve.sync('./' + testFile), 261 __filename, 262 'sanity check' 263 ); 264 st.end(); 265 }); 266 267 t.test('with a fake directory', function (st) { 268 function run() { return resolve.sync('./' + testFile + '/blah'); } 269 270 st.throws(run, 'throws an error'); 271 272 try { 273 run(); 274 } catch (e) { 275 st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); 276 st.equal( 277 e.message, 278 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', 279 'can not find nonexistent module' 280 ); 281 } 282 283 st.end(); 284 }); 285 286 t.end(); 287 }); 288 289 test('sync dot main', function (t) { 290 var start = new Date(); 291 t.equal(resolve.sync('./resolver/dot_main'), path.join(__dirname, 'resolver/dot_main/index.js')); 292 t.ok(new Date() - start < 50, 'resolve.sync timedout'); 293 t.end(); 294 }); 295 296 test('sync dot slash main', function (t) { 297 var start = new Date(); 298 t.equal(resolve.sync('./resolver/dot_slash_main'), path.join(__dirname, 'resolver/dot_slash_main/index.js')); 299 t.ok(new Date() - start < 50, 'resolve.sync timedout'); 300 t.end(); 301 }); 302 303 test('not a directory', function (t) { 304 var path = './foo'; 305 try { 306 resolve.sync(path, { basedir: __filename }); 307 t.fail(); 308 } catch (err) { 309 t.ok(err, 'a non-directory errors'); 310 t.equal(err && err.message, 'Cannot find module \'' + path + "' from '" + __filename + "'"); 311 t.equal(err && err.code, 'MODULE_NOT_FOUND'); 312 } 313 t.end(); 314 }); 315 316 test('non-string "main" field in package.json', function (t) { 317 var dir = path.join(__dirname, 'resolver'); 318 try { 319 var result = resolve.sync('./invalid_main', { basedir: dir }); 320 t.equal(result, undefined, 'result should not exist'); 321 t.fail('should not get here'); 322 } catch (err) { 323 t.ok(err, 'errors on non-string main'); 324 t.equal(err.message, 'package “invalid main” `main` must be a string'); 325 t.equal(err.code, 'INVALID_PACKAGE_MAIN'); 326 } 327 t.end(); 328 }); 329 330 test('non-string "main" field in package.json', function (t) { 331 var dir = path.join(__dirname, 'resolver'); 332 try { 333 var result = resolve.sync('./invalid_main', { basedir: dir }); 334 t.equal(result, undefined, 'result should not exist'); 335 t.fail('should not get here'); 336 } catch (err) { 337 t.ok(err, 'errors on non-string main'); 338 t.equal(err.message, 'package “invalid main” `main` must be a string'); 339 t.equal(err.code, 'INVALID_PACKAGE_MAIN'); 340 } 341 t.end(); 342 }); 343 344 test('browser field in package.json', function (t) { 345 var dir = path.join(__dirname, 'resolver'); 346 var res = resolve.sync('./browser_field', { 347 basedir: dir, 348 packageFilter: function packageFilter(pkg) { 349 if (pkg.browser) { 350 pkg.main = pkg.browser; // eslint-disable-line no-param-reassign 351 delete pkg.browser; // eslint-disable-line no-param-reassign 352 } 353 return pkg; 354 } 355 }); 356 t.equal(res, path.join(dir, 'browser_field', 'b.js')); 357 t.end(); 358 });