1
- import { many , mapValues , setOf } from '@seedcompany/common' ;
1
+ import { entries , many , setOf } from '@seedcompany/common' ;
2
2
import * as uuid from 'uuid' ;
3
3
import {
4
4
EnumType ,
@@ -10,7 +10,6 @@ import {
10
10
ResourceShape ,
11
11
} from '~/common' ;
12
12
import { WorkflowEvent } from './dto' ;
13
- import { TransitionNotifier } from './transitions/notifiers' ;
14
13
import { InternalTransition , TransitionInput } from './transitions/types' ;
15
14
16
15
export const defineWorkflow =
@@ -34,33 +33,31 @@ export const defineWorkflow =
34
33
*/
35
34
context : ( ) => Context ;
36
35
/**
37
- * Notifiers that apply to all transitions by default .
36
+ * Middleware functions to adapt built transitions .
38
37
*/
39
- defaultNotifiers ?: ReadonlyArray < TransitionNotifier < Context > > ;
38
+ transitionEnhancers ?: Many < TransitionEnhancer < State , Context > > ;
40
39
} ) =>
41
40
< TransitionNames extends string > (
42
41
obj : Record < TransitionNames , TransitionInput < State , Context > > ,
43
42
) => {
44
- const transitions = mapValues (
45
- obj ,
46
- (
47
- name ,
48
- transition ,
49
- ) : InternalTransition < State , TransitionNames , Context > => ( {
43
+ const enhancers = many ( input . transitionEnhancers ?? [ ] ) ;
44
+
45
+ const transitions = entries ( obj ) . map ( ( [ name , transition ] ) => {
46
+ const normalized : InternalTransition < State , TransitionNames , Context > = {
50
47
name,
51
48
...transition ,
52
49
from : transition . from ? setOf ( many ( transition . from ) ) : undefined ,
53
50
key : ( transition . key ?? uuid . v5 ( name , input . id ) ) as ID ,
54
51
conditions : maybeMany ( transition . conditions ) ?? [ ] ,
55
- notifiers : [
56
- ... ( input . defaultNotifiers ?? [ ] ) ,
57
- ... ( maybeMany ( transition . notifiers ) ?? [ ] ) ,
58
- ] ,
59
- } ) ,
60
- ) . asRecord as Record <
61
- TransitionNames ,
62
- InternalTransition < State , TransitionNames , Context >
63
- > ;
52
+ notifiers : maybeMany ( transition . notifiers ) ?? [ ] ,
53
+ } ;
54
+ const enhanced = enhancers . reduce (
55
+ ( t , enhancer ) => enhancer ( t ) ,
56
+ normalized ,
57
+ ) ;
58
+ return enhanced ;
59
+ } ) ;
60
+
64
61
const workflow : Workflow <
65
62
Name ,
66
63
Context ,
@@ -71,7 +68,7 @@ export const defineWorkflow =
71
68
> = {
72
69
...input ,
73
70
id : input . id as ID ,
74
- transitions : Object . values ( transitions ) ,
71
+ transitions,
75
72
eventResource : input . event ,
76
73
transitionByKey : ( key : ID ) => {
77
74
const transition = workflow . transitions . find ( ( t ) => t . key === key ) ;
@@ -137,3 +134,7 @@ export interface Workflow<
137
134
...keys : Array < Many < Names > >
138
135
) => ReadonlySet < Names > ;
139
136
}
137
+
138
+ export type TransitionEnhancer < State extends string , Context > = (
139
+ transition : InternalTransition < State , any , Context > ,
140
+ ) => InternalTransition < State , any , Context > ;
0 commit comments