This commit is contained in:
2022-07-18 02:50:52 +00:00
parent befd344ab0
commit 06181b34d6
8569 changed files with 818704 additions and 352705 deletions
+22 -5
View File
@@ -1,20 +1,37 @@
root = true
[*]
indent_style = tab
indent_size = 4
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150
max_line_length = 200
[*.js]
block_comment_start = /*
block_comment = *
block_comment_end = */
[*.yml]
indent_size = 1
[package.json]
indent_style = tab
[lib/core.json]
indent_style = tab
[CHANGELOG.md]
indent_style = space
indent_size = 2
[*.json]
[{*.json,Makefile}]
max_line_length = off
[Makefile]
[test/{dotdot,resolver,module_dir,multirepo,node_path,pathfilter,precedence}/**/*]
indent_style = off
indent_size = off
max_line_length = off
insert_final_newline = off
+34 -8
View File
@@ -1,9 +1,9 @@
{
"extends": "@ljharb",
"root": true,
"extends": "@ljharb",
"rules": {
"array-bracket-newline": 0,
"array-element-newline": 0,
"indent": [2, 4],
"strict": 0,
"complexity": 0,
@@ -12,28 +12,54 @@
"dot-notation": [2, { "allowKeywords": true }],
"func-name-matching": 0,
"func-style": 0,
"global-require": 0,
"global-require": 1,
"id-length": [2, { "min": 1, "max": 30 }],
"max-lines": [2, 350],
"max-lines-per-function": 0,
"max-nested-callbacks": 0,
"max-params": 0,
"max-statements-per-line": [2, { "max": 2 }],
"max-statements": 0,
"no-magic-numbers": 0,
"no-console": 0,
"no-shadow": 0,
"no-unused-vars": [2, { "vars": "all", "args": "none" }],
"no-use-before-define": 0,
"object-curly-newline": 0,
"operator-linebreak": [2, "before"],
"sort-keys": 0,
},
"overrides": [
{
"files": "bin/**",
"rules": {
"no-process-exit": "off",
},
},
{
"files": "example/**",
"rules": {
"no-console": 0,
},
},
{
"files": "test/resolver/nested_symlinks/mylib/*.js",
"rules": {
"no-throw-literal": 0,
},
},
{
"files": "test/**",
"parserOptions": {
"ecmaVersion": 5,
"allowReserved": false,
},
"rules": {
"dot-notation": [2, { "allowPattern": "throws" }],
"max-lines": 0,
"max-lines-per-function": 0,
"no-unused-vars": [2, { "vars": "all", "args": "none" }],
},
},
],
"ignorePatterns": [
"./test/resolver/malformed_package_json/package.json",
],
}
+12
View File
@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/resolve
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
+3
View File
@@ -0,0 +1,3 @@
# Security
Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
+3
View File
@@ -0,0 +1,3 @@
'use strict';
module.exports = require('./lib/async');
Generated Vendored Executable
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env node
'use strict';
var path = require('path');
var fs = require('fs');
if (
String(process.env.npm_lifecycle_script).slice(0, 8) !== 'resolve '
&& (
!process.argv
|| process.argv.length < 2
|| (process.argv[1] !== __filename && fs.statSync(process.argv[1]).ino !== fs.statSync(__filename).ino)
|| (process.env._ && path.resolve(process.env._) !== __filename)
)
) {
console.error('Error: `resolve` must be run directly as an executable');
process.exit(1);
}
var supportsPreserveSymlinkFlag = require('supports-preserve-symlinks-flag');
var preserveSymlinks = false;
for (var i = 2; i < process.argv.length; i += 1) {
if (process.argv[i].slice(0, 2) === '--') {
if (supportsPreserveSymlinkFlag && process.argv[i] === '--preserve-symlinks') {
preserveSymlinks = true;
} else if (process.argv[i].length > 2) {
console.error('Unknown argument ' + process.argv[i].replace(/[=].*$/, ''));
process.exit(2);
}
process.argv.splice(i, 1);
i -= 1;
if (process.argv[i] === '--') { break; } // eslint-disable-line no-restricted-syntax
}
}
if (process.argv.length < 3) {
console.error('Error: `resolve` expects a specifier');
process.exit(2);
}
var resolve = require('../');
var result = resolve.sync(process.argv[2], {
basedir: process.cwd(),
preserveSymlinks: preserveSymlinks
});
console.log(result);
+44 -13
View File
@@ -1,11 +1,20 @@
var fs = require('fs');
var getHomedir = require('./homedir');
var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
var normalizeOptions = require('./normalize-options.js');
var isCore = require('./is-core');
var caller = require('./caller');
var nodeModulesPaths = require('./node-modules-paths');
var normalizeOptions = require('./normalize-options');
var isCore = require('is-core-module');
var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;
var realpathFS = process.platform !== 'win32' && fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;
var homedir = getHomedir();
var defaultPaths = function () {
return [
path.join(homedir, '.node_modules'),
path.join(homedir, '.node_libraries')
];
};
var defaultIsFile = function isFile(file, cb) {
fs.stat(file, function (err, stat) {
@@ -42,6 +51,20 @@ var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) {
}
};
var defaultReadPackage = function defaultReadPackage(readFile, pkgfile, cb) {
readFile(pkgfile, function (readFileErr, body) {
if (readFileErr) cb(readFileErr);
else {
try {
var pkg = JSON.parse(body);
cb(null, pkg);
} catch (jsonErr) {
cb(null);
}
}
});
};
var getPackageCandidates = function getPackageCandidates(x, start, opts) {
var dirs = nodeModulesPaths(start, opts, x);
for (var i = 0; i < dirs.length; i++) {
@@ -70,13 +93,21 @@ module.exports = function resolve(x, options, callback) {
var isDirectory = opts.isDirectory || defaultIsDir;
var readFile = opts.readFile || fs.readFile;
var realpath = opts.realpath || defaultRealpath;
var readPackage = opts.readPackage || defaultReadPackage;
if (opts.readFile && opts.readPackage) {
var conflictErr = new TypeError('`readFile` and `readPackage` are mutually exclusive.');
return process.nextTick(function () {
cb(conflictErr);
});
}
var packageIterator = opts.packageIterator;
var extensions = opts.extensions || ['.js'];
var includeCoreModules = opts.includeCoreModules !== false;
var basedir = opts.basedir || path.dirname(caller());
var parent = opts.filename || basedir;
opts.paths = opts.paths || [];
opts.paths = opts.paths || defaultPaths();
// ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
var absoluteStart = path.resolve(basedir);
@@ -99,7 +130,7 @@ module.exports = function resolve(x, options, callback) {
if ((/\/$/).test(x) && res === basedir) {
loadAsDirectory(res, opts.package, onfile);
} else loadAsFile(res, opts.package, onfile);
} else if (isCore(x)) {
} else if (includeCoreModules && isCore(x)) {
return cb(null, x);
} else loadNodeModules(x, basedir, function (err, n, pkg) {
if (err) cb(err);
@@ -196,9 +227,10 @@ module.exports = function resolve(x, options, callback) {
// on err, ex is false
if (!ex) return loadpkg(path.dirname(dir), cb);
readFile(pkgfile, function (err, body) {
readPackage(readFile, pkgfile, function (err, pkgParam) {
if (err) cb(err);
try { var pkg = JSON.parse(body); } catch (jsonErr) {}
var pkg = pkgParam;
if (pkg && opts.packageFilter) {
pkg = opts.packageFilter(pkg, pkgfile);
@@ -224,11 +256,10 @@ module.exports = function resolve(x, options, callback) {
if (err) return cb(err);
if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb);
readFile(pkgfile, function (err, body) {
readPackage(readFile, pkgfile, function (err, pkgParam) {
if (err) return cb(err);
try {
var pkg = JSON.parse(body);
} catch (jsonErr) {}
var pkg = pkgParam;
if (pkg && opts.packageFilter) {
pkg = opts.packageFilter(pkg, pkgfile);
+3 -4
View File
@@ -6,8 +6,8 @@ function specifierIncluded(specifier) {
var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');
for (var i = 0; i < 3; ++i) {
var cur = Number(current[i] || 0);
var ver = Number(versionParts[i] || 0);
var cur = parseInt(current[i] || 0, 10);
var ver = parseInt(versionParts[i] || 0, 10);
if (cur === ver) {
continue; // eslint-disable-line no-restricted-syntax, no-continue
}
@@ -15,9 +15,8 @@ function specifierIncluded(specifier) {
return cur < ver;
} else if (op === '>=') {
return cur >= ver;
} else {
return false;
}
return false;
}
return op === '>=';
}
+151 -73
View File
@@ -1,75 +1,153 @@
{
"assert": true,
"async_hooks": ">= 8",
"buffer_ieee754": "< 0.9.7",
"buffer": true,
"child_process": true,
"cluster": true,
"console": true,
"constants": true,
"crypto": true,
"_debug_agent": ">= 1 && < 8",
"_debugger": "< 8",
"dgram": true,
"dns": true,
"domain": true,
"events": true,
"freelist": "< 6",
"fs": true,
"fs/promises": [">= 10 && < 10.1", ">= 14"],
"_http_agent": ">= 0.11.1",
"_http_client": ">= 0.11.1",
"_http_common": ">= 0.11.1",
"_http_incoming": ">= 0.11.1",
"_http_outgoing": ">= 0.11.1",
"_http_server": ">= 0.11.1",
"http": true,
"http2": ">= 8.8",
"https": true,
"inspector": ">= 8.0.0",
"_linklist": "< 8",
"module": true,
"net": true,
"node-inspect/lib/_inspect": ">= 7.6.0 && < 12",
"node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12",
"node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12",
"os": true,
"path": true,
"perf_hooks": ">= 8.5",
"process": ">= 1",
"punycode": true,
"querystring": true,
"readline": true,
"repl": true,
"smalloc": ">= 0.11.5 && < 3",
"_stream_duplex": ">= 0.9.4",
"_stream_transform": ">= 0.9.4",
"_stream_wrap": ">= 1.4.1",
"_stream_passthrough": ">= 0.9.4",
"_stream_readable": ">= 0.9.4",
"_stream_writable": ">= 0.9.4",
"stream": true,
"string_decoder": true,
"sys": true,
"timers": true,
"_tls_common": ">= 0.11.13",
"_tls_legacy": ">= 0.11.3 && < 10",
"_tls_wrap": ">= 0.11.3",
"tls": true,
"trace_events": ">= 10",
"tty": true,
"url": true,
"util": true,
"v8/tools/arguments": ">= 10 && < 12",
"v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
"v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
"v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
"v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
"v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
"v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
"v8": ">= 1",
"vm": true,
"wasi": ">= 13.4 && < 13.5",
"worker_threads": ">= 11.7",
"zlib": true
"assert": true,
"node:assert": [">= 14.18 && < 15", ">= 16"],
"assert/strict": ">= 15",
"node:assert/strict": ">= 16",
"async_hooks": ">= 8",
"node:async_hooks": [">= 14.18 && < 15", ">= 16"],
"buffer_ieee754": ">= 0.5 && < 0.9.7",
"buffer": true,
"node:buffer": [">= 14.18 && < 15", ">= 16"],
"child_process": true,
"node:child_process": [">= 14.18 && < 15", ">= 16"],
"cluster": ">= 0.5",
"node:cluster": [">= 14.18 && < 15", ">= 16"],
"console": true,
"node:console": [">= 14.18 && < 15", ">= 16"],
"constants": true,
"node:constants": [">= 14.18 && < 15", ">= 16"],
"crypto": true,
"node:crypto": [">= 14.18 && < 15", ">= 16"],
"_debug_agent": ">= 1 && < 8",
"_debugger": "< 8",
"dgram": true,
"node:dgram": [">= 14.18 && < 15", ">= 16"],
"diagnostics_channel": [">= 14.17 && < 15", ">= 15.1"],
"node:diagnostics_channel": [">= 14.18 && < 15", ">= 16"],
"dns": true,
"node:dns": [">= 14.18 && < 15", ">= 16"],
"dns/promises": ">= 15",
"node:dns/promises": ">= 16",
"domain": ">= 0.7.12",
"node:domain": [">= 14.18 && < 15", ">= 16"],
"events": true,
"node:events": [">= 14.18 && < 15", ">= 16"],
"freelist": "< 6",
"fs": true,
"node:fs": [">= 14.18 && < 15", ">= 16"],
"fs/promises": [">= 10 && < 10.1", ">= 14"],
"node:fs/promises": [">= 14.18 && < 15", ">= 16"],
"_http_agent": ">= 0.11.1",
"node:_http_agent": [">= 14.18 && < 15", ">= 16"],
"_http_client": ">= 0.11.1",
"node:_http_client": [">= 14.18 && < 15", ">= 16"],
"_http_common": ">= 0.11.1",
"node:_http_common": [">= 14.18 && < 15", ">= 16"],
"_http_incoming": ">= 0.11.1",
"node:_http_incoming": [">= 14.18 && < 15", ">= 16"],
"_http_outgoing": ">= 0.11.1",
"node:_http_outgoing": [">= 14.18 && < 15", ">= 16"],
"_http_server": ">= 0.11.1",
"node:_http_server": [">= 14.18 && < 15", ">= 16"],
"http": true,
"node:http": [">= 14.18 && < 15", ">= 16"],
"http2": ">= 8.8",
"node:http2": [">= 14.18 && < 15", ">= 16"],
"https": true,
"node:https": [">= 14.18 && < 15", ">= 16"],
"inspector": ">= 8",
"node:inspector": [">= 14.18 && < 15", ">= 16"],
"_linklist": "< 8",
"module": true,
"node:module": [">= 14.18 && < 15", ">= 16"],
"net": true,
"node:net": [">= 14.18 && < 15", ">= 16"],
"node-inspect/lib/_inspect": ">= 7.6 && < 12",
"node-inspect/lib/internal/inspect_client": ">= 7.6 && < 12",
"node-inspect/lib/internal/inspect_repl": ">= 7.6 && < 12",
"os": true,
"node:os": [">= 14.18 && < 15", ">= 16"],
"path": true,
"node:path": [">= 14.18 && < 15", ">= 16"],
"path/posix": ">= 15.3",
"node:path/posix": ">= 16",
"path/win32": ">= 15.3",
"node:path/win32": ">= 16",
"perf_hooks": ">= 8.5",
"node:perf_hooks": [">= 14.18 && < 15", ">= 16"],
"process": ">= 1",
"node:process": [">= 14.18 && < 15", ">= 16"],
"punycode": ">= 0.5",
"node:punycode": [">= 14.18 && < 15", ">= 16"],
"querystring": true,
"node:querystring": [">= 14.18 && < 15", ">= 16"],
"readline": true,
"node:readline": [">= 14.18 && < 15", ">= 16"],
"readline/promises": ">= 17",
"node:readline/promises": ">= 17",
"repl": true,
"node:repl": [">= 14.18 && < 15", ">= 16"],
"smalloc": ">= 0.11.5 && < 3",
"_stream_duplex": ">= 0.9.4",
"node:_stream_duplex": [">= 14.18 && < 15", ">= 16"],
"_stream_transform": ">= 0.9.4",
"node:_stream_transform": [">= 14.18 && < 15", ">= 16"],
"_stream_wrap": ">= 1.4.1",
"node:_stream_wrap": [">= 14.18 && < 15", ">= 16"],
"_stream_passthrough": ">= 0.9.4",
"node:_stream_passthrough": [">= 14.18 && < 15", ">= 16"],
"_stream_readable": ">= 0.9.4",
"node:_stream_readable": [">= 14.18 && < 15", ">= 16"],
"_stream_writable": ">= 0.9.4",
"node:_stream_writable": [">= 14.18 && < 15", ">= 16"],
"stream": true,
"node:stream": [">= 14.18 && < 15", ">= 16"],
"stream/consumers": ">= 16.7",
"node:stream/consumers": ">= 16.7",
"stream/promises": ">= 15",
"node:stream/promises": ">= 16",
"stream/web": ">= 16.5",
"node:stream/web": ">= 16.5",
"string_decoder": true,
"node:string_decoder": [">= 14.18 && < 15", ">= 16"],
"sys": [">= 0.4 && < 0.7", ">= 0.8"],
"node:sys": [">= 14.18 && < 15", ">= 16"],
"node:test": ">= 18",
"timers": true,
"node:timers": [">= 14.18 && < 15", ">= 16"],
"timers/promises": ">= 15",
"node:timers/promises": ">= 16",
"_tls_common": ">= 0.11.13",
"node:_tls_common": [">= 14.18 && < 15", ">= 16"],
"_tls_legacy": ">= 0.11.3 && < 10",
"_tls_wrap": ">= 0.11.3",
"node:_tls_wrap": [">= 14.18 && < 15", ">= 16"],
"tls": true,
"node:tls": [">= 14.18 && < 15", ">= 16"],
"trace_events": ">= 10",
"node:trace_events": [">= 14.18 && < 15", ">= 16"],
"tty": true,
"node:tty": [">= 14.18 && < 15", ">= 16"],
"url": true,
"node:url": [">= 14.18 && < 15", ">= 16"],
"util": true,
"node:util": [">= 14.18 && < 15", ">= 16"],
"util/types": ">= 15.3",
"node:util/types": ">= 16",
"v8/tools/arguments": ">= 10 && < 12",
"v8/tools/codemap": [">= 4.4 && < 5", ">= 5.2 && < 12"],
"v8/tools/consarray": [">= 4.4 && < 5", ">= 5.2 && < 12"],
"v8/tools/csvparser": [">= 4.4 && < 5", ">= 5.2 && < 12"],
"v8/tools/logreader": [">= 4.4 && < 5", ">= 5.2 && < 12"],
"v8/tools/profile_view": [">= 4.4 && < 5", ">= 5.2 && < 12"],
"v8/tools/splaytree": [">= 4.4 && < 5", ">= 5.2 && < 12"],
"v8": ">= 1",
"node:v8": [">= 14.18 && < 15", ">= 16"],
"vm": true,
"node:vm": [">= 14.18 && < 15", ">= 16"],
"wasi": ">= 13.4 && < 13.5",
"worker_threads": ">= 11.7",
"node:worker_threads": [">= 14.18 && < 15", ">= 16"],
"zlib": ">= 0.5",
"node:zlib": [">= 14.18 && < 15", ">= 16"]
}
+24
View File
@@ -0,0 +1,24 @@
'use strict';
var os = require('os');
// adapted from https://github.com/sindresorhus/os-homedir/blob/11e089f4754db38bb535e5a8416320c4446e8cfd/index.js
module.exports = os.homedir || function homedir() {
var home = process.env.HOME;
var user = process.env.LOGNAME || process.env.USER || process.env.LNAME || process.env.USERNAME;
if (process.platform === 'win32') {
return process.env.USERPROFILE || process.env.HOMEDRIVE + process.env.HOMEPATH || home || null;
}
if (process.platform === 'darwin') {
return home || (user ? '/Users/' + user : null);
}
if (process.platform === 'linux') {
return home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null)); // eslint-disable-line no-extra-parens
}
return home || null;
};
+2 -2
View File
@@ -1,5 +1,5 @@
var core = require('./core');
var isCoreModule = require('is-core-module');
module.exports = function isCore(x) {
return Object.prototype.hasOwnProperty.call(core, x);
return isCoreModule(x);
};
+1 -1
View File
@@ -1,5 +1,5 @@
var path = require('path');
var parse = path.parse || require('path-parse');
var parse = path.parse || require('path-parse'); // eslint-disable-line global-require
var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) {
var prefix = '/';
+35 -18
View File
@@ -1,30 +1,39 @@
var isCore = require('./is-core');
var isCore = require('is-core-module');
var fs = require('fs');
var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
var normalizeOptions = require('./normalize-options.js');
var getHomedir = require('./homedir');
var caller = require('./caller');
var nodeModulesPaths = require('./node-modules-paths');
var normalizeOptions = require('./normalize-options');
var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync;
var realpathFS = process.platform !== 'win32' && fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync;
var homedir = getHomedir();
var defaultPaths = function () {
return [
path.join(homedir, '.node_modules'),
path.join(homedir, '.node_libraries')
];
};
var defaultIsFile = function isFile(file) {
try {
var stat = fs.statSync(file);
var stat = fs.statSync(file, { throwIfNoEntry: false });
} catch (e) {
if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
throw e;
}
return stat.isFile() || stat.isFIFO();
return !!stat && (stat.isFile() || stat.isFIFO());
};
var defaultIsDir = function isDirectory(dir) {
try {
var stat = fs.statSync(dir);
var stat = fs.statSync(dir, { throwIfNoEntry: false });
} catch (e) {
if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
throw e;
}
return stat.isDirectory();
return !!stat && stat.isDirectory();
};
var defaultRealpathSync = function realpathSync(x) {
@@ -45,6 +54,14 @@ var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) {
return x;
};
var defaultReadPackageSync = function defaultReadPackageSync(readFileSync, pkgfile) {
var body = readFileSync(pkgfile);
try {
var pkg = JSON.parse(body);
return pkg;
} catch (jsonErr) {}
};
var getPackageCandidates = function getPackageCandidates(x, start, opts) {
var dirs = nodeModulesPaths(start, opts, x);
for (var i = 0; i < dirs.length; i++) {
@@ -63,13 +80,18 @@ module.exports = function resolveSync(x, options) {
var readFileSync = opts.readFileSync || fs.readFileSync;
var isDirectory = opts.isDirectory || defaultIsDir;
var realpathSync = opts.realpathSync || defaultRealpathSync;
var readPackageSync = opts.readPackageSync || defaultReadPackageSync;
if (opts.readFileSync && opts.readPackageSync) {
throw new TypeError('`readFileSync` and `readPackageSync` are mutually exclusive.');
}
var packageIterator = opts.packageIterator;
var extensions = opts.extensions || ['.js'];
var includeCoreModules = opts.includeCoreModules !== false;
var basedir = opts.basedir || path.dirname(caller());
var parent = opts.filename || basedir;
opts.paths = opts.paths || [];
opts.paths = opts.paths || defaultPaths();
// ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts);
@@ -79,7 +101,7 @@ module.exports = function resolveSync(x, options) {
if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/';
var m = loadAsFileSync(res) || loadAsDirectorySync(res);
if (m) return maybeRealpathSync(realpathSync, m, opts);
} else if (isCore(x)) {
} else if (includeCoreModules && isCore(x)) {
return x;
} else {
var n = loadNodeModulesSync(x, absoluteStart);
@@ -126,11 +148,7 @@ module.exports = function resolveSync(x, options) {
return loadpkg(path.dirname(dir));
}
var body = readFileSync(pkgfile);
try {
var pkg = JSON.parse(body);
} catch (jsonErr) {}
var pkg = readPackageSync(readFileSync, pkgfile);
if (pkg && opts.packageFilter) {
// v2 will pass pkgfile
@@ -144,8 +162,7 @@ module.exports = function resolveSync(x, options) {
var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json');
if (isFile(pkgfile)) {
try {
var body = readFileSync(pkgfile, 'UTF8');
var pkg = JSON.parse(body);
var pkg = readPackageSync(readFileSync, pkgfile);
} catch (e) {}
if (pkg && opts.packageFilter) {
+46 -23
View File
@@ -1,29 +1,28 @@
{
"_args": [
[
"resolve@1.17.0",
"/mnt/Foxconn/Digitalent/Deverloper/liff-push_2series"
"resolve@1.22.1",
"/home/node/nuxt"
]
],
"_from": "resolve@1.17.0",
"_id": "resolve@1.17.0",
"_from": "resolve@1.22.1",
"_id": "resolve@1.22.1",
"_inBundle": false,
"_integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"_integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"_location": "/resolve",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "resolve@1.17.0",
"raw": "resolve@1.22.1",
"name": "resolve",
"escapedName": "resolve",
"rawSpec": "1.17.0",
"rawSpec": "1.22.1",
"saveSpec": null,
"fetchSpec": "1.17.0"
"fetchSpec": "1.22.1"
},
"_requiredBy": [
"/@babel/core",
"/@babel/plugin-transform-runtime",
"/@babel/helper-define-polyfill-provider",
"/babel-eslint",
"/eslint-import-resolver-node",
"/eslint-plugin-import",
@@ -33,29 +32,44 @@
"/pug-filters",
"/vue-server-renderer"
],
"_resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
"_spec": "1.17.0",
"_where": "/mnt/Foxconn/Digitalent/Deverloper/liff-push_2series",
"_resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"_spec": "1.22.1",
"_where": "/home/node/nuxt",
"author": {
"name": "James Halliday",
"email": "mail@substack.net",
"url": "http://substack.net"
},
"bin": {
"resolve": "bin/resolve"
},
"bugs": {
"url": "https://github.com/browserify/resolve/issues"
},
"dependencies": {
"path-parse": "^1.0.6"
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"description": "resolve like require.resolve() on behalf of files asynchronously and synchronously",
"devDependencies": {
"@ljharb/eslint-config": "^16.0.0",
"array.prototype.map": "^1.0.2",
"eslint": "^6.8.0",
"@ljharb/eslint-config": "^21.0.0",
"array.prototype.map": "^1.0.4",
"aud": "^2.0.0",
"copy-dir": "^1.3.0",
"eclint": "^2.8.1",
"eslint": "=8.8.0",
"in-publish": "^2.0.1",
"mkdirp": "^0.5.5",
"mv": "^2.1.1",
"npmignore": "^0.3.0",
"object-keys": "^1.1.1",
"safe-publish-latest": "^1.1.4",
"rimraf": "^2.7.1",
"safe-publish-latest": "^2.0.0",
"semver": "^6.3.0",
"tap": "0.4.13",
"tape": "^5.0.0-next.5"
"tape": "^5.5.3",
"tmp": "^0.0.31"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -70,19 +84,28 @@
"license": "MIT",
"main": "index.js",
"name": "resolve",
"publishConfig": {
"ignore": [
".github/workflows",
"appveyor.yml"
]
},
"repository": {
"type": "git",
"url": "git://github.com/browserify/resolve.git"
},
"scripts": {
"lint": "eslint .",
"posttest": "npm run test:multirepo",
"prepublish": "safe-publish-latest",
"lint": "eslint --ext=js,mjs --no-eslintrc -c .eslintrc . 'bin/**'",
"posttest": "npm run test:multirepo && aud --production",
"prelint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')",
"prepack": "npmignore --auto --commentLines=autogenerated",
"prepublish": "not-in-publish || npm run prepublishOnly",
"prepublishOnly": "safe-publish-latest && cp node_modules/is-core-module/core.json ./lib/ ||:",
"pretest": "npm run lint",
"pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async",
"test": "npm run --silent tests-only",
"test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test",
"tests-only": "tape test/*.js"
},
"version": "1.17.0"
"version": "1.22.1"
}
+83 -24
View File
@@ -1,18 +1,22 @@
# resolve
# resolve <sup>[![Version Badge][2]][1]</sup>
implements the [node `require.resolve()`
algorithm](https://nodejs.org/api/modules.html#modules_all_together)
such that you can `require.resolve()` on behalf of a file asynchronously and
synchronously
implements the [node `require.resolve()` algorithm](https://nodejs.org/api/modules.html#modules_all_together) such that you can `require.resolve()` on behalf of a file asynchronously and synchronously
[![build status](https://secure.travis-ci.org/browserify/resolve.png)](http://travis-ci.org/browserify/resolve)
[![github actions][actions-image]][actions-url]
[![coverage][codecov-image]][codecov-url]
[![dependency status][5]][6]
[![dev dependency status][7]][8]
[![License][license-image]][license-url]
[![Downloads][downloads-image]][downloads-url]
[![npm badge][11]][1]
# example
asynchronously resolve:
```js
var resolve = require('resolve');
var resolve = require('resolve/async'); // or, require('resolve')
resolve('tap', { basedir: __dirname }, function (err, res) {
if (err) console.error(err);
else console.log(res);
@@ -27,8 +31,8 @@ $ node example/async.js
synchronously resolve:
```js
var resolve = require('resolve');
var res = resolve.sync('tap', { basedir: __dirname });
var resolve = require('resolve/sync'); // or, `require('resolve').sync
var res = resolve('tap', { basedir: __dirname });
console.log(res);
```
@@ -41,8 +45,16 @@ $ node example/sync.js
```js
var resolve = require('resolve');
var async = require('resolve/async');
var sync = require('resolve/sync');
```
For both the synchronous and asynchronous methods, errors may have any of the following `err.code` values:
- `MODULE_NOT_FOUND`: the given path string (`id`) could not be resolved to a module
- `INVALID_BASEDIR`: the specified `opts.basedir` doesn't exist, or is not a directory
- `INVALID_PACKAGE_MAIN`: a `package.json` was encountered with an invalid `main` property (eg. not a string)
## resolve(id, opts={}, cb)
Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`.
@@ -55,18 +67,25 @@ options are:
* opts.extensions - array of file extensions to search in order
* opts.includeCoreModules - set to `false` to exclude node core modules (e.g. `fs`) from the search
* opts.readFile - how to read files asynchronously
* opts.isFile - function to asynchronously test whether a file exists
* opts.isDirectory - function to asynchronously test whether a directory exists
* opts.isDirectory - function to asynchronously test whether a file exists and is a directory
* opts.realpath - function to asynchronously resolve a potential symlink to its real path
* `opts.readPackage(readFile, pkgfile, cb)` - function to asynchronously read and parse a package.json file
* readFile - the passed `opts.readFile` or `fs.readFile` if not specified
* pkgfile - path to package.json
* cb - callback
* `opts.packageFilter(pkg, pkgfile, dir)` - transform the parsed package.json contents before looking at the "main" field
* pkg - package data
* pkgfile - path to package.json
* dir - directory for package.json
* dir - directory that contains package.json
* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package
* pkg - package data
@@ -102,6 +121,7 @@ default `opts` values:
paths: [],
basedir: __dirname,
extensions: ['.js'],
includeCoreModules: true,
readFile: fs.readFile,
isFile: function isFile(file, cb) {
fs.stat(file, function (err, stat) {
@@ -122,12 +142,25 @@ default `opts` values:
});
},
realpath: function realpath(file, cb) {
var realpath = typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;
realpath(file, function (realPathErr, realPath) {
if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr);
else cb(null, realPathErr ? file : realPath);
});
},
var realpath = typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;
realpath(file, function (realPathErr, realPath) {
if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr);
else cb(null, realPathErr ? file : realPath);
});
},
readPackage: function defaultReadPackage(readFile, pkgfile, cb) {
readFile(pkgfile, function (readFileErr, body) {
if (readFileErr) cb(readFileErr);
else {
try {
var pkg = JSON.parse(body);
cb(null, pkg);
} catch (jsonErr) {
cb(null);
}
}
});
},
moduleDirectory: 'node_modules',
preserveSymlinks: true
}
@@ -144,17 +177,23 @@ options are:
* opts.extensions - array of file extensions to search in order
* opts.readFile - how to read files synchronously
* opts.includeCoreModules - set to `false` to exclude node core modules (e.g. `fs`) from the search
* opts.readFileSync - how to read files synchronously
* opts.isFile - function to synchronously test whether a file exists
* opts.isDirectory - function to synchronously test whether a directory exists
* opts.isDirectory - function to synchronously test whether a file exists and is a directory
* opts.realpathSync - function to synchronously resolve a potential symlink to its real path
* `opts.readPackageSync(readFileSync, pkgfile)` - function to synchronously read and parse a package.json file
* readFileSync - the passed `opts.readFileSync` or `fs.readFileSync` if not specified
* pkgfile - path to package.json
* `opts.packageFilter(pkg, dir)` - transform the parsed package.json contents before looking at the "main" field
* pkg - package data
* dir - directory for package.json (Note: the second argument will change to "pkgfile" in v2)
* dir - directory that contains package.json (Note: the second argument will change to "pkgfile" in v2)
* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package
* pkg - package data
@@ -190,6 +229,7 @@ default `opts` values:
paths: [],
basedir: __dirname,
extensions: ['.js'],
includeCoreModules: true,
readFileSync: fs.readFileSync,
isFile: function isFile(file) {
try {
@@ -220,15 +260,18 @@ default `opts` values:
}
return file;
},
readPackageSync: function defaultReadPackageSync(readFileSync, pkgfile) {
var body = readFileSync(pkgfile);
try {
var pkg = JSON.parse(body);
return pkg;
} catch (jsonErr) {}
},
moduleDirectory: 'node_modules',
preserveSymlinks: true
}
```
## resolve.isCore(pkg)
Return whether a package is in core.
# install
With [npm](https://npmjs.org) do:
@@ -240,3 +283,19 @@ npm install resolve
# license
MIT
[1]: https://npmjs.org/package/resolve
[2]: https://versionbadg.es/browserify/resolve.svg
[5]: https://david-dm.org/browserify/resolve.svg
[6]: https://david-dm.org/browserify/resolve
[7]: https://david-dm.org/browserify/resolve/dev-status.svg
[8]: https://david-dm.org/browserify/resolve#info=devDependencies
[11]: https://nodei.co/npm/resolve.png?downloads=true&stars=true
[license-image]: https://img.shields.io/npm/l/resolve.svg
[license-url]: LICENSE
[downloads-image]: https://img.shields.io/npm/dm/resolve.svg
[downloads-url]: https://npm-stat.com/charts.html?package=resolve
[codecov-image]: https://codecov.io/gh/browserify/resolve/branch/main/graphs/badge.svg
[codecov-url]: https://app.codecov.io/gh/browserify/resolve/
[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/browserify/resolve
[actions-url]: https://github.com/browserify/resolve/actions
+3
View File
@@ -0,0 +1,3 @@
'use strict';
module.exports = require('./lib/sync');
+11 -8
View File
@@ -1,7 +1,11 @@
var test = require('tape');
var keys = require('object-keys');
var semver = require('semver');
var resolve = require('../');
var brokenNode = semver.satisfies(process.version, '11.11 - 11.13');
test('core modules', function (t) {
t.test('isCore()', function (st) {
st.ok(resolve.isCore('fs'));
@@ -22,16 +26,15 @@ test('core modules', function (t) {
for (var i = 0; i < cores.length; ++i) {
var mod = cores[i];
// note: this must be require, not require.resolve, due to https://github.com/nodejs/node/issues/43274
var requireFunc = function () { require(mod); }; // eslint-disable-line no-loop-func
t.comment(mod + ': ' + resolve.core[mod]);
if (resolve.core[mod]) {
st.doesNotThrow(
function () { require(mod); }, // eslint-disable-line no-loop-func
mod + ' supported; requiring does not throw'
);
st.doesNotThrow(requireFunc, mod + ' supported; requiring does not throw');
} else if (brokenNode) {
st.ok(true, 'this version of node is broken: attempting to require things that fail to resolve breaks "home_paths" tests');
} else {
st.throws(
function () { require(mod); }, // eslint-disable-line no-loop-func
mod + ' not supported; requiring throws'
);
st.throws(requireFunc, mod + ' not supported; requiring throws');
}
}
+127
View File
@@ -0,0 +1,127 @@
'use strict';
var fs = require('fs');
var homedir = require('../lib/homedir');
var path = require('path');
var test = require('tape');
var mkdirp = require('mkdirp');
var rimraf = require('rimraf');
var mv = require('mv');
var copyDir = require('copy-dir');
var tmp = require('tmp');
var HOME = homedir();
var hnm = path.join(HOME, '.node_modules');
var hnl = path.join(HOME, '.node_libraries');
var resolve = require('../async');
function makeDir(t, dir, cb) {
mkdirp(dir, function (err) {
if (err) {
cb(err);
} else {
t.teardown(function cleanup() {
rimraf.sync(dir);
});
cb();
}
});
}
function makeTempDir(t, dir, cb) {
if (fs.existsSync(dir)) {
var tmpResult = tmp.dirSync();
t.teardown(tmpResult.removeCallback);
var backup = path.join(tmpResult.name, path.basename(dir));
mv(dir, backup, function (err) {
if (err) {
cb(err);
} else {
t.teardown(function () {
mv(backup, dir, cb);
});
makeDir(t, dir, cb);
}
});
} else {
makeDir(t, dir, cb);
}
}
test('homedir module paths', function (t) {
t.plan(7);
makeTempDir(t, hnm, function (err) {
t.error(err, 'no error with HNM temp dir');
if (err) {
return t.end();
}
var bazHNMDir = path.join(hnm, 'baz');
var dotMainDir = path.join(hnm, 'dot_main');
copyDir.sync(path.join(__dirname, 'resolver/baz'), bazHNMDir);
copyDir.sync(path.join(__dirname, 'resolver/dot_main'), dotMainDir);
var bazPkg = { name: 'baz', main: 'quux.js' };
var dotMainPkg = { main: 'index' };
var bazHNMmain = path.join(bazHNMDir, 'quux.js');
t.equal(require.resolve('baz'), bazHNMmain, 'sanity check: require.resolve finds HNM `baz`');
var dotMainMain = path.join(dotMainDir, 'index.js');
t.equal(require.resolve('dot_main'), dotMainMain, 'sanity check: require.resolve finds `dot_main`');
makeTempDir(t, hnl, function (err) {
t.error(err, 'no error with HNL temp dir');
if (err) {
return t.end();
}
var bazHNLDir = path.join(hnl, 'baz');
copyDir.sync(path.join(__dirname, 'resolver/baz'), bazHNLDir);
var dotSlashMainDir = path.join(hnl, 'dot_slash_main');
var dotSlashMainMain = path.join(dotSlashMainDir, 'index.js');
var dotSlashMainPkg = { main: 'index' };
copyDir.sync(path.join(__dirname, 'resolver/dot_slash_main'), dotSlashMainDir);
t.equal(require.resolve('baz'), bazHNMmain, 'sanity check: require.resolve finds HNM `baz`');
t.equal(require.resolve('dot_slash_main'), dotSlashMainMain, 'sanity check: require.resolve finds HNL `dot_slash_main`');
t.test('with temp dirs', function (st) {
st.plan(3);
st.test('just in `$HOME/.node_modules`', function (s2t) {
s2t.plan(3);
resolve('dot_main', function (err, res, pkg) {
s2t.error(err, 'no error resolving `dot_main`');
s2t.equal(res, dotMainMain, '`dot_main` resolves in `$HOME/.node_modules`');
s2t.deepEqual(pkg, dotMainPkg);
});
});
st.test('just in `$HOME/.node_libraries`', function (s2t) {
s2t.plan(3);
resolve('dot_slash_main', function (err, res, pkg) {
s2t.error(err, 'no error resolving `dot_slash_main`');
s2t.equal(res, dotSlashMainMain, '`dot_slash_main` resolves in `$HOME/.node_libraries`');
s2t.deepEqual(pkg, dotSlashMainPkg);
});
});
st.test('in `$HOME/.node_libraries` and `$HOME/.node_modules`', function (s2t) {
s2t.plan(3);
resolve('baz', function (err, res, pkg) {
s2t.error(err, 'no error resolving `baz`');
s2t.equal(res, bazHNMmain, '`baz` resolves in `$HOME/.node_modules` when in both');
s2t.deepEqual(pkg, bazPkg);
});
});
});
});
});
});
+114
View File
@@ -0,0 +1,114 @@
'use strict';
var fs = require('fs');
var homedir = require('../lib/homedir');
var path = require('path');
var test = require('tape');
var mkdirp = require('mkdirp');
var rimraf = require('rimraf');
var mv = require('mv');
var copyDir = require('copy-dir');
var tmp = require('tmp');
var HOME = homedir();
var hnm = path.join(HOME, '.node_modules');
var hnl = path.join(HOME, '.node_libraries');
var resolve = require('../sync');
function makeDir(t, dir, cb) {
mkdirp(dir, function (err) {
if (err) {
cb(err);
} else {
t.teardown(function cleanup() {
rimraf.sync(dir);
});
cb();
}
});
}
function makeTempDir(t, dir, cb) {
if (fs.existsSync(dir)) {
var tmpResult = tmp.dirSync();
t.teardown(tmpResult.removeCallback);
var backup = path.join(tmpResult.name, path.basename(dir));
mv(dir, backup, function (err) {
if (err) {
cb(err);
} else {
t.teardown(function () {
mv(backup, dir, cb);
});
makeDir(t, dir, cb);
}
});
} else {
makeDir(t, dir, cb);
}
}
test('homedir module paths', function (t) {
t.plan(7);
makeTempDir(t, hnm, function (err) {
t.error(err, 'no error with HNM temp dir');
if (err) {
return t.end();
}
var bazHNMDir = path.join(hnm, 'baz');
var dotMainDir = path.join(hnm, 'dot_main');
copyDir.sync(path.join(__dirname, 'resolver/baz'), bazHNMDir);
copyDir.sync(path.join(__dirname, 'resolver/dot_main'), dotMainDir);
var bazHNMmain = path.join(bazHNMDir, 'quux.js');
t.equal(require.resolve('baz'), bazHNMmain, 'sanity check: require.resolve finds HNM `baz`');
var dotMainMain = path.join(dotMainDir, 'index.js');
t.equal(require.resolve('dot_main'), dotMainMain, 'sanity check: require.resolve finds `dot_main`');
makeTempDir(t, hnl, function (err) {
t.error(err, 'no error with HNL temp dir');
if (err) {
return t.end();
}
var bazHNLDir = path.join(hnl, 'baz');
copyDir.sync(path.join(__dirname, 'resolver/baz'), bazHNLDir);
var dotSlashMainDir = path.join(hnl, 'dot_slash_main');
var dotSlashMainMain = path.join(dotSlashMainDir, 'index.js');
copyDir.sync(path.join(__dirname, 'resolver/dot_slash_main'), dotSlashMainDir);
t.equal(require.resolve('baz'), bazHNMmain, 'sanity check: require.resolve finds HNM `baz`');
t.equal(require.resolve('dot_slash_main'), dotSlashMainMain, 'sanity check: require.resolve finds HNL `dot_slash_main`');
t.test('with temp dirs', function (st) {
st.plan(3);
st.test('just in `$HOME/.node_modules`', function (s2t) {
s2t.plan(1);
var res = resolve('dot_main');
s2t.equal(res, dotMainMain, '`dot_main` resolves in `$HOME/.node_modules`');
});
st.test('just in `$HOME/.node_libraries`', function (s2t) {
s2t.plan(1);
var res = resolve('dot_slash_main');
s2t.equal(res, dotSlashMainMain, '`dot_slash_main` resolves in `$HOME/.node_libraries`');
});
st.test('in `$HOME/.node_libraries` and `$HOME/.node_modules`', function (s2t) {
s2t.plan(1);
var res = resolve('baz');
s2t.equal(res, bazHNMmain, '`baz` resolves in `$HOME/.node_modules` when in both');
});
});
});
});
});
+76
View File
@@ -237,3 +237,79 @@ test('symlinked', function (t) {
t.equal(pkg, undefined);
});
});
test('readPackage', function (t) {
t.plan(3);
var files = {};
files[path.resolve('/foo/node_modules/bar/something-else.js')] = 'beep';
files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({
main: './baz.js'
});
files[path.resolve('/foo/node_modules/bar/baz.js')] = 'boop';
var dirs = {};
dirs[path.resolve('/foo')] = true;
dirs[path.resolve('/foo/node_modules')] = true;
function opts(basedir) {
return {
basedir: path.resolve(basedir),
isFile: function (file, cb) {
cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file)));
},
isDirectory: function (dir, cb) {
cb(null, !!dirs[path.resolve(dir)]);
},
'package': { main: 'bar' },
readFile: function (file, cb) {
cb(null, files[path.resolve(file)]);
},
realpath: function (file, cb) {
cb(null, file);
}
};
}
t.test('with readFile', function (st) {
st.plan(3);
resolve('bar', opts('/foo'), function (err, res, pkg) {
st.error(err);
st.equal(res, path.resolve('/foo/node_modules/bar/baz.js'));
st.equal(pkg && pkg.main, './baz.js');
});
});
var readPackage = function (readFile, file, cb) {
var barPackage = path.join('bar', 'package.json');
if (file.slice(-barPackage.length) === barPackage) {
cb(null, { main: './something-else.js' });
} else {
cb(null, JSON.parse(files[path.resolve(file)]));
}
};
t.test('with readPackage', function (st) {
st.plan(3);
var options = opts('/foo');
delete options.readFile;
options.readPackage = readPackage;
resolve('bar', options, function (err, res, pkg) {
st.error(err);
st.equal(res, path.resolve('/foo/node_modules/bar/something-else.js'));
st.equal(pkg && pkg.main, './something-else.js');
});
});
t.test('with readFile and readPackage', function (st) {
st.plan(1);
var options = opts('/foo');
options.readPackage = readPackage;
resolve('bar', options, function (err) {
st.throws(function () { throw err; }, TypeError, 'errors when both readFile and readPackage are provided');
});
});
});
+75 -2
View File
@@ -122,9 +122,8 @@ test('symlinked', function (t) {
var dir = path.dirname(resolved);
var base = path.basename(resolved);
return path.join(dir, 'symlinked', base);
} else {
return path.join(resolved, 'symlinked');
}
return path.join(resolved, 'symlinked');
}
};
}
@@ -139,3 +138,77 @@ test('symlinked', function (t) {
path.resolve('/foo/bar/symlinked/baz.js')
);
});
test('readPackageSync', function (t) {
t.plan(3);
var files = {};
files[path.resolve('/foo/node_modules/bar/something-else.js')] = 'beep';
files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({
main: './baz.js'
});
files[path.resolve('/foo/node_modules/bar/baz.js')] = 'boop';
var dirs = {};
dirs[path.resolve('/foo')] = true;
dirs[path.resolve('/foo/node_modules')] = true;
function opts(basedir, useReadPackage) {
return {
basedir: path.resolve(basedir),
isFile: function (file) {
return Object.prototype.hasOwnProperty.call(files, path.resolve(file));
},
isDirectory: function (dir) {
return !!dirs[path.resolve(dir)];
},
readFileSync: useReadPackage ? null : function (file) {
return files[path.resolve(file)];
},
realpathSync: function (file) {
return file;
}
};
}
t.test('with readFile', function (st) {
st.plan(1);
st.equal(
resolve.sync('bar', opts('/foo')),
path.resolve('/foo/node_modules/bar/baz.js')
);
});
var readPackageSync = function (readFileSync, file) {
if (file.indexOf(path.join('bar', 'package.json')) >= 0) {
return { main: './something-else.js' };
}
return JSON.parse(files[path.resolve(file)]);
};
t.test('with readPackage', function (st) {
st.plan(1);
var options = opts('/foo');
delete options.readFileSync;
options.readPackageSync = readPackageSync;
st.equal(
resolve.sync('bar', options),
path.resolve('/foo/node_modules/bar/something-else.js')
);
});
t.test('with readFile and readPackage', function (st) {
st.plan(1);
var options = opts('/foo');
options.readPackageSync = readPackageSync;
st.throws(
function () { resolve.sync('bar', options); },
TypeError,
'errors when both readFile and readPackage are provided'
);
});
});
+1 -1
View File
@@ -63,7 +63,7 @@ test('$NODE_PATH', function (t) {
basedir: path.join(__dirname, 'node_path/x'),
isDirectory: isDir
}, function (err, res) {
var root = require('tap/package.json').main;
var root = require('tap/package.json').main; // eslint-disable-line global-require
t.error(err);
t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap', root), 'tap resolves');
});
+148 -3
View File
@@ -1,6 +1,12 @@
var path = require('path');
var test = require('tape');
var resolve = require('../');
var async = require('../async');
test('`./async` entry point', function (t) {
t.equal(resolve, async, '`./async` entry point is the same as `main`');
t.end();
});
test('async foo', function (t) {
t.plan(12);
@@ -284,11 +290,60 @@ test('incorrect main', function (t) {
});
});
test('missing index', function (t) {
t.plan(2);
var resolverDir = path.join(__dirname, 'resolver');
resolve('./missing_index', { basedir: resolverDir }, function (err, res, pkg) {
t.ok(err instanceof Error);
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
});
});
test('missing main', function (t) {
t.plan(1);
var resolverDir = path.join(__dirname, 'resolver');
resolve('./missing_main', { basedir: resolverDir }, function (err, res, pkg) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
});
});
test('null main', function (t) {
t.plan(1);
var resolverDir = path.join(__dirname, 'resolver');
resolve('./null_main', { basedir: resolverDir }, function (err, res, pkg) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
});
});
test('main: false', function (t) {
t.plan(2);
var basedir = path.join(__dirname, 'resolver');
var dir = path.join(basedir, 'false_main');
resolve('./false_main', { basedir: basedir }, function (err, res, pkg) {
if (err) t.fail(err);
t.equal(
res,
path.join(dir, 'index.js'),
'`"main": false`: resolves to `index.js`'
);
t.deepEqual(pkg, {
name: 'false_main',
main: false
});
});
});
test('without basedir', function (t) {
t.plan(1);
var dir = path.join(__dirname, 'resolver/without_basedir');
var tester = require(path.join(dir, 'main.js'));
var tester = require(path.join(dir, 'main.js')); // eslint-disable-line global-require
tester(t, function (err, res, pkg) {
if (err) {
@@ -404,7 +459,7 @@ test('non-string "main" field in package.json', function (t) {
var dir = path.join(__dirname, 'resolver');
resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) {
t.ok(err, 'errors on non-string main');
t.equal(err.message, 'package “invalid main” `main` must be a string');
t.equal(err.message, 'package “invalid_main” `main` must be a string');
t.equal(err.code, 'INVALID_PACKAGE_MAIN');
t.equal(res, undefined, 'res is undefined');
t.equal(pkg, undefined, 'pkg is undefined');
@@ -417,7 +472,7 @@ test('non-string "main" field in package.json', function (t) {
var dir = path.join(__dirname, 'resolver');
resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) {
t.ok(err, 'errors on non-string main');
t.equal(err.message, 'package “invalid main” `main` must be a string');
t.equal(err.message, 'package “invalid_main” `main` must be a string');
t.equal(err.code, 'INVALID_PACKAGE_MAIN');
t.equal(res, undefined, 'res is undefined');
t.equal(pkg, undefined, 'pkg is undefined');
@@ -448,3 +503,93 @@ test('browser field in package.json', function (t) {
}
);
});
test('absolute paths', function (t) {
t.plan(4);
var extensionless = __filename.slice(0, -path.extname(__filename).length);
resolve(__filename, function (err, res) {
t.equal(
res,
__filename,
'absolute path to this file resolves'
);
});
resolve(extensionless, function (err, res) {
t.equal(
res,
__filename,
'extensionless absolute path to this file resolves'
);
});
resolve(__filename, { basedir: process.cwd() }, function (err, res) {
t.equal(
res,
__filename,
'absolute path to this file with a basedir resolves'
);
});
resolve(extensionless, { basedir: process.cwd() }, function (err, res) {
t.equal(
res,
__filename,
'extensionless absolute path to this file with a basedir resolves'
);
});
});
test('malformed package.json', function (t) {
/* eslint operator-linebreak: ["error", "before"], function-paren-newline: "off" */
t.plan(
(3 * 3) // 3 sets of 3 assertions in the final callback
+ 2 // 1 readPackage call with malformed package.json
);
var basedir = path.join(__dirname, 'resolver/malformed_package_json');
var expected = path.join(basedir, 'index.js');
resolve('./index.js', { basedir: basedir }, function (err, res, pkg) {
t.error(err, 'no error');
t.equal(res, expected, 'malformed package.json is silently ignored');
t.equal(pkg, undefined, 'malformed package.json gives an undefined `pkg` argument');
});
resolve(
'./index.js',
{
basedir: basedir,
packageFilter: function (pkg, pkgfile, dir) {
t.fail('should not reach here');
}
},
function (err, res, pkg) {
t.error(err, 'with packageFilter: no error');
t.equal(res, expected, 'with packageFilter: malformed package.json is silently ignored');
t.equal(pkg, undefined, 'with packageFilter: malformed package.json gives an undefined `pkg` argument');
}
);
resolve(
'./index.js',
{
basedir: basedir,
readPackage: function (readFile, pkgfile, cb) {
t.equal(pkgfile, path.join(basedir, 'package.json'), 'readPackageSync: `pkgfile` is package.json path');
readFile(pkgfile, function (err, result) {
try {
cb(null, JSON.parse(result));
} catch (e) {
t.ok(e instanceof SyntaxError, 'readPackage: malformed package.json parses as a syntax error');
cb(null);
}
});
}
},
function (err, res, pkg) {
t.error(err, 'with readPackage: no error');
t.equal(res, expected, 'with readPackage: malformed package.json is silently ignored');
t.equal(pkg, undefined, 'with readPackage: malformed package.json gives an undefined `pkg` argument');
}
);
});
View File
+4
View File
@@ -0,0 +1,4 @@
{
"name": "false_main",
"main": false
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "invalid main",
"name": "invalid_main",
"main": [
"why is this a thing",
"srsly omg wtf"
@@ -0,0 +1 @@
{
+391 -23
View File
@@ -1,19 +1,46 @@
var path = require('path');
var fs = require('fs');
var test = require('tape');
var resolve = require('../');
var sync = require('../sync');
var requireResolveSupportsPaths = require.resolve.length > 1
&& !(/^v12\.[012]\./).test(process.version); // broken in v12.0-12.2, see https://github.com/nodejs/node/issues/27794
test('`./sync` entry point', function (t) {
t.equal(resolve.sync, sync, '`./sync` entry point is the same as `.sync` on `main`');
t.end();
});
test('foo', function (t) {
var dir = path.join(__dirname, 'resolver');
t.equal(
resolve.sync('./foo', { basedir: dir }),
path.join(dir, 'foo.js')
path.join(dir, 'foo.js'),
'./foo'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./foo', { basedir: dir }),
require.resolve('./foo', { paths: [dir] }),
'./foo: resolve.sync === require.resolve'
);
}
t.equal(
resolve.sync('./foo.js', { basedir: dir }),
path.join(dir, 'foo.js')
path.join(dir, 'foo.js'),
'./foo.js'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./foo.js', { basedir: dir }),
require.resolve('./foo.js', { paths: [dir] }),
'./foo.js: resolve.sync === require.resolve'
);
}
t.equal(
resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }),
@@ -41,10 +68,21 @@ test('foo', function (t) {
test('bar', function (t) {
var dir = path.join(__dirname, 'resolver');
var basedir = path.join(dir, 'bar');
t.equal(
resolve.sync('foo', { basedir: path.join(dir, 'bar') }),
path.join(dir, 'bar/node_modules/foo/index.js')
resolve.sync('foo', { basedir: basedir }),
path.join(dir, 'bar/node_modules/foo/index.js'),
'foo in bar'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('foo', { basedir: basedir }),
require.resolve('foo', { paths: [basedir] }),
'foo in bar: resolve.sync === require.resolve'
);
}
t.end();
});
@@ -53,52 +91,98 @@ test('baz', function (t) {
t.equal(
resolve.sync('./baz', { basedir: dir }),
path.join(dir, 'baz/quux.js')
path.join(dir, 'baz/quux.js'),
'./baz'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./baz', { basedir: dir }),
require.resolve('./baz', { paths: [dir] }),
'./baz: resolve.sync === require.resolve'
);
}
t.end();
});
test('biz', function (t) {
var dir = path.join(__dirname, 'resolver/biz/node_modules');
t.equal(
resolve.sync('./grux', { basedir: dir }),
path.join(dir, 'grux/index.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./grux', { basedir: dir }),
require.resolve('./grux', { paths: [dir] }),
'./grux: resolve.sync === require.resolve'
);
}
var tivDir = path.join(dir, 'grux');
t.equal(
resolve.sync('tiv', { basedir: path.join(dir, 'grux') }),
resolve.sync('tiv', { basedir: tivDir }),
path.join(dir, 'tiv/index.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('tiv', { basedir: tivDir }),
require.resolve('tiv', { paths: [tivDir] }),
'tiv: resolve.sync === require.resolve'
);
}
var gruxDir = path.join(dir, 'tiv');
t.equal(
resolve.sync('grux', { basedir: path.join(dir, 'tiv') }),
resolve.sync('grux', { basedir: gruxDir }),
path.join(dir, 'grux/index.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('grux', { basedir: gruxDir }),
require.resolve('grux', { paths: [gruxDir] }),
'grux: resolve.sync === require.resolve'
);
}
t.end();
});
test('normalize', function (t) {
var dir = path.join(__dirname, 'resolver/biz/node_modules/grux');
t.equal(
resolve.sync('../grux', { basedir: dir }),
path.join(dir, 'index.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('../grux', { basedir: dir }),
require.resolve('../grux', { paths: [dir] }),
'../grux: resolve.sync === require.resolve'
);
}
t.end();
});
test('cup', function (t) {
var dir = path.join(__dirname, 'resolver');
t.equal(
resolve.sync('./cup', {
basedir: dir,
extensions: ['.js', '.coffee']
}),
path.join(dir, 'cup.coffee')
path.join(dir, 'cup.coffee'),
'./cup -> ./cup.coffee'
);
t.equal(
resolve.sync('./cup.coffee', { basedir: dir }),
path.join(dir, 'cup.coffee')
path.join(dir, 'cup.coffee'),
'./cup.coffee'
);
t.throws(function () {
@@ -108,22 +192,40 @@ test('cup', function (t) {
});
});
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./cup.coffee', { basedir: dir, extensions: ['.js', '.coffee'] }),
require.resolve('./cup.coffee', { paths: [dir] }),
'./cup.coffee: resolve.sync === require.resolve'
);
}
t.end();
});
test('mug', function (t) {
var dir = path.join(__dirname, 'resolver');
t.equal(
resolve.sync('./mug', { basedir: dir }),
path.join(dir, 'mug.js')
path.join(dir, 'mug.js'),
'./mug -> ./mug.js'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./mug', { basedir: dir }),
require.resolve('./mug', { paths: [dir] }),
'./mug: resolve.sync === require.resolve'
);
}
t.equal(
resolve.sync('./mug', {
basedir: dir,
extensions: ['.coffee', '.js']
}),
path.join(dir, 'mug.coffee')
path.join(dir, 'mug.coffee'),
'./mug -> ./mug.coffee'
);
t.equal(
@@ -131,7 +233,8 @@ test('mug', function (t) {
basedir: dir,
extensions: ['.js', '.coffee']
}),
path.join(dir, 'mug.js')
path.join(dir, 'mug.js'),
'./mug -> ./mug.js'
);
t.end();
@@ -195,12 +298,99 @@ test('incorrect main', function (t) {
resolve.sync('./incorrect_main', { basedir: resolverDir }),
path.join(dir, 'index.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./incorrect_main', { basedir: resolverDir }),
require.resolve('./incorrect_main', { paths: [resolverDir] }),
'./incorrect_main: resolve.sync === require.resolve'
);
}
t.end();
});
test('missing index', function (t) {
t.plan(requireResolveSupportsPaths ? 2 : 1);
var resolverDir = path.join(__dirname, 'resolver');
try {
resolve.sync('./missing_index', { basedir: resolverDir });
t.fail('did not fail');
} catch (err) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
}
if (requireResolveSupportsPaths) {
try {
require.resolve('./missing_index', { basedir: resolverDir });
t.fail('require.resolve did not fail');
} catch (err) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
}
}
});
test('missing main', function (t) {
var resolverDir = path.join(__dirname, 'resolver');
try {
resolve.sync('./missing_main', { basedir: resolverDir });
t.fail('require.resolve did not fail');
} catch (err) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
}
if (requireResolveSupportsPaths) {
try {
resolve.sync('./missing_main', { basedir: resolverDir });
t.fail('require.resolve did not fail');
} catch (err) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
}
}
t.end();
});
test('null main', function (t) {
var resolverDir = path.join(__dirname, 'resolver');
try {
resolve.sync('./null_main', { basedir: resolverDir });
t.fail('require.resolve did not fail');
} catch (err) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
}
if (requireResolveSupportsPaths) {
try {
resolve.sync('./null_main', { basedir: resolverDir });
t.fail('require.resolve did not fail');
} catch (err) {
t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code');
}
}
t.end();
});
test('main: false', function (t) {
var basedir = path.join(__dirname, 'resolver');
var dir = path.join(basedir, 'false_main');
t.equal(
resolve.sync('./false_main', { basedir: basedir }),
path.join(dir, 'index.js'),
'`"main": false`: resolves to `index.js`'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./false_main', { basedir: basedir }),
require.resolve('./false_main', { paths: [basedir] }),
'`"main": false`: resolve.sync === require.resolve'
);
}
t.end();
});
var stubStatSync = function stubStatSync(fn) {
var fs = require('fs');
var statSync = fs.statSync;
try {
fs.statSync = function () {
@@ -226,29 +416,66 @@ test('#79 - re-throw non ENOENT errors from stat', function (t) {
test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) {
var dir = path.join(__dirname, 'resolver');
var basedir = path.join(dir, 'same_names');
t.equal(
resolve.sync('./foo', { basedir: path.join(dir, 'same_names') }),
resolve.sync('./foo', { basedir: basedir }),
path.join(dir, 'same_names/foo.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./foo', { basedir: basedir }),
require.resolve('./foo', { paths: [basedir] }),
'./foo: resolve.sync === require.resolve'
);
}
t.equal(
resolve.sync('./foo/', { basedir: path.join(dir, 'same_names') }),
resolve.sync('./foo/', { basedir: basedir }),
path.join(dir, 'same_names/foo/index.js')
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./foo/', { basedir: basedir }),
require.resolve('./foo/', { paths: [basedir] }),
'./foo/: resolve.sync === require.resolve'
);
}
t.end();
});
test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) {
var dir = path.join(__dirname, 'resolver');
var basedir = path.join(dir, 'same_names/foo');
t.equal(
resolve.sync('./', { basedir: path.join(dir, 'same_names/foo') }),
path.join(dir, 'same_names/foo/index.js')
resolve.sync('./', { basedir: basedir }),
path.join(dir, 'same_names/foo/index.js'),
'./'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./', { basedir: basedir }),
require.resolve('./', { paths: [basedir] }),
'./: resolve.sync === require.resolve'
);
}
t.equal(
resolve.sync('.', { basedir: path.join(dir, 'same_names/foo') }),
path.join(dir, 'same_names/foo/index.js')
resolve.sync('.', { basedir: basedir }),
path.join(dir, 'same_names/foo/index.js'),
'.'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('.', { basedir: basedir }),
require.resolve('.', { paths: [basedir] }),
'.: resolve.sync === require.resolve',
{ todo: true }
);
}
t.end();
});
@@ -261,6 +488,12 @@ test('sync: #121 - treating an existing file as a dir when no basedir', function
__filename,
'sanity check'
);
st.equal(
resolve.sync('./' + testFile),
require.resolve('./' + testFile),
'sanity check: resolve.sync === require.resolve'
);
st.end();
});
@@ -288,15 +521,38 @@ test('sync: #121 - treating an existing file as a dir when no basedir', function
test('sync dot main', function (t) {
var start = new Date();
t.equal(resolve.sync('./resolver/dot_main'), path.join(__dirname, 'resolver/dot_main/index.js'));
t.equal(
resolve.sync('./resolver/dot_main'),
path.join(__dirname, 'resolver/dot_main/index.js'),
'./resolver/dot_main'
);
t.equal(
resolve.sync('./resolver/dot_main'),
require.resolve('./resolver/dot_main'),
'./resolver/dot_main: resolve.sync === require.resolve'
);
t.ok(new Date() - start < 50, 'resolve.sync timedout');
t.end();
});
test('sync dot slash main', function (t) {
var start = new Date();
t.equal(resolve.sync('./resolver/dot_slash_main'), path.join(__dirname, 'resolver/dot_slash_main/index.js'));
t.equal(
resolve.sync('./resolver/dot_slash_main'),
path.join(__dirname, 'resolver/dot_slash_main/index.js')
);
t.equal(
resolve.sync('./resolver/dot_slash_main'),
require.resolve('./resolver/dot_slash_main'),
'./resolver/dot_slash_main: resolve.sync === require.resolve'
);
t.ok(new Date() - start < 50, 'resolve.sync timedout');
t.end();
});
@@ -321,7 +577,7 @@ test('non-string "main" field in package.json', function (t) {
t.fail('should not get here');
} catch (err) {
t.ok(err, 'errors on non-string main');
t.equal(err.message, 'package “invalid main” `main` must be a string');
t.equal(err.message, 'package “invalid_main” `main` must be a string');
t.equal(err.code, 'INVALID_PACKAGE_MAIN');
}
t.end();
@@ -335,7 +591,7 @@ test('non-string "main" field in package.json', function (t) {
t.fail('should not get here');
} catch (err) {
t.ok(err, 'errors on non-string main');
t.equal(err.message, 'package “invalid main” `main` must be a string');
t.equal(err.message, 'package “invalid_main” `main` must be a string');
t.equal(err.code, 'INVALID_PACKAGE_MAIN');
}
t.end();
@@ -356,3 +612,115 @@ test('browser field in package.json', function (t) {
t.equal(res, path.join(dir, 'browser_field', 'b.js'));
t.end();
});
test('absolute paths', function (t) {
var extensionless = __filename.slice(0, -path.extname(__filename).length);
t.equal(
resolve.sync(__filename),
__filename,
'absolute path to this file resolves'
);
t.equal(
resolve.sync(__filename),
require.resolve(__filename),
'absolute path to this file: resolve.sync === require.resolve'
);
t.equal(
resolve.sync(extensionless),
__filename,
'extensionless absolute path to this file resolves'
);
t.equal(
resolve.sync(__filename),
require.resolve(__filename),
'absolute path to this file: resolve.sync === require.resolve'
);
t.equal(
resolve.sync(__filename, { basedir: process.cwd() }),
__filename,
'absolute path to this file with a basedir resolves'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync(__filename, { basedir: process.cwd() }),
require.resolve(__filename, { paths: [process.cwd()] }),
'absolute path to this file + basedir: resolve.sync === require.resolve'
);
}
t.equal(
resolve.sync(extensionless, { basedir: process.cwd() }),
__filename,
'extensionless absolute path to this file with a basedir resolves'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync(extensionless, { basedir: process.cwd() }),
require.resolve(extensionless, { paths: [process.cwd()] }),
'extensionless absolute path to this file + basedir: resolve.sync === require.resolve'
);
}
t.end();
});
test('malformed package.json', function (t) {
t.plan(5 + (requireResolveSupportsPaths ? 1 : 0));
var basedir = path.join(__dirname, 'resolver/malformed_package_json');
var expected = path.join(basedir, 'index.js');
t.equal(
resolve.sync('./index.js', { basedir: basedir }),
expected,
'malformed package.json is silently ignored'
);
if (requireResolveSupportsPaths) {
t.equal(
resolve.sync('./index.js', { basedir: basedir }),
require.resolve('./index.js', { paths: [basedir] }),
'malformed package.json: resolve.sync === require.resolve'
);
}
var res1 = resolve.sync(
'./index.js',
{
basedir: basedir,
packageFilter: function (pkg, pkgfile, dir) {
t.fail('should not reach here');
}
}
);
t.equal(
res1,
expected,
'with packageFilter: malformed package.json is silently ignored'
);
var res2 = resolve.sync(
'./index.js',
{
basedir: basedir,
readPackageSync: function (readFileSync, pkgfile) {
t.equal(pkgfile, path.join(basedir, 'package.json'), 'readPackageSync: `pkgfile` is package.json path');
var result = String(readFileSync(pkgfile));
try {
return JSON.parse(result);
} catch (e) {
t.ok(e instanceof SyntaxError, 'readPackageSync: malformed package.json parses as a syntax error');
}
}
}
);
t.equal(
res2,
expected,
'with readPackageSync: malformed package.json is silently ignored'
);
});
+16
View File
@@ -36,3 +36,19 @@ test('shadowed core modules return shadow when appending `/` [sync]', function (
t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js'));
});
test('shadowed core modules return shadow with `includeCoreModules: false`', function (t) {
t.plan(2);
resolve('util', { basedir: path.join(__dirname, 'shadowed_core'), includeCoreModules: false }, function (err, res) {
t.ifError(err);
t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js'));
});
});
test('shadowed core modules return shadow with `includeCoreModules: false` [sync]', function (t) {
t.plan(1);
var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core'), includeCoreModules: false });
t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js'));
});
+4 -1
View File
@@ -68,7 +68,10 @@ test('sync symlink when preserveSymlinks = true', function (t) {
test('sync symlink', function (t) {
var start = new Date();
t.doesNotThrow(function () {
t.equal(resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }), path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js'));
t.equal(
resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }),
path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js')
);
});
t.ok(new Date() - start < 50, 'resolve.sync timedout');
t.end();