@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.
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/changes.json +18 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/redux-toolkit.development.cjs +2406 -0
- package/dist/cjs/redux-toolkit.development.cjs.map +1 -0
- package/dist/cjs/redux-toolkit.production.min.cjs +3 -0
- package/dist/cjs/redux-toolkit.production.min.cjs.map +1 -0
- package/dist/index.d.mts +2665 -0
- package/dist/index.d.ts +2665 -0
- package/dist/query/cjs/index.js +6 -0
- package/dist/query/cjs/rtk-query.development.cjs +3092 -0
- package/dist/query/cjs/rtk-query.development.cjs.map +1 -0
- package/dist/query/cjs/rtk-query.production.min.cjs +2 -0
- package/dist/query/cjs/rtk-query.production.min.cjs.map +1 -0
- package/dist/query/index.d.mts +3066 -0
- package/dist/query/index.d.ts +3066 -0
- package/dist/query/react/cjs/index.js +6 -0
- package/dist/query/react/cjs/rtk-query-react.development.cjs +748 -0
- package/dist/query/react/cjs/rtk-query-react.development.cjs.map +1 -0
- package/dist/query/react/cjs/rtk-query-react.production.min.cjs +2 -0
- package/dist/query/react/cjs/rtk-query-react.production.min.cjs.map +1 -0
- package/dist/query/react/index.d.mts +1009 -0
- package/dist/query/react/index.d.ts +1009 -0
- package/dist/query/react/rtk-query-react.browser.mjs +2 -0
- package/dist/query/react/rtk-query-react.browser.mjs.map +1 -0
- package/dist/query/react/rtk-query-react.legacy-esm.js +740 -0
- package/dist/query/react/rtk-query-react.legacy-esm.js.map +1 -0
- package/dist/query/react/rtk-query-react.modern.mjs +705 -0
- package/dist/query/react/rtk-query-react.modern.mjs.map +1 -0
- package/dist/query/rtk-query.browser.mjs +2 -0
- package/dist/query/rtk-query.browser.mjs.map +1 -0
- package/dist/query/rtk-query.legacy-esm.js +3117 -0
- package/dist/query/rtk-query.legacy-esm.js.map +1 -0
- package/dist/query/rtk-query.modern.mjs +3052 -0
- package/dist/query/rtk-query.modern.mjs.map +1 -0
- package/dist/react/cjs/index.js +6 -0
- package/dist/react/cjs/redux-toolkit-react.development.cjs +55 -0
- package/dist/react/cjs/redux-toolkit-react.development.cjs.map +1 -0
- package/dist/react/cjs/redux-toolkit-react.production.min.cjs +2 -0
- package/dist/react/cjs/redux-toolkit-react.production.min.cjs.map +1 -0
- package/dist/react/index.d.mts +22 -0
- package/dist/react/index.d.ts +22 -0
- package/dist/react/redux-toolkit-react.browser.mjs +2 -0
- package/dist/react/redux-toolkit-react.browser.mjs.map +1 -0
- package/dist/react/redux-toolkit-react.legacy-esm.js +47 -0
- package/dist/react/redux-toolkit-react.legacy-esm.js.map +1 -0
- package/dist/react/redux-toolkit-react.modern.mjs +28 -0
- package/dist/react/redux-toolkit-react.modern.mjs.map +1 -0
- package/dist/redux-toolkit.browser.mjs +3 -0
- package/dist/redux-toolkit.browser.mjs.map +1 -0
- package/dist/redux-toolkit.legacy-esm.js +2351 -0
- package/dist/redux-toolkit.legacy-esm.js.map +1 -0
- package/dist/redux-toolkit.modern.mjs +2330 -0
- package/dist/redux-toolkit.modern.mjs.map +1 -0
- package/dist/uncheckedindexed.ts +16 -0
- package/package.json +310 -0
- package/query/package.json +13 -0
- package/query/react/package.json +13 -0
- package/react/package.json +13 -0
- package/skills/build-modern-redux-apps/modern-redux/SKILL.md +304 -0
- package/skills/build-modern-redux-apps/modern-redux/references/store-lifetime.md +53 -0
- package/skills/build-modern-redux-apps/redux-dataflow/SKILL.md +264 -0
- package/skills/evolve-and-diagnose-redux-apps/debug-redux-toolkit-apps/SKILL.md +269 -0
- package/skills/evolve-and-diagnose-redux-apps/migrate-to-modern-redux/SKILL.md +226 -0
- package/skills/manage-server-data/adopt-rtk-query/SKILL.md +385 -0
- package/skills/manage-server-data/adopt-rtk-query/references/endpoint-lifecycle.md +36 -0
- package/skills/model-redux-state/build-slices-and-selectors/SKILL.md +364 -0
- package/skills/model-redux-state/build-slices-and-selectors/references/slice-patterns.md +59 -0
- package/skills/model-redux-state/design-state-ownership/SKILL.md +322 -0
- package/skills/model-redux-state/design-state-ownership/references/state-ownership.md +28 -0
- package/skills/orchestrate-side-effects/handle-side-effects/SKILL.md +271 -0
- package/skills/orchestrate-side-effects/handle-side-effects/references/listener-workflows.md +34 -0
- package/src/actionCreatorInvariantMiddleware.ts +34 -0
- package/src/autoBatchEnhancer.ts +146 -0
- package/src/combineSlices.ts +487 -0
- package/src/configureStore.ts +248 -0
- package/src/createAction.ts +324 -0
- package/src/createAsyncThunk.ts +791 -0
- package/src/createDraftSafeSelector.ts +30 -0
- package/src/createReducer.ts +217 -0
- package/src/createSlice.ts +1079 -0
- package/src/devtoolsExtension.ts +241 -0
- package/src/dynamicMiddleware/index.ts +93 -0
- package/src/dynamicMiddleware/react/index.ts +101 -0
- package/src/dynamicMiddleware/types.ts +82 -0
- package/src/entities/create_adapter.ts +47 -0
- package/src/entities/entity_state.ts +38 -0
- package/src/entities/index.ts +8 -0
- package/src/entities/models.ts +198 -0
- package/src/entities/sorted_state_adapter.ts +266 -0
- package/src/entities/state_adapter.ts +58 -0
- package/src/entities/state_selectors.ts +73 -0
- package/src/entities/unsorted_state_adapter.ts +204 -0
- package/src/entities/utils.ts +68 -0
- package/src/formatProdErrorMessage.ts +13 -0
- package/src/getDefaultEnhancers.ts +31 -0
- package/src/getDefaultMiddleware.ts +113 -0
- package/src/immerImports.ts +7 -0
- package/src/immutableStateInvariantMiddleware.ts +274 -0
- package/src/index.ts +213 -0
- package/src/listenerMiddleware/exceptions.ts +20 -0
- package/src/listenerMiddleware/index.ts +562 -0
- package/src/listenerMiddleware/task.ts +100 -0
- package/src/listenerMiddleware/types.ts +886 -0
- package/src/listenerMiddleware/utils.ts +30 -0
- package/src/mapBuilders.ts +298 -0
- package/src/matchers.ts +365 -0
- package/src/nanoid.ts +20 -0
- package/src/query/HandledError.ts +6 -0
- package/src/query/apiTypes.ts +120 -0
- package/src/query/baseQueryTypes.ts +101 -0
- package/src/query/core/apiState.ts +377 -0
- package/src/query/core/buildInitiate.ts +596 -0
- package/src/query/core/buildMiddleware/batchActions.ts +207 -0
- package/src/query/core/buildMiddleware/cacheCollection.ts +204 -0
- package/src/query/core/buildMiddleware/cacheLifecycle.ts +379 -0
- package/src/query/core/buildMiddleware/devMiddleware.ts +34 -0
- package/src/query/core/buildMiddleware/index.ts +162 -0
- package/src/query/core/buildMiddleware/invalidationByTags.ts +139 -0
- package/src/query/core/buildMiddleware/polling.ts +187 -0
- package/src/query/core/buildMiddleware/queryLifecycle.ts +508 -0
- package/src/query/core/buildMiddleware/types.ts +173 -0
- package/src/query/core/buildMiddleware/windowEventHandling.ts +64 -0
- package/src/query/core/buildSelectors.ts +413 -0
- package/src/query/core/buildSlice.ts +735 -0
- package/src/query/core/buildThunks.ts +1124 -0
- package/src/query/core/index.ts +58 -0
- package/src/query/core/module.ts +727 -0
- package/src/query/core/rtkImports.ts +24 -0
- package/src/query/core/setupListeners.ts +118 -0
- package/src/query/createApi.ts +506 -0
- package/src/query/defaultSerializeQueryArgs.ts +52 -0
- package/src/query/endpointDefinitions.ts +1717 -0
- package/src/query/fakeBaseQuery.ts +21 -0
- package/src/query/fetchBaseQuery.ts +385 -0
- package/src/query/index.ts +105 -0
- package/src/query/react/ApiProvider.tsx +69 -0
- package/src/query/react/buildHooks.ts +2297 -0
- package/src/query/react/constants.ts +2 -0
- package/src/query/react/index.ts +45 -0
- package/src/query/react/module.ts +275 -0
- package/src/query/react/namedHooks.ts +59 -0
- package/src/query/react/reactImports.ts +10 -0
- package/src/query/react/reactReduxImports.ts +1 -0
- package/src/query/react/rtkqImports.ts +8 -0
- package/src/query/react/useSerializedStableValue.ts +17 -0
- package/src/query/react/useShallowStableValue.ts +13 -0
- package/src/query/retry.ts +233 -0
- package/src/query/standardSchema.ts +35 -0
- package/src/query/tsHelpers.ts +48 -0
- package/src/query/utils/capitalize.ts +3 -0
- package/src/query/utils/copyWithStructuralSharing.ts +27 -0
- package/src/query/utils/countObjectKeys.ts +14 -0
- package/src/query/utils/filterMap.ts +27 -0
- package/src/query/utils/getCurrent.ts +6 -0
- package/src/query/utils/getOrInsert.ts +41 -0
- package/src/query/utils/immerImports.ts +9 -0
- package/src/query/utils/index.ts +11 -0
- package/src/query/utils/isAbsoluteUrl.ts +9 -0
- package/src/query/utils/isDocumentVisible.ts +12 -0
- package/src/query/utils/isNotNullish.ts +7 -0
- package/src/query/utils/isOnline.ts +12 -0
- package/src/query/utils/isValidUrl.ts +9 -0
- package/src/query/utils/joinUrls.ts +26 -0
- package/src/query/utils/signals.ts +33 -0
- package/src/react/index.ts +7 -0
- package/src/reduxImports.ts +8 -0
- package/src/reselectImports.ts +1 -0
- package/src/serializableStateInvariantMiddleware.ts +285 -0
- package/src/tsHelpers.ts +214 -0
- package/src/uncheckedindexed.ts +16 -0
- package/src/utils.ts +125 -0
package/src/tsHelpers.ts
ADDED
|
@@ -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
|
+
}
|