/
types.d.ts
128 lines (125 loc) · 4.61 KB
/
types.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/** Nucleon state machine data. */
export type Data = Record<string, unknown>;
/**
* Nucleon state machine context.
*
* @see https://xstate.js.org/docs/guides/typescript.html#using-typescript
* @template TData Type of data stored in the context, usually a hypermedia resource.
* @template TError Type of error returned by the `validate` action.
* @template TFailure Type of non-validation error thrown in request services.
*/
export type Context<TData extends Data = Data, TError = unknown, TFailure = unknown> = {
/** Unmodified API resource snapshot. Can be `null` before it's loaded or once it's deleted. */
data: TData | null;
/** Local changes to the API resource snapshot. Can be `null` before resource is loaded or once it's deleted. */
edits: Partial<TData> | null;
/** Form validation errors returned by the `validate` action or with request rejection. */
errors: TError[];
/** Request rejection info in `fail` state when it's unrelated to form validation. */
failure: TFailure | null;
};
/**
* Nucleon state machine event.
*
* @see https://xstate.js.org/docs/guides/typescript.html#using-typescript
* @template TData Type of data stored in the context, usually a hypermedia resource.
*/
export type Event<TData extends Data = Data> =
| { type: 'SET_DATA'; data: TData | null }
| { type: 'REFRESH' }
| { type: 'EDIT'; data: Partial<TData> }
| { type: 'UNDO' }
| { type: 'FETCH' }
| { type: 'DELETE' }
| { type: 'SUBMIT' };
/**
* Nucleon state machine [typestate](https://xstate.js.org/docs/guides/typescript.html#typestates).
*
* @template TData Type of data stored in the context, usually a hypermedia resource.
* @template TError Type of error returned by the `validate` action.
*/
export type State<TData extends Data = Data, TError = unknown, TFailure = unknown> =
| {
value: 'fail';
context: Context<TData, TError> & { failure: TFailure };
}
| {
value: 'busy';
context: Context<TData, TError> & { failure: null };
}
| {
value: { busy: 'fetching' };
context: Context<TData, TError> & { failure: null };
}
| {
value: { busy: 'creating' };
context: Context<TData, TError> & { data: null; edits: Partial<TData>; failure: null };
}
| {
value: { busy: 'updating' };
context: Context<TData, TError> & { data: TData; edits: Partial<TData>; failure: null };
}
| {
value: { busy: 'deleting' };
context: Context<TData, TError> & { data: TData; failure: null };
}
| {
value: 'idle';
context: Context<TData, TError> & { failure: null };
}
| {
value: { idle: 'snapshot' };
context: Context<TData, TError> & { data: TData; failure: null };
}
| {
value: { idle: { snapshot: 'clean' } };
context: Context<TData, TError> & { data: TData; edits: null; failure: null };
}
| {
value: { idle: { snapshot: { clean: 'valid' } } };
context: Context<TData, TError> & { data: TData; edits: null; failure: null };
}
| {
value: { idle: { snapshot: { clean: 'invalid' } } };
context: Context<TData, TError> & { data: TData; edits: null; failure: null };
}
| {
value: { idle: { snapshot: 'dirty' } };
context: Context<TData, TError> & { data: TData; edits: Partial<TData>; failure: null };
}
| {
value: { idle: { snapshot: { dirty: 'valid' } } };
context: Context<TData, TError> & { data: TData; edits: Partial<TData>; failure: null };
}
| {
value: { idle: { snapshot: { dirty: 'invalid' } } };
context: Context<TData, TError> & { data: TData; edits: Partial<TData>; failure: null };
}
| {
value: { idle: 'template' };
context: Context<TData, TError> & { data: null; failure: null };
}
| {
value: { idle: { template: 'clean' } };
context: Context<TData, TError> & { data: null; edits: null; failure: null };
}
| {
value: { idle: { template: { clean: 'valid' } } };
context: Context<TData, TError> & { data: null; edits: null; failure: null };
}
| {
value: { idle: { template: { clean: 'invalid' } } };
context: Context<TData, TError> & { data: null; edits: null; failure: null };
}
| {
value: { idle: { template: 'dirty' } };
context: Context<TData, TError> & { data: null; edits: Partial<TData>; failure: null };
}
| {
value: { idle: { template: { dirty: 'valid' } } };
context: Context<TData, TError> & { data: null; edits: Partial<TData>; failure: null };
}
| {
value: { idle: { template: { dirty: 'invalid' } } };
context: Context<TData, TError> & { data: null; edits: Partial<TData>; failure: null };
};