@lite-fsm/core 2.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 AlexanderGureev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,33 @@
1
+ import { AnyEvent, AnyRecord, DefaultActorSnapshot, DefaultDeps, MachineConfig, Middleware, StateName, StateType, Subscriber } from "./types";
2
+ type RuntimeOptions = {
3
+ allowVoidReducer?: () => boolean;
4
+ allowActorTemplate?: boolean;
5
+ };
6
+ export declare const CreateMachine: <C extends object, T extends AnyRecord, E extends string = string, P extends AnyEvent = AnyEvent & {
7
+ type: E;
8
+ }, D extends AnyRecord = {}, Snapshot = string extends keyof C ? StateType<C, T> : "__INIT" extends keyof C ? DefaultActorSnapshot<C, T> : StateType<C, T>>(cfg: MachineConfig<C, T, P, D, Snapshot>, runtimeOptions?: RuntimeOptions) => {
9
+ config: C;
10
+ transition: (s: StateType<C, T>, action: P) => StateType<C, T>;
11
+ invokeEffect: (prevState: StateName<C>, currentState: StateName<C>, deps: D & DefaultDeps<StateName<C> | "*", C, P>) => Promise<void>;
12
+ };
13
+ export declare const createMachine: <C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot = string extends keyof C ? StateType<C, T> : "__INIT" extends keyof C ? DefaultActorSnapshot<C, T> : StateType<C, T>>(cfg: MachineConfig<C, T, P, D, Snapshot>, opts?: {
14
+ onError?: (err: unknown) => void;
15
+ dependencies?: D;
16
+ }) => {
17
+ transition: (_action: P) => P;
18
+ getState: () => StateType<C, T>;
19
+ onTransition: (cb: Subscriber<C, T, P>) => () => void;
20
+ addMiddleware: (...middleware: Middleware<StateType<C, T>, P>[]) => void;
21
+ };
22
+ export declare const defineMachine: <P extends AnyEvent = AnyEvent, D extends AnyRecord = {}>(opts?: {
23
+ onError?: (err: unknown) => void;
24
+ dependencies?: D;
25
+ }) => {
26
+ create: <C extends object, T extends AnyRecord, Snapshot = string extends keyof C ? StateType<C, T> : "__INIT" extends keyof C ? DefaultActorSnapshot<C, T> : StateType<C, T>>(cfg: MachineConfig<C, T, P, D, Snapshot>) => {
27
+ transition: (_action: P) => P;
28
+ getState: () => StateType<C, T>;
29
+ onTransition: (cb: Subscriber<C, T, P>) => () => void;
30
+ addMiddleware: (...middleware: Middleware<StateType<C, T>, P>[]) => void;
31
+ };
32
+ };
33
+ export {};
@@ -0,0 +1,33 @@
1
+ import { AnyEvent, AnyRecord, DefaultActorSnapshot, DefaultDeps, MachineConfig, Middleware, StateName, StateType, Subscriber } from "./types";
2
+ type RuntimeOptions = {
3
+ allowVoidReducer?: () => boolean;
4
+ allowActorTemplate?: boolean;
5
+ };
6
+ export declare const CreateMachine: <C extends object, T extends AnyRecord, E extends string = string, P extends AnyEvent = AnyEvent & {
7
+ type: E;
8
+ }, D extends AnyRecord = {}, Snapshot = string extends keyof C ? StateType<C, T> : "__INIT" extends keyof C ? DefaultActorSnapshot<C, T> : StateType<C, T>>(cfg: MachineConfig<C, T, P, D, Snapshot>, runtimeOptions?: RuntimeOptions) => {
9
+ config: C;
10
+ transition: (s: StateType<C, T>, action: P) => StateType<C, T>;
11
+ invokeEffect: (prevState: StateName<C>, currentState: StateName<C>, deps: D & DefaultDeps<StateName<C> | "*", C, P>) => Promise<void>;
12
+ };
13
+ export declare const createMachine: <C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot = string extends keyof C ? StateType<C, T> : "__INIT" extends keyof C ? DefaultActorSnapshot<C, T> : StateType<C, T>>(cfg: MachineConfig<C, T, P, D, Snapshot>, opts?: {
14
+ onError?: (err: unknown) => void;
15
+ dependencies?: D;
16
+ }) => {
17
+ transition: (_action: P) => P;
18
+ getState: () => StateType<C, T>;
19
+ onTransition: (cb: Subscriber<C, T, P>) => () => void;
20
+ addMiddleware: (...middleware: Middleware<StateType<C, T>, P>[]) => void;
21
+ };
22
+ export declare const defineMachine: <P extends AnyEvent = AnyEvent, D extends AnyRecord = {}>(opts?: {
23
+ onError?: (err: unknown) => void;
24
+ dependencies?: D;
25
+ }) => {
26
+ create: <C extends object, T extends AnyRecord, Snapshot = string extends keyof C ? StateType<C, T> : "__INIT" extends keyof C ? DefaultActorSnapshot<C, T> : StateType<C, T>>(cfg: MachineConfig<C, T, P, D, Snapshot>) => {
27
+ transition: (_action: P) => P;
28
+ getState: () => StateType<C, T>;
29
+ onTransition: (cb: Subscriber<C, T, P>) => () => void;
30
+ addMiddleware: (...middleware: Middleware<StateType<C, T>, P>[]) => void;
31
+ };
32
+ };
33
+ export {};
@@ -0,0 +1,3 @@
1
+ import { IMachineManager, MachineEvents, MachineManagerOptions } from "./interfaces";
2
+ import { AnyEvent, MachineStore } from "./types";
3
+ export declare const MachineManager: <S extends MachineStore, P extends AnyEvent = MachineEvents<S>>(config: S, opts?: MachineManagerOptions<S, P>) => IMachineManager<S, P>;
@@ -0,0 +1,3 @@
1
+ import { IMachineManager, MachineEvents, MachineManagerOptions } from "./interfaces";
2
+ import { AnyEvent, MachineStore } from "./types";
3
+ export declare const MachineManager: <S extends MachineStore, P extends AnyEvent = MachineEvents<S>>(config: S, opts?: MachineManagerOptions<S, P>) => IMachineManager<S, P>;
@@ -0,0 +1,67 @@
1
+ import type { ActorMeta, ActorTerminalState, AnyEvent, AnyRecord, FSMEventMeta, ManagerAction, Self } from "./types";
2
+ export type RuntimeActorSlice = {
3
+ state: string;
4
+ context: AnyRecord;
5
+ meta: Readonly<ActorMeta>;
6
+ };
7
+ export type ActorBag = Map<symbol, () => void>;
8
+ export type ActorIdentity = {
9
+ meta: Readonly<ActorMeta>;
10
+ templateKey: string;
11
+ };
12
+ export type ActorRuntime = ActorIdentity & {
13
+ bag: ActorBag;
14
+ };
15
+ export type GroupIndex = {
16
+ groupTag: string;
17
+ actorIds: Set<string>;
18
+ actorIdsByTemplate: Map<string, Set<string>>;
19
+ };
20
+ export type Counters = {
21
+ actor: number;
22
+ groupByTag: Map<string, number>;
23
+ };
24
+ export type NormalizeOptions = {
25
+ sender?: Self;
26
+ forceUnscoped?: boolean;
27
+ };
28
+ export type RoutingScope = "actor" | "group" | "tag" | "unscoped";
29
+ export declare const EMPTY_ACTOR_RECORD: Record<string, RuntimeActorSlice>;
30
+ export declare const TERMINAL_STATES: Set<string>;
31
+ export declare const hasOwn: <T extends object>(obj: T, key: PropertyKey) => key is keyof T;
32
+ export declare const isObjectRecord: (value: unknown) => value is Record<string, unknown>;
33
+ export declare const isTerminal: (state: unknown) => state is ActorTerminalState;
34
+ export declare const isActorStateContextSlice: (value: unknown) => value is Omit<RuntimeActorSlice, "meta">;
35
+ export declare const createActorMeta: (input: ActorMeta | (ActorMeta & {
36
+ templateKey: string;
37
+ })) => Readonly<ActorMeta>;
38
+ export declare const isActorTemplateConfig: (cfg: {
39
+ config: object;
40
+ }) => boolean;
41
+ export declare const resolveTransitionTarget: (graph: Record<string, Record<string, unknown> | undefined>, source: string, actionType: string, isActorTemplate: boolean) => string | null | undefined;
42
+ export declare const validateActorReducerOutput: (actorId: string, templateKey: string, nextState: string, isPublicActorState: (templateKey: string, state: string) => boolean) => void;
43
+ export declare const validateActorTemplateConfig: (templateKey: string, cfg: {
44
+ initialState: string;
45
+ persistence?: unknown;
46
+ hydrate?: unknown;
47
+ dehydrate?: unknown;
48
+ config: object;
49
+ }) => void;
50
+ export declare const stripSenderFields: (meta: FSMEventMeta | undefined) => FSMEventMeta;
51
+ export declare const stripRouting: (meta: FSMEventMeta | undefined) => FSMEventMeta;
52
+ export declare const attachMeta: <P extends AnyEvent>(action: ManagerAction<P>, meta: FSMEventMeta) => ManagerAction<P>;
53
+ export declare const arrayify: <T>(value: T | T[]) => T[];
54
+ export declare const dedupe: <T>(values: T[]) => T[];
55
+ export declare const resolveRouting: (meta?: FSMEventMeta) => {
56
+ scope: RoutingScope;
57
+ targetSet: string[];
58
+ };
59
+ export declare const SPAWN_ID_SEP = "#";
60
+ export declare const parseSpawnId: (id: string) => {
61
+ owner: string | null;
62
+ tail: string;
63
+ };
64
+ export declare const isOwnedId: (id: string, originId: string | undefined) => boolean;
65
+ export declare const cloneCounters: (counters: Counters) => Counters;
66
+ export declare const mergeCounters: (live: Counters, draft: Counters) => Counters;
67
+ export declare const bumpCountersFromId: (counters: Counters, actorId: string, groupId: string, originId: string | undefined) => void;
@@ -0,0 +1,67 @@
1
+ import type { ActorMeta, ActorTerminalState, AnyEvent, AnyRecord, FSMEventMeta, ManagerAction, Self } from "./types";
2
+ export type RuntimeActorSlice = {
3
+ state: string;
4
+ context: AnyRecord;
5
+ meta: Readonly<ActorMeta>;
6
+ };
7
+ export type ActorBag = Map<symbol, () => void>;
8
+ export type ActorIdentity = {
9
+ meta: Readonly<ActorMeta>;
10
+ templateKey: string;
11
+ };
12
+ export type ActorRuntime = ActorIdentity & {
13
+ bag: ActorBag;
14
+ };
15
+ export type GroupIndex = {
16
+ groupTag: string;
17
+ actorIds: Set<string>;
18
+ actorIdsByTemplate: Map<string, Set<string>>;
19
+ };
20
+ export type Counters = {
21
+ actor: number;
22
+ groupByTag: Map<string, number>;
23
+ };
24
+ export type NormalizeOptions = {
25
+ sender?: Self;
26
+ forceUnscoped?: boolean;
27
+ };
28
+ export type RoutingScope = "actor" | "group" | "tag" | "unscoped";
29
+ export declare const EMPTY_ACTOR_RECORD: Record<string, RuntimeActorSlice>;
30
+ export declare const TERMINAL_STATES: Set<string>;
31
+ export declare const hasOwn: <T extends object>(obj: T, key: PropertyKey) => key is keyof T;
32
+ export declare const isObjectRecord: (value: unknown) => value is Record<string, unknown>;
33
+ export declare const isTerminal: (state: unknown) => state is ActorTerminalState;
34
+ export declare const isActorStateContextSlice: (value: unknown) => value is Omit<RuntimeActorSlice, "meta">;
35
+ export declare const createActorMeta: (input: ActorMeta | (ActorMeta & {
36
+ templateKey: string;
37
+ })) => Readonly<ActorMeta>;
38
+ export declare const isActorTemplateConfig: (cfg: {
39
+ config: object;
40
+ }) => boolean;
41
+ export declare const resolveTransitionTarget: (graph: Record<string, Record<string, unknown> | undefined>, source: string, actionType: string, isActorTemplate: boolean) => string | null | undefined;
42
+ export declare const validateActorReducerOutput: (actorId: string, templateKey: string, nextState: string, isPublicActorState: (templateKey: string, state: string) => boolean) => void;
43
+ export declare const validateActorTemplateConfig: (templateKey: string, cfg: {
44
+ initialState: string;
45
+ persistence?: unknown;
46
+ hydrate?: unknown;
47
+ dehydrate?: unknown;
48
+ config: object;
49
+ }) => void;
50
+ export declare const stripSenderFields: (meta: FSMEventMeta | undefined) => FSMEventMeta;
51
+ export declare const stripRouting: (meta: FSMEventMeta | undefined) => FSMEventMeta;
52
+ export declare const attachMeta: <P extends AnyEvent>(action: ManagerAction<P>, meta: FSMEventMeta) => ManagerAction<P>;
53
+ export declare const arrayify: <T>(value: T | T[]) => T[];
54
+ export declare const dedupe: <T>(values: T[]) => T[];
55
+ export declare const resolveRouting: (meta?: FSMEventMeta) => {
56
+ scope: RoutingScope;
57
+ targetSet: string[];
58
+ };
59
+ export declare const SPAWN_ID_SEP = "#";
60
+ export declare const parseSpawnId: (id: string) => {
61
+ owner: string | null;
62
+ tail: string;
63
+ };
64
+ export declare const isOwnedId: (id: string, originId: string | undefined) => boolean;
65
+ export declare const cloneCounters: (counters: Counters) => Counters;
66
+ export declare const mergeCounters: (live: Counters, draft: Counters) => Counters;
67
+ export declare const bumpCountersFromId: (counters: Counters, actorId: string, groupId: string, originId: string | undefined) => void;
@@ -0,0 +1,36 @@
1
+ import type { ActorRuntime, NormalizeOptions } from "./actor";
2
+ import { REGISTER_BAG_DISPOSE } from "./internal";
3
+ import type { SidecarState } from "./sidecar";
4
+ import type { AnyEvent, AnyRecord, ManagerAction } from "./types";
5
+ export type InternalActorEffectDeps = {
6
+ self?: {
7
+ actorId: string;
8
+ };
9
+ [REGISTER_BAG_DISPOSE]?: (actorId: string, key: symbol, dispose: () => void) => void;
10
+ };
11
+ type RootStateView = Record<string, unknown>;
12
+ type MachineLike = {
13
+ invokeEffect(prevState: string, currentState: string, deps: AnyRecord): Promise<void>;
14
+ };
15
+ type EffectsTargets = ActorRuntime[];
16
+ type EffectSubscriber<P extends AnyEvent> = (prev: unknown, current: unknown, action: ManagerAction<P> | {
17
+ type: string;
18
+ }) => void;
19
+ export type ActorEffectsRefs<P extends AnyEvent> = {
20
+ transition: (action: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P>;
21
+ userDeps: AnyRecord;
22
+ };
23
+ export type ActorEffectsDeps<P extends AnyEvent> = {
24
+ sidecar: SidecarState;
25
+ machines: Record<string, MachineLike>;
26
+ domainKeys: readonly string[];
27
+ refs: ActorEffectsRefs<P>;
28
+ onTransition: (cb: EffectSubscriber<P>) => () => void;
29
+ onError?: (err: unknown) => void;
30
+ };
31
+ export type ActorEffectsRuntime<P extends AnyEvent> = {
32
+ condition: (predicate: (a: ManagerAction<P>) => boolean) => Promise<boolean>;
33
+ invokeEffects: (prevState: RootStateView, currentState: RootStateView, action: ManagerAction<P>, targets: EffectsTargets) => void;
34
+ };
35
+ export declare const createActorEffectsRuntime: <P extends AnyEvent>(deps: ActorEffectsDeps<P>) => ActorEffectsRuntime<P>;
36
+ export {};
@@ -0,0 +1,36 @@
1
+ import type { ActorRuntime, NormalizeOptions } from "./actor";
2
+ import { REGISTER_BAG_DISPOSE } from "./internal";
3
+ import type { SidecarState } from "./sidecar";
4
+ import type { AnyEvent, AnyRecord, ManagerAction } from "./types";
5
+ export type InternalActorEffectDeps = {
6
+ self?: {
7
+ actorId: string;
8
+ };
9
+ [REGISTER_BAG_DISPOSE]?: (actorId: string, key: symbol, dispose: () => void) => void;
10
+ };
11
+ type RootStateView = Record<string, unknown>;
12
+ type MachineLike = {
13
+ invokeEffect(prevState: string, currentState: string, deps: AnyRecord): Promise<void>;
14
+ };
15
+ type EffectsTargets = ActorRuntime[];
16
+ type EffectSubscriber<P extends AnyEvent> = (prev: unknown, current: unknown, action: ManagerAction<P> | {
17
+ type: string;
18
+ }) => void;
19
+ export type ActorEffectsRefs<P extends AnyEvent> = {
20
+ transition: (action: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P>;
21
+ userDeps: AnyRecord;
22
+ };
23
+ export type ActorEffectsDeps<P extends AnyEvent> = {
24
+ sidecar: SidecarState;
25
+ machines: Record<string, MachineLike>;
26
+ domainKeys: readonly string[];
27
+ refs: ActorEffectsRefs<P>;
28
+ onTransition: (cb: EffectSubscriber<P>) => () => void;
29
+ onError?: (err: unknown) => void;
30
+ };
31
+ export type ActorEffectsRuntime<P extends AnyEvent> = {
32
+ condition: (predicate: (a: ManagerAction<P>) => boolean) => Promise<boolean>;
33
+ invokeEffects: (prevState: RootStateView, currentState: RootStateView, action: ManagerAction<P>, targets: EffectsTargets) => void;
34
+ };
35
+ export declare const createActorEffectsRuntime: <P extends AnyEvent>(deps: ActorEffectsDeps<P>) => ActorEffectsRuntime<P>;
36
+ export {};
@@ -0,0 +1,34 @@
1
+ import type { AnyEvent, AnyRecord, ActorDehydrateHook, ActorHydrateHook, ActorPersistence, CFG, DefaultActorSnapshot, MachineConfig, StateName, StateType, WILDCARD } from "./types";
2
+ type HasLiteralInit<C extends object> = string extends keyof C ? false : "__INIT" extends keyof C ? true : false;
3
+ type DefaultSnapshotForConfig<C extends object, T extends AnyRecord> = HasLiteralInit<C> extends true ? DefaultActorSnapshot<C, T> : StateType<C, T>;
4
+ type CapturedPersistence = ActorPersistence | undefined;
5
+ type WithCapturedPersistence<Persistence> = [Persistence] extends [undefined] ? {} : {
6
+ persistence: Persistence;
7
+ };
8
+ type Prettify<T> = {
9
+ [K in keyof T]: T[K];
10
+ } & {};
11
+ type CreateMachineResult<C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot, Persistence> = HasLiteralInit<C> extends true ? Prettify<MachineConfig<C, T, P, D, Snapshot> & WithCapturedPersistence<Persistence>> : MachineConfig<C, T, P, D, Snapshot>;
12
+ type ConfigKeys<C extends object> = StateName<C> | WILDCARD | "__INIT";
13
+ type ConfigTargetStates<C extends object> = StateName<C> | WILDCARD;
14
+ type MachineBaseInput<C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot> = Pick<MachineConfig<C, T, P, D, Snapshot>, "config" | "initialState" | "initialContext" | "reducer" | "effects">;
15
+ type ActorSnapshotHooks<C extends object, T extends AnyRecord, Snapshot> = {
16
+ hydrate?: ActorHydrateHook<C, T, Snapshot>;
17
+ dehydrate?: ActorDehydrateHook<C, T, Snapshot>;
18
+ };
19
+ type ActorPersistenceInput<C extends object, T extends AnyRecord, Snapshot> = {
20
+ persistence?: ActorPersistence;
21
+ groupTag?: string;
22
+ } & ActorSnapshotHooks<C, T, Snapshot> & ({
23
+ persistence?: "runtime";
24
+ hydrate?: never;
25
+ dehydrate?: never;
26
+ } | {
27
+ persistence: "snapshot";
28
+ });
29
+ type CreateMachineInput<C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot, Persistence> = HasLiteralInit<C> extends true ? MachineBaseInput<C, T, P, D, Snapshot> & ActorPersistenceInput<C, T, Snapshot> & {
30
+ persistence?: Persistence | ActorPersistence;
31
+ } : MachineConfig<C, T, P, D, Snapshot>;
32
+ export type TypedCreateMachineFn<P extends AnyEvent = AnyEvent, D extends AnyRecord = {}> = <C extends CFG<C, P, ConfigKeys<C>, ConfigTargetStates<C>>, T extends AnyRecord, Snapshot = DefaultSnapshotForConfig<C, T>, Persistence extends CapturedPersistence = undefined>(cfg: CreateMachineInput<C, T, P, D, Snapshot, Persistence>) => CreateMachineResult<C, T, P, D, Snapshot, Persistence>;
33
+ export declare function createMachine<P extends AnyEvent = AnyEvent, D extends AnyRecord = {}, C extends CFG<C, P, ConfigKeys<C>, ConfigTargetStates<C>> = Record<string, never>, T extends AnyRecord = {}, Snapshot = DefaultSnapshotForConfig<C, T>, Persistence extends CapturedPersistence = undefined>(cfg: CreateMachineInput<C, T, P, D, Snapshot, Persistence>): CreateMachineResult<C, T, P, D, Snapshot, Persistence>;
34
+ export {};
@@ -0,0 +1,34 @@
1
+ import type { AnyEvent, AnyRecord, ActorDehydrateHook, ActorHydrateHook, ActorPersistence, CFG, DefaultActorSnapshot, MachineConfig, StateName, StateType, WILDCARD } from "./types";
2
+ type HasLiteralInit<C extends object> = string extends keyof C ? false : "__INIT" extends keyof C ? true : false;
3
+ type DefaultSnapshotForConfig<C extends object, T extends AnyRecord> = HasLiteralInit<C> extends true ? DefaultActorSnapshot<C, T> : StateType<C, T>;
4
+ type CapturedPersistence = ActorPersistence | undefined;
5
+ type WithCapturedPersistence<Persistence> = [Persistence] extends [undefined] ? {} : {
6
+ persistence: Persistence;
7
+ };
8
+ type Prettify<T> = {
9
+ [K in keyof T]: T[K];
10
+ } & {};
11
+ type CreateMachineResult<C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot, Persistence> = HasLiteralInit<C> extends true ? Prettify<MachineConfig<C, T, P, D, Snapshot> & WithCapturedPersistence<Persistence>> : MachineConfig<C, T, P, D, Snapshot>;
12
+ type ConfigKeys<C extends object> = StateName<C> | WILDCARD | "__INIT";
13
+ type ConfigTargetStates<C extends object> = StateName<C> | WILDCARD;
14
+ type MachineBaseInput<C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot> = Pick<MachineConfig<C, T, P, D, Snapshot>, "config" | "initialState" | "initialContext" | "reducer" | "effects">;
15
+ type ActorSnapshotHooks<C extends object, T extends AnyRecord, Snapshot> = {
16
+ hydrate?: ActorHydrateHook<C, T, Snapshot>;
17
+ dehydrate?: ActorDehydrateHook<C, T, Snapshot>;
18
+ };
19
+ type ActorPersistenceInput<C extends object, T extends AnyRecord, Snapshot> = {
20
+ persistence?: ActorPersistence;
21
+ groupTag?: string;
22
+ } & ActorSnapshotHooks<C, T, Snapshot> & ({
23
+ persistence?: "runtime";
24
+ hydrate?: never;
25
+ dehydrate?: never;
26
+ } | {
27
+ persistence: "snapshot";
28
+ });
29
+ type CreateMachineInput<C extends object, T extends AnyRecord, P extends AnyEvent, D extends AnyRecord, Snapshot, Persistence> = HasLiteralInit<C> extends true ? MachineBaseInput<C, T, P, D, Snapshot> & ActorPersistenceInput<C, T, Snapshot> & {
30
+ persistence?: Persistence | ActorPersistence;
31
+ } : MachineConfig<C, T, P, D, Snapshot>;
32
+ export type TypedCreateMachineFn<P extends AnyEvent = AnyEvent, D extends AnyRecord = {}> = <C extends CFG<C, P, ConfigKeys<C>, ConfigTargetStates<C>>, T extends AnyRecord, Snapshot = DefaultSnapshotForConfig<C, T>, Persistence extends CapturedPersistence = undefined>(cfg: CreateMachineInput<C, T, P, D, Snapshot, Persistence>) => CreateMachineResult<C, T, P, D, Snapshot, Persistence>;
33
+ export declare function createMachine<P extends AnyEvent = AnyEvent, D extends AnyRecord = {}, C extends CFG<C, P, ConfigKeys<C>, ConfigTargetStates<C>> = Record<string, never>, T extends AnyRecord = {}, Snapshot = DefaultSnapshotForConfig<C, T>, Persistence extends CapturedPersistence = undefined>(cfg: CreateMachineInput<C, T, P, D, Snapshot, Persistence>): CreateMachineResult<C, T, P, D, Snapshot, Persistence>;
34
+ export {};
@@ -0,0 +1,26 @@
1
+ import { type ActorIdentity, type ActorRuntime, type Counters, type NormalizeOptions, type RuntimeActorSlice } from "./actor";
2
+ import type { AnyEvent, GenerateSpawnIdFn, ManagerAction, MachineStore, MachinesState } from "./types";
3
+ export type SpawnIdConfig<P extends AnyEvent> = {
4
+ originId: string | undefined;
5
+ generateActorId: GenerateSpawnIdFn<P> | undefined;
6
+ generateGroupId: GenerateSpawnIdFn<P> | undefined;
7
+ };
8
+ export type DispatchContext<S extends MachineStore = MachineStore, P extends AnyEvent = AnyEvent> = {
9
+ normalizeOpts: NormalizeOptions;
10
+ committed?: ManagerAction<P>;
11
+ committedPrevState?: MachinesState<S>;
12
+ countersBase: Counters;
13
+ countersDraft?: Counters;
14
+ pendingSpawned: ActorIdentity[];
15
+ pendingDelivered: ActorIdentity[];
16
+ pendingDeleted: ActorIdentity[];
17
+ touchedActorRecords: Map<string, Record<string, RuntimeActorSlice>>;
18
+ effectsTargets: ActorRuntime[];
19
+ };
20
+ export declare const createDispatchContext: <S extends MachineStore, P extends AnyEvent>(normalizeOpts: NormalizeOptions, counters: Counters) => DispatchContext<S, P>;
21
+ export declare const reserveGroupId: <P extends AnyEvent>(ctx: DispatchContext, groupTag: string, action: ManagerAction<P>, cfg: SpawnIdConfig<P>, isTaken: (id: string) => boolean) => string;
22
+ export declare const reserveActorId: <P extends AnyEvent>(ctx: DispatchContext, templateKey: string, groupTag: string, action: ManagerAction<P>, cfg: SpawnIdConfig<P>, isTaken: (id: string) => boolean) => string;
23
+ export declare const ensureRecord: <S extends MachineStore>(ctx: DispatchContext<S>, root: MachinesState<S>, templateKey: string) => {
24
+ root: MachinesState<S>;
25
+ record: Record<string, RuntimeActorSlice>;
26
+ };
@@ -0,0 +1,26 @@
1
+ import { type ActorIdentity, type ActorRuntime, type Counters, type NormalizeOptions, type RuntimeActorSlice } from "./actor";
2
+ import type { AnyEvent, GenerateSpawnIdFn, ManagerAction, MachineStore, MachinesState } from "./types";
3
+ export type SpawnIdConfig<P extends AnyEvent> = {
4
+ originId: string | undefined;
5
+ generateActorId: GenerateSpawnIdFn<P> | undefined;
6
+ generateGroupId: GenerateSpawnIdFn<P> | undefined;
7
+ };
8
+ export type DispatchContext<S extends MachineStore = MachineStore, P extends AnyEvent = AnyEvent> = {
9
+ normalizeOpts: NormalizeOptions;
10
+ committed?: ManagerAction<P>;
11
+ committedPrevState?: MachinesState<S>;
12
+ countersBase: Counters;
13
+ countersDraft?: Counters;
14
+ pendingSpawned: ActorIdentity[];
15
+ pendingDelivered: ActorIdentity[];
16
+ pendingDeleted: ActorIdentity[];
17
+ touchedActorRecords: Map<string, Record<string, RuntimeActorSlice>>;
18
+ effectsTargets: ActorRuntime[];
19
+ };
20
+ export declare const createDispatchContext: <S extends MachineStore, P extends AnyEvent>(normalizeOpts: NormalizeOptions, counters: Counters) => DispatchContext<S, P>;
21
+ export declare const reserveGroupId: <P extends AnyEvent>(ctx: DispatchContext, groupTag: string, action: ManagerAction<P>, cfg: SpawnIdConfig<P>, isTaken: (id: string) => boolean) => string;
22
+ export declare const reserveActorId: <P extends AnyEvent>(ctx: DispatchContext, templateKey: string, groupTag: string, action: ManagerAction<P>, cfg: SpawnIdConfig<P>, isTaken: (id: string) => boolean) => string;
23
+ export declare const ensureRecord: <S extends MachineStore>(ctx: DispatchContext<S>, root: MachinesState<S>, templateKey: string) => {
24
+ root: MachinesState<S>;
25
+ record: Record<string, RuntimeActorSlice>;
26
+ };
@@ -0,0 +1,25 @@
1
+ import type { DehydrateOptions, HydrateStrategy, MachineManagerSnapshot, MachinesState, MachineStore, UnknownMachineKeyContext } from "./types";
2
+ import type { SidecarState } from "./sidecar";
3
+ type SnapshotEnvelope = {
4
+ schemaVersion?: number;
5
+ machines: Record<string, unknown>;
6
+ };
7
+ type MachineKey<S extends MachineStore> = Extract<keyof S, string>;
8
+ export type ApplySnapshotMode = "preview" | "commit";
9
+ export type ApplySnapshotResult<S extends MachineStore> = {
10
+ nextState: MachinesState<S>;
11
+ changedActorTemplateKeys: string[];
12
+ };
13
+ export type ApplySnapshotDeps<S extends MachineStore> = {
14
+ config: S;
15
+ snapshotActorTemplateKeys: ReadonlyArray<MachineKey<S>>;
16
+ runtimeActorTemplateKeys: ReadonlyArray<MachineKey<S>>;
17
+ schemaVersion: number | undefined;
18
+ groupTagForTemplate: (templateKey: string) => string;
19
+ onSchemaVersionMismatch?: (incoming: number | undefined, current: number | undefined) => void;
20
+ onUnknownMachineKey?: (key: string, context: UnknownMachineKeyContext) => void;
21
+ };
22
+ export declare const assertSnapshotEnvelope: (snapshot: unknown) => SnapshotEnvelope;
23
+ export declare const applySnapshot: <S extends MachineStore>(prev: MachinesState<S>, incoming: MachineManagerSnapshot<S>, strategy: HydrateStrategy, context: UnknownMachineKeyContext, deps: ApplySnapshotDeps<S>, mode?: ApplySnapshotMode) => ApplySnapshotResult<S>;
24
+ export declare const buildDehydratedEnvelope: <S extends MachineStore>(state: MachinesState<S>, config: S, sidecar: SidecarState, snapshotActorTemplateKeys: ReadonlyArray<MachineKey<S>>, runtimeActorTemplateKeys: ReadonlyArray<MachineKey<S>>, domainKeys: ReadonlyArray<MachineKey<S>>, schemaVersion: number | undefined, dehydrateOpts: DehydrateOptions<S> | undefined) => MachineManagerSnapshot<S>;
25
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { DehydrateOptions, HydrateStrategy, MachineManagerSnapshot, MachinesState, MachineStore, UnknownMachineKeyContext } from "./types";
2
+ import type { SidecarState } from "./sidecar";
3
+ type SnapshotEnvelope = {
4
+ schemaVersion?: number;
5
+ machines: Record<string, unknown>;
6
+ };
7
+ type MachineKey<S extends MachineStore> = Extract<keyof S, string>;
8
+ export type ApplySnapshotMode = "preview" | "commit";
9
+ export type ApplySnapshotResult<S extends MachineStore> = {
10
+ nextState: MachinesState<S>;
11
+ changedActorTemplateKeys: string[];
12
+ };
13
+ export type ApplySnapshotDeps<S extends MachineStore> = {
14
+ config: S;
15
+ snapshotActorTemplateKeys: ReadonlyArray<MachineKey<S>>;
16
+ runtimeActorTemplateKeys: ReadonlyArray<MachineKey<S>>;
17
+ schemaVersion: number | undefined;
18
+ groupTagForTemplate: (templateKey: string) => string;
19
+ onSchemaVersionMismatch?: (incoming: number | undefined, current: number | undefined) => void;
20
+ onUnknownMachineKey?: (key: string, context: UnknownMachineKeyContext) => void;
21
+ };
22
+ export declare const assertSnapshotEnvelope: (snapshot: unknown) => SnapshotEnvelope;
23
+ export declare const applySnapshot: <S extends MachineStore>(prev: MachinesState<S>, incoming: MachineManagerSnapshot<S>, strategy: HydrateStrategy, context: UnknownMachineKeyContext, deps: ApplySnapshotDeps<S>, mode?: ApplySnapshotMode) => ApplySnapshotResult<S>;
24
+ export declare const buildDehydratedEnvelope: <S extends MachineStore>(state: MachinesState<S>, config: S, sidecar: SidecarState, snapshotActorTemplateKeys: ReadonlyArray<MachineKey<S>>, runtimeActorTemplateKeys: ReadonlyArray<MachineKey<S>>, domainKeys: ReadonlyArray<MachineKey<S>>, schemaVersion: number | undefined, dehydrateOpts: DehydrateOptions<S> | undefined) => MachineManagerSnapshot<S>;
25
+ export {};
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";var ee=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var Bt=Object.getOwnPropertyNames;var Ft=Object.prototype.hasOwnProperty;var Vt=(e,t,n)=>t in e?ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Gt=(e,t)=>{for(var n in t)ee(e,n,{get:t[n],enumerable:!0})},Kt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Bt(t))!Ft.call(e,o)&&o!==n&&ee(e,o,{get:()=>t[o],enumerable:!(r=Lt(t,o))||r.enumerable});return e};var Ht=e=>Kt(ee({},"__esModule",{value:!0}),e);var be=(e,t,n)=>Vt(e,typeof t!="symbol"?t+"":t,n);var yn={};Gt(yn,{LiteFsmError:()=>h,Machine:()=>Z,MachineManager:()=>ft,createActorMeta:()=>W,createConfig:()=>pn,createEffect:()=>fn,createMachine:()=>yt,createReducer:()=>dn,defineMachine:()=>$e});module.exports=Ht(yn);var X=Symbol.for("lite-fsm.late-dispatch"),te=Symbol.for("lite-fsm.registerBagDispose");function ne(...e){return e.length===0?t=>t:e.reduce((t,n)=>(...r)=>t(n(...r)))}var fe="*",jt="@@lite-fsm/",ve="@@lite-fsm/HYDRATE",$t="__liteFsmAllowVoidReducer",q="Reducer returned undefined. Return the next state, or use immerMiddleware to mutate draft state without return.",oe=e=>typeof e=="function"&&$t in e,h=class extends Error{constructor(n,r){super(r);be(this,"code",n);this.name="LiteFsmError"}},ye=(e,t)=>{if(typeof e!="string"||e.length===0)throw new h("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] generate${t==="actor"?"Actor":"Group"}Id must return a non-empty string.`);return e},re=e=>typeof e.type=="string"&&e.type.startsWith(jt),O=globalThis.process?.env?.NODE_ENV!=="production",H=e=>{if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))H(Reflect.get(e,t));return e};var $=Object.freeze({}),zt=new Set(["__RESOLVED","__REJECTED","__CANCELLED"]),Wt=["senderActorId","senderGroupId","senderGroupTag"],Ut=["actorId","groupId","groupTag"],V=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),N=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>typeof e=="string"&&zt.has(e),Oe=e=>N(e)&&typeof e.state=="string"&&N(e.context),W=e=>Object.freeze({actorId:e.actorId,groupId:e.groupId,groupTag:e.groupTag}),J=e=>V(e.config,"__INIT"),ae=(e,t,n,r)=>{let o=e[t]?.[n];if(o!==void 0)return o;if(!(r&&t==="__INIT"))return e["*"]?.[n]},Le=(e,t,n,r)=>{if(n==="__INIT")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' remained in __INIT after spawn.`);if(!j(n)&&!r(t,n))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' has invalid state.`)},Be=(e,t)=>{if(t.initialState!=="__INIT")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' must use __INIT as initialState.`);if(t.persistence!==void 0&&t.persistence!=="runtime"&&t.persistence!=="snapshot")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid persistence mode.`);if(t.persistence!=="snapshot"&&(t.hydrate||t.dehydrate))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot define hydrate/dehydrate hooks without snapshot persistence.`);let n=t.config;for(let r of Object.keys(n)){if(j(r)||r.startsWith("__")&&r!=="__INIT")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has reserved state '${r}'.`);for(let o of Object.values(n[r])){if(r==="__INIT"&&o===null)throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot spawn with a null __INIT target.`);if(o==="__INIT"||typeof o=="string"&&o.startsWith("__")&&!j(o))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid target '${String(o)}'.`)}}},Fe=e=>{let t={};return e&&(e.actorId!==void 0&&(t.actorId=e.actorId),e.groupId!==void 0&&(t.groupId=e.groupId),e.groupTag!==void 0&&(t.groupTag=e.groupTag),e.senderActorId!==void 0&&(t.senderActorId=e.senderActorId),e.senderGroupId!==void 0&&(t.senderGroupId=e.senderGroupId),e.senderGroupTag!==void 0&&(t.senderGroupTag=e.senderGroupTag)),t},Ve=e=>{let t=Fe(e);for(let n of Wt)delete t[n];return t},Ge=e=>{let t=Fe(e);for(let n of Ut)delete t[n];return t},Ae=(e,t)=>{if(Object.keys(t).length===0){let{meta:n,...r}=e;return r}return{...e,meta:t}},le=e=>Array.isArray(e)?e:[e],Se=e=>[...new Set(e)],Ke=e=>e?e.actorId!==void 0?{scope:"actor",targetSet:Se(le(e.actorId))}:e.groupId!==void 0?{scope:"group",targetSet:Se(le(e.groupId))}:e.groupTag!==void 0?{scope:"tag",targetSet:Se(le(e.groupTag))}:{scope:"unscoped",targetSet:[]}:{scope:"unscoped",targetSet:[]},U="#",me=e=>{let t=e.indexOf(U);return t===-1?{owner:null,tail:e}:{owner:e.slice(0,t),tail:e.slice(t+1)}},ke=(e,t)=>{let{owner:n}=me(e);return t===void 0?n===null:n===t},Q=e=>({actor:e.actor,groupByTag:new Map(e.groupByTag)}),He=(e,t)=>{let n=Q(e);n.actor=Math.max(n.actor,t.actor);for(let[r,o]of t.groupByTag)n.groupByTag.set(r,Math.max(n.groupByTag.get(r)??0,o));return n},Ne=e=>{let t=e.lastIndexOf("/");if(t<0)return null;let n=Number(e.slice(t+1));return Number.isInteger(n)&&n>=0?n:null},je=(e,t,n,r)=>{if(ke(t,r)){let o=Ne(me(t).tail);o!==null&&(e.actor=Math.max(e.actor,o+1))}if(ke(n,r)){let o=me(n).tail,c=o.lastIndexOf("/"),a=Ne(o);if(a===null)return;let i=o.slice(0,c);e.groupByTag.set(i,Math.max(e.groupByTag.get(i)??0,a+1))}};var Z=(e,t={})=>{let n=J(e);return{config:e.config,transition:(r,o)=>{if(n&&!t.allowActorTemplate)throw new h("LITE_FSM_STANDALONE_ACTOR_TEMPLATE","[lite-fsm] actor templates can only be used inside MachineManager.");let c=e.config,a=ae(c,r.state,o.type,n);if(a===void 0)return r;if(e.reducer){let u=a||r.state,l=e.reducer(r,o,{nextState:u,config:e.config});if(l===void 0){if(t.allowVoidReducer?.())return r;throw new Error(q)}return l}let i="payload"in o?o.payload:{};return{state:a||r.state,context:{...r.context,...i}}},invokeEffect:async(r,o,c)=>{if(!e.effects)return;let a=e.effects;if(r!==o&&a[o]){let i=a[o];await i?.(c)}else if(a[fe]){let i=a[fe];await i?.(c)}}}},Yt=(e,t={})=>{let n,r=[],o=!1,c=y=>{o=!!y?.some(oe)},a=Z(e,{allowVoidReducer:()=>o}),i=[],u={context:e.initialContext,state:e.initialState};O&&H(u);let l=(y,M)=>a.transition(y,M),A=y=>{l=y(l)},R=y=>new Promise((M,D)=>{let _=m((G,K,P)=>{try{y(P)&&(_(),M(!0))}catch(v){_(),D(v)}})}),p=(y,M,D)=>{a.invokeEffect(y.state,M.state,{...t.dependencies,transition:n,action:D,condition:R}).catch(_=>{t?.onError?.(_)})},m=y=>(i.push(y),()=>{i=i.filter(M=>M!==y)}),b=(y,M,D)=>{i.forEach(_=>_(y,M,D))},f=y=>{let M=u,D=l(M,y);if(D===void 0)throw new Error(q);return u=D,O&&H(u),b(M,u,y),y},S=y=>{if(c(y),!y?.length)return f;let M=y.map(D=>D({getState:E,transition:_=>n(_),replaceReducer:A,onTransition:m,condition:R}));return ne(...M)(f)},I=S(r);n=y=>{let M=u,D=I(y);return p(M,u,D),D};let E=()=>u;return{transition:n,getState:E,onTransition:m,addMiddleware:(...y)=>{r=[...r,...y],I=S(r)}}},$e=(e={})=>({create:t=>Yt(t,e)});var ze=e=>{let{sidecar:t,machines:n,domainKeys:r,refs:o,onTransition:c,onError:a}=e,i=(f,S,I)=>{t.actorById.get(f)?.bag.set(S,I)},u=(f,S)=>{t.actorById.get(f)?.bag.delete(S)},l=(f,S)=>new Promise((I,E)=>{let x=()=>S!==void 0&&!t.actorById.has(S.actorId),y=()=>new h("LITE_FSM_ACTOR_DISPOSED","Actor was disposed before condition resolved.");if(x())return E(y());let M,D=()=>{_(),S&&M&&u(S.actorId,M)},_=c((G,K,P)=>{if(!re(P)){if(x())return _();try{if(!f(P))return;if(x())return _();D(),I(!0)}catch(v){D(),E(v)}}});S&&(M=Symbol("condition"),i(S.actorId,M,()=>{_(),E(y())}))}),A=f=>l(f),R=f=>{let S=(I=>o.transition(I,{sender:f}));return S.unscoped=I=>o.transition(I,{sender:f,forceUnscoped:!0}),S.actor=(I,E)=>o.transition({...E,meta:{actorId:I}},{sender:f}),S.group=(I,E)=>o.transition({...E,meta:{groupId:I}},{sender:f}),S.tag=(I,E)=>o.transition({...E,meta:{groupTag:I}},{sender:f}),S},p=(f,S,I)=>{let E=x=>o.transition(x);for(let x of r){let y=n[x],M=f[x],D=S[x];y.invokeEffect(M.state,D.state,{...o.userDeps,transition:E,action:I,condition:A}).catch(_=>a?.(_))}},m=(f,S,I,E)=>{for(let x of E){let{actorId:y,groupId:M,groupTag:D}=x.meta,_=n[x.templateKey],G=f[x.templateKey],K=S[x.templateKey],P=G?.[y],v=K?.[y];if(!v)continue;let F={actorId:y,groupId:M,groupTag:D};_.invokeEffect(P?.state??"__INIT",v.state,{...o.userDeps,transition:R(F),action:I,condition:Y=>l(Y,F),self:F,[te]:i}).catch(Y=>a?.(Y))}};return{condition:A,invokeEffects:(f,S,I,E)=>{p(f,S,I),m(f,S,I,E)}}};var We=(e,t)=>({normalizeOpts:e,countersBase:t,pendingSpawned:[],pendingDelivered:[],pendingDeleted:[],touchedActorRecords:new Map,effectsTargets:[]}),Ue=e=>(e.countersDraft||(e.countersDraft=Q(e.countersBase)),e.countersDraft),Ye=(e,t,n)=>e?`${e}${U}${t}/${n}`:`${t}/${n}`,Xe=(e,t,n,r,o)=>{let c=Ue(e),a=c.groupByTag.get(t)??0;c.groupByTag.set(t,a+1);let i=r.generateGroupId?ye(r.generateGroupId({templateKey:t,groupTag:t,counter:a,originId:r.originId,action:n}),"group"):Ye(r.originId,t,a);if(o(i))throw new h("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] groupId '${i}' is already in use.`);return i},qe=(e,t,n,r,o,c)=>{let a=Ue(e),i=a.actor;a.actor=i+1;let u=o.generateActorId?ye(o.generateActorId({templateKey:t,groupTag:n,counter:i,originId:o.originId,action:r}),"actor"):Ye(o.originId,t,i);if(c(u))throw new h("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] actorId '${u}' is already in use.`);return u},se=(e,t,n)=>{let r=e.touchedActorRecords.get(n);if(r)return{root:t,record:r};let o=t[n],c=o===$?{}:{...o},a={...t,[n]:c};return e.touchedActorRecords.set(n,c),{root:a,record:c}};var Xt=e=>{if(!N(e))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot must be an object envelope.");if(!N(e.machines))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot.machines must be an object.");return{schemaVersion:typeof e.schemaVersion=="number"?e.schemaVersion:void 0,machines:e.machines}},he=e=>({state:e.state,context:e.context}),qt=e=>N(e)&&V(e,"snapshot")?{snapshot:e.snapshot,meta:e.meta}:{snapshot:e},Je=(e,t)=>N(e)?{...e,meta:t}:e,Jt=(e,t,n)=>e&&N(t)&&t.state===e.state&&t.context===e.context?e:Je(t,n),Qt=(e,t,n,r,o)=>{if(!N(n))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${t}'.`);let c=e[t],i=o.config[t].hydrate,u=r==="replace"?{}:{...c},l=!1;for(let[A,R]of Object.entries(n)){let p=c[A],m=qt(R),b=i?i(p?he(p):void 0,m.snapshot,{strategy:r}):m.snapshot,f=Jt(p,b,p?.meta??m.meta);c[A]!==f&&(l=!0),u[A]=f}if(r==="replace"&&!l){for(let A of Object.keys(c))if(!(A in u)){l=!0;break}}return{record:l?u:c,changed:l}},ie=(e,t,n,r,o,c="commit")=>{let a=Xt(t);c==="commit"&&a.schemaVersion!==o.schemaVersion&&o.onSchemaVersionMismatch?.(a.schemaVersion,o.schemaVersion);let i,u=[];for(let l of Object.keys(a.machines)){if(!V(o.config,l)){c==="commit"&&(O&&console.warn(`[lite-fsm] hydrate: unknown machine key '${l}', skipped.`),o.onUnknownMachineKey?.(l,r));continue}let A=l;if(o.runtimeActorTemplateKeys.includes(A)){O&&console.warn(`[lite-fsm] hydrate: runtime actor template '${A}' was skipped \u2014 runtime actor templates do not participate in hydrate/dehydrate.`);continue}if(o.snapshotActorTemplateKeys.includes(A)){let f=Qt(e,A,a.machines[l],n,o);if(!f.changed)continue;i=i??{...e},i[A]=f.record,u.push(A);continue}let R=e[A],p=a.machines[l],m=o.config[A].hydrate,b=m?m(R,p,{strategy:n}):p;b!==R&&(i=i??{...e},i[A]=b)}return{nextState:i??e,changedActorTemplateKeys:u}},Qe=(e,t,n,r,o,c,a,i)=>{let u=i?.machines;if(u)for(let p of u){if(!V(t,p))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: unknown machine key '${p}'.`);if(o.includes(p))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: runtime actor template '${p}' cannot be dehydrated.`)}let l=p=>{let m=e[p];if(!N(m))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let f=t[p].dehydrate,S={};for(let[I,E]of Object.entries(m)){let x=n.actorById.get(I);if(!x)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${I}' has no runtime identity.`);S[I]={snapshot:f?f(he(E)):he(E),meta:x.meta}}return S},A=u??[...c,...r],R={};for(let p of A){if(r.includes(p)){R[p]=l(p);continue}let b=t[p].dehydrate;R[p]=b?b(e[p]):e[p]}return{schemaVersion:a,machines:R}};var Ze=(e,t,n)=>{let r=new Map,o=[];for(let a of e){let i=!1;for(let[u,l]of Object.entries(t(a)))if(!(!l||!n(u)))for(let A of Object.keys(l)){i=!0;let R=r.get(A);R||r.set(A,R=new Set),R.add(a)}i||o.push(a)}let c=new Map;for(let[a,i]of r)c.set(a,[...i]);return{index:c,keysWithoutEdges:o}},Zt=(e,t,n)=>{let r=new Map;for(let o of e){let c=n(o);for(let a of Object.keys(t(o).__INIT??{})){let i=r.get(a);i||r.set(a,i=new Map);let u=i.get(c);u||i.set(c,u=[]),u.push(o)}}return r},et=(e,t,n,r)=>{let o=u=>e[u].config,c=Ze(n,o,()=>!0),a=Ze(t,o,u=>u!=="__INIT"),i=Zt(t,o,r);return{domainReduceIndex:c.index,domainAlwaysReduce:c.keysWithoutEdges,actorReduceIndex:a.index,actorSpawnIndex:i}},tt=e=>{let t=a=>e[a],n=a=>t(a).config;return{groupTagForTemplate:a=>t(a).groupTag??a,hasActorTransition:(a,i,u)=>ae(n(a),i,u.type,!0)!==void 0,isPublicActorState:(a,i)=>i==="__INIT"||j(i)?!1:V(t(a).config,i)}};var nt=e=>{if(re(e))throw new Error(`[lite-fsm] reserved system action '${e.type}' cannot be dispatched.`)},ot=e=>{let{sidecar:t}=e,n=(o,{sender:c,forceUnscoped:a=!1}={})=>{if(!c&&!a&&!("meta"in o))return o;if(c&&!t.actorById.has(c.actorId))return X;let i=Ve(o.meta);return c&&(i.senderActorId=c.actorId,i.senderGroupId=c.groupId,i.senderGroupTag=c.groupTag),a?Ae(o,Ge(i)):(c&&i.actorId===void 0&&i.groupId===void 0&&i.groupTag===void 0&&(i.groupId=c.groupId,i.groupTag=c.groupTag),Ae(o,i))};return{normalizeAction:n,applyPostNormalize:(o,c)=>{let a=n(c,o.normalizeOpts);a!==X&&(o.committed=a)}}};var en=(e,t)=>{let n=[];for(let r of t){let o=e.groupIdsByTag.get(r);if(o)for(let c of o)n.push(c)}return n},tn=e=>{let t=new Map;for(let n of e){let r=t.get(n.templateKey);r?r.push(n):t.set(n.templateKey,[n])}return t},rt=(e,t,n,r)=>{if(n===null){for(let o of e.actorIdsByTemplate.get(t)??[])r(o);return}for(let o of n){let c=e.groupById.get(o)?.actorIdsByTemplate.get(t);if(c)for(let a of c)r(a)}},at=e=>{let{sidecar:t,actorTemplateKeys:n,actorSpawnIndex:r,actorReduceIndex:o,spawnIdConfig:c}=e;return{resolveSpawnGroups:(u,l,A,R)=>{if(u==="group"){let f=[];for(let S of l){let I=t.groupById.get(S);I&&f.push({groupId:S,groupTag:I.groupTag})}return f}if(u==="tag"){let f=[];for(let S of l)for(let I of t.groupIdsByTag.get(S)??[])f.push({groupId:I,groupTag:S});return f}let p=[],m=new Set,b=f=>t.groupById.has(f)||m.has(f);for(let f of r.get(R.type)?.keys()??[]){let S=Xe(A,f,R,c,b);m.add(S),p.push({groupId:S,groupTag:f})}return p},forEachRoutedIdentity:(u,l,A,R,p)=>{if(u==="actor"){for(let x of l){let y=t.actorById.get(x);y&&p(y)}return}let m=u==="group"?l:u==="tag"?en(t,l):null;if(A.length===0){for(let x of o.get(R.type)??[])rt(t,x,m,y=>{let M=t.actorById.get(y);M&&p(M)});return}let b=new Set(o.get(R.type)??[]),f=tn(A),S=new Set(l),I=x=>u==="unscoped"?!0:u==="group"?S.has(x.meta.groupId):S.has(x.meta.groupTag),E=new Set;for(let x of n){b.has(x)&&rt(t,x,m,y=>{if(E.has(y))return;let M=t.actorById.get(y);M&&(E.add(y),p(M))});for(let y of f.get(x)??[]){let M=y.meta.actorId;E.has(M)||I(y)&&(E.add(M),p(y))}}}}};var ct=()=>({actorById:new Map,groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map,counters:{actor:0,groupByTag:new Map}}),nn=()=>({groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map}),st=(e,t,n)=>{let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)},it=(e,t,n)=>{let r=e.get(t);r?.delete(n),r?.size===0&&e.delete(t)},dt=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta,c=e.groupById.get(r);c||(c={groupTag:o,actorIds:new Set,actorIdsByTemplate:new Map},e.groupById.set(r,c)),c.actorIds.add(n),st(c.actorIdsByTemplate,t.templateKey,n),st(e.actorIdsByTemplate,t.templateKey,n);let a=e.groupIdsByTag.get(o);a||(a=new Set,e.groupIdsByTag.set(o,a)),a.add(r)},on=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta;it(e.actorIdsByTemplate,t.templateKey,n);let c=e.groupById.get(r);if(!c||(c.actorIds.delete(n),it(c.actorIdsByTemplate,t.templateKey,n),c.actorIds.size>0))return;e.groupById.delete(r);let a=e.groupIdsByTag.get(o);a?.delete(r),a?.size===0&&e.groupIdsByTag.delete(o)},pt=e=>{for(let t of e.bag.values())t();e.bag.clear()},rn=(e,t,n,r,o)=>{if(r.length===0)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor id for template '${n}' must be non-empty.`);if(!Oe(o)||!t.isPublicActorState(n,o.state))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor slice '${n}.${r}'.`);let c=e.actorById.get(r);if(c){if(c.templateKey!==n)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot move between actor template records.`);return{identity:c,isNew:!1}}let a=o.meta;if(!N(a))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot be created by state replacement without actor meta.`);let{groupId:i,groupTag:u}=a;if(a.actorId!==r||typeof u!="string"||u!==t.groupTagForTemplate(n)||typeof i!="string"||i.length===0)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' has invalid actor meta.`);return{identity:{templateKey:n,meta:W({actorId:r,groupId:i,groupTag:u})},isNew:!0}},an=e=>{let t=nn();for(let n of e.values())dt(t,n);return t},Ie=(e,t,n,r)=>{let o=new Set,c=new Map,a=new Map(e.actorById),i=new Map,u=[];for(let p of n){let m=r[p];if(!N(m))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let b={};for(let[f,S]of Object.entries(m)){if(o.has(f))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Duplicate actorId '${f}'.`);o.add(f);let{identity:I,isNew:E}=rn(e,t,p,f,S);b[f]={...S,meta:I.meta},E&&c.set(f,I)}i.set(p,b)}for(let[p,m]of c)a.set(p,{...m,bag:new Map});let l=new Set(n);for(let[p,m]of a)l.has(m.templateKey)&&(o.has(p)||(u.push(m),a.delete(p)));let A=an(a),R=Q(e.counters);for(let[p,m]of c)je(R,p,m.meta.groupId,t.originId);return{nextActorById:a,nextGroupById:A.groupById,nextGroupIdsByTag:A.groupIdsByTag,nextActorIdsByTemplate:A.actorIdsByTemplate,nextCounters:R,canonicalActorRecords:i,actorsToCleanup:u,touchedTemplateKeys:n}},sn=(e,t)=>{e.actorById=t.nextActorById,e.groupById=t.nextGroupById,e.groupIdsByTag=t.nextGroupIdsByTag,e.actorIdsByTemplate=t.nextActorIdsByTemplate,e.counters=t.nextCounters;for(let n of t.actorsToCleanup)pt(n)},cn=(e,t)=>{let n=new Set(t.pendingDeleted.map(r=>r.meta.actorId));for(let r of t.pendingSpawned){if(n.has(r.meta.actorId))continue;let o={...r,bag:new Map};e.actorById.set(r.meta.actorId,o),dt(e,o)}for(let r of t.pendingDeleted){let o=e.actorById.get(r.meta.actorId);o&&(e.actorById.delete(r.meta.actorId),on(e,o),pt(o))}},ut=(e,t)=>{let n=e;for(let r of t){let o=n[r];o&&o!==$&&Object.keys(o).length===0&&(n={...n,[r]:$})}return n},gt=(e,t,n)=>(t.countersDraft&&(e.counters=He(e.counters,t.countersDraft)),cn(e,t),ut(n,t.touchedActorRecords.keys())),Te=(e,t,n)=>{for(let[r,o]of t.canonicalActorRecords)n={...n,[r]:o};return sn(e,t),ut(n,t.touchedTemplateKeys)},Re=(e,t)=>{let n=[];for(let r of t){let o=e.actorById.get(r.meta.actorId);o&&n.push(o)}return n};var ft=(e,t)=>{let n=t?.originId;if(n!==void 0&&(n.length===0||n.includes(U)))throw new h("LITE_FSM_INVALID_OPTIONS",`[lite-fsm] originId must be a non-empty string without '${U}'.`);let r={originId:n,generateActorId:t?.generateActorId,generateGroupId:t?.generateGroupId},o=Object.keys(e),c=(s,g)=>s[g],a=o.filter(s=>J(e[s])),i=o.filter(s=>!J(e[s]));for(let s of a)Be(s,e[s]);for(let s of i)if(V(e[s],"persistence"))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] domain machine '${s}' cannot define actor persistence.`);let u=a.filter(s=>e[s].persistence==="snapshot"),l=a.filter(s=>e[s].persistence!=="snapshot"),A=!!t?.middleware?.some(oe),R=t?.schemaVersion,{groupTagForTemplate:p,hasActorTransition:m,isPublicActorState:b}=tt(e),{domainReduceIndex:f,domainAlwaysReduce:S,actorReduceIndex:I,actorSpawnIndex:E}=et(e,a,i,p),x=s=>!!e[s].effects,y=i.filter(x),M=a.some(x),D=y.length>0||M;if(O)for(let s of i)e[s].groupTag&&console.warn(`[lite-fsm] groupTag on domain machine '${s}' is ignored.`);let _=Object.fromEntries(o.map(s=>[s,Z(e[s],{allowActorTemplate:!0,allowVoidReducer:()=>A})])),G={transition:void 0,userDeps:{}},K=[],P=Object.fromEntries(o.map(s=>[s,a.includes(s)?$:{state:e[s].initialState,context:e[s].initialContext}])),v=ct(),F=null,{normalizeAction:Y,applyPostNormalize:lt}=ot({sidecar:v}),{resolveSpawnGroups:St,forEachRoutedIdentity:mt}=at({sidecar:v,actorTemplateKeys:a,actorSpawnIndex:E,actorReduceIndex:I,spawnIdConfig:r}),At=(s,g)=>{let d=s,T=C=>{let w=_[C],k=s[C],L=w.transition(k,g);L!==k&&(d=d===s?{...s}:d,d[C]=L)};for(let C of S)T(C);for(let C of f.get(g.type)??[])T(C);return d},ht=(s,g,d,T,C)=>{let w=g,k=E.get(d.type);if(!k)return w;let L=B=>v.actorById.has(B)||s.pendingSpawned.some(z=>z.meta.actorId===B);for(let B of St(T,C,s,d))for(let z of k.get(B.groupTag)??[]){let kt=e[z],Nt=W({actorId:qe(s,z,B.groupTag,d,r,L),groupId:B.groupId,groupTag:B.groupTag}),ge={templateKey:z,meta:Nt},Ot={state:"__INIT",context:{...kt.initialContext},meta:ge.meta},_e=se(s,w,z);_e.record[ge.meta.actorId]=Ot,w=_e.root,s.pendingSpawned.push(ge)}return w},It=(s,g,d,T)=>{let w=c(g,d.templateKey)?.[d.meta.actorId];if(!w||!m(d.templateKey,w.state,T))return{root:g,delivered:!1};let k=se(s,g,d.templateKey),B=_[d.templateKey].transition(w,T);return O&&Le(d.meta.actorId,d.templateKey,B.state,b),k.record[d.meta.actorId]={...B,meta:d.meta},{root:k.root,delivered:!0}},Tt=(s,g)=>{let d=g,T=new Set;for(let C of[...s.pendingSpawned,...s.pendingDelivered]){if(T.has(C.meta.actorId))continue;T.add(C.meta.actorId);let k=c(d,C.templateKey)?.[C.meta.actorId];if(!k||!j(k.state))continue;let L=se(s,d,C.templateKey);delete L.record[C.meta.actorId],d=L.root,s.pendingDeleted.push(C)}return d},ce=(s,g)=>{let d=F,{scope:T,targetSet:C}=Ke(g.meta),w=At(s,g);return T!=="actor"&&(w=ht(d,w,g,T,C)),mt(T,C,d.pendingSpawned,g,k=>{let L=It(d,w,k,g);w=L.root,L.delivered&&d.pendingDelivered.push(k)}),Tt(d,w)},Me=s=>{ce=s(ce)},Ce={actorTemplateKeys:a,groupTagForTemplate:p,isPublicActorState:b,originId:n},Rt=s=>{let g=[],d=new Set,T=C=>{for(let w of C){let k=w.meta.actorId;d.has(k)||(d.add(k),g.push(w))}};T(Re(v,s.pendingSpawned)),T(Re(v,s.pendingDelivered)),s.effectsTargets=g},Mt=(s,g,d)=>a.filter(T=>s[T]===g[T]?!1:d.touchedActorRecords.get(T)!==g[T]),Ct=(s,g,d)=>{let T=Mt(g,d,s),C=T.length?Ie(v,Ce,T,d):void 0,w=C?Te(v,C,d):d;return gt(v,s,w)},de=s=>(K.push(s),()=>{K=K.filter(g=>g!==s)}),xe=(s,g,d)=>{for(let T of K)T(s,g,d)},{condition:xt,invokeEffects:Et}=ze({sidecar:v,machines:_,domainKeys:y,refs:G,onTransition:de,onError:t?.onError}),Ee=()=>P,wt=()=>({schemaVersion:R,machines:{...P}}),pe={config:e,snapshotActorTemplateKeys:u,runtimeActorTemplateKeys:l,schemaVersion:R,groupTagForTemplate:p,onSchemaVersionMismatch:t?.onSchemaVersionMismatch,onUnknownMachineKey:t?.onUnknownMachineKey},we=(s,g)=>{if(s.changedActorTemplateKeys.length===0)return g;let d=Ie(v,Ce,s.changedActorTemplateKeys,g);return Te(v,d,g)},Dt=(s,{strategy:g="merge",baseState:d=P}={})=>ie(d,s,g,"hydrate",pe,"preview").nextState,De=t?.snapshot;if(De){let s=ie(P,De,"replace","opts.snapshot",pe);P=we(s,s.nextState)}O&&H(P);let Pt=(s,{strategy:g="merge"}={})=>{let d=P,T=ie(d,s,g,"hydrate",pe),C=T.nextState;C!==d&&(P=we(T,C),O&&H(P),xe(d,P,{type:ve,payload:{strategy:g,snapshot:s}}))},_t=(s=>Qe(P,e,v,u,l,i,R,s)),Pe=s=>{let g=F;if(g.committed)throw new Error("[lite-fsm] middleware called next() more than once for a single transition.");let d=P;if(lt(g,s),!g.committed)return s;g.committedPrevState=d;let T=ce(d,g.committed);if(T===void 0)throw new Error(q);return P=Ct(g,d,T),M&&Rt(g),O&&H(P),xe(d,P,g.committed),g.committed},bt=(()=>{let s=t?.middleware;if(!s?.length)return Pe;let g={getState:Ee,transition:T=>ue(T),replaceReducer:Me,onTransition:de,condition:xt},d=s.map(T=>T(g));return ne(...d)(Pe)})();function ue(s,g={}){nt(s);let d=Y(s,g);if(d===X)return s;let T=F,C=We(g,v.counters);F=C;let w;try{w=bt(d)}finally{F=T}return C.committed?(D&&Et(C.committedPrevState,P,C.committed,C.effectsTargets),C.committed):w}let vt=s=>{let g=G.userDeps,d=typeof s=="function"?s(g):s;G.userDeps=d};return G.transition=ue,{getState:Ee,getSnapshot:wt,getHydratedState:Dt,hydrate:Pt,dehydrate:_t,transition:ue,setDependencies:vt,onTransition:de,replaceReducer:Me}};function yt(e){return e}var dn=e=>e,pn=e=>e,un=Symbol.for("lite-fsm.owner.domain"),gn=({type:e,effect:t,cancelFn:n})=>{let r=new Map;return o=>{let c=o,a=c.self?.actorId??un,i=r.get(a)??{lastId:0};i.lastId+=1,i.cancel=n?.(o),r.set(a,i);let u=i.lastId;c.self&&!i.dispose&&(i.dispose=()=>r.delete(a),c[te]?.(c.self.actorId,Symbol("createEffect"),i.dispose));let l=()=>e==="latest"&&u!==r.get(a)?.lastId?!1:!i.cancel?.(),A=Object.assign(R=>l()?o.transition(R):R,o.transition);if(c.self){let R=o.transition;A.unscoped=p=>l()?R.unscoped(p):p,A.actor=(p,m)=>l()?R.actor(p,m):m,A.group=(p,m)=>l()?R.group(p,m):m,A.tag=(p,m)=>l()?R.tag(p,m):m}return t({...o,transition:A})}},fn=e=>gn(e);0&&(module.exports={LiteFsmError,Machine,MachineManager,createActorMeta,createConfig,createEffect,createMachine,createReducer,defineMachine});
@@ -0,0 +1,15 @@
1
+ import type { AnyEvent, AnyRecord, CFG, EffectType, MachineEffect, MachineReducer, StateName, WILDCARD } from "./types";
2
+ export type * from "./interfaces";
3
+ export { createActorMeta } from "./actor";
4
+ export { CreateMachine as Machine, defineMachine } from "./Machine";
5
+ export { MachineManager } from "./MachineManager";
6
+ export * from "./types";
7
+ export { createMachine, type TypedCreateMachineFn } from "./createMachine";
8
+ export { LiteFsmError } from "./utils";
9
+ export declare const createReducer: <C extends object, T extends AnyRecord, P extends AnyEvent = AnyEvent>(reducer: MachineReducer<C, P, T>) => MachineReducer<C, P, T>;
10
+ export declare const createConfig: <C extends object, P extends AnyEvent = AnyEvent>(cfg: C & CFG<C, P, StateName<C> | WILDCARD>) => C;
11
+ export declare const createEffect: <P extends AnyEvent = AnyEvent, D extends AnyRecord = {}, C extends { [key in keyof C]: object; } = Record<string, never>, N extends StateName<C> | WILDCARD = StateName<C> | WILDCARD>(opts: {
12
+ effect: MachineEffect<N, C, P, D>;
13
+ type?: EffectType;
14
+ cancelFn?: (deps: Parameters<MachineEffect<N, C, P, D>>[0]) => () => boolean;
15
+ }) => (opts: D & ((string extends keyof C ? false : "__INIT" extends keyof C ? true : false) extends true ? import("./types").ActorDefaultDeps<N, C, P> : import("./types").DefaultDeps<N, C, P>)) => void | Promise<void>;
@@ -0,0 +1,15 @@
1
+ import type { AnyEvent, AnyRecord, CFG, EffectType, MachineEffect, MachineReducer, StateName, WILDCARD } from "./types";
2
+ export type * from "./interfaces";
3
+ export { createActorMeta } from "./actor";
4
+ export { CreateMachine as Machine, defineMachine } from "./Machine";
5
+ export { MachineManager } from "./MachineManager";
6
+ export * from "./types";
7
+ export { createMachine, type TypedCreateMachineFn } from "./createMachine";
8
+ export { LiteFsmError } from "./utils";
9
+ export declare const createReducer: <C extends object, T extends AnyRecord, P extends AnyEvent = AnyEvent>(reducer: MachineReducer<C, P, T>) => MachineReducer<C, P, T>;
10
+ export declare const createConfig: <C extends object, P extends AnyEvent = AnyEvent>(cfg: C & CFG<C, P, StateName<C> | WILDCARD>) => C;
11
+ export declare const createEffect: <P extends AnyEvent = AnyEvent, D extends AnyRecord = {}, C extends { [key in keyof C]: object; } = Record<string, never>, N extends StateName<C> | WILDCARD = StateName<C> | WILDCARD>(opts: {
12
+ effect: MachineEffect<N, C, P, D>;
13
+ type?: EffectType;
14
+ cancelFn?: (deps: Parameters<MachineEffect<N, C, P, D>>[0]) => () => boolean;
15
+ }) => (opts: D & ((string extends keyof C ? false : "__INIT" extends keyof C ? true : false) extends true ? import("./types").ActorDefaultDeps<N, C, P> : import("./types").DefaultDeps<N, C, P>)) => void | Promise<void>;