@@ -259,3 +259,229 @@ test(
259
259
` )
260
260
} ,
261
261
)
262
+
263
+ test (
264
+ 'migrate utilities in an imported file' ,
265
+ {
266
+ fs : {
267
+ 'package.json' : json `
268
+ {
269
+ "dependencies" : {
270
+ "tailwindcss" : "workspace:^" ,
271
+ "@tailwindcss/upgrade" : "workspace:^"
272
+ }
273
+ }
274
+ ` ,
275
+ 'tailwind.config.js' : js `module .exports = {}` ,
276
+ 'src/index.css' : css `
277
+ @import 'tailwindcss' ;
278
+ @import './utilities.css' layer(utilities);
279
+ ` ,
280
+ 'src/utilities.css' : css `
281
+ .no-scrollbar ::-webkit-scrollbar {
282
+ display : none;
283
+ }
284
+
285
+ .no-scrollbar {
286
+ -ms-overflow-style : none;
287
+ scrollbar-width : none;
288
+ }
289
+ ` ,
290
+ } ,
291
+ } ,
292
+ async ( { fs, exec } ) => {
293
+ await exec ( 'npx @tailwindcss/upgrade --force' )
294
+
295
+ expect ( await fs . dumpFiles ( './src/**/*.css' ) ) . toMatchInlineSnapshot ( `
296
+ "
297
+ --- ./src/index.css ---
298
+ @import 'tailwindcss';
299
+ @import './utilities.css';
300
+
301
+ --- ./src/utilities.css ---
302
+ @utility no-scrollbar {
303
+ &::-webkit-scrollbar {
304
+ display: none;
305
+ }
306
+ -ms-overflow-style: none;
307
+ scrollbar-width: none;
308
+ }"
309
+ ` )
310
+ } ,
311
+ )
312
+
313
+ test (
314
+ 'migrate utilities in deep import trees' ,
315
+ {
316
+ fs : {
317
+ 'package.json' : json `
318
+ {
319
+ "dependencies" : {
320
+ "tailwindcss" : "workspace:^" ,
321
+ "@tailwindcss/cli" : "workspace:^" ,
322
+ "@tailwindcss/upgrade" : "workspace:^"
323
+ }
324
+ }
325
+ ` ,
326
+ 'tailwind.config.js' : js `module .exports = {}` ,
327
+ 'src/index.html' : html `
328
+ <div class= "hover:thing" > </ div>
329
+ ` ,
330
+ 'src/index.css' : css `
331
+ @import 'tailwindcss/utilities' ;
332
+ @import './a.1.css' layer(utilities);
333
+ @import './b.1.css' layer(components);
334
+ @import './c.1.css' ;
335
+ @import './d.1.css' ;
336
+ ` ,
337
+ 'src/a.1.css' : css `
338
+ @import './a.1.utilities.css' ;
339
+
340
+ .foo-from-a {
341
+ color : red;
342
+ }
343
+ ` ,
344
+ 'src/a.1.utilities.css' : css `
345
+ # foo {
346
+ --keep : me;
347
+ }
348
+
349
+ .foo-from-import {
350
+ color : blue;
351
+ }
352
+ ` ,
353
+ 'src/b.1.css' : css `
354
+ @import './b.1.components.css' ;
355
+
356
+ .bar-from-b {
357
+ color : red;
358
+ }
359
+ ` ,
360
+ 'src/b.1.components.css' : css `
361
+ .bar-from-import {
362
+ color : blue;
363
+ }
364
+ ` ,
365
+ 'src/c.1.css' : css `
366
+ @import './c.2.css' layer(utilities);
367
+ .baz-from-c {
368
+ color : green;
369
+ }
370
+ ` ,
371
+ 'src/c.2.css' : css `
372
+ @import './c.3.css' ;
373
+ # baz {
374
+ --keep : me;
375
+ }
376
+ .baz-from-import {
377
+ color : yellow;
378
+ }
379
+ ` ,
380
+ 'src/c.3.css' : css `
381
+ # baz {
382
+ --keep : me;
383
+ }
384
+ .baz-from-import {
385
+ color : yellow;
386
+ }
387
+ ` ,
388
+
389
+ // This is a super deep import chain
390
+ // And no `*.utilities.css` files should be created for these
391
+ // because there are no rules that need to be separated
392
+ 'src/d.1.css' : css `@import './d.2.css' layer(utilities);` ,
393
+ 'src/d.2.css' : css `@import './d.3.css' ;` ,
394
+ 'src/d.3.css' : css `@import './d.4.css' ;` ,
395
+ 'src/d.4.css' : css `
396
+ .from-a-4 {
397
+ color : blue;
398
+ }
399
+ ` ,
400
+ } ,
401
+ } ,
402
+ async ( { fs, exec } ) => {
403
+ await exec ( 'npx @tailwindcss/upgrade --force' )
404
+
405
+ expect ( await fs . dumpFiles ( './src/**/*.css' ) ) . toMatchInlineSnapshot ( `
406
+ "
407
+ --- ./src/index.css ---
408
+ @import 'tailwindcss/utilities' layer(utilities);
409
+ @import './a.1.css' layer(utilities);
410
+ @import './a.1.utilities.css';
411
+ @import './b.1.css';
412
+ @import './c.1.css' layer(utilities);
413
+ @import './c.1.utilities.css';
414
+ @import './d.1.css';
415
+
416
+ --- ./src/a.1.css ---
417
+ @import './a.1.utilities.css'
418
+
419
+ --- ./src/a.1.utilities.css ---
420
+ @import './a.1.utilities.utilities.css';
421
+ @utility foo-from-a {
422
+ color: red;
423
+ }
424
+
425
+ --- ./src/a.1.utilities.utilities.css ---
426
+ @utility foo-from-import {
427
+ color: blue;
428
+ }
429
+
430
+ --- ./src/b.1.components.css ---
431
+ @utility bar-from-import {
432
+ color: blue;
433
+ }
434
+
435
+ --- ./src/b.1.css ---
436
+ @import './b.1.components.css';
437
+ @utility bar-from-b {
438
+ color: red;
439
+ }
440
+
441
+ --- ./src/c.1.css ---
442
+ @import './c.2.css' layer(utilities);
443
+ .baz-from-c {
444
+ color: green;
445
+ }
446
+
447
+ --- ./src/c.1.utilities.css ---
448
+ @import './c.2.utilities.css'
449
+
450
+ --- ./src/c.2.css ---
451
+ @import './c.3.css';
452
+ #baz {
453
+ --keep: me;
454
+ }
455
+
456
+ --- ./src/c.2.utilities.css ---
457
+ @import './c.3.utilities.css';
458
+ @utility baz-from-import {
459
+ color: yellow;
460
+ }
461
+
462
+ --- ./src/c.3.css ---
463
+ #baz {
464
+ --keep: me;
465
+ }
466
+
467
+ --- ./src/c.3.utilities.css ---
468
+ @utility baz-from-import {
469
+ color: yellow;
470
+ }
471
+
472
+ --- ./src/d.1.css ---
473
+ @import './d.2.css'
474
+
475
+ --- ./src/d.2.css ---
476
+ @import './d.3.css'
477
+
478
+ --- ./src/d.3.css ---
479
+ @import './d.4.css'
480
+
481
+ --- ./src/d.4.css ---
482
+ @utility from-a-4 {
483
+ color: blue;
484
+ }"
485
+ ` )
486
+ } ,
487
+ )
0 commit comments