12
12
* of `next()` and your code.
13
13
* Pseudos should be used to implement simple checks.
14
14
*/
15
- import boolbase from "boolbase" ;
16
15
import type { CompiledQuery , InternalOptions , CompileToken } from "../types.js" ;
17
16
import { parse , PseudoSelector } from "css-what" ;
18
17
import { filters } from "./filters.js" ;
@@ -38,27 +37,38 @@ export function compilePseudoSelector<Node, ElementNode extends Node>(
38
37
39
38
return subselects [ name ] ( next , data , options , context , compileToken ) ;
40
39
}
41
- if ( name in aliases ) {
40
+
41
+ const userPseudo = options . pseudos ?. [ name ] ;
42
+
43
+ const stringPseudo =
44
+ typeof userPseudo === "string" ? userPseudo : aliases [ name ] ;
45
+
46
+ if ( typeof stringPseudo === "string" ) {
42
47
if ( data != null ) {
43
48
throw new Error ( `Pseudo ${ name } doesn't have any arguments` ) ;
44
49
}
45
50
46
51
// The alias has to be parsed here, to make sure options are respected.
47
- const alias = parse ( aliases [ name ] ) ;
52
+ const alias = parse ( stringPseudo ) ;
48
53
return subselects [ "is" ] ( next , alias , options , context , compileToken ) ;
49
54
}
55
+
56
+ if ( typeof userPseudo === "function" ) {
57
+ verifyPseudoArgs ( userPseudo , name , data , 1 ) ;
58
+
59
+ return ( elem ) => userPseudo ( elem , data ) && next ( elem ) ;
60
+ }
61
+
50
62
if ( name in filters ) {
51
63
return filters [ name ] ( next , data as string , options , context ) ;
52
64
}
65
+
53
66
if ( name in pseudos ) {
54
67
const pseudo = pseudos [ name ] ;
55
- verifyPseudoArgs ( pseudo , name , data ) ;
68
+ verifyPseudoArgs ( pseudo , name , data , 2 ) ;
56
69
57
- return pseudo === boolbase . falseFunc
58
- ? boolbase . falseFunc
59
- : next === boolbase . trueFunc
60
- ? ( elem ) => pseudo ( elem , options , data )
61
- : ( elem ) => pseudo ( elem , options , data ) && next ( elem ) ;
70
+ return ( elem ) => pseudo ( elem , options , data ) && next ( elem ) ;
62
71
}
72
+
63
73
throw new Error ( `Unknown pseudo-class :${ name } ` ) ;
64
74
}
0 commit comments