diff --git a/.github/workflows/e2e-typescript-workflow.yml b/.github/workflows/e2e-typescript-workflow.yml index 5a92b313a991..36764f370373 100644 --- a/.github/workflows/e2e-typescript-workflow.yml +++ b/.github/workflows/e2e-typescript-workflow.yml @@ -7,6 +7,7 @@ on: pull_request: paths: - .github/workflows/e2e-typescript-workflow.yml + - packages/plugin-compat/sources/patches/typescript.patch.ts - scripts/e2e-setup-ci.sh name: 'E2E TypeScript' @@ -27,6 +28,17 @@ jobs: run: | node ./scripts/run-yarn.js build:cli + - name: 'Installing all versions of TS' + run: | + source scripts/e2e-setup-ci.sh + + yarn init -p + yarn add \ + v35@npm:typescript@3.5 \ + v36@npm:typescript@3.6 \ + v37@npm:typescript@3.7 \ + v38@npm:typescript@3.8 + - name: 'Running the integration test' run: | source scripts/e2e-setup-ci.sh diff --git a/.pnp.js b/.pnp.js index 58827cecee36..1cfede0942d8 100755 --- a/.pnp.js +++ b/.pnp.js @@ -265,7 +265,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["jest-environment-node", "npm:24.5.0"], ["jest-junit", "npm:5.2.0"], ["micromatch", "npm:4.0.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "linkType": "SOFT", }] @@ -5003,7 +5003,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-typescript-npm-2.0.0-4639092a54-2.zip/node_modules/@types/typescript/", "packageDependencies": [ ["@types/typescript", "npm:2.0.0"], - ["typescript", "patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=270b6c"] ], "linkType": "HARD", }] @@ -5133,7 +5133,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["regexpp", "npm:2.0.1"], ["requireindex", "npm:1.2.0"], ["tsutils", "virtual:45cefb3a778deece82fc842b2b72f0afc757b6c0484407b9caa29c093b750350155ac2abd0f56e4ac93885a167aa5c99574da658766a7bf001a0aae00168eb82#npm:3.10.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "eslint", @@ -5167,7 +5167,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["eslint", "npm:5.16.0"], ["eslint-scope", "npm:4.0.0"], ["eslint-visitor-keys", "npm:1.0.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "eslint", @@ -5184,7 +5184,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/typescript-estree", "virtual:be22e969588e5b9bb01154245a30a1bfa2fad15f08a9f0d7874afa09a4651ae4fe9cd0600afa10932b5dfe007f9b520145319057e59f92e2d7a8fb54b87c1da9#npm:2.13.0"], ["eslint", "npm:5.16.0"], ["eslint-visitor-keys", "npm:1.1.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "eslint", @@ -5200,7 +5200,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/typescript-estree", "virtual:45cefb3a778deece82fc842b2b72f0afc757b6c0484407b9caa29c093b750350155ac2abd0f56e4ac93885a167aa5c99574da658766a7bf001a0aae00168eb82#npm:1.7.0"], ["lodash.unescape", "npm:4.0.1"], ["semver", "npm:5.5.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "typescript" @@ -5236,7 +5236,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["lodash.unescape", "npm:4.0.1"], ["semver", "npm:6.3.0"], ["tsutils", "virtual:faf413bcdf63d4ba216a03af4562f5428e636501de9fdbe6a8290b289fd010181647b2e3f557d4967e3d32c0e2e93d138ad4315d4b6048c665fd19f5d4a4f89d#npm:3.17.1"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "typescript" @@ -5669,7 +5669,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["semver", "npm:7.1.2"], ["terser-webpack-plugin", "virtual:e04a2594c769771b96db34e7a92a8a3af1c98ae86dce662589a5c5d5209e16875506f8cb5f4c2230a2b2ae06335b14466352c4ed470d39edf9edb6c515984525#npm:2.1.3"], ["ts-loader", "virtual:e04a2594c769771b96db34e7a92a8a3af1c98ae86dce662589a5c5d5209e16875506f8cb5f4c2230a2b2ae06335b14466352c4ed470d39edf9edb6c515984525#npm:6.2.1"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["val-loader", "virtual:e04a2594c769771b96db34e7a92a8a3af1c98ae86dce662589a5c5d5209e16875506f8cb5f4c2230a2b2ae06335b14466352c4ed470d39edf9edb6c515984525#npm:1.1.1"], ["webpack", "npm:4.41.2"], ["webpack-merge", "npm:4.2.1"], @@ -5752,7 +5752,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["micromatch", "npm:4.0.2"], ["promise.prototype.finally", "npm:3.1.1"], ["semver", "npm:7.1.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["yup", "npm:0.27.0"] ], "packagePeers": [ @@ -5794,7 +5794,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["micromatch", "npm:4.0.2"], ["promise.prototype.finally", "npm:3.1.1"], ["semver", "npm:7.1.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["yup", "npm:0.27.0"] ], "packagePeers": [ @@ -5863,7 +5863,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["globby", "npm:10.0.1"], ["micromatch", "npm:4.0.2"], ["p-limit", "npm:2.2.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "linkType": "SOFT", }] @@ -6043,7 +6043,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["jest-environment-node", "npm:24.5.0"], ["jest-junit", "npm:5.2.0"], ["micromatch", "npm:4.0.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "linkType": "SOFT", }] @@ -6116,7 +6116,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["lodash", "npm:4.17.15"], ["node-emoji", "npm:1.8.1"], ["tau-prolog", "npm:0.2.66"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6139,7 +6139,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["lodash", "npm:4.17.15"], ["node-emoji", "npm:1.8.1"], ["tau-prolog", "npm:0.2.66"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6162,7 +6162,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["lodash", "npm:4.17.15"], ["node-emoji", "npm:1.8.1"], ["tau-prolog", "npm:0.2.66"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6303,7 +6303,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/builder", "virtual:16110bda3ce959c103b1979c5d750ceb8ac9cfbd2049c118b6278e46e65aa65fd17e71e04a0ce5f75b7ca3203efd8e9c9b03c948a76c7f4bca807539915b5cfc#workspace:packages/yarnpkg-builder"], ["@yarnpkg/core", "workspace:packages/yarnpkg-core"], ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/core" @@ -6490,7 +6490,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ink", "virtual:58c6a160e6d00ccf90867e4b527877bcde337a320c79277ab938543a3cd2ca12d5ecbaf449b71356276a2c24db742e5ae759512bae3689b4ef8ec896c616a6e2#npm:2.3.0"], ["react", "npm:16.8.4"], ["semver", "npm:7.1.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6909,7 +6909,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/core", "workspace:packages/yarnpkg-core"], ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"], ["clipanion", "npm:2.1.5"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6926,7 +6926,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/core", "workspace:packages/yarnpkg-core"], ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"], ["clipanion", "npm:2.1.5"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6943,7 +6943,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/core", "workspace:packages/yarnpkg-core"], ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"], ["clipanion", "npm:2.1.5"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6964,7 +6964,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/plugin-essentials", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-essentials"], ["@yarnpkg/plugin-pack", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-pack"], ["algoliasearch", "npm:4.0.1"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "@yarnpkg/cli", @@ -6993,7 +6993,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ink", "virtual:58c6a160e6d00ccf90867e4b527877bcde337a320c79277ab938543a3cd2ca12d5ecbaf449b71356276a2c24db742e5ae759512bae3689b4ef8ec896c616a6e2#npm:2.3.0"], ["react", "npm:16.8.4"], ["semver", "npm:7.1.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["yup", "npm:0.27.0"] ], "packagePeers": [ @@ -7021,7 +7021,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ink", "virtual:58c6a160e6d00ccf90867e4b527877bcde337a320c79277ab938543a3cd2ca12d5ecbaf449b71356276a2c24db742e5ae759512bae3689b4ef8ec896c616a6e2#npm:2.3.0"], ["react", "npm:16.8.4"], ["semver", "npm:7.1.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["yup", "npm:0.27.0"] ], "packagePeers": [ @@ -7049,7 +7049,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ink", "virtual:58c6a160e6d00ccf90867e4b527877bcde337a320c79277ab938543a3cd2ca12d5ecbaf449b71356276a2c24db742e5ae759512bae3689b4ef8ec896c616a6e2#npm:2.3.0"], ["react", "npm:16.8.4"], ["semver", "npm:7.1.2"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["yup", "npm:0.27.0"] ], "packagePeers": [ @@ -7072,7 +7072,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"], ["clipanion", "npm:2.1.5"], ["p-limit", "npm:2.2.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["yup", "npm:0.27.0"] ], "packagePeers": [ @@ -7092,7 +7092,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"], ["@yarnpkg/libzip", "workspace:packages/yarnpkg-libzip"], ["@yarnpkg/pnpify", "virtual:16110bda3ce959c103b1979c5d750ceb8ac9cfbd2049c118b6278e46e65aa65fd17e71e04a0ce5f75b7ca3203efd8e9c9b03c948a76c7f4bca807539915b5cfc#workspace:packages/yarnpkg-pnpify"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["webpack", "npm:4.41.2"], ["webpack-cli", "virtual:16110bda3ce959c103b1979c5d750ceb8ac9cfbd2049c118b6278e46e65aa65fd17e71e04a0ce5f75b7ca3203efd8e9c9b03c948a76c7f4bca807539915b5cfc#npm:3.3.2"], ["webpack-sources", "npm:1.3.0"] @@ -7115,7 +7115,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["comment-json", "npm:2.2.0"], ["cross-spawn", "npm:6.0.5"], ["eslint", "npm:5.16.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "typescript" @@ -7136,7 +7136,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["comment-json", "npm:2.2.0"], ["cross-spawn", "npm:6.0.5"], ["eslint", "npm:5.16.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "eslint", @@ -27651,7 +27651,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["loader-utils", "npm:1.2.3"], ["micromatch", "npm:4.0.2"], ["semver", "npm:6.3.0"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "typescript" @@ -27698,7 +27698,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["tsutils", "virtual:45cefb3a778deece82fc842b2b72f0afc757b6c0484407b9caa29c093b750350155ac2abd0f56e4ac93885a167aa5c99574da658766a7bf001a0aae00168eb82#npm:3.10.0"], ["tslib", "npm:1.9.3"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "typescript" @@ -27722,7 +27722,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["tsutils", "virtual:faf413bcdf63d4ba216a03af4562f5428e636501de9fdbe6a8290b289fd010181647b2e3f557d4967e3d32c0e2e93d138ad4315d4b6048c665fd19f5d4a4f89d#npm:3.17.1"], ["tslib", "npm:1.9.3"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "packagePeers": [ "typescript" @@ -27841,17 +27841,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }] ]], ["typescript", [ - ["patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=3ac2d9", { - "packageLocation": "./.yarn/cache/typescript-patch-01fec384bc-2.zip/node_modules/typescript/", + ["patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=270b6c", { + "packageLocation": "./.yarn/cache/typescript-patch-60167ea2ba-2.zip/node_modules/typescript/", "packageDependencies": [ - ["typescript", "patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=270b6c"] ], "linkType": "HARD", }], - ["patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9", { - "packageLocation": "./.yarn/cache/typescript-patch-73a69b37a1-2.zip/node_modules/typescript/", + ["patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c", { + "packageLocation": "./.yarn/cache/typescript-patch-59b570bfcd-2.zip/node_modules/typescript/", "packageDependencies": [ - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"] + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"] ], "linkType": "HARD", }] @@ -28790,7 +28790,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/pnpify", "virtual:16110bda3ce959c103b1979c5d750ceb8ac9cfbd2049c118b6278e46e65aa65fd17e71e04a0ce5f75b7ca3203efd8e9c9b03c948a76c7f4bca807539915b5cfc#workspace:packages/yarnpkg-pnpify"], ["pnp-webpack-plugin", "npm:1.4.3"], ["ts-loader", "virtual:e04a2594c769771b96db34e7a92a8a3af1c98ae86dce662589a5c5d5209e16875506f8cb5f4c2230a2b2ae06335b14466352c4ed470d39edf9edb6c515984525#npm:6.2.1"], - ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9"], + ["typescript", "patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c"], ["vsce", "npm:1.61.0"], ["webpack", "npm:4.41.2"], ["webpack-cli", "virtual:16110bda3ce959c103b1979c5d750ceb8ac9cfbd2049c118b6278e46e65aa65fd17e71e04a0ce5f75b7ca3203efd8e9c9b03c948a76c7f4bca807539915b5cfc#npm:3.3.2"] diff --git a/.yarn/cache/typescript-patch-73a69b37a1-2.zip b/.yarn/cache/typescript-patch-59b570bfcd-2.zip similarity index 100% rename from .yarn/cache/typescript-patch-73a69b37a1-2.zip rename to .yarn/cache/typescript-patch-59b570bfcd-2.zip diff --git a/.yarn/cache/typescript-patch-01fec384bc-2.zip b/.yarn/cache/typescript-patch-60167ea2ba-2.zip similarity index 100% rename from .yarn/cache/typescript-patch-01fec384bc-2.zip rename to .yarn/cache/typescript-patch-60167ea2ba-2.zip diff --git a/.yarn/versions/e34a429d.yml b/.yarn/versions/e34a429d.yml new file mode 100644 index 000000000000..6b05d4177493 --- /dev/null +++ b/.yarn/versions/e34a429d.yml @@ -0,0 +1,21 @@ +releases: + "@yarnpkg/cli": prerelease + "@yarnpkg/plugin-compat": prerelease + +declined: + - "@yarnpkg/plugin-constraints" + - "@yarnpkg/plugin-dlx" + - "@yarnpkg/plugin-essentials" + - "@yarnpkg/plugin-init" + - "@yarnpkg/plugin-interactive-tools" + - "@yarnpkg/plugin-node-modules" + - "@yarnpkg/plugin-npm-cli" + - "@yarnpkg/plugin-pack" + - "@yarnpkg/plugin-patch" + - "@yarnpkg/plugin-pnp" + - "@yarnpkg/plugin-stage" + - "@yarnpkg/plugin-typescript" + - "@yarnpkg/plugin-version" + - "@yarnpkg/plugin-workspace-tools" + - "@yarnpkg/core" + - "@yarnpkg/doctor" diff --git a/packages/plugin-compat/README.md b/packages/plugin-compat/README.md index d752aaa467f2..88c4b9e379e1 100644 --- a/packages/plugin-compat/README.md +++ b/packages/plugin-compat/README.md @@ -8,5 +8,6 @@ This plugin is included by default in Yarn. ## Compatibility Features -- [`typescript`](https://yarnpkg.com/package?typescript): Auto-merge of [#35206](https://github.com/microsoft/TypeScript/pull/35206) -- [`resolve`](https://yarnpkg.com/package/?resolve): Implements [`normalize-options.js`](https://github.com/browserify/resolve/pull/174) +- Various [extensions](/configuration/yarnrc#packageExtensions) are enabled by default (full list [here](https://github.com/yarnpkg/berry/blob/master/packages/plugin-compat/sources/extensions.ts)) +- [`typescript`](/package/typescript): Auto-merge of [#35206](https://github.com/microsoft/TypeScript/pull/35206) +- [`resolve`](/package/resolve): Implements [`normalize-options.js`](https://github.com/browserify/resolve/pull/174) diff --git a/packages/plugin-compat/extra/typescript/gen-typescript-patch.sh b/packages/plugin-compat/extra/typescript/gen-typescript-patch.sh index c27d5f3d15cc..77daf519e5fa 100644 --- a/packages/plugin-compat/extra/typescript/gen-typescript-patch.sh +++ b/packages/plugin-compat/extra/typescript/gen-typescript-patch.sh @@ -3,6 +3,11 @@ set -ex THIS_DIR=$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd) TEMP_DIR="$(mktemp -d)" +HASHES=( + "426f5a7" ">=3 <3.6" + "bcb6dbf" ">3.6" +) + git clone git@github.com:arcanis/typescript "$TEMP_DIR"/clone mkdir -p "$TEMP_DIR"/orig @@ -11,36 +16,44 @@ mkdir -p "$TEMP_DIR"/patched reset-git() { git checkout . git clean -df + + yarn } cd "$TEMP_DIR"/clone -yarn - reset-git git checkout master yarn gulp local LKG cp -r lib "$TEMP_DIR"/orig/ -reset-git -git checkout mael/pnp +while [[ ${#HASHES[@]} -gt 0 ]]; do + HASH="${HASHES[0]}" + RANGE="${HASHES[1]}" + HASHES=("${HASHES[@]:2}") -yarn gulp local LKG -cp -r lib/ "$TEMP_DIR"/patched/ + reset-git + git checkout "$HASH" + + yarn gulp local LKG + cp -r lib/ "$TEMP_DIR"/patched/ -PATCHFILE="$THIS_DIR"/../../sources/patches/typescript.patch.ts -rm -f "$PATCHFILE" && touch "$PATCHFILE" + PATCHFILE="$THIS_DIR"/../../sources/patches/typescript.patch.ts + rm -f "$PATCHFILE" && touch "$PATCHFILE" + + git diff --no-index "$TEMP_DIR"/orig "$TEMP_DIR"/patched \ + | perl -p -e"s#^--- #semver exclusivity $RANGE\n--- #" \ + | perl -p -e"s#$TEMP_DIR/orig##" \ + | perl -p -e"s#$TEMP_DIR/patched##" \ + | perl -p -e"s#__spreadArrays#[].concat#" \ + >> "$TEMP_DIR"/patch.tmp || true +done echo 'export const patch =' \ >> "$PATCHFILE" -git diff --no-index "$TEMP_DIR"/orig "$TEMP_DIR"/patched \ - | perl -p -e"s#^--- #semver exclusivity >=3\n--- #" \ - | perl -p -e"s#$TEMP_DIR/orig##" \ - | perl -p -e"s#$TEMP_DIR/patched##" \ - | perl -p -e"s#__spreadArrays#[].concat#" \ - > "$TEMP_DIR"/patch.tmp || true node "$THIS_DIR"/../jsonEscape.js < "$TEMP_DIR"/patch.tmp \ >> "$PATCHFILE" echo ';' \ >> "$PATCHFILE" + diff --git a/packages/plugin-compat/sources/patches/typescript.patch.ts b/packages/plugin-compat/sources/patches/typescript.patch.ts index 320d604d46f4..ef509435322b 100644 --- a/packages/plugin-compat/sources/patches/typescript.patch.ts +++ b/packages/plugin-compat/sources/patches/typescript.patch.ts @@ -1,3 +1,3 @@ export const patch = -"diff --git a/lib/tsc.js b/lib/tsc.js\nindex d7f749f633..543543807b 100644\nsemver exclusivity >=3\n--- a/lib/tsc.js\n+++ b/lib/tsc.js\n@@ -22576,21 +22576,48 @@ var ts;\n }\n }\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference) {\n var traceEnabled = isTraceEnabled(options, host);\n if (redirectedReference) {\n@@ -22670,7 +22697,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -23043,9 +23072,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -23487,6 +23519,45 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ function isPnpAvailable() {\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), false, state, true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), false, state, true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n var ts;\n (function (ts) {\n@@ -81887,6 +81958,9 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -81917,7 +81991,7 @@ var ts;\n var moduleSpecifier = packageNameOnly ? moduleFileName : getDirectoryOrExtensionlessFileName(moduleFileName);\n var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation();\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1);\ndiff --git a/lib/tsserver.js b/lib/tsserver.js\nindex 4ea67ecd85..83510127ae 100644\nsemver exclusivity >=3\n--- a/lib/tsserver.js\n+++ b/lib/tsserver.js\n@@ -27790,24 +27790,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -27894,7 +27922,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28378,9 +28408,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -28876,6 +28909,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99548,6 +99632,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99582,7 +99670,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -123974,11 +124064,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -123986,6 +124093,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js\nindex 2897a22620..4738788997 100644\nsemver exclusivity >=3\n--- a/lib/tsserverlibrary.js\n+++ b/lib/tsserverlibrary.js\n@@ -27940,24 +27940,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28044,7 +28072,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28528,9 +28558,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29026,6 +29059,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99698,6 +99782,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99732,7 +99820,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -124487,11 +124577,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -124499,6 +124606,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/typescript.js b/lib/typescript.js\nindex 548ceea966..1e5b232e75 100644\nsemver exclusivity >=3\n--- a/lib/typescript.js\n+++ b/lib/typescript.js\n@@ -27929,24 +27929,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28033,7 +28061,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28517,9 +28547,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29015,6 +29048,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99687,6 +99771,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99721,7 +99809,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -124476,11 +124566,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -124488,6 +124595,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/typescriptServices.js b/lib/typescriptServices.js\nindex 9046c6f907..f3a9af2320 100644\nsemver exclusivity >=3\n--- a/lib/typescriptServices.js\n+++ b/lib/typescriptServices.js\n@@ -27929,24 +27929,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28033,7 +28061,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28517,9 +28547,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29015,6 +29048,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99687,6 +99771,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99721,7 +99809,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -124476,11 +124566,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -124488,6 +124595,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js\nindex 776a2e0a9b..a96c74bf24 100644\nsemver exclusivity >=3\n--- a/lib/typingsInstaller.js\n+++ b/lib/typingsInstaller.js\n@@ -27779,24 +27779,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -27883,7 +27911,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28367,9 +28397,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -28865,6 +28898,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99537,6 +99621,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99571,7 +99659,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n" +"diff --git a/lib/tsc.js b/lib/tsc.js\nindex d7f749f633..c4a080b2c8 100644\nsemver exclusivity >=3 <3.6\n--- a/lib/tsc.js\n+++ b/lib/tsc.js\n@@ -22576,21 +22576,48 @@ var ts;\n }\n }\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference) {\n var traceEnabled = isTraceEnabled(options, host);\n if (redirectedReference) {\n@@ -22670,7 +22697,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -23043,9 +23072,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -23487,6 +23519,45 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ function isPnpAvailable() {\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), false, state, true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), false, state, true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n var ts;\n (function (ts) {\ndiff --git a/lib/tsserver.js b/lib/tsserver.js\nindex 4ea67ecd85..057ea079ad 100644\nsemver exclusivity >=3 <3.6\n--- a/lib/tsserver.js\n+++ b/lib/tsserver.js\n@@ -27790,24 +27790,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -27894,7 +27922,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28378,9 +28408,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -28876,6 +28909,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\ndiff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js\nindex 2897a22620..cf3e054327 100644\nsemver exclusivity >=3 <3.6\n--- a/lib/tsserverlibrary.js\n+++ b/lib/tsserverlibrary.js\n@@ -27940,24 +27940,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28044,7 +28072,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28528,9 +28558,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29026,6 +29059,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\ndiff --git a/lib/typescript.js b/lib/typescript.js\nindex 548ceea966..92c195a616 100644\nsemver exclusivity >=3 <3.6\n--- a/lib/typescript.js\n+++ b/lib/typescript.js\n@@ -27929,24 +27929,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28033,7 +28061,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28517,9 +28547,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29015,6 +29048,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\ndiff --git a/lib/typescriptServices.js b/lib/typescriptServices.js\nindex 9046c6f907..0f0db98cbb 100644\nsemver exclusivity >=3 <3.6\n--- a/lib/typescriptServices.js\n+++ b/lib/typescriptServices.js\n@@ -27929,24 +27929,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28033,7 +28061,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28517,9 +28547,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29015,6 +29048,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\ndiff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js\nindex 776a2e0a9b..cfa1e84496 100644\nsemver exclusivity >=3 <3.6\n--- a/lib/typingsInstaller.js\n+++ b/lib/typingsInstaller.js\n@@ -27779,24 +27779,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -27883,7 +27911,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28367,9 +28397,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -28865,6 +28898,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\ndiff --git a/lib/tsc.js b/lib/tsc.js\nindex d7f749f633..543543807b 100644\nsemver exclusivity >3.6\n--- a/lib/tsc.js\n+++ b/lib/tsc.js\n@@ -22576,21 +22576,48 @@ var ts;\n }\n }\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference) {\n var traceEnabled = isTraceEnabled(options, host);\n if (redirectedReference) {\n@@ -22670,7 +22697,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -23043,9 +23072,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -23487,6 +23519,45 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ function isPnpAvailable() {\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), false, state, true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), false, state, true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n var ts;\n (function (ts) {\n@@ -81887,6 +81958,9 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -81917,7 +81991,7 @@ var ts;\n var moduleSpecifier = packageNameOnly ? moduleFileName : getDirectoryOrExtensionlessFileName(moduleFileName);\n var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation();\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1);\ndiff --git a/lib/tsserver.js b/lib/tsserver.js\nindex 4ea67ecd85..83510127ae 100644\nsemver exclusivity >3.6\n--- a/lib/tsserver.js\n+++ b/lib/tsserver.js\n@@ -27790,24 +27790,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -27894,7 +27922,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28378,9 +28408,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -28876,6 +28909,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99548,6 +99632,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99582,7 +99670,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -123974,11 +124064,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -123986,6 +124093,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js\nindex 2897a22620..4738788997 100644\nsemver exclusivity >3.6\n--- a/lib/tsserverlibrary.js\n+++ b/lib/tsserverlibrary.js\n@@ -27940,24 +27940,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28044,7 +28072,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28528,9 +28558,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29026,6 +29059,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99698,6 +99782,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99732,7 +99820,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -124487,11 +124577,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -124499,6 +124606,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/typescript.js b/lib/typescript.js\nindex 548ceea966..1e5b232e75 100644\nsemver exclusivity >3.6\n--- a/lib/typescript.js\n+++ b/lib/typescript.js\n@@ -27929,24 +27929,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28033,7 +28061,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28517,9 +28547,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29015,6 +29048,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99687,6 +99771,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99721,7 +99809,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -124476,11 +124566,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -124488,6 +124595,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/typescriptServices.js b/lib/typescriptServices.js\nindex 9046c6f907..f3a9af2320 100644\nsemver exclusivity >3.6\n--- a/lib/typescriptServices.js\n+++ b/lib/typescriptServices.js\n@@ -27929,24 +27929,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -28033,7 +28061,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28517,9 +28547,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -29015,6 +29048,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99687,6 +99771,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99721,7 +99809,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n@@ -124476,11 +124566,28 @@ var ts;\n }\n }\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ // @ts-ignore\n+ return require(\"pnpapi\");\n+ }\n /**\n * Don't include something from a `node_modules` that isn't actually reachable by a global import.\n * A relative import to node_modules is usually a bad idea.\n */\n- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n // If it's in a `node_modules` but is not reachable from here via a global import, don't bother.\n var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === \"node_modules\" ? ancestor : undefined; });\n var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules));\n@@ -124488,6 +124595,26 @@ var ts;\n || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent)\n || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent));\n }\n+ function isImportablePathPnp(fromPath, toPath) {\n+ var pnpApi = getPnpApi();\n+ var fromLocator = pnpApi.findPackageLocator(fromPath);\n+ var toLocator = pnpApi.findPackageLocator(toPath);\n+ // eslint-disable-next-line no-null/no-null\n+ if (toLocator === null) {\n+ return false;\n+ }\n+ var fromInfo = pnpApi.getPackageInformation(fromLocator);\n+ var toReference = fromInfo.packageDependencies.get(toLocator.name);\n+ return toReference === toLocator.reference;\n+ }\n+ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {\n+ if (isPnpAvailable()) {\n+ return isImportablePathPnp(fromPath, toPath);\n+ }\n+ else {\n+ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath);\n+ }\n+ }\n function moduleSymbolToValidIdentifier(moduleSymbol, target) {\n return moduleSpecifierToValidIdentifier(ts.removeFileExtension(ts.stripQuotes(moduleSymbol.name)), target);\n }\ndiff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js\nindex 776a2e0a9b..a96c74bf24 100644\nsemver exclusivity >3.6\n--- a/lib/typingsInstaller.js\n+++ b/lib/typingsInstaller.js\n@@ -27779,24 +27779,52 @@ var ts;\n ts.getEffectiveTypeRoots = getEffectiveTypeRoots;\n /**\n * Returns the path to every node_modules/@types directory from some ancestor directory.\n- * Returns undefined if there are none.\n */\n- function getDefaultTypeRoots(currentDirectory, host) {\n+ function getNodeModulesTypeRoots(currentDirectory, host) {\n if (!host.directoryExists) {\n return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)];\n // And if it doesn't exist, tough.\n }\n- var typeRoots;\n+ var typeRoots = [];\n ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) {\n var atTypes = ts.combinePaths(directory, nodeModulesAtTypes);\n if (host.directoryExists(atTypes)) {\n- (typeRoots || (typeRoots = [])).push(atTypes);\n+ typeRoots.push(atTypes);\n }\n return undefined;\n });\n return typeRoots;\n }\n var nodeModulesAtTypes = ts.combinePaths(\"node_modules\", \"@types\");\n+ function getPnpTypeRoots(currentDirectory) {\n+ if (!isPnpAvailable()) {\n+ return [];\n+ }\n+ // Some TS consumers pass relative paths that aren't normalized\n+ currentDirectory = ts.sys.resolvePath(currentDirectory);\n+ var pnpapi = getPnpApi();\n+ var locator = pnpapi.findPackageLocator(currentDirectory + \"/\");\n+ var packageDependencies = pnpapi.getPackageInformation(locator).packageDependencies;\n+ var typeRoots = [];\n+ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) {\n+ var _b = _a[_i], name = _b[0], referencish = _b[1];\n+ // eslint-disable-next-line no-null/no-null\n+ if (name.startsWith(typesPackagePrefix) && referencish !== null) {\n+ var dependencyLocator = pnpapi.getLocator(name, referencish);\n+ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation;\n+ typeRoots.push(ts.getDirectoryPath(packageLocation));\n+ }\n+ }\n+ return typeRoots;\n+ }\n+ var typesPackagePrefix = \"@types/\";\n+ function getDefaultTypeRoots(currentDirectory, host) {\n+ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host);\n+ var pnpTypes = getPnpTypeRoots(currentDirectory);\n+ if (nmTypes.length > 0 || pnpTypes.length > 0) {\n+ return [].concat(nmTypes, pnpTypes);\n+ }\n+ }\n /**\n * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.\n * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups\n@@ -27883,7 +27911,9 @@ var ts;\n }\n var result = void 0;\n if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) {\n- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n+ var searchResult = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState)\n+ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined);\n result = searchResult && searchResult.value;\n }\n else {\n@@ -28367,9 +28397,12 @@ var ts;\n if (traceEnabled) {\n trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]);\n }\n- var resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n- if (!resolved_1)\n+ var resolved_1 = isPnpAvailable()\n+ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state)\n+ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);\n+ if (!resolved_1) {\n return undefined;\n+ }\n var resolvedValue = resolved_1.value;\n if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {\n var path = realPath(resolvedValue.path, host, traceEnabled);\n@@ -28865,6 +28898,57 @@ var ts;\n function toSearchResult(value) {\n return value !== undefined ? { value: value } : undefined;\n }\n+ /**\n+ * We only allow PnP to be used as a resolution strategy if TypeScript\n+ * itself is executed under a PnP runtime (and we only allow it to access\n+ * the current PnP runtime, not any on the disk). This ensures that we\n+ * don't execute potentially malicious code that didn't already have a\n+ * chance to be executed (if we're running within the runtime, it means\n+ * that the runtime has already been executed).\n+ * @internal\n+ */\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n+ function getPnpApi() {\n+ return require(\"pnpapi\");\n+ }\n+ function loadPnpPackageResolution(packageName, containingDirectory) {\n+ try {\n+ return getPnpApi().resolveToUnqualified(packageName, containingDirectory + \"/\", { considerBuiltins: false });\n+ }\n+ catch (_a) {\n+ // Nothing to do\n+ }\n+ }\n+ function loadPnpTypePackageResolution(packageName, containingDirectory) {\n+ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory);\n+ }\n+ /* @internal */\n+ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state) {\n+ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;\n+ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory);\n+ var packageFullResolution = packageResolution\n+ ? nodeLoadModuleByRelativeName(extensions, ts.combinePaths(packageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ var resolved;\n+ if (packageFullResolution) {\n+ resolved = packageFullResolution;\n+ }\n+ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {\n+ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory);\n+ var typePackageFullResolution = typePackageResolution\n+ ? nodeLoadModuleByRelativeName(Extensions.DtsOnly, ts.combinePaths(typePackageResolution, rest), /*onlyRecordFailures*/ false, state, /*considerPackageJson*/ true)\n+ : undefined;\n+ if (typePackageFullResolution) {\n+ resolved = typePackageFullResolution;\n+ }\n+ }\n+ if (resolved) {\n+ return toSearchResult(resolved);\n+ }\n+ }\n })(ts || (ts = {}));\n /* @internal */\n var ts;\n@@ -99537,6 +99621,10 @@ var ts;\n ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions)\n : ts.removeFileExtension(relativePath);\n }\n+ function isPnpAvailable() {\n+ // @ts-ignore\n+ return process.versions.pnp;\n+ }\n function tryGetModuleNameAsNodeModule(moduleFileName, _a, host, options, packageNameOnly) {\n var getCanonicalFileName = _a.getCanonicalFileName, sourceDirectory = _a.sourceDirectory;\n if (!host.fileExists || !host.readFile) {\n@@ -99571,7 +99659,9 @@ var ts;\n // Get a path that's relative to node_modules or the importing file's path\n // if node_modules folder is in this folder or any of its parent folders, no need to keep it.\n var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));\n- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n+ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they\n+ // are located in a weird path apparently outside of the source directory\n+ if (!isPnpAvailable() && !(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {\n return undefined;\n }\n // If the module was found in @types, get the actual Node package name\n" ; diff --git a/yarn.lock b/yarn.lock index 99f3611e3fcd..09d3bc24cbf0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24510,7 +24510,7 @@ typescript@^3.7.5: "typescript@patch:typescript@*#builtin": version: 3.7.4 - resolution: "typescript@patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=3ac2d9" + resolution: "typescript@patch:typescript@npm%3A3.7.4#builtin::version=3.7.4&hash=270b6c" bin: tsc: ./bin/tsc tsserver: ./bin/tsserver @@ -24520,7 +24520,7 @@ typescript@^3.7.5: "typescript@patch:typescript@^3.7.5#builtin": version: 3.7.5 - resolution: "typescript@patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=3ac2d9" + resolution: "typescript@patch:typescript@npm%3A3.7.5#builtin::version=3.7.5&hash=270b6c" bin: tsc: bin/tsc tsserver: bin/tsserver