@@ -17,7 +17,7 @@ import loadConfigFallback from 'tailwindcss/loadConfig'
17
17
import resolveConfigFallback from 'tailwindcss/resolveConfig'
18
18
import type { RequiredConfig } from 'tailwindcss/types/config.js'
19
19
import { expiringMap } from './expiring-map.js'
20
- import { resolveJsFrom } from './resolve'
20
+ import { resolveCssFrom , resolveJsFrom } from './resolve'
21
21
import type { ContextContainer } from './types'
22
22
23
23
let sourceToPathMap = new Map < string , string | null > ( )
@@ -150,15 +150,17 @@ async function loadTailwindConfig(
150
150
* everything from working so we'll let the error handler decide how to proceed.
151
151
*/
152
152
function createLoader < T > ( {
153
+ legacy,
153
154
filepath,
154
155
onError,
155
156
} : {
157
+ legacy : boolean
156
158
filepath : string
157
- onError : ( id : string , error : unknown ) => T
159
+ onError : ( id : string , error : unknown , resourceType : string ) => T
158
160
} ) {
159
161
let cacheKey = `${ + Date . now ( ) } `
160
162
161
- async function loadFile ( id : string , base : string ) {
163
+ async function loadFile ( id : string , base : string , resourceType : string ) {
162
164
try {
163
165
let resolved = resolveJsFrom ( base , id )
164
166
@@ -167,12 +169,21 @@ function createLoader<T>({
167
169
168
170
return await import ( url . href ) . then ( ( m ) => m . default ?? m )
169
171
} catch ( err ) {
170
- return onError ( id , err )
172
+ return onError ( id , err , resourceType )
171
173
}
172
174
}
173
175
174
- let baseDir = path . dirname ( filepath )
175
- return ( id : string ) => loadFile ( id , baseDir )
176
+ if ( legacy ) {
177
+ let baseDir = path . dirname ( filepath )
178
+ return ( id : string ) => loadFile ( id , baseDir , 'module' )
179
+ }
180
+
181
+ return async ( id : string , base : string , resourceType : string ) => {
182
+ return {
183
+ base,
184
+ module : await loadFile ( id , base , resourceType ) ,
185
+ }
186
+ }
176
187
}
177
188
178
189
async function loadV4 (
@@ -193,16 +204,63 @@ async function loadV4(
193
204
// If the user doesn't define an entrypoint then we use the default theme
194
205
entryPoint = entryPoint ?? `${ pkgDir } /theme.css`
195
206
207
+ let importBasePath = path . dirname ( entryPoint )
208
+
196
209
// Resolve imports in the entrypoint to a flat CSS tree
197
210
let css = await fs . readFile ( entryPoint , 'utf-8' )
198
- let resolveImports = postcss ( [ postcssImport ( ) ] )
199
- let result = await resolveImports . process ( css , { from : entryPoint } )
200
- css = result . css
211
+
212
+ // Determine if the v4 API supports resolving `@import`
213
+ let supportsImports = false
214
+ try {
215
+ await tw . __unstable__loadDesignSystem ( '@import "./empty";' , {
216
+ loadStylesheet : ( ) => {
217
+ supportsImports = true
218
+ return {
219
+ base : importBasePath ,
220
+ content : '' ,
221
+ }
222
+ } ,
223
+ } )
224
+ } catch { }
225
+
226
+ if ( ! supportsImports ) {
227
+ let resolveImports = postcss ( [ postcssImport ( ) ] )
228
+ let result = await resolveImports . process ( css , { from : entryPoint } )
229
+ css = result . css
230
+ }
201
231
202
232
// Load the design system and set up a compatible context object that is
203
233
// usable by the rest of the plugin
204
234
let design = await tw . __unstable__loadDesignSystem ( css , {
235
+ base : importBasePath ,
236
+
237
+ // v4.0.0-alpha.25+
238
+ loadModule : createLoader ( {
239
+ legacy : false ,
240
+ filepath : entryPoint ,
241
+ onError : ( id , err , resourceType ) => {
242
+ console . error ( `Unable to load ${ resourceType } : ${ id } ` , err )
243
+
244
+ if ( resourceType === 'config' ) {
245
+ return { }
246
+ } else if ( resourceType === 'plugin' ) {
247
+ return ( ) => { }
248
+ }
249
+ } ,
250
+ } ) ,
251
+
252
+ loadStylesheet : async ( id : string , base : string ) => {
253
+ let resolved = resolveCssFrom ( base , id )
254
+
255
+ return {
256
+ base : path . dirname ( resolved ) ,
257
+ content : await fs . readFile ( resolved , 'utf-8' ) ,
258
+ }
259
+ } ,
260
+
261
+ // v4.0.0-alpha.24 and below
205
262
loadPlugin : createLoader ( {
263
+ legacy : true ,
206
264
filepath : entryPoint ,
207
265
onError ( id , err ) {
208
266
console . error ( `Unable to load plugin: ${ id } ` , err )
@@ -212,6 +270,7 @@ async function loadV4(
212
270
} ) ,
213
271
214
272
loadConfig : createLoader ( {
273
+ legacy : true ,
215
274
filepath : entryPoint ,
216
275
onError ( id , err ) {
217
276
console . error ( `Unable to load config: ${ id } ` , err )
0 commit comments