• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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