@stateforward/hsm.ts 0.1.0
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/README.md +39 -0
- package/dist/chunk-R6UCUJT5.js +307 -0
- package/dist/chunk-R6UCUJT5.js.map +1 -0
- package/dist/chunk-UO7RF4FF.js +132 -0
- package/dist/chunk-UO7RF4FF.js.map +1 -0
- package/dist/index.cjs +3015 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1013 -0
- package/dist/index.d.ts +1013 -0
- package/dist/index.js +2462 -0
- package/dist/index.js.map +1 -0
- package/dist/kind.cjs +162 -0
- package/dist/kind.cjs.map +1 -0
- package/dist/kind.d.cts +75 -0
- package/dist/kind.d.ts +75 -0
- package/dist/kind.js +21 -0
- package/dist/kind.js.map +1 -0
- package/dist/muid.cjs +345 -0
- package/dist/muid.cjs.map +1 -0
- package/dist/muid.d.cts +56 -0
- package/dist/muid.d.ts +56 -0
- package/dist/muid.js +37 -0
- package/dist/muid.js.map +1 -0
- package/package.json +68 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,1013 @@
|
|
|
1
|
+
import { Kind } from './kind.cjs';
|
|
2
|
+
export { isKind as IsKind, kinds as Kinds, makeKind as MakeKind, isKind, kinds, makeKind } from './kind.cjs';
|
|
3
|
+
export { Generator, MUID, MuidConfig, ShardedGenerators, UInt64, add64, and64, cmp64, from32, getDefaultConfig, make, make64, makeMuid, newGenerator, or64, shl64, shr64, sub64 } from './muid.cjs';
|
|
4
|
+
|
|
5
|
+
type Path = string;
|
|
6
|
+
type TimerHandle = ReturnType<typeof setTimeout>;
|
|
7
|
+
type TimerFunction = (callback: (...args: Array<unknown>) => void, timeout?: number, ...args: Array<unknown>) => TimerHandle;
|
|
8
|
+
type CancelFunction = (id: TimerHandle | undefined) => void;
|
|
9
|
+
type AnyModelElement = State | Transition | Behavior | Constraint | Vertex;
|
|
10
|
+
type EventRecord = {
|
|
11
|
+
kind: Kind;
|
|
12
|
+
name: string;
|
|
13
|
+
data?: any;
|
|
14
|
+
schema?: any;
|
|
15
|
+
source?: string;
|
|
16
|
+
target?: string;
|
|
17
|
+
id?: string;
|
|
18
|
+
qualifiedName?: string;
|
|
19
|
+
};
|
|
20
|
+
type Element = {
|
|
21
|
+
kind: Kind;
|
|
22
|
+
qualifiedName: Path;
|
|
23
|
+
id?: string;
|
|
24
|
+
};
|
|
25
|
+
type Vertex = Element & {
|
|
26
|
+
transitions: Path[];
|
|
27
|
+
};
|
|
28
|
+
type TransitionPath = {
|
|
29
|
+
enter: Path[];
|
|
30
|
+
exit: Path[];
|
|
31
|
+
};
|
|
32
|
+
type AttributeDefinition = {
|
|
33
|
+
name: string;
|
|
34
|
+
qualifiedName: string;
|
|
35
|
+
hasDefault: boolean;
|
|
36
|
+
defaultValue?: any;
|
|
37
|
+
};
|
|
38
|
+
type OperationDefinition = {
|
|
39
|
+
name: string;
|
|
40
|
+
qualifiedName: string;
|
|
41
|
+
implementation: (...args: unknown[]) => unknown;
|
|
42
|
+
};
|
|
43
|
+
type Model = State & {
|
|
44
|
+
members: Record<Path, AnyModelElement>;
|
|
45
|
+
transitionMap: Record<Path, Record<Path, any[]>>;
|
|
46
|
+
deferredMap: Record<Path, Record<Path, boolean>>;
|
|
47
|
+
events: Record<string, EventRecord>;
|
|
48
|
+
attributes: Record<string, AttributeDefinition>;
|
|
49
|
+
operations: Record<string, OperationDefinition>;
|
|
50
|
+
partials: Array<(model: Model, stack: AnyModelElement[]) => void>;
|
|
51
|
+
};
|
|
52
|
+
type Expression = (ctx: Context, instance: Instance, event: EventRecord) => boolean;
|
|
53
|
+
type TimeExpression = (ctx: Context, instance: Instance, event: EventRecord) => number | Date | Promise<number> | Promise<Date>;
|
|
54
|
+
type Behavior = Element & {
|
|
55
|
+
operation: Operation | null;
|
|
56
|
+
operationName?: string;
|
|
57
|
+
Owner?: () => string;
|
|
58
|
+
};
|
|
59
|
+
type Constraint = Element & {
|
|
60
|
+
expression: Expression;
|
|
61
|
+
};
|
|
62
|
+
type Snapshot = {
|
|
63
|
+
id: string;
|
|
64
|
+
qualifiedName: string;
|
|
65
|
+
state: string;
|
|
66
|
+
attributes: Record<string, any>;
|
|
67
|
+
queueLen: number;
|
|
68
|
+
events: Array<{
|
|
69
|
+
event: string;
|
|
70
|
+
target?: string;
|
|
71
|
+
guard: boolean;
|
|
72
|
+
schema?: any;
|
|
73
|
+
}>;
|
|
74
|
+
};
|
|
75
|
+
type Config = {
|
|
76
|
+
id?: string;
|
|
77
|
+
name?: string;
|
|
78
|
+
data?: any;
|
|
79
|
+
clock?: {
|
|
80
|
+
setTimeout?: TimerFunction;
|
|
81
|
+
clearTimeout?: CancelFunction;
|
|
82
|
+
now?: () => number;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
type ClockConfig = {
|
|
86
|
+
setTimeout: TimerFunction;
|
|
87
|
+
clearTimeout: CancelFunction;
|
|
88
|
+
now: () => number;
|
|
89
|
+
};
|
|
90
|
+
type StripLeadingSlash<S extends string> = S extends `/${infer Rest}` ? Rest : S;
|
|
91
|
+
type StripTrailingSlash<S extends string> = S extends `${infer Rest}/` ? Rest : S;
|
|
92
|
+
type PathParts<S extends string> = S extends '' ? [] : S extends `${infer Head}/${infer Tail}` ? [Head, ...PathParts<Tail>] : [S];
|
|
93
|
+
type CompactPathParts<Parts extends readonly string[], Acc extends readonly string[] = []> = Parts extends readonly [infer Head extends string, ...infer Tail extends string[]] ? Head extends '.' ? CompactPathParts<Tail, Acc> : Head extends '' ? CompactPathParts<Tail, Acc> : Head extends '..' ? CompactPathParts<Tail, PopSegment<Acc>> : CompactPathParts<Tail, [...Acc, Head]> : Acc;
|
|
94
|
+
type JoinPathParts<Parts extends readonly string[]> = Parts extends [] ? '' : Parts extends readonly [infer Head extends string] ? Head : Parts extends readonly [infer Head extends string, ...infer Tail extends string[]] ? `${Head}/${JoinPathParts<Tail>}` : string;
|
|
95
|
+
type NormalizePath<Raw extends string> = ToAbsolutePath<CompactPathParts<PathParts<Raw>>>;
|
|
96
|
+
type ToAbsolutePath<Parts extends readonly string[]> = Parts extends [] ? '/' : `/${JoinPathParts<Parts>}`;
|
|
97
|
+
type PopSegment<Parts extends readonly string[]> = Parts extends readonly [...infer Rest extends string[], infer _Last] ? Rest : [];
|
|
98
|
+
type IsAbsolutePath<S extends string> = S extends `/${string}` ? true : false;
|
|
99
|
+
type ResolvePathExpression<Base extends string, Expr extends string> = IsAbsolutePath<Expr> extends true ? NormalizePath<Expr> : ToAbsolutePath<CompactPathParts<[
|
|
100
|
+
...PathParts<StripLeadingSlash<Base>>,
|
|
101
|
+
...PathParts<StripLeadingSlash<StripTrailingSlash<Expr>>>
|
|
102
|
+
]>>;
|
|
103
|
+
type ResolveModelPathExpression<Owner extends string, ModelRoot extends string, Expr extends string> = IsAbsolutePath<Expr> extends true ? IsPathUnderBase<NormalizePath<Expr>, ModelRoot> extends true ? NormalizePath<Expr> : ToAbsolutePath<CompactPathParts<[
|
|
104
|
+
...PathParts<StripLeadingSlash<ModelRoot>>,
|
|
105
|
+
...PathParts<StripLeadingSlash<StripTrailingSlash<Expr>>>
|
|
106
|
+
]>> : ToAbsolutePath<CompactPathParts<[
|
|
107
|
+
...PathParts<StripLeadingSlash<Owner>>,
|
|
108
|
+
...PathParts<StripLeadingSlash<StripTrailingSlash<Expr>>>
|
|
109
|
+
]>>;
|
|
110
|
+
type IsPathUnderBase<Path extends string, Base extends string> = Path extends Base | `${Base}/${string}` ? true : false;
|
|
111
|
+
type RelativeFromAbsolute<Path extends string> = Path extends `/${string}/${infer Rest}` ? Rest : never;
|
|
112
|
+
type ParentParts<Parts extends readonly string[]> = Parts extends readonly [...infer Prefix extends string[], infer _Last extends string] ? Prefix : [];
|
|
113
|
+
type ParentPath<Path extends string> = Path extends `/${infer Tail}` ? ToAbsolutePath<ParentParts<PathParts<Tail>>> : never;
|
|
114
|
+
type IsStatePathPrefix<Prefix extends string, Path extends string> = Path extends `${Prefix}/${string}` ? true : false;
|
|
115
|
+
interface TypedModel<TAttributes extends Record<string, any> = Record<string, any>, TOperations extends Record<string, (...args: any[]) => any> = Record<string, (...args: any[]) => any>, TGuards extends Record<string, (...args: any[]) => any> = Record<string, (...args: any[]) => any>, TActivities extends Record<string, (...args: any[]) => any> = Record<string, (...args: any[]) => any>, TEvents = Event<string, unknown>, TEventGroups = unknown, TName extends string = string, TInstance extends Instance = Instance> extends Model {
|
|
116
|
+
readonly __hsm_attributes?: TAttributes;
|
|
117
|
+
readonly __hsm_operations?: TOperations;
|
|
118
|
+
readonly __hsm_guards?: TGuards;
|
|
119
|
+
readonly __hsm_activities?: TActivities;
|
|
120
|
+
readonly __hsm_events?: TEvents;
|
|
121
|
+
readonly __hsm_eventGroups?: TEventGroups;
|
|
122
|
+
readonly __hsm_name?: TName;
|
|
123
|
+
readonly __hsm_instance?: TInstance;
|
|
124
|
+
readonly __hsm_meta?: {
|
|
125
|
+
name: unknown;
|
|
126
|
+
states: unknown;
|
|
127
|
+
finalStates: unknown;
|
|
128
|
+
transitions: unknown;
|
|
129
|
+
initials: unknown;
|
|
130
|
+
attributes: unknown;
|
|
131
|
+
operations: unknown;
|
|
132
|
+
eventSchemas: unknown;
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
type EventClause<Name extends string = string, Schema = unknown> = {
|
|
136
|
+
kind: 'on';
|
|
137
|
+
name: Name;
|
|
138
|
+
schema?: Schema;
|
|
139
|
+
};
|
|
140
|
+
type OnSetClause<Name extends string = string> = {
|
|
141
|
+
kind: 'onSet';
|
|
142
|
+
name: Name;
|
|
143
|
+
};
|
|
144
|
+
type OnCallClause<Name extends string = string> = {
|
|
145
|
+
kind: 'onCall';
|
|
146
|
+
name: Name;
|
|
147
|
+
};
|
|
148
|
+
type WhenClause<Name extends string = string> = {
|
|
149
|
+
kind: 'when';
|
|
150
|
+
name: Name;
|
|
151
|
+
};
|
|
152
|
+
type WhenExprClause = {
|
|
153
|
+
kind: 'whenExpr';
|
|
154
|
+
};
|
|
155
|
+
type SourceClause<Name extends string = string> = {
|
|
156
|
+
kind: 'source';
|
|
157
|
+
name: Name;
|
|
158
|
+
};
|
|
159
|
+
type TargetClause<Name extends string = string> = {
|
|
160
|
+
kind: 'target';
|
|
161
|
+
name: Name;
|
|
162
|
+
};
|
|
163
|
+
type GuardClause<Value = unknown> = {
|
|
164
|
+
kind: 'guard';
|
|
165
|
+
value: Value;
|
|
166
|
+
};
|
|
167
|
+
type EffectClause<Value = unknown> = {
|
|
168
|
+
kind: 'effect';
|
|
169
|
+
value: Value;
|
|
170
|
+
};
|
|
171
|
+
type AfterClause<Value = unknown> = {
|
|
172
|
+
kind: 'after';
|
|
173
|
+
value: Value;
|
|
174
|
+
};
|
|
175
|
+
type EveryClause<Value = unknown> = {
|
|
176
|
+
kind: 'every';
|
|
177
|
+
value: Value;
|
|
178
|
+
};
|
|
179
|
+
type AtClause<Value = unknown> = {
|
|
180
|
+
kind: 'at';
|
|
181
|
+
value: Value;
|
|
182
|
+
};
|
|
183
|
+
type TransitionSpec<Parts extends readonly TransitionBuilderClause[]> = {
|
|
184
|
+
kind: 'transition';
|
|
185
|
+
parts: Parts;
|
|
186
|
+
};
|
|
187
|
+
type StateSpec<Name extends string = string, Parts extends readonly unknown[] = readonly unknown[]> = {
|
|
188
|
+
kind: 'state';
|
|
189
|
+
name: Name;
|
|
190
|
+
parts: Parts;
|
|
191
|
+
};
|
|
192
|
+
type InitialSpec<Parts extends readonly TransitionBuilderClause[] = readonly TransitionBuilderClause[]> = {
|
|
193
|
+
kind: 'initial';
|
|
194
|
+
name: string;
|
|
195
|
+
parts: Parts;
|
|
196
|
+
};
|
|
197
|
+
type FinalSpec<Name extends string = string> = {
|
|
198
|
+
kind: 'final';
|
|
199
|
+
name: Name;
|
|
200
|
+
};
|
|
201
|
+
type ShallowHistorySpec<Name extends string = string, Parts extends readonly unknown[] = readonly unknown[]> = {
|
|
202
|
+
kind: 'shallowHistory';
|
|
203
|
+
name: Name;
|
|
204
|
+
parts: Parts;
|
|
205
|
+
};
|
|
206
|
+
type DeepHistorySpec<Name extends string = string, Parts extends readonly unknown[] = readonly unknown[]> = {
|
|
207
|
+
kind: 'deepHistory';
|
|
208
|
+
name: Name;
|
|
209
|
+
parts: Parts;
|
|
210
|
+
};
|
|
211
|
+
type ChoiceSpec<Name extends string = string, Parts extends readonly unknown[] = readonly unknown[]> = {
|
|
212
|
+
kind: 'choice';
|
|
213
|
+
name: Name;
|
|
214
|
+
parts: Parts;
|
|
215
|
+
};
|
|
216
|
+
type EntrySpec<Operations = unknown> = {
|
|
217
|
+
kind: 'entry';
|
|
218
|
+
value: Operations;
|
|
219
|
+
};
|
|
220
|
+
type ExitSpec<Operations = unknown> = {
|
|
221
|
+
kind: 'exit';
|
|
222
|
+
value: Operations;
|
|
223
|
+
};
|
|
224
|
+
type ActivitySpec<Operations = unknown> = {
|
|
225
|
+
kind: 'activity';
|
|
226
|
+
value: Operations;
|
|
227
|
+
};
|
|
228
|
+
type DeferSpec<EventNames extends readonly string[] = readonly string[]> = {
|
|
229
|
+
kind: 'defer';
|
|
230
|
+
eventNames: EventNames;
|
|
231
|
+
};
|
|
232
|
+
type AttributeSpec<Name extends string = string, Value = unknown> = {
|
|
233
|
+
kind: 'attribute';
|
|
234
|
+
name: Name;
|
|
235
|
+
value: Value;
|
|
236
|
+
};
|
|
237
|
+
type OperationSpec<Name extends string = string, Fn extends (...args: any[]) => any = (...args: any[]) => any> = {
|
|
238
|
+
kind: 'operation';
|
|
239
|
+
name: Name;
|
|
240
|
+
impl: Fn;
|
|
241
|
+
};
|
|
242
|
+
type ModelElementSpec = TransitionSpec<readonly TransitionBuilderClause[]> | StateSpec<string, readonly unknown[]> | InitialSpec<readonly TransitionBuilderClause[]> | FinalSpec | ShallowHistorySpec<string, readonly unknown[]> | DeepHistorySpec<string, readonly unknown[]> | ChoiceSpec<string, readonly unknown[]> | EntrySpec | ExitSpec | ActivitySpec | AttributeSpec | OperationSpec | DeferSpec | {
|
|
243
|
+
kind: 'unknown';
|
|
244
|
+
};
|
|
245
|
+
type TransitionBuilderClause = EventClause | OnSetClause | OnCallClause | WhenClause | WhenExprClause | SourceClause | TargetClause | GuardClause | EffectClause | AfterClause | EveryClause | AtClause | {
|
|
246
|
+
kind: 'unknownTransitionClause';
|
|
247
|
+
};
|
|
248
|
+
type ModelMetaOf<T> = T extends {
|
|
249
|
+
__hsm_meta: infer M;
|
|
250
|
+
} ? M : never;
|
|
251
|
+
type BuilderTuple<Specs extends readonly unknown[]> = {
|
|
252
|
+
[K in keyof Specs]: BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, Specs[K]>;
|
|
253
|
+
};
|
|
254
|
+
type GuardBuilder<EventType extends EventRecord = EventRecord> = BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, GuardClause<unknown>> & {
|
|
255
|
+
readonly __hsmTransitionEvent?: EventType;
|
|
256
|
+
};
|
|
257
|
+
type TransitionBuilderTuple<Clauses extends readonly TransitionBuilderClause[]> = BuilderTuple<Clauses>;
|
|
258
|
+
type ScopeModelParts<LocalParts extends readonly unknown[], ModelParts extends readonly unknown[]> = readonly [...ModelParts, ...LocalParts];
|
|
259
|
+
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
260
|
+
type AttributeKeysFromModelParts<Parts extends readonly unknown[]> = keyof ModelAttributeTypeMap<Parts> & string;
|
|
261
|
+
type DurationAttributeKeysFromModelParts<Parts extends readonly unknown[]> = {
|
|
262
|
+
[K in AttributeKeysFromModelParts<Parts>]: IsAny<EventValueFromAttribute<Parts, K>> extends true ? K : [Extract<EventValueFromAttribute<Parts, K>, string | number>] extends [never] ? never : K;
|
|
263
|
+
}[AttributeKeysFromModelParts<Parts>];
|
|
264
|
+
type TimepointAttributeKeysFromModelParts<Parts extends readonly unknown[]> = {
|
|
265
|
+
[K in AttributeKeysFromModelParts<Parts>]: IsAny<EventValueFromAttribute<Parts, K>> extends true ? K : [Extract<EventValueFromAttribute<Parts, K>, string | number | Date>] extends [never] ? never : K;
|
|
266
|
+
}[AttributeKeysFromModelParts<Parts>];
|
|
267
|
+
type OperationKeysFromModelParts<Parts extends readonly unknown[]> = keyof ModelOperationTypeMap<Parts> & string;
|
|
268
|
+
type GuardOperationKeysFromModelParts<Parts extends readonly unknown[]> = {
|
|
269
|
+
[K in OperationKeysFromModelParts<Parts>]: IsAny<ReturnType<Extract<ModelOperationTypeMap<Parts>[K], (...args: any[]) => any>>> extends true ? never : ReturnType<Extract<ModelOperationTypeMap<Parts>[K], (...args: any[]) => any>> extends boolean ? K : never;
|
|
270
|
+
}[OperationKeysFromModelParts<Parts>];
|
|
271
|
+
type InvalidString<Message extends string, Actual extends string> = Actual & {
|
|
272
|
+
readonly __hsmTypeError: Message;
|
|
273
|
+
};
|
|
274
|
+
type ValidateBehaviorArgument<Argument, ModelParts extends readonly unknown[], GuardOnly extends boolean = false> = Argument extends string ? GuardOnly extends true ? Argument extends GuardOperationKeysFromModelParts<ModelParts> ? Argument : InvalidString<`Invalid guard operation: ${Argument}`, Argument> : Argument extends OperationKeysFromModelParts<ModelParts> ? Argument : InvalidString<`Invalid behavior operation: ${Argument}`, Argument> : Argument;
|
|
275
|
+
type ValidateBehaviorArguments<Arguments, ModelParts extends readonly unknown[], GuardOnly extends boolean = false> = Arguments extends readonly [infer Head, ...infer Tail] ? readonly [
|
|
276
|
+
ValidateBehaviorArgument<Head, ModelParts, GuardOnly>,
|
|
277
|
+
...ValidateBehaviorArguments<Tail, ModelParts, GuardOnly>
|
|
278
|
+
] : readonly [];
|
|
279
|
+
type KnownEventNamesFromRootModelParts<RootModelParts extends readonly unknown[], RootPath extends string> = keyof CollectModelParts<RootModelParts, RootPath, RootPath, RootModelParts>['eventSchemas'] & string;
|
|
280
|
+
type ValidateDeferredEventName<EventName extends string, RootModelParts extends readonly unknown[], RootPath extends string> = string extends EventName ? EventName : EventName extends KnownEventNamesFromRootModelParts<RootModelParts, RootPath> ? EventName : InvalidString<`Invalid deferred event: ${EventName}`, EventName>;
|
|
281
|
+
type ValidateDeferredEventNames<EventNames extends readonly string[], RootModelParts extends readonly unknown[], RootPath extends string> = {
|
|
282
|
+
[K in keyof EventNames]: EventNames[K] extends string ? ValidateDeferredEventName<EventNames[K], RootModelParts, RootPath> : EventNames[K];
|
|
283
|
+
};
|
|
284
|
+
type LocalKnownEventNamesFromParts<Parts extends readonly unknown[]> = keyof CollectModelParts<Parts, '/', '/', Parts>['eventSchemas'] & string;
|
|
285
|
+
type ValidateDeferredEventNameFromParts<EventName extends string, Parts extends readonly unknown[]> = string extends EventName ? EventName : EventName extends LocalKnownEventNamesFromParts<Parts> ? EventName : InvalidString<`Invalid deferred event: ${EventName}`, EventName>;
|
|
286
|
+
type ValidateDeferredEventNamesFromParts<EventNames extends readonly string[], Parts extends readonly unknown[]> = {
|
|
287
|
+
[K in keyof EventNames]: EventNames[K] extends string ? ValidateDeferredEventNameFromParts<EventNames[K], Parts> : EventNames[K];
|
|
288
|
+
};
|
|
289
|
+
type ValidateStateLocalSpec<Spec, RootParts extends readonly unknown[]> = Spec extends DeferSpec<infer EventNames> ? DeferSpec<ValidateDeferredEventNamesFromParts<EventNames, RootParts>> : Spec extends StateSpec<infer Name, infer Parts> ? StateSpec<Name, ValidateStateLocalSpecs<Parts, RootParts>> : Spec;
|
|
290
|
+
type ValidateStateLocalSpecs<Specs extends readonly unknown[], RootParts extends readonly unknown[] = Specs> = {
|
|
291
|
+
[K in keyof Specs]: ValidateStateLocalSpec<Specs[K], RootParts>;
|
|
292
|
+
};
|
|
293
|
+
type ValidateTransitionClause<Clause, ScopedModelParts extends readonly unknown[], RootModelParts extends readonly unknown[], RootPath extends string, OwnerPath extends string> = Clause extends OnSetClause<infer Name> ? Name extends AttributeKeysFromModelParts<ScopedModelParts> ? OnSetClause<Name> : OnSetClause<InvalidString<`Invalid onSet attribute: ${Name}`, Name>> : Clause extends WhenClause<infer Name> ? Name extends AttributeKeysFromModelParts<ScopedModelParts> ? WhenClause<Name> : WhenClause<InvalidString<`Invalid when attribute: ${Name}`, Name>> : Clause extends OnCallClause<infer Name> ? Name extends OperationKeysFromModelParts<ScopedModelParts> ? OnCallClause<Name> : OnCallClause<InvalidString<`Invalid onCall operation: ${Name}`, Name>> : Clause extends SourceClause<infer Name> ? ResolveModelPathExpression<OwnerPath, RootPath, Name> extends RootPath | CollectModelParts<RootModelParts, RootPath, RootPath, RootModelParts>['states'] ? SourceClause<Name> : SourceClause<InvalidString<`Invalid transition source path: ${Name}`, Name>> : Clause extends TargetClause<infer Name> ? ResolveModelPathExpression<OwnerPath, RootPath, Name> extends RootPath | CollectModelParts<RootModelParts, RootPath, RootPath, RootModelParts>['states'] ? TargetClause<Name> : TargetClause<InvalidString<`Invalid transition target path: ${Name}`, Name>> : Clause extends AfterClause<infer Value> ? Value extends string ? Value extends DurationAttributeKeysFromModelParts<ScopedModelParts> ? AfterClause<Value> : AfterClause<InvalidString<`Invalid after attribute: ${Value}`, Value>> : Clause : Clause extends EveryClause<infer Value> ? Value extends string ? Value extends DurationAttributeKeysFromModelParts<ScopedModelParts> ? EveryClause<Value> : EveryClause<InvalidString<`Invalid every attribute: ${Value}`, Value>> : Clause : Clause extends AtClause<infer Value> ? Value extends string ? Value extends TimepointAttributeKeysFromModelParts<ScopedModelParts> ? AtClause<Value> : AtClause<InvalidString<`Invalid at attribute: ${Value}`, Value>> : Clause : Clause extends GuardClause<infer Value> ? GuardClause<ValidateBehaviorArgument<Value, ScopedModelParts, true>> : Clause extends EffectClause<infer Value> ? EffectClause<ValidateBehaviorArguments<Value, ScopedModelParts>> : Clause;
|
|
294
|
+
type ValidateTransitionClauses<Clauses extends readonly unknown[], ScopedModelParts extends readonly unknown[], RootModelParts extends readonly unknown[], RootPath extends string, OwnerPath extends string> = {
|
|
295
|
+
[K in keyof Clauses]: ValidateTransitionClause<Clauses[K], ScopedModelParts, RootModelParts, RootPath, OwnerPath>;
|
|
296
|
+
};
|
|
297
|
+
type ValidateModelSpec<Spec, ScopedModelParts extends readonly unknown[], RootModelParts extends readonly unknown[], RootPath extends string, OwnerPath extends string> = Spec extends StateSpec<infer Name, infer Parts> ? StateSpec<Name, ValidateModelSpecs<Parts, ScopeModelParts<Parts, ScopedModelParts>, RootModelParts, RootPath, ResolvePathExpression<OwnerPath, Name>>> : Spec extends TransitionSpec<infer Clauses> ? TransitionSpec<ValidateTransitionClauses<Clauses, ScopedModelParts, RootModelParts, RootPath, OwnerPath>> : Spec extends InitialSpec<infer Clauses> ? InitialSpec<ValidateTransitionClauses<Clauses, ScopedModelParts, RootModelParts, RootPath, OwnerPath>> : Spec extends EntrySpec<infer Value> ? EntrySpec<ValidateBehaviorArguments<Value, ScopedModelParts>> : Spec extends ExitSpec<infer Value> ? ExitSpec<ValidateBehaviorArguments<Value, ScopedModelParts>> : Spec extends ActivitySpec<infer Value> ? ActivitySpec<ValidateBehaviorArguments<Value, ScopedModelParts>> : Spec extends DeferSpec<infer EventNames> ? DeferSpec<ValidateDeferredEventNames<EventNames, RootModelParts, RootPath>> : Spec;
|
|
298
|
+
type ValidateModelSpecs<Specs extends readonly unknown[], ScopedModelParts extends readonly unknown[] = Specs, RootModelParts extends readonly unknown[] = ScopedModelParts, RootPath extends string = '/', OwnerPath extends string = RootPath> = {
|
|
299
|
+
[K in keyof Specs]: ValidateModelSpec<Specs[K], ScopedModelParts, RootModelParts, RootPath, OwnerPath>;
|
|
300
|
+
};
|
|
301
|
+
type ValidatedModelElementBuilderTuple<Specs extends readonly ModelElementSpec[], ScopedModelParts extends readonly ModelElementSpec[] = Specs, RootModelParts extends readonly ModelElementSpec[] = ScopedModelParts, RootPath extends string = '/', OwnerPath extends string = RootPath> = BuilderTuple<ValidateModelSpecs<Specs, ScopedModelParts, RootModelParts, RootPath, OwnerPath>>;
|
|
302
|
+
type ModelAttributeMap<T> = T extends TypedModel<infer A, any, any, any, any, any, any, any> ? A : ModelMetaOf<T> extends {
|
|
303
|
+
attributes: infer A;
|
|
304
|
+
} ? A extends Record<string, unknown> ? A : {} : {};
|
|
305
|
+
type ModelOperationMap<T> = T extends TypedModel<any, infer O, any, any, any, any, any, any> ? O : ModelMetaOf<T> extends {
|
|
306
|
+
operations: infer O;
|
|
307
|
+
} ? O extends Record<string, (...args: any[]) => any> ? O : {} : {};
|
|
308
|
+
type ModelEventMap<T> = T extends TypedModel<any, any, any, any, infer E, any, any, any> ? EventMapFromUnion<E> : ModelMetaOf<T> extends {
|
|
309
|
+
eventSchemas: infer E;
|
|
310
|
+
} ? E extends Record<string, unknown> ? E : {} : {};
|
|
311
|
+
type ModelStateMeta<T> = T extends {
|
|
312
|
+
__hsm_meta: infer Meta;
|
|
313
|
+
} ? Meta extends {
|
|
314
|
+
name: string;
|
|
315
|
+
states: infer States;
|
|
316
|
+
finalStates: infer Finals;
|
|
317
|
+
transitions: infer Transitions;
|
|
318
|
+
initials: infer Initials;
|
|
319
|
+
attributes: infer Attributes;
|
|
320
|
+
operations: infer Operations;
|
|
321
|
+
eventSchemas: infer EventSchemas;
|
|
322
|
+
} ? {
|
|
323
|
+
name: string & Meta['name'];
|
|
324
|
+
states: States & string;
|
|
325
|
+
finalStates: Finals & string;
|
|
326
|
+
transitions: Transitions;
|
|
327
|
+
initials: Initials extends Record<string, string> ? Initials : Record<string, string>;
|
|
328
|
+
attributes: Attributes extends Record<string, unknown> ? Attributes : Record<string, unknown>;
|
|
329
|
+
operations: Operations extends Record<string, (...args: any[]) => any> ? Operations : Record<string, (...args: any[]) => any>;
|
|
330
|
+
eventSchemas: EventSchemas extends Record<string, unknown> ? EventSchemas : Record<string, unknown>;
|
|
331
|
+
} : never : TypedModelMetaFallback<T>;
|
|
332
|
+
type TypedModelMetaFallback<T> = {
|
|
333
|
+
name: string;
|
|
334
|
+
states: string;
|
|
335
|
+
finalStates: string;
|
|
336
|
+
transitions: string;
|
|
337
|
+
initials: Record<string, string>;
|
|
338
|
+
attributes: ModelAttributeMap<T>;
|
|
339
|
+
operations: ModelOperationMap<T>;
|
|
340
|
+
eventSchemas: ModelEventMap<T>;
|
|
341
|
+
};
|
|
342
|
+
type TypedModelFromInfer<RootName extends string, Parts extends readonly unknown[]> = {
|
|
343
|
+
[K in keyof Model & string]: Model[K];
|
|
344
|
+
} & TypedModel<InferredAttributes<Parts>, InferredOperations<Parts>, any, any, InferredEventUnion<Parts>, any, RootName, Instance> & {
|
|
345
|
+
readonly __hsm_meta: ModelStateMetaFromParts<`/${RootName}`, Parts>;
|
|
346
|
+
};
|
|
347
|
+
type ModelAttributeTypeMap<Parts extends readonly unknown[]> = MergeMaps<AttributeFromParts<Parts>>;
|
|
348
|
+
type ModelOperationTypeMap<Parts extends readonly unknown[]> = NormalizeOpMap<MergeMaps<OperationFromParts<Parts>>>;
|
|
349
|
+
type InferredAttributes<Parts extends readonly unknown[]> = ModelAttributeTypeMap<Parts>;
|
|
350
|
+
type InferredOperations<Parts extends readonly unknown[]> = ModelOperationTypeMap<Parts>;
|
|
351
|
+
type InferredEventUnion<Parts extends readonly unknown[]> = EventUnionFromTransitions<CollectModelParts<Parts, '/', '/', Parts>['transitions']> | EventUnionFromMap<CollectModelParts<Parts, '/', '/', Parts>['eventSchemas']>;
|
|
352
|
+
type UnionToIntersection<T> = (T extends any ? (value: T) => void : never) extends (value: infer I) => void ? I : never;
|
|
353
|
+
type EventMapFromUnion<U> = UnionToIntersection<U extends Event<infer Name, infer Schema> ? {
|
|
354
|
+
[K in Name]: Schema;
|
|
355
|
+
} : {}> extends infer M ? M extends Record<string, unknown> ? MergeMaps<M> : {} : {};
|
|
356
|
+
type MergeEventMaps<A extends Record<string, unknown>, B extends Record<string, unknown>> = {
|
|
357
|
+
[K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;
|
|
358
|
+
};
|
|
359
|
+
type MergeMaps<M extends Record<string, unknown>> = {
|
|
360
|
+
[K in keyof M]: M[K];
|
|
361
|
+
};
|
|
362
|
+
type NormalizeOpMap<M extends Record<string, unknown>> = {
|
|
363
|
+
[K in keyof M]: M[K] extends (...args: any[]) => any ? M[K] : never;
|
|
364
|
+
};
|
|
365
|
+
type AttributeFromParts<Parts extends readonly unknown[]> = Parts extends readonly [infer H, ...infer T] ? H extends AttributeSpec<infer Name, infer Value> ? {
|
|
366
|
+
[K in Name]: Value;
|
|
367
|
+
} & AttributeFromParts<T> : AttributeFromParts<T> : {};
|
|
368
|
+
type OperationFromParts<Parts extends readonly unknown[]> = Parts extends readonly [infer H, ...infer T] ? H extends OperationSpec<infer Name, infer Fn> ? {
|
|
369
|
+
[K in Name]: Fn;
|
|
370
|
+
} & OperationFromParts<T> : OperationFromParts<T> : {};
|
|
371
|
+
type EventValueFromAttribute<Parts extends readonly unknown[], Name extends string> = Name extends keyof ModelAttributeTypeMap<Parts> & string ? ModelAttributeTypeMap<Parts>[Name] : unknown;
|
|
372
|
+
type EventArgsFromOperation<Parts extends readonly unknown[], Name extends string> = Name extends keyof ModelOperationTypeMap<Parts> & string ? Parameters<Extract<ModelOperationTypeMap<Parts>[Name], (...args: any[]) => any>> : unknown[];
|
|
373
|
+
type EventSchemasFromPartialsWithContext<Parts extends readonly unknown[], ModelParts extends readonly unknown[]> = Parts extends readonly [infer H, ...infer T] ? H extends EventClause<infer Name, infer Schema> ? {
|
|
374
|
+
[K in Name]: Schema extends undefined ? unknown : Schema;
|
|
375
|
+
} & EventSchemasFromPartialsWithContext<T, ModelParts> : H extends OnSetClause<infer Name> ? {
|
|
376
|
+
[K in `set:${Name}`]: {
|
|
377
|
+
name: Name;
|
|
378
|
+
old: EventValueFromAttribute<ModelParts, Name>;
|
|
379
|
+
new: EventValueFromAttribute<ModelParts, Name>;
|
|
380
|
+
};
|
|
381
|
+
} & EventSchemasFromPartialsWithContext<T, ModelParts> : H extends OnCallClause<infer Name> ? {
|
|
382
|
+
[K in `call:${Name}`]: {
|
|
383
|
+
name: Name;
|
|
384
|
+
args: EventArgsFromOperation<ModelParts, Name>;
|
|
385
|
+
};
|
|
386
|
+
} & EventSchemasFromPartialsWithContext<T, ModelParts> : H extends WhenClause<infer Name> ? {
|
|
387
|
+
[K in `set:${Name}`]: {
|
|
388
|
+
name: Name;
|
|
389
|
+
old: EventValueFromAttribute<ModelParts, Name>;
|
|
390
|
+
new: EventValueFromAttribute<ModelParts, Name>;
|
|
391
|
+
};
|
|
392
|
+
} & EventSchemasFromPartialsWithContext<T, ModelParts> : H extends TransitionSpec<infer Clauses> ? EventSchemasFromClausesWithContext<Clauses, ModelParts> & EventSchemasFromPartialsWithContext<T, ModelParts> : H extends StateSpec<infer _Name, infer S> ? EventSchemasFromPartialsWithContext<S, ModelParts> & EventSchemasFromPartialsWithContext<T, ModelParts> : EventSchemasFromPartialsWithContext<T, ModelParts> : {};
|
|
393
|
+
type EventSchemasFromClausesWithContext<Clauses extends readonly unknown[], ModelParts extends readonly unknown[]> = Clauses extends readonly [infer H, ...infer T] ? H extends EventClause<infer Name, infer Schema> ? {
|
|
394
|
+
[K in Name]: Schema extends undefined ? unknown : Schema;
|
|
395
|
+
} & EventSchemasFromClausesWithContext<T, ModelParts> : H extends OnSetClause<infer Name> ? {
|
|
396
|
+
[K in `set:${Name}`]: {
|
|
397
|
+
name: Name;
|
|
398
|
+
old: EventValueFromAttribute<ModelParts, Name>;
|
|
399
|
+
new: EventValueFromAttribute<ModelParts, Name>;
|
|
400
|
+
};
|
|
401
|
+
} & EventSchemasFromClausesWithContext<T, ModelParts> : H extends OnCallClause<infer Name> ? {
|
|
402
|
+
[K in `call:${Name}`]: {
|
|
403
|
+
name: Name;
|
|
404
|
+
args: EventArgsFromOperation<ModelParts, Name>;
|
|
405
|
+
};
|
|
406
|
+
} & EventSchemasFromClausesWithContext<T, ModelParts> : H extends WhenClause<infer Name> ? {
|
|
407
|
+
[K in `set:${Name}`]: {
|
|
408
|
+
name: Name;
|
|
409
|
+
old: EventValueFromAttribute<ModelParts, Name>;
|
|
410
|
+
new: EventValueFromAttribute<ModelParts, Name>;
|
|
411
|
+
};
|
|
412
|
+
} & EventSchemasFromClausesWithContext<T, ModelParts> : EventSchemasFromClausesWithContext<T, ModelParts> : {};
|
|
413
|
+
type TransitionFromClauses<Clauses extends readonly unknown[], Owner extends string = string, Source extends string = Owner, Target extends string | undefined = undefined, Events extends string = never, Schemas extends Record<string, unknown> = {}, ModelParts extends readonly unknown[] = readonly unknown[]> = Clauses extends readonly [infer H, ...infer T] ? H extends SourceClause<infer Name> ? TransitionFromClauses<T, Owner, Name, Target, Events, Schemas, ModelParts> : H extends TargetClause<infer Name> ? TransitionFromClauses<T, Owner, Source, Name, Events, Schemas, ModelParts> : H extends EventClause<infer Name, infer Schema> ? TransitionFromClauses<T, Owner, Source, Target, Events | Name, MergeEventMaps<Schemas, {
|
|
414
|
+
[K in Name]: Schema extends undefined ? unknown : Schema;
|
|
415
|
+
}>, ModelParts> : H extends OnSetClause<infer Name> ? TransitionFromClauses<T, Owner, Source, Target, Events | `set:${Name}`, MergeEventMaps<Schemas, {
|
|
416
|
+
[K in `set:${Name}`]: {
|
|
417
|
+
name: Name;
|
|
418
|
+
old: EventValueFromAttribute<ModelParts, Name>;
|
|
419
|
+
new: EventValueFromAttribute<ModelParts, Name>;
|
|
420
|
+
};
|
|
421
|
+
}>, ModelParts> : H extends OnCallClause<infer Name> ? TransitionFromClauses<T, Owner, Source, Target, Events | `call:${Name}`, MergeEventMaps<Schemas, {
|
|
422
|
+
[K in `call:${Name}`]: {
|
|
423
|
+
name: Name;
|
|
424
|
+
args: EventArgsFromOperation<ModelParts, Name>;
|
|
425
|
+
};
|
|
426
|
+
}>, ModelParts> : H extends WhenClause<infer Name> ? TransitionFromClauses<T, Owner, Source, Target, Events | `set:${Name}`, MergeEventMaps<Schemas, {
|
|
427
|
+
[K in `set:${Name}`]: {
|
|
428
|
+
name: Name;
|
|
429
|
+
old: EventValueFromAttribute<ModelParts, Name>;
|
|
430
|
+
new: EventValueFromAttribute<ModelParts, Name>;
|
|
431
|
+
};
|
|
432
|
+
}>, ModelParts> : TransitionFromClauses<T, Owner, Source, Target, Events, Schemas, ModelParts> : {
|
|
433
|
+
owner: Owner;
|
|
434
|
+
source: Source;
|
|
435
|
+
target: Target;
|
|
436
|
+
events: Events;
|
|
437
|
+
schema: Schemas;
|
|
438
|
+
};
|
|
439
|
+
type CollectModelParts<Parts extends readonly unknown[], ParentPath extends string, ModelRoot extends string, AllParts extends readonly unknown[] = Parts> = Parts extends readonly [infer H, ...infer T] ? MergeCollect<InferFromSpec<H, ParentPath, ModelRoot, AllParts>, CollectModelParts<T, ParentPath, ModelRoot, AllParts>> : {
|
|
440
|
+
states: never;
|
|
441
|
+
finalStates: never;
|
|
442
|
+
transitions: never;
|
|
443
|
+
initials: {};
|
|
444
|
+
attributes: {};
|
|
445
|
+
operations: {};
|
|
446
|
+
eventSchemas: {};
|
|
447
|
+
};
|
|
448
|
+
type InferFromSpec<Spec, ParentPath extends string, ModelRoot extends string, AllParts extends readonly unknown[]> = Spec extends StateSpec<infer Name, infer P> ? StateFromSpec<Name, P, ParentPath, ModelRoot, AllParts> : Spec extends FinalSpec<infer Name> ? FinalFromSpec<Name, ParentPath> : Spec extends TransitionSpec<infer Clauses> ? TransitionFromSpec<Clauses, ParentPath, ModelRoot, AllParts> : Spec extends InitialSpec<infer Clauses> ? InitialFromSpec<Clauses, ParentPath, ModelRoot, AllParts> : Spec extends AttributeSpec<infer Name, infer Value> ? {
|
|
449
|
+
states: never;
|
|
450
|
+
finalStates: never;
|
|
451
|
+
transitions: never;
|
|
452
|
+
initials: {};
|
|
453
|
+
attributes: {
|
|
454
|
+
[K in Name]: Value;
|
|
455
|
+
};
|
|
456
|
+
operations: {};
|
|
457
|
+
eventSchemas: {};
|
|
458
|
+
} : Spec extends OperationSpec<infer Name, infer Fn> ? {
|
|
459
|
+
states: never;
|
|
460
|
+
finalStates: never;
|
|
461
|
+
transitions: never;
|
|
462
|
+
initials: {};
|
|
463
|
+
attributes: {};
|
|
464
|
+
operations: {
|
|
465
|
+
[K in Name]: Fn;
|
|
466
|
+
};
|
|
467
|
+
eventSchemas: {};
|
|
468
|
+
} : Spec extends ShallowHistorySpec<infer Name, infer P> ? StateAliasFromPseudo<Name, P, ParentPath, ModelRoot, AllParts> : Spec extends DeepHistorySpec<infer Name, infer P> ? StateAliasFromPseudo<Name, P, ParentPath, ModelRoot, AllParts> : Spec extends ChoiceSpec<infer Name, infer P> ? StateAliasFromPseudo<Name, P, ParentPath, ModelRoot, AllParts> : {
|
|
469
|
+
states: never;
|
|
470
|
+
finalStates: never;
|
|
471
|
+
transitions: never;
|
|
472
|
+
initials: {};
|
|
473
|
+
attributes: {};
|
|
474
|
+
operations: {};
|
|
475
|
+
eventSchemas: {};
|
|
476
|
+
};
|
|
477
|
+
type StateAliasFromPseudo<Name extends string, Parts extends readonly unknown[], ParentPath extends string, ModelRoot extends string, AllParts extends readonly unknown[]> = StateFromSpec<Name, Parts, ParentPath, ModelRoot, AllParts>;
|
|
478
|
+
type StateFromSpec<Name extends string, Parts extends readonly unknown[], ParentPath extends string, ModelRoot extends string, AllParts extends readonly unknown[]> = {
|
|
479
|
+
states: ResolvePathExpression<ParentPath, Name> | ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['states'];
|
|
480
|
+
finalStates: ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['finalStates'];
|
|
481
|
+
transitions: ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['transitions'];
|
|
482
|
+
initials: ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['initials'];
|
|
483
|
+
attributes: ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['attributes'];
|
|
484
|
+
operations: ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['operations'];
|
|
485
|
+
eventSchemas: ChildTransitionsFromParts<Parts, ResolvePathExpression<ParentPath, Name>, ModelRoot, AllParts>['eventSchemas'];
|
|
486
|
+
};
|
|
487
|
+
type ChildTransitionsFromParts<Parts extends readonly unknown[], ParentPath extends string, ModelRoot extends string, AllParts extends readonly unknown[]> = CollectModelParts<Parts, ParentPath, ModelRoot, AllParts>;
|
|
488
|
+
type FinalFromSpec<Name extends string, ParentPath extends string> = {
|
|
489
|
+
states: ResolvePathExpression<ParentPath, Name>;
|
|
490
|
+
finalStates: ResolvePathExpression<ParentPath, Name>;
|
|
491
|
+
transitions: never;
|
|
492
|
+
initials: {};
|
|
493
|
+
attributes: {};
|
|
494
|
+
operations: {};
|
|
495
|
+
eventSchemas: {};
|
|
496
|
+
};
|
|
497
|
+
type TransitionFromSpec<Clauses extends readonly unknown[], OwnerPath extends string, ModelRoot extends string, ModelParts extends readonly unknown[]> = {
|
|
498
|
+
states: never;
|
|
499
|
+
finalStates: never;
|
|
500
|
+
transitions: NormalizeTransition<TransitionFromClauses<Clauses, OwnerPath, OwnerPath, undefined, never, {}, ModelParts>, OwnerPath, ModelRoot>;
|
|
501
|
+
attributes: {};
|
|
502
|
+
operations: {};
|
|
503
|
+
eventSchemas: EventSchemasFromClausesWithContext<Clauses, ModelParts>;
|
|
504
|
+
initials: {};
|
|
505
|
+
};
|
|
506
|
+
type InitialsFromClauses<Clauses extends readonly unknown[], OwnerPath extends string, ModelRoot extends string> = NormalizeTransition<TransitionFromClauses<Clauses, OwnerPath, OwnerPath>, OwnerPath, ModelRoot>['target'] extends infer Target ? Target extends string ? {
|
|
507
|
+
[K in OwnerPath]: Target;
|
|
508
|
+
} : {} : {};
|
|
509
|
+
type InitialFromSpec<Clauses extends readonly unknown[], OwnerPath extends string, ModelRoot extends string, ModelParts extends readonly unknown[]> = {
|
|
510
|
+
states: never;
|
|
511
|
+
finalStates: never;
|
|
512
|
+
transitions: NormalizeTransition<TransitionFromClauses<Clauses, OwnerPath, OwnerPath, undefined, never, {}, ModelParts>, OwnerPath, ModelRoot>;
|
|
513
|
+
initials: InitialsFromClauses<Clauses, OwnerPath, ModelRoot>;
|
|
514
|
+
attributes: {};
|
|
515
|
+
operations: {};
|
|
516
|
+
eventSchemas: EventSchemasFromClausesWithContext<Clauses, ModelParts>;
|
|
517
|
+
};
|
|
518
|
+
type NormalizeTransition<T extends {
|
|
519
|
+
owner: string;
|
|
520
|
+
source: string;
|
|
521
|
+
target: string | undefined;
|
|
522
|
+
events: string;
|
|
523
|
+
schema: Record<string, unknown>;
|
|
524
|
+
}, Owner extends string, Root extends string> = {
|
|
525
|
+
source: ResolveModelPathExpression<Owner, Root, T['source']>;
|
|
526
|
+
target: T['target'] extends string ? ResolveModelPathExpression<Owner, Root, T['target']> : undefined;
|
|
527
|
+
events: T['events'];
|
|
528
|
+
schema: T['schema'];
|
|
529
|
+
};
|
|
530
|
+
type MergeCollect<A, B> = {
|
|
531
|
+
states: A extends {
|
|
532
|
+
states: infer AS;
|
|
533
|
+
} ? (B extends {
|
|
534
|
+
states: infer BS;
|
|
535
|
+
} ? AS | BS : AS) : never;
|
|
536
|
+
finalStates: A extends {
|
|
537
|
+
finalStates: infer AF;
|
|
538
|
+
} ? (B extends {
|
|
539
|
+
finalStates: infer BF;
|
|
540
|
+
} ? AF | BF : AF) : never;
|
|
541
|
+
transitions: A extends {
|
|
542
|
+
transitions: infer AT;
|
|
543
|
+
} ? (B extends {
|
|
544
|
+
transitions: infer BT;
|
|
545
|
+
} ? AT | BT : AT) : never;
|
|
546
|
+
initials: A extends {
|
|
547
|
+
initials: infer AI;
|
|
548
|
+
} ? B extends {
|
|
549
|
+
initials: infer BI;
|
|
550
|
+
} ? MergeEventMaps<AI & Record<string, string>, BI & Record<string, string>> : AI : never;
|
|
551
|
+
attributes: A extends {
|
|
552
|
+
attributes: infer AA;
|
|
553
|
+
} ? B extends {
|
|
554
|
+
attributes: infer BA;
|
|
555
|
+
} ? MergeEventMaps<AA & Record<string, unknown>, BA & Record<string, unknown>> : AA : never;
|
|
556
|
+
operations: A extends {
|
|
557
|
+
operations: infer AO;
|
|
558
|
+
} ? B extends {
|
|
559
|
+
operations: infer BO;
|
|
560
|
+
} ? MergeEventMaps<AO & Record<string, (...args: any[]) => any>, BO & Record<string, (...args: any[]) => any>> : AO : never;
|
|
561
|
+
eventSchemas: A extends {
|
|
562
|
+
eventSchemas: infer AE;
|
|
563
|
+
} ? B extends {
|
|
564
|
+
eventSchemas: infer BE;
|
|
565
|
+
} ? MergeEventMaps<AE & Record<string, unknown>, BE & Record<string, unknown>> : AE : never;
|
|
566
|
+
};
|
|
567
|
+
type ModelStateMetaFromParts<RootPath extends string, Parts extends readonly unknown[]> = {
|
|
568
|
+
name: RootPath;
|
|
569
|
+
states: (CollectModelParts<Parts, RootPath, RootPath, Parts>['states']) & string;
|
|
570
|
+
finalStates: (CollectModelParts<Parts, RootPath, RootPath, Parts>['finalStates']) & string;
|
|
571
|
+
transitions: CollectModelParts<Parts, RootPath, RootPath, Parts>['transitions'];
|
|
572
|
+
initials: CollectModelParts<Parts, RootPath, RootPath, Parts>['initials'];
|
|
573
|
+
attributes: InferredAttributes<Parts>;
|
|
574
|
+
operations: InferredOperations<Parts>;
|
|
575
|
+
eventSchemas: MergeEventMaps<EventSchemasFromPartialsWithContext<Parts, Parts>, EventSchemaFromTransitions<CollectModelParts<Parts, RootPath, RootPath, Parts>['transitions']>>;
|
|
576
|
+
};
|
|
577
|
+
type EventSchemaFromTransitions<Transitions> = [
|
|
578
|
+
Transitions
|
|
579
|
+
] extends [never] ? {} : {
|
|
580
|
+
[Name in TransitionEventNames<Transitions>]: EventSchemaForTransitionEvent<Transitions, Name>;
|
|
581
|
+
};
|
|
582
|
+
type TransitionEventNames<Transitions> = Transitions extends {
|
|
583
|
+
events: infer EventName;
|
|
584
|
+
} ? EventName & string : never;
|
|
585
|
+
type EventSchemaForTransitionEvent<Transitions, EventName extends string> = Transitions extends infer Transition ? Transition extends {
|
|
586
|
+
events: infer E;
|
|
587
|
+
schema: infer S;
|
|
588
|
+
} ? EventName extends E ? S extends Record<string, unknown> ? EventName extends keyof S ? S[EventName] : unknown : unknown : never : never : never;
|
|
589
|
+
type EventFromSchemaMap<SchemaMap extends Record<string, unknown>> = {
|
|
590
|
+
[Name in keyof SchemaMap & string]: Event<Name, SchemaMap[Name]>;
|
|
591
|
+
}[keyof SchemaMap & string];
|
|
592
|
+
type EventUnionFromMap<SchemaMap> = SchemaMap extends Record<string, unknown> ? EventFromSchemaMap<SchemaMap> : never;
|
|
593
|
+
type EventUnionFromTransitions<Transitions> = TransitionEventNames<Transitions> extends infer Name ? Name extends string ? Event<Name, EventSchemaForTransitionEvent<Transitions, Name>> : never : never;
|
|
594
|
+
type ModelEventSchemas<M> = ModelStateMeta<M> extends {
|
|
595
|
+
eventSchemas: infer E;
|
|
596
|
+
} ? E extends Record<string, unknown> ? E : ModelEventMap<M> : ModelEventMap<M>;
|
|
597
|
+
type EventMapKeys<M> = keyof ModelEventSchemas<M> & string;
|
|
598
|
+
type EventSchemaFromMapFor<M, N extends string> = ModelEventMap<M> extends infer E ? E extends Record<string, unknown> ? N extends keyof E ? E[N] : never : never : never;
|
|
599
|
+
type EventSchemaFromTransitionsFor<M, N extends string> = EventSchemaForTransitionEvent<TransitionMetaModel<M>, N>;
|
|
600
|
+
type EventSchemaFor<M, N extends string> = N extends EventMapKeys<M> ? [EventSchemaFromTransitionsFor<M, N>] extends [never] ? [EventSchemaFromMapFor<M, N>] extends [never] ? unknown : EventSchemaFromMapFor<M, N> : EventSchemaFromTransitionsFor<M, N> : unknown;
|
|
601
|
+
type StatePathsOfModel<M> = ModelStateMeta<M>['states'];
|
|
602
|
+
type FinalStatePathsOfModel<M> = ModelStateMeta<M>['finalStates'];
|
|
603
|
+
type TransitionMetaModel<M> = ModelStateMeta<M>['transitions'];
|
|
604
|
+
type EventNamesFromMap<M> = Exclude<EventMapKeys<M>, never>;
|
|
605
|
+
type EventNamesFromTransitions<M> = Exclude<TransitionMetaModel<M>, never> extends infer T ? T extends {
|
|
606
|
+
events: infer E;
|
|
607
|
+
} ? E : never : never;
|
|
608
|
+
type CompletionStateCandidates<M> = FinalStatePathsOfModel<M> extends infer FinalPath ? FinalPath extends string ? ParentPath<FinalPath> : never : never;
|
|
609
|
+
type StatePathsOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = StatePathsOfModel<M>;
|
|
610
|
+
type RelativeStatePathsOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = RelativeFromAbsolute<StatePathsOf<M>>;
|
|
611
|
+
type LeafStatesOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = StatePathsOf<M> extends infer StatePath ? StatePath extends string ? HasStateDescendant<StatePath, StatePathsOf<M>> extends true ? never : StatePath : never : never;
|
|
612
|
+
type HasStateDescendant<StatePath extends string, Set extends string> = Set extends `${StatePath}/${string}` ? true : false;
|
|
613
|
+
type AttributesOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = ModelStateMeta<M> extends {
|
|
614
|
+
attributes: infer A;
|
|
615
|
+
} ? A extends Record<string, unknown> ? A : {} : {};
|
|
616
|
+
type AttributeKeysOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = keyof AttributesOf<M> & string;
|
|
617
|
+
type OperationsOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = ModelStateMeta<M> extends {
|
|
618
|
+
operations: infer O;
|
|
619
|
+
} ? O : ModelOperationMap<M>;
|
|
620
|
+
type OperationKeysOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = keyof OperationsOf<M> & string;
|
|
621
|
+
type CallableOperationKeysOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = OperationKeysOf<M>;
|
|
622
|
+
type GuardOperationKeysOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = {
|
|
623
|
+
[K in OperationKeysOf<M>]: IsAny<ReturnType<Extract<OperationsOf<M>[K], (...args: any[]) => any>>> extends true ? never : ReturnType<Extract<OperationsOf<M>[K], (...args: any[]) => any>> extends boolean ? K : never;
|
|
624
|
+
}[OperationKeysOf<M>];
|
|
625
|
+
type FinalStatesOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = FinalStatePathsOfModel<M>;
|
|
626
|
+
type IsFinalState<M extends TypedModel<any, any, any, any, any, any, any, any>, Path extends string> = Path extends FinalStatePathsOfModel<M> ? true : false;
|
|
627
|
+
type CompletionStatePathsOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = CompletionStateCandidates<M>;
|
|
628
|
+
type DoneEventNamesOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = CompletionStatePathsOf<M> extends infer CompletionPath ? CompletionPath extends string ? `done:${CompletionPath}` : never : never;
|
|
629
|
+
type DoneEventOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = DoneEventNamesOf<M> extends infer Name ? Name extends string ? Event<Name> : never : never;
|
|
630
|
+
type CompletionEventsOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = DoneEventOf<M>;
|
|
631
|
+
type EventNamesFromState<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = TransitionMetaModel<M> extends infer T ? T extends {
|
|
632
|
+
source: StatePath;
|
|
633
|
+
events: infer E;
|
|
634
|
+
} ? E : never : never;
|
|
635
|
+
type EventsForState<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = EventOfName<M, EventNamesFromState<M, StatePath>>;
|
|
636
|
+
type EventNamesOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = Exclude<EventNamesFromMap<M>, DoneEventNamesOf<M>>;
|
|
637
|
+
type EventOfName<M extends TypedModel<any, any, any, any, any, any, any, any>, Name extends string> = Name extends EventNamesOf<M> ? Event<Name, EventSchemaFor<M, Name>> : never;
|
|
638
|
+
type DispatchEvent<Name extends string = string, Data = unknown> = Omit<Event<Name, Data>, 'data'> & {
|
|
639
|
+
readonly data?: Data;
|
|
640
|
+
};
|
|
641
|
+
type DispatchEventOfName<M extends TypedModel<any, any, any, any, any, any, any, any>, Name extends string> = Name extends EventNamesOf<M> ? EventOfName<M, Name> extends Event<Name, infer Data> ? DispatchEvent<Name, Data> : never : never;
|
|
642
|
+
type DispatchEventsOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = DispatchEventOfName<M, EventNamesOf<M>>;
|
|
643
|
+
type TargetsFromState<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = TransitionMetaModel<M> extends infer T ? T extends {
|
|
644
|
+
source: StatePath;
|
|
645
|
+
events: infer _;
|
|
646
|
+
target: infer Target;
|
|
647
|
+
} ? Target extends string ? Target : never : never : never;
|
|
648
|
+
type TargetsFromStateAndEvent<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string, EventName extends string> = TransitionMetaModel<M> extends infer T ? T extends {
|
|
649
|
+
source: StatePath;
|
|
650
|
+
events: infer E;
|
|
651
|
+
target: infer Target;
|
|
652
|
+
} ? EventName extends E ? (Target extends string ? Target : never) : never : never : never;
|
|
653
|
+
type SourcesForEvent<M extends TypedModel<any, any, any, any, any, any, any, any>, EventName extends string> = TransitionMetaModel<M> extends infer T ? T extends {
|
|
654
|
+
source: infer Source;
|
|
655
|
+
events: infer E;
|
|
656
|
+
} ? EventName extends E ? Source : never : never : never;
|
|
657
|
+
type CanTransition<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string, TargetPath extends string, EventName extends string> = TargetPath extends TargetsFromStateAndEvent<M, StatePath, EventName> ? true : false;
|
|
658
|
+
type ChildrenOf<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = StatePathsOf<M> extends infer Candidate ? Candidate extends string ? ParentPath<Candidate> extends StatePath ? Candidate : never : never : never;
|
|
659
|
+
type ParentOf<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = ParentPath<StatePath>;
|
|
660
|
+
type DescendantsOf<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = StatePathsOf<M> extends infer Candidate ? Candidate extends `${StatePath}/${string}` ? Candidate : never : never;
|
|
661
|
+
type AncestorsOf<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = StatePathsOf<M> extends infer Candidate ? Candidate extends string ? IsStatePathPrefix<Candidate, StatePath> extends true ? Candidate : never : never : never;
|
|
662
|
+
type InitialStateOf<M extends TypedModel<any, any, any, any, any, any, any, any>, StatePath extends string> = StatePath extends string ? Extract<InitialStateCandidates<M>[StatePath], string> : never;
|
|
663
|
+
type InitialStateCandidates<M extends TypedModel<any, any, any, any, any, any, any, any>> = ModelStateMeta<M>['initials'];
|
|
664
|
+
type SnapshotOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = {
|
|
665
|
+
id: string;
|
|
666
|
+
qualifiedName: string;
|
|
667
|
+
state: StatePathsOf<M>;
|
|
668
|
+
attributes: AttributesOf<M>;
|
|
669
|
+
queueLen: number;
|
|
670
|
+
events: EventSnapshotOf<M>[];
|
|
671
|
+
};
|
|
672
|
+
type EventTargetForName<M extends TypedModel<any, any, any, any, any, any, any, any>, EventName extends string> = TransitionMetaModel<M> extends infer T ? T extends {
|
|
673
|
+
events: infer E;
|
|
674
|
+
target: infer Target;
|
|
675
|
+
} ? EventName extends E ? Target : never : never : never;
|
|
676
|
+
type EventSnapshotOf<M extends TypedModel<any, any, any, any, any, any, any, any>> = {
|
|
677
|
+
[Name in EventNamesFromTransitions<M>]: {
|
|
678
|
+
event: Name;
|
|
679
|
+
target: EventTargetForName<M, Name>;
|
|
680
|
+
guard: boolean;
|
|
681
|
+
schema?: EventSchemaFor<M, Name>;
|
|
682
|
+
};
|
|
683
|
+
}[EventNamesFromTransitions<M>];
|
|
684
|
+
type BehaviorCallbackFor<M extends TypedModel<any, any, any, any, any, any, any, any>> = (ctx: Context, instance: M['__hsm_instance'] & Instance, event: EventOfName<M, EventNamesOf<M> & string>) => unknown;
|
|
685
|
+
type OperationSignature<M extends TypedModel<any, any, any, any, any, any, any, any>, K extends keyof OperationsOf<M> & string> = Extract<OperationsOf<M>[K], (...args: any[]) => any>;
|
|
686
|
+
type MachineInstanceFor<M extends TypedModel<any, any, any, any, any, any, any, Instance>, I extends Instance> = M extends TypedModel<infer A, infer O, any, any, any, any, any, any> ? Omit<I, "dispatch" | "state" | "takeSnapshot" | "get" | "set" | "call"> & {
|
|
687
|
+
__hsm_model: M;
|
|
688
|
+
dispatch(event: DispatchEventsOf<M>): void;
|
|
689
|
+
state(): StatePathsOf<M>;
|
|
690
|
+
takeSnapshot(): SnapshotOf<M>;
|
|
691
|
+
get<K extends keyof A & string>(name: K): A[K];
|
|
692
|
+
get(name: string): unknown;
|
|
693
|
+
set<K extends keyof A & string>(name: K, value: A[K]): void;
|
|
694
|
+
set(name: string, value: unknown): void;
|
|
695
|
+
call<K extends keyof O & string>(name: K, ...args: Parameters<Extract<O[K], (...args: any[]) => any>>): ReturnType<Extract<O[K], (...args: any[]) => any>>;
|
|
696
|
+
call(name: string, ...args: unknown[]): unknown;
|
|
697
|
+
} : never;
|
|
698
|
+
type FlattenGroupMember<Member> = Member extends Group<infer Members> ? FlattenGroupMembers<Members> : [Member];
|
|
699
|
+
type FlattenGroupMembers<Members extends readonly unknown[]> = Members extends readonly [infer Head, ...infer Tail] ? [
|
|
700
|
+
...FlattenGroupMember<Head>,
|
|
701
|
+
...FlattenGroupMembers<Tail>
|
|
702
|
+
] : [];
|
|
703
|
+
type GroupModelOf<Member> = Member extends {
|
|
704
|
+
__hsm_model: infer Model;
|
|
705
|
+
} ? Model extends TypedModel<any, any, any, any, any, any, any, any> ? Model : never : never;
|
|
706
|
+
type GroupDispatchEventOf<Member> = GroupModelOf<Member> extends infer Model extends TypedModel<any, any, any, any, any, any, any, any> ? DispatchEventsOf<Model> : Member extends {
|
|
707
|
+
dispatch(event: infer Event): void;
|
|
708
|
+
} ? Event : EventRecord;
|
|
709
|
+
type GroupAttributeKeysOf<Member> = GroupModelOf<Member> extends infer Model extends TypedModel<any, any, any, any, any, any, any, any> ? AttributeKeysOf<Model> : string;
|
|
710
|
+
type GroupAttributeValueOf<Member, Key extends string> = GroupModelOf<Member> extends infer Model extends TypedModel<any, any, any, any, any, any, any, any> ? Key extends AttributeKeysOf<Model> ? AttributesOf<Model>[Key] : never : unknown;
|
|
711
|
+
type SharedAttributeKeysOfFlattenedMembers<Members extends readonly unknown[]> = Members extends readonly [infer Head, ...infer Tail] ? GroupAttributeKeysOf<Head> & SharedAttributeKeysOfFlattenedMembers<Tail> : string;
|
|
712
|
+
type SharedAttributeKeysOfGroupMembers<Members extends readonly unknown[]> = SharedAttributeKeysOfFlattenedMembers<FlattenGroupMembers<Members>>;
|
|
713
|
+
type SharedAttributeValueOfFlattenedMembers<Members extends readonly unknown[], Key extends string> = Members extends readonly [infer Head, ...infer Tail] ? GroupAttributeValueOf<Head, Key> & SharedAttributeValueOfFlattenedMembers<Tail, Key> : unknown;
|
|
714
|
+
type SharedAttributeValueOfGroupMembers<Members extends readonly unknown[], Key extends string> = SharedAttributeValueOfFlattenedMembers<FlattenGroupMembers<Members>, Key>;
|
|
715
|
+
type FirstGroupMember<Members extends readonly unknown[]> = FlattenGroupMembers<Members> extends readonly [infer Head, ...infer _Tail] ? Head : never;
|
|
716
|
+
type GroupOperationKeysOf<Member> = GroupModelOf<Member> extends infer Model extends TypedModel<any, any, any, any, any, any, any, any> ? OperationKeysOf<Model> : string;
|
|
717
|
+
type GroupOperationSignatureOf<Member, Key extends string> = GroupModelOf<Member> extends infer Model extends TypedModel<any, any, any, any, any, any, any, any> ? Key extends OperationKeysOf<Model> ? OperationSignature<Model, Key> : (...args: any[]) => unknown : (...args: any[]) => unknown;
|
|
718
|
+
type GroupEventUnion<Members extends readonly unknown[]> = FlattenGroupMembers<Members>[number] extends infer Member ? Member extends unknown ? GroupDispatchEventOf<Member> : never : never;
|
|
719
|
+
type GroupOperationKeys<Members extends readonly unknown[]> = GroupOperationKeysOf<FirstGroupMember<Members>>;
|
|
720
|
+
type GroupOperationSignature<Members extends readonly unknown[], Key extends string> = GroupOperationSignatureOf<FirstGroupMember<Members>, Key>;
|
|
721
|
+
type GroupSnapshotOfMember<Member> = GroupModelOf<Member> extends infer Model extends TypedModel<any, any, any, any, any, any, any, any> ? SnapshotOf<Model> : Member extends {
|
|
722
|
+
takeSnapshot(): infer CurrentSnapshot;
|
|
723
|
+
} ? CurrentSnapshot : Snapshot;
|
|
724
|
+
type GroupSnapshotsOfFlattenedMembers<Members extends readonly unknown[]> = Members extends readonly [infer Head, ...infer Tail] ? [
|
|
725
|
+
GroupSnapshotOfMember<Head>,
|
|
726
|
+
...GroupSnapshotsOfFlattenedMembers<Tail>
|
|
727
|
+
] : [];
|
|
728
|
+
type GroupSnapshotOf<Members extends readonly unknown[]> = Snapshot & {
|
|
729
|
+
members: GroupSnapshotsOfFlattenedMembers<FlattenGroupMembers<Members>>;
|
|
730
|
+
};
|
|
731
|
+
type BuilderWithSpec<Signature, Spec> = Signature & {
|
|
732
|
+
readonly __hsmSpec: Spec;
|
|
733
|
+
};
|
|
734
|
+
type BehaviorArgument<EventType extends EventRecord = EventRecord> = ((ctx: Context, instance: Instance, evt: EventType) => unknown) | string;
|
|
735
|
+
|
|
736
|
+
declare function join(...segments: string[]): string;
|
|
737
|
+
declare function dirname(path: string): string;
|
|
738
|
+
declare function isAbsolute(path: string): boolean;
|
|
739
|
+
declare class Context {
|
|
740
|
+
listeners: Array<() => void>;
|
|
741
|
+
instances: Record<string, Instance>;
|
|
742
|
+
done: boolean;
|
|
743
|
+
constructor();
|
|
744
|
+
addEventListener(_type: "done", listener: () => void): void;
|
|
745
|
+
removeEventListener(_type: "done", listener: () => void): void;
|
|
746
|
+
}
|
|
747
|
+
declare const InitialEvent: {
|
|
748
|
+
kind: number;
|
|
749
|
+
qualifiedName: string;
|
|
750
|
+
name: string;
|
|
751
|
+
};
|
|
752
|
+
declare const FinalEvent: {
|
|
753
|
+
name: string;
|
|
754
|
+
kind: number;
|
|
755
|
+
};
|
|
756
|
+
declare const ErrorEvent: {
|
|
757
|
+
name: string;
|
|
758
|
+
kind: number;
|
|
759
|
+
};
|
|
760
|
+
declare const DefaultClock: Required<ClockConfig>;
|
|
761
|
+
declare function event<Name extends string = string, Schema = unknown>(name: Name, schema?: Schema): Event<Name, Schema>;
|
|
762
|
+
declare function apply(model: Model, stack: Array<AnyModelElement>, partials: ReadonlyArray<(model: Model, stack: Array<AnyModelElement>) => unknown>): void;
|
|
763
|
+
declare function isAncestor(ancestor: string, descendant: string): boolean;
|
|
764
|
+
declare function lca(a: string, b: string): string;
|
|
765
|
+
type AfterBucket = "entered" | "exited" | "processed" | "dispatched" | "executed";
|
|
766
|
+
declare class Queue {
|
|
767
|
+
front: EventRecord[];
|
|
768
|
+
back: Array<EventRecord | undefined>;
|
|
769
|
+
backHead: number;
|
|
770
|
+
len(): number;
|
|
771
|
+
pop(): EventRecord | undefined;
|
|
772
|
+
push(...events: EventRecord[]): void;
|
|
773
|
+
}
|
|
774
|
+
type InstanceConstructor = {
|
|
775
|
+
new (): Instance;
|
|
776
|
+
(this: Instance): void;
|
|
777
|
+
prototype: Instance;
|
|
778
|
+
};
|
|
779
|
+
interface Instance {
|
|
780
|
+
_hsm: HSM | null;
|
|
781
|
+
dispatch(event: EventRecord): void;
|
|
782
|
+
state(): string;
|
|
783
|
+
context(): Context;
|
|
784
|
+
clock(): Required<ClockConfig>;
|
|
785
|
+
get(name: string): unknown;
|
|
786
|
+
set(name: string, value: unknown): void;
|
|
787
|
+
call(name: string, ...args: unknown[]): unknown;
|
|
788
|
+
restart(data?: unknown): void;
|
|
789
|
+
takeSnapshot(): Snapshot;
|
|
790
|
+
}
|
|
791
|
+
declare const Instance: InstanceConstructor;
|
|
792
|
+
declare class HSM {
|
|
793
|
+
static id: number;
|
|
794
|
+
private runtime;
|
|
795
|
+
private instance;
|
|
796
|
+
private ctx;
|
|
797
|
+
private model;
|
|
798
|
+
private currentState;
|
|
799
|
+
private queue;
|
|
800
|
+
private active;
|
|
801
|
+
private processing;
|
|
802
|
+
private id;
|
|
803
|
+
private name;
|
|
804
|
+
private attributes;
|
|
805
|
+
private historyShallow;
|
|
806
|
+
private historyDeep;
|
|
807
|
+
private after;
|
|
808
|
+
private clock;
|
|
809
|
+
private startData;
|
|
810
|
+
constructor(ctxOrInstance: Context | Instance, instanceOrModel: Model | Instance, maybeModelOrConfig: Model | Config | undefined, maybeConfig?: Config);
|
|
811
|
+
start(): this;
|
|
812
|
+
state(): string;
|
|
813
|
+
private resetAttributes;
|
|
814
|
+
private notify;
|
|
815
|
+
onAfter(bucket: AfterBucket, key: string, listener: () => void): void;
|
|
816
|
+
private get;
|
|
817
|
+
private set;
|
|
818
|
+
private call;
|
|
819
|
+
private invoke;
|
|
820
|
+
restart(data?: unknown): void;
|
|
821
|
+
private takeSnapshot;
|
|
822
|
+
private recordHistory;
|
|
823
|
+
private followHistoryDefault;
|
|
824
|
+
dispatch(event: EventRecord): void;
|
|
825
|
+
private process;
|
|
826
|
+
private transition;
|
|
827
|
+
private enter;
|
|
828
|
+
private exit;
|
|
829
|
+
private execute;
|
|
830
|
+
private terminate;
|
|
831
|
+
stop(): void;
|
|
832
|
+
}
|
|
833
|
+
declare function find(stack: AnyModelElement[], ...kindsToMatch: Kind[]): AnyModelElement | undefined;
|
|
834
|
+
declare function start<M extends TypedModel<any, any, any, any, any, any, any, Instance>, ModelInstance extends NonNullable<M['__hsm_instance']> & Instance = NonNullable<M['__hsm_instance']> & Instance>(instance: ModelInstance, model: M, maybeConfig?: Config): MachineInstanceFor<M, ModelInstance>;
|
|
835
|
+
declare function start<M extends TypedModel<any, any, any, any, any, any, any, Instance>, ModelInstance extends NonNullable<M['__hsm_instance']> & Instance = NonNullable<M['__hsm_instance']> & Instance>(ctx: Context, instance: ModelInstance, model: M, maybeConfig?: Config): MachineInstanceFor<M, ModelInstance>;
|
|
836
|
+
declare function stop(instance: Instance): void;
|
|
837
|
+
declare function state<Name extends string, const Parts extends readonly ModelElementSpec[] = readonly ModelElementSpec[]>(name: Name, ...partials: BuilderTuple<ValidateStateLocalSpecs<Parts>>): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => State, StateSpec<Name, Parts>>;
|
|
838
|
+
declare function initial<const Clauses extends readonly TransitionBuilderClause[] = readonly TransitionBuilderClause[]>(...partials: TransitionBuilderTuple<Clauses>): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => Transition | undefined, InitialSpec<Clauses>>;
|
|
839
|
+
declare function initial<Name extends string, const Clauses extends readonly TransitionBuilderClause[] = readonly TransitionBuilderClause[]>(name: Name, ...partials: TransitionBuilderTuple<Clauses>): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => Transition | undefined, InitialSpec<Clauses>>;
|
|
840
|
+
declare function transition<const Clauses extends readonly TransitionBuilderClause[] = readonly TransitionBuilderClause[]>(...partials: TransitionBuilderTuple<Clauses>): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => Transition, TransitionSpec<Clauses>>;
|
|
841
|
+
declare function source<Name extends string>(name: Name): BuilderWithSpec<(model: any, stack: any) => unknown, SourceClause<Name>>;
|
|
842
|
+
declare function target<Name extends string>(name: Name): BuilderWithSpec<(model: any, stack: any) => unknown, TargetClause<Name>>;
|
|
843
|
+
declare function on<Name extends string>(eventName: Name): BuilderWithSpec<(model: any, stack: any) => unknown, EventClause<Name, unknown>>;
|
|
844
|
+
declare function on<Name extends string, Schema = unknown>(eventRecord: Event<Name, Schema>): BuilderWithSpec<(model: any, stack: any) => unknown, EventClause<Name, Schema>>;
|
|
845
|
+
declare function onSet<Name extends string>(name: Name): BuilderWithSpec<(model: any, stack: any) => unknown, OnSetClause<Name>>;
|
|
846
|
+
declare function onCall<Name extends string>(name: Name): BuilderWithSpec<(model: any, stack: any) => unknown, OnCallClause<Name>>;
|
|
847
|
+
declare function when<Name extends string>(expr: Name): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, WhenClause<Name>>;
|
|
848
|
+
declare function entry<EventType extends EventRecord = EventRecord, const Operations extends readonly BehaviorArgument<EventType>[] = readonly BehaviorArgument<EventType>[]>(...operations: Operations): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => State, EntrySpec<Operations>>;
|
|
849
|
+
declare function exit<EventType extends EventRecord = EventRecord, const Operations extends readonly BehaviorArgument<EventType>[] = readonly BehaviorArgument<EventType>[]>(...operations: Operations): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => State, ExitSpec<Operations>>;
|
|
850
|
+
declare function activity<EventType extends EventRecord = EventRecord, const Operations extends readonly BehaviorArgument<EventType>[] = readonly BehaviorArgument<EventType>[]>(...operations: Operations): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => State, ActivitySpec<Operations>>;
|
|
851
|
+
declare function effect<const Operations extends readonly BehaviorArgument[]>(...operations: Operations): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => Transition, EffectClause<Operations>>;
|
|
852
|
+
declare function guard<Name extends string>(expression: Name): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, GuardClause<Name>>;
|
|
853
|
+
declare function guard<EventType extends EventRecord>(expression: (ctx: Context, instance: Instance, event: EventType) => boolean): GuardBuilder<EventType>;
|
|
854
|
+
declare function attribute<Name extends string, Value = unknown>(name: Name, maybeDefault?: Value): BuilderWithSpec<(model: Model) => unknown, AttributeSpec<Name, Value>>;
|
|
855
|
+
declare function operation<Name extends string, Fn extends Function>(name: Name, implementation: Fn): BuilderWithSpec<(model: Model) => unknown, OperationSpec<Name, Extract<Fn, (...args: any[]) => any>>>;
|
|
856
|
+
declare function after<Name extends string>(duration: Name): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, AfterClause<Name>>;
|
|
857
|
+
declare function after(duration: TimeExpression): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, AfterClause<TimeExpression>>;
|
|
858
|
+
declare function every<Name extends string>(duration: Name): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, EveryClause<Name>>;
|
|
859
|
+
declare function every(duration: TimeExpression): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, EveryClause<TimeExpression>>;
|
|
860
|
+
declare function at<Name extends string>(timepoint: Name): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, AtClause<Name>>;
|
|
861
|
+
declare function at(timepoint: ((ctx: Context, instance: Instance, evt: EventRecord) => number | Date | Promise<number> | Promise<Date>)): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, AtClause<TimeExpression>>;
|
|
862
|
+
declare function defer<const EventNames extends readonly string[]>(...eventNames: EventNames): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => unknown, DeferSpec<EventNames>>;
|
|
863
|
+
declare function final<Name extends string>(name: Name): BuilderWithSpec<(model: Model, stack: AnyModelElement[]) => {
|
|
864
|
+
qualifiedName: string;
|
|
865
|
+
kind: number;
|
|
866
|
+
entry: any[];
|
|
867
|
+
exit: any[];
|
|
868
|
+
activities: any[];
|
|
869
|
+
deferred: any[];
|
|
870
|
+
transitions: any[];
|
|
871
|
+
initial: any;
|
|
872
|
+
}, FinalSpec<Name>>;
|
|
873
|
+
declare function shallowHistory(elementOrName: string | ((...args: unknown[]) => unknown)): (model: Model, stack: AnyModelElement[]) => {
|
|
874
|
+
qualifiedName: string;
|
|
875
|
+
kind: number;
|
|
876
|
+
transitions: any[];
|
|
877
|
+
};
|
|
878
|
+
declare function deepHistory(elementOrName: string | ((...args: unknown[]) => unknown)): (model: Model, stack: AnyModelElement[]) => {
|
|
879
|
+
qualifiedName: string;
|
|
880
|
+
kind: number;
|
|
881
|
+
transitions: any[];
|
|
882
|
+
};
|
|
883
|
+
declare function choice(elementOrName: string | ((...args: unknown[]) => unknown)): (model: Model, stack: AnyModelElement[]) => {
|
|
884
|
+
qualifiedName: string;
|
|
885
|
+
kind: number;
|
|
886
|
+
transitions: any[];
|
|
887
|
+
};
|
|
888
|
+
declare function dispatchAll(ctx: Context, event: EventRecord): void;
|
|
889
|
+
declare function define<RootName extends string, const Parts extends readonly ModelElementSpec[] = readonly ModelElementSpec[]>(name: RootName, ...partials: ValidatedModelElementBuilderTuple<Parts, Parts, Parts, `/${RootName}`>): TypedModelFromInfer<RootName, Parts>;
|
|
890
|
+
declare function define<ModelSpec extends TypedModel<any, any, any, any, any, any, any, Instance> = never>(name: string, ...partials: [
|
|
891
|
+
ModelSpec
|
|
892
|
+
] extends [never] ? never : Array<(model: Model, stack: AnyModelElement[]) => void>): ModelSpec;
|
|
893
|
+
declare function dispatchTo(ctx: Context, event: EventRecord, ...ids: string[]): void;
|
|
894
|
+
declare function get(ctxOrInstance: Context | Instance, maybeInstanceOrName: Instance | string, maybeName?: string): unknown;
|
|
895
|
+
declare function set(ctxOrInstance: Context | Instance, maybeInstanceOrName: Instance | string, maybeNameOrValue: unknown, maybeValue?: unknown): void;
|
|
896
|
+
declare function call(ctxOrInstance: Context | Instance, maybeInstanceOrName: Instance | string, maybeName: string, ...args: unknown[]): unknown;
|
|
897
|
+
declare function restart(instance: Instance, data: unknown): void;
|
|
898
|
+
declare function takeSnapshot(ctxOrInstance: Context | Instance, maybeInstance?: Instance): Snapshot;
|
|
899
|
+
declare function afterProcess(ctx: Context, instance: Instance, maybeEvent?: EventRecord): Promise<void>;
|
|
900
|
+
declare function afterDispatch(ctx: Context, instance: Instance, event: EventRecord): Promise<void>;
|
|
901
|
+
declare function afterEntry(ctx: Context, instance: Instance, stateName: string): Promise<void>;
|
|
902
|
+
declare function afterExit(ctx: Context, instance: Instance, stateName: string): Promise<void>;
|
|
903
|
+
declare function afterExecuted(ctx: Context, instance: Instance, stateOrBehavior: string): Promise<void>;
|
|
904
|
+
declare function id(instance: any): string;
|
|
905
|
+
declare function qualifiedName(instance: any): any;
|
|
906
|
+
declare function name(instance: any): string;
|
|
907
|
+
declare function clock(instance: any): ClockConfig;
|
|
908
|
+
declare class Group<Members extends readonly unknown[] = readonly Instance[]> {
|
|
909
|
+
instances: Instance[];
|
|
910
|
+
readonly __hsm_group_members?: Members;
|
|
911
|
+
constructor(...instances: unknown[]);
|
|
912
|
+
dispatch(event: GroupEventUnion<Members>): void;
|
|
913
|
+
set<K extends SharedAttributeKeysOfGroupMembers<Members>>(name: K, value: SharedAttributeValueOfGroupMembers<Members, K>): void;
|
|
914
|
+
call<K extends GroupOperationKeys<Members>>(name: K, ...args: Parameters<GroupOperationSignature<Members, K>>): ReturnType<GroupOperationSignature<Members, K>>;
|
|
915
|
+
stop(): void;
|
|
916
|
+
restart(data?: unknown): void;
|
|
917
|
+
takeSnapshot(): GroupSnapshotOf<Members>;
|
|
918
|
+
clock(): ClockConfig;
|
|
919
|
+
}
|
|
920
|
+
declare function makeGroup<const Members extends readonly unknown[]>(...instances: Members): Group<FlattenGroupMembers<Members>>;
|
|
921
|
+
declare const NullKind: number;
|
|
922
|
+
declare const ElementKind: number;
|
|
923
|
+
declare const PartialKind: number;
|
|
924
|
+
declare const VertexKind: number;
|
|
925
|
+
declare const ConstraintKind: number;
|
|
926
|
+
declare const BehaviorKind: number;
|
|
927
|
+
declare const NamespaceKind: number;
|
|
928
|
+
declare const ConcurrentKind: number;
|
|
929
|
+
declare const SequentialKind: number;
|
|
930
|
+
declare const StateMachineKind: number;
|
|
931
|
+
declare const AttributeKind: number;
|
|
932
|
+
declare const StateKind: number;
|
|
933
|
+
declare const ModelKind: number;
|
|
934
|
+
declare const TransitionKind: number;
|
|
935
|
+
declare const InternalKind: number;
|
|
936
|
+
declare const ExternalKind: number;
|
|
937
|
+
declare const LocalKind: number;
|
|
938
|
+
declare const SelfKind: number;
|
|
939
|
+
declare const EventKind: number;
|
|
940
|
+
declare const CompletionEventKind: number;
|
|
941
|
+
declare const ChangeEventKind: number;
|
|
942
|
+
declare const ErrorEventKind: number;
|
|
943
|
+
declare const TimeEventKind: number;
|
|
944
|
+
declare const CallEventKind: number;
|
|
945
|
+
declare const PseudostateKind: number;
|
|
946
|
+
declare const InitialKind: number;
|
|
947
|
+
declare const FinalStateKind: number;
|
|
948
|
+
declare const ChoiceKind: number;
|
|
949
|
+
declare const JunctionKind: number;
|
|
950
|
+
declare const DeepHistoryKind: number;
|
|
951
|
+
declare const ShallowHistoryKind: number;
|
|
952
|
+
declare const Define: typeof define;
|
|
953
|
+
type State = Vertex & {
|
|
954
|
+
entry: Path[];
|
|
955
|
+
exit: Path[];
|
|
956
|
+
activities: Path[];
|
|
957
|
+
deferred: Path[];
|
|
958
|
+
initial?: Path;
|
|
959
|
+
};
|
|
960
|
+
declare const State: typeof state;
|
|
961
|
+
declare const Final: typeof final;
|
|
962
|
+
declare const ShallowHistory: typeof shallowHistory;
|
|
963
|
+
declare const DeepHistory: typeof deepHistory;
|
|
964
|
+
declare const Choice: typeof choice;
|
|
965
|
+
type Transition = Element & {
|
|
966
|
+
guard: string;
|
|
967
|
+
events: string[];
|
|
968
|
+
effect: Path[];
|
|
969
|
+
source: Path;
|
|
970
|
+
target?: Path;
|
|
971
|
+
paths: Record<Path, TransitionPath>;
|
|
972
|
+
};
|
|
973
|
+
declare const Transition: typeof transition;
|
|
974
|
+
declare const Initial: typeof initial;
|
|
975
|
+
type Event<Name extends string = string, Data = unknown> = EventRecord & {
|
|
976
|
+
readonly name: Name;
|
|
977
|
+
readonly schema?: Data;
|
|
978
|
+
};
|
|
979
|
+
declare const Event: typeof event;
|
|
980
|
+
declare const On: typeof on;
|
|
981
|
+
declare const OnCall: typeof onCall;
|
|
982
|
+
declare const OnSet: typeof onSet;
|
|
983
|
+
declare const When: typeof when;
|
|
984
|
+
declare const After: typeof after;
|
|
985
|
+
declare const Every: typeof every;
|
|
986
|
+
declare const At: typeof at;
|
|
987
|
+
declare const Target: typeof target;
|
|
988
|
+
declare const Source: typeof source;
|
|
989
|
+
declare const Entry: typeof entry;
|
|
990
|
+
declare const Exit: typeof exit;
|
|
991
|
+
declare const Activity: typeof activity;
|
|
992
|
+
declare const Effect: typeof effect;
|
|
993
|
+
declare const Guard: typeof guard;
|
|
994
|
+
declare const Defer: typeof defer;
|
|
995
|
+
declare const Attribute: typeof attribute;
|
|
996
|
+
type Operation = (ctx: Context, instance: Instance, event: EventRecord) => unknown;
|
|
997
|
+
declare const Operation: typeof operation;
|
|
998
|
+
declare const DispatchAll: typeof dispatchAll;
|
|
999
|
+
declare const DispatchTo: typeof dispatchTo;
|
|
1000
|
+
declare const Get: typeof get;
|
|
1001
|
+
declare const Set: typeof set;
|
|
1002
|
+
declare const Call: typeof call;
|
|
1003
|
+
declare const Restart: typeof restart;
|
|
1004
|
+
declare const TakeSnapshot: typeof takeSnapshot;
|
|
1005
|
+
declare const MakeGroup: typeof makeGroup;
|
|
1006
|
+
declare const LCA: typeof lca;
|
|
1007
|
+
declare const IsAncestor: typeof isAncestor;
|
|
1008
|
+
declare const ID: typeof id;
|
|
1009
|
+
declare const QualifiedName: typeof qualifiedName;
|
|
1010
|
+
declare const Name: typeof name;
|
|
1011
|
+
declare const Clock: typeof clock;
|
|
1012
|
+
|
|
1013
|
+
export { Activity, type ActivitySpec, After, type AfterClause, type AncestorsOf, At, type AtClause, Attribute, type AttributeKeysOf, AttributeKind, type AttributeSpec, type AttributesOf, type BehaviorCallbackFor, BehaviorKind, Call, CallEventKind, type CallableOperationKeysOf, type CanTransition, ChangeEventKind, type ChildrenOf, Choice, ChoiceKind, type ChoiceSpec, Clock, type ClockConfig, CompletionEventKind, type CompletionEventsOf, type CompletionStatePathsOf, ConcurrentKind, type Config, ConstraintKind, Context, DeepHistory, DeepHistoryKind, type DeepHistorySpec, DefaultClock, Defer, type DeferSpec, Define, type DescendantsOf, DispatchAll, type DispatchEvent, type DispatchEventOfName, type DispatchEventsOf, DispatchTo, type DoneEventNamesOf, type DoneEventOf, Effect, type EffectClause, ElementKind, Entry, type EntrySpec, ErrorEvent, ErrorEventKind, Event, type EventClause, EventKind, type EventNamesFromState, type EventNamesOf, type EventOfName, type EventSnapshotOf, type EventsForState, Every, type EveryClause, Exit, type ExitSpec, ExternalKind, Final, FinalEvent, type FinalSpec, FinalStateKind, type FinalStatesOf, Get, Group, type GroupSnapshotOf, Guard, type GuardClause, type GuardOperationKeysOf, ID, Initial, InitialEvent, InitialKind, type InitialSpec, type InitialStateOf, Instance, InternalKind, IsAncestor, type IsFinalState, JunctionKind, LCA, type LeafStatesOf, LocalKind, type MachineInstanceFor, MakeGroup, type ModelElementSpec, ModelKind, Name, NamespaceKind, NullKind, On, OnCall, type OnCallClause, OnSet, type OnSetClause, Operation, type OperationKeysOf, type OperationSpec, type OperationsOf, type ParentOf, PartialKind, PseudostateKind, QualifiedName, Queue, type RelativeStatePathsOf, Restart, SelfKind, SequentialKind, Set, ShallowHistory, ShallowHistoryKind, type ShallowHistorySpec, type Snapshot, type SnapshotOf, Source, type SourceClause, type SourcesForEvent, State, StateKind, StateMachineKind, type StatePathsOf, type StateSpec, TakeSnapshot, Target, type TargetClause, type TargetsFromState, type TargetsFromStateAndEvent, TimeEventKind, Transition, type TransitionBuilderClause, TransitionKind, type TransitionSpec, type TypedModel, VertexKind, When, type WhenClause, type WhenExprClause, activity, after, afterDispatch, afterEntry, afterExecuted, afterExit, afterProcess, apply, at, attribute, call, choice, clock, deepHistory, defer, define, dirname, dispatchAll, dispatchTo, effect, entry, event, every, exit, final, find, get, guard, id, initial, isAbsolute, isAncestor, join, lca, makeGroup, name, on, onCall, onSet, operation, qualifiedName, restart, set, shallowHistory, source, start, state, stop, takeSnapshot, target, transition, when };
|