File tree 7 files changed +91
-13
lines changed
7 files changed +91
-13
lines changed Original file line number Diff line number Diff line change @@ -1047,12 +1047,21 @@ var memoize_1 = _src_fn_memoize;
1047
1047
function deco_memoize ( opts ) {
1048
1048
return function ( target , propertyKey , descriptor ) {
1049
1049
var viaProperty = descriptor == null ;
1050
- var fn = memoize_1 . fn_memoize ( viaProperty ? target [ propertyKey ] : descriptor . value , opts , propertyKey ) ;
1050
+ var isGetter = ! viaProperty && typeof descriptor . get === 'function' ;
1051
+ var innerFn = viaProperty
1052
+ ? target [ propertyKey ]
1053
+ : ( isGetter ? descriptor . get : descriptor . value ) ;
1054
+ var fn = memoize_1 . fn_memoize ( innerFn , opts , propertyKey ) ;
1051
1055
if ( viaProperty ) {
1052
1056
target [ propertyKey ] = fn ;
1053
1057
return ;
1054
1058
}
1055
- descriptor . value = fn ;
1059
+ if ( isGetter ) {
1060
+ descriptor . get = fn ;
1061
+ }
1062
+ else {
1063
+ descriptor . value = fn ;
1064
+ }
1056
1065
return descriptor ;
1057
1066
} ;
1058
1067
}
Original file line number Diff line number Diff line change 5
5
"name" : " Alexander Kit" ,
6
6
"email" : " alex.kit@atmajs.com"
7
7
},
8
- "version" : " 0.3.3 " ,
8
+ "version" : " 0.3.5 " ,
9
9
"main" : " ./lib/memd.js" ,
10
10
"types" : " ./lib/memd.d.ts" ,
11
11
"repository" : {
75
75
"typescript" : {
76
76
"compilerOptions" : {
77
77
"#if (TEST)" : {
78
- "module" : " AMD"
78
+ "module" : " AMD" ,
79
+ "target" : " es2020"
79
80
}
80
81
}
81
82
}
Original file line number Diff line number Diff line change @@ -15,7 +15,10 @@ import { deco } from 'memd';
15
15
16
16
class Foo {
17
17
@deco .memoize ()
18
- foo () {}
18
+ someMethod () {}
19
+
20
+ @deco .memoize ()
21
+ get someProp () {}
19
22
20
23
@deco .debounce ()
21
24
bar () {}
@@ -57,7 +60,12 @@ const cache = new Cache(<ICacheOpts> { maxAge: 60 });
57
60
58
61
``` ts
59
62
interface IMemoizeOpts {
63
+ // Per default method or getter returns are cached for all instances of a class.
64
+ // Use `perInstance` to cache per instance: this could be useful when the method reads `this.` values.
60
65
perInstance? : boolean
66
+
67
+ // When a promise is memoized, and gets rejected. Clear also the cache, so that
68
+ // the next time it wont hit the cache and is reavaluated.
61
69
clearOnReject? : boolean
62
70
}
63
71
.memoize (opts ?: ICacheOpts & IMemoizeOpts )
Original file line number Diff line number Diff line change @@ -5,12 +5,22 @@ export function deco_memoize (opts?: ICacheOpts & IMemoizeOpts) {
5
5
6
6
return function ( target , propertyKey , descriptor ?) {
7
7
const viaProperty = descriptor == null ;
8
- const fn = fn_memoize ( viaProperty ? target [ propertyKey ] : descriptor . value , opts , propertyKey ) ;
8
+ const isGetter = ! viaProperty && typeof descriptor . get === 'function' ;
9
+
10
+ const innerFn = viaProperty
11
+ ? target [ propertyKey ]
12
+ : ( isGetter ? descriptor . get : descriptor . value ) ;
13
+
14
+ const fn = fn_memoize ( innerFn , opts , propertyKey ) ;
9
15
if ( viaProperty ) {
10
16
target [ propertyKey ] = fn ;
11
17
return ;
12
18
}
13
- descriptor . value = fn ;
19
+ if ( isGetter ) {
20
+ descriptor . get = fn ;
21
+ } else {
22
+ descriptor . value = fn ;
23
+ }
14
24
return descriptor ;
15
25
} ;
16
- }
26
+ }
Original file line number Diff line number Diff line change 1
1
import { class_EventEmitter } from 'atma-utils'
2
2
import { deco_memoize } from '../src/deco/memoize' ;
3
- import sinon = require( 'sinon' ) ;
4
3
import { fn_memoize } from '../src/fn/memoize' ;
4
+ import * as sinon from 'sinon' ;
5
5
6
6
UTest ( {
7
7
'memoize' ( ) {
@@ -155,6 +155,47 @@ UTest({
155
155
let result3 = await promise3 ;
156
156
eq_ ( result3 , 3 ) ;
157
157
} ,
158
+
159
+ 'memoize on properties' : {
160
+ 'for all instances' ( ) {
161
+ class Foo {
162
+ @deco_memoize ( )
163
+ get getFoo ( ) {
164
+ return { t : Math . random ( ) } ;
165
+ }
166
+ }
167
+ let foo = new Foo ( ) ;
168
+ let v1 = foo . getFoo ;
169
+ let v2 = foo . getFoo ;
170
+ eq_ ( typeof v1 . t , 'number' ) ;
171
+ eq_ ( v1 . t , v2 . t ) ;
172
+
173
+ let foo2 = new Foo ( )
174
+ let v21 = foo2 . getFoo ;
175
+ eq_ ( v1 . t , v21 . t ) ;
176
+ } ,
177
+ 'per instance' ( ) {
178
+ class Foo {
179
+ @deco_memoize ( { perInstance : true } )
180
+ get getFoo ( ) {
181
+ return { t : Math . random ( ) } ;
182
+ }
183
+ }
184
+ let foo = new Foo ( ) ;
185
+ let v1 = foo . getFoo ;
186
+ let v2 = foo . getFoo ;
187
+ eq_ ( typeof v1 . t , 'number' ) ;
188
+ eq_ ( v1 . t , v2 . t ) ;
189
+
190
+ let foo2 = new Foo ( )
191
+ let v21 = foo2 . getFoo ;
192
+ let v22 = foo2 . getFoo ;
193
+ eq_ ( typeof v21 . t , 'number' ) ;
194
+ eq_ ( v21 . t , v22 . t ) ;
195
+
196
+ notEq_ ( v1 . t , v21 . t ) ;
197
+ }
198
+ }
158
199
} )
159
200
160
201
async function wait ( ms ) {
Original file line number Diff line number Diff line change 1
1
{
2
- "extends" : " ./tsconfig.json" ,
3
- "files" : [" src/export.ts" ]
4
- }
2
+ "files" : [" src/export.ts" ],
3
+ "exclude" : [" node_modules" ],
4
+ "compilerOptions" : {
5
+ "outDir" : " ts-temp" ,
6
+ "declaration" : true ,
7
+ "sourceMap" : false ,
8
+ "experimentalDecorators" : true ,
9
+ "moduleResolution" : " node"
10
+ }
11
+ }
Original file line number Diff line number Diff line change 4
4
"outDir" : " ts-temp" ,
5
5
"declaration" : true ,
6
6
"sourceMap" : false ,
7
- "experimentalDecorators" : true
7
+ "experimentalDecorators" : true ,
8
+ "moduleResolution" : " node" ,
9
+ "target" : " ES2020"
8
10
}
9
11
}
You can’t perform that action at this time.
0 commit comments