Comparing version 1.20.0 to 1.22.8
var fs = require('fs'); | ||
var getHomedir = require('./homedir'); | ||
var path = require('path'); | ||
@@ -8,4 +9,12 @@ var caller = require('./caller'); | ||
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) { | ||
@@ -102,3 +111,3 @@ fs.stat(file, function (err, stat) { | ||
opts.paths = opts.paths || []; | ||
opts.paths = opts.paths || defaultPaths(); | ||
@@ -105,0 +114,0 @@ // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory |
@@ -1,45 +0,4 @@ | ||
var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; | ||
'use strict'; | ||
function specifierIncluded(specifier) { | ||
var parts = specifier.split(' '); | ||
var op = parts.length > 1 ? parts[0] : '='; | ||
var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); | ||
for (var i = 0; i < 3; ++i) { | ||
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 | ||
} | ||
if (op === '<') { | ||
return cur < ver; | ||
} else if (op === '>=') { | ||
return cur >= ver; | ||
} else { | ||
return false; | ||
} | ||
} | ||
return op === '>='; | ||
} | ||
function matchesRange(range) { | ||
var specifiers = range.split(/ ?&& ?/); | ||
if (specifiers.length === 0) { return false; } | ||
for (var i = 0; i < specifiers.length; ++i) { | ||
if (!specifierIncluded(specifiers[i])) { return false; } | ||
} | ||
return true; | ||
} | ||
function versionIncluded(specifierValue) { | ||
if (typeof specifierValue === 'boolean') { return specifierValue; } | ||
if (specifierValue && typeof specifierValue === 'object') { | ||
for (var i = 0; i < specifierValue.length; ++i) { | ||
if (matchesRange(specifierValue[i])) { return true; } | ||
} | ||
return false; | ||
} | ||
return matchesRange(specifierValue); | ||
} | ||
var isCoreModule = require('is-core-module'); | ||
var data = require('./core.json'); | ||
@@ -50,5 +9,5 @@ | ||
if (Object.prototype.hasOwnProperty.call(data, mod)) { | ||
core[mod] = versionIncluded(data[mod]); | ||
core[mod] = isCoreModule(mod); | ||
} | ||
} | ||
module.exports = core; |
{ | ||
"assert": true, | ||
"node:assert": [">= 14.18 && < 15", ">= 16"], | ||
"assert/strict": ">= 15", | ||
"node:assert/strict": ">= 16", | ||
"async_hooks": ">= 8", | ||
"buffer_ieee754": "< 0.9.7", | ||
"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, | ||
"cluster": 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, | ||
"diagnostics_channel": ">= 15.1", | ||
"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, | ||
"inspector": ">= 8.0.0", | ||
"node:https": [">= 14.18 && < 15", ">= 16"], | ||
"inspector": ">= 8", | ||
"node:inspector": [">= 14.18 && < 15", ">= 16"], | ||
"inspector/promises": [">= 19"], | ||
"node:inspector/promises": [">= 19"], | ||
"_linklist": "< 8", | ||
"module": true, | ||
"node:module": [">= 14.18 && < 15", ">= 16"], | ||
"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", | ||
"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", | ||
"punycode": true, | ||
"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, | ||
"sys": [">= 0.6 && < 0.7", ">= 0.8"], | ||
"node:string_decoder": [">= 14.18 && < 15", ">= 16"], | ||
"sys": [">= 0.4 && < 0.7", ">= 0.8"], | ||
"node:sys": [">= 14.18 && < 15", ">= 16"], | ||
"test/reporters": ">= 19.9 && < 20.2", | ||
"node:test/reporters": [">= 18.17 && < 19", ">= 19.9", ">= 20"], | ||
"node:test": [">= 16.17 && < 17", ">= 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.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/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, | ||
"wasi": ">= 13.4 && < 13.5", | ||
"node:vm": [">= 14.18 && < 15", ">= 16"], | ||
"wasi": [">= 13.4 && < 13.5", ">= 18.17 && < 19", ">= 20"], | ||
"node:wasi": [">= 18.17 && < 19", ">= 20"], | ||
"worker_threads": ">= 11.7", | ||
"zlib": true | ||
"node:worker_threads": [">= 14.18 && < 15", ">= 16"], | ||
"zlib": ">= 0.5", | ||
"node:zlib": [">= 14.18 && < 15", ">= 16"] | ||
} |
var path = require('path'); | ||
var parse = path.parse || require('path-parse'); | ||
var parse = path.parse || require('path-parse'); // eslint-disable-line global-require | ||
@@ -4,0 +4,0 @@ var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { |
var isCore = require('is-core-module'); | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
var getHomedir = require('./homedir'); | ||
var caller = require('./caller'); | ||
@@ -8,7 +9,15 @@ var nodeModulesPaths = require('./node-modules-paths'); | ||
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) { | ||
@@ -18,3 +27,3 @@ if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; | ||
} | ||
return stat.isFile() || stat.isFIFO(); | ||
return !!stat && (stat.isFile() || stat.isFIFO()); | ||
}; | ||
@@ -24,3 +33,3 @@ | ||
try { | ||
var stat = fs.statSync(dir); | ||
var stat = fs.statSync(dir, { throwIfNoEntry: false }); | ||
} catch (e) { | ||
@@ -30,3 +39,3 @@ if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; | ||
} | ||
return stat.isDirectory(); | ||
return !!stat && stat.isDirectory(); | ||
}; | ||
@@ -89,3 +98,3 @@ | ||
opts.paths = opts.paths || []; | ||
opts.paths = opts.paths || defaultPaths(); | ||
@@ -92,0 +101,0 @@ // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory |
{ | ||
"name": "resolve", | ||
"description": "resolve like require.resolve() on behalf of files asynchronously and synchronously", | ||
"version": "1.20.0", | ||
"version": "1.22.8", | ||
"repository": { | ||
@@ -9,2 +9,5 @@ "type": "git", | ||
}, | ||
"bin": { | ||
"resolve": "./bin/resolve" | ||
}, | ||
"main": "index.js", | ||
@@ -18,5 +21,7 @@ "keywords": [ | ||
"scripts": { | ||
"prepublish": "safe-publish-latest && cp node_modules/is-core-module/core.json ./lib/ ||:", | ||
"prelint": "eclint check '**/*'", | ||
"lint": "eslint --ext=js,mjs .", | ||
"prepack": "npmignore --auto --commentLines=autogenerated && cp node_modules/is-core-module/core.json ./lib/ ||:", | ||
"prepublishOnly": "safe-publish-latest", | ||
"prepublish": "not-in-publish || npm run prepublishOnly", | ||
"prelint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')", | ||
"lint": "eslint --ext=js,mjs --no-eslintrc -c .eslintrc . 'bin/**'", | ||
"pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async", | ||
@@ -30,11 +35,19 @@ "tests-only": "tape test/*.js", | ||
"devDependencies": { | ||
"@ljharb/eslint-config": "^17.5.1", | ||
"array.prototype.map": "^1.0.3", | ||
"aud": "^1.1.4", | ||
"@ljharb/eslint-config": "^21.1.0", | ||
"array.prototype.map": "^1.0.6", | ||
"aud": "^2.0.3", | ||
"copy-dir": "^1.3.0", | ||
"eclint": "^2.8.1", | ||
"eslint": "^7.19.0", | ||
"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.1", | ||
"tap": "0.4.13", | ||
"tape": "^5.1.1" | ||
"tape": "^5.7.0", | ||
"tmp": "^0.0.31" | ||
}, | ||
@@ -51,5 +64,13 @@ "license": "MIT", | ||
"dependencies": { | ||
"is-core-module": "^2.2.0", | ||
"path-parse": "^1.0.6" | ||
"is-core-module": "^2.13.0", | ||
"path-parse": "^1.0.7", | ||
"supports-preserve-symlinks-flag": "^1.0.0" | ||
}, | ||
"publishConfig": { | ||
"ignore": [ | ||
".github/workflows", | ||
"appveyor.yml", | ||
"test/resolver/malformed_package_json" | ||
] | ||
} | ||
} |
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) { | ||
@@ -25,6 +29,9 @@ t.test('isCore()', function (st) { | ||
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 | ||
console.log(mod, resolve.core, resolve.core[mod]); | ||
t.comment(mod + ': ' + resolve.core[mod]); | ||
if (resolve.core[mod]) { | ||
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 { | ||
@@ -31,0 +38,0 @@ st.throws(requireFunc, mod + ' not supported; requiring throws'); |
@@ -125,5 +125,4 @@ var path = require('path'); | ||
return path.join(dir, 'symlinked', base); | ||
} else { | ||
return path.join(resolved, 'symlinked'); | ||
} | ||
return path.join(resolved, 'symlinked'); | ||
} | ||
@@ -187,5 +186,4 @@ }; | ||
return { main: './something-else.js' }; | ||
} else { | ||
return JSON.parse(files[path.resolve(file)]); | ||
} | ||
return JSON.parse(files[path.resolve(file)]); | ||
}; | ||
@@ -192,0 +190,0 @@ |
@@ -66,3 +66,3 @@ var fs = require('fs'); | ||
}, 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); | ||
@@ -69,0 +69,0 @@ t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap', root), 'tap resolves'); |
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 | ||
var requireResolveDefaultPathsBroken = (/^v8\.9\.|^v9\.[01]\.0|^v9\.2\./).test(process.version); | ||
// broken in node v8.9.x, v9.0, v9.1, v9.2.x. see https://github.com/nodejs/node/pull/17113 | ||
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) { | ||
@@ -10,9 +24,25 @@ var dir = path.join(__dirname, 'resolver'); | ||
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' | ||
); | ||
} | ||
@@ -45,6 +75,17 @@ t.equal( | ||
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 (!requireResolveDefaultPathsBroken && requireResolveSupportsPaths) { | ||
t.equal( | ||
resolve.sync('foo', { basedir: basedir }), | ||
require.resolve('foo', { paths: [basedir] }), | ||
'foo in bar: resolve.sync === require.resolve' | ||
); | ||
} | ||
t.end(); | ||
@@ -58,4 +99,13 @@ }); | ||
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(); | ||
@@ -66,2 +116,3 @@ }); | ||
var dir = path.join(__dirname, 'resolver/biz/node_modules'); | ||
t.equal( | ||
@@ -71,12 +122,36 @@ resolve.sync('./grux', { basedir: dir }), | ||
); | ||
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 (!requireResolveDefaultPathsBroken && 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 (!requireResolveDefaultPathsBroken && requireResolveSupportsPaths) { | ||
t.equal( | ||
resolve.sync('grux', { basedir: gruxDir }), | ||
require.resolve('grux', { paths: [gruxDir] }), | ||
'grux: resolve.sync === require.resolve' | ||
); | ||
} | ||
t.end(); | ||
@@ -87,2 +162,3 @@ }); | ||
var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); | ||
t.equal( | ||
@@ -92,2 +168,10 @@ resolve.sync('../grux', { basedir: dir }), | ||
); | ||
if (requireResolveSupportsPaths) { | ||
t.equal( | ||
resolve.sync('../grux', { basedir: dir }), | ||
require.resolve('../grux', { paths: [dir] }), | ||
'../grux: resolve.sync === require.resolve' | ||
); | ||
} | ||
t.end(); | ||
@@ -98,2 +182,3 @@ }); | ||
var dir = path.join(__dirname, 'resolver'); | ||
t.equal( | ||
@@ -104,3 +189,4 @@ resolve.sync('./cup', { | ||
}), | ||
path.join(dir, 'cup.coffee') | ||
path.join(dir, 'cup.coffee'), | ||
'./cup -> ./cup.coffee' | ||
); | ||
@@ -110,3 +196,4 @@ | ||
resolve.sync('./cup.coffee', { basedir: dir }), | ||
path.join(dir, 'cup.coffee') | ||
path.join(dir, 'cup.coffee'), | ||
'./cup.coffee' | ||
); | ||
@@ -121,2 +208,10 @@ | ||
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(); | ||
@@ -127,6 +222,15 @@ }); | ||
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' | ||
); | ||
} | ||
@@ -138,3 +242,4 @@ t.equal( | ||
}), | ||
path.join(dir, 'mug.coffee') | ||
path.join(dir, 'mug.coffee'), | ||
'./mug -> ./mug.coffee' | ||
); | ||
@@ -147,3 +252,4 @@ | ||
}), | ||
path.join(dir, 'mug.js') | ||
path.join(dir, 'mug.js'), | ||
'./mug -> ./mug.js' | ||
); | ||
@@ -212,2 +318,9 @@ | ||
); | ||
if (requireResolveSupportsPaths) { | ||
t.equal( | ||
resolve.sync('./incorrect_main', { basedir: resolverDir }), | ||
require.resolve('./incorrect_main', { paths: [resolverDir] }), | ||
'./incorrect_main: resolve.sync === require.resolve' | ||
); | ||
} | ||
@@ -217,4 +330,84 @@ 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; | ||
@@ -245,11 +438,28 @@ try { | ||
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(); | ||
@@ -260,11 +470,31 @@ }); | ||
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(); | ||
@@ -282,2 +512,8 @@ }); | ||
); | ||
st.equal( | ||
resolve.sync('./' + testFile), | ||
require.resolve('./' + testFile), | ||
'sanity check: resolve.sync === require.resolve' | ||
); | ||
st.end(); | ||
@@ -310,4 +546,16 @@ }); | ||
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(); | ||
@@ -318,4 +566,15 @@ }); | ||
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(); | ||
@@ -345,3 +604,3 @@ }); | ||
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'); | ||
@@ -360,3 +619,3 @@ } | ||
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'); | ||
@@ -382,1 +641,114 @@ } | ||
}); | ||
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(); | ||
}); | ||
var malformedDir = path.join(__dirname, 'resolver/malformed_package_json'); | ||
test('malformed package.json', { skip: !fs.existsSync(malformedDir) }, function (t) { | ||
t.plan(5 + (requireResolveSupportsPaths ? 1 : 0)); | ||
var basedir = malformedDir; | ||
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' | ||
); | ||
}); |
var path = require('path'); | ||
var fs = require('fs'); | ||
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) { | ||
@@ -287,2 +294,51 @@ t.plan(12); | ||
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) { | ||
@@ -292,3 +348,3 @@ 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 | ||
@@ -409,3 +465,3 @@ tester(t, 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'); | ||
@@ -423,3 +479,3 @@ t.equal(res, undefined, 'res is undefined'); | ||
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'); | ||
@@ -455,1 +511,92 @@ t.equal(res, undefined, 'res is undefined'); | ||
}); | ||
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' | ||
); | ||
}); | ||
}); | ||
var malformedDir = path.join(__dirname, 'resolver/malformed_package_json'); | ||
test('malformed package.json', { skip: !fs.existsSync(malformedDir) }, 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 = malformedDir; | ||
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'); | ||
} | ||
); | ||
}); |
{ | ||
"name": "invalid main", | ||
"name": "invalid_main", | ||
"main": [ | ||
@@ -4,0 +4,0 @@ "why is this a thing", |
{ | ||
"name": "monorepo-symlink-test", | ||
"name": "ljharb-monorepo-symlink-test", | ||
"private": true, | ||
@@ -4,0 +4,0 @@ "version": "0.0.0", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 8 instances in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
145394
97
3287
302
3
17
27
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
Updatedis-core-module@^2.13.0
Updatedpath-parse@^1.0.7