1
- const {
2
- plugin : postcssPlugin ,
3
- atRule : postcssAtRule
4
- } = require ( 'postcss' ) ;
1
+ const { plugin : postcssPlugin , atRule : postcssAtRule } = require ( "postcss" ) ;
5
2
6
3
const EM_TO_PX_RATIO = 16 ;
7
4
8
- const MIN_WIDTH = ' minWidth' ;
9
- const MAX_WIDTH = ' maxWidth' ;
10
- const UNIT = ' init' ;
5
+ const MIN_WIDTH = " minWidth" ;
6
+ const MAX_WIDTH = " maxWidth" ;
7
+ const UNIT = " init" ;
11
8
12
- const mediaParamsToData = mediaQueries => Object . entries ( mediaQueries ) . map ( ( [ media , mediaQueryRules ] ) => {
9
+ const mediaParamsToData = mediaQueries =>
10
+ Object . entries ( mediaQueries ) . map ( ( [ media , mediaQueryRules ] ) => {
13
11
const mediaQueryData = {
14
- mediaQueryRules,
15
- params : media ,
16
- [ MIN_WIDTH ] : false ,
17
- [ MAX_WIDTH ] : false ,
18
- [ UNIT ] : false ,
12
+ mediaQueryRules,
13
+ params : media ,
14
+ [ MIN_WIDTH ] : false ,
15
+ [ MAX_WIDTH ] : false ,
16
+ [ UNIT ] : false
19
17
} ;
20
18
21
19
if ( media . includes ( "min-width" ) ) {
22
- const matchResult = media . match ( / m i n - w i d t h : \s * ( \d + ) ( p x | e m ) ? / ) ;
23
- if ( matchResult ) {
24
- const [ , minWidth , unit ] = matchResult ;
25
- if ( minWidth ) {
26
- mediaQueryData [ MIN_WIDTH ] = parseInt ( minWidth ) ;
27
- }
28
- if ( unit ) {
29
- mediaQueryData [ UNIT ] = unit ;
30
- }
20
+ const matchResult = media . match ( / m i n - w i d t h : \s * ( \d + ) ( p x | e m ) ? / ) ;
21
+ if ( matchResult ) {
22
+ const [ , minWidth , unit ] = matchResult ;
23
+ if ( minWidth ) {
24
+ mediaQueryData [ MIN_WIDTH ] = parseInt ( minWidth ) ;
31
25
}
26
+ if ( unit ) {
27
+ mediaQueryData [ UNIT ] = unit ;
28
+ }
29
+ }
32
30
}
33
31
34
32
if ( media . includes ( "max-width" ) ) {
35
- const matchResult = media . match ( / m a x - w i d t h : \s * ( \d + ) ( p x | e m ) ? / ) ;
36
- if ( matchResult ) {
37
- const [ , maxWidth , unit ] = matchResult ;
38
- if ( maxWidth ) {
39
- mediaQueryData [ MAX_WIDTH ] = parseInt ( maxWidth ) ;
40
- }
41
- if ( unit ) {
42
- mediaQueryData [ UNIT ] = unit ;
43
- }
33
+ const matchResult = media . match ( / m a x - w i d t h : \s * ( \d + ) ( p x | e m ) ? / ) ;
34
+ if ( matchResult ) {
35
+ const [ , maxWidth , unit ] = matchResult ;
36
+ if ( maxWidth ) {
37
+ mediaQueryData [ MAX_WIDTH ] = parseInt ( maxWidth ) ;
38
+ }
39
+ if ( unit ) {
40
+ mediaQueryData [ UNIT ] = unit ;
44
41
}
42
+ }
45
43
}
46
44
return mediaQueryData ;
47
- } ) ;
48
-
45
+ } ) ;
49
46
50
47
const invertBoolResult = fn => ( ...args ) => ! fn ( ...args ) ;
51
48
52
49
const sortMedia = dimensionKey => ( a , b ) => {
53
- if ( a [ UNIT ] === 'em' ) {
54
- a [ dimensionKey ] *= EM_TO_PX_RATIO
55
- }
56
- if ( b [ UNIT ] === 'em' ) {
57
- b [ dimensionKey ] *= EM_TO_PX_RATIO
58
- }
59
- return a [ dimensionKey ] - b [ dimensionKey ] ;
50
+ if ( a [ UNIT ] === "em" ) {
51
+ a [ dimensionKey ] *= EM_TO_PX_RATIO ;
52
+ }
53
+ if ( b [ UNIT ] === "em" ) {
54
+ b [ dimensionKey ] *= EM_TO_PX_RATIO ;
55
+ }
56
+ return a [ dimensionKey ] - b [ dimensionKey ] ;
60
57
} ;
61
58
62
- const groupCssMediaQueries = postcssPlugin ( 'group-css-media-queries' , ( ) => root => {
59
+ const groupCssMediaQueries = postcssPlugin (
60
+ "group-css-media-queries" ,
61
+ ( ) => root => {
63
62
const medias = { } ;
64
63
root . walkAtRules ( "media" , atRule => {
65
-
66
- if ( ! ( atRule . parent && atRule . parent . type === "root" ) ) {
67
- return ;
68
- }
69
-
70
- if ( atRule . name !== 'media' ) {
71
- return ;
72
- }
73
-
74
- const { params : mediaParams } = atRule ;
75
- if ( ! medias [ mediaParams ] ) {
76
- medias [ mediaParams ] = [ ] ;
77
- }
78
- medias [ mediaParams ] = medias [ mediaParams ] . concat ( atRule ) ;
79
-
64
+ if ( ! ( atRule . parent && atRule . parent . type === "root" ) ) {
65
+ return ;
66
+ }
67
+
68
+ if ( atRule . name !== "media" ) {
69
+ return ;
70
+ }
71
+
72
+ const { params : mediaParams } = atRule ;
73
+ if ( ! medias [ mediaParams ] ) {
74
+ medias [ mediaParams ] = [ ] ;
75
+ }
76
+ medias [ mediaParams ] = medias [ mediaParams ] . concat ( atRule ) ;
80
77
} ) ;
81
78
82
79
const mediasData = mediaParamsToData ( medias ) ;
83
80
84
- const onlyMinRules = mediasData . filter ( rule => rule [ MIN_WIDTH ] !== false && rule [ MAX_WIDTH ] === false ) ;
85
- const onlyMaxRules = mediasData . filter ( rule => rule [ MAX_WIDTH ] !== false && rule [ MIN_WIDTH ] === false ) ;
86
- const intervalRules = mediasData . filter ( rule => rule [ MIN_WIDTH ] !== false && rule [ MAX_WIDTH ] !== false ) ;
87
- const tmp = [
88
- ...onlyMinRules ,
89
- ...onlyMaxRules ,
90
- ...intervalRules
91
- ] ;
81
+ const onlyMinRules = mediasData . filter (
82
+ rule => rule [ MIN_WIDTH ] !== false && rule [ MAX_WIDTH ] === false
83
+ ) ;
84
+ const onlyMaxRules = mediasData . filter (
85
+ rule => rule [ MAX_WIDTH ] !== false && rule [ MIN_WIDTH ] === false
86
+ ) ;
87
+ const intervalRules = mediasData . filter (
88
+ rule => rule [ MIN_WIDTH ] !== false && rule [ MAX_WIDTH ] !== false
89
+ ) ;
90
+ const tmp = [ ...onlyMinRules , ...onlyMaxRules , ...intervalRules ] ;
92
91
const otherRules = mediasData . filter ( rule => tmp . includes ( rule ) === false ) ;
93
92
94
-
95
93
onlyMinRules . sort ( sortMedia ( MIN_WIDTH ) ) ; // ascending
96
94
onlyMaxRules . sort ( invertBoolResult ( sortMedia ( MAX_WIDTH ) ) ) ; // descending
97
95
98
96
const sortedListRules = [
99
- onlyMinRules ,
100
- onlyMaxRules ,
101
- intervalRules ,
102
- otherRules
97
+ onlyMinRules ,
98
+ onlyMaxRules ,
99
+ intervalRules ,
100
+ otherRules
103
101
] ;
104
102
105
103
for ( const rules of sortedListRules ) {
106
- for ( const { params, mediaQueryRules} of rules ) {
107
- const newAtRule = postcssAtRule ( {
108
- name : ' media' ,
109
- params,
110
- } ) ;
111
-
112
- mediaQueryRules . forEach ( mediaQueryRule => {
113
- newAtRule . append ( mediaQueryRule . nodes ) ;
114
- mediaQueryRule . remove ( ) ;
115
- } ) ;
116
-
117
- root . append ( newAtRule ) ;
118
- }
104
+ for ( const { params, mediaQueryRules } of rules ) {
105
+ const newAtRule = postcssAtRule ( {
106
+ name : " media" ,
107
+ params
108
+ } ) ;
109
+
110
+ mediaQueryRules . forEach ( mediaQueryRule => {
111
+ newAtRule . append ( mediaQueryRule . nodes ) ;
112
+ mediaQueryRule . remove ( ) ;
113
+ } ) ;
114
+
115
+ root . append ( newAtRule ) ;
116
+ }
119
117
}
120
-
121
- } ) ;
122
-
118
+ }
119
+ ) ;
123
120
124
121
module . exports = {
125
- groupCssMediaQueries
126
- } ;
122
+ groupCssMediaQueries
123
+ } ;
0 commit comments