@depup/reduxjs__toolkit 2.12.0-depup.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/changes.json +18 -0
  4. package/dist/cjs/index.js +6 -0
  5. package/dist/cjs/redux-toolkit.development.cjs +2406 -0
  6. package/dist/cjs/redux-toolkit.development.cjs.map +1 -0
  7. package/dist/cjs/redux-toolkit.production.min.cjs +3 -0
  8. package/dist/cjs/redux-toolkit.production.min.cjs.map +1 -0
  9. package/dist/index.d.mts +2665 -0
  10. package/dist/index.d.ts +2665 -0
  11. package/dist/query/cjs/index.js +6 -0
  12. package/dist/query/cjs/rtk-query.development.cjs +3092 -0
  13. package/dist/query/cjs/rtk-query.development.cjs.map +1 -0
  14. package/dist/query/cjs/rtk-query.production.min.cjs +2 -0
  15. package/dist/query/cjs/rtk-query.production.min.cjs.map +1 -0
  16. package/dist/query/index.d.mts +3066 -0
  17. package/dist/query/index.d.ts +3066 -0
  18. package/dist/query/react/cjs/index.js +6 -0
  19. package/dist/query/react/cjs/rtk-query-react.development.cjs +748 -0
  20. package/dist/query/react/cjs/rtk-query-react.development.cjs.map +1 -0
  21. package/dist/query/react/cjs/rtk-query-react.production.min.cjs +2 -0
  22. package/dist/query/react/cjs/rtk-query-react.production.min.cjs.map +1 -0
  23. package/dist/query/react/index.d.mts +1009 -0
  24. package/dist/query/react/index.d.ts +1009 -0
  25. package/dist/query/react/rtk-query-react.browser.mjs +2 -0
  26. package/dist/query/react/rtk-query-react.browser.mjs.map +1 -0
  27. package/dist/query/react/rtk-query-react.legacy-esm.js +740 -0
  28. package/dist/query/react/rtk-query-react.legacy-esm.js.map +1 -0
  29. package/dist/query/react/rtk-query-react.modern.mjs +705 -0
  30. package/dist/query/react/rtk-query-react.modern.mjs.map +1 -0
  31. package/dist/query/rtk-query.browser.mjs +2 -0
  32. package/dist/query/rtk-query.browser.mjs.map +1 -0
  33. package/dist/query/rtk-query.legacy-esm.js +3117 -0
  34. package/dist/query/rtk-query.legacy-esm.js.map +1 -0
  35. package/dist/query/rtk-query.modern.mjs +3052 -0
  36. package/dist/query/rtk-query.modern.mjs.map +1 -0
  37. package/dist/react/cjs/index.js +6 -0
  38. package/dist/react/cjs/redux-toolkit-react.development.cjs +55 -0
  39. package/dist/react/cjs/redux-toolkit-react.development.cjs.map +1 -0
  40. package/dist/react/cjs/redux-toolkit-react.production.min.cjs +2 -0
  41. package/dist/react/cjs/redux-toolkit-react.production.min.cjs.map +1 -0
  42. package/dist/react/index.d.mts +22 -0
  43. package/dist/react/index.d.ts +22 -0
  44. package/dist/react/redux-toolkit-react.browser.mjs +2 -0
  45. package/dist/react/redux-toolkit-react.browser.mjs.map +1 -0
  46. package/dist/react/redux-toolkit-react.legacy-esm.js +47 -0
  47. package/dist/react/redux-toolkit-react.legacy-esm.js.map +1 -0
  48. package/dist/react/redux-toolkit-react.modern.mjs +28 -0
  49. package/dist/react/redux-toolkit-react.modern.mjs.map +1 -0
  50. package/dist/redux-toolkit.browser.mjs +3 -0
  51. package/dist/redux-toolkit.browser.mjs.map +1 -0
  52. package/dist/redux-toolkit.legacy-esm.js +2351 -0
  53. package/dist/redux-toolkit.legacy-esm.js.map +1 -0
  54. package/dist/redux-toolkit.modern.mjs +2330 -0
  55. package/dist/redux-toolkit.modern.mjs.map +1 -0
  56. package/dist/uncheckedindexed.ts +16 -0
  57. package/package.json +310 -0
  58. package/query/package.json +13 -0
  59. package/query/react/package.json +13 -0
  60. package/react/package.json +13 -0
  61. package/skills/build-modern-redux-apps/modern-redux/SKILL.md +304 -0
  62. package/skills/build-modern-redux-apps/modern-redux/references/store-lifetime.md +53 -0
  63. package/skills/build-modern-redux-apps/redux-dataflow/SKILL.md +264 -0
  64. package/skills/evolve-and-diagnose-redux-apps/debug-redux-toolkit-apps/SKILL.md +269 -0
  65. package/skills/evolve-and-diagnose-redux-apps/migrate-to-modern-redux/SKILL.md +226 -0
  66. package/skills/manage-server-data/adopt-rtk-query/SKILL.md +385 -0
  67. package/skills/manage-server-data/adopt-rtk-query/references/endpoint-lifecycle.md +36 -0
  68. package/skills/model-redux-state/build-slices-and-selectors/SKILL.md +364 -0
  69. package/skills/model-redux-state/build-slices-and-selectors/references/slice-patterns.md +59 -0
  70. package/skills/model-redux-state/design-state-ownership/SKILL.md +322 -0
  71. package/skills/model-redux-state/design-state-ownership/references/state-ownership.md +28 -0
  72. package/skills/orchestrate-side-effects/handle-side-effects/SKILL.md +271 -0
  73. package/skills/orchestrate-side-effects/handle-side-effects/references/listener-workflows.md +34 -0
  74. package/src/actionCreatorInvariantMiddleware.ts +34 -0
  75. package/src/autoBatchEnhancer.ts +146 -0
  76. package/src/combineSlices.ts +487 -0
  77. package/src/configureStore.ts +248 -0
  78. package/src/createAction.ts +324 -0
  79. package/src/createAsyncThunk.ts +791 -0
  80. package/src/createDraftSafeSelector.ts +30 -0
  81. package/src/createReducer.ts +217 -0
  82. package/src/createSlice.ts +1079 -0
  83. package/src/devtoolsExtension.ts +241 -0
  84. package/src/dynamicMiddleware/index.ts +93 -0
  85. package/src/dynamicMiddleware/react/index.ts +101 -0
  86. package/src/dynamicMiddleware/types.ts +82 -0
  87. package/src/entities/create_adapter.ts +47 -0
  88. package/src/entities/entity_state.ts +38 -0
  89. package/src/entities/index.ts +8 -0
  90. package/src/entities/models.ts +198 -0
  91. package/src/entities/sorted_state_adapter.ts +266 -0
  92. package/src/entities/state_adapter.ts +58 -0
  93. package/src/entities/state_selectors.ts +73 -0
  94. package/src/entities/unsorted_state_adapter.ts +204 -0
  95. package/src/entities/utils.ts +68 -0
  96. package/src/formatProdErrorMessage.ts +13 -0
  97. package/src/getDefaultEnhancers.ts +31 -0
  98. package/src/getDefaultMiddleware.ts +113 -0
  99. package/src/immerImports.ts +7 -0
  100. package/src/immutableStateInvariantMiddleware.ts +274 -0
  101. package/src/index.ts +213 -0
  102. package/src/listenerMiddleware/exceptions.ts +20 -0
  103. package/src/listenerMiddleware/index.ts +562 -0
  104. package/src/listenerMiddleware/task.ts +100 -0
  105. package/src/listenerMiddleware/types.ts +886 -0
  106. package/src/listenerMiddleware/utils.ts +30 -0
  107. package/src/mapBuilders.ts +298 -0
  108. package/src/matchers.ts +365 -0
  109. package/src/nanoid.ts +20 -0
  110. package/src/query/HandledError.ts +6 -0
  111. package/src/query/apiTypes.ts +120 -0
  112. package/src/query/baseQueryTypes.ts +101 -0
  113. package/src/query/core/apiState.ts +377 -0
  114. package/src/query/core/buildInitiate.ts +596 -0
  115. package/src/query/core/buildMiddleware/batchActions.ts +207 -0
  116. package/src/query/core/buildMiddleware/cacheCollection.ts +204 -0
  117. package/src/query/core/buildMiddleware/cacheLifecycle.ts +379 -0
  118. package/src/query/core/buildMiddleware/devMiddleware.ts +34 -0
  119. package/src/query/core/buildMiddleware/index.ts +162 -0
  120. package/src/query/core/buildMiddleware/invalidationByTags.ts +139 -0
  121. package/src/query/core/buildMiddleware/polling.ts +187 -0
  122. package/src/query/core/buildMiddleware/queryLifecycle.ts +508 -0
  123. package/src/query/core/buildMiddleware/types.ts +173 -0
  124. package/src/query/core/buildMiddleware/windowEventHandling.ts +64 -0
  125. package/src/query/core/buildSelectors.ts +413 -0
  126. package/src/query/core/buildSlice.ts +735 -0
  127. package/src/query/core/buildThunks.ts +1124 -0
  128. package/src/query/core/index.ts +58 -0
  129. package/src/query/core/module.ts +727 -0
  130. package/src/query/core/rtkImports.ts +24 -0
  131. package/src/query/core/setupListeners.ts +118 -0
  132. package/src/query/createApi.ts +506 -0
  133. package/src/query/defaultSerializeQueryArgs.ts +52 -0
  134. package/src/query/endpointDefinitions.ts +1717 -0
  135. package/src/query/fakeBaseQuery.ts +21 -0
  136. package/src/query/fetchBaseQuery.ts +385 -0
  137. package/src/query/index.ts +105 -0
  138. package/src/query/react/ApiProvider.tsx +69 -0
  139. package/src/query/react/buildHooks.ts +2297 -0
  140. package/src/query/react/constants.ts +2 -0
  141. package/src/query/react/index.ts +45 -0
  142. package/src/query/react/module.ts +275 -0
  143. package/src/query/react/namedHooks.ts +59 -0
  144. package/src/query/react/reactImports.ts +10 -0
  145. package/src/query/react/reactReduxImports.ts +1 -0
  146. package/src/query/react/rtkqImports.ts +8 -0
  147. package/src/query/react/useSerializedStableValue.ts +17 -0
  148. package/src/query/react/useShallowStableValue.ts +13 -0
  149. package/src/query/retry.ts +233 -0
  150. package/src/query/standardSchema.ts +35 -0
  151. package/src/query/tsHelpers.ts +48 -0
  152. package/src/query/utils/capitalize.ts +3 -0
  153. package/src/query/utils/copyWithStructuralSharing.ts +27 -0
  154. package/src/query/utils/countObjectKeys.ts +14 -0
  155. package/src/query/utils/filterMap.ts +27 -0
  156. package/src/query/utils/getCurrent.ts +6 -0
  157. package/src/query/utils/getOrInsert.ts +41 -0
  158. package/src/query/utils/immerImports.ts +9 -0
  159. package/src/query/utils/index.ts +11 -0
  160. package/src/query/utils/isAbsoluteUrl.ts +9 -0
  161. package/src/query/utils/isDocumentVisible.ts +12 -0
  162. package/src/query/utils/isNotNullish.ts +7 -0
  163. package/src/query/utils/isOnline.ts +12 -0
  164. package/src/query/utils/isValidUrl.ts +9 -0
  165. package/src/query/utils/joinUrls.ts +26 -0
  166. package/src/query/utils/signals.ts +33 -0
  167. package/src/react/index.ts +7 -0
  168. package/src/reduxImports.ts +8 -0
  169. package/src/reselectImports.ts +1 -0
  170. package/src/serializableStateInvariantMiddleware.ts +285 -0
  171. package/src/tsHelpers.ts +214 -0
  172. package/src/uncheckedindexed.ts +16 -0
  173. package/src/utils.ts +125 -0
