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