@@ -19,12 +19,17 @@ test('get', t => {
19
19
t . is ( dotProp . get ( { foo : { } } , 'foo.fake' , 'some value' ) , 'some value' ) ;
20
20
t . true ( dotProp . get ( { '\\' : true } , '\\' ) ) ;
21
21
t . true ( dotProp . get ( { '\\foo' : true } , '\\foo' ) ) ;
22
+ t . true ( dotProp . get ( { '\\foo' : true } , '\\\\foo' ) ) ;
23
+ t . true ( dotProp . get ( { 'foo\\' : true } , 'foo\\\\' ) ) ;
22
24
t . true ( dotProp . get ( { 'bar\\' : true } , 'bar\\' ) ) ;
23
25
t . true ( dotProp . get ( { 'foo\\bar' : true } , 'foo\\bar' ) ) ;
24
- t . true ( dotProp . get ( { '\\.foo' : true } , '\\\\.foo' ) ) ;
25
- t . true ( dotProp . get ( { 'bar\\.' : true } , 'bar\\\\.' ) ) ;
26
- t . true ( dotProp . get ( { 'foo\\.bar' : true } , 'foo\\\\.bar' ) ) ;
26
+ t . true ( dotProp . get ( { '\\' : { foo : true } } , '\\\\.foo' ) ) ;
27
+ t . true ( dotProp . get ( { 'bar\\.' : true } , 'bar\\\\\\.' ) ) ;
28
+ t . true ( dotProp . get ( { 'foo\\' : {
29
+ bar : true
30
+ } } , 'foo\\\\.bar' ) ) ;
27
31
t . is ( dotProp . get ( { foo : 1 } , 'foo.bar' ) , undefined ) ;
32
+ t . true ( dotProp . get ( { 'foo\\' : true } , 'foo\\' ) ) ;
28
33
29
34
const fixture2 = { } ;
30
35
Object . defineProperty ( fixture2 , 'foo' , {
@@ -56,6 +61,103 @@ test('get', t => {
56
61
F4Class . prototype . foo = 1 ;
57
62
const f4 = new F4Class ( ) ;
58
63
t . is ( dotProp . get ( f4 , 'foo' ) , 1 ) ; // #46
64
+
65
+ t . true ( dotProp . get ( { '' : { '' : { '' : true } } } , '..' ) ) ;
66
+ t . true ( dotProp . get ( { '' : { '' : true } } , '.' ) ) ;
67
+ } ) ;
68
+
69
+ test ( 'get with array indexes' , t => {
70
+ t . true ( dotProp . get ( [ true , false , false ] , '[0]' ) ) ;
71
+ t . true ( dotProp . get ( [ [ false , true , false ] , false , false ] , '[0][1]' ) ) ;
72
+ t . true ( dotProp . get ( [ { foo : [ true ] } ] , '[0].foo[0]' ) ) ;
73
+ t . true ( dotProp . get ( { foo : [ 0 , { bar : true } ] } , 'foo[1].bar' ) ) ;
74
+
75
+ t . false ( dotProp . get ( [ 'a' , 'b' , 'c' ] , '3' , false ) ) ;
76
+ t . false ( dotProp . get ( [ { foo : [ 1 ] } ] , '[0].bar[0]' , false ) ) ;
77
+ t . false ( dotProp . get ( [ { foo : [ 1 ] } ] , '[0].foo[1]' , false ) ) ;
78
+ t . false ( dotProp . get ( { foo : [ 0 , { bar : 2 } ] } , 'foo[0].bar' , false ) ) ;
79
+ t . false ( dotProp . get ( { foo : [ 0 , { bar : 2 } ] } , 'foo[2].bar' , false ) ) ;
80
+ t . false ( dotProp . get ( { foo : [ 0 , { bar : 2 } ] } , 'foo[1].biz' , false ) ) ;
81
+ t . false ( dotProp . get ( { foo : [ 0 , { bar : 2 } ] } , 'bar[0].bar' , false ) ) ;
82
+ t . true ( dotProp . get ( {
83
+ bar : {
84
+ '[0]' : true
85
+ }
86
+ } , 'bar.\\[0]' ) ) ;
87
+ t . true ( dotProp . get ( {
88
+ bar : {
89
+ '' : [ true ]
90
+ }
91
+ } , 'bar.[0]' ) ) ;
92
+ t . throws ( ( ) => dotProp . get ( {
93
+ 'foo[5[' : true
94
+ } , 'foo[5[' ) , {
95
+ message : 'Invalid character in an index'
96
+ } ) ;
97
+ t . throws ( ( ) => dotProp . get ( {
98
+ 'foo[5' : {
99
+ bar : true
100
+ }
101
+ } , 'foo[5.bar' ) , {
102
+ message : 'Invalid character in an index'
103
+ } ) ;
104
+ t . true ( dotProp . get ( {
105
+ 'foo[5]' : {
106
+ bar : true
107
+ }
108
+ } , 'foo\\[5].bar' ) ) ;
109
+ t . throws ( ( ) => dotProp . get ( {
110
+ 'foo[5\\]' : {
111
+ bar : true
112
+ }
113
+ } , 'foo[5\\].bar' ) , {
114
+ message : 'Invalid character in an index'
115
+ } ) ;
116
+ t . throws ( ( ) => dotProp . get ( {
117
+ 'foo[5' : true
118
+ } , 'foo[5' ) , {
119
+ message : 'Index was not closed'
120
+ } ) ;
121
+ t . throws ( ( ) => dotProp . get ( {
122
+ 'foo[bar]' : true
123
+ } , 'foo[bar]' ) , {
124
+ message : 'Invalid character in an index'
125
+ } ) ;
126
+ t . false ( dotProp . get ( { } , 'constructor[0]' , false ) ) ;
127
+ t . throws ( ( ) => dotProp . get ( { } , 'foo[constructor]' , false ) , {
128
+ message : 'Invalid character in an index'
129
+ } ) ;
130
+
131
+ t . false ( dotProp . get ( [ ] , 'foo[0].bar' , false ) ) ;
132
+ t . true ( dotProp . get ( { foo : [ { bar : true } ] } , 'foo[0].bar' ) ) ;
133
+ t . false ( dotProp . get ( { foo : [ 'bar' ] } , 'foo[1]' , false ) ) ;
134
+
135
+ t . false ( dotProp . get ( [ true ] , '0' , false ) ) ;
136
+
137
+ t . false ( dotProp . get ( { foo : [ true ] } , 'foo.0' , false ) ) ;
138
+ t . true ( dotProp . get ( { foo : {
139
+ 0 : true
140
+ } } , 'foo.0' ) ) ;
141
+
142
+ t . true ( dotProp . get ( [ {
143
+ '[1]' : true
144
+ } , false , false ] , '[0].\\[1]' ) ) ;
145
+
146
+ t . true ( dotProp . get ( { foo : { '[0]' : true } } , 'foo.\\[0]' ) ) ;
147
+ t . throws ( ( ) => dotProp . get ( { foo : { '[0]' : true } } , 'foo.[0\\]' ) , {
148
+ message : 'Invalid character in an index'
149
+ } ) ;
150
+ t . true ( dotProp . get ( { foo : { '\\' : [ true ] } } , 'foo.\\\\[0]' ) ) ;
151
+ t . throws ( ( ) => dotProp . get ( { foo : { '[0]' : true } } , 'foo.[0\\]' ) , {
152
+ message : 'Invalid character in an index'
153
+ } ) ;
154
+
155
+ t . throws ( ( ) => dotProp . get ( { 'foo[0' : { '9]' : true } } , 'foo[0.9]' ) , {
156
+ message : 'Invalid character in an index'
157
+ } ) ;
158
+ t . throws ( ( ) => dotProp . get ( { 'foo[-1]' : true } , 'foo[-1]' ) , {
159
+ message : 'Invalid character in an index'
160
+ } ) ;
59
161
} ) ;
60
162
61
163
test ( 'set' , t => {
@@ -117,6 +219,32 @@ test('set', t => {
117
219
const output4 = dotProp . set ( fixture4 , 'foo.bar' , 2 ) ;
118
220
t . is ( fixture4 , 'noobject' ) ;
119
221
t . is ( output4 , fixture4 ) ;
222
+
223
+ const fixture5 = [ ] ;
224
+
225
+ dotProp . set ( fixture5 , '[1]' , true ) ;
226
+ t . is ( fixture5 [ 1 ] , true ) ;
227
+
228
+ dotProp . set ( fixture5 , '[0].foo[0]' , true ) ;
229
+ t . is ( fixture5 [ 0 ] . foo [ 0 ] , true ) ;
230
+
231
+ t . throws ( ( ) => dotProp . set ( fixture5 , '1' , true ) , {
232
+ message : 'Cannot use string index'
233
+ } ) ;
234
+
235
+ t . throws ( ( ) => dotProp . set ( fixture5 , '0.foo.0' , true ) , {
236
+ message : 'Cannot use string index'
237
+ } ) ;
238
+
239
+ const fixture6 = { } ;
240
+
241
+ dotProp . set ( fixture6 , 'foo[0].bar' , true ) ;
242
+ t . true ( fixture6 . foo [ 0 ] . bar ) ;
243
+ t . deepEqual ( fixture6 , {
244
+ foo : [ {
245
+ bar : true
246
+ } ]
247
+ } ) ;
120
248
} ) ;
121
249
122
250
test ( 'delete' , t => {
@@ -180,6 +308,39 @@ test('delete', t => {
180
308
const fixture3 = { foo : null } ;
181
309
t . false ( dotProp . delete ( fixture3 , 'foo.bar' ) ) ;
182
310
t . deepEqual ( fixture3 , { foo : null } ) ;
311
+
312
+ const fixture4 = [ {
313
+ top : {
314
+ dog : 'sindre'
315
+ }
316
+ } ] ;
317
+
318
+ t . throws ( ( ) => dotProp . delete ( fixture4 , '0.top.dog' ) , {
319
+ message : 'Cannot use string index'
320
+ } ) ;
321
+ t . true ( dotProp . delete ( fixture4 , '[0].top.dog' ) ) ;
322
+ t . deepEqual ( fixture4 , [ { top : { } } ] ) ;
323
+
324
+ const fixture5 = {
325
+ foo : [ {
326
+ bar : [ 'foo' , 'bar' ]
327
+ } ]
328
+ } ;
329
+
330
+ dotProp . delete ( fixture5 , 'foo[0].bar[0]' ) ;
331
+
332
+ const fixtureArray = [ ] ;
333
+ fixtureArray [ 1 ] = 'bar' ;
334
+
335
+ t . deepEqual ( fixture5 , {
336
+ foo : [ {
337
+ bar : fixtureArray
338
+ } ]
339
+ } ) ;
340
+
341
+ const fixture6 = { } ;
342
+
343
+ dotProp . set ( fixture6 , 'foo.bar.0' , 'fizz' ) ;
183
344
} ) ;
184
345
185
346
test ( 'has' , t => {
@@ -205,6 +366,21 @@ test('has', t => {
205
366
t . true ( dotProp . has ( { 'foo.baz' : { bar : true } } , 'foo\\.baz.bar' ) ) ;
206
367
t . true ( dotProp . has ( { 'fo.ob.az' : { bar : true } } , 'fo\\.ob\\.az.bar' ) ) ;
207
368
t . false ( dotProp . has ( undefined , 'fo\\.ob\\.az.bar' ) ) ;
369
+
370
+ t . false ( dotProp . has ( {
371
+ foo : [ { bar : [ 'bar' , 'bizz' ] } ]
372
+ } , 'foo[0].bar.1' ) ) ;
373
+ t . false ( dotProp . has ( {
374
+ foo : [ { bar : [ 'bar' , 'bizz' ] } ]
375
+ } , 'foo[0].bar.2' ) ) ;
376
+ t . false ( dotProp . has ( {
377
+ foo : [ { bar : [ 'bar' , 'bizz' ] } ]
378
+ } , 'foo[1].bar.1' ) ) ;
379
+ t . true ( dotProp . has ( {
380
+ foo : [ { bar : {
381
+ 1 : 'bar'
382
+ } } ]
383
+ } , 'foo[0].bar.1' ) ) ;
208
384
} ) ;
209
385
210
386
test ( 'prevent setting/getting `__proto__`' , t => {
0 commit comments