From 1be6ee25702f5da60b274af1760d4910dbf52340 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 22 Feb 2021 13:12:37 +0000 Subject: [PATCH] chore: update yarn sdks --- .yarn/sdks/eslint/lib/api.js | 2 +- .yarn/sdks/eslint/package.json | 2 +- .yarn/sdks/prettier/index.js | 10 +++ .yarn/sdks/typescript/lib/tsc.js | 2 +- .yarn/sdks/typescript/lib/tsserver.js | 86 +++++++++++++++++-------- .yarn/sdks/typescript/lib/typescript.js | 2 +- .yarn/sdks/typescript/package.json | 2 +- 7 files changed, 75 insertions(+), 31 deletions(-) diff --git a/.yarn/sdks/eslint/lib/api.js b/.yarn/sdks/eslint/lib/api.js index bbcd99d..ac3c9fc 100644 --- a/.yarn/sdks/eslint/lib/api.js +++ b/.yarn/sdks/eslint/lib/api.js @@ -2,7 +2,7 @@ const {existsSync} = require(`fs`); const {createRequire, createRequireFromPath} = require(`module`); -const {resolve, dirname} = require(`path`); +const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.js"; diff --git a/.yarn/sdks/eslint/package.json b/.yarn/sdks/eslint/package.json index 65e9739..6442477 100644 --- a/.yarn/sdks/eslint/package.json +++ b/.yarn/sdks/eslint/package.json @@ -1,6 +1,6 @@ { "name": "eslint", - "version": "7.14.0-pnpify", + "version": "7.20.0-pnpify", "main": "./lib/api.js", "type": "commonjs" } diff --git a/.yarn/sdks/prettier/index.js b/.yarn/sdks/prettier/index.js index 984baf1..80134e1 100755 --- a/.yarn/sdks/prettier/index.js +++ b/.yarn/sdks/prettier/index.js @@ -14,6 +14,16 @@ if (existsSync(absPnpApiPath)) { // Setup the environment to be able to require prettier/index.js require(absPnpApiPath).setup(); } + + const pnpifyResolution = require.resolve(`@yarnpkg/pnpify`, {paths: [dirname(absPnpApiPath)]}); + if (typeof global[`__yarnpkg_sdk_is_using_pnpify__`] === `undefined`) { + Object.defineProperty(global, `__yarnpkg_sdk_is_using_pnpify__`, {configurable: true, value: true}); + + process.env.NODE_OPTIONS += ` -r ${pnpifyResolution}`; + + // Apply PnPify to the current process + absRequire(pnpifyResolution).patchFs(); + } } // Defer to the real prettier/index.js your application uses diff --git a/.yarn/sdks/typescript/lib/tsc.js b/.yarn/sdks/typescript/lib/tsc.js index 4bc23fc..e030711 100644 --- a/.yarn/sdks/typescript/lib/tsc.js +++ b/.yarn/sdks/typescript/lib/tsc.js @@ -2,7 +2,7 @@ const {existsSync} = require(`fs`); const {createRequire, createRequireFromPath} = require(`module`); -const {resolve, dirname} = require(`path`); +const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.js"; diff --git a/.yarn/sdks/typescript/lib/tsserver.js b/.yarn/sdks/typescript/lib/tsserver.js index eaae166..1d6dfb6 100644 --- a/.yarn/sdks/typescript/lib/tsserver.js +++ b/.yarn/sdks/typescript/lib/tsserver.js @@ -2,7 +2,7 @@ const {existsSync} = require(`fs`); const {createRequire, createRequireFromPath} = require(`module`); -const {resolve, dirname} = require(`path`); +const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.js"; @@ -10,11 +10,65 @@ const absPnpApiPath = resolve(__dirname, relPnpApiPath); const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); const moduleWrapper = tsserver => { + const {isAbsolute} = require(`path`); + const pnpApi = require(`pnpapi`); + + const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { + return `${locator.name}@${locator.reference}`; + })); + // VSCode sends the zip paths to TS using the "zip://" prefix, that TS // doesn't understand. This layer makes sure to remove the protocol // before forwarding it to TS, and to add it back on all returned paths. - const {isAbsolute} = require(`path`); + function toEditorPath(str) { + // We add the `zip:` prefix to both `.zip/` paths and virtual paths + if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || str.match(/\$\$virtual\//))) { + // We also take the opportunity to turn virtual paths into physical ones; + // this makes is much easier to work with workspaces that list peer + // dependencies, since otherwise Ctrl+Click would bring us to the virtual + // file instances instead of the real ones. + // + // We only do this to modules owned by the the dependency tree roots. + // This avoids breaking the resolution when jumping inside a vendor + // with peer dep (otherwise jumping into react-dom would show resolution + // errors on react). + // + const resolved = pnpApi.resolveVirtual(str); + if (resolved) { + const locator = pnpApi.findPackageLocator(resolved); + if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + str = resolved; + } + } + + str = str.replace(/\\/g, `/`) + str = str.replace(/^\/?/, `/`); + + // Absolute VSCode `Uri.fsPath`s need to start with a slash. + // VSCode only adds it automatically for supported schemes, + // so we have to do it manually for the `zip` scheme. + // The path needs to start with a caret otherwise VSCode doesn't handle the protocol + // + // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 + // + if (str.match(/\.zip\//)) { + str = `${isVSCode ? `^` : ``}zip:${str}`; + } + } + + return str; + } + + function fromEditorPath(str) { + return process.platform === `win32` + ? str.replace(/^\^?zip:\//, ``) + : str.replace(/^\^?zip:/, ``); + } + + // And here is the point where we hijack the VSCode <-> TS communications + // by adding ourselves in the middle. We locate everything that looks + // like an absolute path of ours and normalize it. const Session = tsserver.server.Session; const {onMessage: originalOnMessage, send: originalSend} = Session.prototype; @@ -26,44 +80,24 @@ const moduleWrapper = tsserver => { if ( parsedMessage != null && - typeof parsedMessage === 'object' && + typeof parsedMessage === `object` && parsedMessage.arguments && - parsedMessage.arguments.hostInfo === 'vscode' + parsedMessage.arguments.hostInfo === `vscode` ) { isVSCode = true; } return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { - return typeof value === 'string' ? removeZipPrefix(value) : value; + return typeof value === `string` ? fromEditorPath(value) : value; })); }, send(/** @type {any} */ msg) { return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => { - return typeof value === 'string' ? addZipPrefix(value) : value; + return typeof value === `string` ? toEditorPath(value) : value; }))); } }); - - function addZipPrefix(str) { - // We add the `zip:` prefix to both `.zip/` paths and virtual paths - if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || str.match(/\$\$virtual\//))) { - // Absolute VSCode `Uri.fsPath`s need to start with a slash. - // VSCode only adds it automatically for supported schemes, - // so we have to do it manually for the `zip` scheme. - // The path needs to start with a caret otherwise VSCode doesn't handle the protocol - // https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 - return `${isVSCode ? '^' : ''}zip:${str.replace(/^\/?/, `/`)}`; - } else { - return str; - } - } - - function removeZipPrefix(str) { - return process.platform === 'win32' - ? str.replace(/^\^?zip:\//, ``) - : str.replace(/^\^?zip:/, ``); - } }; if (existsSync(absPnpApiPath)) { diff --git a/.yarn/sdks/typescript/lib/typescript.js b/.yarn/sdks/typescript/lib/typescript.js index 3ee6808..7e3c852 100644 --- a/.yarn/sdks/typescript/lib/typescript.js +++ b/.yarn/sdks/typescript/lib/typescript.js @@ -2,7 +2,7 @@ const {existsSync} = require(`fs`); const {createRequire, createRequireFromPath} = require(`module`); -const {resolve, dirname} = require(`path`); +const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.js"; diff --git a/.yarn/sdks/typescript/package.json b/.yarn/sdks/typescript/package.json index 61b7cb5..f7a1686 100644 --- a/.yarn/sdks/typescript/package.json +++ b/.yarn/sdks/typescript/package.json @@ -1,6 +1,6 @@ { "name": "typescript", - "version": "4.1.2-pnpify", + "version": "4.1.5-pnpify", "main": "./lib/typescript.js", "type": "commonjs" }