diff --git a/.pnp.cjs b/.pnp.cjs index a471b3187989..94f3b750df24 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -274,7 +274,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.2.0"],\ ["jest", "virtual:e470d99b1e4fdf4c5db5d090ff5472cdeba0404b7ffd31cd2efab3493dd184c67bc45f60c2ef1c040e2c41afe38c6280bffc5df2fbe3aefaa2b6eacf685ab07c#npm:28.1.3"],\ ["tslib", "npm:2.4.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "linkType": "SOFT"\ }]\ @@ -9128,7 +9128,7 @@ const RAW_RUNTIME_STATE = ["regexpp", "npm:3.2.0"],\ ["semver", "npm:7.3.5"],\ ["tsutils", "virtual:5e27cd7a319c4b7c3909eb012bf293660fa275bf4eddce08571aa0562ef7b9b8f3c02315f6dad27820a35a49c368107bf917cd6e2a8d99abe84b6a230d415fc4#npm:3.21.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -9297,7 +9297,7 @@ const RAW_RUNTIME_STATE = ["@typescript-eslint/typescript-estree", "virtual:fe98bd70d13aaca1010fe6d701118ea3af3e45d43c8d6c5a099bc3b50f958b72e1ed6da100c174f4c93673179c6f276656d496d7d151b1435a7d2a99739ef29a#npm:5.3.1"],\ ["debug", "virtual:e9a07d9e500f265638a80b6a2d60a63d2c1402dd6a58d2f05af9d82e52be33df29a16291c32b33b9e23f1a0efea054868bd3312893433fe0583e4dba376fe47e#npm:4.3.4"],\ ["eslint", "npm:8.2.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -9453,7 +9453,7 @@ const RAW_RUNTIME_STATE = ["is-glob", "npm:4.0.3"],\ ["semver", "npm:7.3.5"],\ ["tsutils", "virtual:5e27cd7a319c4b7c3909eb012bf293660fa275bf4eddce08571aa0562ef7b9b8f3c02315f6dad27820a35a49c368107bf917cd6e2a8d99abe84b6a230d415fc4#npm:3.21.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@types/typescript",\ @@ -9876,7 +9876,7 @@ const RAW_RUNTIME_STATE = ]],\ ["semver", "npm:7.3.5"],\ ["tslib", "npm:2.4.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "linkType": "SOFT"\ }]\ @@ -10899,7 +10899,7 @@ const RAW_RUNTIME_STATE = ["micromatch", "npm:4.0.4"],\ ["p-limit", "npm:2.2.0"],\ ["tslib", "npm:2.4.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "linkType": "SOFT"\ }]\ @@ -10950,7 +10950,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.2.0"],\ ["eslint-plugin-arca", "npm:0.12.1"],\ ["eslint-plugin-react", "virtual:4b728ee22ccd3ae66b83e3be6d39acfb5b7a775112cc78b6b4322feb849fcfe6e39510452356cb4477dc6089bee57db31d02bbfb03b9fc8e914effa16a4145be#npm:7.25.1"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -11108,7 +11108,7 @@ const RAW_RUNTIME_STATE = ["typedoc", "virtual:118b26a6cee620b5aa3e7e8d8b8e34cd9e486f75b92701001168da9be550fadd8c9d9b12643c642e2d528c2624fd8fe7e128eec9d715340efac44400432a0e0c#npm:0.17.0-3"],\ ["typedoc-neo-theme", "npm:1.0.7"],\ ["typedoc-plugin-yarn", "portal:./typedoc-plugin-yarn::locator=%40yarnpkg%2Fgatsby%40workspace%3Apackages%2Fgatsby"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"],\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"],\ ["unescape-html", "npm:1.1.0"],\ ["unfetch", "npm:4.1.0"],\ ["unified", "npm:7.1.0"],\ @@ -11184,7 +11184,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.2.0"],\ ["jest", "virtual:e470d99b1e4fdf4c5db5d090ff5472cdeba0404b7ffd31cd2efab3493dd184c67bc45f60c2ef1c040e2c41afe38c6280bffc5df2fbe3aefaa2b6eacf685ab07c#npm:28.1.3"],\ ["tslib", "npm:2.4.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "linkType": "SOFT"\ }]\ @@ -34884,7 +34884,7 @@ const RAW_RUNTIME_STATE = ["react-dom", "virtual:118b26a6cee620b5aa3e7e8d8b8e34cd9e486f75b92701001168da9be550fadd8c9d9b12643c642e2d528c2624fd8fe7e128eec9d715340efac44400432a0e0c#npm:16.13.1"],\ ["react-lifecycles-compat", "npm:3.0.4"],\ ["shallowequal", "npm:1.1.0"],\ - ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@types/react-dom",\ @@ -43014,7 +43014,7 @@ const RAW_RUNTIME_STATE = ["tsutils", "virtual:5e27cd7a319c4b7c3909eb012bf293660fa275bf4eddce08571aa0562ef7b9b8f3c02315f6dad27820a35a49c368107bf917cd6e2a8d99abe84b6a230d415fc4#npm:3.21.0"],\ ["@types/typescript", null],\ ["tslib", "npm:1.13.0"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@types/typescript",\ @@ -43235,7 +43235,7 @@ const RAW_RUNTIME_STATE = ["typedoc-default-themes", "npm:0.8.0-0"],\ ["typedoc-neo-theme", "npm:1.0.7"],\ ["typedoc-plugin-yarn", "portal:./typedoc-plugin-yarn::locator=%40yarnpkg%2Fgatsby%40workspace%3Apackages%2Fgatsby"],\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@strictsoftware/typedoc-plugin-monorepo",\ @@ -43270,7 +43270,7 @@ const RAW_RUNTIME_STATE = ["typedoc-default-themes", "npm:0.8.0-0"],\ ["typedoc-neo-theme", null],\ ["typedoc-plugin-yarn", "portal:./typedoc-plugin-yarn::locator=%40yarnpkg%2Fgatsby%40workspace%3Apackages%2Fgatsby"],\ - ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@strictsoftware/typedoc-plugin-monorepo",\ @@ -43304,7 +43304,7 @@ const RAW_RUNTIME_STATE = ["typedoc-default-themes", "npm:0.7.2"],\ ["typedoc-neo-theme", "npm:1.0.7"],\ ["typedoc-plugin-yarn", null],\ - ["typescript", "patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=a1c5e5"]\ ],\ "packagePeers": [\ "@strictsoftware/typedoc-plugin-monorepo",\ @@ -43357,30 +43357,30 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["typedoc-plugin-yarn", "portal:./typedoc-plugin-yarn::locator=%40yarnpkg%2Fgatsby%40workspace%3Apackages%2Fgatsby"],\ ["typedoc", "virtual:258c95d7dd1da51c9c624f238593e0bc1c34b7bd8de0b85fefd9552f2220a4555cad458eb72d96f0c7b341784726b6a8e9c8b4e838a9d27aac3796b29de01981#npm:0.17.0-3"],\ - ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=a1c5e5"]\ ],\ "linkType": "SOFT"\ }]\ ]],\ ["typescript", [\ - ["patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=f456af", {\ - "packageLocation": "./.yarn/cache/typescript-patch-60a147f740-3af69ac96e.zip/node_modules/typescript/",\ + ["patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=a1c5e5", {\ + "packageLocation": "./.yarn/cache/typescript-patch-0153205ea7-3af69ac96e.zip/node_modules/typescript/",\ "packageDependencies": [\ - ["typescript", "patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=a1c5e5"]\ ],\ "linkType": "HARD"\ }],\ - ["patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=f456af", {\ - "packageLocation": "./.yarn/cache/typescript-patch-775d362968-060f1bcb5c.zip/node_modules/typescript/",\ + ["patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=a1c5e5", {\ + "packageLocation": "./.yarn/cache/typescript-patch-1b46f7398c-060f1bcb5c.zip/node_modules/typescript/",\ "packageDependencies": [\ - ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=a1c5e5"]\ ],\ "linkType": "HARD"\ }],\ - ["patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af", {\ - "packageLocation": "./.yarn/cache/typescript-patch-4f54fe3ce2-6cb92f6fea.zip/node_modules/typescript/",\ + ["patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5", {\ + "packageLocation": "./.yarn/cache/typescript-patch-2e465c99d0-65fb2b8581.zip/node_modules/typescript/",\ "packageDependencies": [\ - ["typescript", "patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af"]\ + ["typescript", "patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5"]\ ],\ "linkType": "HARD"\ }]\ diff --git a/.yarn/cache/typescript-npm-4.8.0-beta-ef612dd816-7b36695220.zip b/.yarn/cache/typescript-npm-4.8.1-rc-6ecef9ce67-1c8fdbdb63.zip similarity index 53% rename from .yarn/cache/typescript-npm-4.8.0-beta-ef612dd816-7b36695220.zip rename to .yarn/cache/typescript-npm-4.8.1-rc-6ecef9ce67-1c8fdbdb63.zip index c6321c194e1e..c164b228d1fc 100644 Binary files a/.yarn/cache/typescript-npm-4.8.0-beta-ef612dd816-7b36695220.zip and b/.yarn/cache/typescript-npm-4.8.1-rc-6ecef9ce67-1c8fdbdb63.zip differ diff --git a/.yarn/cache/typescript-patch-60a147f740-3af69ac96e.zip b/.yarn/cache/typescript-patch-0153205ea7-3af69ac96e.zip similarity index 100% rename from .yarn/cache/typescript-patch-60a147f740-3af69ac96e.zip rename to .yarn/cache/typescript-patch-0153205ea7-3af69ac96e.zip diff --git a/.yarn/cache/typescript-patch-775d362968-060f1bcb5c.zip b/.yarn/cache/typescript-patch-1b46f7398c-060f1bcb5c.zip similarity index 100% rename from .yarn/cache/typescript-patch-775d362968-060f1bcb5c.zip rename to .yarn/cache/typescript-patch-1b46f7398c-060f1bcb5c.zip diff --git a/.yarn/cache/typescript-patch-4f54fe3ce2-6cb92f6fea.zip b/.yarn/cache/typescript-patch-2e465c99d0-65fb2b8581.zip similarity index 53% rename from .yarn/cache/typescript-patch-4f54fe3ce2-6cb92f6fea.zip rename to .yarn/cache/typescript-patch-2e465c99d0-65fb2b8581.zip index c265e3cf379f..d54783ebb80f 100644 Binary files a/.yarn/cache/typescript-patch-4f54fe3ce2-6cb92f6fea.zip and b/.yarn/cache/typescript-patch-2e465c99d0-65fb2b8581.zip differ diff --git a/.yarn/sdks/typescript/package.json b/.yarn/sdks/typescript/package.json index 934c5a7ccebf..628f7afa169d 100644 --- a/.yarn/sdks/typescript/package.json +++ b/.yarn/sdks/typescript/package.json @@ -1,6 +1,6 @@ { "name": "typescript", - "version": "4.8.0-beta-sdk", + "version": "4.8.1-rc-sdk", "main": "./lib/typescript.js", "type": "commonjs" } diff --git a/.yarn/versions/c3941e8c.yml b/.yarn/versions/c3941e8c.yml new file mode 100644 index 000000000000..1494bd471424 --- /dev/null +++ b/.yarn/versions/c3941e8c.yml @@ -0,0 +1,23 @@ +releases: + "@yarnpkg/cli": patch + "@yarnpkg/plugin-compat": patch + +declined: + - "@yarnpkg/plugin-constraints" + - "@yarnpkg/plugin-dlx" + - "@yarnpkg/plugin-essentials" + - "@yarnpkg/plugin-init" + - "@yarnpkg/plugin-interactive-tools" + - "@yarnpkg/plugin-nm" + - "@yarnpkg/plugin-npm-cli" + - "@yarnpkg/plugin-pack" + - "@yarnpkg/plugin-patch" + - "@yarnpkg/plugin-pnp" + - "@yarnpkg/plugin-pnpm" + - "@yarnpkg/plugin-stage" + - "@yarnpkg/plugin-typescript" + - "@yarnpkg/plugin-version" + - "@yarnpkg/plugin-workspace-tools" + - "@yarnpkg/builder" + - "@yarnpkg/core" + - "@yarnpkg/doctor" diff --git a/CHANGELOG.md b/CHANGELOG.md index 708523b4bf57..e8f8cfdb69eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,10 @@ The following changes only affect people writing Yarn plugins: - `yarn dlx` will no longer report false-positive `UNUSED_PACKAGE_EXTENSION` warnings - When Corepack is enabled Yarn will now use the current CLI to prepare external Yarn classic projects, matching the behaviour of when Corepack is disabled. +### Compatibility + +- Updates the PnP compatibility layer for TypeScript 4.8.1-rc + ## 3.2.2 ### Compatibility diff --git a/package.json b/package.json index 115a7a3beb8d..5903a5025c4f 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "eslint": "^8.2.0", "jest": "^28.1.3", "tslib": "^2.4.0", - "typescript": "4.8.0-beta" + "typescript": "4.8.1-rc" }, "resolutions": { "ink": "patch:ink@npm%3A3.0.8#~/.yarn/patches/ink-npm-3.0.8-3a8005f59f.patch", diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json index ba5e64ec8a45..8ecc5a6f5be7 100644 --- a/packages/gatsby/package.json +++ b/packages/gatsby/package.json @@ -89,7 +89,7 @@ "typedoc": "0.17.0-3", "typedoc-neo-theme": "^1.0.7", "typedoc-plugin-yarn": "portal:./typedoc-plugin-yarn", - "typescript": "4.8.0-beta", + "typescript": "4.8.1-rc", "unescape-html": "^1.1.0", "unfetch": "^4.1.0", "unified": "^7.1.0", diff --git a/packages/plugin-compat/babel.config.js b/packages/plugin-compat/babel.config.js new file mode 100644 index 000000000000..0700e3324cc3 --- /dev/null +++ b/packages/plugin-compat/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: require.resolve(`@yarnpkg/monorepo/babel.config.js`), +}; diff --git a/packages/plugin-compat/extra/typescript/gen-typescript-patch.js b/packages/plugin-compat/extra/typescript/gen-typescript-patch.js index 2b3ef5991024..24a464f797af 100644 --- a/packages/plugin-compat/extra/typescript/gen-typescript-patch.js +++ b/packages/plugin-compat/extra/typescript/gen-typescript-patch.js @@ -104,12 +104,19 @@ const SLICES = [ onto: `6e62273fa1e7469b89b589667c2c233789c62176`, range: `>=4.7.0-beta <4.8`, }, - // https://github.com/merceyz/TypeScript/tree/merceyz/pnp-4.8 + // https://github.com/merceyz/TypeScript/tree/merceyz/pnp-4.8.0-beta { from: `3287098f4785fd652112beadf3b33a960fcd19aa`, to: `3287098f4785fd652112beadf3b33a960fcd19aa`, onto: `9a09c37878a45b06994485fdb510eb4d24587dcb`, - range: `>=4.8.0-beta`, + range: `>=4.8.0-beta <4.8.1-rc`, + }, + // https://github.com/merceyz/TypeScript/tree/merceyz/pnp-4.8 + { + from: `623a7ac5aa49250155d39e604b09b4d015468a9c`, + to: `623a7ac5aa49250155d39e604b09b4d015468a9c`, + onto: `60b5167a2a7015759d048cdd4655d1f66a8416a2`, + range: `>=4.8.1-rc`, }, ]; diff --git a/packages/plugin-compat/extra/typescript/patch-3218b6c2da5bb90036e1cbfcc058657e.diff b/packages/plugin-compat/extra/typescript/patch-3218b6c2da5bb90036e1cbfcc058657e.diff new file mode 100644 index 000000000000..e3d787afeca4 --- /dev/null +++ b/packages/plugin-compat/extra/typescript/patch-3218b6c2da5bb90036e1cbfcc058657e.diff @@ -0,0 +1,3030 @@ +diff --git a/lib/tsc.js b/lib/tsc.js +index ae1a92412..2bbbf0a94 100644 +semver exclusivity >=4.8.1-rc +--- a/lib/tsc.js ++++ b/lib/tsc.js +@@ -4650,6 +4650,9 @@ var ts; + : new Buffer(input, encoding); + } + function isFileSystemCaseSensitive() { ++ if (process.versions.pnp) { ++ return true; ++ } + if (platform === "win32" || platform === "win64") { + return false; + } +@@ -35097,15 +35100,15 @@ var ts; + } + } + ts.getEffectiveTypeRoots = getEffectiveTypeRoots; +- function getDefaultTypeRoots(currentDirectory, host) { ++ function getNodeModulesTypeRoots(currentDirectory, host) { + if (!host.directoryExists) { + return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)]; + } +- var typeRoots; ++ var typeRoots = []; + ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) { + var atTypes = ts.combinePaths(directory, nodeModulesAtTypes); + if (host.directoryExists(atTypes)) { +- (typeRoots || (typeRoots = [])).push(atTypes); ++ typeRoots.push(atTypes); + } + return undefined; + }); +@@ -35116,6 +35119,37 @@ var ts; + var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames; + return ts.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0; + } ++ function getPnpTypeRoots(currentDirectory) { ++ var pnpapi = getPnpApi(currentDirectory); ++ if (!pnpapi) { ++ return []; ++ } ++ currentDirectory = ts.sys.resolvePath(currentDirectory); ++ var currentPackage = pnpapi.findPackageLocator("".concat(currentDirectory, "/")); ++ if (!currentPackage) { ++ return []; ++ } ++ var packageDependencies = pnpapi.getPackageInformation(currentPackage).packageDependencies; ++ var typeRoots = []; ++ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) { ++ var _b = _a[_i], name = _b[0], referencish = _b[1]; ++ if (name.startsWith(typesPackagePrefix) && referencish !== null) { ++ var dependencyLocator = pnpapi.getLocator(name, referencish); ++ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation; ++ typeRoots.push(ts.getDirectoryPath(packageLocation)); ++ } ++ } ++ return typeRoots; ++ } ++ ts.getPnpTypeRoots = getPnpTypeRoots; ++ var typesPackagePrefix = "@types/"; ++ function getDefaultTypeRoots(currentDirectory, host) { ++ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host); ++ var pnpTypes = getPnpTypeRoots(currentDirectory); ++ if (nmTypes.length > 0 || pnpTypes.length > 0) { ++ return __spreadArray(__spreadArray([], nmTypes, true), pnpTypes, true); ++ } ++ } + function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference, cache, resolutionMode) { + ts.Debug.assert(typeof typeReferenceDirectiveName === "string", "Non-string value passed to `ts.resolveTypeReferenceDirective`, likely by a wrapping package working with an outdated `resolveTypeReferenceDirectives` signature. This is probably not a problem in TS itself."); + var traceEnabled = isTraceEnabled(options, host); +@@ -35241,7 +35275,9 @@ var ts; + } + var result_4; + if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) { +- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined); ++ var searchResult = getPnpApi(initialLocationForSecondaryLookup) ++ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined) ++ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, undefined, undefined); + result_4 = searchResult && searchResult.value; + } + else { +@@ -35839,7 +35875,9 @@ var ts; + if (traceEnabled) { + trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]); + } +- resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); ++ resolved_1 = getPnpApi(containingDirectory) ++ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) ++ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); + } + if (!resolved_1) + return undefined; +@@ -36679,6 +36717,14 @@ var ts; + } + function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) { + var candidate = ts.normalizePath(ts.combinePaths(nodeModulesDirectory, moduleName)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, undefined, undefined); ++ } ++ function loadModuleFromPnpResolution(extensions, packageDirectory, rest, state, cache, redirectedReference) { ++ var candidate = ts.normalizePath(ts.combinePaths(packageDirectory, rest)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, undefined, undefined, true, state, cache, redirectedReference, candidate, rest, packageDirectory); ++ } ++ function loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, rest, packageDirectory) { ++ var _a; + var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state); + if (!(state.features & NodeResolutionFeatures.Exports)) { + if (packageInfo) { +@@ -36690,7 +36736,9 @@ var ts; + return withPackageId(packageInfo, fromDirectory); + } + } +- var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageName; ++ if (rest === undefined) ++ (_a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest); + var loader = function (extensions, candidate, onlyRecordFailures, state) { + var _a; + if (packageInfo && packageInfo.packageJsonContent.exports && state.features & NodeResolutionFeatures.Exports) { +@@ -36706,7 +36754,8 @@ var ts; + return withPackageId(packageInfo, pathAndExtension); + }; + if (rest !== "") { +- var packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); ++ if (packageDirectory === undefined) ++ packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); + packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state); + if (packageInfo && packageInfo.versionPaths) { + if (state.traceEnabled) { +@@ -36870,6 +36919,47 @@ var ts; + function toSearchResult(value) { + return value !== undefined ? { value: value } : undefined; + } ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function loadPnpPackageResolution(packageName, containingDirectory) { ++ try { ++ var resolution = getPnpApi(containingDirectory).resolveToUnqualified(packageName, "".concat(containingDirectory, "/"), { considerBuiltins: false }); ++ return ts.normalizeSlashes(resolution).replace(/\/$/, ""); ++ } ++ catch (_a) { ++ } ++ } ++ function loadPnpTypePackageResolution(packageName, containingDirectory) { ++ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory); ++ } ++ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) { ++ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory); ++ var packageFullResolution = packageResolution ++ ? loadModuleFromPnpResolution(extensions, packageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ var resolved; ++ if (packageFullResolution) { ++ resolved = packageFullResolution; ++ } ++ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) { ++ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory); ++ var typePackageFullResolution = typePackageResolution ++ ? loadModuleFromPnpResolution(Extensions.DtsOnly, typePackageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ if (typePackageFullResolution) { ++ resolved = typePackageFullResolution; ++ } ++ } ++ if (resolved) { ++ return toSearchResult(resolved); ++ } ++ } + })(ts || (ts = {})); + var ts; + (function (ts) { +@@ -96524,6 +96614,7 @@ var ts; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["None"] = 0] = "None"; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Partial"] = 1] = "Partial"; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Full"] = 2] = "Full"; ++ ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Resolutions"] = 3] = "Resolutions"; + })(ConfigFileProgramReloadLevel = ts.ConfigFileProgramReloadLevel || (ts.ConfigFileProgramReloadLevel = {})); + function updateSharedExtendedConfigFileWatcher(projectPath, options, extendedConfigFilesMap, createExtendedConfigFileWatch, toPath) { + var _a; +@@ -102900,6 +102991,26 @@ var ts; + return undefined; + } + var parts = ts.getNodeModulePathParts(path); ++ var packageName; ++ if (!parts && typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ var pnpApi = findPnpApi(path); ++ var locator = pnpApi === null || pnpApi === void 0 ? void 0 : pnpApi.findPackageLocator(path); ++ if (locator !== null && locator !== undefined) { ++ var sourceLocator = pnpApi.findPackageLocator("".concat(sourceDirectory, "/")); ++ if (locator === sourceLocator) { ++ return undefined; ++ } ++ var information = pnpApi.getPackageInformation(locator); ++ packageName = locator.name; ++ parts = { ++ topLevelNodeModulesIndex: undefined, ++ topLevelPackageNameIndex: undefined, ++ packageRootIndex: information.packageLocation.length - 1, ++ fileNameIndex: path.lastIndexOf("/"), ++ }; ++ } ++ } + if (!parts) { + return undefined; + } +@@ -102936,14 +103047,18 @@ var ts; + if (isRedirect && !isPackageRootPath) { + return undefined; + } +- var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); +- var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); +- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { +- return undefined; ++ if (typeof process.versions.pnp === "undefined") { ++ var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); ++ var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); ++ if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { ++ return undefined; ++ } + } +- var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); +- var packageName = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); +- return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? undefined : packageName; ++ var nodeModulesDirectoryName = typeof packageName !== "undefined" ++ ? packageName + moduleSpecifier.substring(parts.packageRootIndex) ++ : moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); ++ var packageNameFromPath = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); ++ return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageNameFromPath === nodeModulesDirectoryName ? undefined : packageNameFromPath; + function tryDirectoryWithPackageJson(packageRootIndex) { + var _a, _b; + var packageRootPath = path.substring(0, packageRootIndex); +@@ -103772,6 +103887,10 @@ var ts; + if (configFileName) { + configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); + } ++ var pnpFileWatcher; ++ if (typeof process.versions.pnp !== "undefined") { ++ pnpFileWatcher = watchFile(require.resolve("pnpapi"), scheduleResolutionReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); ++ } + var compilerHost = ts.createCompilerHostFromProgramHost(host, function () { return compilerOptions; }, directoryStructureHost); + ts.setGetSourceFileAsHashVersioned(compilerHost, host); + var getNewSourceFile = compilerHost.getSourceFile; +@@ -103847,6 +103966,10 @@ var ts; + configFileWatcher.close(); + configFileWatcher = undefined; + } ++ if (pnpFileWatcher) { ++ pnpFileWatcher.close(); ++ pnpFileWatcher = undefined; ++ } + extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear(); + extendedConfigCache = undefined; + if (sharedExtendedConfigFileWatchers) { +@@ -103879,7 +104002,8 @@ var ts; + function getCurrentProgram() { + return builderProgram && builderProgram.getProgramOrUndefined(); + } +- function synchronizeProgram() { ++ function synchronizeProgram(forceAllFilesAsInvalidated) { ++ if (forceAllFilesAsInvalidated === void 0) { forceAllFilesAsInvalidated = false; } + writeLog("Synchronizing program"); + clearInvalidateResolutionsOfFailedLookupLocations(); + var program = getCurrentBuilderProgram(); +@@ -103889,7 +104013,7 @@ var ts; + resolutionCache.clear(); + } + } +- var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution); ++ var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || forceAllFilesAsInvalidated); + if (ts.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { + if (hasChangedConfigFileParsingErrors) { + if (reportFileChangeDetectedOnCreateProgram) { +@@ -104075,6 +104199,12 @@ var ts; + reloadLevel = ts.ConfigFileProgramReloadLevel.Full; + scheduleProgramUpdate(); + } ++ function scheduleResolutionReload() { ++ writeLog("Clearing resolutions"); ++ resolutionCache.clear(); ++ reloadLevel = ts.ConfigFileProgramReloadLevel.Resolutions; ++ scheduleProgramUpdate(); ++ } + function updateProgramWithWatchStatus() { + timerToUpdateProgram = undefined; + reportFileChangeDetectedOnCreateProgram = true; +@@ -104090,6 +104220,10 @@ var ts; + ts.perfLogger.logStartUpdateProgram("FullConfigReload"); + reloadConfigFile(); + break; ++ case ts.ConfigFileProgramReloadLevel.Resolutions: ++ ts.perfLogger.logStartUpdateProgram("SynchronizeProgramWithResolutions"); ++ synchronizeProgram(true); ++ break; + default: + ts.perfLogger.logStartUpdateProgram("SynchronizeProgram"); + synchronizeProgram(); +diff --git a/lib/tsserver.js b/lib/tsserver.js +index 21accd494..125270a71 100644 +semver exclusivity >=4.8.1-rc +--- a/lib/tsserver.js ++++ b/lib/tsserver.js +@@ -7251,6 +7251,11 @@ var ts; + : new Buffer(input, encoding); + } + function isFileSystemCaseSensitive() { ++ // The PnP runtime is always case-sensitive ++ // @ts-ignore ++ if (process.versions.pnp) { ++ return true; ++ } + // win32\win64 are case insensitive platforms + if (platform === "win32" || platform === "win64") { + return false; +@@ -42973,18 +42978,17 @@ var ts; + ts.getEffectiveTypeRoots = getEffectiveTypeRoots; + /** + * Returns the path to every node_modules/@types directory from some ancestor directory. +- * Returns undefined if there are none. + */ +- function getDefaultTypeRoots(currentDirectory, host) { ++ function getNodeModulesTypeRoots(currentDirectory, host) { + if (!host.directoryExists) { + return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)]; + // And if it doesn't exist, tough. + } +- var typeRoots; ++ var typeRoots = []; + ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) { + var atTypes = ts.combinePaths(directory, nodeModulesAtTypes); + if (host.directoryExists(atTypes)) { +- (typeRoots || (typeRoots = [])).push(atTypes); ++ typeRoots.push(atTypes); + } + return undefined; + }); +@@ -42995,6 +42999,42 @@ var ts; + var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames; + return ts.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0 /* Comparison.EqualTo */; + } ++ /** ++ * @internal ++ */ ++ function getPnpTypeRoots(currentDirectory) { ++ var pnpapi = getPnpApi(currentDirectory); ++ if (!pnpapi) { ++ return []; ++ } ++ // Some TS consumers pass relative paths that aren't normalized ++ currentDirectory = ts.sys.resolvePath(currentDirectory); ++ var currentPackage = pnpapi.findPackageLocator("".concat(currentDirectory, "/")); ++ if (!currentPackage) { ++ return []; ++ } ++ var packageDependencies = pnpapi.getPackageInformation(currentPackage).packageDependencies; ++ var typeRoots = []; ++ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) { ++ var _b = _a[_i], name = _b[0], referencish = _b[1]; ++ // eslint-disable-next-line no-null/no-null ++ if (name.startsWith(typesPackagePrefix) && referencish !== null) { ++ var dependencyLocator = pnpapi.getLocator(name, referencish); ++ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation; ++ typeRoots.push(ts.getDirectoryPath(packageLocation)); ++ } ++ } ++ return typeRoots; ++ } ++ ts.getPnpTypeRoots = getPnpTypeRoots; ++ var typesPackagePrefix = "@types/"; ++ function getDefaultTypeRoots(currentDirectory, host) { ++ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host); ++ var pnpTypes = getPnpTypeRoots(currentDirectory); ++ if (nmTypes.length > 0 || pnpTypes.length > 0) { ++ return __spreadArray(__spreadArray([], nmTypes, true), pnpTypes, true); ++ } ++ } + /** + * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. + * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups +@@ -43134,7 +43174,9 @@ var ts; + } + var result_4; + if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) { +- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); ++ var searchResult = getPnpApi(initialLocationForSecondaryLookup) ++ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined) ++ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); + result_4 = searchResult && searchResult.value; + } + else { +@@ -43859,7 +43901,9 @@ var ts; + if (traceEnabled) { + trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]); + } +- resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); ++ resolved_1 = getPnpApi(containingDirectory) ++ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) ++ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); + } + if (!resolved_1) + return undefined; +@@ -44804,6 +44848,14 @@ var ts; + } + function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) { + var candidate = ts.normalizePath(ts.combinePaths(nodeModulesDirectory, moduleName)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, /* rest */ undefined, /* packageDirectory */ undefined); ++ } ++ function loadModuleFromPnpResolution(extensions, packageDirectory, rest, state, cache, redirectedReference) { ++ var candidate = ts.normalizePath(ts.combinePaths(packageDirectory, rest)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, /*moduleName*/ undefined, /*nodeModulesDirectory*/ undefined, /*nodeModulesDirectoryExists*/ true, state, cache, redirectedReference, candidate, rest, packageDirectory); ++ } ++ function loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, rest, packageDirectory) { ++ var _a; + // First look for a nested package.json, as in `node_modules/foo/bar/package.json`. + var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state); + // But only if we're not respecting export maps (if we are, we might redirect around this location) +@@ -44817,7 +44869,9 @@ var ts; + return withPackageId(packageInfo, fromDirectory); + } + } +- var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageName; ++ if (rest === undefined) ++ (_a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest); + var loader = function (extensions, candidate, onlyRecordFailures, state) { + var _a; + // package exports are higher priority than file/directory lookups (and, if there's exports present, blocks them) +@@ -44837,7 +44891,8 @@ var ts; + return withPackageId(packageInfo, pathAndExtension); + }; + if (rest !== "") { // If "rest" is empty, we just did this search above. +- var packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); ++ if (packageDirectory === undefined) ++ packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); + // Don't use a "types" or "main" from here because we're not loading the root, but a subdirectory -- just here for the packageId and path mappings. + packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state); + if (packageInfo && packageInfo.versionPaths) { +@@ -45024,6 +45079,58 @@ var ts; + function toSearchResult(value) { + return value !== undefined ? { value: value } : undefined; + } ++ /** ++ * We only allow PnP to be used as a resolution strategy if TypeScript ++ * itself is executed under a PnP runtime (and we only allow it to access ++ * the current PnP runtime, not any on the disk). This ensures that we ++ * don't execute potentially malicious code that didn't already have a ++ * chance to be executed (if we're running within the runtime, it means ++ * that the runtime has already been executed). ++ * @internal ++ */ ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function loadPnpPackageResolution(packageName, containingDirectory) { ++ try { ++ var resolution = getPnpApi(containingDirectory).resolveToUnqualified(packageName, "".concat(containingDirectory, "/"), { considerBuiltins: false }); ++ return ts.normalizeSlashes(resolution).replace(/\/$/, ""); ++ } ++ catch (_a) { ++ // Nothing to do ++ } ++ } ++ function loadPnpTypePackageResolution(packageName, containingDirectory) { ++ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory); ++ } ++ /* @internal */ ++ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) { ++ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory); ++ var packageFullResolution = packageResolution ++ ? loadModuleFromPnpResolution(extensions, packageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ var resolved; ++ if (packageFullResolution) { ++ resolved = packageFullResolution; ++ } ++ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) { ++ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory); ++ var typePackageFullResolution = typePackageResolution ++ ? loadModuleFromPnpResolution(Extensions.DtsOnly, typePackageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ if (typePackageFullResolution) { ++ resolved = typePackageFullResolution; ++ } ++ } ++ if (resolved) { ++ return toSearchResult(resolved); ++ } ++ } + })(ts || (ts = {})); + /* @internal */ + var ts; +@@ -116795,6 +116902,8 @@ var ts; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Partial"] = 1] = "Partial"; + /** Reload completely by re-reading contents of config file from disk and updating program */ + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Full"] = 2] = "Full"; ++ /** Reload the resolutions */ ++ ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Resolutions"] = 3] = "Resolutions"; + })(ConfigFileProgramReloadLevel = ts.ConfigFileProgramReloadLevel || (ts.ConfigFileProgramReloadLevel = {})); + /** + * Updates the map of shared extended config file watches with a new set of extended config files from a base config file of the project +@@ -124179,6 +124288,30 @@ var ts; + return undefined; + } + var parts = ts.getNodeModulePathParts(path); ++ var packageName; ++ if (!parts && typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ var pnpApi = findPnpApi(path); ++ var locator = pnpApi === null || pnpApi === void 0 ? void 0 : pnpApi.findPackageLocator(path); ++ // eslint-disable-next-line no-null/no-null ++ if (locator !== null && locator !== undefined) { ++ var sourceLocator = pnpApi.findPackageLocator("".concat(sourceDirectory, "/")); ++ // Don't use the package name when the imported file is inside ++ // the source directory (prefer a relative path instead) ++ if (locator === sourceLocator) { ++ return undefined; ++ } ++ var information = pnpApi.getPackageInformation(locator); ++ packageName = locator.name; ++ parts = { ++ topLevelNodeModulesIndex: undefined, ++ topLevelPackageNameIndex: undefined, ++ // The last character from packageLocation is the trailing "/", we want to point to it ++ packageRootIndex: information.packageLocation.length - 1, ++ fileNameIndex: path.lastIndexOf("/"), ++ }; ++ } ++ } + if (!parts) { + return undefined; + } +@@ -124218,18 +124351,24 @@ var ts; + if (isRedirect && !isPackageRootPath) { + return undefined; + } +- var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); +- // Get a path that's relative to node_modules or the importing file's path +- // if node_modules folder is in this folder or any of its parent folders, no need to keep it. +- var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); +- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { +- return undefined; ++ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they ++ // are located in a weird path apparently outside of the source directory ++ if (typeof process.versions.pnp === "undefined") { ++ var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); ++ // Get a path that's relative to node_modules or the importing file's path ++ // if node_modules folder is in this folder or any of its parent folders, no need to keep it. ++ var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); ++ if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { ++ return undefined; ++ } + } + // If the module was found in @types, get the actual Node package name +- var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); +- var packageName = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); ++ var nodeModulesDirectoryName = typeof packageName !== "undefined" ++ ? packageName + moduleSpecifier.substring(parts.packageRootIndex) ++ : moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); ++ var packageNameFromPath = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); + // For classic resolution, only allow importing from node_modules/@types, not other node_modules +- return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? undefined : packageName; ++ return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageNameFromPath === nodeModulesDirectoryName ? undefined : packageNameFromPath; + function tryDirectoryWithPackageJson(packageRootIndex) { + var _a, _b; + var packageRootPath = path.substring(0, packageRootIndex); +@@ -125126,6 +125265,10 @@ var ts; + if (configFileName) { + configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); + } ++ var pnpFileWatcher; ++ if (typeof process.versions.pnp !== "undefined") { ++ pnpFileWatcher = watchFile(require.resolve("pnpapi"), scheduleResolutionReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); ++ } + var compilerHost = ts.createCompilerHostFromProgramHost(host, function () { return compilerOptions; }, directoryStructureHost); + ts.setGetSourceFileAsHashVersioned(compilerHost, host); + // Members for CompilerHost +@@ -125208,6 +125351,10 @@ var ts; + configFileWatcher.close(); + configFileWatcher = undefined; + } ++ if (pnpFileWatcher) { ++ pnpFileWatcher.close(); ++ pnpFileWatcher = undefined; ++ } + extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear(); + extendedConfigCache = undefined; + if (sharedExtendedConfigFileWatchers) { +@@ -125240,7 +125387,8 @@ var ts; + function getCurrentProgram() { + return builderProgram && builderProgram.getProgramOrUndefined(); + } +- function synchronizeProgram() { ++ function synchronizeProgram(forceAllFilesAsInvalidated) { ++ if (forceAllFilesAsInvalidated === void 0) { forceAllFilesAsInvalidated = false; } + writeLog("Synchronizing program"); + clearInvalidateResolutionsOfFailedLookupLocations(); + var program = getCurrentBuilderProgram(); +@@ -125251,7 +125399,7 @@ var ts; + } + } + // All resolutions are invalid if user provided resolutions +- var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution); ++ var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || forceAllFilesAsInvalidated); + if (ts.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { + if (hasChangedConfigFileParsingErrors) { + if (reportFileChangeDetectedOnCreateProgram) { +@@ -125459,6 +125607,12 @@ var ts; + reloadLevel = ts.ConfigFileProgramReloadLevel.Full; + scheduleProgramUpdate(); + } ++ function scheduleResolutionReload() { ++ writeLog("Clearing resolutions"); ++ resolutionCache.clear(); ++ reloadLevel = ts.ConfigFileProgramReloadLevel.Resolutions; ++ scheduleProgramUpdate(); ++ } + function updateProgramWithWatchStatus() { + timerToUpdateProgram = undefined; + reportFileChangeDetectedOnCreateProgram = true; +@@ -125474,6 +125628,10 @@ var ts; + ts.perfLogger.logStartUpdateProgram("FullConfigReload"); + reloadConfigFile(); + break; ++ case ts.ConfigFileProgramReloadLevel.Resolutions: ++ ts.perfLogger.logStartUpdateProgram("SynchronizeProgramWithResolutions"); ++ synchronizeProgram(/*forceAllFilesAsInvalidated*/ true); ++ break; + default: + ts.perfLogger.logStartUpdateProgram("SynchronizeProgram"); + synchronizeProgram(); +@@ -131401,7 +131559,7 @@ var ts; + * Don't include something from a `node_modules` that isn't actually reachable by a global import. + * A relative import to node_modules is usually a bad idea. + */ +- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) { + // If it's in a `node_modules` but is not reachable from here via a global import, don't bother. + var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === "node_modules" ? ancestor : undefined; }); + var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules)); +@@ -131409,6 +131567,33 @@ var ts; + || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent) + || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent)); + } ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function isImportablePathPnp(fromPath, toPath) { ++ var pnpApi = getPnpApi(fromPath); ++ var fromLocator = pnpApi.findPackageLocator(fromPath); ++ var toLocator = pnpApi.findPackageLocator(toPath); ++ // eslint-disable-next-line no-null/no-null ++ if (toLocator === null) { ++ return false; ++ } ++ var fromInfo = pnpApi.getPackageInformation(fromLocator); ++ var toReference = fromInfo.packageDependencies.get(toLocator.name); ++ return toReference === toLocator.reference; ++ } ++ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ if (getPnpApi(fromPath)) { ++ return isImportablePathPnp(fromPath, toPath); ++ } ++ else { ++ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath); ++ } ++ } + function forEachExternalModuleToImportFrom(program, host, preferences, useAutoImportProvider, cb) { + var _a, _b; + var useCaseSensitiveFileNames = ts.hostUsesCaseSensitiveFileNames(host); +@@ -133318,6 +133503,7 @@ var ts; + * This includes all files that are found in node_modules/moduleName/ with acceptable file extensions + */ + function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, compilerOptions, host, includeExtensionsOption, typeChecker) { ++ var _a, _b; + var baseUrl = compilerOptions.baseUrl, paths = compilerOptions.paths; + var result = createNameAndKindSet(); + var extensionOptions = getExtensionOptions(compilerOptions, includeExtensionsOption); +@@ -133330,8 +133516,8 @@ var ts; + } + } + var fragmentDirectory = getFragmentDirectory(fragment); +- for (var _i = 0, _a = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _a.length; _i++) { +- var ambientName = _a[_i]; ++ for (var _i = 0, _c = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _c.length; _i++) { ++ var ambientName = _c[_i]; + result.add(nameAndKind(ambientName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined)); + } + getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, fragmentDirectory, extensionOptions, result); +@@ -133340,8 +133526,8 @@ var ts; + // (But do if we didn't find anything, e.g. 'package.json' missing.) + var foundGlobal = false; + if (fragmentDirectory === undefined) { +- for (var _b = 0, _c = enumerateNodeModulesVisibleToScript(host, scriptPath); _b < _c.length; _b++) { +- var moduleName = _c[_b]; ++ for (var _d = 0, _e = enumerateNodeModulesVisibleToScript(host, scriptPath); _d < _e.length; _d++) { ++ var moduleName = _e[_d]; + var moduleResult = nameAndKind(moduleName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined); + if (!result.has(moduleResult.name)) { + foundGlobal = true; +@@ -133356,7 +133542,22 @@ var ts; + getCompletionEntriesForDirectoryFragment(fragment, nodeModules, extensionOptions, host, /*exclude*/ undefined, result); + } + }; +- if (fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions)) { ++ var checkExports_1 = function (packageFile, packageDirectory, fragmentSubpath) { ++ var packageJson = ts.readJson(packageFile, host); ++ var exports = packageJson.exports; ++ if (exports) { ++ if (typeof exports !== "object" || exports === null) { // eslint-disable-line no-null/no-null ++ return true; // null exports or entrypoint only, no sub-modules available ++ } ++ var keys = ts.getOwnKeys(exports); ++ var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; ++ addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports[key], conditions_1)); }, ts.comparePatternKeys); ++ return true; ++ } ++ return false; ++ }; ++ var shouldCheckExports = fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions); ++ if (shouldCheckExports) { + var nodeModulesDirectoryLookup_1 = ancestorLookup; + ancestorLookup = function (ancestor) { + var components = ts.getPathComponents(fragment); +@@ -133375,23 +133576,46 @@ var ts; + var packageDirectory = ts.combinePaths(ancestor, "node_modules", packagePath); + var packageFile = ts.combinePaths(packageDirectory, "package.json"); + if (ts.tryFileExists(host, packageFile)) { +- var packageJson = ts.readJson(packageFile, host); +- var exports_1 = packageJson.exports; +- if (exports_1) { +- if (typeof exports_1 !== "object" || exports_1 === null) { // eslint-disable-line no-null/no-null +- return; // null exports or entrypoint only, no sub-modules available +- } +- var keys = ts.getOwnKeys(exports_1); +- var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); +- var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; +- addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports_1[key], conditions_1)); }, ts.comparePatternKeys); ++ var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); ++ if (checkExports_1(packageFile, packageDirectory, fragmentSubpath)) { + return; + } + } + return nodeModulesDirectoryLookup_1(ancestor); + }; + } +- ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ var pnpapi = (_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath); ++ if (pnpapi) { ++ // Splits a require request into its components, or return null if the request is a file path ++ var pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; ++ var dependencyNameMatch = fragment.match(pathRegExp); ++ if (dependencyNameMatch) { ++ var dependencyName = dependencyNameMatch[1], subPath = dependencyNameMatch[2]; ++ var unqualified = void 0; ++ try { ++ unqualified = pnpapi.resolveToUnqualified(dependencyName, scriptPath, { considerBuiltins: false }); ++ } ++ catch (_f) { ++ // It's fine if the resolution fails ++ } ++ if (unqualified) { ++ var packageDirectory = ts.normalizePath(unqualified); ++ var shouldGetCompletions = true; ++ if (shouldCheckExports) { ++ var packageFile = ts.combinePaths(packageDirectory, "package.json"); ++ if (ts.tryFileExists(host, packageFile) && checkExports_1(packageFile, packageDirectory, subPath)) { ++ shouldGetCompletions = false; ++ } ++ } ++ if (shouldGetCompletions) { ++ getCompletionEntriesForDirectoryFragment(subPath, packageDirectory, extensionOptions, host, /*exclude*/ undefined, result); ++ } ++ } ++ } ++ } ++ else { ++ ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ } + } + } + return ts.arrayFrom(result.values()); +@@ -133522,6 +133746,7 @@ var ts; + return addReplacementSpans(toComplete, range.pos + prefix.length, ts.arrayFrom(names.values())); + } + function getCompletionEntriesFromTypings(host, options, scriptPath, fragmentDirectory, extensionOptions, result) { ++ var _a, _b; + if (result === void 0) { result = createNameAndKindSet(); } + // Check for typings specified in compiler options + var seen = new ts.Map(); +@@ -133530,11 +133755,19 @@ var ts; + var root = typeRoots_1[_i]; + getCompletionEntriesFromDirectories(root); + } +- // Also get all @types typings installed in visible node_modules directories +- for (var _a = 0, _b = ts.findPackageJsons(scriptPath, host); _a < _b.length; _a++) { +- var packageJson = _b[_a]; +- var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); +- getCompletionEntriesFromDirectories(typesDir); ++ if ((_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath)) { ++ for (var _c = 0, _d = ts.getPnpTypeRoots(scriptPath); _c < _d.length; _c++) { ++ var root = _d[_c]; ++ getCompletionEntriesFromDirectories(root); ++ } ++ } ++ else { ++ // Also get all @types typings installed in visible node_modules directories ++ for (var _e = 0, _f = ts.findPackageJsons(scriptPath, host); _e < _f.length; _e++) { ++ var packageJson = _f[_e]; ++ var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); ++ getCompletionEntriesFromDirectories(typesDir); ++ } + } + return result; + function getCompletionEntriesFromDirectories(directory) { +@@ -164292,9 +164525,9 @@ var ts; + if (isTopLevelDeclarationStatement(statement) && + !isExported(sourceFile, statement, useEs6Exports) && + forEachTopLevelDeclaration(statement, function (d) { return needExport.has(ts.Debug.checkDefined(d.symbol)); })) { +- var exports = addExport(statement, useEs6Exports); +- if (exports) +- return exports; ++ var exports_1 = addExport(statement, useEs6Exports); ++ if (exports_1) ++ return exports_1; + } + return statement; + }); +@@ -173454,6 +173687,40 @@ var ts; + return this.projectReferences; + }; + ConfiguredProject.prototype.updateReferences = function (refs) { ++ // @ts-ignore ++ if (process.versions.pnp) { ++ // With Plug'n'Play, dependencies that list peer dependencies ++ // are "virtualized": they are resolved to a unique (virtual) ++ // path that the underlying filesystem layer then resolve back ++ // to the original location. ++ // ++ // When a workspace depends on another workspace with peer ++ // dependencies, this other workspace will thus be resolved to ++ // a unique path that won't match what the initial project has ++ // listed in its `references` field, and TS thus won't leverage ++ // the reference at all. ++ // ++ // To avoid that, we compute here the virtualized paths for the ++ // user-provided references in our references by directly querying ++ // the PnP API. This way users don't have to know the virtual paths, ++ // but we still support them just fine even through references. ++ var basePath_1 = this.getCurrentDirectory(); ++ var findPnpApi_1 = require("module").findPnpApi; ++ var getPnpPath_1 = function (path) { ++ try { ++ var pnpApi = findPnpApi_1("".concat(path, "/")); ++ var targetLocator = pnpApi.findPackageLocator("".concat(path, "/")); ++ var packageLocation = pnpApi.getPackageInformation(targetLocator).packageLocation; ++ var request = ts.combinePaths(targetLocator.name, ts.getRelativePathFromDirectory(packageLocation, path, /*ignoreCase*/ false)); ++ return pnpApi.resolveToUnqualified(request, "".concat(basePath_1, "/")); ++ } ++ catch (_a) { ++ // something went wrong with the resolution, try not to fail ++ return path; ++ } ++ }; ++ refs = refs === null || refs === void 0 ? void 0 : refs.map(function (r) { return (__assign(__assign({}, r), { path: getPnpPath_1(r.path) })); }); ++ } + this.projectReferences = refs; + this.potentialProjectReferences = undefined; + }; +@@ -174072,6 +174339,7 @@ var ts; + watchDirectory: ts.returnNoopFileWatcher, + } : + ts.getWatchFactory(this.host, watchLogLevel, log, getDetailWatchInfo); ++ this.pnpWatcher = this.watchPnpFile(); + } + ProjectService.prototype.toPath = function (fileName) { + return ts.toPath(fileName, this.currentDirectory, this.toCanonicalFileName); +@@ -175929,7 +176197,7 @@ var ts; + }; + ProjectService.prototype.setHostConfiguration = function (args) { + var _this = this; +- var _a; ++ var _a, _b; + if (args.file) { + var info = this.getScriptInfoForNormalizedPath(server.toNormalizedPath(args.file)); + if (info) { +@@ -175947,7 +176215,7 @@ var ts; + this.logger.info("Format host information updated"); + } + if (args.preferences) { +- var _b = this.hostConfiguration.preferences, lazyConfiguredProjectsFromExternalProject = _b.lazyConfiguredProjectsFromExternalProject, includePackageJsonAutoImports = _b.includePackageJsonAutoImports; ++ var _c = this.hostConfiguration.preferences, lazyConfiguredProjectsFromExternalProject = _c.lazyConfiguredProjectsFromExternalProject, includePackageJsonAutoImports = _c.includePackageJsonAutoImports; + this.hostConfiguration.preferences = __assign(__assign({}, this.hostConfiguration.preferences), args.preferences); + if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) { + // Load configured projects for external projects that are pending reload +@@ -175973,6 +176241,8 @@ var ts; + if (args.watchOptions) { + this.hostConfiguration.watchOptions = (_a = convertWatchOptions(args.watchOptions)) === null || _a === void 0 ? void 0 : _a.watchOptions; + this.logger.info("Host watch options changed to ".concat(JSON.stringify(this.hostConfiguration.watchOptions), ", it will be take effect for next watches.")); ++ (_b = this.pnpWatcher) === null || _b === void 0 ? void 0 : _b.close(); ++ this.watchPnpFile(); + } + } + }; +@@ -177108,6 +177378,27 @@ var ts; + }); + }; + /*@internal*/ ++ ProjectService.prototype.watchPnpFile = function () { ++ var _this = this; ++ if (typeof process.versions.pnp === "undefined") { ++ return; ++ } ++ var findPnpApi = require("module").findPnpApi; ++ // eslint-disable-next-line no-null/no-null ++ var pnpFileName = findPnpApi(__filename).resolveRequest("pnpapi", /*issuer*/ null); ++ return this.watchFactory.watchFile(pnpFileName, function () { ++ _this.forEachProject(function (project) { ++ for (var _i = 0, _a = project.getScriptInfos(); _i < _a.length; _i++) { ++ var info = _a[_i]; ++ project.resolutionCache.invalidateResolutionOfFile(info.path); ++ } ++ project.markAsDirty(); ++ updateProjectIfDirty(project); ++ }); ++ _this.delayEnsureProjectForOpenFiles(); ++ }, ts.PollingInterval.Low, this.hostConfiguration.watchOptions, ts.WatchType.ConfigFile); ++ }; ++ /*@internal*/ + ProjectService.prototype.watchPackageJsonFile = function (path) { + var _this = this; + var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = new ts.Map()); +@@ -183847,6 +184138,11 @@ var ts; + } + try { + var args = [ts.combinePaths(__dirname, "watchGuard.js"), path]; ++ if (typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ // eslint-disable-next-line no-null/no-null ++ args.unshift("-r", findPnpApi(__filename).resolveRequest("pnpapi", /* issuer */ null)); ++ } + if (logger.hasLevel(server.LogLevel.verbose)) { + logger.info("Starting ".concat(process.execPath, " with args:").concat(server.stringifyIndented(args))); + } +@@ -184107,6 +184403,11 @@ var ts; + break; + } + } ++ if (typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ // eslint-disable-next-line no-null/no-null ++ execArgv.unshift("-r", findPnpApi(__filename).resolveRequest("pnpapi", /* issuer */ null)); ++ } + this.installer = childProcess.fork(ts.combinePaths(__dirname, "typingsInstaller.js"), args, { execArgv: execArgv }); + this.installer.on("message", function (m) { return _this.handleMessage(m); }); + // We have to schedule this event to the next tick +diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js +index 83540854d..30e81cc91 100644 +semver exclusivity >=4.8.1-rc +--- a/lib/tsserverlibrary.js ++++ b/lib/tsserverlibrary.js +@@ -7445,6 +7445,11 @@ var ts; + : new Buffer(input, encoding); + } + function isFileSystemCaseSensitive() { ++ // The PnP runtime is always case-sensitive ++ // @ts-ignore ++ if (process.versions.pnp) { ++ return true; ++ } + // win32\win64 are case insensitive platforms + if (platform === "win32" || platform === "win64") { + return false; +@@ -43167,18 +43172,17 @@ var ts; + ts.getEffectiveTypeRoots = getEffectiveTypeRoots; + /** + * Returns the path to every node_modules/@types directory from some ancestor directory. +- * Returns undefined if there are none. + */ +- function getDefaultTypeRoots(currentDirectory, host) { ++ function getNodeModulesTypeRoots(currentDirectory, host) { + if (!host.directoryExists) { + return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)]; + // And if it doesn't exist, tough. + } +- var typeRoots; ++ var typeRoots = []; + ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) { + var atTypes = ts.combinePaths(directory, nodeModulesAtTypes); + if (host.directoryExists(atTypes)) { +- (typeRoots || (typeRoots = [])).push(atTypes); ++ typeRoots.push(atTypes); + } + return undefined; + }); +@@ -43189,6 +43193,42 @@ var ts; + var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames; + return ts.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0 /* Comparison.EqualTo */; + } ++ /** ++ * @internal ++ */ ++ function getPnpTypeRoots(currentDirectory) { ++ var pnpapi = getPnpApi(currentDirectory); ++ if (!pnpapi) { ++ return []; ++ } ++ // Some TS consumers pass relative paths that aren't normalized ++ currentDirectory = ts.sys.resolvePath(currentDirectory); ++ var currentPackage = pnpapi.findPackageLocator("".concat(currentDirectory, "/")); ++ if (!currentPackage) { ++ return []; ++ } ++ var packageDependencies = pnpapi.getPackageInformation(currentPackage).packageDependencies; ++ var typeRoots = []; ++ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) { ++ var _b = _a[_i], name = _b[0], referencish = _b[1]; ++ // eslint-disable-next-line no-null/no-null ++ if (name.startsWith(typesPackagePrefix) && referencish !== null) { ++ var dependencyLocator = pnpapi.getLocator(name, referencish); ++ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation; ++ typeRoots.push(ts.getDirectoryPath(packageLocation)); ++ } ++ } ++ return typeRoots; ++ } ++ ts.getPnpTypeRoots = getPnpTypeRoots; ++ var typesPackagePrefix = "@types/"; ++ function getDefaultTypeRoots(currentDirectory, host) { ++ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host); ++ var pnpTypes = getPnpTypeRoots(currentDirectory); ++ if (nmTypes.length > 0 || pnpTypes.length > 0) { ++ return __spreadArray(__spreadArray([], nmTypes, true), pnpTypes, true); ++ } ++ } + /** + * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. + * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups +@@ -43328,7 +43368,9 @@ var ts; + } + var result_4; + if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) { +- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); ++ var searchResult = getPnpApi(initialLocationForSecondaryLookup) ++ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined) ++ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); + result_4 = searchResult && searchResult.value; + } + else { +@@ -44053,7 +44095,9 @@ var ts; + if (traceEnabled) { + trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]); + } +- resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); ++ resolved_1 = getPnpApi(containingDirectory) ++ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) ++ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); + } + if (!resolved_1) + return undefined; +@@ -44998,6 +45042,14 @@ var ts; + } + function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) { + var candidate = ts.normalizePath(ts.combinePaths(nodeModulesDirectory, moduleName)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, /* rest */ undefined, /* packageDirectory */ undefined); ++ } ++ function loadModuleFromPnpResolution(extensions, packageDirectory, rest, state, cache, redirectedReference) { ++ var candidate = ts.normalizePath(ts.combinePaths(packageDirectory, rest)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, /*moduleName*/ undefined, /*nodeModulesDirectory*/ undefined, /*nodeModulesDirectoryExists*/ true, state, cache, redirectedReference, candidate, rest, packageDirectory); ++ } ++ function loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, rest, packageDirectory) { ++ var _a; + // First look for a nested package.json, as in `node_modules/foo/bar/package.json`. + var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state); + // But only if we're not respecting export maps (if we are, we might redirect around this location) +@@ -45011,7 +45063,9 @@ var ts; + return withPackageId(packageInfo, fromDirectory); + } + } +- var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageName; ++ if (rest === undefined) ++ (_a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest); + var loader = function (extensions, candidate, onlyRecordFailures, state) { + var _a; + // package exports are higher priority than file/directory lookups (and, if there's exports present, blocks them) +@@ -45031,7 +45085,8 @@ var ts; + return withPackageId(packageInfo, pathAndExtension); + }; + if (rest !== "") { // If "rest" is empty, we just did this search above. +- var packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); ++ if (packageDirectory === undefined) ++ packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); + // Don't use a "types" or "main" from here because we're not loading the root, but a subdirectory -- just here for the packageId and path mappings. + packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state); + if (packageInfo && packageInfo.versionPaths) { +@@ -45218,6 +45273,58 @@ var ts; + function toSearchResult(value) { + return value !== undefined ? { value: value } : undefined; + } ++ /** ++ * We only allow PnP to be used as a resolution strategy if TypeScript ++ * itself is executed under a PnP runtime (and we only allow it to access ++ * the current PnP runtime, not any on the disk). This ensures that we ++ * don't execute potentially malicious code that didn't already have a ++ * chance to be executed (if we're running within the runtime, it means ++ * that the runtime has already been executed). ++ * @internal ++ */ ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function loadPnpPackageResolution(packageName, containingDirectory) { ++ try { ++ var resolution = getPnpApi(containingDirectory).resolveToUnqualified(packageName, "".concat(containingDirectory, "/"), { considerBuiltins: false }); ++ return ts.normalizeSlashes(resolution).replace(/\/$/, ""); ++ } ++ catch (_a) { ++ // Nothing to do ++ } ++ } ++ function loadPnpTypePackageResolution(packageName, containingDirectory) { ++ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory); ++ } ++ /* @internal */ ++ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) { ++ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory); ++ var packageFullResolution = packageResolution ++ ? loadModuleFromPnpResolution(extensions, packageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ var resolved; ++ if (packageFullResolution) { ++ resolved = packageFullResolution; ++ } ++ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) { ++ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory); ++ var typePackageFullResolution = typePackageResolution ++ ? loadModuleFromPnpResolution(Extensions.DtsOnly, typePackageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ if (typePackageFullResolution) { ++ resolved = typePackageFullResolution; ++ } ++ } ++ if (resolved) { ++ return toSearchResult(resolved); ++ } ++ } + })(ts || (ts = {})); + /* @internal */ + var ts; +@@ -116989,6 +117096,8 @@ var ts; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Partial"] = 1] = "Partial"; + /** Reload completely by re-reading contents of config file from disk and updating program */ + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Full"] = 2] = "Full"; ++ /** Reload the resolutions */ ++ ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Resolutions"] = 3] = "Resolutions"; + })(ConfigFileProgramReloadLevel = ts.ConfigFileProgramReloadLevel || (ts.ConfigFileProgramReloadLevel = {})); + /** + * Updates the map of shared extended config file watches with a new set of extended config files from a base config file of the project +@@ -124373,6 +124482,30 @@ var ts; + return undefined; + } + var parts = ts.getNodeModulePathParts(path); ++ var packageName; ++ if (!parts && typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ var pnpApi = findPnpApi(path); ++ var locator = pnpApi === null || pnpApi === void 0 ? void 0 : pnpApi.findPackageLocator(path); ++ // eslint-disable-next-line no-null/no-null ++ if (locator !== null && locator !== undefined) { ++ var sourceLocator = pnpApi.findPackageLocator("".concat(sourceDirectory, "/")); ++ // Don't use the package name when the imported file is inside ++ // the source directory (prefer a relative path instead) ++ if (locator === sourceLocator) { ++ return undefined; ++ } ++ var information = pnpApi.getPackageInformation(locator); ++ packageName = locator.name; ++ parts = { ++ topLevelNodeModulesIndex: undefined, ++ topLevelPackageNameIndex: undefined, ++ // The last character from packageLocation is the trailing "/", we want to point to it ++ packageRootIndex: information.packageLocation.length - 1, ++ fileNameIndex: path.lastIndexOf("/"), ++ }; ++ } ++ } + if (!parts) { + return undefined; + } +@@ -124412,18 +124545,24 @@ var ts; + if (isRedirect && !isPackageRootPath) { + return undefined; + } +- var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); +- // Get a path that's relative to node_modules or the importing file's path +- // if node_modules folder is in this folder or any of its parent folders, no need to keep it. +- var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); +- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { +- return undefined; ++ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they ++ // are located in a weird path apparently outside of the source directory ++ if (typeof process.versions.pnp === "undefined") { ++ var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); ++ // Get a path that's relative to node_modules or the importing file's path ++ // if node_modules folder is in this folder or any of its parent folders, no need to keep it. ++ var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); ++ if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { ++ return undefined; ++ } + } + // If the module was found in @types, get the actual Node package name +- var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); +- var packageName = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); ++ var nodeModulesDirectoryName = typeof packageName !== "undefined" ++ ? packageName + moduleSpecifier.substring(parts.packageRootIndex) ++ : moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); ++ var packageNameFromPath = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); + // For classic resolution, only allow importing from node_modules/@types, not other node_modules +- return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? undefined : packageName; ++ return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageNameFromPath === nodeModulesDirectoryName ? undefined : packageNameFromPath; + function tryDirectoryWithPackageJson(packageRootIndex) { + var _a, _b; + var packageRootPath = path.substring(0, packageRootIndex); +@@ -125320,6 +125459,10 @@ var ts; + if (configFileName) { + configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); + } ++ var pnpFileWatcher; ++ if (typeof process.versions.pnp !== "undefined") { ++ pnpFileWatcher = watchFile(require.resolve("pnpapi"), scheduleResolutionReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); ++ } + var compilerHost = ts.createCompilerHostFromProgramHost(host, function () { return compilerOptions; }, directoryStructureHost); + ts.setGetSourceFileAsHashVersioned(compilerHost, host); + // Members for CompilerHost +@@ -125402,6 +125545,10 @@ var ts; + configFileWatcher.close(); + configFileWatcher = undefined; + } ++ if (pnpFileWatcher) { ++ pnpFileWatcher.close(); ++ pnpFileWatcher = undefined; ++ } + extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear(); + extendedConfigCache = undefined; + if (sharedExtendedConfigFileWatchers) { +@@ -125434,7 +125581,8 @@ var ts; + function getCurrentProgram() { + return builderProgram && builderProgram.getProgramOrUndefined(); + } +- function synchronizeProgram() { ++ function synchronizeProgram(forceAllFilesAsInvalidated) { ++ if (forceAllFilesAsInvalidated === void 0) { forceAllFilesAsInvalidated = false; } + writeLog("Synchronizing program"); + clearInvalidateResolutionsOfFailedLookupLocations(); + var program = getCurrentBuilderProgram(); +@@ -125445,7 +125593,7 @@ var ts; + } + } + // All resolutions are invalid if user provided resolutions +- var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution); ++ var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || forceAllFilesAsInvalidated); + if (ts.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { + if (hasChangedConfigFileParsingErrors) { + if (reportFileChangeDetectedOnCreateProgram) { +@@ -125653,6 +125801,12 @@ var ts; + reloadLevel = ts.ConfigFileProgramReloadLevel.Full; + scheduleProgramUpdate(); + } ++ function scheduleResolutionReload() { ++ writeLog("Clearing resolutions"); ++ resolutionCache.clear(); ++ reloadLevel = ts.ConfigFileProgramReloadLevel.Resolutions; ++ scheduleProgramUpdate(); ++ } + function updateProgramWithWatchStatus() { + timerToUpdateProgram = undefined; + reportFileChangeDetectedOnCreateProgram = true; +@@ -125668,6 +125822,10 @@ var ts; + ts.perfLogger.logStartUpdateProgram("FullConfigReload"); + reloadConfigFile(); + break; ++ case ts.ConfigFileProgramReloadLevel.Resolutions: ++ ts.perfLogger.logStartUpdateProgram("SynchronizeProgramWithResolutions"); ++ synchronizeProgram(/*forceAllFilesAsInvalidated*/ true); ++ break; + default: + ts.perfLogger.logStartUpdateProgram("SynchronizeProgram"); + synchronizeProgram(); +@@ -132014,7 +132172,7 @@ var ts; + * Don't include something from a `node_modules` that isn't actually reachable by a global import. + * A relative import to node_modules is usually a bad idea. + */ +- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) { + // If it's in a `node_modules` but is not reachable from here via a global import, don't bother. + var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === "node_modules" ? ancestor : undefined; }); + var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules)); +@@ -132022,6 +132180,33 @@ var ts; + || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent) + || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent)); + } ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function isImportablePathPnp(fromPath, toPath) { ++ var pnpApi = getPnpApi(fromPath); ++ var fromLocator = pnpApi.findPackageLocator(fromPath); ++ var toLocator = pnpApi.findPackageLocator(toPath); ++ // eslint-disable-next-line no-null/no-null ++ if (toLocator === null) { ++ return false; ++ } ++ var fromInfo = pnpApi.getPackageInformation(fromLocator); ++ var toReference = fromInfo.packageDependencies.get(toLocator.name); ++ return toReference === toLocator.reference; ++ } ++ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ if (getPnpApi(fromPath)) { ++ return isImportablePathPnp(fromPath, toPath); ++ } ++ else { ++ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath); ++ } ++ } + function forEachExternalModuleToImportFrom(program, host, preferences, useAutoImportProvider, cb) { + var _a, _b; + var useCaseSensitiveFileNames = ts.hostUsesCaseSensitiveFileNames(host); +@@ -133931,6 +134116,7 @@ var ts; + * This includes all files that are found in node_modules/moduleName/ with acceptable file extensions + */ + function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, compilerOptions, host, includeExtensionsOption, typeChecker) { ++ var _a, _b; + var baseUrl = compilerOptions.baseUrl, paths = compilerOptions.paths; + var result = createNameAndKindSet(); + var extensionOptions = getExtensionOptions(compilerOptions, includeExtensionsOption); +@@ -133943,8 +134129,8 @@ var ts; + } + } + var fragmentDirectory = getFragmentDirectory(fragment); +- for (var _i = 0, _a = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _a.length; _i++) { +- var ambientName = _a[_i]; ++ for (var _i = 0, _c = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _c.length; _i++) { ++ var ambientName = _c[_i]; + result.add(nameAndKind(ambientName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined)); + } + getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, fragmentDirectory, extensionOptions, result); +@@ -133953,8 +134139,8 @@ var ts; + // (But do if we didn't find anything, e.g. 'package.json' missing.) + var foundGlobal = false; + if (fragmentDirectory === undefined) { +- for (var _b = 0, _c = enumerateNodeModulesVisibleToScript(host, scriptPath); _b < _c.length; _b++) { +- var moduleName = _c[_b]; ++ for (var _d = 0, _e = enumerateNodeModulesVisibleToScript(host, scriptPath); _d < _e.length; _d++) { ++ var moduleName = _e[_d]; + var moduleResult = nameAndKind(moduleName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined); + if (!result.has(moduleResult.name)) { + foundGlobal = true; +@@ -133969,7 +134155,22 @@ var ts; + getCompletionEntriesForDirectoryFragment(fragment, nodeModules, extensionOptions, host, /*exclude*/ undefined, result); + } + }; +- if (fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions)) { ++ var checkExports_1 = function (packageFile, packageDirectory, fragmentSubpath) { ++ var packageJson = ts.readJson(packageFile, host); ++ var exports = packageJson.exports; ++ if (exports) { ++ if (typeof exports !== "object" || exports === null) { // eslint-disable-line no-null/no-null ++ return true; // null exports or entrypoint only, no sub-modules available ++ } ++ var keys = ts.getOwnKeys(exports); ++ var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; ++ addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports[key], conditions_1)); }, ts.comparePatternKeys); ++ return true; ++ } ++ return false; ++ }; ++ var shouldCheckExports = fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions); ++ if (shouldCheckExports) { + var nodeModulesDirectoryLookup_1 = ancestorLookup; + ancestorLookup = function (ancestor) { + var components = ts.getPathComponents(fragment); +@@ -133988,23 +134189,46 @@ var ts; + var packageDirectory = ts.combinePaths(ancestor, "node_modules", packagePath); + var packageFile = ts.combinePaths(packageDirectory, "package.json"); + if (ts.tryFileExists(host, packageFile)) { +- var packageJson = ts.readJson(packageFile, host); +- var exports_1 = packageJson.exports; +- if (exports_1) { +- if (typeof exports_1 !== "object" || exports_1 === null) { // eslint-disable-line no-null/no-null +- return; // null exports or entrypoint only, no sub-modules available +- } +- var keys = ts.getOwnKeys(exports_1); +- var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); +- var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; +- addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports_1[key], conditions_1)); }, ts.comparePatternKeys); ++ var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); ++ if (checkExports_1(packageFile, packageDirectory, fragmentSubpath)) { + return; + } + } + return nodeModulesDirectoryLookup_1(ancestor); + }; + } +- ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ var pnpapi = (_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath); ++ if (pnpapi) { ++ // Splits a require request into its components, or return null if the request is a file path ++ var pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; ++ var dependencyNameMatch = fragment.match(pathRegExp); ++ if (dependencyNameMatch) { ++ var dependencyName = dependencyNameMatch[1], subPath = dependencyNameMatch[2]; ++ var unqualified = void 0; ++ try { ++ unqualified = pnpapi.resolveToUnqualified(dependencyName, scriptPath, { considerBuiltins: false }); ++ } ++ catch (_f) { ++ // It's fine if the resolution fails ++ } ++ if (unqualified) { ++ var packageDirectory = ts.normalizePath(unqualified); ++ var shouldGetCompletions = true; ++ if (shouldCheckExports) { ++ var packageFile = ts.combinePaths(packageDirectory, "package.json"); ++ if (ts.tryFileExists(host, packageFile) && checkExports_1(packageFile, packageDirectory, subPath)) { ++ shouldGetCompletions = false; ++ } ++ } ++ if (shouldGetCompletions) { ++ getCompletionEntriesForDirectoryFragment(subPath, packageDirectory, extensionOptions, host, /*exclude*/ undefined, result); ++ } ++ } ++ } ++ } ++ else { ++ ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ } + } + } + return ts.arrayFrom(result.values()); +@@ -134135,6 +134359,7 @@ var ts; + return addReplacementSpans(toComplete, range.pos + prefix.length, ts.arrayFrom(names.values())); + } + function getCompletionEntriesFromTypings(host, options, scriptPath, fragmentDirectory, extensionOptions, result) { ++ var _a, _b; + if (result === void 0) { result = createNameAndKindSet(); } + // Check for typings specified in compiler options + var seen = new ts.Map(); +@@ -134143,11 +134368,19 @@ var ts; + var root = typeRoots_1[_i]; + getCompletionEntriesFromDirectories(root); + } +- // Also get all @types typings installed in visible node_modules directories +- for (var _a = 0, _b = ts.findPackageJsons(scriptPath, host); _a < _b.length; _a++) { +- var packageJson = _b[_a]; +- var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); +- getCompletionEntriesFromDirectories(typesDir); ++ if ((_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath)) { ++ for (var _c = 0, _d = ts.getPnpTypeRoots(scriptPath); _c < _d.length; _c++) { ++ var root = _d[_c]; ++ getCompletionEntriesFromDirectories(root); ++ } ++ } ++ else { ++ // Also get all @types typings installed in visible node_modules directories ++ for (var _e = 0, _f = ts.findPackageJsons(scriptPath, host); _e < _f.length; _e++) { ++ var packageJson = _f[_e]; ++ var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); ++ getCompletionEntriesFromDirectories(typesDir); ++ } + } + return result; + function getCompletionEntriesFromDirectories(directory) { +@@ -164905,9 +165138,9 @@ var ts; + if (isTopLevelDeclarationStatement(statement) && + !isExported(sourceFile, statement, useEs6Exports) && + forEachTopLevelDeclaration(statement, function (d) { return needExport.has(ts.Debug.checkDefined(d.symbol)); })) { +- var exports = addExport(statement, useEs6Exports); +- if (exports) +- return exports; ++ var exports_1 = addExport(statement, useEs6Exports); ++ if (exports_1) ++ return exports_1; + } + return statement; + }); +@@ -173648,6 +173881,40 @@ var ts; + return this.projectReferences; + }; + ConfiguredProject.prototype.updateReferences = function (refs) { ++ // @ts-ignore ++ if (process.versions.pnp) { ++ // With Plug'n'Play, dependencies that list peer dependencies ++ // are "virtualized": they are resolved to a unique (virtual) ++ // path that the underlying filesystem layer then resolve back ++ // to the original location. ++ // ++ // When a workspace depends on another workspace with peer ++ // dependencies, this other workspace will thus be resolved to ++ // a unique path that won't match what the initial project has ++ // listed in its `references` field, and TS thus won't leverage ++ // the reference at all. ++ // ++ // To avoid that, we compute here the virtualized paths for the ++ // user-provided references in our references by directly querying ++ // the PnP API. This way users don't have to know the virtual paths, ++ // but we still support them just fine even through references. ++ var basePath_1 = this.getCurrentDirectory(); ++ var findPnpApi_1 = require("module").findPnpApi; ++ var getPnpPath_1 = function (path) { ++ try { ++ var pnpApi = findPnpApi_1("".concat(path, "/")); ++ var targetLocator = pnpApi.findPackageLocator("".concat(path, "/")); ++ var packageLocation = pnpApi.getPackageInformation(targetLocator).packageLocation; ++ var request = ts.combinePaths(targetLocator.name, ts.getRelativePathFromDirectory(packageLocation, path, /*ignoreCase*/ false)); ++ return pnpApi.resolveToUnqualified(request, "".concat(basePath_1, "/")); ++ } ++ catch (_a) { ++ // something went wrong with the resolution, try not to fail ++ return path; ++ } ++ }; ++ refs = refs === null || refs === void 0 ? void 0 : refs.map(function (r) { return (__assign(__assign({}, r), { path: getPnpPath_1(r.path) })); }); ++ } + this.projectReferences = refs; + this.potentialProjectReferences = undefined; + }; +@@ -174266,6 +174533,7 @@ var ts; + watchDirectory: ts.returnNoopFileWatcher, + } : + ts.getWatchFactory(this.host, watchLogLevel, log, getDetailWatchInfo); ++ this.pnpWatcher = this.watchPnpFile(); + } + ProjectService.prototype.toPath = function (fileName) { + return ts.toPath(fileName, this.currentDirectory, this.toCanonicalFileName); +@@ -176123,7 +176391,7 @@ var ts; + }; + ProjectService.prototype.setHostConfiguration = function (args) { + var _this = this; +- var _a; ++ var _a, _b; + if (args.file) { + var info = this.getScriptInfoForNormalizedPath(server.toNormalizedPath(args.file)); + if (info) { +@@ -176141,7 +176409,7 @@ var ts; + this.logger.info("Format host information updated"); + } + if (args.preferences) { +- var _b = this.hostConfiguration.preferences, lazyConfiguredProjectsFromExternalProject = _b.lazyConfiguredProjectsFromExternalProject, includePackageJsonAutoImports = _b.includePackageJsonAutoImports; ++ var _c = this.hostConfiguration.preferences, lazyConfiguredProjectsFromExternalProject = _c.lazyConfiguredProjectsFromExternalProject, includePackageJsonAutoImports = _c.includePackageJsonAutoImports; + this.hostConfiguration.preferences = __assign(__assign({}, this.hostConfiguration.preferences), args.preferences); + if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) { + // Load configured projects for external projects that are pending reload +@@ -176167,6 +176435,8 @@ var ts; + if (args.watchOptions) { + this.hostConfiguration.watchOptions = (_a = convertWatchOptions(args.watchOptions)) === null || _a === void 0 ? void 0 : _a.watchOptions; + this.logger.info("Host watch options changed to ".concat(JSON.stringify(this.hostConfiguration.watchOptions), ", it will be take effect for next watches.")); ++ (_b = this.pnpWatcher) === null || _b === void 0 ? void 0 : _b.close(); ++ this.watchPnpFile(); + } + } + }; +@@ -177302,6 +177572,27 @@ var ts; + }); + }; + /*@internal*/ ++ ProjectService.prototype.watchPnpFile = function () { ++ var _this = this; ++ if (typeof process.versions.pnp === "undefined") { ++ return; ++ } ++ var findPnpApi = require("module").findPnpApi; ++ // eslint-disable-next-line no-null/no-null ++ var pnpFileName = findPnpApi(__filename).resolveRequest("pnpapi", /*issuer*/ null); ++ return this.watchFactory.watchFile(pnpFileName, function () { ++ _this.forEachProject(function (project) { ++ for (var _i = 0, _a = project.getScriptInfos(); _i < _a.length; _i++) { ++ var info = _a[_i]; ++ project.resolutionCache.invalidateResolutionOfFile(info.path); ++ } ++ project.markAsDirty(); ++ updateProjectIfDirty(project); ++ }); ++ _this.delayEnsureProjectForOpenFiles(); ++ }, ts.PollingInterval.Low, this.hostConfiguration.watchOptions, ts.WatchType.ConfigFile); ++ }; ++ /*@internal*/ + ProjectService.prototype.watchPackageJsonFile = function (path) { + var _this = this; + var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = new ts.Map()); +diff --git a/lib/typescript.js b/lib/typescript.js +index d5dc09813..f8c77b891 100644 +semver exclusivity >=4.8.1-rc +--- a/lib/typescript.js ++++ b/lib/typescript.js +@@ -7436,6 +7436,11 @@ var ts; + : new Buffer(input, encoding); + } + function isFileSystemCaseSensitive() { ++ // The PnP runtime is always case-sensitive ++ // @ts-ignore ++ if (process.versions.pnp) { ++ return true; ++ } + // win32\win64 are case insensitive platforms + if (platform === "win32" || platform === "win64") { + return false; +@@ -43158,18 +43163,17 @@ var ts; + ts.getEffectiveTypeRoots = getEffectiveTypeRoots; + /** + * Returns the path to every node_modules/@types directory from some ancestor directory. +- * Returns undefined if there are none. + */ +- function getDefaultTypeRoots(currentDirectory, host) { ++ function getNodeModulesTypeRoots(currentDirectory, host) { + if (!host.directoryExists) { + return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)]; + // And if it doesn't exist, tough. + } +- var typeRoots; ++ var typeRoots = []; + ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) { + var atTypes = ts.combinePaths(directory, nodeModulesAtTypes); + if (host.directoryExists(atTypes)) { +- (typeRoots || (typeRoots = [])).push(atTypes); ++ typeRoots.push(atTypes); + } + return undefined; + }); +@@ -43180,6 +43184,42 @@ var ts; + var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames; + return ts.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0 /* Comparison.EqualTo */; + } ++ /** ++ * @internal ++ */ ++ function getPnpTypeRoots(currentDirectory) { ++ var pnpapi = getPnpApi(currentDirectory); ++ if (!pnpapi) { ++ return []; ++ } ++ // Some TS consumers pass relative paths that aren't normalized ++ currentDirectory = ts.sys.resolvePath(currentDirectory); ++ var currentPackage = pnpapi.findPackageLocator("".concat(currentDirectory, "/")); ++ if (!currentPackage) { ++ return []; ++ } ++ var packageDependencies = pnpapi.getPackageInformation(currentPackage).packageDependencies; ++ var typeRoots = []; ++ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) { ++ var _b = _a[_i], name = _b[0], referencish = _b[1]; ++ // eslint-disable-next-line no-null/no-null ++ if (name.startsWith(typesPackagePrefix) && referencish !== null) { ++ var dependencyLocator = pnpapi.getLocator(name, referencish); ++ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation; ++ typeRoots.push(ts.getDirectoryPath(packageLocation)); ++ } ++ } ++ return typeRoots; ++ } ++ ts.getPnpTypeRoots = getPnpTypeRoots; ++ var typesPackagePrefix = "@types/"; ++ function getDefaultTypeRoots(currentDirectory, host) { ++ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host); ++ var pnpTypes = getPnpTypeRoots(currentDirectory); ++ if (nmTypes.length > 0 || pnpTypes.length > 0) { ++ return __spreadArray(__spreadArray([], nmTypes, true), pnpTypes, true); ++ } ++ } + /** + * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. + * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups +@@ -43319,7 +43359,9 @@ var ts; + } + var result_4; + if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) { +- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); ++ var searchResult = getPnpApi(initialLocationForSecondaryLookup) ++ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined) ++ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); + result_4 = searchResult && searchResult.value; + } + else { +@@ -44044,7 +44086,9 @@ var ts; + if (traceEnabled) { + trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]); + } +- resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); ++ resolved_1 = getPnpApi(containingDirectory) ++ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) ++ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); + } + if (!resolved_1) + return undefined; +@@ -44989,6 +45033,14 @@ var ts; + } + function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) { + var candidate = ts.normalizePath(ts.combinePaths(nodeModulesDirectory, moduleName)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, /* rest */ undefined, /* packageDirectory */ undefined); ++ } ++ function loadModuleFromPnpResolution(extensions, packageDirectory, rest, state, cache, redirectedReference) { ++ var candidate = ts.normalizePath(ts.combinePaths(packageDirectory, rest)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, /*moduleName*/ undefined, /*nodeModulesDirectory*/ undefined, /*nodeModulesDirectoryExists*/ true, state, cache, redirectedReference, candidate, rest, packageDirectory); ++ } ++ function loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, rest, packageDirectory) { ++ var _a; + // First look for a nested package.json, as in `node_modules/foo/bar/package.json`. + var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state); + // But only if we're not respecting export maps (if we are, we might redirect around this location) +@@ -45002,7 +45054,9 @@ var ts; + return withPackageId(packageInfo, fromDirectory); + } + } +- var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageName; ++ if (rest === undefined) ++ (_a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest); + var loader = function (extensions, candidate, onlyRecordFailures, state) { + var _a; + // package exports are higher priority than file/directory lookups (and, if there's exports present, blocks them) +@@ -45022,7 +45076,8 @@ var ts; + return withPackageId(packageInfo, pathAndExtension); + }; + if (rest !== "") { // If "rest" is empty, we just did this search above. +- var packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); ++ if (packageDirectory === undefined) ++ packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); + // Don't use a "types" or "main" from here because we're not loading the root, but a subdirectory -- just here for the packageId and path mappings. + packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state); + if (packageInfo && packageInfo.versionPaths) { +@@ -45209,6 +45264,58 @@ var ts; + function toSearchResult(value) { + return value !== undefined ? { value: value } : undefined; + } ++ /** ++ * We only allow PnP to be used as a resolution strategy if TypeScript ++ * itself is executed under a PnP runtime (and we only allow it to access ++ * the current PnP runtime, not any on the disk). This ensures that we ++ * don't execute potentially malicious code that didn't already have a ++ * chance to be executed (if we're running within the runtime, it means ++ * that the runtime has already been executed). ++ * @internal ++ */ ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function loadPnpPackageResolution(packageName, containingDirectory) { ++ try { ++ var resolution = getPnpApi(containingDirectory).resolveToUnqualified(packageName, "".concat(containingDirectory, "/"), { considerBuiltins: false }); ++ return ts.normalizeSlashes(resolution).replace(/\/$/, ""); ++ } ++ catch (_a) { ++ // Nothing to do ++ } ++ } ++ function loadPnpTypePackageResolution(packageName, containingDirectory) { ++ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory); ++ } ++ /* @internal */ ++ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) { ++ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory); ++ var packageFullResolution = packageResolution ++ ? loadModuleFromPnpResolution(extensions, packageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ var resolved; ++ if (packageFullResolution) { ++ resolved = packageFullResolution; ++ } ++ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) { ++ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory); ++ var typePackageFullResolution = typePackageResolution ++ ? loadModuleFromPnpResolution(Extensions.DtsOnly, typePackageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ if (typePackageFullResolution) { ++ resolved = typePackageFullResolution; ++ } ++ } ++ if (resolved) { ++ return toSearchResult(resolved); ++ } ++ } + })(ts || (ts = {})); + /* @internal */ + var ts; +@@ -116980,6 +117087,8 @@ var ts; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Partial"] = 1] = "Partial"; + /** Reload completely by re-reading contents of config file from disk and updating program */ + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Full"] = 2] = "Full"; ++ /** Reload the resolutions */ ++ ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Resolutions"] = 3] = "Resolutions"; + })(ConfigFileProgramReloadLevel = ts.ConfigFileProgramReloadLevel || (ts.ConfigFileProgramReloadLevel = {})); + /** + * Updates the map of shared extended config file watches with a new set of extended config files from a base config file of the project +@@ -124364,6 +124473,30 @@ var ts; + return undefined; + } + var parts = ts.getNodeModulePathParts(path); ++ var packageName; ++ if (!parts && typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ var pnpApi = findPnpApi(path); ++ var locator = pnpApi === null || pnpApi === void 0 ? void 0 : pnpApi.findPackageLocator(path); ++ // eslint-disable-next-line no-null/no-null ++ if (locator !== null && locator !== undefined) { ++ var sourceLocator = pnpApi.findPackageLocator("".concat(sourceDirectory, "/")); ++ // Don't use the package name when the imported file is inside ++ // the source directory (prefer a relative path instead) ++ if (locator === sourceLocator) { ++ return undefined; ++ } ++ var information = pnpApi.getPackageInformation(locator); ++ packageName = locator.name; ++ parts = { ++ topLevelNodeModulesIndex: undefined, ++ topLevelPackageNameIndex: undefined, ++ // The last character from packageLocation is the trailing "/", we want to point to it ++ packageRootIndex: information.packageLocation.length - 1, ++ fileNameIndex: path.lastIndexOf("/"), ++ }; ++ } ++ } + if (!parts) { + return undefined; + } +@@ -124403,18 +124536,24 @@ var ts; + if (isRedirect && !isPackageRootPath) { + return undefined; + } +- var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); +- // Get a path that's relative to node_modules or the importing file's path +- // if node_modules folder is in this folder or any of its parent folders, no need to keep it. +- var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); +- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { +- return undefined; ++ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they ++ // are located in a weird path apparently outside of the source directory ++ if (typeof process.versions.pnp === "undefined") { ++ var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); ++ // Get a path that's relative to node_modules or the importing file's path ++ // if node_modules folder is in this folder or any of its parent folders, no need to keep it. ++ var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); ++ if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { ++ return undefined; ++ } + } + // If the module was found in @types, get the actual Node package name +- var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); +- var packageName = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); ++ var nodeModulesDirectoryName = typeof packageName !== "undefined" ++ ? packageName + moduleSpecifier.substring(parts.packageRootIndex) ++ : moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); ++ var packageNameFromPath = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); + // For classic resolution, only allow importing from node_modules/@types, not other node_modules +- return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? undefined : packageName; ++ return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageNameFromPath === nodeModulesDirectoryName ? undefined : packageNameFromPath; + function tryDirectoryWithPackageJson(packageRootIndex) { + var _a, _b; + var packageRootPath = path.substring(0, packageRootIndex); +@@ -125311,6 +125450,10 @@ var ts; + if (configFileName) { + configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); + } ++ var pnpFileWatcher; ++ if (typeof process.versions.pnp !== "undefined") { ++ pnpFileWatcher = watchFile(require.resolve("pnpapi"), scheduleResolutionReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); ++ } + var compilerHost = ts.createCompilerHostFromProgramHost(host, function () { return compilerOptions; }, directoryStructureHost); + ts.setGetSourceFileAsHashVersioned(compilerHost, host); + // Members for CompilerHost +@@ -125393,6 +125536,10 @@ var ts; + configFileWatcher.close(); + configFileWatcher = undefined; + } ++ if (pnpFileWatcher) { ++ pnpFileWatcher.close(); ++ pnpFileWatcher = undefined; ++ } + extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear(); + extendedConfigCache = undefined; + if (sharedExtendedConfigFileWatchers) { +@@ -125425,7 +125572,8 @@ var ts; + function getCurrentProgram() { + return builderProgram && builderProgram.getProgramOrUndefined(); + } +- function synchronizeProgram() { ++ function synchronizeProgram(forceAllFilesAsInvalidated) { ++ if (forceAllFilesAsInvalidated === void 0) { forceAllFilesAsInvalidated = false; } + writeLog("Synchronizing program"); + clearInvalidateResolutionsOfFailedLookupLocations(); + var program = getCurrentBuilderProgram(); +@@ -125436,7 +125584,7 @@ var ts; + } + } + // All resolutions are invalid if user provided resolutions +- var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution); ++ var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || forceAllFilesAsInvalidated); + if (ts.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { + if (hasChangedConfigFileParsingErrors) { + if (reportFileChangeDetectedOnCreateProgram) { +@@ -125644,6 +125792,12 @@ var ts; + reloadLevel = ts.ConfigFileProgramReloadLevel.Full; + scheduleProgramUpdate(); + } ++ function scheduleResolutionReload() { ++ writeLog("Clearing resolutions"); ++ resolutionCache.clear(); ++ reloadLevel = ts.ConfigFileProgramReloadLevel.Resolutions; ++ scheduleProgramUpdate(); ++ } + function updateProgramWithWatchStatus() { + timerToUpdateProgram = undefined; + reportFileChangeDetectedOnCreateProgram = true; +@@ -125659,6 +125813,10 @@ var ts; + ts.perfLogger.logStartUpdateProgram("FullConfigReload"); + reloadConfigFile(); + break; ++ case ts.ConfigFileProgramReloadLevel.Resolutions: ++ ts.perfLogger.logStartUpdateProgram("SynchronizeProgramWithResolutions"); ++ synchronizeProgram(/*forceAllFilesAsInvalidated*/ true); ++ break; + default: + ts.perfLogger.logStartUpdateProgram("SynchronizeProgram"); + synchronizeProgram(); +@@ -132005,7 +132163,7 @@ var ts; + * Don't include something from a `node_modules` that isn't actually reachable by a global import. + * A relative import to node_modules is usually a bad idea. + */ +- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) { + // If it's in a `node_modules` but is not reachable from here via a global import, don't bother. + var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === "node_modules" ? ancestor : undefined; }); + var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules)); +@@ -132013,6 +132171,33 @@ var ts; + || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent) + || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent)); + } ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function isImportablePathPnp(fromPath, toPath) { ++ var pnpApi = getPnpApi(fromPath); ++ var fromLocator = pnpApi.findPackageLocator(fromPath); ++ var toLocator = pnpApi.findPackageLocator(toPath); ++ // eslint-disable-next-line no-null/no-null ++ if (toLocator === null) { ++ return false; ++ } ++ var fromInfo = pnpApi.getPackageInformation(fromLocator); ++ var toReference = fromInfo.packageDependencies.get(toLocator.name); ++ return toReference === toLocator.reference; ++ } ++ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ if (getPnpApi(fromPath)) { ++ return isImportablePathPnp(fromPath, toPath); ++ } ++ else { ++ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath); ++ } ++ } + function forEachExternalModuleToImportFrom(program, host, preferences, useAutoImportProvider, cb) { + var _a, _b; + var useCaseSensitiveFileNames = ts.hostUsesCaseSensitiveFileNames(host); +@@ -133922,6 +134107,7 @@ var ts; + * This includes all files that are found in node_modules/moduleName/ with acceptable file extensions + */ + function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, compilerOptions, host, includeExtensionsOption, typeChecker) { ++ var _a, _b; + var baseUrl = compilerOptions.baseUrl, paths = compilerOptions.paths; + var result = createNameAndKindSet(); + var extensionOptions = getExtensionOptions(compilerOptions, includeExtensionsOption); +@@ -133934,8 +134120,8 @@ var ts; + } + } + var fragmentDirectory = getFragmentDirectory(fragment); +- for (var _i = 0, _a = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _a.length; _i++) { +- var ambientName = _a[_i]; ++ for (var _i = 0, _c = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _c.length; _i++) { ++ var ambientName = _c[_i]; + result.add(nameAndKind(ambientName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined)); + } + getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, fragmentDirectory, extensionOptions, result); +@@ -133944,8 +134130,8 @@ var ts; + // (But do if we didn't find anything, e.g. 'package.json' missing.) + var foundGlobal = false; + if (fragmentDirectory === undefined) { +- for (var _b = 0, _c = enumerateNodeModulesVisibleToScript(host, scriptPath); _b < _c.length; _b++) { +- var moduleName = _c[_b]; ++ for (var _d = 0, _e = enumerateNodeModulesVisibleToScript(host, scriptPath); _d < _e.length; _d++) { ++ var moduleName = _e[_d]; + var moduleResult = nameAndKind(moduleName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined); + if (!result.has(moduleResult.name)) { + foundGlobal = true; +@@ -133960,7 +134146,22 @@ var ts; + getCompletionEntriesForDirectoryFragment(fragment, nodeModules, extensionOptions, host, /*exclude*/ undefined, result); + } + }; +- if (fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions)) { ++ var checkExports_1 = function (packageFile, packageDirectory, fragmentSubpath) { ++ var packageJson = ts.readJson(packageFile, host); ++ var exports = packageJson.exports; ++ if (exports) { ++ if (typeof exports !== "object" || exports === null) { // eslint-disable-line no-null/no-null ++ return true; // null exports or entrypoint only, no sub-modules available ++ } ++ var keys = ts.getOwnKeys(exports); ++ var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; ++ addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports[key], conditions_1)); }, ts.comparePatternKeys); ++ return true; ++ } ++ return false; ++ }; ++ var shouldCheckExports = fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions); ++ if (shouldCheckExports) { + var nodeModulesDirectoryLookup_1 = ancestorLookup; + ancestorLookup = function (ancestor) { + var components = ts.getPathComponents(fragment); +@@ -133979,23 +134180,46 @@ var ts; + var packageDirectory = ts.combinePaths(ancestor, "node_modules", packagePath); + var packageFile = ts.combinePaths(packageDirectory, "package.json"); + if (ts.tryFileExists(host, packageFile)) { +- var packageJson = ts.readJson(packageFile, host); +- var exports_1 = packageJson.exports; +- if (exports_1) { +- if (typeof exports_1 !== "object" || exports_1 === null) { // eslint-disable-line no-null/no-null +- return; // null exports or entrypoint only, no sub-modules available +- } +- var keys = ts.getOwnKeys(exports_1); +- var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); +- var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; +- addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports_1[key], conditions_1)); }, ts.comparePatternKeys); ++ var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); ++ if (checkExports_1(packageFile, packageDirectory, fragmentSubpath)) { + return; + } + } + return nodeModulesDirectoryLookup_1(ancestor); + }; + } +- ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ var pnpapi = (_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath); ++ if (pnpapi) { ++ // Splits a require request into its components, or return null if the request is a file path ++ var pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; ++ var dependencyNameMatch = fragment.match(pathRegExp); ++ if (dependencyNameMatch) { ++ var dependencyName = dependencyNameMatch[1], subPath = dependencyNameMatch[2]; ++ var unqualified = void 0; ++ try { ++ unqualified = pnpapi.resolveToUnqualified(dependencyName, scriptPath, { considerBuiltins: false }); ++ } ++ catch (_f) { ++ // It's fine if the resolution fails ++ } ++ if (unqualified) { ++ var packageDirectory = ts.normalizePath(unqualified); ++ var shouldGetCompletions = true; ++ if (shouldCheckExports) { ++ var packageFile = ts.combinePaths(packageDirectory, "package.json"); ++ if (ts.tryFileExists(host, packageFile) && checkExports_1(packageFile, packageDirectory, subPath)) { ++ shouldGetCompletions = false; ++ } ++ } ++ if (shouldGetCompletions) { ++ getCompletionEntriesForDirectoryFragment(subPath, packageDirectory, extensionOptions, host, /*exclude*/ undefined, result); ++ } ++ } ++ } ++ } ++ else { ++ ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ } + } + } + return ts.arrayFrom(result.values()); +@@ -134126,6 +134350,7 @@ var ts; + return addReplacementSpans(toComplete, range.pos + prefix.length, ts.arrayFrom(names.values())); + } + function getCompletionEntriesFromTypings(host, options, scriptPath, fragmentDirectory, extensionOptions, result) { ++ var _a, _b; + if (result === void 0) { result = createNameAndKindSet(); } + // Check for typings specified in compiler options + var seen = new ts.Map(); +@@ -134134,11 +134359,19 @@ var ts; + var root = typeRoots_1[_i]; + getCompletionEntriesFromDirectories(root); + } +- // Also get all @types typings installed in visible node_modules directories +- for (var _a = 0, _b = ts.findPackageJsons(scriptPath, host); _a < _b.length; _a++) { +- var packageJson = _b[_a]; +- var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); +- getCompletionEntriesFromDirectories(typesDir); ++ if ((_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath)) { ++ for (var _c = 0, _d = ts.getPnpTypeRoots(scriptPath); _c < _d.length; _c++) { ++ var root = _d[_c]; ++ getCompletionEntriesFromDirectories(root); ++ } ++ } ++ else { ++ // Also get all @types typings installed in visible node_modules directories ++ for (var _e = 0, _f = ts.findPackageJsons(scriptPath, host); _e < _f.length; _e++) { ++ var packageJson = _f[_e]; ++ var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); ++ getCompletionEntriesFromDirectories(typesDir); ++ } + } + return result; + function getCompletionEntriesFromDirectories(directory) { +@@ -164896,9 +165129,9 @@ var ts; + if (isTopLevelDeclarationStatement(statement) && + !isExported(sourceFile, statement, useEs6Exports) && + forEachTopLevelDeclaration(statement, function (d) { return needExport.has(ts.Debug.checkDefined(d.symbol)); })) { +- var exports = addExport(statement, useEs6Exports); +- if (exports) +- return exports; ++ var exports_1 = addExport(statement, useEs6Exports); ++ if (exports_1) ++ return exports_1; + } + return statement; + }); +diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js +index ed8f1cb72..444bf7b33 100644 +semver exclusivity >=4.8.1-rc +--- a/lib/typescriptServices.js ++++ b/lib/typescriptServices.js +@@ -7436,6 +7436,11 @@ var ts; + : new Buffer(input, encoding); + } + function isFileSystemCaseSensitive() { ++ // The PnP runtime is always case-sensitive ++ // @ts-ignore ++ if (process.versions.pnp) { ++ return true; ++ } + // win32\win64 are case insensitive platforms + if (platform === "win32" || platform === "win64") { + return false; +@@ -43158,18 +43163,17 @@ var ts; + ts.getEffectiveTypeRoots = getEffectiveTypeRoots; + /** + * Returns the path to every node_modules/@types directory from some ancestor directory. +- * Returns undefined if there are none. + */ +- function getDefaultTypeRoots(currentDirectory, host) { ++ function getNodeModulesTypeRoots(currentDirectory, host) { + if (!host.directoryExists) { + return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)]; + // And if it doesn't exist, tough. + } +- var typeRoots; ++ var typeRoots = []; + ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) { + var atTypes = ts.combinePaths(directory, nodeModulesAtTypes); + if (host.directoryExists(atTypes)) { +- (typeRoots || (typeRoots = [])).push(atTypes); ++ typeRoots.push(atTypes); + } + return undefined; + }); +@@ -43180,6 +43184,42 @@ var ts; + var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames; + return ts.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0 /* Comparison.EqualTo */; + } ++ /** ++ * @internal ++ */ ++ function getPnpTypeRoots(currentDirectory) { ++ var pnpapi = getPnpApi(currentDirectory); ++ if (!pnpapi) { ++ return []; ++ } ++ // Some TS consumers pass relative paths that aren't normalized ++ currentDirectory = ts.sys.resolvePath(currentDirectory); ++ var currentPackage = pnpapi.findPackageLocator("".concat(currentDirectory, "/")); ++ if (!currentPackage) { ++ return []; ++ } ++ var packageDependencies = pnpapi.getPackageInformation(currentPackage).packageDependencies; ++ var typeRoots = []; ++ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) { ++ var _b = _a[_i], name = _b[0], referencish = _b[1]; ++ // eslint-disable-next-line no-null/no-null ++ if (name.startsWith(typesPackagePrefix) && referencish !== null) { ++ var dependencyLocator = pnpapi.getLocator(name, referencish); ++ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation; ++ typeRoots.push(ts.getDirectoryPath(packageLocation)); ++ } ++ } ++ return typeRoots; ++ } ++ ts.getPnpTypeRoots = getPnpTypeRoots; ++ var typesPackagePrefix = "@types/"; ++ function getDefaultTypeRoots(currentDirectory, host) { ++ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host); ++ var pnpTypes = getPnpTypeRoots(currentDirectory); ++ if (nmTypes.length > 0 || pnpTypes.length > 0) { ++ return __spreadArray(__spreadArray([], nmTypes, true), pnpTypes, true); ++ } ++ } + /** + * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. + * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups +@@ -43319,7 +43359,9 @@ var ts; + } + var result_4; + if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) { +- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); ++ var searchResult = getPnpApi(initialLocationForSecondaryLookup) ++ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined) ++ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); + result_4 = searchResult && searchResult.value; + } + else { +@@ -44044,7 +44086,9 @@ var ts; + if (traceEnabled) { + trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]); + } +- resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); ++ resolved_1 = getPnpApi(containingDirectory) ++ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) ++ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); + } + if (!resolved_1) + return undefined; +@@ -44989,6 +45033,14 @@ var ts; + } + function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) { + var candidate = ts.normalizePath(ts.combinePaths(nodeModulesDirectory, moduleName)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, /* rest */ undefined, /* packageDirectory */ undefined); ++ } ++ function loadModuleFromPnpResolution(extensions, packageDirectory, rest, state, cache, redirectedReference) { ++ var candidate = ts.normalizePath(ts.combinePaths(packageDirectory, rest)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, /*moduleName*/ undefined, /*nodeModulesDirectory*/ undefined, /*nodeModulesDirectoryExists*/ true, state, cache, redirectedReference, candidate, rest, packageDirectory); ++ } ++ function loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, rest, packageDirectory) { ++ var _a; + // First look for a nested package.json, as in `node_modules/foo/bar/package.json`. + var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state); + // But only if we're not respecting export maps (if we are, we might redirect around this location) +@@ -45002,7 +45054,9 @@ var ts; + return withPackageId(packageInfo, fromDirectory); + } + } +- var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageName; ++ if (rest === undefined) ++ (_a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest); + var loader = function (extensions, candidate, onlyRecordFailures, state) { + var _a; + // package exports are higher priority than file/directory lookups (and, if there's exports present, blocks them) +@@ -45022,7 +45076,8 @@ var ts; + return withPackageId(packageInfo, pathAndExtension); + }; + if (rest !== "") { // If "rest" is empty, we just did this search above. +- var packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); ++ if (packageDirectory === undefined) ++ packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); + // Don't use a "types" or "main" from here because we're not loading the root, but a subdirectory -- just here for the packageId and path mappings. + packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state); + if (packageInfo && packageInfo.versionPaths) { +@@ -45209,6 +45264,58 @@ var ts; + function toSearchResult(value) { + return value !== undefined ? { value: value } : undefined; + } ++ /** ++ * We only allow PnP to be used as a resolution strategy if TypeScript ++ * itself is executed under a PnP runtime (and we only allow it to access ++ * the current PnP runtime, not any on the disk). This ensures that we ++ * don't execute potentially malicious code that didn't already have a ++ * chance to be executed (if we're running within the runtime, it means ++ * that the runtime has already been executed). ++ * @internal ++ */ ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function loadPnpPackageResolution(packageName, containingDirectory) { ++ try { ++ var resolution = getPnpApi(containingDirectory).resolveToUnqualified(packageName, "".concat(containingDirectory, "/"), { considerBuiltins: false }); ++ return ts.normalizeSlashes(resolution).replace(/\/$/, ""); ++ } ++ catch (_a) { ++ // Nothing to do ++ } ++ } ++ function loadPnpTypePackageResolution(packageName, containingDirectory) { ++ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory); ++ } ++ /* @internal */ ++ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) { ++ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory); ++ var packageFullResolution = packageResolution ++ ? loadModuleFromPnpResolution(extensions, packageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ var resolved; ++ if (packageFullResolution) { ++ resolved = packageFullResolution; ++ } ++ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) { ++ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory); ++ var typePackageFullResolution = typePackageResolution ++ ? loadModuleFromPnpResolution(Extensions.DtsOnly, typePackageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ if (typePackageFullResolution) { ++ resolved = typePackageFullResolution; ++ } ++ } ++ if (resolved) { ++ return toSearchResult(resolved); ++ } ++ } + })(ts || (ts = {})); + /* @internal */ + var ts; +@@ -116980,6 +117087,8 @@ var ts; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Partial"] = 1] = "Partial"; + /** Reload completely by re-reading contents of config file from disk and updating program */ + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Full"] = 2] = "Full"; ++ /** Reload the resolutions */ ++ ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Resolutions"] = 3] = "Resolutions"; + })(ConfigFileProgramReloadLevel = ts.ConfigFileProgramReloadLevel || (ts.ConfigFileProgramReloadLevel = {})); + /** + * Updates the map of shared extended config file watches with a new set of extended config files from a base config file of the project +@@ -124364,6 +124473,30 @@ var ts; + return undefined; + } + var parts = ts.getNodeModulePathParts(path); ++ var packageName; ++ if (!parts && typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ var pnpApi = findPnpApi(path); ++ var locator = pnpApi === null || pnpApi === void 0 ? void 0 : pnpApi.findPackageLocator(path); ++ // eslint-disable-next-line no-null/no-null ++ if (locator !== null && locator !== undefined) { ++ var sourceLocator = pnpApi.findPackageLocator("".concat(sourceDirectory, "/")); ++ // Don't use the package name when the imported file is inside ++ // the source directory (prefer a relative path instead) ++ if (locator === sourceLocator) { ++ return undefined; ++ } ++ var information = pnpApi.getPackageInformation(locator); ++ packageName = locator.name; ++ parts = { ++ topLevelNodeModulesIndex: undefined, ++ topLevelPackageNameIndex: undefined, ++ // The last character from packageLocation is the trailing "/", we want to point to it ++ packageRootIndex: information.packageLocation.length - 1, ++ fileNameIndex: path.lastIndexOf("/"), ++ }; ++ } ++ } + if (!parts) { + return undefined; + } +@@ -124403,18 +124536,24 @@ var ts; + if (isRedirect && !isPackageRootPath) { + return undefined; + } +- var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); +- // Get a path that's relative to node_modules or the importing file's path +- // if node_modules folder is in this folder or any of its parent folders, no need to keep it. +- var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); +- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { +- return undefined; ++ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they ++ // are located in a weird path apparently outside of the source directory ++ if (typeof process.versions.pnp === "undefined") { ++ var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); ++ // Get a path that's relative to node_modules or the importing file's path ++ // if node_modules folder is in this folder or any of its parent folders, no need to keep it. ++ var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); ++ if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { ++ return undefined; ++ } + } + // If the module was found in @types, get the actual Node package name +- var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); +- var packageName = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); ++ var nodeModulesDirectoryName = typeof packageName !== "undefined" ++ ? packageName + moduleSpecifier.substring(parts.packageRootIndex) ++ : moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); ++ var packageNameFromPath = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); + // For classic resolution, only allow importing from node_modules/@types, not other node_modules +- return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? undefined : packageName; ++ return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageNameFromPath === nodeModulesDirectoryName ? undefined : packageNameFromPath; + function tryDirectoryWithPackageJson(packageRootIndex) { + var _a, _b; + var packageRootPath = path.substring(0, packageRootIndex); +@@ -125311,6 +125450,10 @@ var ts; + if (configFileName) { + configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); + } ++ var pnpFileWatcher; ++ if (typeof process.versions.pnp !== "undefined") { ++ pnpFileWatcher = watchFile(require.resolve("pnpapi"), scheduleResolutionReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); ++ } + var compilerHost = ts.createCompilerHostFromProgramHost(host, function () { return compilerOptions; }, directoryStructureHost); + ts.setGetSourceFileAsHashVersioned(compilerHost, host); + // Members for CompilerHost +@@ -125393,6 +125536,10 @@ var ts; + configFileWatcher.close(); + configFileWatcher = undefined; + } ++ if (pnpFileWatcher) { ++ pnpFileWatcher.close(); ++ pnpFileWatcher = undefined; ++ } + extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear(); + extendedConfigCache = undefined; + if (sharedExtendedConfigFileWatchers) { +@@ -125425,7 +125572,8 @@ var ts; + function getCurrentProgram() { + return builderProgram && builderProgram.getProgramOrUndefined(); + } +- function synchronizeProgram() { ++ function synchronizeProgram(forceAllFilesAsInvalidated) { ++ if (forceAllFilesAsInvalidated === void 0) { forceAllFilesAsInvalidated = false; } + writeLog("Synchronizing program"); + clearInvalidateResolutionsOfFailedLookupLocations(); + var program = getCurrentBuilderProgram(); +@@ -125436,7 +125584,7 @@ var ts; + } + } + // All resolutions are invalid if user provided resolutions +- var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution); ++ var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || forceAllFilesAsInvalidated); + if (ts.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { + if (hasChangedConfigFileParsingErrors) { + if (reportFileChangeDetectedOnCreateProgram) { +@@ -125644,6 +125792,12 @@ var ts; + reloadLevel = ts.ConfigFileProgramReloadLevel.Full; + scheduleProgramUpdate(); + } ++ function scheduleResolutionReload() { ++ writeLog("Clearing resolutions"); ++ resolutionCache.clear(); ++ reloadLevel = ts.ConfigFileProgramReloadLevel.Resolutions; ++ scheduleProgramUpdate(); ++ } + function updateProgramWithWatchStatus() { + timerToUpdateProgram = undefined; + reportFileChangeDetectedOnCreateProgram = true; +@@ -125659,6 +125813,10 @@ var ts; + ts.perfLogger.logStartUpdateProgram("FullConfigReload"); + reloadConfigFile(); + break; ++ case ts.ConfigFileProgramReloadLevel.Resolutions: ++ ts.perfLogger.logStartUpdateProgram("SynchronizeProgramWithResolutions"); ++ synchronizeProgram(/*forceAllFilesAsInvalidated*/ true); ++ break; + default: + ts.perfLogger.logStartUpdateProgram("SynchronizeProgram"); + synchronizeProgram(); +@@ -132005,7 +132163,7 @@ var ts; + * Don't include something from a `node_modules` that isn't actually reachable by a global import. + * A relative import to node_modules is usually a bad idea. + */ +- function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ function isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath) { + // If it's in a `node_modules` but is not reachable from here via a global import, don't bother. + var toNodeModules = ts.forEachAncestorDirectory(toPath, function (ancestor) { return ts.getBaseFileName(ancestor) === "node_modules" ? ancestor : undefined; }); + var toNodeModulesParent = toNodeModules && ts.getDirectoryPath(getCanonicalFileName(toNodeModules)); +@@ -132013,6 +132171,33 @@ var ts; + || ts.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent) + || (!!globalCachePath && ts.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent)); + } ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function isImportablePathPnp(fromPath, toPath) { ++ var pnpApi = getPnpApi(fromPath); ++ var fromLocator = pnpApi.findPackageLocator(fromPath); ++ var toLocator = pnpApi.findPackageLocator(toPath); ++ // eslint-disable-next-line no-null/no-null ++ if (toLocator === null) { ++ return false; ++ } ++ var fromInfo = pnpApi.getPackageInformation(fromLocator); ++ var toReference = fromInfo.packageDependencies.get(toLocator.name); ++ return toReference === toLocator.reference; ++ } ++ function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) { ++ if (getPnpApi(fromPath)) { ++ return isImportablePathPnp(fromPath, toPath); ++ } ++ else { ++ return isImportablePathNode(fromPath, toPath, getCanonicalFileName, globalCachePath); ++ } ++ } + function forEachExternalModuleToImportFrom(program, host, preferences, useAutoImportProvider, cb) { + var _a, _b; + var useCaseSensitiveFileNames = ts.hostUsesCaseSensitiveFileNames(host); +@@ -133922,6 +134107,7 @@ var ts; + * This includes all files that are found in node_modules/moduleName/ with acceptable file extensions + */ + function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, mode, compilerOptions, host, includeExtensionsOption, typeChecker) { ++ var _a, _b; + var baseUrl = compilerOptions.baseUrl, paths = compilerOptions.paths; + var result = createNameAndKindSet(); + var extensionOptions = getExtensionOptions(compilerOptions, includeExtensionsOption); +@@ -133934,8 +134120,8 @@ var ts; + } + } + var fragmentDirectory = getFragmentDirectory(fragment); +- for (var _i = 0, _a = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _a.length; _i++) { +- var ambientName = _a[_i]; ++ for (var _i = 0, _c = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _c.length; _i++) { ++ var ambientName = _c[_i]; + result.add(nameAndKind(ambientName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined)); + } + getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, fragmentDirectory, extensionOptions, result); +@@ -133944,8 +134130,8 @@ var ts; + // (But do if we didn't find anything, e.g. 'package.json' missing.) + var foundGlobal = false; + if (fragmentDirectory === undefined) { +- for (var _b = 0, _c = enumerateNodeModulesVisibleToScript(host, scriptPath); _b < _c.length; _b++) { +- var moduleName = _c[_b]; ++ for (var _d = 0, _e = enumerateNodeModulesVisibleToScript(host, scriptPath); _d < _e.length; _d++) { ++ var moduleName = _e[_d]; + var moduleResult = nameAndKind(moduleName, "external module name" /* ScriptElementKind.externalModuleName */, /*extension*/ undefined); + if (!result.has(moduleResult.name)) { + foundGlobal = true; +@@ -133960,7 +134146,22 @@ var ts; + getCompletionEntriesForDirectoryFragment(fragment, nodeModules, extensionOptions, host, /*exclude*/ undefined, result); + } + }; +- if (fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions)) { ++ var checkExports_1 = function (packageFile, packageDirectory, fragmentSubpath) { ++ var packageJson = ts.readJson(packageFile, host); ++ var exports = packageJson.exports; ++ if (exports) { ++ if (typeof exports !== "object" || exports === null) { // eslint-disable-line no-null/no-null ++ return true; // null exports or entrypoint only, no sub-modules available ++ } ++ var keys = ts.getOwnKeys(exports); ++ var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; ++ addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports[key], conditions_1)); }, ts.comparePatternKeys); ++ return true; ++ } ++ return false; ++ }; ++ var shouldCheckExports = fragmentDirectory && isEmitModuleResolutionRespectingExportMaps(compilerOptions); ++ if (shouldCheckExports) { + var nodeModulesDirectoryLookup_1 = ancestorLookup; + ancestorLookup = function (ancestor) { + var components = ts.getPathComponents(fragment); +@@ -133979,23 +134180,46 @@ var ts; + var packageDirectory = ts.combinePaths(ancestor, "node_modules", packagePath); + var packageFile = ts.combinePaths(packageDirectory, "package.json"); + if (ts.tryFileExists(host, packageFile)) { +- var packageJson = ts.readJson(packageFile, host); +- var exports_1 = packageJson.exports; +- if (exports_1) { +- if (typeof exports_1 !== "object" || exports_1 === null) { // eslint-disable-line no-null/no-null +- return; // null exports or entrypoint only, no sub-modules available +- } +- var keys = ts.getOwnKeys(exports_1); +- var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); +- var conditions_1 = mode === ts.ModuleKind.ESNext ? ["node", "import", "types"] : ["node", "require", "types"]; +- addCompletionEntriesFromPathsOrExports(result, fragmentSubpath, packageDirectory, extensionOptions, host, keys, function (key) { return ts.singleElementArray(getPatternFromFirstMatchingCondition(exports_1[key], conditions_1)); }, ts.comparePatternKeys); ++ var fragmentSubpath = components.join("/") + (components.length && ts.hasTrailingDirectorySeparator(fragment) ? "/" : ""); ++ if (checkExports_1(packageFile, packageDirectory, fragmentSubpath)) { + return; + } + } + return nodeModulesDirectoryLookup_1(ancestor); + }; + } +- ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ var pnpapi = (_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath); ++ if (pnpapi) { ++ // Splits a require request into its components, or return null if the request is a file path ++ var pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; ++ var dependencyNameMatch = fragment.match(pathRegExp); ++ if (dependencyNameMatch) { ++ var dependencyName = dependencyNameMatch[1], subPath = dependencyNameMatch[2]; ++ var unqualified = void 0; ++ try { ++ unqualified = pnpapi.resolveToUnqualified(dependencyName, scriptPath, { considerBuiltins: false }); ++ } ++ catch (_f) { ++ // It's fine if the resolution fails ++ } ++ if (unqualified) { ++ var packageDirectory = ts.normalizePath(unqualified); ++ var shouldGetCompletions = true; ++ if (shouldCheckExports) { ++ var packageFile = ts.combinePaths(packageDirectory, "package.json"); ++ if (ts.tryFileExists(host, packageFile) && checkExports_1(packageFile, packageDirectory, subPath)) { ++ shouldGetCompletions = false; ++ } ++ } ++ if (shouldGetCompletions) { ++ getCompletionEntriesForDirectoryFragment(subPath, packageDirectory, extensionOptions, host, /*exclude*/ undefined, result); ++ } ++ } ++ } ++ } ++ else { ++ ts.forEachAncestorDirectory(scriptPath, ancestorLookup); ++ } + } + } + return ts.arrayFrom(result.values()); +@@ -134126,6 +134350,7 @@ var ts; + return addReplacementSpans(toComplete, range.pos + prefix.length, ts.arrayFrom(names.values())); + } + function getCompletionEntriesFromTypings(host, options, scriptPath, fragmentDirectory, extensionOptions, result) { ++ var _a, _b; + if (result === void 0) { result = createNameAndKindSet(); } + // Check for typings specified in compiler options + var seen = new ts.Map(); +@@ -134134,11 +134359,19 @@ var ts; + var root = typeRoots_1[_i]; + getCompletionEntriesFromDirectories(root); + } +- // Also get all @types typings installed in visible node_modules directories +- for (var _a = 0, _b = ts.findPackageJsons(scriptPath, host); _a < _b.length; _a++) { +- var packageJson = _b[_a]; +- var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); +- getCompletionEntriesFromDirectories(typesDir); ++ if ((_b = (_a = require("module")).findPnpApi) === null || _b === void 0 ? void 0 : _b.call(_a, scriptPath)) { ++ for (var _c = 0, _d = ts.getPnpTypeRoots(scriptPath); _c < _d.length; _c++) { ++ var root = _d[_c]; ++ getCompletionEntriesFromDirectories(root); ++ } ++ } ++ else { ++ // Also get all @types typings installed in visible node_modules directories ++ for (var _e = 0, _f = ts.findPackageJsons(scriptPath, host); _e < _f.length; _e++) { ++ var packageJson = _f[_e]; ++ var typesDir = ts.combinePaths(ts.getDirectoryPath(packageJson), "node_modules/@types"); ++ getCompletionEntriesFromDirectories(typesDir); ++ } + } + return result; + function getCompletionEntriesFromDirectories(directory) { +@@ -164896,9 +165129,9 @@ var ts; + if (isTopLevelDeclarationStatement(statement) && + !isExported(sourceFile, statement, useEs6Exports) && + forEachTopLevelDeclaration(statement, function (d) { return needExport.has(ts.Debug.checkDefined(d.symbol)); })) { +- var exports = addExport(statement, useEs6Exports); +- if (exports) +- return exports; ++ var exports_1 = addExport(statement, useEs6Exports); ++ if (exports_1) ++ return exports_1; + } + return statement; + }); +diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js +index 881dba5f4..ba9ea8034 100644 +semver exclusivity >=4.8.1-rc +--- a/lib/typingsInstaller.js ++++ b/lib/typingsInstaller.js +@@ -7231,6 +7231,11 @@ var ts; + : new Buffer(input, encoding); + } + function isFileSystemCaseSensitive() { ++ // The PnP runtime is always case-sensitive ++ // @ts-ignore ++ if (process.versions.pnp) { ++ return true; ++ } + // win32\win64 are case insensitive platforms + if (platform === "win32" || platform === "win64") { + return false; +@@ -42953,18 +42958,17 @@ var ts; + ts.getEffectiveTypeRoots = getEffectiveTypeRoots; + /** + * Returns the path to every node_modules/@types directory from some ancestor directory. +- * Returns undefined if there are none. + */ +- function getDefaultTypeRoots(currentDirectory, host) { ++ function getNodeModulesTypeRoots(currentDirectory, host) { + if (!host.directoryExists) { + return [ts.combinePaths(currentDirectory, nodeModulesAtTypes)]; + // And if it doesn't exist, tough. + } +- var typeRoots; ++ var typeRoots = []; + ts.forEachAncestorDirectory(ts.normalizePath(currentDirectory), function (directory) { + var atTypes = ts.combinePaths(directory, nodeModulesAtTypes); + if (host.directoryExists(atTypes)) { +- (typeRoots || (typeRoots = [])).push(atTypes); ++ typeRoots.push(atTypes); + } + return undefined; + }); +@@ -42975,6 +42979,42 @@ var ts; + var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames; + return ts.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0 /* Comparison.EqualTo */; + } ++ /** ++ * @internal ++ */ ++ function getPnpTypeRoots(currentDirectory) { ++ var pnpapi = getPnpApi(currentDirectory); ++ if (!pnpapi) { ++ return []; ++ } ++ // Some TS consumers pass relative paths that aren't normalized ++ currentDirectory = ts.sys.resolvePath(currentDirectory); ++ var currentPackage = pnpapi.findPackageLocator("".concat(currentDirectory, "/")); ++ if (!currentPackage) { ++ return []; ++ } ++ var packageDependencies = pnpapi.getPackageInformation(currentPackage).packageDependencies; ++ var typeRoots = []; ++ for (var _i = 0, _a = Array.from(packageDependencies.entries()); _i < _a.length; _i++) { ++ var _b = _a[_i], name = _b[0], referencish = _b[1]; ++ // eslint-disable-next-line no-null/no-null ++ if (name.startsWith(typesPackagePrefix) && referencish !== null) { ++ var dependencyLocator = pnpapi.getLocator(name, referencish); ++ var packageLocation = pnpapi.getPackageInformation(dependencyLocator).packageLocation; ++ typeRoots.push(ts.getDirectoryPath(packageLocation)); ++ } ++ } ++ return typeRoots; ++ } ++ ts.getPnpTypeRoots = getPnpTypeRoots; ++ var typesPackagePrefix = "@types/"; ++ function getDefaultTypeRoots(currentDirectory, host) { ++ var nmTypes = getNodeModulesTypeRoots(currentDirectory, host); ++ var pnpTypes = getPnpTypeRoots(currentDirectory); ++ if (nmTypes.length > 0 || pnpTypes.length > 0) { ++ return __spreadArray(__spreadArray([], nmTypes, true), pnpTypes, true); ++ } ++ } + /** + * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. + * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups +@@ -43114,7 +43154,9 @@ var ts; + } + var result_4; + if (!ts.isExternalModuleNameRelative(typeReferenceDirectiveName)) { +- var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); ++ var searchResult = getPnpApi(initialLocationForSecondaryLookup) ++ ? tryLoadModuleUsingPnpResolution(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined) ++ : loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, /*cache*/ undefined, /*redirectedReference*/ undefined); + result_4 = searchResult && searchResult.value; + } + else { +@@ -43839,7 +43881,9 @@ var ts; + if (traceEnabled) { + trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions]); + } +- resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); ++ resolved_1 = getPnpApi(containingDirectory) ++ ? tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) ++ : loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference); + } + if (!resolved_1) + return undefined; +@@ -44784,6 +44828,14 @@ var ts; + } + function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) { + var candidate = ts.normalizePath(ts.combinePaths(nodeModulesDirectory, moduleName)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, /* rest */ undefined, /* packageDirectory */ undefined); ++ } ++ function loadModuleFromPnpResolution(extensions, packageDirectory, rest, state, cache, redirectedReference) { ++ var candidate = ts.normalizePath(ts.combinePaths(packageDirectory, rest)); ++ return loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, /*moduleName*/ undefined, /*nodeModulesDirectory*/ undefined, /*nodeModulesDirectoryExists*/ true, state, cache, redirectedReference, candidate, rest, packageDirectory); ++ } ++ function loadModuleFromSpecificNodeModulesDirectoryImpl(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference, candidate, rest, packageDirectory) { ++ var _a; + // First look for a nested package.json, as in `node_modules/foo/bar/package.json`. + var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state); + // But only if we're not respecting export maps (if we are, we might redirect around this location) +@@ -44797,7 +44849,9 @@ var ts; + return withPackageId(packageInfo, fromDirectory); + } + } +- var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageName; ++ if (rest === undefined) ++ (_a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest); + var loader = function (extensions, candidate, onlyRecordFailures, state) { + var _a; + // package exports are higher priority than file/directory lookups (and, if there's exports present, blocks them) +@@ -44817,7 +44871,8 @@ var ts; + return withPackageId(packageInfo, pathAndExtension); + }; + if (rest !== "") { // If "rest" is empty, we just did this search above. +- var packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); ++ if (packageDirectory === undefined) ++ packageDirectory = ts.combinePaths(nodeModulesDirectory, packageName); + // Don't use a "types" or "main" from here because we're not loading the root, but a subdirectory -- just here for the packageId and path mappings. + packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state); + if (packageInfo && packageInfo.versionPaths) { +@@ -45004,6 +45059,58 @@ var ts; + function toSearchResult(value) { + return value !== undefined ? { value: value } : undefined; + } ++ /** ++ * We only allow PnP to be used as a resolution strategy if TypeScript ++ * itself is executed under a PnP runtime (and we only allow it to access ++ * the current PnP runtime, not any on the disk). This ensures that we ++ * don't execute potentially malicious code that didn't already have a ++ * chance to be executed (if we're running within the runtime, it means ++ * that the runtime has already been executed). ++ * @internal ++ */ ++ function getPnpApi(path) { ++ var findPnpApi = require("module").findPnpApi; ++ if (findPnpApi === undefined) { ++ return undefined; ++ } ++ return findPnpApi("".concat(path, "/")); ++ } ++ function loadPnpPackageResolution(packageName, containingDirectory) { ++ try { ++ var resolution = getPnpApi(containingDirectory).resolveToUnqualified(packageName, "".concat(containingDirectory, "/"), { considerBuiltins: false }); ++ return ts.normalizeSlashes(resolution).replace(/\/$/, ""); ++ } ++ catch (_a) { ++ // Nothing to do ++ } ++ } ++ function loadPnpTypePackageResolution(packageName, containingDirectory) { ++ return loadPnpPackageResolution(getTypesPackageName(packageName), containingDirectory); ++ } ++ /* @internal */ ++ function tryLoadModuleUsingPnpResolution(extensions, moduleName, containingDirectory, state, cache, redirectedReference) { ++ var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest; ++ var packageResolution = loadPnpPackageResolution(packageName, containingDirectory); ++ var packageFullResolution = packageResolution ++ ? loadModuleFromPnpResolution(extensions, packageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ var resolved; ++ if (packageFullResolution) { ++ resolved = packageFullResolution; ++ } ++ else if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) { ++ var typePackageResolution = loadPnpTypePackageResolution(packageName, containingDirectory); ++ var typePackageFullResolution = typePackageResolution ++ ? loadModuleFromPnpResolution(Extensions.DtsOnly, typePackageResolution, rest, state, cache, redirectedReference) ++ : undefined; ++ if (typePackageFullResolution) { ++ resolved = typePackageFullResolution; ++ } ++ } ++ if (resolved) { ++ return toSearchResult(resolved); ++ } ++ } + })(ts || (ts = {})); + /* @internal */ + var ts; +@@ -116775,6 +116882,8 @@ var ts; + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Partial"] = 1] = "Partial"; + /** Reload completely by re-reading contents of config file from disk and updating program */ + ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Full"] = 2] = "Full"; ++ /** Reload the resolutions */ ++ ConfigFileProgramReloadLevel[ConfigFileProgramReloadLevel["Resolutions"] = 3] = "Resolutions"; + })(ConfigFileProgramReloadLevel = ts.ConfigFileProgramReloadLevel || (ts.ConfigFileProgramReloadLevel = {})); + /** + * Updates the map of shared extended config file watches with a new set of extended config files from a base config file of the project +@@ -124159,6 +124268,30 @@ var ts; + return undefined; + } + var parts = ts.getNodeModulePathParts(path); ++ var packageName; ++ if (!parts && typeof process.versions.pnp !== "undefined") { ++ var findPnpApi = require("module").findPnpApi; ++ var pnpApi = findPnpApi(path); ++ var locator = pnpApi === null || pnpApi === void 0 ? void 0 : pnpApi.findPackageLocator(path); ++ // eslint-disable-next-line no-null/no-null ++ if (locator !== null && locator !== undefined) { ++ var sourceLocator = pnpApi.findPackageLocator("".concat(sourceDirectory, "/")); ++ // Don't use the package name when the imported file is inside ++ // the source directory (prefer a relative path instead) ++ if (locator === sourceLocator) { ++ return undefined; ++ } ++ var information = pnpApi.getPackageInformation(locator); ++ packageName = locator.name; ++ parts = { ++ topLevelNodeModulesIndex: undefined, ++ topLevelPackageNameIndex: undefined, ++ // The last character from packageLocation is the trailing "/", we want to point to it ++ packageRootIndex: information.packageLocation.length - 1, ++ fileNameIndex: path.lastIndexOf("/"), ++ }; ++ } ++ } + if (!parts) { + return undefined; + } +@@ -124198,18 +124331,24 @@ var ts; + if (isRedirect && !isPackageRootPath) { + return undefined; + } +- var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); +- // Get a path that's relative to node_modules or the importing file's path +- // if node_modules folder is in this folder or any of its parent folders, no need to keep it. +- var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); +- if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { +- return undefined; ++ // If PnP is enabled the node_modules entries we'll get will always be relevant even if they ++ // are located in a weird path apparently outside of the source directory ++ if (typeof process.versions.pnp === "undefined") { ++ var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation(); ++ // Get a path that's relative to node_modules or the importing file's path ++ // if node_modules folder is in this folder or any of its parent folders, no need to keep it. ++ var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex)); ++ if (!(ts.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) { ++ return undefined; ++ } + } + // If the module was found in @types, get the actual Node package name +- var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); +- var packageName = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); ++ var nodeModulesDirectoryName = typeof packageName !== "undefined" ++ ? packageName + moduleSpecifier.substring(parts.packageRootIndex) ++ : moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1); ++ var packageNameFromPath = ts.getPackageNameFromTypesPackageName(nodeModulesDirectoryName); + // For classic resolution, only allow importing from node_modules/@types, not other node_modules +- return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? undefined : packageName; ++ return ts.getEmitModuleResolutionKind(options) === ts.ModuleResolutionKind.Classic && packageNameFromPath === nodeModulesDirectoryName ? undefined : packageNameFromPath; + function tryDirectoryWithPackageJson(packageRootIndex) { + var _a, _b; + var packageRootPath = path.substring(0, packageRootIndex); +@@ -125106,6 +125245,10 @@ var ts; + if (configFileName) { + configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); + } ++ var pnpFileWatcher; ++ if (typeof process.versions.pnp !== "undefined") { ++ pnpFileWatcher = watchFile(require.resolve("pnpapi"), scheduleResolutionReload, ts.PollingInterval.High, watchOptions, ts.WatchType.ConfigFile); ++ } + var compilerHost = ts.createCompilerHostFromProgramHost(host, function () { return compilerOptions; }, directoryStructureHost); + ts.setGetSourceFileAsHashVersioned(compilerHost, host); + // Members for CompilerHost +@@ -125188,6 +125331,10 @@ var ts; + configFileWatcher.close(); + configFileWatcher = undefined; + } ++ if (pnpFileWatcher) { ++ pnpFileWatcher.close(); ++ pnpFileWatcher = undefined; ++ } + extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear(); + extendedConfigCache = undefined; + if (sharedExtendedConfigFileWatchers) { +@@ -125220,7 +125367,8 @@ var ts; + function getCurrentProgram() { + return builderProgram && builderProgram.getProgramOrUndefined(); + } +- function synchronizeProgram() { ++ function synchronizeProgram(forceAllFilesAsInvalidated) { ++ if (forceAllFilesAsInvalidated === void 0) { forceAllFilesAsInvalidated = false; } + writeLog("Synchronizing program"); + clearInvalidateResolutionsOfFailedLookupLocations(); + var program = getCurrentBuilderProgram(); +@@ -125231,7 +125379,7 @@ var ts; + } + } + // All resolutions are invalid if user provided resolutions +- var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution); ++ var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || forceAllFilesAsInvalidated); + if (ts.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { + if (hasChangedConfigFileParsingErrors) { + if (reportFileChangeDetectedOnCreateProgram) { +@@ -125439,6 +125587,12 @@ var ts; + reloadLevel = ts.ConfigFileProgramReloadLevel.Full; + scheduleProgramUpdate(); + } ++ function scheduleResolutionReload() { ++ writeLog("Clearing resolutions"); ++ resolutionCache.clear(); ++ reloadLevel = ts.ConfigFileProgramReloadLevel.Resolutions; ++ scheduleProgramUpdate(); ++ } + function updateProgramWithWatchStatus() { + timerToUpdateProgram = undefined; + reportFileChangeDetectedOnCreateProgram = true; +@@ -125454,6 +125608,10 @@ var ts; + ts.perfLogger.logStartUpdateProgram("FullConfigReload"); + reloadConfigFile(); + break; ++ case ts.ConfigFileProgramReloadLevel.Resolutions: ++ ts.perfLogger.logStartUpdateProgram("SynchronizeProgramWithResolutions"); ++ synchronizeProgram(/*forceAllFilesAsInvalidated*/ true); ++ break; + default: + ts.perfLogger.logStartUpdateProgram("SynchronizeProgram"); + synchronizeProgram(); diff --git a/packages/plugin-compat/extra/typescript/patch-0ad2bcc0ccc8215627a8cd4aa3a323cb.diff b/packages/plugin-compat/extra/typescript/patch-a8939a35e0016b969b1bf3b4ca0f421a.diff similarity index 99% rename from packages/plugin-compat/extra/typescript/patch-0ad2bcc0ccc8215627a8cd4aa3a323cb.diff rename to packages/plugin-compat/extra/typescript/patch-a8939a35e0016b969b1bf3b4ca0f421a.diff index f417f16806db..74513f7d80a1 100644 --- a/packages/plugin-compat/extra/typescript/patch-0ad2bcc0ccc8215627a8cd4aa3a323cb.diff +++ b/packages/plugin-compat/extra/typescript/patch-a8939a35e0016b969b1bf3b4ca0f421a.diff @@ -1,6 +1,6 @@ diff --git a/lib/tsc.js b/lib/tsc.js index ddac1f06e..3e8ea9ec0 100644 -semver exclusivity >=4.8.0-beta +semver exclusivity >=4.8.0-beta <4.8.1-rc --- a/lib/tsc.js +++ b/lib/tsc.js @@ -4550,6 +4550,9 @@ var ts; @@ -304,7 +304,7 @@ semver exclusivity >=4.8.0-beta synchronizeProgram(); diff --git a/lib/tsserver.js b/lib/tsserver.js index 3ab7d98ba..4b6dbe734 100644 -semver exclusivity >=4.8.0-beta +semver exclusivity >=4.8.0-beta <4.8.1-rc --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -7148,6 +7148,11 @@ var ts; @@ -1012,7 +1012,7 @@ semver exclusivity >=4.8.0-beta // We have to schedule this event to the next tick diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index 5ba14d9ce..bd17c80a6 100644 -semver exclusivity >=4.8.0-beta +semver exclusivity >=4.8.0-beta <4.8.1-rc --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -7342,6 +7342,11 @@ var ts; @@ -1696,7 +1696,7 @@ semver exclusivity >=4.8.0-beta var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = new ts.Map()); diff --git a/lib/typescript.js b/lib/typescript.js index 3881df0d0..59b050376 100644 -semver exclusivity >=4.8.0-beta +semver exclusivity >=4.8.0-beta <4.8.1-rc --- a/lib/typescript.js +++ b/lib/typescript.js @@ -7333,6 +7333,11 @@ var ts; @@ -2276,7 +2276,7 @@ semver exclusivity >=4.8.0-beta }); diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index a856d881b..3a60baf6f 100644 -semver exclusivity >=4.8.0-beta +semver exclusivity >=4.8.0-beta <4.8.1-rc --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -7333,6 +7333,11 @@ var ts; @@ -2856,7 +2856,7 @@ semver exclusivity >=4.8.0-beta }); diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js index c8b3e29f4..8176d8d64 100644 -semver exclusivity >=4.8.0-beta +semver exclusivity >=4.8.0-beta <4.8.1-rc --- a/lib/typingsInstaller.js +++ b/lib/typingsInstaller.js @@ -7128,6 +7128,11 @@ var ts; diff --git a/packages/plugin-compat/sources/patches/typescript.patch.ts b/packages/plugin-compat/sources/patches/typescript.patch.ts index 1bb4cac9a3d8..75219bf2a1cb 100644 --- a/packages/plugin-compat/sources/patches/typescript.patch.ts +++ b/packages/plugin-compat/sources/patches/typescript.patch.ts @@ -2,7 +2,7 @@ let patch: string; export function getPatch() { if (typeof patch === `undefined`) - patch = require(`zlib`).brotliDecompressSync(Buffer.from(`m/HeG1HktgFU2009LlML2K3wbht8rnXF03SVHSBVb6bUwIJ/X0CPw40xECizvpKcRcKWansp3DpGvMOmCfX1cSwYSTU897x3/dUiIRj6qdVoSiBOoXoNNrhqwKhhnuLKYzT59P10Oq0qXxDajWhLOofkc8GW7/2vYK6AtGTLCpDFavr6bogekTli/vkbZYGLaFta32u59++9nB7UmFK1rcl3I0t0YzBh3+eQxvfLafdcTn9ZSmUtsGfJ4bJLOAGrzby6KLfLDdIzo9AcPu/2LtOjk0IoySWXu+C0WsTK77K5vYzHTWtF0YheJ2TH515eBJNf4L85Udm6MhhVg+kJHVn1Ax96kOVBjhMBVSfCoydTZKtdIHiJpNjCWoXJ3hX0B2Shjur37y/7N53RZwNS9IJQa96AgSBzbi/1PlWn9Jpkq1vSeq3RfECqOlXnNkrvacB/NB8AIgNgEjlJOTdncesBR16OfmTAlQP+NFev3V4Bs6Xsp8zHXMmtEWVh2zOi5bxkZo5pr8w+NDNFlqQqFAutk8nkcPdj9mNS3JQVqQrh+n/TKuk+3YS7c6vab1W1qX5fkG55DSHdgDlkAk52qWb2Fi1yjLNOPZfgoZn1dIkdIDY0NjSbXkCQzXD3Sho5SCOHKolUSQ4ttVOgB//yVy/JnNAb/ACevxH+WgUX0QphdywlXW/yqFP7//umn4YtlfuXjnc80rfNnXYq0sD5vnaMorUx91wQsbiGphpsdoHOwBtEM7UXkzGt89eqMgIEiApYaf/qD5l+7V/jtgpZZgCJsfcKllP0LR0CGwUV7a6SD1AgU/QOZyyyVlsn20KGlxDUf8a00pvJ9myNCkgTEL6UAd+ZjIl1/9qAGIYENI4Gfe9PXiOeYaN9CAd2rrF+mXKmdcJ+dlq2/q4g+96R3Pchf3z4T3Ujv3Z7tpO5M290+WBA1YM/xeS/cfH1H3jO9z741mq3bXgdrZpNW36d17TRBbWBevSlG8dPLYTHUzjD+nFIWn8+V0ot7aWg4O8o5vX6HGAcDFs5eycUcuSVpx75qFQ/RXi9Tca4QD/KylETS/umGeIQ8G9bjJErv0DtRlmVW0SzSfd+c/YYAoqCuRZN9PR0ChcdJZ/4Xe9L5K/KV+Yb92iA32Zk3x4VoHDZqLA0Nd+A/TdQfWKxQTqRWD71uf7ahnK2ONgQ0UX6rwlwXDy4V07Kl93TFjk9IOCB5x8TDS94HS//pDxkyJxmZFPE99ReXoqq7Wm+BLMkPSbgRLuoNaEnJtJ32Wt8r2wrlcPF7fzExwL5o4FCdpPl8VewnJ63JVYIV//gyVuSzsXrZarKzgVzPdCEXCzaQi7YC9u7zSHAYCU2fjE/byYpCTjidRaJgrJUR6qVtmLSgGtLwc3Fdb/Gl616n6FJvlQWksbf05OTWWU2SxlNBhH0pjcTlQm4FKv+eIwUBamHsKGqbRz7zNvxGAdYeT16gMQzn++aIKOMg94bztcikLxuc1poBlmy5AS31o84sqeT6qatSjfynZuqdznkfMSkIVM4A/qoYx7Qd32J49hrqAW+JD4ZA0diUUkEIapIWD9zWu93iFl/5+HJdkupCUAvIHM2XxWIRQokOMWUyuSBMi9hsMTcJYP6vLexRS4Gk4b7eyDH11vgqP/BL9XYskVJg3r/hKfJ/NGLxWJYVUI0I5yYjCy2ji6wnZqToXZUKH0aGiv7pfjUdzM3xJg5nHxxKiy+yAkWvmRqgd7fftpZSKPQ6oUScbFBySzKkU+BnbOMLYZIPioBDlGTy4i+JSBuD+yRoeL1NrYGrGAB7QmrDJ3e/p7iTn4eJ9TRAqg2zM2bs62ZMpKnpFTyUurERPCgXGI/6od+vi4kkMzc3yQEQjfZgCLzqG9wyMi3SsJRPQ85uuOw+czhgGRZPkflhw5AeXyU+T9/n6RWriqjn7bRWcQAfVF4rtJZxSxYXso/RitigrIvpLoLrfYVUcfD4VFC7zGn4eSehOttYCHDM8PS9bKpj0qYG82x8vN0Tse1yDsuROEdscukDogt11tS2A1Jzm/EqXe0yq+u2aSNa9uzLD6OFvkfYWMqSpSDWEwkd+M0542xiEYRElsL46UcAirEJo5W6zef/WHuzM+p7KtOo4nND4pCUynp1ZlTajcnTfkHkl9MULqpmKIQHB53Qn3MrY+1TTswYt3dduqrZ8Qyb3xKag6GOu24Bo2yUKKnT5juY44tw3WN7vmZLruz3c2uQWS35mPgtDjnq58EGVCc54uprYYSfaR+BhkFFVlQsFG9F9KLzxgr9nvNuhiK/HI1M0uf7keaOPHrNBLCuhhbY3b+ksaP3t0qnzrhlDRZbZWzuAuA36nw3JXzYUT2/LyJ4iJFafa5xBiv213183LO+Qf2gVbM1Wa9n3EtPZbODWPstH4907q0rxXGPb7tuLavRMqUl7RHLwhGI+7UP3AvmWtLLz1xMzvpcI8q45y7uIQFKrPjCg/xfDRwhwfLLCbKB8Nkfu05EoVLl1uWWjvU5E5CdONqIYgP7YXUip7WQEOuSovwt4BgQTm7lYwpXQYYoI+oZVJmXEi+nZWESYXt1sOulSfuJlzLUqcydQqCIUt6lcIBwutSuWTzkLly7lIb0Pdhsb0nBMTrpY0C+083mkBoD78loFRAkZBJg4CmZ2hdqaj6Upe5vMu9LAF75OKBWTlF+A4xZOpThuNrJ4XIj2ZTSTylSLIQJuGk4SeP2Mb1shmwzwQDAodyiSub+HKGC8Ikmx4kRvuCkEgV5YWxg0iX4Ol3SEmklDzyr6Lpue7+azX216b69P05p16rrt9foSzqHruEKiYvKl0G5tF/O0R8jkPDs9J5aP2XJ5KmT+4vgUH0k1reNF66LwViG5iLMNT1PVR5qBWupQtzkCSImDcq1wtmbefcK4P6ieLlkaDrPoi2yC3q04Cn/w4Ns83nqq7aBMby3v7Sug2iv282LUKWg77B6whpXlLffZWq9/pFAMpZJ2uygRjbLeuMdmaHNepp6bZ6L/98ey2Fmamnda6MYbujmfbES5Vq1n+t2Eg2aKZl/IjBG8T0sp+J+y/WNKyqrqJpqkRvi4iQruwqMYfLB1FZQy1AdWaFMp8TYS9DWzzxf6xkdRLYExg+9rDOurtz9y/M80RMODutTiLXm3d9o4r7RwkdcBlsaTH1zer4wAJPaP03VHUo6xqLyeOsznNluOUyuyd9MWzteb48wKkLVOdO1f/96LJ2n5vnfpgfDkb+P4qgJ7EKlbvaXUURwnOhR/+DTdy5YqCYDB+Ij4ayLixT6mSFLe9N8icyvBeS2sbf0PhZm3ocaL/h7NyqhqzVQOrXwA35nWh6T8mwF43TdGdJtPGfYZOqLTHJxlEWugl3AyzMF1MeqZcAh5X49sUUnSH65m7a/trEPzsfH6mXgRAET7NaK+uTObp4Zi47rBv2rzoy5H/1wqsFPe1zAbpKmc0qSbWob3E84LEn/0gwkqHcfT6SqSVQNafxHd/S+bRzcHJ8fPQPsg01H6xIzBpwsoHBr7PnNhTEwhJV0tQn+2e2tHIZTp2M+x9SBFbZf5LK5frMoLh5EQW3hT5eUBF0A+qYgxdQ1Vw9HQkXADhx4ZasaBWeaEZbu82FV7DsqxEAcOAkLfufgdQye76ngrleZZ/dSrv1Jh5Mvwzpb1O37D9HtXIVd0RcAACHRrYLp9F62ts1aO0jPQIAWmiFZkF6mc5TzVyfoDx2Cbcd+MG8jOfRPcLoZrpmRbACQDvf99d//fnjZfToM5gDZ6lyrnfPixYqb619hRui89+B9uAVtFdnjoQLAMygz25ReK7RmLZ2Hhfuxop9NQIAl3AlHNffe6S70S0Tv5MN+GbF1turkmYd2jYPR7kMAEBeKQL5/3Obf/+r64dvSjemHU3/szOCojp9dpQMhVLD9dABNjK5+2otdzD0vSEMz+KNxuXDUf4WAJBHibJ0omRjmtSZiYRvTpOtCJ3a67NP90HHO9syAYAJCpYXkvPitwwi8mctJ5VjbOIsZlRqtAUASuxtaTjsbaa9VOPIbqouAYAO87RG8l5LQez5vO370MbQaHQ8HOXYAgA6mfhGF4ZxZ0rt9RBTDndc1QgAVOIo0ZgF/AGNf7QMbt6FTb0cX8vzKgB0s9zSjK/x99iaua/lj4P+TNKjG1M7rZn3lWcLANwcG/lKw2Bvsu1HZcWxN/mNAEDOVZIxS0fHLH5e7i4YHb/idi3cpjIUxTsc5TIAAEmkB2qMm7Q/O8WX4arMWG83cc819rewi/Riqrcu71wu6X5A9Cze6dT04Sh/CwBIynKexrjHdjCKfHniAo219izetqOozAQALuwy4QJ8Ltq/OsnNc8vxHqcxqmnCBQBqwNNjCQ8Kb+LolNo33rYjFZcAwOYg+kueXNMFv/lh/LD9chwXKjfhAgBlvOlEpyR88SaKlNon3rYiFZsAwIT1gq0w/C78tb4p7cefxnflghUA1lluDpi+C5ru9bVO2Fey8CfuszT2KiVYPi4AcMfs3WjDfeyp5D7sqaoRABgW7kBQqAjn0OoqOWemcukxuJmXBP4cEoLZKH20h/XeA9HUuwYCfVPG70UF9iSMsR0mSUrQwACUdOSO8GQFuybC3BsLzd3ARuIrt+6zU6ETLhm4Gpj59TPKn2Fv6T1Sy8teqQ/ybtcLex9fdOGBz+KfKbhgXZgZ133Hpq/O3i9QbeZrjCrvAuM70piA80et8j4KTf3rtvOrRrPF7dtVxPr6YPA+mb2wRYII6Y/Jre3o7C1GEvTDzAZybiT33cEbGC5QefiocfmNGtftjZzTXYEkTPoL7xaWQa/qxUvYDOJAb/GLn125n+aUQAEyh4m3p+UV/YTaTXhYovCQI66tHxujfiCMYjXSlhlXDe24O9m5Z0/MPCdzOJ0y723j6moijtG5cN6xT9leacfvzWBSEJSiwV3abaJXTGoKtHppAQWap+jqFAE9JCYZ+nfYi4GFSh0PvrqfvnXnEBZQQPRmJ654TQD8fQ1cUmAdkVMi0p11RPyja6OvWQzhOTX2BN2x7naP44RHLN1NCb7D14LDFa90pfY8l7ijXv7EbeYkDGHpzrmXBkTprBBSGt00gzzuJFFzmGLay7A7zz5CW4kZo7SUBBYUV7Y57hcvA6ZA3vdTkMjCzL8ELIuQwgoOucX2Zd1oWkFNpKdDFH9z5hBMT4U3fXOPpuvDoGnnjBcIHT+Juc/erb4VO4/66+4gdT4J6c9/7VSZfLxXgL48+fnkdQk0cejgtd16J1IiULSgPW7mJHBEsh/p/LYWecyDsE5p4nIxK7lbuDWKh4GPE5TbixEvas78ZhmDicC7QPXRnOjT8UptXNvkay9nlFoifZGkFdkyk7dnCVRe90yO4/9EJrdTUWnW5l8vSuwWb5ByDCP00bq4qzvYH320A6WogHH1N/MDxoTeY0wswuHuOEqGH7ZaAgL+tN+E4nWguGtdDJEYF//rpMPgdfdGkKNo0ln+sIsefIy5sY+bW5Cr/dojAD0Xjb0GESAkdMcnRr/lw9E39dgF6AZEk2mkKmeY1DGaHUFm9pGbBpPnM6NE/6Jys4I1XQG8abwHKUuWW7EGeBKxdCcx3RCsg9KZLTPYkBlKYXBIzgGTRjflLn8lM+jTRNWjDSbVAUOFar4UE3Kox+UCGcySyUWW6rCPeF+a5+U6/CPem3/2ZCWy5O6HOgL9tVKGUs8zKGLRqV2S+Orad/HNOJQTsNYfQUny294Y0JLYLANMLEFcD0DQ72EGxYXztPLbuC7SeZVyya7AOz2yUgTvESGJsOu7s0gSX0kmCw9Q1XLI/NmvALF7UyaIVSXk4xyQIY2Li5sl7pK/qI6Uw3zT1hP2ZR3U4A8YrkE3XQr1nuzBHQvpMa+OcpixqY/PJCT7T/Vx6eF6Fxhj4iO70Yd2xAqsXhON24Jh2QVc0ir26IYQl9W4mHBNOAOWcLlXHhbGL/3s1mj25MLkkd7Ypw+rxGkviuHKglaSySVZfDKfSV9LiVKqaahUly2DfG3LqDa5X7uc/kl2lJJF3GkWsiroWQx9zS9GoxK+Lp0rZl7YvUtj3KWZG5utuO21a9RUDhWMdaV+BOywdOgFAkZQ4rYBhN2RssBDeQd4Pg+JqTVd+Fpt2B+WFcq05c+bJUqKpXT4qz5tRyNMFP5xLuMvKOKu8SULlLkS+mMH26DK8YmLmlvTg2WK1ugJftsiJ4xa7P3iEIwIX1Iedf4uJajNWraUyPrM3WZCi1wloMeEswc8yft6Os7M7ERXmhGgWIGbcCbjM7nMAICnQ0NTFl5PWWqPp63QBACim1Plc7jDOoEFz0k7LX3eMJHuWprSRnKQjcKhzuPKp5yZ9omrzYzqFGsdCNfMDABQnApFUun4KLV7ZfKdtkETAHAu7o4q38JF1wr0Mp7U9o1Bu3VPJeIJ6lY4UzPMD50zs7tcTAXgZjWxBREunDrD3/qZM7O5+zenGZUVaxk008gMAMxyJtRyWWHvq7WrPGWDJgBwpWuq8hDXUw+QIGvdshxk66/I/CIU8A9eIq/de8L/dQcVhJ+GSHlzEWs0AwAWUtXQTKhruzOn57qS3i5BtZvBfB3EF6O6eyzvBPaiFVD0zHGvfMeYUAQFK8o1N1MzOxjp9BrLqZjynqJCuyXZgWYzq5v8sc1RuaKir2m/7fZBxt0iFLNp4avJKFbztuBWt4hFqiP97BWm5QQUrFJENTz5JYwQc5b+j52Sp4r+6AxYVCoFPNlufWRAk/Bi1I2hHn3Recc+xQRdcLl+b92EOeisU/tXsXssuBsmokYicmsqChyqcc8F3HIaMl86KGWuSF+OlWNIQTg/enDPyjyY/aUGLCXh1lzvnvdGzX0H7w7ylAlsqRKM0uwMN8mThbJvVRi9TGq4MUs1PM06i3d2khBUpNm3ZX+6r2iKSUVFu3QgOgHsEf9r1m4tEh7Ca4o7HnwwSjuntK8ukHA84+iKYx1PH+TWQQnTcczAPZZdreOn1k0nASESi3bYrR1+W/2SfHWB4UOXwxbmtjntgnpXYVsDoPMhCFuiW23F/GviMiAO4VRrhRTee7keGGP3kbuLnRA/Bp8RI6wQUqgaJ6YhTuk+OJ5N6baIR2W/FsVEblF2s+mKkx3ETQY5tC+X4ivZvSfk0Hb7X7YUSyx9EMQG07MD9tPLTP3LGkGUB148WS9G5Keq0lNBsCpmAGCk54olfNZKL75zt9NnpwplbfqUVv8uEwCgDHOc0nJM/vAO7pT2Tl7MrzpKLGnEFNDH6t19ms+HMCftMbwkM54LInbW4Q/vdGR40A4IBsMogmeI+om46pmTVuV7jKw9FneIK9xw6frD4lC/JNskHNzPoUkq/cckUD83uN+/emk90q5X6QxKk7h7YWG1D8VucGY3FqB873v3ns/Gve61BYdTqIBD4X/3VpQfbXKODtwzgsSh14ZJ5SSzcTLCPxQHCAXIbaX/IcarelMl3X5WTaXYkW1tSUkyyVEUrd2u4mH1qrPUUxEorURCSJEVj7RO/krReAD9rdPVwYU9NXNFTbid8e2ghAZOXVzZ2bjxriK/dGbqLP2X7fPZ2ok6qW6xzp4LOLi2loaVOgF7xvm9B1L/2mHVux6OQ4V7+QewgBOHqLqs2XBZg2+I5oUXzy9/fQVQUkSseltQrFvlRiC7mRkAsHHjknA2lNIx1VRv78ENmzQBgAzo3HbvEui2GyUAcBc3RtUyuQPIGC1NV42MtcvHJqDwYOvywfbbn3aXFrG4uVUOQBkRElelJjsev5c7dfEI6eYzUWZEfOZPOQBlSMhdb7hs2rxqZO/i85HtInL5ETF7PWrhp6vrM4LwupMZAOAFonNJmFFR5NyJ3t7CHTZoAgAtbs657n6XMdJsEgBokLU2q9kNuvex5+XXjg+/mOv+r6n09aiFn4IYUI5EWmUGAIw+FW8UpRQh407NJ58ubBRo7KE+rWmuNd91fpGojf4SBZFcxjILf7Rnj5LRKLjBCKlF2NqXSrAtbuCRgraC7e4nnABs/0GDlsB0BgXA9Hq/HR66DN+A024cVnYxCF/nmuLkjluysmfGsCsQqOE3WqwbVsUMEf9U3GIkN4IMOQZlv6QbETIBkD0DkeREp4QfwIuOpMs089jyP9rRjM50MC1/ocBV0W7hIZJ194yNyy1j9147KKXqGT7VHjAY1wUKv3ZBh+dJ9N3yz6DSRZ1z/RMEG7RTbeDRsbvQQdejniffj/I+dO5xBUEd9xd1M+dd+AOO7G4zfKXDwEnu19D3kXdQ1zYIDH313EfWjni0aNfkHM97hc59A4gi1yOUDstCX1kgYyUyHboLAE62YTADm1bBmH4TGNzsJHFq/eXjPrii7p8/TAEAX6uTmdwX90lpsg5plJ6+Lm88rJ1c00SWSrWMa3qQDY+6nqcPc3vgaukIe4RN9ZbjexX7lbs1n/HAEobQLIPJx3FI/TlsMIjdYmFbjBP5Yi/pv0YwyYoWBAnpYJIJH9TQfJJ9aIeJMXxt3hPX6hinxY6YEq3F4jTSMMVVa96bcljAgYe0tCJz/Ufe+Fu85MRZOwE4OhNTFQ2iEydlsbLASL7kyMqK5FQptl91U1yJw9YOEMLuMbMJqkzxMlI2FQYOOjHeUKwqaQerEs2atkuuR68MGlRwCwfoJ26H1hXz/WaK3TG6kDF3L0IrzEgQAbdlUArZozAUzMUXd9bxwAVg0x/vVr3cC/sKrSkPnYyKfVOcYIdscF+sVO8pLPhssEk2V9cLFdUC0Ymx4AsROayY6yeUOCUBMdxzfZGT2qIVTWczNMIWQzbxiDJcz2cdrkdASqRCWwLedoG7QyUHyCSE5XQnZKCVOeOB+pY9IRvyQlWqn09MjY+mZwQcquSPZvld0SpOeRd50/Rk+nADJCjqURzlj4+9mIsd5UGvW0ITmoBx0DxiJ/H1I2SAFwfbggxyWSyYzav4siOSccbvTtXZoYuJ69NYxvlEAT885JK2o4q2KShupvDGzLt7t7G7lKl6bv6mMJucYFoxVHCmmKQMQUhknyiVSeSLNgcsGQMVJTJUFwP5LuPY8QWu5mJfYWyWaDuwt6UcbV02UzCkKODRo59nzaZdxyQiTiv9hKjTxX1kxe98r4GvjuY3EZfrxIzNqvGAsljmLvFhfag5nfJKwovFcnYFDJk7j23M57eg1EGY9pdMVewyi647Hhw7WHhGf+Qi2Asq9yOM5vUjdle+59KsmRQR5c8Uf33wzhW5hCsWH57PG2cr5OfYbclts47q0GI/CgnyfpvDOOGnAm2RoDgh/1xpjz1WutBYuK/kzbvMZJ4mzBfdZGL+4YoHb1Ba95kWdvAp4wchmjx25vjdIQifRrF00jwbYYavMZmLfw0wrZdXc5W8946lVI/3bjNgAnEpjxkA2FNmEEUpxf9rXKbi4LMoR0GpXZWq6U6Ba8oEAMTjm1I9VWdOcGnWlU5d/sr3LLASANcqaC3ekzm4hV59GTcUCYn7gKjDQDzHVDxJl/OEq5e6jr91hALV5bYTcaumKQAz65jK3/SJKc1chZ8DjR+8Exj1ARkuWK3ihGGIUJJDdA0DlCSzsG5IvP2rqL2Krmr+fnJ6RFsACG9ZanN1iTMAPuhS3DX2e1kAEWegIYm0u4RxKCJZsQ3bnpPkdibc9hYg05hCraJxizTVAsadrDsm3ivtRKtBjNRcb8ZvCOwURkscqZ8enH80DWI+1N9fbl1UtU/ilb9UXrMlDYDQh93T5grh+1qDed5QLZRAkKLJUCas/QTeqLLe3P7kOXHxweu2XTzmgkluu2UMyCKhXY8p+LNHsfpvwOQZ0G9U3qKKb6c9Y0Efj4pq0yb3jqbWZ4sVCLJ5Bw7Totx7aj5t3nmMFNifjD8vSU/tEEX/LBJ9t7PTX1On06fSZWYDeudA8wVJ8/lKC4J1j+i+RrUMaREpa7cg2nzcLe0G8MO4crJud4X8watgva3EuoSUtUk1ypn6V/lj8KTyP7LAjYYmQ7vloq79hDvNOuOdJMNouOBsLt08IDcHnOcWi/7Ky3pZt+joNgkrtnLFo9aynN/kjPMzWXX59lktBh676yDCeRTsc8QsMmxaZ75heHfuN8Jm21DNHl0OEVY2321rNBmeJjCNDX55Y/4Gq9AUHjjgsS9gDVsFkxdzK5oXYcZpyzj0fZJwADXs2Z+FVOhLe11mwG7bdimMHAYF0aJYHmdLTjN+fO+fC6aWvU5BxfQcFgwsB0L2w5lVYBuztgVEoWclW6Zc0/YSBRmaG3k4rbC4GS1bYnpH386faBuboeA0mRhWxuwVdOVdjnd3Hd6dEYdOtY6DHX2L/8obdOGV/RPRfm0WMFWIHmbCZnwmbct0JRkNeXUssdACZ/dNpbNsYh+oatzLn9WY3BLhUPztLswzrCUl+MTu2O86deF4JNXFMvDeaAgbM/DOaGA5uTfGs6u55AkpP+XrW3BHxqbskYR+OB6hgjhvbIq/ido2r7OTQV+5bZErl/AvH/WB+JGeNtDWNO97jbTL5ulrwxt+k2q1QZWsU2L7ubxww2nN6DpK+BATDpqvJpAz6U9CsV4pdE/ZspTA2wBfk4vvQM9N4yqIdRm8daHN2HmGV2Wm3nA/Zhy0ONfUGCkXV+KyoLHVG4VvSVwJeRY4aQAMVlw+JXbtq+l32GMvV8mJw2SC9HKaEzMi2A0NrLsg/1wxaesh4mJVbnpzH0FPJqG4RHwerVWlZfBJWJEa2DEhEQ9i31pg2nW7KGF62c3vuMzyFPv7cDFq4i9fLy+NCIZlAkJsAjdeNns0ABiaCkfOJ0XzpYzeK/bG7XPiZtemxSnDaTpLaVGknEIgAJsQ+68vTuN34Gl4wb5HcFXpbSGlgLEV8wS3KryylDG6jbxC2cXPGM2f1z2ewdcJv4Y/VYbGfKWvCW34WyvWhs++kvS5OyGnu9Pf+GCcE8U0e+q8MbiaTDiMcRFCAvHSGS66MDCG5huSi+FXOWPB8Y/kd79RAJ0xBmNHJ3SMrq1+Xdsscs0OajVolCYkzmQs713/fp0a59JJRT4JeJmOrkEPrAAlvvRkl9LU8vCODLLOgXEeoZDYEG/AO9vEj4Ik7PYrVu93/UNJeDwryd95Bnyy+NsXp8Ejoj5+mnpXlgJmWyKtYAYATp+53igqJtxvCkm8sljqw8K7zC62sT237OXTTADgmGfkPdhTsbkdmKtGb9fYtmf9AMDRIKVCeQjuE1/cYErFmQLL5S8LGDET7FZncw/GG99X81nualtSzWGoCltK6gSyK7MdAFeycA5UXbO9A8LoO02g3BWZhLYyNnwb+5bXBsuX8L3DPoLlPCxuroEEUHL/ajSPibeU2/dy8JXZDF16d8Tv4jN3QQIoIlHuZktl0fvZHe4laHmuttfoccx616dUr5s6DDCpiFUxAwAtZaajqBwsfbZPnM4O7h45Tthcr+HjBk0AgOBG9nSbBWhdp7fFuKuxHwBggdRaVBbUUn0KCKeMY5BK/5sBcTWDMa5pvHNB1lY5ZttDkw9iOFfIP9gJp6eBO2oR+WlI+3ICGorSSjMAwFKaiqLy5+jT04mgsbv1Qfsi1Obf+CVlNnNwz0Wj3SrH9Cb647oVEYfEk8e2OBYjl4FoGk8SbzcutPkE2xZE83dzvd2NP+jt3iOWCfXg978PL3YTxJfg4hE3JYnhK/OAl+pvpePDn2Ktb9VhvtdiynhYTwq2zbHfEiYylUfqtyRwRtiGD1vyNUMbC/VbwfKwCIbnSSvi9UtPSMn6eXcX8wuQp+Ntfm7surh3tnwF6zZS2IBVQ7A8ZgAgqJaUdUdRSdjSqyquzM5mu+hzuuW6MwEA8y6fIVfub7+Gci+9Hw4zcBys1439k+My+8VkyZY1v65V3A7HybXUhVdTx2q0G7dOmF9Wz7nFAMC2Ol7zMkqOU3fLZeVrP1W8DP+gq7r5Kr1WOSVilgLyN8VwZqENxNH8RsvwD7pA87UIOFAoDLmU99HD684JbWR7DQxLOkPA5tYkebrjpkMD9zr/KDNKBdCeTQVHAOhRL5uTApiqjTdnA8jAUJGmC/lb6JjV6MyXz8MpXtCe/jg9c1yPR/iplayn96e083iyxyt0rieLe2dhijBVFTYV/jQxAwDd0p0uM7Gj6vBlK6TXp5L73WvDa/cUrl2OJgCQySKgjZ4NIy/7wSM03co5wVw9LwgAgmbX1USCgpNZ5EA59kgdQAUxrQPs7MfoEC4VODokRblXS10zGQjS1SgF4doolzIDBeOWxTEw2Zp9FsxJ37cF0+mKrgQ6GdvpmJ27Rd35hSRDfPrK6ekhB0ECKL9/NbbWMauV0fxqhWN5Qt986vTskNMgARSUKHm3DsHkS/XVj5f49HUxzTpCkP/8W1vaNX+sWLWg6ipmAKCaGW4Et1wOlifs7VlqRz7LOXenSRMAwII0uo0KlNTKpbmJS6NBANABYbQoC1Sl+ghQWxm7QYj+F4IgzSAN4invBbK23PFBP7GncyKUoQ3MjoOpcBSokQAyx3fPpTQLCoXZ10gwbRffQQXCGOyWSNSgf64eFRXP/UviQ1KqFRFUx4gb/pCxqBehV5Y2O9nPQzuWxj/WbWUTB5oXwmavc4BNGAqC2oUUYPnFnh6waZGm3Y2Z+C5THZSGN3VwV9zc0wOZN9gDfVGT0p6Dp5Txq4x2S5p7uPGOnCUq8Ib0iOP8EZjbcXEQVFKM5+NyYYRGtOyMtmlsf/9WLZa+3udecydrnAtQptMVzAIYR3TS4kJKdy3j50aA+SWSZ19e6D424soiBOHsd0gej7/yxwVPauR3dahsOUiyLD68qGL1Y8Fk4Gd/QlhFD4TmgQ2nk1FlagBNK5+0wMpZo0Jhu+sTduKubKsptCEIVj5+k1/ApiaXZRCTU1GBWZGMDMMlp18y1RfAQLojvgmTaUmGx8i0NigTcYyCPPSu0k89uvyhhWUVwmnzB6yyH3dMaGLgreR1p03tSD5Z+HRXaoguS4QVxEmxIx/TSfSEb8I9q48hVmA8W74dtoMSgd+WQjCrq7QLihw3aCXYPa7X56HmrEyMT7ddKuLJOa/s7/+2xY4BIBM+CSUYx7LVnJIkl5tfiHT3GiZ0lZK5MdsGxsDKGieuH+zILGcR26ayP/5knTwWb1FuzBUKRX38PwZbVNDC6ou7PUpjznjLmPl+G9tt3zOs9P43MF6lDW4tt332J+5w/nF5OZwIFs1kbKUys1tgKq5gEEpGRh6a160i3wTV2ZH7KXSEQTM2C8/IF8dNW/qJ63u1r3yf6pL9lr/Zs8fouA5QRyq6ixv5ZjsDF7/sdwguEwttZe3U2bvZ3vFoG/vWAQBmNuDLUYrpKWTXYkwozautHOqpUUjDahtI9FMTs5pChE8xdXboMJsGd3TowE8hmAhqSm0DWXaGsTXTEnI6o32sdzawuTIB7jQZ2FU5gdWe6gsHygv9lqnQ1xnk04UrmedA2So0oSv2litmbwiZRNJyiVHuS9QwURhVdyesUWLUZJJ4vkz0a2Z114BhQ+1QslknMVwRGpe+7O4CJjZSFrRujDuhJHy3miZsBtCED4AapM9D6c3GFHEfZwT6NPKWDf7zXhZUHRZern2gjjuEdLBttYWK+zO9n5miboMbMLBfLrnnMYhoIqo/4u+ghSzUr40d5DbUt0tSNHG8mTxYRJFI5OVhOEDCmyF6c3XBYIvKaRjF+3ocOEgHcJ0PBoZnT0iodSXQyY22lANISoItiHl/VGdolYsGA3SYg5wr0R6wnrb0s6prixClzAaTUiexlEqAJiWpRKpMLPlXQpzcIgFZrdb+rE4JLoLdG5I0DafACCrp4/PxU/AmQ6zzD4DINR62plzE0oX4Qp61yM78E7Fn88ci5BSR4SQxDV9ayO7uqdvVvapWak3Lh/dJ7bi3dXt3w1XlFoRDLI4xS0sIHnfWMB26cKCI6PQ3mTDvCceo6bLeaPdzZ2IJYYtFApw+MndAh1V7myfzfJuoBV2DdcflNmhIfXC0FjpwmL0Pu6moS2BDP0HkIGOhoUdiUQNoZRl012OTEKkrFHc7cUQULuwBIxrSJxT5n8aLNsKzQsVFjOidUldj7tlN3i2HtWwQgEQaihqVIp98+YgJTxJdKjCBUp7LNNTy/zvihOFABcRpeZvfaAG89HQpheXO85XSsv2EUrFczu+/a4k0MpNMhK20ZBZxrLXEJ+2GX+3oGP04suiyIkjoDwlv5mCRqFbObW5d/f6DqYcXpU1GKq60hVZ7RxBWrSPtbhovJUwXOYauNj20uFLgdyk/ndqfDSs+Tp6AMpsESki795Zdg0Iz89Am2SAMZMYTGoNCVMXZeaX1PFzW0KorGtXSSMCjUj/5xh7RTfmsGeUb0jHcxuQ7Els2Oz2RAG06Hm1EPd6pvuh91EsnydsSf6uVWf8q+EG9vJp7ORa6urnb6SiGsU/DOfGfSV20MkDvnooXYgPn39zDtBY+yfsk7geEcxVXwqp4/3AWnYgnQ3jDH4HslSrFbjqB6M+DlX4p3RGHaYpIEpD6WjKNJEGh+nqLMu2fOfNC3jNzs+R+qOQeHrxGQLoWr9/p+0hlDc+BuA/1Fo+WjnwkE9vb8uNaMSQYmOLklDI/xP6J6m1LHnFXGf7bXHdxT/Modcjn0+I2g9jAQ9YZgrCQIOk0R82Ef4n7YA7REwTouuDA/WKkrARwEYTFClUzbTtEt8I+Uqfn15uBLTg0/YFEN5hZFEJ3R79TsLVvrEobl/3+Wod/86PtFrt/28Ka8yt2/vLAf1pNj/FfyZjYz/Fjs8duYYvs+z/WM/wYdaOj/7OnkMd4achg/BNCGdqAYxcj1h8lxqjyWGXymBY1a1holxQQ6yOOzKek8IW2iaz1Kup+Bn4n5tkYUMV48zM5UODOaN/6jA1US6IWkCN5Y7dDeJ4tuUax3C+bpRKOxeuvVrPK6Vwp5zmp4skiKpzoYltzckt4cFuxnAe41cZ/kFtxS3qgq1dt0VVjdh7tT3p8NfsGtvuCTb4q92KsXI1a4bskYN6kxzglwEJjQo+HT/IQGus6k0OTSNAeBO8aZU14kG5S5zFqNlwEepa2L4wpHTZUI3JnKEvoQIsLfLoBOBKVfXt5zwIhEK8rOLMm0RA1fZZJRNXjHZej7pFZBUGLFoSa7GVG45uOqY3OgHCbGK1FVz1y0m0tAtMpCI4yMCdyJNAriiHFkM28/ETGdzig5QGuy1YYHJOavMak25Vk3uFPWnGr+P5u5Zr4N/AgneCTLrYJ9hYR8jxLNfrxIggeptiyzXHD2EMxFnXLIgqRojsOrnMxlEHlfIC/fyjSYi/4dVf8qrDKV5mJJ5twW+/GG6dxiFxDPfzuuwKW1gRVSf0D4kEVpmglriqmowrUm6QTRT8qxPExTQ8wfhM1/gM3LfAOmNXCsteWoGPGZ7W37/9laRsd0FDh61EFGmv+MJrPfFEF3VWjf2szYnT7uXt11We2l/WPAG1zKOjM296u4TaP4Oi629x+Jav4kbMtcsUt9hBefCaqAzmxpwavTgIdJ/vvb2ht9UDoU7tUPl4a7pg5OTrlnlY2fxExpz3zcM0FnTUOMfcEpcRiW7leV2fLo3pnyslTtBJpwBVPALosf+kGJF6IUlAvPg1Nt4xTlB4NUBlfjPbKD+Phi/rzat67teoyp3hWCOuHJJrPZ4KuDlH/fJVF88t7LG/FkGVpI69Pmst+/Sz0OLsUaRamYhzpqq5OX24FK/2L4u0q5my3R//4wdGX+m4GBzaB5KqASSI3r06QBijnG3sp7iPwH9Jre2dYHmP2yQgTieeOcAnBI49zgOmuTBouEcdlVJbPGyzEzKqPdhuFIODSuW+CkkYJ2DLhKTkxBsJkirG7zQDvN4FCTaGtgvIIfidw3GucIbh4i6G3kqxAcUQhoyE2rUwDe085DG0WNdhHmrYSG2M3S7iWzk70Q6aT7sDwTBo6J7GGX0e9oGITFjlDrIWd5E1Hd8Yg/wwhJMMvTbDE5Q+0xrcKk9wEvcANBMMyG1aWwRegWBL2NhE+LyKWJyLGjf+0LuVYq0yiO8YwMmuwlT0fE8CIV0fcFq9u2w2RkoC3j6BhQ2yb0dGRg352o448dt1byJigCZdkMztAgl9MWAdRchmF2wwGnuqWhMlxgKKB9IFh3pHeDZL3WDRguNhuHk2HyJ/VvXzpFD2CATNgp/bpP8kNSaLx+437TSS2jvUfWTHbwJpKdsjZVEuRrZ7tmmLAn16hhVJXBHifT45y5AarZ+bFS9Jrhi7k2OpY12a3dBaJgeKNM7CvkOzB1rgSeJ/9SDMs4knRr1l6m4x6EScy7Zs81WaDAMpKCSKuFcZvi47oxT/uPQ5GCv0Wuw7ZanhHFpHN4N4YAP5qz9XRi/4Ti99SOyVytWhH8QKqC+g/cXgJxh2Yzg3v+R+4jGx3ciDX31bpIo4y3pkFwjYCR9HmlBsHiaplx+Mnk433L/K2ip3pNPa3ToctgA8TtKL3LyKm0zkcK0W7ZMc0AFCJqr0uzyz9tqVjn1edn1aPn5pufkLqmmNV3AlcdnxGNgA+/f7fu2mSGA8BLgezR/SK5YyM6x6ZzIOY8CAIIJ7MJ2sr25FgObPcmV1nhXx3dixkP0onHLLXjkGAb7eeRGJwIxptHOMqwO1JB1OAZDt/5nZmvt5tiLZgnfXvB/CdUTjAryVOfa08ydoQCMnqSOvjxYe1QqV1Pv5gi6pJ5jVeYoF4Wx6r15uT62Ywv4Iqhu+GevZ2il3Mj8aVKksXO4B2KzHIIvs2cxAG5O8dn17Taq69PFvXVKZCA4eTKAciN/bK0FYKmIN8tPPVmHdxXYG45iOtMXUL1iY/Zz390Y37etlKoavSeHrouwStuNRaEArwt7ZA+aD9WKZ8lyVjMfkOwOYphqTr73ABLsg28Gpkp/d4zDpA2GbeuY38X3BHVovmyequSOHhORPRYFVHVjRhDUdGFcC9W5DpQp2ZZCQ5l+mogvuEzKnWagGw2wEdUS3FB8/IdY/yNaD9t9/fN+Y7e1t9vF7Bue5P6O8s/h6cYZdcnrQW20jGfqVy5+L0vNzcLaGdl5t73DL1QI48jgwcOtpl6aTR7ARlljSTy/NrechCSuy3w2emognlfMXyuMrd58TxaPvF8WWBZCSpVQk4wNu6AYADq/JimDhFx8SJJD0Xb1PZrRuHQbZC32omitqKWV+y2q3UUXfLL9MgZrcWwXQRcpe6S1KlE0zFrmW9JTts/bstyBW3/gMAKAqSk/WzbMjkjNt1QWZXDR977C2hDXSn/ckTvpteAVsEWI2eADuCLGh4bw6ytD12B/C6/207AICqWrwL/9GHai7eTYuZWm+ncXKoHb48HoADaqDphAKf0leZTpi4bjrzAAD2QAYxcbcFUWRmpg+ihZ09HIhr7YYJIdppgRqJc+eN6ofoz/zxmUoy/Vyrndfn5v//F7oLsN+c/dzPEayBTEHVmGRE6ooN5f0if7P8tTKvyuQqfn5z1TaAajAtHG6+H1F/5o/PLIWZ5VJ81ZR9IhnqOLXfs1/K+SPOl01YKrPEfP+x9iDet8ThaPV9hfh2MDvmvm0AS22WvDN3Ya4gQ+8yw5P+a75bXK38pJWOQLUKQq9QglV1AwDevga4oaKuh3ya6bk4tcVdhoOa2Qp97thR1FYM9blTInUSF7UsXUkR7R4x4U134TkTuELt+rgl2fZvxpDbf/8BgF4caK/8BAFHcpsyeKniwYJP5W9UQOE59ApwXABbs+nH+ZAVfFc2+Kcy3ldIj+vlPnU4He1eIXJQeCNYVRcAcB6liH098u+KMfXew0j/+t7pN/F7H1O2Ys+zd8t6+lC+KMrCZ7K5UGrYc6ZRUKaxpQAAYALoFbnBv4a49wdvq/mcytDQitIBZPd2HQBACaHGluViXuklsUhN95+R1jRZl35vKv1axERZw/84/m9xeB87EjBW1+C/PPpz4Yrfd9v4GEEgoKbmUhXbOXl1TaVtc/jbi8f/+9gZ5VCLP9u3E9XOAei49vygqRPkWmv9vPbm+qW+p1/IT88rq1HYEz/hzOobti85nLI8cotVVpQpsKooWDU3ALBSqxlFwTCl3KTwK3JiJUvK8a2sN3bWYF+Kl63Qt4uI4uqKCc4rtUuRqyRO3CiuChEAiLCstQlWvQsmWmtBOQ/9aQtMNPC2fwBA6wA2ZP04yZ8FOIXNpUcsVE7McKD+piiekL0SR4becyxQ5lzCq2UTeGW7wHdtRwi8KXOSahJLgi3K3odu5o5zCxr7kphpQODKm/2lipr5ot9lw+j5vythwte+L7fcfFctca7YVbEpZLCoAgZ7qeFFtuCqkS1UcGwKFCy/wgTHDl5BoW7pOpqdqLV8fuwKEAzWgrCCAzMXGlh4gYGFFhaYa1w95kICMxQQGKRXeGvmR6wl8zkXCBj2J8J2KnMhgMUUADg4JQQDy+Lt9LC0wJ51lf9/DfRUZ7oSsmMp+WTAtje6rBq8qQvxgcUISehiKO8CK/YgWAxVUwAAvAScvdljJ9wFLhy0Y4/5pktemkBUtkrG0amAa3tbHgBwHENvgg1cqjrzrUHam3/EpFfNq+mU/kvo2D79dFhil0BnWBsEqRmCCjbRqTgShp6ez4QCJj39qtlbWMPzx+xe4cBT7/jNOZy5vOkSfmwerXepdYx+69FXIKVLgCuzHs9mIJyJ6xwXOZypPBNK1RwGTwRW3/y7bgDAQqECXphYu5kxeOeKuxtXAWctxEBaLJAFQ10ngQt/K25VFyIA0DKwLtgEm9obfq33RHav9u+u1Rrd0HXnPwDgMuDp7f14bclcjOZxIIstiG+3Lhshy1P0t0FxTbRCimcVpLe79T7plKU6QZlgvDHV7XPrgUyz7WHXTMiV2fWECXmxxrzHc1Sjqx0ASJkJDRm+oXmOJtrtRgK6oN5KQ4JQ15kHADgHOUfBoXPLyuHZMjIoNrgiDs+tlY2yHF7IakCNHN7qASiWl/hyy8q+sBcX5YVTnpzP0DqcpjIM1TuSkWJW1tCvIf9xOPh0i6bfDqenHIwNoCpHq5O91YM0Ih+DfoXyW+kzfjmcpbIQSxaW2ctWMvnzAXxrOP4eQ+lXDmennI4NYMnDknvpUya6NvXOcLa76YnI4WxFlxijSgz07iBYVTcAMGvnHzdoN3cKnJGymx6Nl2QtxIWur6hER5XDxdRJ1Iq7rwsRAGgIWNzYBKvad3mu90Syav2ba8i0tv4DAFoZ4qb1ExfE10ZzCEhAVTyJmSpxaOg9S6IVvJRe4Bv0Ppy0V2eBUiYPJY7t0BkhvwafXpAg/SF/+j1FR2+HveN4hZ+CGEBeibTaBgBg+FSP+m3T+xFUfeU9D79KySyIqpTuNgy0thRmZkB8lj1/V1AhM5QhVqDCds9ZxEIlNI9mAgBgWr9dhUjBfCNBpSfHRJNs60omHTArSa5jBwDIFnTEspTGEo/LZE4AHtMQTwweC0+SEBBncByVOHD74xfxfsA+BWrtv0qpTKXU1yW+qnQGYxPMegcT+P3OCJrv2XkhX9ZWdhneHo7P9eAd7GjKHsmKVYZcpskQALhZCRLnKdQmXaizE+26NQzdLCcnSyLtmPZ85wIf/31RVQ5XoAQoqj0ggYrB6OlABAAAEHS5j69FFEiY2qv/m07TxHi6+R8AGABzkP6zFWVVtKU2t0FbyngbtPVbuk22pNS6J0BNn2Bh2AXLa2I+ZBHjv2ru3Qf5ILt/87Er/U3WKm4QwFz+f8E1WKKbpLI06qxmilEDyvcmvMIxCgcjksM5qfcOQbGCf8+6flw1pw2Plfn/YZ43025RVBR32udvMtx2uye2B+hXQBYxWWqCatucZRc4OQh1FmITMjzdlwp78GVunnzfrKyDIAw+1tDcmH50oRPJaLvMrrPdZFkAu7c3Bk9xFzZlQ3ia/CkAILSp4CiGzyvvwrHa7bxmbq7bfooqQHx6K8dGXh4A0EmvBiGyvAycmxdwozYyZgK4ub1scwW4o16D1QWkvUNRUYVgunCc5oO7wDSWs6ucltXoj8PbMZzkG8NfCEcz9/XxiSSbEdpUVq+wh7JCSpiP3TmaqUdxyjrWdQ7sTguWZwgA9DX46Ui1szAOdjNx4NXo87u71g0O90kXBu/eXeIQo65NAj4wp7QIYZ8rfKm7ZJo20fZCsKz943WCJTeG3fkPAIwEbPfqP4sAp6JttbkELZTxErR4epkpnYgUncB3JyojRGl1kp6TiyBM9bokBBBmBwMlCkjtbnaDaSBd1RsLVkzSnW3tAEBYBQTYDV/EYhIww3YRj4lEllYSVVQOr9KVBwCw3L2qckSBiZsaCFtmxikICTvbsxB67YaUIDTqoFL9wn18EytZ+Ii+JpxTxDc32tE0nWGo1JCMqKKyIgpu+AtntvO0cB1Nz7nVGkAFhlYnoKdsy+oa6QkHfyf4HRlHs3QWYnm6EmUJXnat9A3HArsfTkezc662BrC8XbmxNGUL1nHmheE0n3h742jGHklKVSKwzomqCRwASK9/fFw7dnND4AjKLjvWL8tYCH17LRbFBlepTaIscMdaBHqP/3+pu8S1paL03F4wNdv6N709G+qN6er8BwAGBOaa+s9WRE3RnNrcBm0p423Q1tPbmdILgdou4A4EjulXLbKCbco+V9Q3WOFUPOS7e77g/1hNJ6OJEpkA/HlG/dcGO6nbgcnfPh6Z+suD7zn846Di0f9/7PGvoowAzEWoyuPRxgxFzUIqZF5wBEpgUWHnjfimqTHvNB1GFakf85/6XyvvYkP0OrmLlVyj09HXjFxRKm596uLpFjfC457YR8xz46eVzLuiMoUn1S35aOWpvknGcKUh9InukZ0onLUMLCHq6umUpFSrPZA0jD9kpbKnLLrNIINdNgiOzIKlp7En5EiNUOBLvCWsMSaSYKF2HLqPk5OqLuOC/nJcckW3vhjJlYT2bYCdHrHc7wHmkJL2PhEwU1+mws3Yo5Ts9Ol06Ki/KAGnHga+2qhCVxQmqJUN6dkPJM9gEnHWwHWNGu+Ba5tVThgUHdzRIezdJFui2wsBovJNvRXCZ5pW+AqJ8w1tEkfDRAEuwuQwLPUCpnlGQHf80pTrdfpbofLnlKI+nxruVR5g8P9SAK7KfEhNTgW+7GVh0VELdMQZ06hnNL4CyA4Uwv58TRkUfxX2X7XybRZnbFeRZJwbVANTV2LB3GGspzvlmwDXz8WdT+f38/C0TYJQ0abyLWA7zeVc4DPVMkrzIevVQAk8N47pgtJpME5Ennk2ximbD59vXBpxX09zzSgmpjAZl9jaNMGePhv+Zcc7pbKT7RdS3sKF/DOEWj8A4ZtWv+k4H8IH4cqbYZ8vdDtXdZtLN6//eoFV0to74m4iSmv+geuxHoPSe26fAX0Kk+QztpE17AJEmBZozV7ej8RrjqWaCw5aDiO/EjqxBQ/uwrFSVmILQkq8dc8i6XU4Vam/opL29GHSiqzxzsktDZdG4pvH+4u7AVPJV5jS67Z0nu5L2UAhP4zmSPje3nTylskk+w3RAu9jMPMFBP5Anu7q564EVIdxhPMAfJMxoAxCFWBv07ehmRBCVwe28XAYseF2Td0kz9+2DuWUhxT91ADoBUcd0ABAB1BUIVglBiBsGbCg3nQnRFPCmdsnsaJpcbCUpm/cMYzZ/dng2ka/mxkpY5hWOWytVgp/Sm104ripGixeoY11HbeXMiqBTDXkgWJ5jULLWOr5haCbIhFSsVZFx+pixKkzRsFSRlr6d6Rf0t1HXqWPsAcADGr8FY9CKpVYQYqNoGr5/a8tQbE0s9T5C0S9CWKGudFEYa5DjBJGcmYVTF9dN9pIuZOJclWpABVFXNVEuV0SQCWgFKbUlV6DUnRnK30k8CYSy1uEXRXNWjnvFkGzSXFsy2yfXZy/lVaHo9VIIh4pCmkkWFV4elW5J1c1hqlVZV8rGGSl1JNPLjYYrYD4r3cM8ntEHKKcyuWfDk6JhTUcUiLfAtzlO8Pv9vpX5eOrx3+Nacg+yavC81KRMslABZo7dfgW1WzfKvy83aILNF0uqwzRIB/9s3tpNyH+gl1U0lDB8qUkqVxUTOIbBwrAffjubz+6Q2cA179xV7/u5fx7V/N2J3Z34LLVoFWxI7OxQCt0KXszAK00P403t5Cf3PIeSQO8ivIgWWjmpN6Vy6kZM/CuaILgyFWcYvCzW7D0fnwvFP/vR3dEDmCO2No18m7ToxHwXTpzelgrKp9x/j5+0MPeT1aefb8q+fmdbwew+iI/eTD847KM+gHYH8IWp+qprZkEFX/9Jrldjcp1W8UMJAIYI5paz4Yndui+ycH8HtFb6vHFf75w6pqrc0h6eruG17X6Kgj7Cj0132ECAKQbfVAtH9NoqVWUOneLf2JhsHQ/d8Y6YrCCcgG7hcEalZHYWE60gExt2DXq9aa25DoTzaWGdZzOG4KXkmbysz0AIOl57V+chb7yo1sQR5reAg2DODh+KnBoVUpDQE6pYJUgVsfUJYGNI6n725XJSHoawhmzrpjgDbLEOlbaOrYhV6vI+UMAEBfreqK+WWJeNXdzgOxUlSuypnEf71E9n/3rdxlZcXcG32hmtZB2zd4Eoi4Qe4DQjdjusoiYDl0dGIik3krLCc/eKp6rYbT4nB+6AVS+aDUCqMq+t/jysS8p3nypHTeas/w533QDWCKv3My2sor6SbzEll0+WKUTtzRe+bPnklJ1HYaJvWpzK2IYuvAat9BkAgBUcNtlD/fIYKmU7lIHhHGl+rNdXI9uUIeb05JAXGypbbsWi8u1dTelAh979623BFdtgrxjjG0CCADSuJb9gyOIUJtjULYg7gN8kgia00ox3NBeqYCRgo2gUpnCHmzZmNHuUCj0s/V5U/73P/RmKuPhUIxglAZwzCtpk10N+MAW8kOgKpZhUCXU/RkHsW8swJBgnJUjuXE9s31iVqwCGmD2mHLGYNkdHwCAS1Bqq8dCT4FPauxReiZwapj6eeU8hGP59P0De4W6dFnkYGunORzYebTImk4Sd9J4USnrhvR/2agQFFyKM5jHFBAcWNB6jWSWKffLzmYVcx3iKt1hrAUYuW4UiVyMDyx0wal4O7TnfEZDvy7R4wO/sV9lCdb9vaXp4V8y11zxMGzXF3xiHI5eabTd7GS6xJfklN/X+mJ/a73X3yRavekdVeEufF9tm63NV2erE2BttNeicHvRUkcyAQBS6NNTTB8PurqKfzIw2MHPnREVDPa4TEBgAIVpO+1IanUq3yEKAKiaGoUCEU1MFJXdKNlqsUwx8a/YCyRLy1fAy0RxZeV3aQMA7jGapRaaaFBnoFM/leiqNTvXbJlaU3lx66g1XZRqF9xLLjTRnnRc0YNRLTBHQTTV6+aJhqrAyaUl7aLpy+1q19C9POsYlMQ1DG9vhOaCK4j30HDFOnYAduUJRABwEFxHfcfBrqe5Oy6jYdenrVwNFQKCzDaH97KFvZVt5n2CFW7ztpkjmML2P2KmTPDqFO7+S+jYLoMpwrysB08MptnHtYh54NH38pC+9OGiqRi8QuT0+TI07N1g3q9n+ektjPP8qsMl/5VXhWK1Tq8ocGhGF57FnWsyAQC2wNete5xHtCZplDglDTBq20aUdAbPqCoxc6pSaNKQaynmto0kGmyVFuE7gbqQhwAAqAwGhYgD7qGslpvyXuJVjss8+6k2ADC9ZroeqgibXJy783lTcUWa0YGFIM4OMU4cNrPUVN+MfwcyU+F63ZiMbldmnQSO7cOI2apdc4HZ7gjnhsuFo3gXgOjq2NJY4glEALBumBn13QqbdW93R9bTVFbJDj1YR7aq4ctizCT9+n0iYMDt9N/4Do1DZqBDx5Q90uG+AjFT4GYjNgl4xJMmVxZ8X+Pw0WV+dFJdwbUZWvxVvtwGUIehFTm3l8fYB/NjN8vcnP2ldViQrfxctubfbQALtpV8FpGQwR+3V+Qy6a/lqqAXahtvvFnvzNyY1ZnrkFq/0h51YQ+ur8kEAPCBp6Kpj3pPMcw7G1Dq+FWM3O1nfcaNdIMO7kRLYjGitTbeeNPwcm1Rp0SEeLNGEF2bKDEeVmoDANURW6ysCCy55BDBaGFRtdqUQBxlvMLV2m26gOLCtQ+kGCSLtgp/HhsxyIoI688Ujpcbvm9+1kZmftuOvGX+17/1/lCrqawnyYRIAiRdj0wyoFKWR43ytIEmeZu10L2wit561j8H95LXJ2jwK0NFa9O5AuaOnKUU6Wbvw4OGFjpJn/yGJym1m3U9smzhpEc19bwccua/GR2jP+8zJ1GEnwUNbus1mlk8+ayfhWMKkf/P/wF9Sih8C+W0P/LwS/vfAACtP7+x5amVw5bKbff9tsq2nZVW6nbZf+7d/Joc3mHrzHWDd6Uqj91w4hqKr9qQnw6a4m35AABSu1DF6K9oBF5NVTb/nu00M5zFTuQne55H2ckCACz2ObSLlkun+xKdeIT2yGR2bmiHGVSnyxRXzyGIx7erg+uG9iVdoLdVwPY4p1eq0IsrUnro0pucZA2fBwPOZZPH5MH1KOlG8uzdlVK9Ow1g8n2BQMHKwSMFVlH82reeOocRfyl53+d6Jhep2fQmwkvZNT1Atg6859qz44R5ZRXwglDYHjSkhVS1Y0WodVRgn4cAAAha0CLScdQWHaC39S8S0QfW4GvSa3TtAQB9O0o3SSMFTMH2wWrsHjAHZkuTiYNzYDsaYlz2jzQBsJi+FHCDfIElqVf2jg1XqsDy6QLEvgoXNute164IbI7Dg7vujFgELJO8jO70GrAscyZ/2B7t1WXuGRCYYhaWf134WcfbFekFpZEm/q+SqZvK3iZrzdL78RmGf/MT8f2Jr+ur0g0kXrpjLoIScjlHIASjy51LZsOhmycE6U7/ZX3VnClslRLxJSD1mTcep/Su12fOAwVglVW9zq1a3xTtG1AJ0bRNeJsr/RvrfHlTACtvP6e04/vQe8QpT784tffr9RKQrdLRLiTk+htzEYuXFOfoSJpu/ER56R0ncjgO2zLgNSdB5c90TPwwkxYi97NIqHV2+yQA9vP4+2guAuGqxseu9vLw9X2/XE0o28TR4RCMYXpHlx280Ckp1wGGYhiQjSbAqgOt20jzf3mq2N74FriJiNO1dVL/ZV/epEKxB2gLECgtviZAM8PVy6j7cxzY1XJyX/aR2gFekuJlpKYFju9PgLLCCGoM1Vlh7Np0TE4F+YGmPC3VBB9ojRoYUEbQ6IUiF2Rb5aTN0YEdaeLrgQixGC97Zgp1NjIAHrBCraAFmnN+lkS/tBD+nC6nREdSGeDd3ap9IOYL0qhvQI7NGBQJhBGfDVREOq01BK+9thY/CrzqzAjc/COq8MY5wLbzzfjkalseK2hxB0D+2xmKcB7h/gIypG4j6A8t9gRNhdaYiDP1BEC5rrQ34yVGFM2Z8JBv02ycScDY+04ef9mnLXH4SkObP1O9rg3yyoGxQ7myLgPObWgYkR++8B/qFMlTmj3U8/xQiUroWgmTKPBNOH7zbrfYZ2+Rip1Mlygu+6NtphJu1v9p2yKt5LpuQpv+miijlyxcAzigNfS0OD3dzKZLPGx93v2ndbE+5eCH28y83p2rY/h6AfFcWsz2utbqrGfYbuk1chdKcTfsKVePkdRXxKOQl8BKngJ78Ra4Yx4DnKZByh9AxmAsZjv83CuWbS3vSJOwgQjw1nqaOh2Rq8He3A0WlcuxktvpxUM894MjcUH/H83oxueLcBj+CEv4JOyZjfTNN0H//BN+IHwUyPgpHIyv8pqClSzo+SzXdOlks3++K2YKd7yY9xQqu/PSY70kMGZurgWpS2w05camwbYzRwlLQ7VatLfhSA8YVInp+ojRh6enqqfsluLqBsD5R5dINLXquL1hE7Z9o6oL+Qo1ENcVZTSoVwpBhMohq4BsnlzPB6nKr1nGHluIXqtW1TfWXEjCseq5yK0y8MIv/ZftfeyLsILempk1/5OY6HF82TwERQJrcLzM3hkGrOFEd6vdpQ1SJ/RW0j27qmJ6p/p3hADAVA8MpuzwMnALCFC3kUGmY3cLBsLx0bJzBgPZnP4wMBhKx9WJTXv0vTysin24zTGnxrAJ+3x7Xtg2Sj7Ut2z8a6ZnnlZDONbZ65Va7W0i9QA5PWEoXSlhrNluFABAC3BKiiG6T+OZIDGr9T+qhZmKx1i5e+mjmfILVRcsA7W7bl2qBvpI6okY21oEeTbmLg8BABBcPTqRe3zhEgBV+y8Sge5xglK69gAA9OyXpVJJ8V5sHxZHdggcvpHJZLcBWF2GGOwRbpDQBkJrbbkLAbd45VnKHrkSmAWKTjz2JBfhcNG8Tq25Cx3rCE/M2S1pdpvYoRkAu81L6VMml4vYvqCBxuMVuldbTwKA5hSTRmGr3QDQgoCmyvC103DuAja1YqZebTe+mLYpQl1l1henmhLoJgQAmIDHVcj1YNybIymrmZ0LIKCdjT0A0VkQuAYYsU2M18TU0xwzjfmgfe6n0T+Sr+HNNSQvIeB50CFA3VFX5CSeMBNfiHulL7v0e4JOqUCQ/GTm51WHABUKktseJg4k5b198vjQfUj0fluZIPmzd3NK9eYQ1H4u4DaqjHBnROkBI0g1CgAwW7MS8073EIfEemmUuC72X3Oh3FXrGQ/9/jfmnmXAE5TXYyPxpl+ixKrpEgUA1AS0jR6Rrg/oLQ4k9jWY9Kq79gCAvhnd7KWRAnJt+2A5TuCYA5PTZOLaObBlFTHu3MTQo2LXV2bTBCzSuLL3GG1JqsDSGn+iDruWpI0vi5mpxgP7hsPf2MpteLBlHUqZPbuMiF3tYoJc1ia7afDtdJcAAHcFdTdUg7tZimUcxNPQ/0bl4vnEHvNI3GDEMn0TjbPKMtmRHa+bQl/uSpUT4tF2fAAAcwNNI32WoAOA9lANpDABr7eyAABwASBKPSWyDyAmJpO8jvoWiixealgcfHAIbex3qUiz/HYxAXSN6WZY8s28aEBzwtjk5EGu55PxrlDeNm+dtbuSx/8bXmuL1T4P9zEXy7UnjBXr7YU31Y0CAGzE7unqLNyBBjgBK9N6pmmwspaBhmBNWUmagPdUbrtR4vpl2kLosYmiJFAMaKU2kelLwCf0ejs8AMDphUixfpQCZFFtKmP9DZDHpliDC5HXatMQ0NwYV50O7ZakCtqGHaDL0drSUfC8nxqta3fnuw6s4ZASa4+z3Yyy9K4aQkr5mEep0Phx/sT9aPplopH7PywAAite7Cnch4AIx+wTS5IJjBggZh8Dy+MXAACJt54EAFg3E2S51W4AwJUBLGL4WDpvL3FCLGW7HcvOQ+7aV2FQAMxsJQQAMFmAbRk4CgePUfNxdatojBYsgVyatgFy6RAmkL4aGot8BItj/gluCYSHy75vODafrmX1Fcone8N5g/4EvGx3Y228Eh4FtUodutt9i0VoCbPYmoYxy90oAADLUPaxn06Q4ENpgJfdEA7VZo2jrgdbWtnyC95ty+BI8FXrSOfelp26dvUI99nzzzwEAEAS2yZKDOLUJnKZcOY6tQEAXg8xkFZUotj60Ryg4ahN7aBCBDQ5U6zrYQIS0awtpQPyJ9Bdq1f3+Qk2qYKrolDcJx3YEosBmwIvm8tVBmy6uPY311YfmBJczuwKFAhXj41iACLp8VAGQMxuPQkAqIgJcdlqNwDQvUwonupLGr/wDUotd8wAqmpbReCIBoUPGVYzIQBwmY5JrSYuLQjKBY3amgQyNG0LZOgQNhCuhuASE5Zj+3MwEI7eG7Q42d0YmpmER1KpkqfmTOayQKMqC28tT125IQUA0OGuMh/jDMxUSre7DOhkCLrr+rMr3B3d4IC7pyOd4Ny5KlEAgONEOQ4JZSJt1HFuzL46sdivpngAoAjSlVy2u/daWIRNM4//tg/dq5R4FkDTpbZunrzceJG6Hl0ISXWiu1En7TPkqElGl7S8dI2rboPTHQinelsgtdaGAXm0HhGUa0AJAGzGO013A0Ade1X0uVVIcGPuFXfxIe9gCQXdm81qTGyF5hPR73D4ZfCus9vd+BqERE5wCFD1H7ntN4LteLyUPwknevKJMdndmMdoNF5j1WpjDOkA2F5rGIsY6O2pKgUAEHtTVm92KwsYU+HIrmvQcuylbNCgbCZpOOnA7U227cCj7HJt91kuEvu4OpHspzEeAMixJw3Iyz4KzrDv4rjYT8mt2Z/iG4znCn8B`, `base64`)).toString(); + patch = require(`zlib`).brotliDecompressSync(Buffer.from(`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`, `base64`)).toString(); return patch; } diff --git a/packages/plugin-essentials/sources/commands/up.ts b/packages/plugin-essentials/sources/commands/up.ts index 9511dcde88aa..5e8b5dcba65e 100644 --- a/packages/plugin-essentials/sources/commands/up.ts +++ b/packages/plugin-essentials/sources/commands/up.ts @@ -270,7 +270,7 @@ export default class UpCommand extends BaseCommand { ]> = []; for (const [workspace, target, /*existing*/, {suggestions}] of allSuggestions) { - let selected; + let selected: Descriptor; const nonNullSuggestions = suggestions.filter(suggestion => { return suggestion.descriptor !== null; @@ -283,7 +283,7 @@ export default class UpCommand extends BaseCommand { selected = firstSuggestedDescriptor; } else { askedQuestions = true; - ({answer: selected} = await prompt({ + ({answer: selected} = await prompt<{answer: Descriptor}>({ type: `select`, name: `answer`, message: `Which range do you want to use in ${structUtils.prettyWorkspace(configuration, workspace)} ❯ ${target}?`, diff --git a/packages/yarnpkg-builder/package.json b/packages/yarnpkg-builder/package.json index d64dd63b654c..82ade94307f1 100644 --- a/packages/yarnpkg-builder/package.json +++ b/packages/yarnpkg-builder/package.json @@ -18,7 +18,7 @@ "devDependencies": { "@types/semver": "^7.1.0", "@yarnpkg/monorepo": "workspace:^", - "typescript": "4.8.0-beta" + "typescript": "4.8.1-rc" }, "scripts": { "postpack": "rm -rf lib", diff --git a/packages/yarnpkg-doctor/package.json b/packages/yarnpkg-doctor/package.json index 0299c14d39a8..d9ad9234bd6d 100644 --- a/packages/yarnpkg-doctor/package.json +++ b/packages/yarnpkg-doctor/package.json @@ -12,7 +12,7 @@ "micromatch": "^4.0.2", "p-limit": "^2.2.0", "tslib": "^2.4.0", - "typescript": "4.8.0-beta" + "typescript": "4.8.1-rc" }, "devDependencies": { "@types/micromatch": "^4.0.1", diff --git a/yarn.lock b/yarn.lock index 704cf85a7d32..0bf8bd9ab487 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5513,7 +5513,7 @@ __metadata: esbuild: "npm:esbuild-wasm@^0.11.20" semver: "npm:^7.1.2" tslib: "npm:^2.4.0" - typescript: "npm:4.8.0-beta" + typescript: "npm:4.8.1-rc" bin: builder: ./sources/boot-cli-dev.js languageName: unknown @@ -5631,7 +5631,7 @@ __metadata: micromatch: "npm:^4.0.2" p-limit: "npm:^2.2.0" tslib: "npm:^2.4.0" - typescript: "npm:4.8.0-beta" + typescript: "npm:4.8.1-rc" bin: doctor: ./sources/boot-cli-dev.js languageName: unknown @@ -5786,7 +5786,7 @@ __metadata: typedoc: "npm:0.17.0-3" typedoc-neo-theme: "npm:^1.0.7" typedoc-plugin-yarn: "portal:./typedoc-plugin-yarn" - typescript: "npm:4.8.0-beta" + typescript: "npm:4.8.1-rc" unescape-html: "npm:^1.1.0" unfetch: "npm:^4.1.0" unified: "npm:^7.1.0" @@ -5841,7 +5841,7 @@ __metadata: eslint: "npm:^8.2.0" jest: "npm:^28.1.3" tslib: "npm:^2.4.0" - typescript: "npm:4.8.0-beta" + typescript: "npm:4.8.1-rc" dependenciesMeta: core-js: built: false @@ -25330,13 +25330,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.8.0-beta": - version: 4.8.0-beta - resolution: "typescript@npm:4.8.0-beta" +"typescript@npm:4.8.1-rc": + version: 4.8.1-rc + resolution: "typescript@npm:4.8.1-rc" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 7b366952201d8b74349cc6513bbc0eb9f705f3cdef7a62215335b886a28cf15bcf968babb3e9b7605319c9a1b4ddb5255190b7f0d3e362b9ad44b5627587d45f + checksum: 1c8fdbdb63588078108eb993cadc005459cbea2163f9cadefc1f55bcf9fc9b5c5ea0db9a4dfbf70178d20056b6828486d613dae5b6f6eec5ecc6482e207e90a4 languageName: node linkType: hard @@ -25352,7 +25352,7 @@ __metadata: "typescript@patch:typescript@npm%3A3.7.x#optional!builtin": version: 3.7.7 - resolution: "typescript@patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=f456af" + resolution: "typescript@patch:typescript@npm%3A3.7.7#optional!builtin::version=3.7.7&hash=a1c5e5" bin: tsc: bin/tsc tsserver: bin/tsserver @@ -25360,19 +25360,19 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A4.8.0-beta#optional!builtin": - version: 4.8.0-beta - resolution: "typescript@patch:typescript@npm%3A4.8.0-beta#optional!builtin::version=4.8.0-beta&hash=f456af" +"typescript@patch:typescript@npm%3A4.8.1-rc#optional!builtin": + version: 4.8.1-rc + resolution: "typescript@patch:typescript@npm%3A4.8.1-rc#optional!builtin::version=4.8.1-rc&hash=a1c5e5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 6cb92f6feac50e05db09266c31ff0a8c08617b266a352e10129d253ce11de18e9f3d733c95fd5efb9c37f3ff5c2e3afc4756ae73646423d91dc2b6181ffc6fd6 + checksum: 65fb2b858106d882b73ade7ad6b7aba008c9c3d23cc1a50b964a5ee547bb28cd5785a4b0d055c750df746da1ea84b9c9e02dd8b29ce2b421b16c69c4fd894fa8 languageName: node linkType: hard "typescript@patch:typescript@npm%3A^3.8.3#optional!builtin": version: 3.9.10 - resolution: "typescript@patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=f456af" + resolution: "typescript@patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=a1c5e5" bin: tsc: bin/tsc tsserver: bin/tsserver