@@ -19,6 +19,46 @@ import { simplifyHypot } from './hypot.js';
1919/** @typedef {import('../node.js').Node } Node */
2020/** @typedef {import('../simplify.js').SimplifyFn } SimplifyFn */
2121
22+ /** @typedef {(name: string, args: Node[]) => Node } MathSimplifier */
23+
24+ // Bare CSS math functions with implemented simplification semantics, keyed
25+ // by lowercase name. calc() and its vendor-prefixed forms are handled
26+ // separately as wrappers in simplifyCall. This map is the single source of
27+ // truth for both dispatch and `isSupportedMathFunction`.
28+ /** @type {Map<string, MathSimplifier> } */
29+ const MATH_SIMPLIFIERS = new Map ( [
30+ [ 'min' , simplifyMinMax ] ,
31+ [ 'max' , simplifyMinMax ] ,
32+ [ 'clamp' , ( _name , args ) => simplifyClamp ( args ) ] ,
33+ [ 'abs' , ( _name , args ) => simplifyAbs ( args ) ] ,
34+ [ 'sign' , ( _name , args ) => simplifySign ( args ) ] ,
35+ [ 'mod' , ( _name , args ) => simplifyModRem ( 'mod' , args ) ] ,
36+ [ 'rem' , ( _name , args ) => simplifyModRem ( 'rem' , args ) ] ,
37+ [ 'round' , ( _name , args ) => simplifyRound ( args ) ] ,
38+ [ 'sin' , ( _name , args ) => simplifyTrig ( 'sin' , args ) ] ,
39+ [ 'cos' , ( _name , args ) => simplifyTrig ( 'cos' , args ) ] ,
40+ [ 'tan' , ( _name , args ) => simplifyTrig ( 'tan' , args ) ] ,
41+ [ 'asin' , ( _name , args ) => simplifyInverseTrig ( 'asin' , args ) ] ,
42+ [ 'acos' , ( _name , args ) => simplifyInverseTrig ( 'acos' , args ) ] ,
43+ [ 'atan' , ( _name , args ) => simplifyInverseTrig ( 'atan' , args ) ] ,
44+ [ 'atan2' , ( _name , args ) => simplifyAtan2 ( args ) ] ,
45+ [ 'pow' , ( _name , args ) => simplifyPow ( args ) ] ,
46+ [ 'sqrt' , ( _name , args ) => simplifySqrt ( args ) ] ,
47+ [ 'hypot' , ( _name , args ) => simplifyHypot ( args ) ] ,
48+ [ 'log' , ( _name , args ) => simplifyLog ( args ) ] ,
49+ [ 'exp' , ( _name , args ) => simplifyExp ( args ) ] ,
50+ ] ) ;
51+
52+ /**
53+ * Whether a bare CSS math function has an implemented simplifier.
54+ *
55+ * @param {string } name
56+ * @return {boolean }
57+ */
58+ function isSupportedMathFunction ( name ) {
59+ return MATH_SIMPLIFIERS . has ( name . toLowerCase ( ) ) ;
60+ }
61+
2262/**
2363 * @param {Extract<Node, { type: 'Call' }> } node
2464 * @param {SimplifyFn } simplify
@@ -36,50 +76,17 @@ function simplifyCall(node, simplify) {
3676
3777 const args = node . args . map ( ( a ) => simplify ( a ) ) ;
3878
39- if ( name === 'min' || name === 'max' ) {
40- return simplifyMinMax ( node . name , args ) ;
41- }
42- if ( name === 'clamp' ) {
43- return simplifyClamp ( args ) ;
44- }
45- if ( name === 'abs' ) {
46- return simplifyAbs ( args ) ;
47- }
48- if ( name === 'sign' ) {
49- return simplifySign ( args ) ;
50- }
51- if ( name === 'mod' || name === 'rem' ) {
52- return simplifyModRem ( name , args ) ;
53- }
54- if ( name === 'round' ) {
55- return simplifyRound ( args ) ;
56- }
57- if ( name === 'sin' || name === 'cos' || name === 'tan' ) {
58- return simplifyTrig ( name , args ) ;
59- }
60- if ( name === 'asin' || name === 'acos' || name === 'atan' ) {
61- return simplifyInverseTrig ( name , args ) ;
62- }
63- if ( name === 'atan2' ) {
64- return simplifyAtan2 ( args ) ;
65- }
66- if ( name === 'pow' ) {
67- return simplifyPow ( args ) ;
68- }
69- if ( name === 'sqrt' ) {
70- return simplifySqrt ( args ) ;
71- }
72- if ( name === 'hypot' ) {
73- return simplifyHypot ( args ) ;
74- }
75- if ( name === 'log' ) {
76- return simplifyLog ( args ) ;
77- }
78- if ( name === 'exp' ) {
79- return simplifyExp ( args ) ;
79+ const simplifier = MATH_SIMPLIFIERS . get ( name ) ;
80+ if ( simplifier ) {
81+ // min/max preserve the call's original casing in their opaque-args
82+ // fallback; the rest normalize to lowercase internally.
83+ return simplifier (
84+ name === 'min' || name === 'max' ? node . name : name ,
85+ args
86+ ) ;
8087 }
8188
8289 return { type : 'Call' , name : node . name , args } ;
8390}
8491
85- export { simplifyCall } ;
92+ export { isSupportedMathFunction , simplifyCall } ;
0 commit comments