source: frontend/node_modules/resolve/test/resolver_sync.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 11 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 20.4 KB
Line 
1var path = require('path');
2var fs = require('fs');
3var test = require('tape');
4
5var resolve = require('../');
6var sync = require('../sync');
7
8var requireResolveSupportsPaths = require.resolve.length > 1
9 && !(/^v12\.[012]\./).test(process.version); // broken in v12.0-12.2, see https://github.com/nodejs/node/issues/27794
10
11var requireResolveDefaultPathsBroken = (/^v8\.9\.|^v9\.[01]\.0|^v9\.2\./).test(process.version);
12// broken in node v8.9.x, v9.0, v9.1, v9.2.x. see https://github.com/nodejs/node/pull/17113
13
14test('`./sync` entry point', function (t) {
15 t.equal(resolve.sync, sync, '`./sync` entry point is the same as `.sync` on `main`');
16 t.end();
17});
18
19test('foo', function (t) {
20 var dir = path.join(__dirname, 'resolver');
21
22 t.equal(
23 resolve.sync('./foo', { basedir: dir }),
24 path.join(dir, 'foo.js'),
25 './foo'
26 );
27 if (requireResolveSupportsPaths) {
28 t.equal(
29 resolve.sync('./foo', { basedir: dir }),
30 require.resolve('./foo', { paths: [dir] }),
31 './foo: resolve.sync === require.resolve'
32 );
33 }
34
35 t.equal(
36 resolve.sync('./foo.js', { basedir: dir }),
37 path.join(dir, 'foo.js'),
38 './foo.js'
39 );
40 if (requireResolveSupportsPaths) {
41 t.equal(
42 resolve.sync('./foo.js', { basedir: dir }),
43 require.resolve('./foo.js', { paths: [dir] }),
44 './foo.js: resolve.sync === require.resolve'
45 );
46 }
47
48 t.equal(
49 resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }),
50 path.join(dir, 'foo.js')
51 );
52
53 t.throws(function () {
54 resolve.sync('foo', { basedir: dir });
55 });
56
57 // Test that filename is reported as the "from" value when passed.
58 t.throws(
59 function () {
60 resolve.sync('foo', { basedir: dir, filename: path.join(dir, 'bar.js') });
61 },
62 {
63 name: 'Error',
64 message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'"
65 }
66 );
67
68 t.end();
69});
70
71test('bar', function (t) {
72 var dir = path.join(__dirname, 'resolver');
73
74 var basedir = path.join(dir, 'bar');
75
76 t.equal(
77 resolve.sync('foo', { basedir: basedir }),
78 path.join(dir, 'bar/node_modules/foo/index.js'),
79 'foo in bar'
80 );
81 if (!requireResolveDefaultPathsBroken && requireResolveSupportsPaths) {
82 t.equal(
83 resolve.sync('foo', { basedir: basedir }),
84 require.resolve('foo', { paths: [basedir] }),
85 'foo in bar: resolve.sync === require.resolve'
86 );
87 }
88
89 t.end();
90});
91
92test('baz', function (t) {
93 var dir = path.join(__dirname, 'resolver');
94
95 t.equal(
96 resolve.sync('./baz', { basedir: dir }),
97 path.join(dir, 'baz/quux.js'),
98 './baz'
99 );
100 if (requireResolveSupportsPaths) {
101 t.equal(
102 resolve.sync('./baz', { basedir: dir }),
103 require.resolve('./baz', { paths: [dir] }),
104 './baz: resolve.sync === require.resolve'
105 );
106 }
107
108 t.end();
109});
110
111test('biz', function (t) {
112 var dir = path.join(__dirname, 'resolver/biz/node_modules');
113
114 t.equal(
115 resolve.sync('./grux', { basedir: dir }),
116 path.join(dir, 'grux/index.js')
117 );
118 if (requireResolveSupportsPaths) {
119 t.equal(
120 resolve.sync('./grux', { basedir: dir }),
121 require.resolve('./grux', { paths: [dir] }),
122 './grux: resolve.sync === require.resolve'
123 );
124 }
125
126 var tivDir = path.join(dir, 'grux');
127 t.equal(
128 resolve.sync('tiv', { basedir: tivDir }),
129 path.join(dir, 'tiv/index.js')
130 );
131 if (!requireResolveDefaultPathsBroken && requireResolveSupportsPaths) {
132 t.equal(
133 resolve.sync('tiv', { basedir: tivDir }),
134 require.resolve('tiv', { paths: [tivDir] }),
135 'tiv: resolve.sync === require.resolve'
136 );
137 }
138
139 var gruxDir = path.join(dir, 'tiv');
140 t.equal(
141 resolve.sync('grux', { basedir: gruxDir }),
142 path.join(dir, 'grux/index.js')
143 );
144 if (!requireResolveDefaultPathsBroken && requireResolveSupportsPaths) {
145 t.equal(
146 resolve.sync('grux', { basedir: gruxDir }),
147 require.resolve('grux', { paths: [gruxDir] }),
148 'grux: resolve.sync === require.resolve'
149 );
150 }
151
152 t.end();
153});
154
155test('normalize', function (t) {
156 var dir = path.join(__dirname, 'resolver/biz/node_modules/grux');
157
158 t.equal(
159 resolve.sync('../grux', { basedir: dir }),
160 path.join(dir, 'index.js')
161 );
162 if (requireResolveSupportsPaths) {
163 t.equal(
164 resolve.sync('../grux', { basedir: dir }),
165 require.resolve('../grux', { paths: [dir] }),
166 '../grux: resolve.sync === require.resolve'
167 );
168 }
169
170 t.end();
171});
172
173test('cup', function (t) {
174 var dir = path.join(__dirname, 'resolver');
175
176 t.equal(
177 resolve.sync('./cup', {
178 basedir: dir,
179 extensions: ['.js', '.coffee']
180 }),
181 path.join(dir, 'cup.coffee'),
182 './cup -> ./cup.coffee'
183 );
184
185 t.equal(
186 resolve.sync('./cup.coffee', { basedir: dir }),
187 path.join(dir, 'cup.coffee'),
188 './cup.coffee'
189 );
190
191 t.throws(function () {
192 resolve.sync('./cup', {
193 basedir: dir,
194 extensions: ['.js']
195 });
196 });
197
198 if (requireResolveSupportsPaths) {
199 t.equal(
200 resolve.sync('./cup.coffee', { basedir: dir, extensions: ['.js', '.coffee'] }),
201 require.resolve('./cup.coffee', { paths: [dir] }),
202 './cup.coffee: resolve.sync === require.resolve'
203 );
204 }
205
206 t.end();
207});
208
209test('mug', function (t) {
210 var dir = path.join(__dirname, 'resolver');
211
212 t.equal(
213 resolve.sync('./mug', { basedir: dir }),
214 path.join(dir, 'mug.js'),
215 './mug -> ./mug.js'
216 );
217 if (requireResolveSupportsPaths) {
218 t.equal(
219 resolve.sync('./mug', { basedir: dir }),
220 require.resolve('./mug', { paths: [dir] }),
221 './mug: resolve.sync === require.resolve'
222 );
223 }
224
225 t.equal(
226 resolve.sync('./mug', {
227 basedir: dir,
228 extensions: ['.coffee', '.js']
229 }),
230 path.join(dir, 'mug.coffee'),
231 './mug -> ./mug.coffee'
232 );
233
234 t.equal(
235 resolve.sync('./mug', {
236 basedir: dir,
237 extensions: ['.js', '.coffee']
238 }),
239 path.join(dir, 'mug.js'),
240 './mug -> ./mug.js'
241 );
242
243 t.end();
244});
245
246test('other path', function (t) {
247 var resolverDir = path.join(__dirname, 'resolver');
248 var dir = path.join(resolverDir, 'bar');
249 var otherDir = path.join(resolverDir, 'other_path');
250
251 t.equal(
252 resolve.sync('root', {
253 basedir: dir,
254 paths: [otherDir]
255 }),
256 path.join(resolverDir, 'other_path/root.js')
257 );
258
259 t.equal(
260 resolve.sync('lib/other-lib', {
261 basedir: dir,
262 paths: [otherDir]
263 }),
264 path.join(resolverDir, 'other_path/lib/other-lib.js')
265 );
266
267 t.throws(function () {
268 resolve.sync('root', { basedir: dir });
269 });
270
271 t.throws(function () {
272 resolve.sync('zzz', {
273 basedir: dir,
274 paths: [otherDir]
275 });
276 });
277
278 t.end();
279});
280
281test('path iterator', function (t) {
282 var resolverDir = path.join(__dirname, 'resolver');
283
284 function exactIterator(x, start, getPackageCandidates, opts) {
285 return [path.join(resolverDir, x)];
286 }
287
288 t.equal(
289 resolve.sync('baz', { packageIterator: exactIterator }),
290 path.join(resolverDir, 'baz/quux.js')
291 );
292
293 t.end();
294});
295
296test('incorrect main', function (t) {
297 var resolverDir = path.join(__dirname, 'resolver');
298 var dir = path.join(resolverDir, 'incorrect_main');
299
300 t.equal(
301 resolve.sync('./incorrect_main', { basedir: resolverDir }),
302 path.join(dir, 'index.js')
303 );
304 if (requireResolveSupportsPaths) {
305 t.equal(
306 resolve.sync('./incorrect_main', { basedir: resolverDir }),
307 require.resolve('./incorrect_main', { paths: [resolverDir] }),
308 './incorrect_main: resolve.sync === require.resolve'
309 );
310 }
311
312 t.end();
313});
314
315test('missing index', function (t) {
316 t.plan(requireResolveSupportsPaths ? 2 : 1);
317
318 var resolverDir = path.join(__dirname, 'resolver');
319 try {
320 resolve.sync('./missing_index', { basedir: resolverDir });
321 t.fail('did not fail');
322 } catch (err) {
323 t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
324 }
325 if (requireResolveSupportsPaths) {
326 try {
327 require.resolve('./missing_index', { basedir: resolverDir });
328 t.fail('require.resolve did not fail');
329 } catch (err) {
330 t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
331 }
332 }
333});
334
335test('missing main', function (t) {
336 var resolverDir = path.join(__dirname, 'resolver');
337
338 try {
339 resolve.sync('./missing_main', { basedir: resolverDir });
340 t.fail('require.resolve did not fail');
341 } catch (err) {
342 t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
343 }
344 if (requireResolveSupportsPaths) {
345 try {
346 resolve.sync('./missing_main', { basedir: resolverDir });
347 t.fail('require.resolve did not fail');
348 } catch (err) {
349 t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
350 }
351 }
352
353 t.end();
354});
355
356test('null main', function (t) {
357 var resolverDir = path.join(__dirname, 'resolver');
358
359 try {
360 resolve.sync('./null_main', { basedir: resolverDir });
361 t.fail('require.resolve did not fail');
362 } catch (err) {
363 t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
364 }
365 if (requireResolveSupportsPaths) {
366 try {
367 resolve.sync('./null_main', { basedir: resolverDir });
368 t.fail('require.resolve did not fail');
369 } catch (err) {
370 t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
371 }
372 }
373
374 t.end();
375});
376
377test('main: false', function (t) {
378 var basedir = path.join(__dirname, 'resolver');
379 var dir = path.join(basedir, 'false_main');
380 t.equal(
381 resolve.sync('./false_main', { basedir: basedir }),
382 path.join(dir, 'index.js'),
383 '`"main": false`: resolves to `index.js`'
384 );
385 if (requireResolveSupportsPaths) {
386 t.equal(
387 resolve.sync('./false_main', { basedir: basedir }),
388 require.resolve('./false_main', { paths: [basedir] }),
389 '`"main": false`: resolve.sync === require.resolve'
390 );
391 }
392
393 t.end();
394});
395
396function stubStatSync(fn) {
397 var statSync = fs.statSync;
398 try {
399 fs.statSync = function () {
400 throw new EvalError('Unknown Error');
401 };
402 return fn();
403 } finally {
404 fs.statSync = statSync;
405 }
406}
407
408test('#79 - re-throw non ENOENT errors from stat', function (t) {
409 var dir = path.join(__dirname, 'resolver');
410
411 stubStatSync(function () {
412 t.throws(function () {
413 resolve.sync('foo', { basedir: dir });
414 }, /Unknown Error/);
415 });
416
417 t.end();
418});
419
420test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) {
421 var dir = path.join(__dirname, 'resolver');
422 var basedir = path.join(dir, 'same_names');
423
424 t.equal(
425 resolve.sync('./foo', { basedir: basedir }),
426 path.join(dir, 'same_names/foo.js')
427 );
428 if (requireResolveSupportsPaths) {
429 t.equal(
430 resolve.sync('./foo', { basedir: basedir }),
431 require.resolve('./foo', { paths: [basedir] }),
432 './foo: resolve.sync === require.resolve'
433 );
434 }
435
436 t.equal(
437 resolve.sync('./foo/', { basedir: basedir }),
438 path.join(dir, 'same_names/foo/index.js')
439 );
440 if (requireResolveSupportsPaths) {
441 t.equal(
442 resolve.sync('./foo/', { basedir: basedir }),
443 require.resolve('./foo/', { paths: [basedir] }),
444 './foo/: resolve.sync === require.resolve'
445 );
446 }
447
448 t.end();
449});
450
451test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) {
452 var dir = path.join(__dirname, 'resolver');
453 var basedir = path.join(dir, 'same_names/foo');
454
455 t.equal(
456 resolve.sync('./', { basedir: basedir }),
457 path.join(dir, 'same_names/foo/index.js'),
458 './'
459 );
460 if (requireResolveSupportsPaths) {
461 t.equal(
462 resolve.sync('./', { basedir: basedir }),
463 require.resolve('./', { paths: [basedir] }),
464 './: resolve.sync === require.resolve'
465 );
466 }
467
468 t.equal(
469 resolve.sync('.', { basedir: basedir }),
470 path.join(dir, 'same_names/foo/index.js'),
471 '.'
472 );
473 if (requireResolveSupportsPaths) {
474 t.equal(
475 resolve.sync('.', { basedir: basedir }),
476 require.resolve('.', { paths: [basedir] }),
477 '.: resolve.sync === require.resolve',
478 { todo: true }
479 );
480 }
481
482 t.end();
483});
484
485test('sync: #121 - treating an existing file as a dir when no basedir', function (t) {
486 var testFile = path.basename(__filename);
487
488 t.test('sanity check', function (st) {
489 st.equal(
490 resolve.sync('./' + testFile),
491 __filename,
492 'sanity check'
493 );
494 st.equal(
495 resolve.sync('./' + testFile),
496 require.resolve('./' + testFile),
497 'sanity check: resolve.sync === require.resolve'
498 );
499
500 st.end();
501 });
502
503 t.test('with a fake directory', function (st) {
504 function run() { return resolve.sync('./' + testFile + '/blah'); }
505
506 st.throws(run, 'throws an error');
507
508 try {
509 run();
510 } catch (e) {
511 st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve');
512 st.equal(
513 e.message,
514 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'',
515 'can not find nonexistent module'
516 );
517 }
518
519 st.end();
520 });
521
522 t.end();
523});
524
525test('sync dot main', function (t) {
526 var start = new Date();
527
528 t.equal(
529 resolve.sync('./resolver/dot_main'),
530 path.join(__dirname, 'resolver/dot_main/index.js'),
531 './resolver/dot_main'
532 );
533 t.equal(
534 resolve.sync('./resolver/dot_main'),
535 require.resolve('./resolver/dot_main'),
536 './resolver/dot_main: resolve.sync === require.resolve'
537 );
538
539 t.ok(new Date() - start < 50, 'resolve.sync timedout');
540
541 t.end();
542});
543
544test('sync dot slash main', function (t) {
545 var start = new Date();
546
547 t.equal(
548 resolve.sync('./resolver/dot_slash_main'),
549 path.join(__dirname, 'resolver/dot_slash_main/index.js')
550 );
551 t.equal(
552 resolve.sync('./resolver/dot_slash_main'),
553 require.resolve('./resolver/dot_slash_main'),
554 './resolver/dot_slash_main: resolve.sync === require.resolve'
555 );
556
557 t.ok(new Date() - start < 50, 'resolve.sync timedout');
558
559 t.end();
560});
561
562test('not a directory', function (t) {
563 var path = './foo';
564 try {
565 resolve.sync(path, { basedir: __filename });
566 t.fail();
567 } catch (err) {
568 t.ok(err, 'a non-directory errors');
569 t.equal(err && err.message, 'Cannot find module \'' + path + "' from '" + __filename + "'");
570 t.equal(err && err.code, 'MODULE_NOT_FOUND');
571 }
572 t.end();
573});
574
575test('non-string "main" field in package.json', function (t) {
576 var dir = path.join(__dirname, 'resolver');
577 try {
578 var result = resolve.sync('./invalid_main', { basedir: dir });
579 t.equal(result, undefined, 'result should not exist');
580 t.fail('should not get here');
581 } catch (err) {
582 t.ok(err, 'errors on non-string main');
583 t.equal(err.message, 'package “invalid_main” `main` must be a string');
584 t.equal(err.code, 'INVALID_PACKAGE_MAIN');
585 }
586 t.end();
587});
588
589test('non-string "main" field in package.json', function (t) {
590 var dir = path.join(__dirname, 'resolver');
591 try {
592 var result = resolve.sync('./invalid_main', { basedir: dir });
593 t.equal(result, undefined, 'result should not exist');
594 t.fail('should not get here');
595 } catch (err) {
596 t.ok(err, 'errors on non-string main');
597 t.equal(err.message, 'package “invalid_main” `main` must be a string');
598 t.equal(err.code, 'INVALID_PACKAGE_MAIN');
599 }
600 t.end();
601});
602
603test('browser field in package.json', function (t) {
604 var dir = path.join(__dirname, 'resolver');
605 var res = resolve.sync('./browser_field', {
606 basedir: dir,
607 packageFilter: function packageFilter(pkg) {
608 if (pkg.browser) {
609 pkg.main = pkg.browser; // eslint-disable-line no-param-reassign
610 delete pkg.browser; // eslint-disable-line no-param-reassign
611 }
612 return pkg;
613 }
614 });
615 t.equal(res, path.join(dir, 'browser_field', 'b.js'));
616 t.end();
617});
618
619test('absolute paths', function (t) {
620 var extensionless = __filename.slice(0, -path.extname(__filename).length);
621
622 t.equal(
623 resolve.sync(__filename),
624 __filename,
625 'absolute path to this file resolves'
626 );
627 t.equal(
628 resolve.sync(__filename),
629 require.resolve(__filename),
630 'absolute path to this file: resolve.sync === require.resolve'
631 );
632
633 t.equal(
634 resolve.sync(extensionless),
635 __filename,
636 'extensionless absolute path to this file resolves'
637 );
638 t.equal(
639 resolve.sync(__filename),
640 require.resolve(__filename),
641 'absolute path to this file: resolve.sync === require.resolve'
642 );
643
644 t.equal(
645 resolve.sync(__filename, { basedir: process.cwd() }),
646 __filename,
647 'absolute path to this file with a basedir resolves'
648 );
649 if (requireResolveSupportsPaths) {
650 t.equal(
651 resolve.sync(__filename, { basedir: process.cwd() }),
652 require.resolve(__filename, { paths: [process.cwd()] }),
653 'absolute path to this file + basedir: resolve.sync === require.resolve'
654 );
655 }
656
657 t.equal(
658 resolve.sync(extensionless, { basedir: process.cwd() }),
659 __filename,
660 'extensionless absolute path to this file with a basedir resolves'
661 );
662 if (requireResolveSupportsPaths) {
663 t.equal(
664 resolve.sync(extensionless, { basedir: process.cwd() }),
665 require.resolve(extensionless, { paths: [process.cwd()] }),
666 'extensionless absolute path to this file + basedir: resolve.sync === require.resolve'
667 );
668 }
669
670 t.end();
671});
672
673var malformedDir = path.join(__dirname, 'resolver/malformed_package_json');
674test('malformed package.json', { skip: !fs.existsSync(malformedDir) }, function (t) {
675 t.plan(5 + (requireResolveSupportsPaths ? 1 : 0));
676
677 var basedir = malformedDir;
678 var expected = path.join(basedir, 'index.js');
679
680 t.equal(
681 resolve.sync('./index.js', { basedir: basedir }),
682 expected,
683 'malformed package.json is silently ignored'
684 );
685 if (requireResolveSupportsPaths) {
686 t.equal(
687 resolve.sync('./index.js', { basedir: basedir }),
688 require.resolve('./index.js', { paths: [basedir] }),
689 'malformed package.json: resolve.sync === require.resolve'
690 );
691 }
692
693 var res1 = resolve.sync(
694 './index.js',
695 {
696 basedir: basedir,
697 packageFilter: function (pkg, pkgfile, dir) {
698 t.fail('should not reach here');
699 }
700 }
701 );
702
703 t.equal(
704 res1,
705 expected,
706 'with packageFilter: malformed package.json is silently ignored'
707 );
708
709 var res2 = resolve.sync(
710 './index.js',
711 {
712 basedir: basedir,
713 readPackageSync: function (readFileSync, pkgfile) {
714 t.equal(pkgfile, path.join(basedir, 'package.json'), 'readPackageSync: `pkgfile` is package.json path');
715 var result = String(readFileSync(pkgfile));
716 try {
717 return JSON.parse(result);
718 } catch (e) {
719 t.ok(e instanceof SyntaxError, 'readPackageSync: malformed package.json parses as a syntax error');
720 }
721 }
722 }
723 );
724
725 t.equal(
726 res2,
727 expected,
728 'with readPackageSync: malformed package.json is silently ignored'
729 );
730});
Note: See TracBrowser for help on using the repository browser.