From 134d1feb17c901b36cd7db91023a679ed603dce3 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sat, 22 Jan 2022 11:19:24 -0800 Subject: [PATCH 01/12] [meta] do not publish `appveyor.yml` --- .npmignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmignore b/.npmignore index 19f7454e..2c0af0d1 100644 --- a/.npmignore +++ b/.npmignore @@ -11,3 +11,4 @@ yarn.lock test/resolver/symlinked/_/node_modules/package .github/workflows +appveyor.yml From 761e1d6b51f88fb2990cf9dfdaa735a67f577876 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Fri, 22 Apr 2022 22:06:21 -0700 Subject: [PATCH 02/12] [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5cad3f3f..482cb668 100644 --- a/package.json +++ b/package.json @@ -29,12 +29,12 @@ "test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test" }, "devDependencies": { - "@ljharb/eslint-config": "^20.2.0", + "@ljharb/eslint-config": "^20.2.3", "array.prototype.map": "^1.0.4", "aud": "^2.0.0", "copy-dir": "^1.3.0", "eclint": "^2.8.1", - "eslint": "^8.7.0", + "eslint": "=8.8.0", "in-publish": "^2.0.1", "mkdirp": "^0.5.5", "mv": "^2.1.1", @@ -42,7 +42,7 @@ "rimraf": "^2.7.1", "safe-publish-latest": "^2.0.0", "tap": "0.4.13", - "tape": "^5.4.1", + "tape": "^5.5.3", "tmp": "^0.0.31" }, "license": "MIT", From 412518e9bafaa42623b351ef59e3affb68f68690 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Fri, 22 Apr 2022 22:06:37 -0700 Subject: [PATCH 03/12] [Deps] update `is-core-module` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 482cb668..0e288538 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "url": "https://github.com/sponsors/ljharb" }, "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } From d171f96865fa770759e7b30598574429e98e3921 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Tue, 31 May 2022 14:15:15 -0700 Subject: [PATCH 04/12] [Dev Deps] update `@ljharb/eslint-config` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e288538..5ec4be6e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test" }, "devDependencies": { - "@ljharb/eslint-config": "^20.2.3", + "@ljharb/eslint-config": "^21.0.0", "array.prototype.map": "^1.0.4", "aud": "^2.0.0", "copy-dir": "^1.3.0", From d06a8dc814a42c48f7f7df8e4a7020e28e13cdf6 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Wed, 4 May 2022 22:44:16 -0700 Subject: [PATCH 05/12] [meta] use `npmignore` to autogenerate an npmignore file --- .gitignore | 2 ++ .npmignore | 14 -------------- package.json | 8 ++++++++ 3 files changed, 10 insertions(+), 14 deletions(-) delete mode 100644 .npmignore diff --git a/.gitignore b/.gitignore index 52e78ddc..3b58a07d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ yarn.lock # symlinked file used in tests test/resolver/symlinked/_/node_modules/package + +.npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 2c0af0d1..00000000 --- a/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -# gitignore -node_modules -**/node_modules - -# Only apps should have lockfiles -npm-shrinkwrap.json -package-lock.json -yarn.lock - -# symlinked file used in tests -test/resolver/symlinked/_/node_modules/package - -.github/workflows -appveyor.yml diff --git a/package.json b/package.json index 5ec4be6e..09296cd3 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "module" ], "scripts": { + "prepack": "npmignore --auto --commentLines=autogenerated", "prepublishOnly": "safe-publish-latest && cp node_modules/is-core-module/core.json ./lib/ ||:", "prepublish": "not-in-publish || npm run prepublishOnly", "prelint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')", @@ -38,6 +39,7 @@ "in-publish": "^2.0.1", "mkdirp": "^0.5.5", "mv": "^2.1.1", + "npmignore": "^0.3.0", "object-keys": "^1.1.1", "rimraf": "^2.7.1", "safe-publish-latest": "^2.0.0", @@ -58,5 +60,11 @@ "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "publishConfig": { + "ignore": [ + ".github/workflows", + "appveyor.yml" + ] } } From 0008477c73e2fa2285ca06e85343b67f55171eff Mon Sep 17 00:00:00 2001 From: Ilya Pospelov Date: Mon, 23 May 2022 14:57:26 +0300 Subject: [PATCH 06/12] [Fix] support windows virtual drive paths --- appveyor.yml | 5 +++++ lib/async.js | 2 +- lib/sync.js | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f74b7b8a..7937eac6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -73,4 +73,9 @@ test_script: - node --version - npm --version # run tests + - cd + - npm run tests-only + - 'subst X: ..' + - 'cd /d X:\resolve' + - cd - npm run tests-only diff --git a/lib/async.js b/lib/async.js index 2b0f0f3d..60d2555f 100644 --- a/lib/async.js +++ b/lib/async.js @@ -6,7 +6,7 @@ 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 () { diff --git a/lib/sync.js b/lib/sync.js index 32469899..0b6cd58d 100644 --- a/lib/sync.js +++ b/lib/sync.js @@ -6,7 +6,7 @@ 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 () { From f5cf55d0dceb8adafd761ad8594fb29d5fcec74c Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Tue, 31 May 2022 22:21:28 -0700 Subject: [PATCH 07/12] [Tests] avoid tests breaking on node 11.11 - 11.13 --- package.json | 1 + test/core.js | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 09296cd3..0ae08e51 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "object-keys": "^1.1.1", "rimraf": "^2.7.1", "safe-publish-latest": "^2.0.0", + "semver": "^6.3.0", "tap": "0.4.13", "tape": "^5.5.3", "tmp": "^0.0.31" diff --git a/test/core.js b/test/core.js index 7a3ccb16..a477adc5 100644 --- a/test/core.js +++ b/test/core.js @@ -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,10 +26,13 @@ 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 - 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 { st.throws(requireFunc, mod + ' not supported; requiring throws'); } From 232bff4e9cecadb0451c3b013a6985519c905431 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 10 Feb 2022 21:44:41 -0800 Subject: [PATCH 08/12] [Test] fix incorrect `require.resolve` paths logic; enable these tests --- test/resolver_sync.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/resolver_sync.js b/test/resolver_sync.js index 6e4ae1e6..407f7c87 100644 --- a/test/resolver_sync.js +++ b/test/resolver_sync.js @@ -6,7 +6,7 @@ var resolve = require('../'); var sync = require('../sync'); var requireResolveSupportsPaths = require.resolve.length > 1 - && (/^12\.[012]\./).test(process.version); // broken in v12.0-12.2, see https://github.com/nodejs/node/issues/27794 + && !(/^12\.[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`'); From e9e764c29a4c3c978790cccb091a9e44db332dad Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 10 Feb 2022 21:45:11 -0800 Subject: [PATCH 09/12] [Test] add some `sync` coverage --- test/resolver_sync.js | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/resolver_sync.js b/test/resolver_sync.js index 407f7c87..5248cbbe 100644 --- a/test/resolver_sync.js +++ b/test/resolver_sync.js @@ -309,6 +309,63 @@ test('incorrect main', function (t) { 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, 'INCORRECT_PACKAGE_MAIN', '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'); + var dir = path.join(resolverDir, 'missing_main'); + + t.equal( + resolve.sync('./missing_main', { basedir: resolverDir }), + path.join(dir, 'index.js') + ); + if (requireResolveSupportsPaths) { + t.equal( + resolve.sync('./missing_main', { basedir: resolverDir }), + require.resolve('./missing_main', { paths: [resolverDir] }), + '"main" missing: resolve.sync === require.resolve' + ); + } + + t.end(); +}); + +test('null main', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'null_main'); + + t.equal( + resolve.sync('./null_main', { basedir: resolverDir }), + path.join(dir, 'index.js') + ); + if (requireResolveSupportsPaths) { + t.equal( + resolve.sync('./null_main', { basedir: resolverDir }), + require.resolve('./null_main', { paths: [resolverDir] }), + '`"main": null`: resolve.sync === require.resolve' + ); + } + + t.end(); +}); var stubStatSync = function stubStatSync(fn) { var statSync = fs.statSync; try { From 3ab1da8875bacf4871b4eeb7fd55981f0db2f44a Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Mon, 14 Feb 2022 23:47:59 -0800 Subject: [PATCH 10/12] [Tests] fix tests on node v12.0-12.2 --- test/resolver_sync.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/resolver_sync.js b/test/resolver_sync.js index 5248cbbe..6fb46a29 100644 --- a/test/resolver_sync.js +++ b/test/resolver_sync.js @@ -6,7 +6,7 @@ var resolve = require('../'); var sync = require('../sync'); var requireResolveSupportsPaths = require.resolve.length > 1 - && !(/^12\.[012]\./).test(process.version); // broken in v12.0-12.2, see https://github.com/nodejs/node/issues/27794 + && !(/^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`'); From cf1d4cccbd01772b9674f3c3dcb5f76a6e426685 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 10 Feb 2022 21:46:11 -0800 Subject: [PATCH 11/12] [Test] add tests for `"main": false` See https://github.com/import-js/eslint-plugin-import/issues/2132#issuecomment-1035886707 --- test/resolver.js | 49 ++++++++++++++++++++++ test/resolver/false_main/index.js | 0 test/resolver/false_main/package.json | 4 ++ test/resolver_sync.js | 58 +++++++++++++++++++-------- 4 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 test/resolver/false_main/index.js create mode 100644 test/resolver/false_main/package.json diff --git a/test/resolver.js b/test/resolver.js index 09da6868..49031659 100644 --- a/test/resolver.js +++ b/test/resolver.js @@ -290,6 +290,55 @@ 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); diff --git a/test/resolver/false_main/index.js b/test/resolver/false_main/index.js new file mode 100644 index 00000000..e69de29b diff --git a/test/resolver/false_main/package.json b/test/resolver/false_main/package.json new file mode 100644 index 00000000..a7416c0c --- /dev/null +++ b/test/resolver/false_main/package.json @@ -0,0 +1,4 @@ +{ + "name": "false_main", + "main": false +} diff --git a/test/resolver_sync.js b/test/resolver_sync.js index 6fb46a29..53453d66 100644 --- a/test/resolver_sync.js +++ b/test/resolver_sync.js @@ -317,7 +317,7 @@ test('missing index', function (t) { resolve.sync('./missing_index', { basedir: resolverDir }); t.fail('did not fail'); } catch (err) { - t.equal(err && err.code, 'INCORRECT_PACKAGE_MAIN', 'error has correct error code'); + t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error has correct error code'); } if (requireResolveSupportsPaths) { try { @@ -331,18 +331,20 @@ test('missing index', function (t) { test('missing main', function (t) { var resolverDir = path.join(__dirname, 'resolver'); - var dir = path.join(resolverDir, 'missing_main'); - t.equal( - resolve.sync('./missing_main', { basedir: resolverDir }), - path.join(dir, 'index.js') - ); + 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) { - t.equal( - resolve.sync('./missing_main', { basedir: resolverDir }), - require.resolve('./missing_main', { paths: [resolverDir] }), - '"main" missing: resolve.sync === require.resolve' - ); + 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(); @@ -350,22 +352,44 @@ test('missing main', function (t) { test('null main', function (t) { var resolverDir = path.join(__dirname, 'resolver'); - var dir = path.join(resolverDir, 'null_main'); + 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('./null_main', { basedir: resolverDir }), - path.join(dir, 'index.js') + resolve.sync('./false_main', { basedir: basedir }), + path.join(dir, 'index.js'), + '`"main": false`: resolves to `index.js`' ); if (requireResolveSupportsPaths) { t.equal( - resolve.sync('./null_main', { basedir: resolverDir }), - require.resolve('./null_main', { paths: [resolverDir] }), - '`"main": null`: resolve.sync === require.resolve' + 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 statSync = fs.statSync; try { From 8eea601093612229da100e9dfbeb4b2b47693aa6 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Fri, 17 Jun 2022 15:19:45 -0500 Subject: [PATCH 12/12] v1.22.1 - [Fix] support windows virtual drive paths (#284) - [Deps] update `is-core-module` - [meta] use `npmignore` to autogenerate an npmignore file - [meta] do not publish `appveyor.yml` - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` - [Test] add tests for `"main": false` - [Tests] fix tests on node v12.0-12.2 - [Test] add some `sync` coverage - [Test] fix incorrect `require.resolve` paths logic; enable these tests - [Tests] avoid tests breaking on node 11.11 - 11.13 --- lib/core.json | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/core.json b/lib/core.json index d2752948..058584b7 100644 --- a/lib/core.json +++ b/lib/core.json @@ -112,6 +112,7 @@ "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", diff --git a/package.json b/package.json index 0ae08e51..7177e0f8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "resolve", "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously", - "version": "1.22.0", + "version": "1.22.1", "repository": { "type": "git", "url": "git://github.com/browserify/resolve.git"