Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(compat): don't resolve missing modules to a file with the same name #3455

Merged
merged 5 commits into from Sep 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 39 additions & 39 deletions .pnp.cjs

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
Binary file not shown.
23 changes: 23 additions & 0 deletions .yarn/versions/878d6065.yml
@@ -0,0 +1,23 @@
releases:
"@yarnpkg/cli": patch
"@yarnpkg/plugin-compat": patch

declined:
- "@yarnpkg/plugin-constraints"
- "@yarnpkg/plugin-dlx"
- "@yarnpkg/plugin-essentials"
- "@yarnpkg/plugin-init"
- "@yarnpkg/plugin-interactive-tools"
- "@yarnpkg/plugin-nm"
- "@yarnpkg/plugin-npm-cli"
- "@yarnpkg/plugin-pack"
- "@yarnpkg/plugin-patch"
- "@yarnpkg/plugin-pnp"
- "@yarnpkg/plugin-pnpm"
- "@yarnpkg/plugin-stage"
- "@yarnpkg/plugin-typescript"
- "@yarnpkg/plugin-version"
- "@yarnpkg/plugin-workspace-tools"
- "@yarnpkg/builder"
- "@yarnpkg/core"
- "@yarnpkg/doctor"
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -15,6 +15,7 @@ Yarn now accepts sponsorships! Please give a look at our [OpenCollective](https:
- Hoisting algorithm speedup, impacts recurrent `node_modules` installs time.
- CLI bundles built from sources output `commit` hash instead of `tree` hash as part of their version
- `workspaces foreach run` now handles the fact that a script containing `:` only becomes global if it exists in one workspace.
- The PnP compatibility patch for `resolve` will no longer resolve missing modules to a file with the same name located next to the issuer

### Installs

Expand Down
14 changes: 4 additions & 10 deletions packages/plugin-compat/extra/resolve/normalize-options.js
Expand Up @@ -71,23 +71,17 @@ module.exports = function (_, opts) {
const packageIterator = (request, basedir, getCandidates, opts) => {
const pathsToTest = [basedir].concat(originalPaths);
const resolution = runPnpResolutionOnArray(request, pathsToTest);
if (typeof resolution === `undefined`)
if (resolution == null)
return getCandidates();

if (resolution === null)
return pathsToTest.map(file => path.join(file, request));

return [resolution.unqualifiedPath];
};

const paths = (request, basedir, getNodeModulePaths, opts) => {
const pathsToTest = [basedir].concat(originalPaths);
const resolution = runPnpResolutionOnArray(request, pathsToTest);
if (typeof resolution === `undefined`)
return getNodeModulePaths();

if (resolution === null)
return pathsToTest;
if (resolution == null)
return getNodeModulePaths().concat(originalPaths);

// Stip the local named folder
let nodeModules = path.dirname(resolution.packagePath);
Expand Down Expand Up @@ -116,7 +110,7 @@ module.exports = function (_, opts) {

opts.paths = function (request, basedir, getNodeModulePaths, opts) {
if (isInsideIterator)
return getNodeModulePaths();
return getNodeModulePaths().concat(originalPaths);

return paths(request, basedir, getNodeModulePaths, opts);
};
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin-compat/sources/patches/resolve.patch.ts
Expand Up @@ -2,7 +2,7 @@ let patch: string;

export function getPatch() {
if (typeof patch === `undefined`)
patch = require(`zlib`).brotliDecompressSync(Buffer.from(`G1ETIIzURnVBnGa0VPvr81orV8AFIqdU0sqrdcVgCdukgAZwi8a50gLk1+99ZzEOlGB8s4acvWeXuS+tdEXZvf/9FpWJoilc6Q6J6jJSoh3LcLpdtPu9FIgS8MvfSzMYoNMZmgjFv02fu1wzv7rjy/uxz4D+3ipRSL9d7a+tby2vMqZ1NtjYWGeIH62vriZB/0y0R4+Ef9fEOfZExraSTqcT5mDirXa43/kAnaydLcMnp7tr+CAJ0D7GarF32/VAZm24KgaKOgkAeLP5OIMmuAqLtyepZZpJ0I8kOM9wGf8HzBcrFKs69DQvA+vDlgPikZ4AzdsRfmwR7y3H88Z+6iJCvkUW7YI0r0/qjTkJMknPjKnGEtM3/GVPblOGKzvGVEG/3ry219D+GFBi/0V5y/Y+5J+ne0oNjKAkqNsJziEsC9uIaCu3BAhKSXzNKKb2ShbfglceIpXKp7QPDEfjYfOEXhVZaj9YuqbW5CqJUFQbEv61vK5cMNH5OUskCmdDBLpP/M8uZ/mtaUl33NTlnzt6OwBXbRE12AV9hIeKySVaULr2d3Db1xA/XQjF17HKVjSBbnrYs/kyPyQJCKSajrMGvhyY9lPrV46lMsFLN32MA1/pnNPPjoMmjNgMYcaCM+fj74qymaJ4WTHxf1gdaYWmRcIe0tH90alG6ez/yA7jwYYtxuHWZdR+2HlMcddaHAV6QC/gXYHV0wnNv47I+5FGevzJFMqWSO/6U4mw3Jh2u4MkhB9O6113OiIlXLWd7bxkBpnsNDHsrPP4nXc3JK/9AofIZqMAJ+ZaM3/p2laHlVlwZHqJ7kVh9GyeneYEyMyukj7fZjyF2EM9xvkSAUqJJ5Em+VH+ebjmSCb2Sof38a6wa4FSMqqKkYiI+kAb54/8g5D97YO3D5633jnd/3yQkvtB1rzPHKhRQEyqhh/0tRF5dw5D0B7W9DcC0hE6cqQ8l0/Yh6X9oGZMOUBXzxTgQ9OXx8jQRaR/akDmFinFPLGIwnXMEE5UZyy86XMK4VuFEWh0dZ4VI+UP43fUdprpIOvgeSAguQRfPa4EorHKDz20artlpBT7n1GVgQD/qPuAYXE2LQTMOIZlKsYsGw+smX1uQLjUWwLjjnVGuctsONqUCJhFJPkeOkpBvP5bR7RKRPtlxlVsw3TVjbthCDj7GJnX7t2DnejrpNElkX9q7nnjLcsXPCoLsg3E9dcmrTSWvmFoOvYt0MT6qzWivVfqfsO1uhU0EbExmorhlrExlJbLj4mFSdXbmYKWU2JkNfxObx+IAmvmu/rtcAUKMT9g/F4NjNXAQdwpYJDrpkvj5SKCGIM8dxijKkar3I08QWINlCGbKR8eO8aUZARY/pBgH+3m0mEs2i+R27kvHB6CgfaxRoaubQgJhFG2qz68GCGk4a8OLPTuyJWtFQzqV7SN3yTPlgnTu8xGcmdZPuQm9QALLSj3YtClAOfeTM7KZM1ub2WI8FuopnrsyXDiX83HzgXnl4WijCPNNOFpJUBgm2EmfNpJ0vFnsI9vvIltvOVela4apm+5zd3uh8iGlwH1zrybDveunndO4O34b+escLZQkcQZeGwFEUj8+KBBBdVLng7eFS5FfRzh6iNyV6ZsPXVuMZFUeKQi2viy2BMZjEfDqF9JqVh0vIVzEdvul0uQ9SgEnZXGmYUX/wdkKgPXRloVdDlvJK8udQZBbR986wgb/oVh8wT0+q1GciF1GSEYAJCM2QBPwahTg+7BrYJVO05+bwN285fIX4hp39NCDVFsIrUmrIlZmer/Prd8kdQWj0k4D+viGB3JQyxr+iqYqgEUkvhczkrGtlr5hvDdkWwtaqLJe8Mgzhqots10eb6qcfs1vV74MtV1FE3zNszshCxmS3SeKfJy1FiSjodoYEVWLEWiFQG7FIItT5zv9ZBUTlcS2eUmpAgBES1TLR013xZj0TIpjlLasjhELo75d+wA`, `base64`)).toString();
patch = require(`zlib`).brotliDecompressSync(Buffer.from(`G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=`, `base64`)).toString();

return patch;
}
63 changes: 49 additions & 14 deletions packages/plugin-compat/tests/resolve.test.ts
@@ -1,38 +1,40 @@
import path from 'path';
import resolve from 'resolve';

const FILENAME = path.basename(__filename);

describe(`ResolvePatch`, () => {
it(`works on local file`, () => {
expect(
resolve.sync(path.basename(__filename), {extensions: [`.ts`]}),
).toEqual(__filename);
it(`should not match a local file that matches the specifier`, () => {
expect(() =>
resolve.sync(FILENAME, {extensions: [`.ts`]}),
).toThrow(`Cannot find module '${FILENAME}'`);

expect(
resolve.sync(path.basename(__filename), {
() => resolve.sync(FILENAME, {
extensions: [`.ts`],
__skipPackageIterator: true,
} as any),
).toEqual(__filename);
).toThrow(`Cannot find module '${FILENAME}'`);
});

it(`works on local file with paths option`, () => {
it(`should match a local file when using the paths option`, () => {
expect(
resolve.sync(`extensions.ts`, {
paths: [path.join(__dirname, `../sources`)],
resolve.sync(FILENAME, {
paths: [__dirname],
extensions: [`.ts`],
}),
).toEqual(path.join(__dirname, `../sources/extensions.ts`));
).toEqual(__filename);

expect(
resolve.sync(`extensions.ts`, {
paths: [path.join(__dirname, `../sources`)],
resolve.sync(FILENAME, {
paths: [__dirname],
extensions: [`.ts`],
__skipPackageIterator: true,
} as any),
).toEqual(path.join(__dirname, `../sources/extensions.ts`));
).toEqual(__filename);
});

it(`can require dependency in paths`, () => {
it(`can require a dependency from paths`, () => {
expect(
resolve.sync(`got`, {
paths: [require.resolve(`@yarnpkg/core`)],
Expand All @@ -46,4 +48,37 @@ describe(`ResolvePatch`, () => {
} as any),
).toEqual(require.resolve(`got`, {paths: [require.resolve(`@yarnpkg/core`)]}));
});

it(`can require a dependency from basedir`, () => {
expect(
resolve.sync(`got`, {
basedir: require.resolve(`@yarnpkg/core`),
}),
).toEqual(require.resolve(`got`, {paths: [require.resolve(`@yarnpkg/core`)]}));

expect(
resolve.sync(`got`, {
basedir: require.resolve(`@yarnpkg/core`),
__skipPackageIterator: true,
} as any),
).toEqual(require.resolve(`got`, {paths: [require.resolve(`@yarnpkg/core`)]}));
});

it(`non-absolute paths should return non-absolute result if it can be found from the cwd`, () => {
// This test covers https://github.com/yarnpkg/berry/issues/897
// The behaviour is odd but the patch shouldn't change it
// The cwd when this test runs is the repo root
expect(
resolve.sync(`run-yarn.js`, {
paths: [`scripts`],
}),
).toEqual(`scripts${path.sep}run-yarn.js`);

expect(
resolve.sync(`run-yarn.js`, {
paths: [`scripts`],
__skipPackageIterator: true,
} as any),
).toEqual(`scripts${path.sep}run-yarn.js`);
});
});
12 changes: 6 additions & 6 deletions yarn.lock
Expand Up @@ -22737,30 +22737,30 @@ resolve@^2.0.0-next.3:

"resolve@patch:resolve@1.9.0#~builtin<compat/resolve>":
version: 1.9.0
resolution: "resolve@patch:resolve@npm%3A1.9.0#~builtin<compat/resolve>::version=1.9.0&hash=b382c1"
resolution: "resolve@patch:resolve@npm%3A1.9.0#~builtin<compat/resolve>::version=1.9.0&hash=07638b"
dependencies:
path-parse: ^1.0.6
checksum: deb4393d74bc8fe1f4d0025195dabcc29d2ca825689fc3e1726ca8ad44ef32ad13a9d1b5e87b09bd727201c8318518ae303eb5a0a4d336bacbc61deb7f8332ff
checksum: 8e86033057ad5b02195f40cc0edcf8ea4eb326e95ad977c6ec01344c9129d77e4f13f8d4512b39390dd8dff3c7aac2112de3912c38e3f884f0d51bf92865bf3f
languageName: node
linkType: hard

"resolve@patch:resolve@^1.1.6#~builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.13.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.17.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.3.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.9.0#~builtin<compat/resolve>":
version: 1.20.0
resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin<compat/resolve>::version=1.20.0&hash=b382c1"
resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin<compat/resolve>::version=1.20.0&hash=07638b"
dependencies:
is-core-module: ^2.2.0
path-parse: ^1.0.6
checksum: d060c878a7286fcfca5277b90fb12d01e7e075831e0710eef93a8ab7e25311303ab3783cd86d636127d2c7d61daee04aa8a1bc51afd8028110e082a6a2d49ee3
checksum: a0dd7d16a8e47af23afa9386df2dff10e3e0debb2c7299a42e581d9d9b04d7ad5d2c53f24f1e043f7b3c250cbdc71150063e53d0b6559683d37f790b7c8c3cd5
languageName: node
linkType: hard

"resolve@patch:resolve@^2.0.0-next.3#~builtin<compat/resolve>":
version: 2.0.0-next.3
resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin<compat/resolve>::version=2.0.0-next.3&hash=b382c1"
resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin<compat/resolve>::version=2.0.0-next.3&hash=07638b"
dependencies:
is-core-module: ^2.2.0
path-parse: ^1.0.6
checksum: 81e6cfa7c9fa5230edcb30de6917f263e71e7e11a06571aafc5aca76481b935f0ff6578e28204048ae5cab1f47eb00f3675c71d57d1cf379f0caf913bcf56019
checksum: 21684b4d99a4877337cdbd5484311c811b3e8910edb5d868eec85c6e6550b0f570d911f9a384f9e176172d6713f2715bd0b0887fa512cb8c6aeece018de6a9f8
languageName: node
linkType: hard

Expand Down