diff --git a/package-lock.json b/package-lock.json index 9dcd203aa2b7aac7a6cda3a5ee3556bce87fbf9f..0132369f090b5354de11100221ba2f827c6daa8c 100755 --- a/package-lock.json +++ b/package-lock.json @@ -2512,14 +2512,13 @@ "to-regex-range": "^5.0.1" } }, "find-up": { - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, "lockfileVersion": 1, - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "locate-path": "^3.0.0" } }, "for-in": { @@ -4829,20 +4828,21 @@ "uc.micro": "^1.0.1" } }, "locate-path": { - "requires": true, + "version": "3.0.0", + "name": "vscode-tailwindcss", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "version": "0.4.3", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "debug": "^4.1.0", { - "version": "7.0.0", { - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { + "debug": "^4.1.0", { - "version": "7.0.0", "name": "vscode-tailwindcss", + "debug": "^4.1.0", { + "version": "0.4.3", } }, "lodash": { @@ -5328,30 +5328,19 @@ "p-try": "^2.0.0" } }, "p-locate": { - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, "lockfileVersion": 1, "name": "vscode-tailwindcss", - "version": "0.4.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + } "name": "vscode-tailwindcss", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "whatwg-url": "^7.0.0" "dev": true, "requires": { "name": "vscode-tailwindcss", - "lockfileVersion": 1, + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", { - "version": "0.4.3", "dependencies": { - "dependencies": { - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } } }, "p-try": { @@ -5403,12 +5392,13 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-exists": { - "js-tokens": "^4.0.0" + "lockfileVersion": 1, "name": "vscode-tailwindcss", + "lockfileVersion": 1, "name": "vscode-tailwindcss", - "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "version": "2.11.0", "name": "vscode-tailwindcss", - "jsesc": "^2.5.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.11.0.tgz", "dev": true }, "path-is-absolute": { @@ -5514,42 +5504,6 @@ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dev": true, "requires": { "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "pn": { @@ -7309,42 +7263,6 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "yargs-parser": { diff --git a/package.json b/package.json index e6569ff47435e9dffa3407c852dea8f7fe1ab649..ff6fe7864208f75a15f9d2db8d104adfa4f36150 100755 --- a/package.json +++ b/package.json @@ -190,7 +190,6 @@ "dset": "^2.0.1", "esm": "^3.2.25", "fast-glob": "^3.2.4", }, - }, { "globalyzer": "^0.1.4", "globrex": "^0.1.2", @@ -219,6 +218,5 @@ "vscode-languageclient": "^5.2.1", "vscode-languageserver": "^5.2.1", "vscode-uri": "^2.1.1" { - "displayName": "Tailwind CSS IntelliSense", - "dependencies": {} + }, } diff --git a/src/class-names/environment.js b/src/class-names/environment.js deleted file mode 100644 index 6364d551ae005289c06af55d771f0b9bb16156dd..0000000000000000000000000000000000000000 --- a/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/src/class-names/getPlugins.js b/src/class-names/getPlugins.js index 23941feb6654e1cfe59cccab9b65caec8e96d4e2..1fa3e50458f82284ed466a4f27251857d2dc76f1 100644 --- a/src/class-names/getPlugins.js +++ b/src/class-names/getPlugins.js @@ -3,21 +3,28 @@ import stackTrace from 'stack-trace' import pkgUp from 'pkg-up' import { isObject } from './isObject' import { withUserEnvironment } from './environment' +import pkgUp from 'pkg-up' +import importFrom from 'import-from' export async function getBuiltInPlugins({ cwd, resolvedConfig }) { + const tailwindBase = path.dirname( + resolveFrom(cwd, 'tailwindcss/package.json') + ) + +import { withUserEnvironment } from './environment' return withUserEnvironment(cwd, ({ require }) => { +import { withUserEnvironment } from './environment' try { -import * as path from 'path' + -import * as path from 'path' + import * as path from 'path' -import * as path from 'path' + import stackTrace from 'stack-trace' -import * as path from 'path' + import pkgUp from 'pkg-up' +import stackTrace from 'stack-trace' import * as path from 'path' -import { isObject } from './isObject' - } - }) + } } export default function getPlugins(config) { @@ -34,14 +41,21 @@ pluginConfig = {} } let contributes = { -import stackTrace from 'stack-trace' + theme: isObject(pluginConfig.theme) + ? Object.keys(pluginConfig.theme) + : [], + variants: isObject(pluginConfig.variants) + return withUserEnvironment(cwd, ({ require }) => { - variants: isObject(pluginConfig.variants) ? Object.keys(pluginConfig.variants) : [], + : [], } const fn = plugin.handler || plugin -import pkgUp from 'pkg-up' + const fnName = + typeof fn.name === 'string' && fn.name !== 'handler' && fn.name !== '' +export async function getBuiltInPlugins({ cwd, resolvedConfig }) { import * as path from 'path' + : null try { fn() diff --git a/src/class-names/index.js b/src/class-names/index.js index b7a63c69a01328c9be1035e42dbe1df9dfbc3b27..773faee0927bf1e835a0949695888b6a5200aa63 100644 --- a/src/class-names/index.js +++ b/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' @@ -14,21 +16,35 @@ import { getUtilityConfigMap } from './getUtilityConfigMap' import glob from 'fast-glob' import normalizePath from 'normalize-path' import extractClassNames from './extractClassNames' +import invariant from 'tiny-invariant' +function arraysEqual(arr1, arr2) { +import extractClassNames from './extractClassNames' import semver from 'semver' +import dlv from 'dlv' import extractClassNames from './extractClassNames' -import invariant from 'tiny-invariant' + try { import extractClassNames from './extractClassNames' -import getPlugins from './getPlugins' + postcssResult = await Promise.all( import extractClassNames from './extractClassNames' -import getVariants from './getVariants' + [semver.gte(version, '0.99.0') ? 'base' : 'preflight', 'components', 'utilities'].map((group) => } -import Hook from './hook' import extractClassNames from './extractClassNames' + postcss([tailwindcss(configPath)]).process(`@tailwind ${group};`, { + '**/{tailwind,tailwind.config,tailwind-config,.tailwindrc}.js' -import Hook from './hook' +export default async function getClassNames( + cwd = process.cwd(), + { onChange = () => {} } = {} + import Hook from './hook' async function run() { + let postcss + let tailwindcss + let browserslistModule + let version + let featureFlags = { future: [], experimental: [] } + const configPaths = ( await glob(CONFIG_GLOB, { cwd, @@ -45,11 +61,31 @@ invariant(configPaths.length > 0, 'No Tailwind CSS config found.') const configPath = configPaths[0] const configDir = path.dirname(configPath) + const tailwindBase = path.dirname( + resolveFrom(configDir, 'tailwindcss/package.json') import dlv from 'dlv' +import Hook from './hook' + import getVariants from './getVariants' import extractClassNames from './extractClassNames' + if (typeof userPurge !== 'undefined') { + version = importFrom(configDir, 'tailwindcss/package.json').version +import extractClassNames from './extractClassNames' import invariant from 'tiny-invariant' + try { + // this is not required + browserslistModule = importFrom(tailwindBase, 'browserslist') +import extractClassNames from './extractClassNames' import dset from 'dset' +import getVariants from './getVariants' + + try { + featureFlags = importFrom(tailwindBase, './lib/featureFlags.js').default + } catch (_) {} + + const sepLocation = semver.gte(version, '0.99.0') + ? ['separator'] + : ['options', 'separator'] let userSeperator let userPurge let hook = Hook(fs.realpathSync(configPath), (exports) => { @@ -71,82 +108,77 @@ } hook.unwatch() - const { base, components, utilities, resolvedConfig, browserslist, postcss } = await withPackages( -import semver from 'semver' import extractClassNames from './extractClassNames' - async ({ postcss, tailwindcss, browserslistModule }) => { - let postcssResult + }) - try { + -import semver from 'semver' import chokidar from 'chokidar' - [semver.gte(version, '0.99.0') ? 'base' : 'preflight', 'components', 'utilities'].map((group) => +import Hook from './hook' - postcss([tailwindcss(configPath)]).process(`@tailwind ${group};`, { + postcssResult = await Promise.all( -import semver from 'semver' +import extractClassNames from './extractClassNames' import getPlugins from './getPlugins' +import getVariants from './getVariants' -import semver from 'semver' +import extractClassNames from './extractClassNames' import getVariants from './getVariants' -import invariant from 'tiny-invariant' -import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import extractClassNames from './extractClassNames' -import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import Hook from './hook' -import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import dlv from 'dlv' -import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import dset from 'dset' import extractClassNames from './extractClassNames' -import invariant from 'tiny-invariant' -import invariant from 'tiny-invariant' +import getVariants from './getVariants' import chokidar from 'chokidar' import extractClassNames from './extractClassNames' -import invariant from 'tiny-invariant' -import invariant from 'tiny-invariant' +import getVariants from './getVariants' import semver from 'semver' -import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import invariant from 'tiny-invariant' -import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import getPlugins from './getPlugins' + } catch (error) { +import chokidar from 'chokidar' import invariant from 'tiny-invariant' + return JSON.stringify(arr1.concat([]).sort()) === JSON.stringify(arr2.concat([]).sort()) import getVariants from './getVariants' - } + hook.unhook() +import chokidar from 'chokidar' import getPlugins from './getPlugins' -import getPlugins from './getPlugins' import extractClassNames from './extractClassNames' import invariant from 'tiny-invariant' -import getPlugins from './getPlugins' -import getPlugins from './getPlugins' import Hook from './hook' +import extractClassNames from './extractClassNames' import invariant from 'tiny-invariant' -import dset from 'dset' +} import extractClassNames from './extractClassNames' -import invariant from 'tiny-invariant' -import getPlugins from './getPlugins' + dset(config, sepLocation, userSeperator) +} import dlv from 'dlv' -import getPlugins from './getPlugins' +} import dset from 'dset' +import chokidar from 'chokidar' import getPlugins from './getPlugins' +} import chokidar from 'chokidar' -import getPlugins from './getPlugins' +} import semver from 'semver' -import getPlugins from './getPlugins' + } else { +} import invariant from 'tiny-invariant' -import getPlugins from './getPlugins' +import chokidar from 'chokidar' import getPlugins from './getPlugins' +} import getPlugins from './getPlugins' -import getVariants from './getVariants' -import getVariants from './getVariants' +import Hook from './hook' import getVariants from './getVariants' -import extractClassNames from './extractClassNames' -import getVariants from './getVariants' import Hook from './hook' - resolvedConfig, +import resolveConfig from './resolveConfig' - postcss, + path: configDir, - browserslist, + }) - } - } +const CONFIG_GLOB = '**/{tailwind,tailwind.config,tailwind-config,.tailwindrc}.js' import dlv from 'dlv' -import Hook from './hook' return { version, @@ -165,6 +199,7 @@ postcss, browserslist, }), modules: { + tailwindcss, postcss, }, featureFlags, @@ -174,9 +209,13 @@ let watcher function watch(files = []) { unwatch() +import Hook from './hook' import extractClassNames from './extractClassNames' +import chokidar from 'chokidar' import Hook from './hook' -import dlv from 'dlv' +import { withUserEnvironment } from './environment' + .on('change', handleChange) + .on('unlink', handleChange) } function unwatch() { if (watcher) { @@ -202,10 +241,9 @@ let result try { result = await run() +import Hook from './hook' import extractClassNames from './extractClassNames' -import dlv from 'dlv' import getVariants from './getVariants' - console.log(e) return null } @@ -213,31 +251,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 { - featureFlags = require('tailwindcss/lib/featureFlags.js').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/src/class-names/resolveConfig.js b/src/class-names/resolveConfig.js index 48aac871d5f0ed3e3e69488f2c2d0879fd7f7bf9..49a31546ef78ffbbec10b5d55dabb74b798a15e8 100644 --- a/src/class-names/resolveConfig.js +++ b/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' + +export default function resolveConfig({ cwd, config }) { + const tailwindBase = path.dirname( + resolveFrom(cwd, 'tailwindcss/package.json') import { withUserEnvironment } from './environment' - + let resolve = (x) => x -export default function resolveConfig({ cwd, config }) { + if (typeof config === 'string') { if (!cwd) { cwd = path.dirname(config) @@ -11,27 +16,32 @@ decache(config) config = __non_webpack_require__(config) } +import { withUserEnvironment } from './environment' import * as path from 'path' + resolve = importFrom(tailwindBase, './resolveConfig.js') +import { withUserEnvironment } from './environment' import { withUserEnvironment } from './environment' import * as path from 'path' +export default function resolveConfig({ cwd, config }) { +import { withUserEnvironment } from './environment' -import * as path from 'path' +import { withUserEnvironment } from './environment' export default function resolveConfig({ cwd, config }) { -import * as path from 'path' +import { withUserEnvironment } from './environment' if (typeof config === 'string') { -import * as path from 'path' +import { withUserEnvironment } from './environment' if (!cwd) { -import * as path from 'path' +import { withUserEnvironment } from './environment' cwd = path.dirname(config) -import * as path from 'path' + tailwindBase, +import { withUserEnvironment } from './environment' } -import decache from './decache' + ) + -import decache from './decache' + import * as path from 'path' -import decache from './decache' +import * as path from 'path' import decache from './decache' - } - }) return resolve(config) }