Skip to content

Commit 9e91134

Browse files
committed
wip
1 parent fa68c54 commit 9e91134

File tree

4 files changed

+103
-9
lines changed

4 files changed

+103
-9
lines changed

package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/tailwindcss-language-server/src/server.ts

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ function first<T>(...options: Array<() => T>): T {
150150
}
151151
}
152152

153+
function firstOptional<T>(...options: Array<() => T>): T | undefined {
154+
for (let i = 0; i < options.length; i++) {
155+
let option = options[i]
156+
try {
157+
return option()
158+
} catch (_) {}
159+
}
160+
}
161+
153162
interface ProjectService {
154163
state: State
155164
tryInit: () => Promise<void>
@@ -528,8 +537,8 @@ async function createProjectService(
528537
}
529538

530539
if (semver.gte(tailwindcssVersion, '1.99.0')) {
531-
applyComplexClasses = __non_webpack_require__(
532-
resolveFrom(tailwindDir, './lib/lib/substituteClassApplyAtRules')
540+
applyComplexClasses = firstOptional(() =>
541+
__non_webpack_require__(resolveFrom(tailwindDir, './lib/lib/substituteClassApplyAtRules'))
533542
)
534543
} else if (semver.gte(tailwindcssVersion, '1.7.0')) {
535544
applyComplexClasses = __non_webpack_require__(
@@ -551,6 +560,13 @@ async function createProjectService(
551560

552561
try {
553562
let createContext = first(
563+
() => {
564+
let createContextFn = __non_webpack_require__(
565+
resolveFrom(configDir, 'tailwindcss/lib/lib/setupContextUtils')
566+
).createContext
567+
assert.strictEqual(typeof createContextFn, 'function')
568+
return (state) => createContextFn(state.config)
569+
},
554570
() => {
555571
let createContextFn = __non_webpack_require__(
556572
resolveFrom(configDir, 'tailwindcss/lib/jit/lib/setupContextUtils')
@@ -582,17 +598,30 @@ async function createProjectService(
582598

583599
jitModules = {
584600
generateRules: {
585-
module: __non_webpack_require__(
586-
resolveFrom(configDir, 'tailwindcss/lib/jit/lib/generateRules')
587-
).generateRules,
601+
module: first(
602+
() =>
603+
__non_webpack_require__(resolveFrom(configDir, 'tailwindcss/lib/lib/generateRules'))
604+
.generateRules,
605+
() =>
606+
__non_webpack_require__(
607+
resolveFrom(configDir, 'tailwindcss/lib/jit/lib/generateRules')
608+
).generateRules
609+
),
588610
},
589611
createContext: {
590612
module: createContext,
591613
},
592614
expandApplyAtRules: {
593-
module: __non_webpack_require__(
594-
resolveFrom(configDir, 'tailwindcss/lib/jit/lib/expandApplyAtRules')
595-
).default,
615+
module: first(
616+
() =>
617+
__non_webpack_require__(
618+
resolveFrom(configDir, 'tailwindcss/lib/lib/expandApplyAtRules')
619+
).default,
620+
() =>
621+
__non_webpack_require__(
622+
resolveFrom(configDir, 'tailwindcss/lib/jit/lib/expandApplyAtRules')
623+
).default
624+
),
596625
},
597626
}
598627
} catch (_) {
@@ -753,7 +782,8 @@ async function createProjectService(
753782
}
754783
delete exports.mode
755784

756-
if (state.modules.jit && mode === 'jit') {
785+
// TODO
786+
if (false || (state.modules.jit && mode === 'jit')) {
757787
state.jit = true
758788
exports.variants = []
759789

packages/tailwindcss-language-service/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"@ctrl/tinycolor": "3.1.4",
1818
"@types/moo": "0.5.3",
1919
"css.escape": "1.5.1",
20+
"culori": "0.20.1",
2021
"detect-indent": "6.0.0",
2122
"dlv": "1.1.3",
2223
"dset": "2.0.1",

packages/tailwindcss-language-service/src/completionProvider.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { createMultiRegexp } from './util/createMultiRegexp'
3333
import * as jit from './util/jit'
3434
import { TinyColor } from '@ctrl/tinycolor'
3535
import { getVariantsFromClassName } from './util/getVariantsFromClassName'
36+
import * as culori from 'culori'
3637

3738
let isUtil = (className) =>
3839
Array.isArray(className.__info)
@@ -169,6 +170,57 @@ export function completionsFromClassList(
169170
)
170171
}
171172

173+
if (state.jitContext.completions) {
174+
return {
175+
isIncomplete: false,
176+
items: items.concat(
177+
state.jitContext.completions().map((item, index) => {
178+
let color =
179+
Array.isArray(item) && typeof item[1].color === 'string' ? item[1].color.trim() : null
180+
181+
let kind: CompletionItemKind = color ? 16 : 21
182+
183+
if (color) {
184+
let parsedColor = culori.parse(color)
185+
if (parsedColor) {
186+
if (color.startsWith('#')) {
187+
color =
188+
parsedColor.alpha === 1 || parsedColor.alpha === undefined
189+
? color.length === 5
190+
? color.slice(0, -1)
191+
: color.length === 9
192+
? color.slice(0, -2)
193+
: color
194+
: culori.formatRgb(parsedColor)
195+
} else if (parsedColor.mode === 'hsl') {
196+
color = culori.formatHsl(parsedColor)
197+
} else if (parsedColor.mode === 'rgb') {
198+
color = culori.formatRgb(parsedColor)
199+
}
200+
} else {
201+
color = null
202+
}
203+
}
204+
205+
let className = typeof item === 'string' ? item : item[0]
206+
let documentation = color
207+
208+
return {
209+
label: className,
210+
kind,
211+
documentation,
212+
sortText: naturalExpand(index),
213+
data: [...existingVariants, important ? `!${className}` : className],
214+
textEdit: {
215+
newText: className,
216+
range: replacementRange,
217+
},
218+
} as CompletionItem
219+
})
220+
),
221+
}
222+
}
223+
172224
return {
173225
isIncomplete: false,
174226
items: items

0 commit comments

Comments
 (0)