@xstate/effect 0.1.0-alpha.7 → 1.0.0-alpha.11

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.
@@ -1,6 +1,5 @@
1
1
  import { Effect } from 'effect';
2
- import { type ActorLogicValidator, type AnyActorRef, type EventObject, type MachineContext, type SetupConfig, type SetupReturn, type SetupSchemas, type SetupStateSchema, type Sources, type SystemRegistry, type SystemRuntime } from 'xstate';
3
- import { effectActionBrand } from "./brands.js";
2
+ import { type ActorLogicValidator, type AnyActorRef, type EventObject, type MachineContext, type InferEvents, type StandardSchemaV1, type SetupConfig, type SetupReturn, type SetupSchemas, type SetupStateSchema, type Sources, type SystemRegistry, type SystemRuntime } from 'xstate';
4
3
  import type { EffectRequirements } from "./types.js";
5
4
  import { type EffectSetupSchemas, type EffectSetupStateSchema, type ToStandardSetupSchemas, type ToStandardSetupStates, type ValidateEffectSetupSchemas, type ValidateEffectSetupStates } from "./schema.js";
6
5
  /**
@@ -33,19 +32,53 @@ export type EffectActionArgs<TContext extends MachineContext = MachineContext, T
33
32
  */
34
33
  export type EffectAction<TContext extends MachineContext = MachineContext, TEvent extends EventObject = EventObject, TError = unknown, TRequirements = never> = (args: EffectActionArgs<TContext, TEvent>) => Effect.Effect<void, TError, TRequirements>;
35
34
  type AnyEffectAction = EffectAction<any, any, any, any>;
35
+ type EffectActionSource = (...args: never[]) => Effect.Effect<void, any, any>;
36
+ type ActionContext<TSchemas> = TSchemas extends {
37
+ context: infer TContext extends StandardSchemaV1;
38
+ } ? Extract<StandardSchemaV1.InferOutput<TContext>, MachineContext> : Record<string, unknown>;
39
+ type ActionEvents<TSchemas> = (TSchemas extends {
40
+ events: infer TEvents extends Record<string, StandardSchemaV1>;
41
+ } ? InferEvents<TEvents> : EventObject) | (TSchemas extends {
42
+ internalEvents: infer TEvents extends Record<string, StandardSchemaV1>;
43
+ } ? string extends keyof TEvents ? never : InferEvents<TEvents> : never);
44
+ type ActionInput<TSchemas, TKey extends PropertyKey> = TSchemas extends {
45
+ actions: {
46
+ [K in TKey]: {
47
+ params: infer TParams extends StandardSchemaV1;
48
+ };
49
+ };
50
+ } ? StandardSchemaV1.InferOutput<TParams> & Pick<EffectActionArgs, 'self'> : EffectActionArgs<ActionContext<TSchemas>, ActionEvents<TSchemas>>;
51
+ type ActionSources<TSchemas, TActionMap> = {
52
+ [K in keyof TActionMap]: (args: ActionInput<TSchemas, K>) => Effect.Effect<void, any, any>;
53
+ };
54
+ type AnnotatedActionSources<TSchemas, TActionMap> = TActionMap extends {
55
+ [K in keyof TActionMap]: TSchemas extends {
56
+ actions: {
57
+ [P in K]: {
58
+ params: StandardSchemaV1;
59
+ };
60
+ };
61
+ } ? ActionSources<TSchemas, TActionMap>[K] : AnyEffectAction;
62
+ } ? unknown : never;
36
63
  type EffectActionRequirements<TAction> = TAction extends (...args: any[]) => infer TResult ? EffectRequirements<TResult> : never;
