@@ -4,72 +4,72 @@ import type { ThunkDispatch } from 'redux-thunk'
4
4
import { createAction } from '../createAction'
5
5
import { nanoid } from '../nanoid'
6
6
7
+ import { find } from '../utils'
8
+ import {
9
+ TaskAbortError ,
10
+ listenerCancelled ,
11
+ listenerCompleted ,
12
+ taskCancelled ,
13
+ taskCompleted ,
14
+ } from './exceptions'
15
+ import {
16
+ createDelay ,
17
+ createPause ,
18
+ raceWithSignal ,
19
+ runTask ,
20
+ validateActive ,
21
+ } from './task'
7
22
import type {
8
- ListenerMiddleware ,
9
- ListenerMiddlewareInstance ,
23
+ AbortSignalWithReason ,
10
24
AddListenerOverloads ,
11
25
AnyListenerPredicate ,
12
26
CreateListenerMiddlewareOptions ,
13
- TypedAddListener ,
14
- TypedCreateListenerEntry ,
15
27
FallbackAddListenerOptions ,
28
+ ForkOptions ,
29
+ ForkedTask ,
30
+ ForkedTaskExecutor ,
16
31
ListenerEntry ,
17
32
ListenerErrorHandler ,
18
- UnsubscribeListener ,
19
- TakePattern ,
20
33
ListenerErrorInfo ,
21
- ForkedTaskExecutor ,
22
- ForkedTask ,
23
- TypedRemoveListener ,
34
+ ListenerMiddleware ,
35
+ ListenerMiddlewareInstance ,
36
+ TakePattern ,
24
37
TaskResult ,
25
- AbortSignalWithReason ,
38
+ TypedAddListener ,
39
+ TypedCreateListenerEntry ,
40
+ TypedRemoveListener ,
41
+ UnsubscribeListener ,
26
42
UnsubscribeListenerOptions ,
27
- ForkOptions ,
28
43
} from './types'
29
44
import {
30
45
abortControllerWithReason ,
31
46
addAbortSignalListener ,
32
47
assertFunction ,
33
48
catchRejection ,
34
49
} from './utils'
35
- import {
36
- listenerCancelled ,
37
- listenerCompleted ,
38
- TaskAbortError ,
39
- taskCancelled ,
40
- taskCompleted ,
41
- } from './exceptions'
42
- import {
43
- runTask ,
44
- validateActive ,
45
- createPause ,
46
- createDelay ,
47
- raceWithSignal ,
48
- } from './task'
49
- import { find } from '../utils'
50
50
export { TaskAbortError } from './exceptions'
51
51
export type {
52
- ListenerEffect ,
53
- ListenerMiddleware ,
54
- ListenerEffectAPI ,
55
- ListenerMiddlewareInstance ,
52
+ AsyncTaskExecutor ,
56
53
CreateListenerMiddlewareOptions ,
57
- ListenerErrorHandler ,
58
- TypedStartListening ,
59
- TypedAddListener ,
60
- TypedStopListening ,
61
- TypedRemoveListener ,
62
- UnsubscribeListener ,
63
- UnsubscribeListenerOptions ,
64
- ForkedTaskExecutor ,
65
54
ForkedTask ,
66
55
ForkedTaskAPI ,
67
- AsyncTaskExecutor ,
56
+ ForkedTaskExecutor ,
57
+ ListenerEffect ,
58
+ ListenerEffectAPI ,
59
+ ListenerErrorHandler ,
60
+ ListenerMiddleware ,
61
+ ListenerMiddlewareInstance ,
68
62
SyncTaskExecutor ,
69
63
TaskCancelled ,
70
64
TaskRejected ,
71
65
TaskResolved ,
72
66
TaskResult ,
67
+ TypedAddListener ,
68
+ TypedRemoveListener ,
69
+ TypedStartListening ,
70
+ TypedStopListening ,
71
+ UnsubscribeListener ,
72
+ UnsubscribeListenerOptions ,
73
73
} from './types'
74
74
75
75
//Overly-aggressive byte-shaving
@@ -215,25 +215,27 @@ const getListenerEntryPropsFrom = (options: FallbackAddListenerOptions) => {
215
215
}
216
216
217
217
/** Accepts the possible options for creating a listener, and returns a formatted listener entry */
218
- export const createListenerEntry : TypedCreateListenerEntry < unknown > = (
219
- options : FallbackAddListenerOptions
220
- ) => {
221
- const { type, predicate, effect } = getListenerEntryPropsFrom ( options )
222
-
223
- const id = nanoid ( )
224
- const entry : ListenerEntry < unknown > = {
225
- id,
226
- effect,
227
- type,
228
- predicate,
229
- pending : new Set < AbortController > ( ) ,
230
- unsubscribe : ( ) => {
231
- throw new Error ( 'Unsubscribe not initialized' )
232
- } ,
233
- }
218
+ export const createListenerEntry : TypedCreateListenerEntry < unknown > =
219
+ Object . assign (
220
+ ( options : FallbackAddListenerOptions ) => {
221
+ const { type, predicate, effect } = getListenerEntryPropsFrom ( options )
222
+
223
+ const id = nanoid ( )
224
+ const entry : ListenerEntry < unknown > = {
225
+ id,
226
+ effect,
227
+ type,
228
+ predicate,
229
+ pending : new Set < AbortController > ( ) ,
230
+ unsubscribe : ( ) => {
231
+ throw new Error ( 'Unsubscribe not initialized' )
232
+ } ,
233
+ }
234
234
235
- return entry
236
- }
235
+ return entry
236
+ } ,
237
+ { withTypes : ( ) => createListenerEntry }
238
+ ) as unknown as TypedCreateListenerEntry < unknown >
237
239
238
240
const cancelActiveListeners = (
239
241
entry : ListenerEntry < unknown , Dispatch < UnknownAction > >
@@ -302,11 +304,17 @@ const defaultErrorHandler: ListenerErrorHandler = (...args: unknown[]) => {
302
304
/**
303
305
* @public
304
306
*/
305
- export function createListenerMiddleware <
306
- S = unknown ,
307
- D extends Dispatch < Action > = ThunkDispatch < S , unknown , UnknownAction > ,
307
+ export const createListenerMiddleware = <
308
+ StateType = unknown ,
309
+ DispatchType extends Dispatch < Action > = ThunkDispatch <
310
+ StateType ,
311
+ unknown ,
312
+ UnknownAction
313
+ > ,
308
314
ExtraArgument = unknown
309
- > ( middlewareOptions : CreateListenerMiddlewareOptions < ExtraArgument > = { } ) {
315
+ > (
316
+ middlewareOptions : CreateListenerMiddlewareOptions < ExtraArgument > = { }
317
+ ) => {
310
318
const listenerMap = new Map < string , ListenerEntry > ( )
311
319
const { extra, onError = defaultErrorHandler } = middlewareOptions
312
320
@@ -324,7 +332,7 @@ export function createListenerMiddleware<
324
332
}
325
333
}
326
334
327
- const startListening = ( options : FallbackAddListenerOptions ) => {
335
+ const startListening = ( ( options : FallbackAddListenerOptions ) => {
328
336
let entry = find (
329
337
Array . from ( listenerMap . values ( ) ) ,
330
338
( existingEntry ) => existingEntry . effect === options . effect
@@ -335,7 +343,11 @@ export function createListenerMiddleware<
335
343
}
336
344
337
345
return insertEntry ( entry )
338
- }
346
+ } ) as AddListenerOverloads < any >
347
+
348
+ Object . assign ( startListening , {
349
+ withTypes : ( ) => startListening ,
350
+ } )
339
351
340
352
const stopListening = (
341
353
options : FallbackAddListenerOptions & UnsubscribeListenerOptions
@@ -365,11 +377,11 @@ export function createListenerMiddleware<
365
377
entry : ListenerEntry < unknown , Dispatch < UnknownAction > > ,
366
378
action : unknown ,
367
379
api : MiddlewareAPI ,
368
- getOriginalState : ( ) => S
380
+ getOriginalState : ( ) => StateType
369
381
) => {
370
382
const internalTaskController = new AbortController ( )
371
383
const take = createTakePattern (
372
- startListening ,
384
+ startListening as AddListenerOverloads < any > ,
373
385
internalTaskController . signal
374
386
)
375
387
const autoJoinPromises : Promise < any > [ ] = [ ]
@@ -433,15 +445,15 @@ export function createListenerMiddleware<
433
445
434
446
const clearListenerMiddleware = createClearListenerMiddleware ( listenerMap )
435
447
436
- const middleware : ListenerMiddleware < S , D , ExtraArgument > =
448
+ const middleware : ListenerMiddleware < StateType , DispatchType , ExtraArgument > =
437
449
( api ) => ( next ) => ( action ) => {
438
450
if ( ! isAction ( action ) ) {
439
451
// we only want to notify listeners for action objects
440
452
return next ( action )
441
453
}
442
454
443
455
if ( addListener . match ( action ) ) {
444
- return startListening ( action . payload )
456
+ return startListening ( action . payload as any )
445
457
}
446
458
447
459
if ( clearAllListeners . match ( action ) ) {
@@ -454,18 +466,18 @@ export function createListenerMiddleware<
454
466
}
455
467
456
468
// Need to get this state _before_ the reducer processes the action
457
- let originalState : S | typeof INTERNAL_NIL_TOKEN = api . getState ( )
469
+ let originalState : StateType | typeof INTERNAL_NIL_TOKEN = api . getState ( )
458
470
459
471
// `getOriginalState` can only be called synchronously.
460
472
// @see https://github.com/reduxjs/redux-toolkit/discussions/1648#discussioncomment-1932820
461
- const getOriginalState = ( ) : S => {
473
+ const getOriginalState = ( ) : StateType => {
462
474
if ( originalState === INTERNAL_NIL_TOKEN ) {
463
475
throw new Error (
464
476
`${ alm } : getOriginalState can only be called synchronously`
465
477
)
466
478
}
467
479
468
- return originalState as S
480
+ return originalState as StateType
469
481
}
470
482
471
483
let result : unknown
@@ -475,10 +487,10 @@ export function createListenerMiddleware<
475
487
result = next ( action )
476
488
477
489
if ( listenerMap . size > 0 ) {
478
- let currentState = api . getState ( )
490
+ const currentState = api . getState ( )
479
491
// Work around ESBuild+TS transpilation issue
480
492
const listenerEntries = Array . from ( listenerMap . values ( ) )
481
- for ( let entry of listenerEntries ) {
493
+ for ( const entry of listenerEntries ) {
482
494
let runListener = false
483
495
484
496
try {
@@ -511,5 +523,5 @@ export function createListenerMiddleware<
511
523
startListening,
512
524
stopListening,
513
525
clearListeners : clearListenerMiddleware ,
514
- } as ListenerMiddlewareInstance < S , D , ExtraArgument >
526
+ } as ListenerMiddlewareInstance < StateType , DispatchType , ExtraArgument >
515
527
}
0 commit comments