update
This commit is contained in:
+22
-5
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,3 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = require('./lib/async');
|
||||
+50
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
[](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
@@ -0,0 +1,3 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = require('./lib/sync');
|
||||
+11
-8
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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');
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "false_main",
|
||||
"main": false
|
||||
}
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "invalid main",
|
||||
"name": "invalid_main",
|
||||
"main": [
|
||||
"why is this a thing",
|
||||
"srsly omg wtf"
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
{
|
||||
+391
-23
@@ -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
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user