1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const path = require('path'); 5const nodeModules = path.join(__dirname, 'node_modules'); 6const nestedNodeModules = path.join(__dirname, 'node_modules', 'node_modules'); 7const nestedIndex = path.join(__dirname, 'nested-index'); 8 9// Test the default behavior. 10assert.strictEqual( 11 require.resolve('bar'), 12 path.join(nodeModules, 'bar.js') 13); 14 15// Verify that existing paths are removed. 16assert.throws(() => { 17 require.resolve('bar', { paths: [] }) 18}, /^Error: Cannot find module 'bar'/); 19 20// Verify that resolution path can be overwritten. 21{ 22 // three.js cannot be loaded from this file by default. 23 assert.throws(() => { 24 require.resolve('three') 25 }, /^Error: Cannot find module 'three'/); 26 27 // If the nested-index directory is provided as a resolve path, 'three' 28 // cannot be found because nested-index is used as a starting point and not 29 // a searched directory. 30 assert.throws(() => { 31 require.resolve('three', { paths: [nestedIndex] }) 32 }, /^Error: Cannot find module 'three'/); 33 34 // Resolution from nested index directory also checks node_modules. 35 assert.strictEqual( 36 require.resolve('bar', { paths: [nestedIndex] }), 37 path.join(nodeModules, 'bar.js') 38 ); 39} 40 41// Verify that the default paths can be used and modified. 42{ 43 const paths = require.resolve.paths('bar'); 44 45 assert.strictEqual(paths[0], nodeModules); 46 assert.strictEqual( 47 require.resolve('bar', { paths }), 48 path.join(nodeModules, 'bar.js') 49 ); 50 51 paths.unshift(nestedNodeModules); 52 assert.strictEqual( 53 require.resolve('bar', { paths }), 54 path.join(nodeModules, 'bar.js') 55 ); 56} 57 58// Verify that relative request paths work properly. 59{ 60 const searchIn = './' + path.relative(process.cwd(), nestedIndex); 61 62 // Search in relative paths. 63 assert.strictEqual( 64 require.resolve('./three.js', { paths: [searchIn] }), 65 path.join(nestedIndex, 'three.js') 66 ); 67 68 // Search in absolute paths. 69 assert.strictEqual( 70 require.resolve('./three.js', { paths: [nestedIndex] }), 71 path.join(nestedIndex, 'three.js') 72 ); 73 74 // Repeat the same tests with Windows slashes in the request path. 75 if (common.isWindows) { 76 assert.strictEqual( 77 require.resolve('.\\three.js', { paths: [searchIn] }), 78 path.join(nestedIndex, 'three.js') 79 ); 80 81 assert.strictEqual( 82 require.resolve('.\\three.js', { paths: [nestedIndex] }), 83 path.join(nestedIndex, 'three.js') 84 ); 85 } 86} 87 88// Test paths option validation 89assert.throws(() => { 90 require.resolve('.\\three.js', { paths: 'foo' }) 91}, { 92 code: 'ERR_INVALID_ARG_VALUE', 93 name: 'TypeError', 94}); 95 96// Verify that the default require.resolve() is used for empty options. 97assert.strictEqual( 98 require.resolve('./printA.js', {}), 99 require.resolve('./printA.js') 100); 101 102assert.strictEqual( 103 require.resolve('no_index/'), 104 path.join(__dirname, 'node_modules', 'no_index', 'lib', 'index.js'), 105) 106