@@ -6,6 +6,7 @@ import { NodeType, serializedNode } from '../src/types';
6
6
import {
7
7
escapeImportStatement ,
8
8
extractFileExtension ,
9
+ replaceChromeGridTemplateAreas ,
9
10
fixSafariColons ,
10
11
isNodeMetaEqual ,
11
12
} from '../src/utils' ;
@@ -268,6 +269,99 @@ describe('utils', () => {
268
269
expect ( out5 ) . toEqual ( `@import url("/foo.css;900;800\\"") layer;` ) ;
269
270
} ) ;
270
271
} ) ;
272
+
273
+ describe ( 'replaceChromeGridTemplateAreas' , ( ) => {
274
+ it ( 'does not alter corectly parsed grid template rules' , ( ) => {
275
+ const cssText =
276
+ '#wrapper { display: grid; width: 100%; height: 100%; grid-template: minmax(2, 1fr); margin: 0px auto; }' ;
277
+ const mockCssRule = {
278
+ cssText,
279
+ selectorText : '#wrapper' ,
280
+ style : {
281
+ getPropertyValue ( prop ) {
282
+ return {
283
+ 'grid-template-areas' : '' ,
284
+ } [ prop ] ;
285
+ } ,
286
+ } ,
287
+ } as Partial < CSSStyleRule > as CSSStyleRule ;
288
+
289
+ expect ( replaceChromeGridTemplateAreas ( mockCssRule ) ) . toEqual ( cssText ) ;
290
+ } ) ;
291
+
292
+ it ( 'fixes incorrectly parsed grid template rules' , ( ) => {
293
+ const cssText1 =
294
+ '#wrapper { grid-template-areas: "header header" "main main" "footer footer"; grid-template-rows: minmax(2, 1fr); grid-template-columns: minmax(2, 1fr); display: grid; margin: 0px auto; }' ;
295
+ const cssText2 =
296
+ '.some-class { color: purple; grid-template: "TopNav TopNav" 65px "SideNav Content" 52px "SideNav Content" / 255px auto; column-gap: 32px; }' ;
297
+
298
+ const mockCssRule1 = {
299
+ cssText : cssText1 ,
300
+ selectorText : '#wrapper' ,
301
+ style : {
302
+ length : 5 ,
303
+ 0 : 'grid-template-areas' ,
304
+ 1 : 'grid-template-rows' ,
305
+ 2 : 'grid-template-columns' ,
306
+ 3 : 'display' ,
307
+ 4 : 'margin' ,
308
+ getPropertyValue : ( key : string ) : string => {
309
+ switch ( key ) {
310
+ case 'grid-template-areas' :
311
+ return '"header header" "main main" "footer footer"' ;
312
+ case 'grid-template-rows' :
313
+ return 'minmax(2, 1fr)' ;
314
+ case 'grid-template-columns' :
315
+ return 'minmax(2, 1fr)' ;
316
+ case 'display' :
317
+ return 'grid' ;
318
+ case 'margin' :
319
+ return '0px auto' ;
320
+ default :
321
+ return '' ;
322
+ }
323
+ } ,
324
+ } as Record < string | number , any > ,
325
+ } as Partial < CSSStyleRule > as CSSStyleRule ;
326
+
327
+ const mockCssRule2 = {
328
+ cssText : cssText2 ,
329
+ selectorText : '.some-class' ,
330
+ style : {
331
+ length : 5 ,
332
+ 0 : 'color' ,
333
+ 1 : 'grid-template-areas' ,
334
+ 2 : 'grid-template-rows' ,
335
+ 3 : 'grid-template-columns' ,
336
+ 4 : 'column-gap' ,
337
+ getPropertyValue : ( key : string ) : string => {
338
+ switch ( key ) {
339
+ case 'color' :
340
+ return 'purple' ;
341
+ case 'grid-template-areas' :
342
+ return '"TopNav TopNav" "SideNav Content" "SideNav Content"' ;
343
+ case 'grid-template-rows' :
344
+ return '65px 52px auto' ;
345
+ case 'grid-template-columns' :
346
+ return '255px auto' ;
347
+ case 'column-gap' :
348
+ return '32px' ;
349
+ default :
350
+ return '' ;
351
+ }
352
+ } ,
353
+ } as Record < string | number , any > ,
354
+ } as Partial < CSSStyleRule > as CSSStyleRule ;
355
+
356
+ expect ( replaceChromeGridTemplateAreas ( mockCssRule1 ) ) . toEqual (
357
+ '#wrapper { grid-template-areas: "header header" "main main" "footer footer"; grid-template-rows: minmax(2, 1fr); grid-template-columns: minmax(2, 1fr); display: grid; margin: 0px auto; }' ,
358
+ ) ;
359
+ expect ( replaceChromeGridTemplateAreas ( mockCssRule2 ) ) . toEqual (
360
+ '.some-class { color: purple; grid-template-areas: "TopNav TopNav" "SideNav Content" "SideNav Content"; grid-template-rows: 65px 52px auto; grid-template-columns: 255px auto; column-gap: 32px; }' ,
361
+ ) ;
362
+ } ) ;
363
+ } ) ;
364
+
271
365
describe ( 'fixSafariColons' , ( ) => {
272
366
it ( 'parses : in attribute selectors correctly' , ( ) => {
273
367
const out1 = fixSafariColons ( '[data-foo] { color: red; }' ) ;
0 commit comments