File tree 3 files changed +21
-6
lines changed
3 files changed +21
-6
lines changed Original file line number Diff line number Diff line change 1
1
{
2
2
"name" : " sfobj" ,
3
- "version" : " 1.0.0 " ,
3
+ "version" : " 1.0.1 " ,
4
4
"main" : " ./index.js" ,
5
5
"description" : " JS proxy for safe property access." ,
6
6
"repository" : " https://github.com/devMYC/sfobj.git" ,
10
10
"node" : " >= 6.0"
11
11
},
12
12
"scripts" : {
13
- "build" : " rm -fr ./dist && tsc" ,
13
+ "build" : " rm -fr ./dist && tsc && cp ./package.json ./dist " ,
14
14
"codecov" : " codecov -f ./coverage/coverage-final.json" ,
15
15
"show:coverage" : " open ./coverage/lcov-report/index.html" ,
16
16
"test" : " jest --runInBand"
Original file line number Diff line number Diff line change @@ -15,20 +15,26 @@ type SafeProxy<T> = {
15
15
export function Safe < T > ( v : T ) : SafeProxy < T > {
16
16
let curr = v
17
17
const proxy : any = new Proxy ( NeverFail , {
18
- apply ( ) {
18
+ apply ( _ , __ , args ) {
19
+ typeof curr === 'function' && ( curr = curr ( ...args ) )
19
20
return proxy
20
21
} ,
21
22
get ( _ , prop ) {
23
+ let val : any
22
24
switch ( true ) {
23
25
case prop === unwrap :
24
- const val = curr
26
+ val = curr
25
27
curr = v
26
28
return val
27
29
case prop === Symbol . toPrimitive : return ( ) => Safe . name
28
30
case curr == null : break
29
31
default :
30
- curr = ( curr as any ) [ prop ]
31
- typeof curr === 'function' && ( curr = curr ( ) )
32
+ val = ( curr as any ) [ prop ]
33
+ if ( typeof val === 'function' ) {
34
+ curr = val . bind ( curr )
35
+ } else {
36
+ curr = val
37
+ }
32
38
break
33
39
}
34
40
return proxy
Original file line number Diff line number Diff line change @@ -4,13 +4,20 @@ test(Safe.name, () => {
4
4
const obj = {
5
5
a : 100 ,
6
6
b : {
7
+ x : 200 ,
7
8
c : [
8
9
{ d : 1e3 } ,
9
10
{ e : ( ) => 1e4 } ,
10
11
] ,
12
+ add ( y ) {
13
+ return this . x + y
14
+ } ,
11
15
} ,
12
16
f : null ,
13
17
g : undefined ,
18
+ add ( x : number ) {
19
+ return this . a + x
20
+ } ,
14
21
}
15
22
16
23
const safeObj = Safe ( obj )
@@ -21,5 +28,7 @@ test(Safe.name, () => {
21
28
expect ( ( safeObj . g as SafeWrapper < undefined > ) [ unwrap ] ) . toBe ( undefined )
22
29
expect ( safeObj . b . c [ 0 ] . d [ unwrap ] ) . toBe ( 1e3 )
23
30
expect ( safeObj . b . c [ 1 ] . e ( ) [ unwrap ] ) . toBe ( 1e4 )
31
+ expect ( safeObj . add ( 1 ) [ unwrap ] ) . toBe ( 101 )
32
+ expect ( safeObj . b . add ( 2 ) [ unwrap ] ) . toBe ( 202 )
24
33
expect ( ( safeObj . b . c [ 100 ] as any ) . xx ( ) . yy . zz ( ) . or [ 1 ] . whatever [ 'key' ] [ unwrap ] ) . toBe ( undefined )
25
34
} )
You can’t perform that action at this time.
0 commit comments