@@ -21,18 +21,32 @@ function isResolved(value: any): value is IsResolved<any> {
21
21
return value . hasOwnProperty ( "resolved" ) ;
22
22
}
23
23
24
- export type Resolving < T > = HasDeps & HasValue < T > ;
25
- export type Resolved < T , R > = IsResolved < R > & HasValue < T > & HasDeps ;
26
- export type MaybeResolving < T , R > = Resolving < T > | Resolved < T , R > ;
27
- type ResolvingOrDeps < T , R > = MaybeResolving < T , R > | HasDeps ;
24
+ type InternalResolving < T > = HasDeps & HasValue < T > ;
25
+ type InternalResolved < T , R > = IsResolved < R > & HasValue < T > & HasDeps ;
26
+ type InternalMaybeResolving < T , R > =
27
+ | InternalResolving < T >
28
+ | InternalResolved < T , R > ;
29
+
30
+ export type Resolved < T , R > = IsResolved < R > & HasValue < T > ;
31
+ export type MaybeResolving < T , R > = HasValue < T > | Resolved < T , R > ;
32
+ type ResolvingOrDeps < T , R > = InternalMaybeResolving < T , R > | HasDeps ;
28
33
29
34
type Unresolved < T > = HasValue < T > ;
30
35
type Requested = HasDeps ;
31
- type Stored < T , R > = Resolving < T > | Resolved < T , R > | Unresolved < T > | Requested ;
36
+ type Stored < T , R > =
37
+ | InternalResolving < T >
38
+ | InternalResolved < T , R >
39
+ | Unresolved < T >
40
+ | Requested ;
32
41
33
- type Resolver < T , R > = ( map : ResolvedIDMap < T , R > , id : ID , value : T ) => R ;
42
+ type Resolver < T , R > = ( value : T , id : ID , map : ResolvedIDMap < T , R > ) => R ;
34
43
35
44
export class ResolvedIDMap < T , R > {
45
+ private static removeDeps ( value : any ) : any {
46
+ const copy = { ...value } ;
47
+ delete copy . deps ;
48
+ return copy ;
49
+ }
36
50
private inner : IDMap < Stored < T , R > > = new IDMap ( ) ;
37
51
private resolver : Resolver < T , R > ;
38
52
private resolving ?: ID ;
@@ -42,6 +56,7 @@ export class ResolvedIDMap<T, R> {
42
56
}
43
57
44
58
public set ( id : ID , raw : T ) {
59
+ this . reset ( id ) ;
45
60
this . inner . set ( id , { raw } ) ;
46
61
}
47
62
@@ -58,7 +73,7 @@ export class ResolvedIDMap<T, R> {
58
73
public getCycle ( id : ID ) : MaybeResolving < T , R > | undefined {
59
74
const value = this . resolve ( id ) ;
60
75
if ( value && hasValue ( value ) ) {
61
- return value ;
76
+ return ResolvedIDMap . removeDeps ( value ) ;
62
77
}
63
78
return undefined ;
64
79
}
@@ -75,7 +90,7 @@ export class ResolvedIDMap<T, R> {
75
90
const result = this . getCycle ( id ) ;
76
91
if ( result ) {
77
92
if ( isResolved ( result ) ) {
78
- return result ;
93
+ return ResolvedIDMap . removeDeps ( result ) ;
79
94
}
80
95
throw new Error (
81
96
`Value for ${ id } requested during its own resolution. To avoid this error being thrown, use \`getCycle\` instead`
@@ -92,13 +107,14 @@ export class ResolvedIDMap<T, R> {
92
107
private reset ( id : ID ) : void {
93
108
const value = this . inner . get ( id ) ;
94
109
if ( value && hasDeps ( value ) ) {
95
- for ( const [ dep ] of value . deps ) {
96
- this . reset ( dep ) ;
97
- }
110
+ const { deps } = value ;
98
111
delete value . deps ;
99
112
if ( isResolved ( value ) ) {
100
113
delete value . resolved ;
101
114
}
115
+ for ( const [ dep ] of deps ) {
116
+ this . reset ( dep ) ;
117
+ }
102
118
}
103
119
}
104
120
@@ -115,24 +131,27 @@ export class ResolvedIDMap<T, R> {
115
131
}
116
132
return undefined ;
117
133
}
118
- if ( hasDeps ( value ) ) {
119
- if ( previousResolving ) {
120
- value . deps . add ( previousResolving ) ;
121
- }
122
- }
123
- if ( ! hasValue ( value ) ) {
124
- return value ;
134
+ if ( hasDeps ( value ) && previousResolving ) {
135
+ value . deps . add ( previousResolving ) ;
125
136
}
126
- if ( isResolved ( value ) ) {
137
+ if (
138
+ // No value, only requested dependencies
139
+ ! hasValue ( value ) ||
140
+ // Resolved
141
+ isResolved ( value ) ||
142
+ // Resolving
143
+ hasDeps ( value )
144
+ ) {
127
145
return value ;
128
146
}
129
- const asserted = value as Resolved < T , R > ;
147
+ // Unresolved and no deps.
148
+ const asserted = value as InternalResolved < T , R > ;
130
149
this . resolving = id ;
131
150
asserted . deps = new IDSet ( ) ;
132
151
if ( previousResolving ) {
133
152
asserted . deps . add ( previousResolving ) ;
134
153
}
135
- asserted . resolved = this . resolver ( this , id , value . raw ) ;
154
+ asserted . resolved = this . resolver ( value . raw , id , this ) ;
136
155
this . resolving = previousResolving ;
137
156
return asserted ;
138
157
}
0 commit comments