1+ // @vitest -environment jsdom
2+
3+ import { describe , it , expect , beforeAll } from 'vitest' ;
4+ import Alpine from '../../packages/alpinejs/src/index.js' ;
5+ import { evaluate , evaluateLater } from '../../packages/alpinejs/src/evaluator.js' ;
6+
7+ beforeAll ( ( ) => Alpine . start ( ) )
8+
9+ describe ( 'evaluate([String])' , ( ) => {
10+ it ( 'simple expression' , ( ) => {
11+ let element = { parentNode : null , _x_dataStack : [ ] }
12+
13+ expect ( evaluate ( element , '42' ) ) . toBe ( 42 )
14+ } ) ;
15+
16+ it ( 'with scope' , ( ) => {
17+ let element = { parentNode : null , _x_dataStack : [ ] }
18+
19+ expect ( evaluate ( element , 'foo' , { scope : { foo : 42 } } ) ) . toBe ( 42 )
20+ } ) ;
21+
22+ it ( 'with params' , ( ) => {
23+ let element = { parentNode : null , _x_dataStack : [ ] }
24+
25+ expect ( evaluate ( element , '(foo) => foo' , { params : [ 42 ] } ) ) . toBe ( 42 )
26+ } ) ;
27+
28+ it ( 'with context' , ( ) => {
29+ let element = { parentNode : null , _x_dataStack : [ ] }
30+
31+ expect ( evaluate ( element , 'this.foo' , { context : { foo : 42 } } ) ) . toBe ( 42 )
32+ } ) ;
33+
34+ it ( 'auto-evaluating function expression' , ( ) => {
35+ let element = { parentNode : null , _x_dataStack : [ ] }
36+
37+ expect ( evaluate ( element , '() => 42' ) ) . toBe ( 42 )
38+ } ) ;
39+
40+ it ( 'non auto-evaluating function expression' , ( ) => {
41+ let element = { parentNode : null , _x_dataStack : [ ] }
42+
43+ Alpine . dontAutoEvaluateFunctions ( ( ) => {
44+ expect ( evaluate ( element , '() => 42' ) ( ) ) . toBe ( 42 )
45+ } )
46+ } ) ;
47+
48+ it ( 'conditional' , ( ) => {
49+ let element = { parentNode : null , _x_dataStack : [ ] }
50+
51+ expect ( evaluate ( element , 'if (true) { return 42 }' ) ) . toBe ( undefined )
52+ } ) ;
53+
54+ it ( 'assignment' , ( ) => {
55+ let element = { parentNode : null , _x_dataStack : [ ] }
56+
57+ expect ( evaluate ( element , 'let foo = 42' ) ) . toBe ( undefined )
58+ } ) ;
59+
60+ it ( 'await' , ( ) => {
61+ let element = { parentNode : null , _x_dataStack : [ ] }
62+
63+ let scope = { foo : { bar : 'baz' } }
64+
65+ expect ( evaluate ( element , 'await new Promise(resolve => { foo.bar = "qux"; resolve() })' , { scope } ) ) . toBe ( undefined )
66+
67+ expect ( scope . foo . bar ) . toBe ( 'qux' )
68+ } ) ;
69+ } ) ;
70+
71+ describe ( 'evaluateLater([String])' , ( ) => {
72+ it ( 'simple expression' , ( ) => {
73+ let element = { parentNode : null , _x_dataStack : [ ] }
74+
75+ let receiver = evaluateLater ( element , '42' )
76+
77+ receiver ( value => {
78+ expect ( value ) . toBe ( 42 )
79+ } )
80+ } ) ;
81+
82+ it ( 'await' , ( ) => {
83+ let element = { parentNode : null , _x_dataStack : [ ] }
84+
85+ let receiver = evaluateLater ( element , 'await new Promise(resolve => { setTimeout(() => resolve(42), 10) })' )
86+
87+ receiver ( value => {
88+ expect ( value ) . toBe ( 42 )
89+ } )
90+ } ) ;
91+ } )
92+
93+ describe ( 'evaluate([Function])' , ( ) => {
94+ it ( 'simple expression' , ( ) => {
95+ let element = { parentNode : null , _x_dataStack : [ ] }
96+
97+ expect ( evaluate ( element , ( ) => 42 ) ) . toBe ( 42 )
98+ } ) ;
99+
100+ it ( 'with scope' , ( ) => {
101+ let element = { parentNode : null , _x_dataStack : [ ] }
102+
103+ expect ( evaluate ( element , function ( ) { return this . foo } , { scope : { foo : 42 } } ) ) . toBe ( 42 )
104+ } ) ;
105+
106+ it ( 'with params' , ( ) => {
107+ let element = { parentNode : null , _x_dataStack : [ ] }
108+
109+ expect ( evaluate ( element , ( foo ) => foo , { params : [ 42 ] } ) ) . toBe ( 42 )
110+ } ) ;
111+
112+ it . skip ( 'with context' , ( ) => {
113+ // This is not supported with direct function evaluation...
114+ let element = { parentNode : null , _x_dataStack : [ ] }
115+
116+ expect ( evaluate ( element , ( ) => this . foo , { context : { foo : 42 } } ) ) . toBe ( 42 )
117+ } ) ;
118+
119+ it ( 'auto-evaluating function expression' , ( ) => {
120+ let element = { parentNode : null , _x_dataStack : [ ] }
121+
122+ expect ( evaluate ( element , ( ) => 42 ) ) . toBe ( 42 )
123+ } ) ;
124+
125+ it ( 'non auto-evaluating function expression' , ( ) => {
126+ let element = { parentNode : null , _x_dataStack : [ ] }
127+
128+ Alpine . dontAutoEvaluateFunctions ( ( ) => {
129+ expect ( evaluate ( element , ( ) => 42 ) ( ) ) . toBe ( 42 )
130+ } )
131+ } ) ;
132+ } ) ;
133+
134+ describe ( 'evaluateLater([Function])' , ( ) => {
135+ it ( 'simple expression' , ( ) => {
136+ let element = { parentNode : null , _x_dataStack : [ ] }
137+
138+ let receiver = evaluateLater ( element , ( ) => 42 )
139+
140+ receiver ( value => {
141+ expect ( value ) . toBe ( 42 )
142+ } )
143+ } ) ;
144+
145+ it ( 'await' , ( ) => {
146+ let element = { parentNode : null , _x_dataStack : [ ] }
147+
148+ let receiver = evaluateLater ( element , ( ) => new Promise ( resolve => { setTimeout ( ( ) => resolve ( 42 ) , 10 ) } ) )
149+
150+ receiver ( value => {
151+ expect ( value ) . toBe ( 42 )
152+ } )
153+ } ) ;
154+ } )
0 commit comments