37
- type CoreEffectAction<TAction> = TAction extends (...args: infer TArgs) => any ? ((...args: TArgs) => void) & {
38
- readonly [effectActionBrand]?: EffectActionRequirements<TAction>;
64
+ type CoreEffectAction<TAction, TInput = never> = TAction extends (...args: infer TArgs) => any ? ((...args: [TInput] extends [never] ? TArgs : [args: TInput]) => void) & {
65
+ readonly '~effectRequirements'?: EffectActionRequirements<TAction>;
39
66
  } : never;
40
- type CoreEffectActionMap<TActionMap> = {
41
- [K in keyof TActionMap]: CoreEffectAction<TActionMap[K]>;
67
+ type CoreEffectActionMap<TActionMap, TSchemas> = {
68
+ [K in keyof TActionMap]: CoreEffectAction<TActionMap[K], TSchemas extends {
69
+ actions: {
70
+ [P in K]: {
71
+ params: StandardSchemaV1;
72
+ };
73
+ };
74
+ } ? ActionInput<TSchemas, K> : never>;
42
75
  };
43
- type EffectSetupConfig<TSchemas extends EffectSetupSchemas, TStates extends Record<string, EffectSetupStateSchema>, TActionMap extends Record<string, AnyEffectAction>, TActorMap extends Sources['actors'], TGuardMap extends Sources['guards'], TDelayMap extends Sources['delays'], TValidator extends ActorLogicValidator | undefined, TSourceSchemas extends SetupSchemas = ToStandardSetupSchemas<TSchemas>> = {
76
+ type EffectSetupConfig<TSchemas extends EffectSetupSchemas, TStates extends Record<string, EffectSetupStateSchema>, TActionMap extends Record<string, EffectActionSource>, TActorMap extends Sources['actors'], TGuardMap extends Sources['guards'], TDelayMap extends Sources['delays'], TValidator extends ActorLogicValidator | undefined, TSourceSchemas extends SetupSchemas = ToStandardSetupSchemas<TSchemas>, TContextualActions extends boolean = true> = {
44
77
  validator?: TValidator;
45
- actions?: TActionMap & Record<string, AnyEffectAction>;
78
+ actions?: TActionMap & (TContextualActions extends true ? ActionSources<NoInfer<TSourceSchemas>, TActionMap> : AnnotatedActionSources<NoInfer<TSourceSchemas>, TActionMap>);
46
79
  actors?: TActorMap;
47
- guards?: NonNullable<SetupConfig<TSourceSchemas, ToStandardSetupStates<TStates>, CoreEffectActionMap<TActionMap>, TActorMap, TGuardMap, TDelayMap, TValidator>['guards']>;
48
- delays?: NonNullable<SetupConfig<TSourceSchemas, ToStandardSetupStates<TStates>, CoreEffectActionMap<TActionMap>, TActorMap, TGuardMap, TDelayMap, TValidator>['delays']>;
80
+ guards?: NonNullable<SetupConfig<TSourceSchemas, ToStandardSetupStates<TStates>, CoreEffectActionMap<TActionMap, TSourceSchemas>, TActorMap, TGuardMap, TDelayMap, TValidator>['guards']>;
81
+ delays?: NonNullable<SetupConfig<TSourceSchemas, ToStandardSetupStates<TStates>, CoreEffectActionMap<TActionMap, TSourceSchemas>, TActorMap, TGuardMap, TDelayMap, TValidator>['delays']>;
49
82
  schemas?: TSchemas & ([TValidator] extends [ActorLogicValidator] ? ValidateEffectSetupSchemas<TSchemas> : unknown);
50
83
  states?: TStates & ([TValidator] extends [ActorLogicValidator] ? ValidateEffectSetupStates<TStates> : unknown);
51
84
  };
@@ -71,7 +104,7 @@ type ExtendValidatorConfig<TExtension> = [TExtension] extends [
71
104
  } : {
72
105
  validator: TExtension;
73
106
  };
74
- type EffectSetupExtensionConfig<TBaseSchemas extends SetupSchemas, TBaseStates extends Record<string, SetupStateSchema>, TBaseValidator extends ActorLogicValidator | undefined, TExtensionSchemas extends EffectSetupSchemas, TExtensionStates extends Record<string, EffectSetupStateSchema>, TExtensionActionMap extends Record<string, AnyEffectAction>, TExtensionActorMap extends Sources['actors'], TExtensionGuardMap extends Sources['guards'], TExtensionDelayMap extends Sources['delays'], TExtensionValidator extends ActorLogicValidator | undefined | InheritedEffectValidator> = EffectSetupConfig<TExtensionSchemas, TExtensionStates, TExtensionActionMap, TExtensionActorMap, TExtensionGuardMap, TExtensionDelayMap, ResolveExtendedValidator<TBaseValidator, TExtensionValidator>, MergeSetupSchemas<TBaseSchemas, ToStandardSetupSchemas<TExtensionSchemas>>> & ExtendValidatorConfig<TExtensionValidator> & RuntimeValidationCompatibility<NoInfer<TBaseSchemas>, NoInfer<TBaseStates>, ResolveExtendedValidator<TBaseValidator, TExtensionValidator>>;
107
+ type EffectSetupExtensionConfig<TBaseSchemas extends SetupSchemas, TBaseStates extends Record<string, SetupStateSchema>, TBaseValidator extends ActorLogicValidator | undefined, TExtensionSchemas extends EffectSetupSchemas, TExtensionStates extends Record<string, EffectSetupStateSchema>, TExtensionActionMap extends Record<string, EffectActionSource>, TExtensionActorMap extends Sources['actors'], TExtensionGuardMap extends Sources['guards'], TExtensionDelayMap extends Sources['delays'], TExtensionValidator extends ActorLogicValidator | undefined | InheritedEffectValidator, TContextualActions extends boolean = true> = EffectSetupConfig<TExtensionSchemas, TExtensionStates, TExtensionActionMap, TExtensionActorMap, TExtensionGuardMap, TExtensionDelayMap, ResolveExtendedValidator<TBaseValidator, TExtensionValidator>, MergeSetupSchemas<TBaseSchemas, ToStandardSetupSchemas<TExtensionSchemas>>, TContextualActions> & ExtendValidatorConfig<TExtensionValidator> & RuntimeValidationCompatibility<NoInfer<TBaseSchemas>, NoInfer<TBaseStates>, ResolveExtendedValidator<TBaseValidator, TExtensionValidator>>;
75
108
  /**
76
109
  * What `setupEffect` returns: the XState `SetupReturn` with an `extend` method
77
110
  * that also accepts Effect schemas and Effect-returning actions. Call
@@ -79,7 +112,8 @@ type EffectSetupExtensionConfig<TBaseSchemas extends SetupSchemas, TBaseStates e
79
112
  * contribute to `RequirementsFrom`.
80
113
  */
81
114
  export type EffectSetupReturn<TStates extends Record<string, SetupStateSchema> = Record<string, SetupStateSchema>, TSchemas extends SetupSchemas = {}, TSetupActionMap extends Sources['actions'] = {}, TSetupActorMap extends Sources['actors'] = {}, TSetupGuardMap extends Sources['guards'] = {}, TSetupDelayMap extends Sources['delays'] = {}, TSetupDelays extends string = Extract<keyof TSetupDelayMap, string>, TValidator extends ActorLogicValidator | undefined = undefined> = Omit<SetupReturn<TStates, TSchemas, TSetupActionMap, TSetupActorMap, TSetupGuardMap, TSetupDelayMap, TSetupDelays, SystemRegistry, TValidator>, 'extend'> & {
82
- extend<const TExtensionSchemas extends EffectSetupSchemas = {}, const TExtensionStates extends Record<string, EffectSetupStateSchema> = {}, TExtensionActionMap extends Record<string, AnyEffectAction> = {}, TExtensionActorMap extends Sources['actors'] = {}, TExtensionGuardMap extends Sources['guards'] = {}, TExtensionDelayMap extends Sources['delays'] = {}, const TExtensionValidator extends ActorLogicValidator | undefined | InheritedEffectValidator = InheritedEffectValidator>(config: EffectSetupExtensionConfig<TSchemas, TStates, TValidator, TExtensionSchemas, TExtensionStates, TExtensionActionMap, TExtensionActorMap, TExtensionGuardMap, TExtensionDelayMap, TExtensionValidator>): EffectSetupReturn<MergeRecord<TStates, ToStandardSetupStates<TExtensionStates>>, MergeSetupSchemas<TSchemas, ToStandardSetupSchemas<TExtensionSchemas>>, MergeRecord<TSetupActionMap, CoreEffectActionMap<TExtensionActionMap>>, MergeRecord<TSetupActorMap, TExtensionActorMap>, MergeRecord<TSetupGuardMap, TExtensionGuardMap>, MergeRecord<TSetupDelayMap, TExtensionDelayMap>, TSetupDelays | Extract<keyof TExtensionDelayMap, string>, ResolveExtendedValidator<TValidator, TExtensionValidator>>;
115
+ extend<const TExtensionSchemas extends EffectSetupSchemas = {}, const TExtensionStates extends Record<string, EffectSetupStateSchema> = {}, TExtensionActionMap extends Record<string, EffectActionSource> = {}, TExtensionActorMap extends Sources['actors'] = {}, TExtensionGuardMap extends Sources['guards'] = {}, TExtensionDelayMap extends Sources['delays'] = {}, const TExtensionValidator extends ActorLogicValidator | undefined | InheritedEffectValidator = InheritedEffectValidator>(config: EffectSetupExtensionConfig<TSchemas, TStates, TValidator, TExtensionSchemas, TExtensionStates, TExtensionActionMap, TExtensionActorMap, TExtensionGuardMap, TExtensionDelayMap, TExtensionValidator>): EffectSetupReturn<MergeRecord<TStates, ToStandardSetupStates<TExtensionStates>>, MergeSetupSchemas<TSchemas, ToStandardSetupSchemas<TExtensionSchemas>>, MergeRecord<TSetupActionMap, CoreEffectActionMap<TExtensionActionMap, MergeSetupSchemas<TSchemas, ToStandardSetupSchemas<TExtensionSchemas>>>>, MergeRecord<TSetupActorMap, TExtensionActorMap>, MergeRecord<TSetupGuardMap, TExtensionGuardMap>, MergeRecord<TSetupDelayMap, TExtensionDelayMap>, TSetupDelays | Extract<keyof TExtensionDelayMap, string>, ResolveExtendedValidator<TValidator, TExtensionValidator>>;
116
+ extend<const TExtensionSchemas extends EffectSetupSchemas = {}, const TExtensionStates extends Record<string, EffectSetupStateSchema> = {}, TExtensionActionMap extends Record<string, EffectActionSource> = {}, TExtensionActorMap extends Sources['actors'] = {}, TExtensionGuardMap extends Sources['guards'] = {}, TExtensionDelayMap extends Sources['delays'] = {}, const TExtensionValidator extends ActorLogicValidator | undefined | InheritedEffectValidator = InheritedEffectValidator>(config: EffectSetupExtensionConfig<TSchemas, TStates, TValidator, TExtensionSchemas, TExtensionStates, TExtensionActionMap, TExtensionActorMap, TExtensionGuardMap, TExtensionDelayMap, TExtensionValidator, false>): EffectSetupReturn<MergeRecord<TStates, ToStandardSetupStates<TExtensionStates>>, MergeSetupSchemas<TSchemas, ToStandardSetupSchemas<TExtensionSchemas>>, MergeRecord<TSetupActionMap, CoreEffectActionMap<TExtensionActionMap, MergeSetupSchemas<TSchemas, ToStandardSetupSchemas<TExtensionSchemas>>>>, MergeRecord<TSetupActorMap, TExtensionActorMap>, MergeRecord<TSetupGuardMap, TExtensionGuardMap>, MergeRecord<TSetupDelayMap, TExtensionDelayMap>, TSetupDelays | Extract<keyof TExtensionDelayMap, string>, ResolveExtendedValidator<TValidator, TExtensionValidator>>;
83
117
  };
84
118
  /**
85
119
  * The Effect-aware form of XState's `setup`. It accepts Effect `Schema` values
@@ -90,5 +124,6 @@ export type EffectSetupReturn<TStates extends Record<string, SetupStateSchema> =
90
124
  * it must be started with `createEffectActor`.
91
125
  */
92
126
  export declare function setupEffect(): EffectSetupReturn;
93
- export declare function setupEffect<const TSchemas extends EffectSetupSchemas = {}, const TStates extends Record<string, EffectSetupStateSchema> = Record<string, EffectSetupStateSchema>, TActionMap extends Record<string, AnyEffectAction> = {}, TActorMap extends Sources['actors'] = {}, TGuardMap extends Sources['guards'] = {}, TDelayMap extends Sources['delays'] = {}, const TValidator extends ActorLogicValidator | undefined = undefined>(config: EffectSetupConfig<TSchemas, TStates, TActionMap, TActorMap, TGuardMap, TDelayMap, TValidator>): EffectSetupReturn<ToStandardSetupStates<TStates>, ToStandardSetupSchemas<TSchemas>, CoreEffectActionMap<TActionMap>, TActorMap, TGuardMap, TDelayMap, Extract<keyof TDelayMap, string>, TValidator>;
127
+ export declare function setupEffect<const TSchemas extends EffectSetupSchemas = {}, const TStates extends Record<string, EffectSetupStateSchema> = Record<string, EffectSetupStateSchema>, TActionMap extends Record<string, EffectActionSource> = {}, TActorMap extends Sources['actors'] = {}, TGuardMap extends Sources['guards'] = {}, TDelayMap extends Sources['delays'] = {}, const TValidator extends ActorLogicValidator | undefined = undefined>(config: EffectSetupConfig<TSchemas, TStates, TActionMap, TActorMap, TGuardMap, TDelayMap, TValidator>): EffectSetupReturn<ToStandardSetupStates<TStates>, ToStandardSetupSchemas<TSchemas>, CoreEffectActionMap<TActionMap, ToStandardSetupSchemas<TSchemas>>, TActorMap, TGuardMap, TDelayMap, Extract<keyof TDelayMap, string>, TValidator>;
128
+ export declare function setupEffect<const TSchemas extends EffectSetupSchemas = {}, const TStates extends Record<string, EffectSetupStateSchema> = Record<string, EffectSetupStateSchema>, TActionMap extends Record<string, EffectActionSource> = {}, TActorMap extends Sources['actors'] = {}, TGuardMap extends Sources['guards'] = {}, TDelayMap extends Sources['delays'] = {}, const TValidator extends ActorLogicValidator | undefined = undefined>(config: EffectSetupConfig<TSchemas, TStates, TActionMap, TActorMap, TGuardMap, TDelayMap, TValidator, ToStandardSetupSchemas<TSchemas>, false>): EffectSetupReturn<ToStandardSetupStates<TStates>, ToStandardSetupSchemas<TSchemas>, CoreEffectActionMap<TActionMap, ToStandardSetupSchemas<TSchemas>>, TActorMap, TGuardMap, TDelayMap, Extract<keyof TDelayMap, string>, TValidator>;
94
129
  export {};
@@ -1,18 +1,19 @@
1
1
  import type { AnyMachineSnapshot, AnyStateMachine, MachineContext, MachineSnapshot, SnapshotFrom, StateContextFromStateValue, StateSchema, StateValueFromStateSchema } from 'xstate';
2
2
  type IsUnion<T, U = T> = T extends unknown ? [U] extends [T] ? false : true : never;
3
3
  type Join<TPrefix extends string, TKey extends string> = TPrefix extends '' ? TKey : `${TPrefix}.${TKey}`;
4
- /** The tag of the machine itself, used when the root state is parallel. */
5
- declare const MACHINE_TAG = "(machine)";
6
4
  /**
7
5
  * The dotted path of a state value: `'idle'`, `'form.editing'`. A parallel
8
- * state has no single path, so its tag stops at the parallel state, or is
9
- * `'(machine)'` when the machine itself is parallel.
6
+ * state has no single path, so its tag stops at the parallel state. When the
7
+ * machine itself is parallel, the tag is `TRootTag`: the machine id, or `''`
8
+ * for a machine without one.
10
9
  */
11
- export type StateTag<TValue, TPrefix extends string = ''> = string extends TValue ? string : TValue extends string ? Join<TPrefix, TValue> : TValue extends object ? string extends keyof TValue ? string : IsUnion<keyof TValue & string> extends true ? TPrefix extends '' ? typeof MACHINE_TAG : TPrefix : {
12
- [K in keyof TValue & string]: StateTag<TValue[K], Join<TPrefix, K>>;
10
+ export type StateTag<TValue, TPrefix extends string = '', TRootTag extends string = ''> = string extends TValue ? string : TValue extends string ? Join<TPrefix, TValue> : TValue extends object ? string extends keyof TValue ? string : IsUnion<keyof TValue & string> extends true ? TPrefix extends '' ? TRootTag : TPrefix : {
11
+ [K in keyof TValue & string]: StateTag<TValue[K], Join<TPrefix, K>, TRootTag>;
13
12
  }[keyof TValue & string] : never;
14
13
  type TaggedStateOf<TSnapshot, TValue, TContext extends MachineContext, TSchema extends StateSchema> = TValue extends unknown ? {
15
- readonly _tag: StateTag<TValue>;
14
+ readonly _tag: StateTag<TValue, '', TSchema extends {
15
+ id: infer TId extends string;
16
+ } ? TId : ''>;
16
17
  readonly value: TValue;
17
18
  readonly context: StateContextFromStateValue<TSchema, TContext, TValue>;
18
19
  readonly snapshot: TSnapshot;
@@ -0,0 +1,11 @@
1
+ import type { Effect } from 'effect';
2
+ import type { AnyActorLogic, EventFromLogic, SnapshotFrom } from 'xstate';
3
+ import type { EffectActor } from "./effectActor.js";
4
+ import type { ActorStoppedError, EventRejectedError } from "./errors.js";
5
+ /**
6
+ * Sends one mailbox item and awaits its macrostep publication and immediate
7
+ * effect scheduling. Ignored events are acknowledged too. Does not await
8
+ * invoked work, background actions or future timers. Interrupting the waiter
9
+ * detaches its receipt without retracting the event.
10
+ */
11
+ export declare function sendAndAwait<TLogic extends AnyActorLogic>(actor: EffectActor<TLogic>, event: EventFromLogic<TLogic>): Effect.Effect<SnapshotFrom<TLogic>, ActorStoppedError | EventRejectedError>;
@@ -1,11 +1,10 @@
1
1
  import type { Effect, Scope } from 'effect';
2
- import type { EffectLogicBrand } from "./fromEffect.js";
3
- import { effectActionBrand } from "./brands.js";
2
+ import type { EffectLogicBrand } from "./effectLogic.js";
4
3
  import type { ActorScope } from "./actorScope.js";
5
4
  /** The `R` channel of an Effect type, or `never` for anything else. */
6
5
  export type EffectRequirements<T> = T extends Effect.Effect<any, any, infer R> ? R : never;
7
6
  type RequirementsFromActions<T> = T extends Record<string, (...args: any[]) => any> ? T[keyof T] extends infer TAction ? TAction extends {
8
- readonly [effectActionBrand]?: infer R;
7
+ readonly '~effectRequirements'?: infer R;
9
8
  } ? unknown extends R ? EffectRequirements<TAction extends (...args: any[]) => infer TResult ? TResult : never> : Exclude<R, undefined> : EffectRequirements<TAction extends (...args: any[]) => infer TResult ? TResult : never> : never : never;
10
9
  /**
11
10
  * Recursion budget for walking registered child machines. A machine cannot