@@ -4,10 +4,11 @@ import {
4
4
toRaw ,
5
5
isReactive ,
6
6
isReadonly ,
7
- markNonReactive ,
7
+ markRaw ,
8
8
effect ,
9
9
ref ,
10
- shallowReadonly
10
+ shallowReadonly ,
11
+ isProxy
11
12
} from '../src'
12
13
import { mockWarn } from '@vue/shared'
13
14
@@ -22,22 +23,23 @@ describe('reactivity/readonly', () => {
22
23
describe ( 'Object' , ( ) => {
23
24
it ( 'should make nested values readonly' , ( ) => {
24
25
const original = { foo : 1 , bar : { baz : 2 } }
25
- const observed = readonly ( original )
26
- expect ( observed ) . not . toBe ( original )
27
- expect ( isReactive ( observed ) ) . toBe ( true )
28
- expect ( isReadonly ( observed ) ) . toBe ( true )
26
+ const wrapped = readonly ( original )
27
+ expect ( wrapped ) . not . toBe ( original )
28
+ expect ( isProxy ( wrapped ) ) . toBe ( true )
29
+ expect ( isReactive ( wrapped ) ) . toBe ( false )
30
+ expect ( isReadonly ( wrapped ) ) . toBe ( true )
29
31
expect ( isReactive ( original ) ) . toBe ( false )
30
32
expect ( isReadonly ( original ) ) . toBe ( false )
31
- expect ( isReactive ( observed . bar ) ) . toBe ( true )
32
- expect ( isReadonly ( observed . bar ) ) . toBe ( true )
33
+ expect ( isReactive ( wrapped . bar ) ) . toBe ( false )
34
+ expect ( isReadonly ( wrapped . bar ) ) . toBe ( true )
33
35
expect ( isReactive ( original . bar ) ) . toBe ( false )
34
36
expect ( isReadonly ( original . bar ) ) . toBe ( false )
35
37
// get
36
- expect ( observed . foo ) . toBe ( 1 )
38
+ expect ( wrapped . foo ) . toBe ( 1 )
37
39
// has
38
- expect ( 'foo' in observed ) . toBe ( true )
40
+ expect ( 'foo' in wrapped ) . toBe ( true )
39
41
// ownKeys
40
- expect ( Object . keys ( observed ) ) . toEqual ( [ 'foo' , 'bar' ] )
42
+ expect ( Object . keys ( wrapped ) ) . toEqual ( [ 'foo' , 'bar' ] )
41
43
} )
42
44
43
45
it ( 'should not allow mutation' , ( ) => {
@@ -49,54 +51,54 @@ describe('reactivity/readonly', () => {
49
51
} ,
50
52
[ qux ] : 3
51
53
}
52
- const observed : Writable < typeof original > = readonly ( original )
54
+ const wrapped : Writable < typeof original > = readonly ( original )
53
55
54
- observed . foo = 2
55
- expect ( observed . foo ) . toBe ( 1 )
56
+ wrapped . foo = 2
57
+ expect ( wrapped . foo ) . toBe ( 1 )
56
58
expect (
57
59
`Set operation on key "foo" failed: target is readonly.`
58
60
) . toHaveBeenWarnedLast ( )
59
61
60
- observed . bar . baz = 3
61
- expect ( observed . bar . baz ) . toBe ( 2 )
62
+ wrapped . bar . baz = 3
63
+ expect ( wrapped . bar . baz ) . toBe ( 2 )
62
64
expect (
63
65
`Set operation on key "baz" failed: target is readonly.`
64
66
) . toHaveBeenWarnedLast ( )
65
67
66
- observed [ qux ] = 4
67
- expect ( observed [ qux ] ) . toBe ( 3 )
68
+ wrapped [ qux ] = 4
69
+ expect ( wrapped [ qux ] ) . toBe ( 3 )
68
70
expect (
69
71
`Set operation on key "Symbol(qux)" failed: target is readonly.`
70
72
) . toHaveBeenWarnedLast ( )
71
73
72
- delete observed . foo
73
- expect ( observed . foo ) . toBe ( 1 )
74
+ delete wrapped . foo
75
+ expect ( wrapped . foo ) . toBe ( 1 )
74
76
expect (
75
77
`Delete operation on key "foo" failed: target is readonly.`
76
78
) . toHaveBeenWarnedLast ( )
77
79
78
- delete observed . bar . baz
79
- expect ( observed . bar . baz ) . toBe ( 2 )
80
+ delete wrapped . bar . baz
81
+ expect ( wrapped . bar . baz ) . toBe ( 2 )
80
82
expect (
81
83
`Delete operation on key "baz" failed: target is readonly.`
82
84
) . toHaveBeenWarnedLast ( )
83
85
84
- delete observed [ qux ]
85
- expect ( observed [ qux ] ) . toBe ( 3 )
86
+ delete wrapped [ qux ]
87
+ expect ( wrapped [ qux ] ) . toBe ( 3 )
86
88
expect (
87
89
`Delete operation on key "Symbol(qux)" failed: target is readonly.`
88
90
) . toHaveBeenWarnedLast ( )
89
91
} )
90
92
91
93
it ( 'should not trigger effects' , ( ) => {
92
- const observed : any = readonly ( { a : 1 } )
94
+ const wrapped : any = readonly ( { a : 1 } )
93
95
let dummy
94
96
effect ( ( ) => {
95
- dummy = observed . a
97
+ dummy = wrapped . a
96
98
} )
97
99
expect ( dummy ) . toBe ( 1 )
98
- observed . a = 2
99
- expect ( observed . a ) . toBe ( 1 )
100
+ wrapped . a = 2
101
+ expect ( wrapped . a ) . toBe ( 1 )
100
102
expect ( dummy ) . toBe ( 1 )
101
103
expect ( `target is readonly` ) . toHaveBeenWarned ( )
102
104
} )
@@ -105,65 +107,66 @@ describe('reactivity/readonly', () => {
105
107
describe ( 'Array' , ( ) => {
106
108
it ( 'should make nested values readonly' , ( ) => {
107
109
const original = [ { foo : 1 } ]
108
- const observed = readonly ( original )
109
- expect ( observed ) . not . toBe ( original )
110
- expect ( isReactive ( observed ) ) . toBe ( true )
111
- expect ( isReadonly ( observed ) ) . toBe ( true )
110
+ const wrapped = readonly ( original )
111
+ expect ( wrapped ) . not . toBe ( original )
112
+ expect ( isProxy ( wrapped ) ) . toBe ( true )
113
+ expect ( isReactive ( wrapped ) ) . toBe ( false )
114
+ expect ( isReadonly ( wrapped ) ) . toBe ( true )
112
115
expect ( isReactive ( original ) ) . toBe ( false )
113
116
expect ( isReadonly ( original ) ) . toBe ( false )
114
- expect ( isReactive ( observed [ 0 ] ) ) . toBe ( true )
115
- expect ( isReadonly ( observed [ 0 ] ) ) . toBe ( true )
117
+ expect ( isReactive ( wrapped [ 0 ] ) ) . toBe ( false )
118
+ expect ( isReadonly ( wrapped [ 0 ] ) ) . toBe ( true )
116
119
expect ( isReactive ( original [ 0 ] ) ) . toBe ( false )
117
120
expect ( isReadonly ( original [ 0 ] ) ) . toBe ( false )
118
121
// get
119
- expect ( observed [ 0 ] . foo ) . toBe ( 1 )
122
+ expect ( wrapped [ 0 ] . foo ) . toBe ( 1 )
120
123
// has
121
- expect ( 0 in observed ) . toBe ( true )
124
+ expect ( 0 in wrapped ) . toBe ( true )
122
125
// ownKeys
123
- expect ( Object . keys ( observed ) ) . toEqual ( [ '0' ] )
126
+ expect ( Object . keys ( wrapped ) ) . toEqual ( [ '0' ] )
124
127
} )
125
128
126
129
it ( 'should not allow mutation' , ( ) => {
127
- const observed : any = readonly ( [ { foo : 1 } ] )
128
- observed [ 0 ] = 1
129
- expect ( observed [ 0 ] ) . not . toBe ( 1 )
130
+ const wrapped : any = readonly ( [ { foo : 1 } ] )
131
+ wrapped [ 0 ] = 1
132
+ expect ( wrapped [ 0 ] ) . not . toBe ( 1 )
130
133
expect (
131
134
`Set operation on key "0" failed: target is readonly.`
132
135
) . toHaveBeenWarned ( )
133
- observed [ 0 ] . foo = 2
134
- expect ( observed [ 0 ] . foo ) . toBe ( 1 )
136
+ wrapped [ 0 ] . foo = 2
137
+ expect ( wrapped [ 0 ] . foo ) . toBe ( 1 )
135
138
expect (
136
139
`Set operation on key "foo" failed: target is readonly.`
137
140
) . toHaveBeenWarned ( )
138
141
139
142
// should block length mutation
140
- observed . length = 0
141
- expect ( observed . length ) . toBe ( 1 )
142
- expect ( observed [ 0 ] . foo ) . toBe ( 1 )
143
+ wrapped . length = 0
144
+ expect ( wrapped . length ) . toBe ( 1 )
145
+ expect ( wrapped [ 0 ] . foo ) . toBe ( 1 )
143
146
expect (
144
147
`Set operation on key "length" failed: target is readonly.`
145
148
) . toHaveBeenWarned ( )
146
149
147
150
// mutation methods invoke set/length internally and thus are blocked as well
148
- observed . push ( 2 )
149
- expect ( observed . length ) . toBe ( 1 )
151
+ wrapped . push ( 2 )
152
+ expect ( wrapped . length ) . toBe ( 1 )
150
153
// push triggers two warnings on [1] and .length
151
154
expect ( `target is readonly.` ) . toHaveBeenWarnedTimes ( 5 )
152
155
} )
153
156
154
157
it ( 'should not trigger effects' , ( ) => {
155
- const observed : any = readonly ( [ { a : 1 } ] )
158
+ const wrapped : any = readonly ( [ { a : 1 } ] )
156
159
let dummy
157
160
effect ( ( ) => {
158
- dummy = observed [ 0 ] . a
161
+ dummy = wrapped [ 0 ] . a
159
162
} )
160
163
expect ( dummy ) . toBe ( 1 )
161
- observed [ 0 ] . a = 2
162
- expect ( observed [ 0 ] . a ) . toBe ( 1 )
164
+ wrapped [ 0 ] . a = 2
165
+ expect ( wrapped [ 0 ] . a ) . toBe ( 1 )
163
166
expect ( dummy ) . toBe ( 1 )
164
167
expect ( `target is readonly` ) . toHaveBeenWarnedTimes ( 1 )
165
- observed [ 0 ] = { a : 2 }
166
- expect ( observed [ 0 ] . a ) . toBe ( 1 )
168
+ wrapped [ 0 ] = { a : 2 }
169
+ expect ( wrapped [ 0 ] . a ) . toBe ( 1 )
167
170
expect ( dummy ) . toBe ( 1 )
168
171
expect ( `target is readonly` ) . toHaveBeenWarnedTimes ( 2 )
169
172
} )
@@ -176,14 +179,15 @@ describe('reactivity/readonly', () => {
176
179
const key1 = { }
177
180
const key2 = { }
178
181
const original = new Collection ( [ [ key1 , { } ] , [ key2 , { } ] ] )
179
- const observed = readonly ( original )
180
- expect ( observed ) . not . toBe ( original )
181
- expect ( isReactive ( observed ) ) . toBe ( true )
182
- expect ( isReadonly ( observed ) ) . toBe ( true )
182
+ const wrapped = readonly ( original )
183
+ expect ( wrapped ) . not . toBe ( original )
184
+ expect ( isProxy ( wrapped ) ) . toBe ( true )
185
+ expect ( isReactive ( wrapped ) ) . toBe ( false )
186
+ expect ( isReadonly ( wrapped ) ) . toBe ( true )
183
187
expect ( isReactive ( original ) ) . toBe ( false )
184
188
expect ( isReadonly ( original ) ) . toBe ( false )
185
- expect ( isReactive ( observed . get ( key1 ) ) ) . toBe ( true )
186
- expect ( isReadonly ( observed . get ( key1 ) ) ) . toBe ( true )
189
+ expect ( isReactive ( wrapped . get ( key1 ) ) ) . toBe ( false )
190
+ expect ( isReadonly ( wrapped . get ( key1 ) ) ) . toBe ( true )
187
191
expect ( isReactive ( original . get ( key1 ) ) ) . toBe ( false )
188
192
expect ( isReadonly ( original . get ( key1 ) ) ) . toBe ( false )
189
193
} )
@@ -209,15 +213,15 @@ describe('reactivity/readonly', () => {
209
213
const key1 = { }
210
214
const key2 = { }
211
215
const original = new Collection ( [ [ key1 , { } ] , [ key2 , { } ] ] )
212
- const observed : any = readonly ( original )
213
- for ( const [ key , value ] of observed ) {
216
+ const wrapped : any = readonly ( original )
217
+ for ( const [ key , value ] of wrapped ) {
214
218
expect ( isReadonly ( key ) ) . toBe ( true )
215
219
expect ( isReadonly ( value ) ) . toBe ( true )
216
220
}
217
- observed . forEach ( ( value : any ) => {
221
+ wrapped . forEach ( ( value : any ) => {
218
222
expect ( isReadonly ( value ) ) . toBe ( true )
219
223
} )
220
- for ( const value of observed . values ( ) ) {
224
+ for ( const value of wrapped . values ( ) ) {
221
225
expect ( isReadonly ( value ) ) . toBe ( true )
222
226
}
223
227
} )
@@ -232,13 +236,14 @@ describe('reactivity/readonly', () => {
232
236
const key1 = { }
233
237
const key2 = { }
234
238
const original = new Collection ( [ key1 , key2 ] )
235
- const observed = readonly ( original )
236
- expect ( observed ) . not . toBe ( original )
237
- expect ( isReactive ( observed ) ) . toBe ( true )
238
- expect ( isReadonly ( observed ) ) . toBe ( true )
239
+ const wrapped = readonly ( original )
240
+ expect ( wrapped ) . not . toBe ( original )
241
+ expect ( isProxy ( wrapped ) ) . toBe ( true )
242
+ expect ( isReactive ( wrapped ) ) . toBe ( false )
243
+ expect ( isReadonly ( wrapped ) ) . toBe ( true )
239
244
expect ( isReactive ( original ) ) . toBe ( false )
240
245
expect ( isReadonly ( original ) ) . toBe ( false )
241
- expect ( observed . has ( reactive ( key1 ) ) ) . toBe ( true )
246
+ expect ( wrapped . has ( reactive ( key1 ) ) ) . toBe ( true )
242
247
expect ( original . has ( reactive ( key1 ) ) ) . toBe ( false )
243
248
} )
244
249
@@ -261,17 +266,17 @@ describe('reactivity/readonly', () => {
261
266
if ( Collection === Set ) {
262
267
test ( 'should retrieve readonly values on iteration' , ( ) => {
263
268
const original = new Collection ( [ { } , { } ] )
264
- const observed : any = readonly ( original )
265
- for ( const value of observed ) {
269
+ const wrapped : any = readonly ( original )
270
+ for ( const value of wrapped ) {
266
271
expect ( isReadonly ( value ) ) . toBe ( true )
267
272
}
268
- observed . forEach ( ( value : any ) => {
273
+ wrapped . forEach ( ( value : any ) => {
269
274
expect ( isReadonly ( value ) ) . toBe ( true )
270
275
} )
271
- for ( const value of observed . values ( ) ) {
276
+ for ( const value of wrapped . values ( ) ) {
272
277
expect ( isReadonly ( value ) ) . toBe ( true )
273
278
}
274
- for ( const [ v1 , v2 ] of observed . entries ( ) ) {
279
+ for ( const [ v1 , v2 ] of wrapped . entries ( ) ) {
275
280
expect ( isReadonly ( v1 ) ) . toBe ( true )
276
281
expect ( isReadonly ( v2 ) ) . toBe ( true )
277
282
}
@@ -299,6 +304,9 @@ describe('reactivity/readonly', () => {
299
304
test ( 'readonly should track and trigger if wrapping reactive original' , ( ) => {
300
305
const a = reactive ( { n : 1 } )
301
306
const b = readonly ( a )
307
+ // should return true since it's wrapping a reactive source
308
+ expect ( isReactive ( b ) ) . toBe ( true )
309
+
302
310
let dummy
303
311
effect ( ( ) => {
304
312
dummy = b . n
@@ -309,26 +317,26 @@ describe('reactivity/readonly', () => {
309
317
expect ( dummy ) . toBe ( 2 )
310
318
} )
311
319
312
- test ( 'observing already observed value should return same Proxy' , ( ) => {
320
+ test ( 'wrapping already wrapped value should return same Proxy' , ( ) => {
313
321
const original = { foo : 1 }
314
- const observed = readonly ( original )
315
- const observed2 = readonly ( observed )
316
- expect ( observed2 ) . toBe ( observed )
322
+ const wrapped = readonly ( original )
323
+ const wrapped2 = readonly ( wrapped )
324
+ expect ( wrapped2 ) . toBe ( wrapped )
317
325
} )
318
326
319
- test ( 'observing the same value multiple times should return same Proxy' , ( ) => {
327
+ test ( 'wrapping the same value multiple times should return same Proxy' , ( ) => {
320
328
const original = { foo : 1 }
321
- const observed = readonly ( original )
322
- const observed2 = readonly ( original )
323
- expect ( observed2 ) . toBe ( observed )
329
+ const wrapped = readonly ( original )
330
+ const wrapped2 = readonly ( original )
331
+ expect ( wrapped2 ) . toBe ( wrapped )
324
332
} )
325
333
326
- test ( 'markNonReactive ' , ( ) => {
334
+ test ( 'markRaw ' , ( ) => {
327
335
const obj = readonly ( {
328
336
foo : { a : 1 } ,
329
- bar : markNonReactive ( { b : 2 } )
337
+ bar : markRaw ( { b : 2 } )
330
338
} )
331
- expect ( isReactive ( obj . foo ) ) . toBe ( true )
339
+ expect ( isReadonly ( obj . foo ) ) . toBe ( true )
332
340
expect ( isReactive ( obj . bar ) ) . toBe ( false )
333
341
} )
334
342
0 commit comments