11// @ts -expect-error Typing of css-tree is incomplete
22import parse from 'css-tree/parser'
33
4+ /**
5+ * @typedef {import('css-tree').CssNode } CssNode
6+ * @typedef {import('css-tree').List<CssNode> } List
7+ * @typedef {import('css-tree').CssLocation } CssLocation
8+ * @typedef {import('css-tree').Raw } Raw
9+ * @typedef {import('css-tree').StyleSheet } StyleSheet
10+ * @typedef {import('css-tree').Atrule } Atrule
11+ * @typedef {import('css-tree').AtrulePrelude } AtrulePrelude
12+ * @typedef {import('css-tree').Rule } Rule
13+ * @typedef {import('css-tree').SelectorList } SelectorList
14+ * @typedef {import('css-tree').Selector } Selector
15+ * @typedef {import('css-tree').PseudoClassSelector } PseudoClassSelector
16+ * @typedef {import('css-tree').PseudoElementSelector } PseudoElementSelector
17+ * @typedef {import('css-tree').Block } Block
18+ * @typedef {import('css-tree').Declaration } Declaration
19+ * @typedef {import('css-tree').Value } Value
20+ * @typedef {import('css-tree').Operator } Operator
21+ */
22+
423const SPACE = ' '
524const EMPTY_STRING = ''
625const COLON = ':'
@@ -19,6 +38,7 @@ const TYPE_RULE = 'Rule'
1938const TYPE_BLOCK = 'Block'
2039const TYPE_SELECTORLIST = 'SelectorList'
2140const TYPE_SELECTOR = 'Selector'
41+ const TYPE_PSEUDO_ELEMENT_SELECTOR = 'PseudoElementSelector'
2242const TYPE_DECLARATION = 'Declaration'
2343const TYPE_OPERATOR = 'Operator'
2444
@@ -53,15 +73,21 @@ export function format(css, {
5373 /** @type {number[] } [start0, end0, start1, end1, etc.]*/
5474 let comments = [ ]
5575
56- /** @type {import('css-tree').StyleSheet } */
76+ /**
77+ * @param {string } _ The comment text
78+ * @param {CssLocation } position
79+ */
80+ function on_comment ( _ , position ) {
81+ comments . push ( position . start . offset , position . end . offset )
82+ }
83+
84+ /** @type {StyleSheet } */
5785 let ast = parse ( css , {
5886 positions : true ,
5987 parseAtrulePrelude : false ,
6088 parseCustomProperty : true ,
6189 parseValue : true ,
62- onComment : ( /** @type {string } */ _ , /** @type {import('css-tree').CssLocation } */ position ) => {
63- comments . push ( position . start . offset , position . end . offset )
64- }
90+ onComment : on_comment ,
6591 } )
6692
6793 const NEWLINE = minify ? EMPTY_STRING : '\n'
@@ -85,7 +111,7 @@ export function format(css, {
85111 return '\t' . repeat ( size )
86112 }
87113
88- /** @param {import('css-tree'). CssNode } node */
114+ /** @param {CssNode } node */
89115 function substr ( node ) {
90116 let loc = node . loc
91117 // If the node has no location, return an empty string
@@ -94,15 +120,15 @@ export function format(css, {
94120 return css . slice ( loc . start . offset , loc . end . offset )
95121 }
96122
97- /** @param {import('css-tree'). CssNode } node */
123+ /** @param {CssNode } node */
98124 function start_offset ( node ) {
99- let loc = /** @type {import('css-tree'). CssLocation } */ ( node . loc )
125+ let loc = /** @type {CssLocation } */ ( node . loc )
100126 return loc . start . offset
101127 }
102128
103- /** @param {import('css-tree'). CssNode } node */
129+ /** @param {CssNode } node */
104130 function end_offset ( node ) {
105- let loc = /** @type {import('css-tree'). CssLocation } */ ( node . loc )
131+ let loc = /** @type {CssLocation } */ ( node . loc )
106132 return loc . end . offset
107133 }
108134
@@ -117,7 +143,7 @@ export function format(css, {
117143 return EMPTY_STRING
118144 }
119145
120- let buffer = ''
146+ let buffer = EMPTY_STRING
121147 for ( let i = 0 ; i < comments . length ; i += 2 ) {
122148 // Check that the comment is within the range
123149 let start = comments [ i ]
@@ -134,7 +160,7 @@ export function format(css, {
134160 return buffer
135161 }
136162
137- /** @param {import('css-tree'). Rule } node */
163+ /** @param {Rule } node */
138164 function print_rule ( node ) {
139165 let buffer
140166 let prelude = node . prelude
@@ -156,7 +182,7 @@ export function format(css, {
156182 return buffer
157183 }
158184
159- /** @param {import('css-tree'). SelectorList } node */
185+ /** @param {SelectorList } node */
160186 function print_selectorlist ( node ) {
161187 let buffer = EMPTY_STRING
162188
@@ -179,7 +205,7 @@ export function format(css, {
179205 return buffer
180206 }
181207
182- /** @param {import('css-tree'). Selector|import('css-tree'). PseudoClassSelector|import('css-tree'). PseudoElementSelector } node */
208+ /** @param {Selector | PseudoClassSelector | PseudoElementSelector } node */
183209 function print_simple_selector ( node ) {
184210 let buffer = EMPTY_STRING
185211 let children = node . children || [ ]
@@ -200,14 +226,14 @@ export function format(css, {
200226 break
201227 }
202228 case 'PseudoClassSelector' :
203- case 'PseudoElementSelector' : {
229+ case TYPE_PSEUDO_ELEMENT_SELECTOR : {
204230 buffer += COLON
205231
206232 // Special case for `:before` and `:after` which were used in CSS2 and are usually minified
207233 // as `:before` and `:after`, but we want to print them as `::before` and `::after`
208234 let pseudo = lowercase ( child . name )
209235
210- if ( pseudo === 'before' || pseudo === 'after' || child . type === 'PseudoElementSelector' ) {
236+ if ( pseudo === 'before' || pseudo === 'after' || child . type === TYPE_PSEUDO_ELEMENT_SELECTOR ) {
211237 buffer += COLON
212238 }
213239
@@ -301,7 +327,7 @@ export function format(css, {
301327 return buffer
302328 }
303329
304- /** @param {import('css-tree'). Block } node */
330+ /** @param {Block } node */
305331 function print_block ( node ) {
306332 let children = node . children
307333 let buffer = OPTIONAL_SPACE
@@ -322,7 +348,7 @@ export function format(css, {
322348
323349 indent_level ++
324350
325- let opening_comment = print_comment ( start_offset ( node ) , start_offset ( /** @type {import('css-tree'). CssNode } */ ( children . first ) ) )
351+ let opening_comment = print_comment ( start_offset ( node ) , start_offset ( /** @type {CssNode } */ ( children . first ) ) )
326352 if ( opening_comment ) {
327353 buffer += indent ( indent_level ) + opening_comment + NEWLINE
328354 }
@@ -366,7 +392,7 @@ export function format(css, {
366392 }
367393 } )
368394
369- let closing_comment = print_comment ( end_offset ( /** @type {import('css-tree'). CssNode } */ ( children . last ) ) , end_offset ( node ) )
395+ let closing_comment = print_comment ( end_offset ( /** @type {CssNode } */ ( children . last ) ) , end_offset ( node ) )
370396 if ( closing_comment ) {
371397 buffer += NEWLINE + indent ( indent_level ) + closing_comment
372398 }
@@ -377,7 +403,7 @@ export function format(css, {
377403 return buffer
378404 }
379405
380- /** @param {import('css-tree'). Atrule } node */
406+ /** @param {Atrule } node */
381407 function print_atrule ( node ) {
382408 let buffer = indent ( indent_level ) + '@'
383409 let prelude = node . prelude
@@ -405,7 +431,7 @@ export function format(css, {
405431 * here to force some nice formatting.
406432 * Should be OK perf-wise, since the amount of atrules in most
407433 * stylesheets are limited, so this won't be called too often.
408- * @param {import('css-tree'). AtrulePrelude | import('css-tree'). Raw } node
434+ * @param {AtrulePrelude | Raw } node
409435 */
410436 function print_prelude ( node ) {
411437 let buffer = substr ( node )
@@ -424,7 +450,7 @@ export function format(css, {
424450 . replace ( / s e l e c t o r | u r l | s u p p o r t s | l a y e r \( / ig, ( match ) => lowercase ( match ) ) // lowercase function names
425451 }
426452
427- /** @param {import('css-tree'). Declaration } node */
453+ /** @param {Declaration } node */
428454 function print_declaration ( node ) {
429455 let property = node . property
430456
@@ -455,7 +481,7 @@ export function format(css, {
455481 return indent ( indent_level ) + property + COLON + OPTIONAL_SPACE + value
456482 }
457483
458- /** @param {import('css-tree'). List<import('css-tree').CssNode> } children */
484+ /** @param {List } children */
459485 function print_list ( children ) {
460486 let buffer = EMPTY_STRING
461487
@@ -493,7 +519,7 @@ export function format(css, {
493519 return buffer
494520 }
495521
496- /** @param {import('css-tree'). Operator } node */
522+ /** @param {Operator } node */
497523 function print_operator ( node ) {
498524 let buffer = EMPTY_STRING
499525 // https://developer.mozilla.org/en-US/docs/Web/CSS/calc#notes
@@ -529,7 +555,7 @@ export function format(css, {
529555 return buffer
530556 }
531557
532- /** @param {import('css-tree'). Value | import('css-tree'). Raw } node */
558+ /** @param {Value | Raw } node */
533559 function print_value ( node ) {
534560 if ( node . type === 'Raw' ) {
535561 return print_unknown ( node , 0 )
@@ -539,7 +565,7 @@ export function format(css, {
539565 }
540566
541567 /**
542- * @param {import('css-tree'). CssNode } node
568+ * @param {CssNode } node
543569 * @param {number } indent_level
544570 * @returns {string } A formatted unknown CSS string
545571 */
@@ -577,7 +603,7 @@ export function format(css, {
577603 }
578604 } )
579605
580- let closing_comment = print_comment ( end_offset ( /** @type {import('css-tree'). CssNode } */ ( children . last ) ) , end_offset ( ast ) )
606+ let closing_comment = print_comment ( end_offset ( /** @type {CssNode } */ ( children . last ) ) , end_offset ( ast ) )
581607 if ( closing_comment ) {
582608 buffer += NEWLINE + closing_comment
583609 }
0 commit comments