@@ -7,9 +7,9 @@ import type { EntityPath } from '../types.js';
7
7
8
8
export default class GlobalCache implements Cache {
9
9
private dependencies : Dep < EntityPath > [ ] = [ ] ;
10
- private cycleCache : Record < string , Record < string , number > > = { } ;
10
+ private cycleCache : Map < string , Map < string , number > > = new Map ( ) ;
11
11
private cycleIndex = - 1 ;
12
- private localCache : Record < string , Record < string , any > > = { } ;
12
+ private localCache : Map < string , Map < string , any > > = new Map ( ) ;
13
13
14
14
declare private getCache : (
15
15
pk : string ,
@@ -33,12 +33,12 @@ export default class GlobalCache implements Cache {
33
33
pk : string ,
34
34
schema : EntityInterface ,
35
35
entity : any ,
36
- computeValue : ( localCacheKey : Record < string , any > ) => void ,
36
+ computeValue : ( localCacheKey : Map < string , any > ) => void ,
37
37
) : object | undefined | symbol {
38
38
const key = schema . key ;
39
39
const { localCacheKey, cycleCacheKey } = this . getCacheKey ( key ) ;
40
40
41
- if ( ! localCacheKey [ pk ] ) {
41
+ if ( ! localCacheKey . get ( pk ) ) {
42
42
const globalCache : WeakDependencyMap <
43
43
EntityPath ,
44
44
object ,
@@ -48,7 +48,7 @@ export default class GlobalCache implements Cache {
48
48
// TODO: what if this just returned the deps - then we don't need to store them
49
49
50
50
if ( cachePath ) {
51
- localCacheKey [ pk ] = cacheValue . value ;
51
+ localCacheKey . set ( pk , cacheValue . value ) ;
52
52
// TODO: can we store the cache values instead of tracking *all* their sources?
53
53
// this is only used for setting endpoints cache correctly. if we got this far we will def need to set as we would have already tried getting it
54
54
this . dependencies . push ( ...cacheValue . dependencies ) ;
@@ -57,22 +57,22 @@ export default class GlobalCache implements Cache {
57
57
// if we don't find in denormalize cache then do full denormalize
58
58
else {
59
59
const trackingIndex = this . dependencies . length ;
60
- cycleCacheKey [ pk ] = trackingIndex ;
60
+ cycleCacheKey . set ( pk , trackingIndex ) ;
61
61
this . dependencies . push ( { entity, path : { key, pk } } ) ;
62
62
63
63
/** NON-GLOBAL_CACHE CODE */
64
64
computeValue ( localCacheKey ) ;
65
65
/** /END NON-GLOBAL_CACHE CODE */
66
66
67
- delete cycleCacheKey [ pk ] ;
67
+ cycleCacheKey . delete ( pk ) ;
68
68
// if in cycle, use the start of the cycle to track all deps
69
69
// otherwise, we use our own trackingIndex
70
70
const localKey = this . dependencies . slice (
71
71
this . cycleIndex === - 1 ? trackingIndex : this . cycleIndex ,
72
72
) ;
73
73
const cacheValue : EntityCacheValue = {
74
74
dependencies : localKey ,
75
- value : localCacheKey [ pk ] ,
75
+ value : localCacheKey . get ( pk ) ,
76
76
} ;
77
77
globalCache . set ( localKey , cacheValue ) ;
78
78
@@ -83,25 +83,25 @@ export default class GlobalCache implements Cache {
83
83
}
84
84
} else {
85
85
// cycle detected
86
- if ( pk in cycleCacheKey ) {
87
- this . cycleIndex = cycleCacheKey [ pk ] ;
86
+ if ( cycleCacheKey . has ( pk ) ) {
87
+ this . cycleIndex = cycleCacheKey . get ( pk ) ! ;
88
88
} else {
89
89
// with no cycle, globalCacheEntry will have already been set
90
90
this . dependencies . push ( { entity, path : { key, pk } } ) ;
91
91
}
92
92
}
93
- return localCacheKey [ pk ] ;
93
+ return localCacheKey . get ( pk ) ;
94
94
}
95
95
96
96
private getCacheKey ( key : string ) {
97
- if ( ! ( key in this . localCache ) ) {
98
- this . localCache [ key ] = Object . create ( null ) ;
97
+ if ( ! this . localCache . has ( key ) ) {
98
+ this . localCache . set ( key , new Map ( ) ) ;
99
99
}
100
- if ( ! ( key in this . cycleCache ) ) {
101
- this . cycleCache [ key ] = Object . create ( null ) ;
100
+ if ( ! this . cycleCache . has ( key ) ) {
101
+ this . cycleCache . set ( key , new Map ( ) ) ;
102
102
}
103
- const localCacheKey = this . localCache [ key ] ;
104
- const cycleCacheKey = this . cycleCache [ key ] ;
103
+ const localCacheKey = this . localCache . get ( key ) ! ;
104
+ const cycleCacheKey = this . cycleCache . get ( key ) ! ;
105
105
return { localCacheKey, cycleCacheKey } ;
106
106
}
107
107
@@ -150,22 +150,31 @@ const getEntityCaches = (entityCache: EntityCache) => {
150
150
// TODO: this should be based on a public interface
151
151
const entityInstance : EntityInterface = ( schema . cacheWith as any ) ?? schema ;
152
152
153
- if ( ! ( key in entityCache ) ) {
154
- entityCache [ key ] = Object . create ( null ) ;
153
+ if ( ! entityCache . has ( key ) ) {
154
+ entityCache . set ( key , new Map ( ) ) ;
155
155
}
156
- const entityCacheKey = entityCache [ key ] ;
157
- if ( ! entityCacheKey [ pk ] )
158
- entityCacheKey [ pk ] = new WeakMap <
159
- EntityInterface ,
160
- WeakDependencyMap < EntityPath , object , any >
161
- > ( ) ;
162
-
163
- let wem : WeakDependencyMap < EntityPath , object , any > = entityCacheKey [
164
- pk
165
- ] . get ( entityInstance ) as any ;
156
+ const entityCacheKey = entityCache . get ( key ) ! ;
157
+ if ( ! entityCacheKey . get ( pk ) )
158
+ entityCacheKey . set (
159
+ pk ,
160
+ new WeakMap <
161
+ EntityInterface ,
162
+ WeakDependencyMap < EntityPath , object , any >
163
+ > ( ) ,
164
+ ) ;
165
+
166
+ const entityCachePk = entityCacheKey . get ( pk ) as WeakMap <
167
+ EntityInterface < any > ,
168
+ WeakDependencyMap < EntityPath , object , any >
169
+ > ;
170
+ let wem = entityCachePk . get ( entityInstance ) as WeakDependencyMap <
171
+ EntityPath ,
172
+ object ,
173
+ any
174
+ > ;
166
175
if ( ! wem ) {
167
176
wem = new WeakDependencyMap < EntityPath , object , any > ( ) ;
168
- entityCacheKey [ pk ] . set ( entityInstance , wem ) ;
177
+ entityCachePk . set ( entityInstance , wem ) ;
169
178
}
170
179
171
180
return wem ;
0 commit comments