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