This will be a start to generalize all argument validation errors. As currently we throw ARG/OPT, OUT_OF_RANGE, and other more specific errors. The OPT errors didn't bring much to the errors as it's just another variant of ARG error which is sometimes more confusing (some of our code used OPT errors to denote just argument validation errors presumably because of similarity of OPT to 'option' and not 'options-object') and they don't specify the name of the options object where the invalid value is located. Much better approach would be to just specify path to the invalid value in the name of the value as it is done in this PR (i.e. 'options.format', 'options.publicKey.type' etc) Also since this decreases a variety of errors we have it'd be easier to reuse validation code across the codebase. Refs: https://github.com/nodejs/node/pull/31251 Refs: https://github.com/nodejs/node/pull/34070#discussion_r467251009 Signed-off-by: Denys Otrishko <shishugi@gmail.com> PR-URL: https://github.com/nodejs/node/pull/34682 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
100 lines
2.8 KiB
JavaScript
100 lines
2.8 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const path = require('path');
|
|
const nodeModules = path.join(__dirname, 'node_modules');
|
|
const nestedNodeModules = path.join(__dirname, 'node_modules', 'node_modules');
|
|
const nestedIndex = path.join(__dirname, 'nested-index');
|
|
|
|
// Test the default behavior.
|
|
assert.strictEqual(
|
|
require.resolve('bar'),
|
|
path.join(nodeModules, 'bar.js')
|
|
);
|
|
|
|
// Verify that existing paths are removed.
|
|
assert.throws(() => {
|
|
require.resolve('bar', { paths: [] })
|
|
}, /^Error: Cannot find module 'bar'/);
|
|
|
|
// Verify that resolution path can be overwritten.
|
|
{
|
|
// three.js cannot be loaded from this file by default.
|
|
assert.throws(() => {
|
|
require.resolve('three')
|
|
}, /^Error: Cannot find module 'three'/);
|
|
|
|
// If the nested-index directory is provided as a resolve path, 'three'
|
|
// cannot be found because nested-index is used as a starting point and not
|
|
// a searched directory.
|
|
assert.throws(() => {
|
|
require.resolve('three', { paths: [nestedIndex] })
|
|
}, /^Error: Cannot find module 'three'/);
|
|
|
|
// Resolution from nested index directory also checks node_modules.
|
|
assert.strictEqual(
|
|
require.resolve('bar', { paths: [nestedIndex] }),
|
|
path.join(nodeModules, 'bar.js')
|
|
);
|
|
}
|
|
|
|
// Verify that the default paths can be used and modified.
|
|
{
|
|
const paths = require.resolve.paths('bar');
|
|
|
|
assert.strictEqual(paths[0], nodeModules);
|
|
assert.strictEqual(
|
|
require.resolve('bar', { paths }),
|
|
path.join(nodeModules, 'bar.js')
|
|
);
|
|
|
|
paths.unshift(nestedNodeModules);
|
|
assert.strictEqual(
|
|
require.resolve('bar', { paths }),
|
|
path.join(nodeModules, 'bar.js')
|
|
);
|
|
}
|
|
|
|
// Verify that relative request paths work properly.
|
|
{
|
|
const searchIn = './' + path.relative(process.cwd(), nestedIndex);
|
|
|
|
// Search in relative paths.
|
|
assert.strictEqual(
|
|
require.resolve('./three.js', { paths: [searchIn] }),
|
|
path.join(nestedIndex, 'three.js')
|
|
);
|
|
|
|
// Search in absolute paths.
|
|
assert.strictEqual(
|
|
require.resolve('./three.js', { paths: [nestedIndex] }),
|
|
path.join(nestedIndex, 'three.js')
|
|
);
|
|
|
|
// Repeat the same tests with Windows slashes in the request path.
|
|
if (common.isWindows) {
|
|
assert.strictEqual(
|
|
require.resolve('.\\three.js', { paths: [searchIn] }),
|
|
path.join(nestedIndex, 'three.js')
|
|
);
|
|
|
|
assert.strictEqual(
|
|
require.resolve('.\\three.js', { paths: [nestedIndex] }),
|
|
path.join(nestedIndex, 'three.js')
|
|
);
|
|
}
|
|
}
|
|
|
|
// Test paths option validation
|
|
assert.throws(() => {
|
|
require.resolve('.\\three.js', { paths: 'foo' })
|
|
}, {
|
|
code: 'ERR_INVALID_ARG_VALUE',
|
|
name: 'TypeError',
|
|
});
|
|
|
|
// Verify that the default require.resolve() is used for empty options.
|
|
assert.strictEqual(
|
|
require.resolve('./printA.js', {}),
|
|
require.resolve('./printA.js')
|
|
);
|