@@ -0,0 +1,214 @@
1
+ import type { Middleware, StoreEnhancer } from 'redux'
2
+ import type { Tuple } from './utils'
3
+
4
+ export function safeAssign<T extends object>(
5
+ target: T,
6
+ ...args: Array<Partial<NoInfer<T>>>
7
+ ) {
8
+ Object.assign(target, ...args)
9
+ }
10
+
11
+ /**
12
+ * return True if T is `any`, otherwise return False
13
+ * taken from https://github.com/joonhocho/tsdef
14
+ *
15
+ * @internal
16
+ */
17
+ export type IsAny<T, True, False = never> =
18
+ // test if we are going the left AND right path in the condition
19
+ true | false extends (T extends never ? true : false) ? True : False
20
+
21
+ export type CastAny<T, CastTo> = IsAny<T, CastTo, T>
22
+
23
+ /**
24
+ * return True if T is `unknown`, otherwise return False
25
+ * taken from https://github.com/joonhocho/tsdef
26
+ *
27
+ * @internal
28
+ */
29
+ export type IsUnknown<T, True, False = never> = unknown extends T
30
+ ? IsAny<T, False, True>
31
+ : False
32
+
33
+ export type FallbackIfUnknown<T, Fallback> = IsUnknown<T, Fallback, T>
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ export type IfMaybeUndefined<P, True, False> = [undefined] extends [P]
39
+ ? True
40
+ : False
41
+
42
+ /**
43
+ * @internal
44
+ */
45
+ export type IfVoid<P, True, False> = [void] extends [P] ? True : False
46
+
47
+ /**
48
+ * @internal
49
+ */
50
+ export type IsEmptyObj<T, True, False = never> = T extends any
51
+ ? keyof T extends never
52
+ ? IsUnknown<T, False, IfMaybeUndefined<T, False, IfVoid<T, False, True>>>
53
+ : False
54
+ : never
55
+
56
+ /**
57
+ * returns True if TS version is above 3.5, False if below.
58
+ * uses feature detection to detect TS version >= 3.5
59
+ * * versions below 3.5 will return `{}` for unresolvable interference
60
+ * * versions above will return `unknown`
61
+ *
62
+ * @internal
63
+ */
64
+ export type AtLeastTS35<True, False> = [True, False][IsUnknown<
65
+ ReturnType<<T>() => T>,
66
+ 0,
67
+ 1
68
+ >]
69
+
70
+ /**
71
+ * @internal
72
+ */
73
+ export type IsUnknownOrNonInferrable<T, True, False> = AtLeastTS35<
74
+ IsUnknown<T, True, False>,
75
+ IsEmptyObj<T, True, IsUnknown<T, True, False>>
76
+ >
77
+
78
+ /**
79
+ * Convert a Union type `(A|B)` to an intersection type `(A&B)`
80
+ */
81
+ export type UnionToIntersection<U> = (
82
+ U extends any ? (k: U) => void : never
83
+ ) extends (k: infer I) => void
84
+ ? I
85
+ : never
86
+
87
+ // Appears to have a convenient side effect of ignoring `never` even if that's not what you specified
88
+ export type ExcludeFromTuple<T, E, Acc extends unknown[] = []> = T extends [
89
+ infer Head,
90
+ ...infer Tail,
91
+ ]
92
+ ? ExcludeFromTuple<Tail, E, [...Acc, ...([Head] extends [E] ? [] : [Head])]>
93
+ : Acc
94
+
95
+ type ExtractDispatchFromMiddlewareTuple<
96
+ MiddlewareTuple extends readonly any[],
97
+ Acc extends {},
98
+ > = MiddlewareTuple extends [infer Head, ...infer Tail]
99
+ ? ExtractDispatchFromMiddlewareTuple<
100
+ Tail,
101
+ Acc & (Head extends Middleware<infer D> ? IsAny<D, {}, D> : {})
102
+ >
103
+ : Acc
104
+
105
+ export type ExtractDispatchExtensions<M> =
106
+ M extends Tuple<infer MiddlewareTuple>
107
+ ? ExtractDispatchFromMiddlewareTuple<MiddlewareTuple, {}>
108
+ : M extends ReadonlyArray<Middleware>
109
+ ? ExtractDispatchFromMiddlewareTuple<[...M], {}>
110
+ : never
111
+
112
+ type ExtractStoreExtensionsFromEnhancerTuple<
113
+ EnhancerTuple extends readonly any[],
114
+ Acc extends {},
115
+ > = EnhancerTuple extends [infer Head, ...infer Tail]
116
+ ? ExtractStoreExtensionsFromEnhancerTuple<
117
+ Tail,
118
+ Acc & (Head extends StoreEnhancer<infer Ext> ? IsAny<Ext, {}, Ext> : {})
119
+ >
120
+ : Acc
121
+
122
+ export type ExtractStoreExtensions<E> =
123
+ E extends Tuple<infer EnhancerTuple>
124
+ ? ExtractStoreExtensionsFromEnhancerTuple<EnhancerTuple, {}>
125
+ : E extends ReadonlyArray<StoreEnhancer>
126
+ ? UnionToIntersection<
127
+ E[number] extends StoreEnhancer<infer Ext>
128
+ ? Ext extends {}
129
+ ? IsAny<Ext, {}, Ext>
130
+ : {}
131
+ : {}
132
+ >
133
+ : never
134
+
135
+ type ExtractStateExtensionsFromEnhancerTuple<
136
+ EnhancerTuple extends readonly any[],
137
+ Acc extends {},
138
+ > = EnhancerTuple extends [infer Head, ...infer Tail]
139
+ ? ExtractStateExtensionsFromEnhancerTuple<
140
+ Tail,
141
+ Acc &
142
+ (Head extends StoreEnhancer<any, infer StateExt>
143
+ ? IsAny<StateExt, {}, StateExt>
144
+ : {})
145
+ >
146
+ : Acc
147
+
148
+ export type ExtractStateExtensions<E> =
149
+ E extends Tuple<infer EnhancerTuple>
150
+ ? ExtractStateExtensionsFromEnhancerTuple<EnhancerTuple, {}>
151
+ : E extends ReadonlyArray<StoreEnhancer>
152
+ ? UnionToIntersection<
153
+ E[number] extends StoreEnhancer<any, infer StateExt>
154
+ ? StateExt extends {}
155
+ ? IsAny<StateExt, {}, StateExt>
156
+ : {}
157
+ : {}
158
+ >
159
+ : never
160
+
161
+ export type NonUndefined<T> = T extends undefined ? never : T
162
+
163
+ export type WithRequiredProp<T, K extends keyof T> = Omit<T, K> &
164
+ Required<Pick<T, K>>
165
+
166
+ export type WithOptionalProp<T, K extends keyof T> = Omit<T, K> &
167
+ Partial<Pick<T, K>>
168
+
169
+ export interface TypeGuard<T> {
170
+ (value: any): value is T
171
+ }
172
+
173
+ export interface HasMatchFunction<T> {
174
+ match: TypeGuard<T>
175
+ }
176
+
177
+ export const hasMatchFunction = <T>(
178
+ v: Matcher<T>,
179
+ ): v is HasMatchFunction<T> => {
180
+ return v && typeof (v as HasMatchFunction<T>).match === 'function'
181
+ }
182
+
183
+ /** @public */
184
+ export type Matcher<T> = HasMatchFunction<T> | TypeGuard<T>
185
+
186
+ /** @public */
187
+ export type ActionFromMatcher<M extends Matcher<any>> =
188
+ M extends Matcher<infer T> ? T : never
189
+
190
+ export type Id<T> = { [K in keyof T]: T[K] } & {}
191
+
192
+ export type Tail<T extends any[]> = T extends [any, ...infer Tail]
193
+ ? Tail
194
+ : never
195
+
196
+ export type UnknownIfNonSpecific<T> = {} extends T ? unknown : T
197
+
198
+ /**
199
+ * A Promise that will never reject.
200
+ * @see https://github.com/reduxjs/redux-toolkit/issues/4101
201
+ */
202
+ export type SafePromise<T> = Promise<T> & {
203
+ __linterBrands: 'SafePromise'
204
+ }
205
+
206
+ /**
207
+ * Properly wraps a Promise as a {@link SafePromise} with .catch(fallback).
208
+ */
209
+ export function asSafePromise<Resolved, Rejected>(
210
+ promise: Promise<Resolved>,
211
+ fallback: (error: unknown) => Rejected,
212
+ ) {
213
+ return promise.catch(fallback) as SafePromise<Resolved | Rejected>
214
+ }
@@ -0,0 +1,16 @@
1
+ // inlined from https://github.com/EskiMojo14/uncheckedindexed
2
+ // relies on remaining as a TS file, not .d.ts
3
+ type IfMaybeUndefined<T, True, False> = [undefined] extends [T] ? True : False
4
+
5
+ const testAccess = ({} as Record<string, 0>)['a']
6
+
7
+ export type IfUncheckedIndexedAccess<True, False> = IfMaybeUndefined<
8
+ typeof testAccess,
9
+ True,
10
+ False
11
+ >
12
+
13
+ export type UncheckedIndexedAccess<T> = IfUncheckedIndexedAccess<
14
+ T | undefined,
15
+ T
16
+ >
package/src/utils.ts ADDED
@@ -0,0 +1,125 @@
1
+ import { createNextState, isDraftable } from './immerImports'
2
+
3
+ export function getTimeMeasureUtils(maxDelay: number, fnName: string) {
4
+ let elapsed = 0
5
+ return {
6
+ measureTime<T>(fn: () => T): T {
7
+ const started = Date.now()
8
+ try {
9
+ return fn()
10
+ } finally {
11
+ const finished = Date.now()
12
+ elapsed += finished - started
13
+ }
14
+ },
15
+ warnIfExceeded() {
16
+ if (elapsed > maxDelay) {
17
+ console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms.
18
+ If your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.
19
+ It is disabled in production builds, so you don't need to worry about that.`)
20
+ }
21
+ },
22
+ }
23
+ }
24
+
25
+ export function delay(ms: number) {
26
+ return new Promise((resolve) => setTimeout(resolve, ms))
27
+ }
28
+
29
+ export class Tuple<Items extends ReadonlyArray<unknown> = []> extends Array<
30
+ Items[number]
31
+ > {
32
+ constructor(length: number)
33
+ constructor(...items: Items)
34
+ constructor(...items: any[]) {
35
+ super(...items)
36
+ Object.setPrototypeOf(this, Tuple.prototype)
37
+ }
38
+
39
+ static override get [Symbol.species]() {
40
+ return Tuple as any
41
+ }
42
+
43
+ override concat<AdditionalItems extends ReadonlyArray<unknown>>(
44
+ items: Tuple<AdditionalItems>,
45
+ ): Tuple<[...Items, ...AdditionalItems]>
46
+ override concat<AdditionalItems extends ReadonlyArray<unknown>>(
47
+ items: AdditionalItems,
48
+ ): Tuple<[...Items, ...AdditionalItems]>
49
+ override concat<AdditionalItems extends ReadonlyArray<unknown>>(
50
+ ...items: AdditionalItems
51
+ ): Tuple<[...Items, ...AdditionalItems]>
52
+ override concat(...arr: any[]) {
53
+ return super.concat.apply(this, arr)
54
+ }
55
+
56
+ prepend<AdditionalItems extends ReadonlyArray<unknown>>(
57
+ items: Tuple<AdditionalItems>,
58
+ ): Tuple<[...AdditionalItems, ...Items]>
59
+ prepend<AdditionalItems extends ReadonlyArray<unknown>>(
60
+ items: AdditionalItems,
61
+ ): Tuple<[...AdditionalItems, ...Items]>
62
+ prepend<AdditionalItems extends ReadonlyArray<unknown>>(
63
+ ...items: AdditionalItems
64
+ ): Tuple<[...AdditionalItems, ...Items]>
65
+ prepend(...arr: any[]) {
66
+ if (arr.length === 1 && Array.isArray(arr[0])) {
67
+ return new Tuple(...arr[0].concat(this))
68
+ }
69
+ return new Tuple(...arr.concat(this))
70
+ }
71
+ }
72
+
73
+ export function freezeDraftable<T>(val: T) {
74
+ return isDraftable(val) ? createNextState(val, () => {}) : val
75
+ }
76
+
77
+ export function getOrInsert<K extends object, V>(
78
+ map: WeakMap<K, V>,
79
+ key: K,
80
+ value: V,
81
+ ): V
82
+ export function getOrInsert<K, V>(map: Map<K, V>, key: K, value: V): V
83
+ export function getOrInsert<K extends object, V>(
84
+ map: Map<K, V> | WeakMap<K, V>,
85
+ key: K,
86
+ value: V,
87
+ ): V {
88
+ if (map.has(key)) return map.get(key) as V
89
+
90
+ return map.set(key, value).get(key) as V
91
+ }
92
+
93
+ export function getOrInsertComputed<K extends object, V>(
94
+ map: WeakMap<K, V>,
95
+ key: K,
96
+ compute: (key: K) => V,
97
+ ): V
98
+ export function getOrInsertComputed<K, V>(
99
+ map: Map<K, V>,
100
+ key: K,
101
+ compute: (key: K) => V,
102
+ ): V
103
+ export function getOrInsertComputed<K extends object, V>(
104
+ map: Map<K, V> | WeakMap<K, V>,
105
+ key: K,
106
+ compute: (key: K) => V,
107
+ ): V {
108
+ if (map.has(key)) return map.get(key) as V
109
+
110
+ return map.set(key, compute(key)).get(key) as V
111
+ }
112
+
113
+ export function promiseWithResolvers<T>(): {
114
+ promise: Promise<T>
115
+ resolve: (value: T | PromiseLike<T>) => void
116
+ reject: (reason?: any) => void
117
+ } {
118
+ let resolve: any
119
+ let reject: any
120
+ const promise = new Promise<T>((res, rej) => {
121
+ resolve = res
122
+ reject = rej
123
+ })
124
+ return { promise, resolve, reject }
125
+ }