diff --git a/CHANGELOG.md b/CHANGELOG.md index c4b72dd357..147b944405 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,11 @@ Please add one entry in this file for each change in Yarn's behavior. Use the sa ## Master -- Fixes handling of empty string entries for bin in package.json +- Fixes the `extensions` option when used by `resolveRequest` + + [#6479](https://github.com/yarnpkg/yarn/pull/6479) - [**Maƫl Nison**](https://twitter.com/arcanis) + +- Fixes handling of empty string entries for `bin` in package.json [#6515](https://github.com/yarnpkg/yarn/pull/6515) - [**Ryan Burrows**](https://github.com/rhburrows) diff --git a/packages/pkg-tests/pkg-tests-specs/sources/index.js b/packages/pkg-tests/pkg-tests-specs/sources/index.js index c2ac091cba..f000a152ae 100644 --- a/packages/pkg-tests/pkg-tests-specs/sources/index.js +++ b/packages/pkg-tests/pkg-tests-specs/sources/index.js @@ -4,5 +4,6 @@ exports.basic = require('./basic'); exports.dragon = require('./dragon'); exports.lock = require('./lock'); exports.pnp = require('./pnp'); +exports.pnpapiV1 = require('./pnpapi-v1'); exports.script = require('./script'); exports.workspace = require('./workspace'); diff --git a/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js b/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js new file mode 100644 index 0000000000..e56fb700e8 --- /dev/null +++ b/packages/pkg-tests/pkg-tests-specs/sources/pnpapi-v1.js @@ -0,0 +1,88 @@ +const {fs: {writeFile, writeJson}} = require('pkg-tests-core'); + +module.exports = makeTemporaryEnv => { + describe(`Plug'n'Play API (v1)`, () => { + test( + `it should expost VERSIONS`, + makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { + await run(`install`); + + await expect(source(`require('pnpapi').VERSIONS`)).resolves.toMatchObject({std: 1}); + }), + ); + + test( + `it should expost resolveToUnqualified`, + makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { + await run(`install`); + + await expect(source(`typeof require('pnpapi').resolveToUnqualified`)).resolves.toEqual(`function`); + }), + ); + + test( + `it should expost resolveToUnqualified`, + makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { + await run(`install`); + + await expect(source(`typeof require('pnpapi').resolveUnqualified`)).resolves.toEqual(`function`); + }), + ); + + test( + `it should expost resolveToUnqualified`, + makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { + await run(`install`); + + await expect(source(`typeof require('pnpapi').resolveRequest`)).resolves.toEqual(`function`); + }), + ); + + describe(`resolveRequest`, () => { + test( + `it should return null for builtins`, + makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { + await run(`install`); + + await expect(source(`require('pnpapi').resolveRequest('fs', '${path}/')`)).resolves.toEqual(null); + }), + ); + + test( + `it should support the 'considerBuiltins' option`, + makeTemporaryEnv( + { + dependencies: {[`fs`]: `link:./fs`}, + }, + {plugNPlay: true}, + async ({path, run, source}) => { + await writeFile(`${path}/fs/index.js`, `module.exports = 'Hello world';`); + await writeJson(`${path}/fs/package.json`, { + name: `fs`, + version: `1.0.0`, + }); + + await run(`install`); + + await expect( + source(`require('pnpapi').resolveRequest('fs', '${path}/', {considerBuiltins: false})`), + ).resolves.toEqual(`${path}/fs/index.js`); + }, + ), + ); + + test( + `it should support the 'extensions' option`, + makeTemporaryEnv({}, {plugNPlay: true}, async ({path, run, source}) => { + await writeFile(`${path}/foo.bar`, `hello world`); + + await run(`install`); + + await expect( + source(`require('pnpapi').resolveRequest('./foo', '${path}/', {extensions: ['.bar']})`), + ).resolves.toEqual(`${path}/foo.bar`); + }), + ); + }); + }); +}; diff --git a/packages/pkg-tests/yarn.test.js b/packages/pkg-tests/yarn.test.js index d3727b592f..25b5d968f0 100644 --- a/packages/pkg-tests/yarn.test.js +++ b/packages/pkg-tests/yarn.test.js @@ -12,6 +12,7 @@ const { dragon: dragonSpecs, lock: lockSpecs, pnp: pnpSpecs, + pnpapiV1: pnpapiV1Specs, script: scriptSpecs, workspace: workspaceSpecs, } = require(`pkg-tests-specs`); @@ -74,4 +75,5 @@ lockSpecs(pkgDriver); scriptSpecs(pkgDriver); workspaceSpecs(pkgDriver); pnpSpecs(pkgDriver); +pnpapiV1Specs(pkgDriver); dragonSpecs(pkgDriver); diff --git a/src/util/generate-pnp-map-api.tpl.js b/src/util/generate-pnp-map-api.tpl.js index d8f5152100..f594353b07 100644 --- a/src/util/generate-pnp-map-api.tpl.js +++ b/src/util/generate-pnp-map-api.tpl.js @@ -518,7 +518,7 @@ exports.resolveRequest = function resolveRequest(request, issuer, {considerBuilt } try { - exports.resolveToUnqualified(request, realIssuer, {extensions}); + exports.resolveToUnqualified(request, realIssuer, {considerBuiltins}); } catch (error) { // If an error was thrown, the problem doesn't seem to come from a path not being normalized, so we // can just throw the original error which was legit. @@ -547,7 +547,7 @@ exports.resolveRequest = function resolveRequest(request, issuer, {considerBuilt } try { - return exports.resolveUnqualified(unqualifiedPath); + return exports.resolveUnqualified(unqualifiedPath, {extensions}); } catch (resolutionError) { if (resolutionError.code === 'QUALIFIED_PATH_RESOLUTION_FAILED') { Object.assign(resolutionError.data, {request, issuer});