diff --git a/packages/tailwindcss-intellisense/package.json b/packages/tailwindcss-intellisense/package.json index 70370d29a649a99efbf78d0f152b0f753031de18..2d8991006d495334c5abd0e29dd71db034a5eeed 100755 --- a/packages/tailwindcss-intellisense/package.json +++ b/packages/tailwindcss-intellisense/package.json @@ -185,7 +185,6 @@ "dlv": "^1.1.3", "dset": "^2.0.1", "esm": "^3.2.25", "fast-glob": "^3.2.4", - "find-up": "^5.0.0", "glob-exec": "^0.1.1", "import-from": "^3.0.0", "jest": "^25.5.4", diff --git a/packages/tailwindcss-intellisense/src/class-names/environment.js b/packages/tailwindcss-intellisense/src/class-names/environment.js deleted file mode 100644 index 6364d551ae005289c06af55d771f0b9bb16156dd..0000000000000000000000000000000000000000 --- a/packages/tailwindcss-intellisense/src/class-names/environment.js +++ /dev/null @@ -1,71 +0,0 @@ -import * as path from 'path' -import Module from 'module' -import findUp from 'find-up' -import resolveFrom from 'resolve-from' -import importFrom from 'import-from' - -export function withUserEnvironment(base, cb) { - const pnpPath = findUp.sync('.pnp.js', { cwd: base }) - if (pnpPath) { - return withPnpEnvironment(pnpPath, cb) - } - return withNonPnpEnvironment(base, cb) -} - -function withPnpEnvironment(pnpPath, cb) { - const basePath = path.dirname(pnpPath) - - // 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) - - const pnpResolve = (request, from = basePath) => { - return pnpapi.resolveRequest(request, from + '/') - } - - const pnpRequire = (request, from) => { - return __non_webpack_require__(pnpResolve(request, from)) - } - - const res = cb({ 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({ - require(request, from = base) { - return importFrom(from, request) - }, - resolve(request, from = base) { - return resolveFrom(from, request) - }, - }) -} diff --git a/packages/tailwindcss-intellisense/src/class-names/getPlugins.js b/packages/tailwindcss-intellisense/src/class-names/getPlugins.js index 5f3bf80954a7e610f14c2506b93415fcfb372feb..1fa3e50458f82284ed466a4f27251857d2dc76f1 100644 --- a/packages/tailwindcss-intellisense/src/class-names/getPlugins.js +++ b/packages/tailwindcss-intellisense/src/class-names/getPlugins.js @@ -2,19 +2,22 @@ import * as path from 'path' import stackTrace from 'stack-trace' import pkgUp from 'pkg-up' import { isObject } from './isObject' -import { withUserEnvironment } from './environment' +import resolveFrom from 'resolve-from' +import importFrom from 'import-from' export async function getBuiltInPlugins({ cwd, resolvedConfig }) { - return withUserEnvironment(cwd, ({ require, resolve }) => { - const tailwindBase = path.dirname(resolve('tailwindcss/package.json')) - try { - return require('./lib/corePlugins.js', tailwindBase).default({ - corePlugins: resolvedConfig.corePlugins, - }) - } catch (_) { - return [] - } - }) + const tailwindBase = path.dirname( + resolveFrom(cwd, 'tailwindcss/package.json') + ) + + try { + // TODO: add v0 support ("generators") + return importFrom(tailwindBase, './lib/corePlugins.js').default({ + corePlugins: resolvedConfig.corePlugins, + }) + } catch (_) { + return [] + } } export default function getPlugins(config) { @@ -31,12 +34,19 @@ pluginConfig = {} } let contributes = { - theme: isObject(pluginConfig.theme) ? Object.keys(pluginConfig.theme) : [], - variants: isObject(pluginConfig.variants) ? Object.keys(pluginConfig.variants) : [], + theme: isObject(pluginConfig.theme) + ? Object.keys(pluginConfig.theme) + : [], + variants: isObject(pluginConfig.variants) + ? Object.keys(pluginConfig.variants) + : [], } const fn = plugin.handler || plugin - const fnName = typeof fn.name === 'string' && fn.name !== 'handler' && fn.name !== '' ? fn.name : null + const fnName = + typeof fn.name === 'string' && fn.name !== 'handler' && fn.name !== '' + ? fn.name + : null try { fn() diff --git a/packages/tailwindcss-intellisense/src/class-names/index.js b/packages/tailwindcss-intellisense/src/class-names/index.js index 29a06fd988ff44ec906c1e79f60f2cac7ee00402..773faee0927bf1e835a0949695888b6a5200aa63 100644 --- a/packages/tailwindcss-intellisense/src/class-names/index.js +++ b/packages/tailwindcss-intellisense/src/class-names/index.js @@ -2,6 +2,8 @@ import extractClassNames from './extractClassNames' import Hook from './hook' import dlv from 'dlv' import dset from 'dset' +import resolveFrom from 'resolve-from' +import importFrom from 'import-from' import chokidar from 'chokidar' import semver from 'semver' import invariant from 'tiny-invariant' @@ -13,7 +15,6 @@ import * as fs from 'fs' import { getUtilityConfigMap } from './getUtilityConfigMap' import glob from 'fast-glob' import normalizePath from 'normalize-path' -import { withUserEnvironment } from './environment' function arraysEqual(arr1, arr2) { return ( @@ -30,6 +31,12 @@ cwd = process.cwd(), { onChange = () => {} } = {} ) { async function run() { + let postcss + let tailwindcss + let browserslistModule + let version + let featureFlags = { future: [], experimental: [] } + const configPaths = ( await glob(CONFIG_GLOB, { cwd, @@ -46,10 +53,21 @@ invariant(configPaths.length > 0, 'No Tailwind CSS config found.') const configPath = configPaths[0] const configDir = path.dirname(configPath) - const { - version, - featureFlags = { future: [], experimental: [] }, - } = loadMeta(configDir) + const tailwindBase = path.dirname( + resolveFrom(configDir, 'tailwindcss/package.json') + ) + postcss = importFrom(tailwindBase, 'postcss') + tailwindcss = importFrom(configDir, 'tailwindcss') + version = importFrom(configDir, 'tailwindcss/package.json').version + + try { + // this is not required + browserslistModule = importFrom(tailwindBase, 'browserslist') + } catch (_) {} + + try { + featureFlags = importFrom(tailwindBase, './lib/featureFlags.js').default + } catch (_) {} const sepLocation = semver.gte(version, '0.99.0') ? ['separator'] @@ -76,68 +94,45 @@ } hook.unwatch() - const { - base, - components, - utilities, - resolvedConfig, - browserslist, - postcss, - } = await withPackages( - configDir, - async ({ postcss, tailwindcss, browserslistModule }) => { - let postcssResult - try { - postcssResult = await Promise.all( - [ - semver.gte(version, '0.99.0') ? 'base' : 'preflight', - 'components', - 'utilities', - ].map((group) => - postcss([tailwindcss(configPath)]).process( - `@tailwind ${group};`, - { - from: undefined, - } - ) - ) - ) - } catch (error) { - throw error - } finally { - hook.unhook() - } + let postcssResult - const [base, components, utilities] = postcssResult + try { + postcssResult = await Promise.all( + [ + semver.gte(version, '0.99.0') ? 'base' : 'preflight', + 'components', + 'utilities', + ].map((group) => + postcss([tailwindcss(configPath)]).process(`@tailwind ${group};`, { + from: undefined, + }) + ) + ) + } catch (error) { + throw error + } finally { + hook.unhook() + } - if (typeof userSeperator !== 'undefined') { - dset(config, sepLocation, userSeperator) - } else { - delete config[sepLocation] - } - if (typeof userPurge !== 'undefined') { - config.purge = userPurge - } else { - delete config.purge - } + const [base, components, utilities] = postcssResult - const resolvedConfig = resolveConfig({ cwd: configDir, config }) - const browserslist = browserslistModule - ? browserslistModule(undefined, { - path: configDir, - }) - : [] + if (typeof userSeperator !== 'undefined') { + dset(config, sepLocation, userSeperator) + } else { + delete config[sepLocation] + } + if (typeof userPurge !== 'undefined') { + config.purge = userPurge + } else { + delete config.purge + } - return { - base, - components, - utilities, - resolvedConfig, - postcss, - browserslist, - } - } - ) + const resolvedConfig = resolveConfig({ cwd: configDir, config }) + const browserslist = browserslistModule + ? browserslistModule(undefined, { + path: configDir, + }) + : [] return { version, @@ -159,6 +154,7 @@ postcss, browserslist, }), modules: { + tailwindcss, postcss, }, featureFlags, @@ -197,8 +193,7 @@ let result try { result = await run() - } catch (e) { - console.log(e) + } catch (_) { return null } @@ -206,32 +201,3 @@ watch([result.configPath, ...result.dependencies]) return result } - -function loadMeta(configDir) { - return withUserEnvironment(configDir, ({ require, resolve }) => { - const version = require('tailwindcss/package.json').version - let featureFlags - - try { - const tailwindBase = path.dirname(resolve('tailwindcss/package.json')) - featureFlags = require('./lib/featureFlags.js', tailwindBase).default - } catch (_) {} - - return { version, featureFlags } - }) -} - -function withPackages(configDir, cb) { - return withUserEnvironment(configDir, async ({ require, resolve }) => { - const tailwindBase = path.dirname(resolve('tailwindcss/package.json')) - const postcss = require('postcss', tailwindBase) - const tailwindcss = require('tailwindcss') - let browserslistModule - try { - // this is not required - browserslistModule = require('browserslist', tailwindBase) - } catch (_) {} - - return cb({ postcss, tailwindcss, browserslistModule }) - }) -} diff --git a/packages/tailwindcss-intellisense/src/class-names/resolveConfig.js b/packages/tailwindcss-intellisense/src/class-names/resolveConfig.js index 6085a00b9366ac34fc3fca64ea9102823e7cd2e3..49a31546ef78ffbbec10b5d55dabb74b798a15e8 100644 --- a/packages/tailwindcss-intellisense/src/class-names/resolveConfig.js +++ b/packages/tailwindcss-intellisense/src/class-names/resolveConfig.js @@ -1,8 +1,14 @@ +import resolveFrom from 'resolve-from' +import importFrom from 'import-from' import * as path from 'path' import decache from './decache' -import { withUserEnvironment } from './environment' export default function resolveConfig({ cwd, config }) { + const tailwindBase = path.dirname( + resolveFrom(cwd, 'tailwindcss/package.json') + ) + let resolve = (x) => x + if (typeof config === 'string') { if (!cwd) { cwd = path.dirname(config) @@ -11,19 +17,21 @@ decache(config) config = __non_webpack_require__(config) } - let resolve = (x) => x - withUserEnvironment(cwd, ({ require, resolve }) => { - const tailwindBase = path.dirname(resolve('tailwindcss/package.json')) + try { + resolve = importFrom(tailwindBase, './resolveConfig.js') + } catch (_) { try { - resolve = require('./resolveConfig.js', tailwindBase) - } catch (_) { - try { - const resolveConfig = require('./lib/util/resolveConfig.js', tailwindBase) - const defaultConfig = require('./stubs/defaultConfig.stub.js', tailwindBase) - resolve = (config) => resolveConfig([config, defaultConfig]) - } catch (_) {} - } - }) + const resolveConfig = importFrom( + tailwindBase, + './lib/util/resolveConfig.js' + ) + const defaultConfig = importFrom( + tailwindBase, + './stubs/defaultConfig.stub.js' + ) + resolve = (config) => resolveConfig([config, defaultConfig]) + } catch (_) {} + } return resolve(config) }