Skip to content

Commit 1c4d2cf

Browse files
committed
Support Vite Environment API
1 parent 6c30d5e commit 1c4d2cf

File tree

1 file changed

+49
-17
lines changed

1 file changed

+49
-17
lines changed

packages/@tailwindcss-vite/src/index.ts

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import { clearRequireCache } from '@tailwindcss/node/require-cache'
1111
import { Scanner } from '@tailwindcss/oxide'
1212
import fs from 'node:fs/promises'
1313
import path from 'node:path'
14-
import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite'
14+
import type { Environment, Plugin, ResolvedConfig, ViteDevServer } from 'vite'
15+
import * as vite from 'vite'
1516

1617
const DEBUG = env.DEBUG
1718
const SPECIAL_QUERY_RE = /[?&](?:worker|sharedworker|raw|url)\b/
@@ -21,27 +22,50 @@ const INLINE_STYLE_ID_RE = /[?&]index\=\d+\.css$/
2122
export default function tailwindcss(): Plugin[] {
2223
let servers: ViteDevServer[] = []
2324
let config: ResolvedConfig | null = null
25+
let roots = new Map<string, Root>()
2426

2527
let isSSR = false
2628
let minify = false
2729

28-
let roots: DefaultMap<string, Root> = new DefaultMap((id) => {
29-
let cssResolver = config!.createResolver({
30-
...config!.resolve,
31-
extensions: ['.css'],
32-
mainFields: ['style'],
33-
conditions: ['style', 'development|production'],
34-
tryIndex: false,
35-
preferRelative: true,
36-
})
37-
function customCssResolver(id: string, base: string) {
38-
return cssResolver(id, base, true, isSSR)
39-
}
30+
function createRoot(env: Environment | null, id: string) {
31+
type ResolveFn = (id: string, base: string) => Promise<string | false | undefined>
32+
33+
let customCssResolver: ResolveFn
34+
let customJsResolver: ResolveFn
35+
36+
if (!env) {
37+
// Older, pre-environment Vite API
38+
// TODO: Can we drop this??
39+
let cssResolver = config!.createResolver({
40+
...config!.resolve,
41+
extensions: ['.css'],
42+
mainFields: ['style'],
43+
conditions: ['style', 'development|production'],
44+
tryIndex: false,
45+
preferRelative: true,
46+
})
47+
48+
let jsResolver = config!.createResolver(config!.resolve)
49+
50+
customCssResolver = (id: string, base: string) => cssResolver(id, base, true, isSSR)
51+
customJsResolver = (id: string, base: string) => jsResolver(id, base, true, isSSR)
52+
} else {
53+
// Newer View versions
54+
let cssResolver = vite.createIdResolver(env.config, {
55+
...env.config.resolve,
56+
extensions: ['.css'],
57+
mainFields: ['style'],
58+
conditions: ['style', 'development|production'],
59+
tryIndex: false,
60+
preferRelative: true,
61+
})
4062

41-
let jsResolver = config!.createResolver(config!.resolve)
42-
function customJsResolver(id: string, base: string) {
43-
return jsResolver(id, base, true, isSSR)
63+
let jsResolver = vite.createIdResolver(env.config, env.config.resolve)
64+
65+
customCssResolver = (id: string, base: string) => cssResolver(env, id, base, true)
66+
customJsResolver = (id: string, base: string) => jsResolver(env, id, base, true)
4467
}
68+
4569
return new Root(
4670
id,
4771
config!.root,
@@ -51,7 +75,7 @@ export default function tailwindcss(): Plugin[] {
5175
customCssResolver,
5276
customJsResolver,
5377
)
54-
})
78+
}
5579

5680
return [
5781
{
@@ -83,6 +107,10 @@ export default function tailwindcss(): Plugin[] {
83107
DEBUG && I.start('[@tailwindcss/vite] Generate CSS (serve)')
84108

85109
let root = roots.get(id)
110+
if (!root) {
111+
root ??= createRoot(this.environment ?? null, id)
112+
roots.set(id, root)
113+
}
86114

87115
let result = await root.generate(src, (file) => this.addWatchFile(file), I)
88116
if (!result) {
@@ -108,6 +136,10 @@ export default function tailwindcss(): Plugin[] {
108136
DEBUG && I.start('[@tailwindcss/vite] Generate CSS (build)')
109137

110138
let root = roots.get(id)
139+
if (!root) {
140+
root ??= createRoot(this.environment ?? null, id)
141+
roots.set(id, root)
142+
}
111143

112144
let result = await root.generate(src, (file) => this.addWatchFile(file), I)
113145
if (!result) {

0 commit comments

Comments
 (0)