@@ -2,6 +2,7 @@ import { expect, test } from 'vitest'
22import {
33 addThemeValues ,
44 evaluateExpression ,
5+ inlineThemeValues ,
56 replaceCssCalc ,
67 replaceCssVarsWithFallbacks ,
78} from './index'
@@ -124,6 +125,42 @@ test('recursive theme replacements', () => {
124125 )
125126} )
126127
128+ test ( 'recursive theme replacements (inlined)' , ( ) => {
129+ let map = new Map < string , string > ( [
130+ [ '--color-a' , 'var(--color-a)' ] ,
131+ [ '--color-b' , 'rgb(var(--color-b))' ] ,
132+ [ '--color-c' , 'rgb(var(--channel) var(--channel) var(--channel))' ] ,
133+ [ '--channel' , '255' ] ,
134+
135+ [ '--color-d' , 'rgb(var(--indirect) var(--indirect) var(--indirect))' ] ,
136+ [ '--indirect' , 'var(--channel)' ] ,
137+ [ '--channel' , '255' ] ,
138+
139+ [ '--mutual-a' , 'calc(var(--mutual-b) * 1)' ] ,
140+ [ '--mutual-b' , 'calc(var(--mutual-a) + 1)' ] ,
141+ ] )
142+
143+ let state : State = {
144+ enabled : true ,
145+ designSystem : {
146+ theme : { prefix : null } as any ,
147+ resolveThemeValue : ( name ) => map . get ( name ) ?? null ,
148+ } as DesignSystem ,
149+ }
150+
151+ expect ( inlineThemeValues ( 'var(--color-a)' , state ) ) . toBe ( 'var(--color-a)' )
152+ expect ( inlineThemeValues ( 'var(--color-b)' , state ) ) . toBe ( 'rgb(var(--color-b))' )
153+ expect ( inlineThemeValues ( 'var(--color-c)' , state ) ) . toBe ( 'rgb(255 255 255)' )
154+
155+ // This one is wrong but fixing it without breaking the infinite recursion guard is complex
156+ expect ( inlineThemeValues ( 'var(--color-d)' , state ) ) . toBe (
157+ 'rgb(255 var(--indirect) var(--indirect))' ,
158+ )
159+
160+ expect ( inlineThemeValues ( 'var(--mutual-a)' , state ) ) . toBe ( 'calc(calc(var(--mutual-a) + 1) * 1)' )
161+ expect ( inlineThemeValues ( 'var(--mutual-b)' , state ) ) . toBe ( 'calc(calc(var(--mutual-b) * 1) + 1)' )
162+ } )
163+
127164test ( 'Evaluating CSS calc expressions' , ( ) => {
128165 expect ( replaceCssCalc ( 'calc(1px + 1px)' , ( node ) => evaluateExpression ( node . value ) ) ) . toBe ( '2px' )
129166 expect ( replaceCssCalc ( 'calc(1px * 4)' , ( node ) => evaluateExpression ( node . value ) ) ) . toBe ( '4px' )
0 commit comments