From ae0b05f11f1f1048e4f3ce8ae18aa2710e3e0272 Mon Sep 17 00:00:00 2001 From: David Khourshid Date: Sun, 17 Dec 2023 09:23:37 -0500 Subject: [PATCH] [core] Add `self` and `system` to `enqueueActions(...)` (#4597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add `self` to `enqueueActions(...)` * Changeset * improve types and make `system` available too * Update changeset --------- Co-authored-by: Mateusz BurzyƄski --- .changeset/strong-jobs-unite.md | 12 ++ packages/core/src/actions/enqueueActions.ts | 122 ++++++++++++-------- packages/core/test/actions.test.ts | 10 ++ 3 files changed, 93 insertions(+), 51 deletions(-) create mode 100644 .changeset/strong-jobs-unite.md diff --git a/.changeset/strong-jobs-unite.md b/.changeset/strong-jobs-unite.md new file mode 100644 index 0000000000..ce1cb7d243 --- /dev/null +++ b/.changeset/strong-jobs-unite.md @@ -0,0 +1,12 @@ +--- +'xstate': patch +--- + +Update the argument object of `enqueueActions(...)` to include the `self` and `system` properties: + +```ts +// ... +entry: enqueueActions(({ self, system }) => { + // ... +}); +``` diff --git a/packages/core/src/actions/enqueueActions.ts b/packages/core/src/actions/enqueueActions.ts index f88c9216c7..bd63c79a4e 100644 --- a/packages/core/src/actions/enqueueActions.ts +++ b/packages/core/src/actions/enqueueActions.ts @@ -9,7 +9,8 @@ import { EventObject, MachineContext, ParameterizedObject, - ProvidedActor + ProvidedActor, + UnifiedArg } from '../types.ts'; import { assign } from './assign.ts'; import { cancel } from './cancel.ts'; @@ -79,39 +80,22 @@ interface ActionEnqueuer< } function resolveEnqueueActions( - _: AnyActorScope, + actorScope: AnyActorScope, snapshot: AnyMachineSnapshot, args: ActionArgs, _actionParams: ParameterizedObject['params'] | undefined, { collect }: { - collect: ({ - context, - event, - enqueue, - check - }: { - context: MachineContext; - event: EventObject; - enqueue: ActionEnqueuer< - MachineContext, - EventObject, - EventObject, - ProvidedActor, - ParameterizedObject, - ParameterizedObject, - string - >; - check: ( - guard: Guard< - MachineContext, - EventObject, - undefined, - ParameterizedObject - > - ) => boolean; - }) => void; + collect: CollectActions< + MachineContext, + EventObject, + EventObject, + ProvidedActor, + ParameterizedObject, + ParameterizedObject, + string + >; } ) { const actions: any[] = []; @@ -144,7 +128,9 @@ function resolveEnqueueActions( event: args.event, enqueue, check: (guard) => - evaluateGuard(guard, snapshot.context, args.event, snapshot) + evaluateGuard(guard, snapshot.context, args.event, snapshot), + self: actorScope.self, + system: actorScope.system }); return [snapshot, undefined, actions]; @@ -167,6 +153,53 @@ export interface EnqueueActionsAction< _out_TDelay?: TDelay; } +interface CollectActionsArg< + TContext extends MachineContext, + TExpressionEvent extends EventObject, + TEvent extends EventObject, + TActor extends ProvidedActor, + TAction extends ParameterizedObject, + TGuard extends ParameterizedObject, + TDelay extends string +> extends UnifiedArg { + check: ( + guard: Guard + ) => boolean; + enqueue: ActionEnqueuer< + TContext, + TExpressionEvent, + TEvent, + TActor, + TAction, + TGuard, + TDelay + >; +} + +type CollectActions< + TContext extends MachineContext, + TExpressionEvent extends EventObject, + TEvent extends EventObject, + TActor extends ProvidedActor, + TAction extends ParameterizedObject, + TGuard extends ParameterizedObject, + TDelay extends string +> = ({ + context, + event, + check, + enqueue, + self +}: CollectActionsArg< + TContext, + TExpressionEvent, + TEvent, + TActor, + TAction, + TGuard, + TDelay +>) => void; + export function enqueueActions< TContext extends MachineContext, TExpressionEvent extends EventObject, @@ -176,27 +209,15 @@ export function enqueueActions< TGuard extends ParameterizedObject = ParameterizedObject, TDelay extends string = string >( - collect: ({ - context, - event, - check, - enqueue - }: { - context: TContext; - event: TExpressionEvent; - check: ( - guard: Guard - ) => boolean; - enqueue: ActionEnqueuer< - TContext, - TExpressionEvent, - TEvent, - TActor, - TAction, - TGuard, - TDelay - >; - }) => void + collect: CollectActions< + TContext, + TExpressionEvent, + TEvent, + TActor, + TAction, + TGuard, + TDelay + > ): EnqueueActionsAction< TContext, TExpressionEvent, @@ -217,7 +238,6 @@ export function enqueueActions< enqueueActions.type = 'xstate.enqueueActions'; enqueueActions.collect = collect; - enqueueActions.resolve = resolveEnqueueActions; return enqueueActions; diff --git a/packages/core/test/actions.test.ts b/packages/core/test/actions.test.ts index a10ced66c1..f3be167342 100644 --- a/packages/core/test/actions.test.ts +++ b/packages/core/test/actions.test.ts @@ -2807,6 +2807,16 @@ describe('enqueueActions', () => { ] `); }); + it('should provide self', () => { + expect.assertions(1); + const machine = createMachine({ + entry: enqueueActions(({ self }) => { + expect(self.send).toBeDefined(); + }) + }); + + createActor(machine).start(); + }); }); describe('sendParent', () => {