Skip to content

Commit 9a053e9

Browse files
committed
Support Vite Environment API
1 parent 21f2bf9 commit 9a053e9

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/
@@ -28,28 +29,51 @@ export type PluginOptions = {
2829
export default function tailwindcss(opts: PluginOptions = {}): Plugin[] {
2930
let servers: ViteDevServer[] = []
3031
let config: ResolvedConfig | null = null
32+
let roots = new Map<string, Root>()
3133

3234
let isSSR = false
3335
let shouldOptimize = true
3436
let minify = true
3537

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

49-
let jsResolver = config!.createResolver(config!.resolve)
50-
function customJsResolver(id: string, base: string) {
51-
return jsResolver(id, base, true, isSSR)
71+
let jsResolver = vite.createIdResolver(env.config, env.config.resolve)
72+
73+
customCssResolver = (id: string, base: string) => cssResolver(env, id, base, true)
74+
customJsResolver = (id: string, base: string) => jsResolver(env, id, base, true)
5275
}
76+
5377
return new Root(
5478
id,
5579
config!.root,
@@ -59,7 +83,7 @@ export default function tailwindcss(opts: PluginOptions = {}): Plugin[] {
5983
customCssResolver,
6084
customJsResolver,
6185
)
62-
})
86+
}
6387

6488
return [
6589
{
@@ -111,6 +135,10 @@ export default function tailwindcss(opts: PluginOptions = {}): Plugin[] {
111135
DEBUG && I.start('[@tailwindcss/vite] Generate CSS (serve)')
112136

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

115143
let result = await root.generate(src, (file) => this.addWatchFile(file), I)
116144
if (!result) {
@@ -144,6 +172,10 @@ export default function tailwindcss(opts: PluginOptions = {}): Plugin[] {
144172
DEBUG && I.start('[@tailwindcss/vite] Generate CSS (build)')
145173

146174
let root = roots.get(id)
175+
if (!root) {
176+
root ??= createRoot(this.environment ?? null, id)
177+
roots.set(id, root)
178+
}
147179

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

0 commit comments

Comments
 (0)