@@ -84,6 +84,46 @@ test('replacing CSS variables with their fallbacks (when they have them)', () =>
84
84
expect ( replaceCssVarsWithFallbacks ( state , 'var(--circular-3)' ) ) . toBe ( 'var(--circular-2)' )
85
85
} )
86
86
87
+ test ( 'recursive theme replacements' , ( ) => {
88
+ let map = new Map < string , string > ( [
89
+ [ '--color-a' , 'var(--color-a)' ] ,
90
+ [ '--color-b' , 'rgb(var(--color-b))' ] ,
91
+ [ '--color-c' , 'rgb(var(--channel) var(--channel) var(--channel))' ] ,
92
+ [ '--channel' , '255' ] ,
93
+
94
+ [ '--color-d' , 'rgb(var(--indirect) var(--indirect) var(--indirect))' ] ,
95
+ [ '--indirect' , 'var(--channel)' ] ,
96
+ [ '--channel' , '255' ] ,
97
+
98
+ [ '--mutual-a' , 'calc(var(--mutual-b) * 1)' ] ,
99
+ [ '--mutual-b' , 'calc(var(--mutual-a) + 1)' ] ,
100
+ ] )
101
+
102
+ let state : State = {
103
+ enabled : true ,
104
+ designSystem : {
105
+ theme : { prefix : null } as any ,
106
+ resolveThemeValue : ( name ) => map . get ( name ) ?? null ,
107
+ } as DesignSystem ,
108
+ }
109
+
110
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-a)' ) ) . toBe ( 'var(--color-a)' )
111
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-b)' ) ) . toBe ( 'rgb(var(--color-b))' )
112
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-c)' ) ) . toBe ( 'rgb(255 255 255)' )
113
+
114
+ // This one is wrong but fixing it without breaking the infinite recursion guard is complex
115
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-d)' ) ) . toBe (
116
+ 'rgb(255 var(--indirect) var(--indirect))' ,
117
+ )
118
+
119
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--mutual-a)' ) ) . toBe (
120
+ 'calc(calc(var(--mutual-a) + 1) * 1)' ,
121
+ )
122
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--mutual-b)' ) ) . toBe (
123
+ 'calc(calc(var(--mutual-b) * 1) + 1)' ,
124
+ )
125
+ } )
126
+
87
127
test ( 'Evaluating CSS calc expressions' , ( ) => {
88
128
expect ( replaceCssCalc ( 'calc(1px + 1px)' , ( node ) => evaluateExpression ( node . value ) ) ) . toBe ( '2px' )
89
129
expect ( replaceCssCalc ( 'calc(1px * 4)' , ( node ) => evaluateExpression ( node . value ) ) ) . toBe ( '4px' )
0 commit comments