@@ -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 > >
@@ -279,9 +281,9 @@ const safelyNotifyError = (
279
281
/**
280
282
* @public
281
283
*/
282
- export const addListener = createAction (
283
- ` ${ alm } /add`
284
- ) as TypedAddListener < unknown >
284
+ export const addListener = Object . assign ( createAction ( ` ${ alm } /add` ) , {
285
+ withTypes : ( ) => addListener ,
286
+ } ) as unknown as TypedAddListener < unknown >
285
287
286
288
/**
287
289
* @public
@@ -291,9 +293,9 @@ export const clearAllListeners = createAction(`${alm}/removeAll`)
291
293
/**
292
294
* @public
293
295
*/
294
- export const removeListener = createAction (
295
- ` ${ alm } /remove`
296
- ) as TypedRemoveListener < unknown >
296
+ export const removeListener = Object . assign ( createAction ( ` ${ alm } /remove` ) , {
297
+ withTypes : ( ) => removeListener ,
298
+ } ) as unknown as TypedRemoveListener < unknown >
297
299
298
300
const defaultErrorHandler : ListenerErrorHandler = ( ...args : unknown [ ] ) => {
299
301
console . error ( `${ alm } /error` , ...args )
@@ -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
@@ -361,15 +373,19 @@ export function createListenerMiddleware<
361
373
return ! ! entry
362
374
}
363
375
376
+ Object . assign ( stopListening , {
377
+ withTypes : ( ) => stopListening ,
378
+ } )
379
+
364
380
const notifyListener = async (
365
381
entry : ListenerEntry < unknown , Dispatch < UnknownAction > > ,
366
382
action : unknown ,
367
383
api : MiddlewareAPI ,
368
- getOriginalState : ( ) => S
384
+ getOriginalState : ( ) => StateType
369
385
) => {
370
386
const internalTaskController = new AbortController ( )
371
387
const take = createTakePattern (
372
- startListening ,
388
+ startListening as AddListenerOverloads < any > ,
373
389
internalTaskController . signal
374
390
)
375
391
const autoJoinPromises : Promise < any > [ ] = [ ]
@@ -433,15 +449,15 @@ export function createListenerMiddleware<
433
449
434
450
const clearListenerMiddleware = createClearListenerMiddleware ( listenerMap )
435
451
436
- const middleware : ListenerMiddleware < S , D , ExtraArgument > =
452
+ const middleware : ListenerMiddleware < StateType , DispatchType , ExtraArgument > =
437
453
( api ) => ( next ) => ( action ) => {
438
454
if ( ! isAction ( action ) ) {
439
455
// we only want to notify listeners for action objects
440
456
return next ( action )
441
457
}
442
458
443
459
if ( addListener . match ( action ) ) {
444
- return startListening ( action . payload )
460
+ return startListening ( action . payload as any )
445
461
}
446
462
447
463
if ( clearAllListeners . match ( action ) ) {
@@ -454,18 +470,18 @@ export function createListenerMiddleware<
454
470
}
455
471
456
472
// Need to get this state _before_ the reducer processes the action
457
- let originalState : S | typeof INTERNAL_NIL_TOKEN = api . getState ( )
473
+ let originalState : StateType | typeof INTERNAL_NIL_TOKEN = api . getState ( )
458
474
459
475
// `getOriginalState` can only be called synchronously.
460
476
// @see https://github.com/reduxjs/redux-toolkit/discussions/1648#discussioncomment-1932820
461
- const getOriginalState = ( ) : S => {
477
+ const getOriginalState = ( ) : StateType => {
462
478
if ( originalState === INTERNAL_NIL_TOKEN ) {
463
479
throw new Error (
464
480
`${ alm } : getOriginalState can only be called synchronously`
465
481
)
466
482
}
467
483
468
- return originalState as S
484
+ return originalState as StateType
469
485
}
470
486
471
487
let result : unknown
@@ -475,10 +491,10 @@ export function createListenerMiddleware<
475
491
result = next ( action )
476
492
477
493
if ( listenerMap . size > 0 ) {
478
- let currentState = api . getState ( )
494
+ const currentState = api . getState ( )
479
495
// Work around ESBuild+TS transpilation issue
480
496
const listenerEntries = Array . from ( listenerMap . values ( ) )
481
- for ( let entry of listenerEntries ) {
497
+ for ( const entry of listenerEntries ) {
482
498
let runListener = false
483
499
484
500
try {
@@ -511,5 +527,5 @@ export function createListenerMiddleware<
511
527
startListening,
512
528
stopListening,
513
529
clearListeners : clearListenerMiddleware ,
514
- } as ListenerMiddlewareInstance < S , D , ExtraArgument >
530
+ } as ListenerMiddlewareInstance < StateType , DispatchType , ExtraArgument >
515
531
}
0 commit comments