@@ -5,7 +5,7 @@ const functionSyntaxes = new WeakMap();
55const { definitionSyntax } = csstree ;
66
77function syntaxName ( syntax ) {
8- const { type, name } = syntax || { } ;
8+ const { type, name, parent } = syntax || { } ;
99
1010 switch ( type ) {
1111 case 'Property' :
@@ -17,6 +17,15 @@ function syntaxName(syntax) {
1717 case 'Function' :
1818 return name + '()' ;
1919
20+ case 'Atrule' :
21+ return '@' + name ;
22+
23+ case 'AtrulePrelude' :
24+ return '@' + name + ':prelude' ;
25+
26+ case 'AtruleDescriptor' :
27+ return '@' + parent + '/' + name ;
28+
2029 default :
2130 return name ;
2231 }
@@ -133,7 +142,14 @@ function collectUsage(type, dict, defaultSyntax) {
133142 visited [ type + ':' + name ] = true ;
134143 host = dict [ name ] ;
135144 hostStack . push ( host ) ;
136- processDescriptor ( host ) ;
145+ if ( type === 'Atrule' ) {
146+ processDescriptor ( host . prelude ) ;
147+ for ( let descriptor in host . discriptors ) {
148+ processDescriptor ( host . descriptors [ descriptor ] ) ;
149+ }
150+ } else {
151+ processDescriptor ( host ) ;
152+ }
137153 hostStack . pop ( ) ;
138154 }
139155}
@@ -185,10 +201,25 @@ function syntaxRefs(syntax, typeDict, globalDict) {
185201}
186202
187203discovery . setPrepare ( function ( data , { defineObjectMarker, addQueryHelpers } ) {
188- const { properties, types } = csstree . lexer ;
204+ const { properties, types, atrules } = csstree . lexer ;
189205 const functions = Object . create ( null ) ;
190- const typeOrder = [ 'Property' , 'Type' , 'Function' ] ;
206+ const typeOrder = [ 'Atrule' , 'AtrulePrelude' , 'AtruleDescriptor' , ' Property', 'Type' , 'Function' ] ;
191207 const typeDict = {
208+ Atrule : atrules ,
209+ AtrulePrelude : Object . fromEntries (
210+ Object . entries ( atrules )
211+ . map ( ( [ key , { prelude } ] ) => prelude && [ key , prelude ] )
212+ . filter ( Boolean )
213+ ) ,
214+ AtruleDescriptor : Object . fromEntries (
215+ Object . entries ( atrules ) . reduce (
216+ ( res , [ key , { descriptors } ] ) =>
217+ descriptors
218+ ? res . concat ( Object . entries ( descriptors ) . map ( ( [ name , value ] ) => [ key + '/' + name , value ] ) )
219+ : res ,
220+ [ ]
221+ )
222+ ) ,
192223 Property : properties ,
193224 Type : types ,
194225 Function : functions
@@ -206,19 +237,15 @@ discovery.setPrepare(function(data, { defineObjectMarker, addQueryHelpers }) {
206237
207238 csstree . lexer . validate ( ) ;
208239 csstree . lexer . functions = functions ;
240+ collectUsage ( 'Atrule' , atrules , csstree . lexer ) ;
209241 collectUsage ( 'Property' , properties , csstree . lexer ) ;
210242 collectUsage ( 'Type' , types , csstree . lexer ) ;
211243
212- data . dict = [
213- ...Object . values ( properties ) ,
214- ...Object . values ( types ) ,
215- ...Object . values ( functions )
216- ] ;
217-
218- data . dict . forEach ( item => {
244+ data . dict = [ ] . concat ( ...Object . values ( typeDict ) . map ( dict => Object . values ( dict ) ) ) ;
245+ for ( const item of data . dict ) {
219246 item . refs = syntaxRefs ( item . syntax , typeDict , data . dict ) ;
220247 markers [ item . type ] ( item ) ;
221- } ) ;
248+ }
222249
223250 addQueryHelpers ( {
224251 formatName : syntaxName ,
@@ -227,10 +254,22 @@ discovery.setPrepare(function(data, { defineObjectMarker, addQueryHelpers }) {
227254
228255 return idx !== - 1 ? idx : Infinity ;
229256 } ,
257+ isProblem : discovery . queryFn ( '(no match and type != "Atrule") or refs.resolved.[no match]' ) ,
230258 mdn ( current ) {
231259 if ( current ) {
232- if ( current . type === 'Property' || current . type === 'Type' ) {
233- return data . mdn [ current . type === 'Property' ? 'properties' : 'syntaxes' ] [ current . name ] || null ;
260+ switch ( current . type ) {
261+ case 'Atrule' :
262+ case 'AtrulePrelude' :
263+ return data . mdn . atRules [ '@' + current . name ] || null ;
264+
265+ case 'AtruleDescriptor' : {
266+ const atrule = data . mdn . atRules [ '@' + current . parent ] ;
267+ return ( atrule && atrule . descriptors && atrule . descriptors [ current . name ] ) || null ;
268+ }
269+
270+ case 'Property' :
271+ case 'Type' :
272+ return data . mdn [ current . type === 'Property' ? 'properties' : 'syntaxes' ] [ current . name ] || null ;
234273 }
235274 }
236275 return null ;
0 commit comments