1
+ import parse from 'css-tree/lib/parser/index.js' ;
2
+ import walk from 'css-tree/lib/utils/walk.js' ;
3
+
4
+ const commentsPattern = / \/ \* [ \s \S ] * ?\* \/ / g;
5
+
6
+ export default function processCss ( parsed , code ) {
7
+ const css = parsed . css . content . styles ;
8
+ const offset = parsed . css . content . start ;
9
+
10
+ const ast = parse ( css , {
11
+ positions : true
12
+ } ) ;
13
+
14
+ const attr = `[svelte-${ parsed . hash } ]` ;
15
+
16
+ walk . rules ( ast , rule => {
17
+ rule . selector . children . each ( selector => {
18
+ const start = selector . loc . start . offset ;
19
+ const end = selector . loc . end . offset ;
20
+
21
+ const selectorString = css . slice ( start , end ) ;
22
+
23
+ const firstToken = selector . children . head ;
24
+
25
+ let transformed ;
26
+
27
+ if ( firstToken . data . type === 'TypeSelector' ) {
28
+ const insert = firstToken . data . loc . end . offset ;
29
+ const head = css . slice ( start , insert ) ;
30
+ const tail = css . slice ( insert , end ) ;
31
+
32
+ transformed = `${ head } ${ attr } ${ tail } , ${ attr } ${ selectorString } ` ;
33
+ } else {
34
+ transformed = `${ attr } ${ selectorString } , ${ attr } ${ selectorString } ` ;
35
+ }
36
+
37
+ code . overwrite ( start + offset , end + offset , transformed ) ;
38
+ } ) ;
39
+ } ) ;
40
+
41
+ // remove comments. TODO would be nice if this was exposed in css-tree
42
+ let match ;
43
+ while ( match = commentsPattern . exec ( css ) ) {
44
+ const start = match . index + offset ;
45
+ const end = start + match [ 0 ] . length ;
46
+
47
+ code . remove ( start , end ) ;
48
+ }
49
+
50
+ return code . slice ( parsed . css . content . start , parsed . css . content . end ) ;
51
+ }
0 commit comments