diff --git a/packages/tailwindcss-intellisense/src/class-names/environment.js b/packages/tailwindcss-intellisense/src/class-names/environment.js index c18806cfeccf37f39a33224beb87e398f02636e5..2eb5dbd055c602bc3010f2f98b27043d2bedac72 100644 --- a/packages/tailwindcss-intellisense/src/class-names/environment.js +++ b/packages/tailwindcss-intellisense/src/class-names/environment.js @@ -1,27 +1,13 @@ import * as path from 'path' +import Module from 'module' import findUp from 'find-up' import resolveFrom from 'resolve-from' import importFrom from 'import-from' - -let isPnp -let pnpApi export function withUserEnvironment(base, root, cb) { - if (isPnp === true) { - return withPnpEnvironment(base, cb) - } - - if (isPnp === false) { - return withNonPnpEnvironment(base, cb) - } - const pnpPath = findUp.sync( (dir) => { - let pnpFile = path.join(dir, '.pnp.js') - if (findUp.sync.exists(pnpFile)) { - return pnpFile - } - pnpFile = path.join(dir, '.pnp.cjs') + const pnpFile = path.join(dir, '.pnp.js') if (findUp.sync.exists(pnpFile)) { return pnpFile } @@ -31,47 +17,62 @@ } }, { cwd: base } ) - if (pnpPath) { - isPnp = true - pnpApi = __non_webpack_require__(pnpPath) - pnpApi.setup() - } else { - isPnp = false + return withPnpEnvironment(pnpPath, cb) } + return withNonPnpEnvironment(base, cb) +} + +function withPnpEnvironment(pnpPath, cb) { + const basePath = path.dirname(pnpPath) - return withUserEnvironment(base, root, cb) -} + // pnp will patch `module` and `fs` to load package in pnp environment + // backup the functions which will be patched here + const originalModule = Object.create(null) + originalModule._load = Module._load + originalModule._resolveFilename = Module._resolveFilename + originalModule._findPath = Module._findPath + + const pnpapi = __non_webpack_require__(pnpPath) + + // get into pnp environment + pnpapi.setup() + + // restore the patched function, we can not load any package after called this + const restore = () => Object.assign(Module, originalModule) -function withPnpEnvironment(base, cb) { - const pnpResolve = (request, from = base) => { - return pnpApi.resolveRequest(request, from.replace(/\/$/, '') + '/') + const pnpResolve = (request, from = basePath) => { + return pnpapi.resolveRequest(request, from + '/') } const pnpRequire = (request, from) => { return __non_webpack_require__(pnpResolve(request, from)) } - const res = cb({ isPnp: true, resolve: pnpResolve, require: pnpRequire }) + const res = cb({ isPnP: true, resolve: pnpResolve, require: pnpRequire }) // check if it return a thenable if (res != null && res.then) { return res.then( (x) => { + restore() return x }, (err) => { + restore() throw err } ) } + restore() + return res } function withNonPnpEnvironment(base, cb) { return cb({ - isPnp: false, + isPnP: false, require(request, from = base) { return importFrom(from, request) }, diff --git a/packages/tailwindcss-intellisense/src/class-names/index.js b/packages/tailwindcss-intellisense/src/class-names/index.js index 7dedcdf3b7794926419940010372a08991f75d8b..98d3dc0b4856787f1c1800e23120ba5464125478 100644 --- a/packages/tailwindcss-intellisense/src/class-names/index.js +++ b/packages/tailwindcss-intellisense/src/class-names/index.js @@ -259,7 +259,7 @@ function withPackages(configDir, root, cb) { return withUserEnvironment( configDir, root, - async ({ isPnp, require, resolve }) => { + async ({ isPnP, require, resolve }) => { const tailwindBase = path.dirname(resolve('tailwindcss/package.json')) const postcss = require('postcss', tailwindBase) const tailwindcss = require('tailwindcss') @@ -274,7 +274,7 @@ require('browserslist/package.json', tailwindBase).bin.browserslist ), tailwindBase ) - if (isPnp) { + if (isPnP) { browserslistCommand = 'yarn' browserslistArgs = ['node', browserslistBin] } else {