Skip to content

Commit 3bd7568

Browse files
authored
0.2.0. (#2)
1 parent 1bdf249 commit 3bd7568

33 files changed

+253
-235
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.2.0
2+
3+
**Breaking Changes**
4+
5+
The activity state initializer has one new argument. The order of arguments is not backward compatible. The first argument is a step, the second argument is a global state.
6+
17
## 0.1.3
28

39
Added two new activities: `LoopActivity` and `BreakActivity`.

machine/package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "sequential-workflow-machine",
33
"description": "Powerful sequential workflow machine for frontend and backend applications.",
4-
"version": "0.1.3",
4+
"version": "0.2.0",
55
"type": "module",
66
"main": "./lib/esm/index.js",
77
"types": "./lib/index.d.ts",
@@ -46,6 +46,10 @@
4646
"sequential-workflow-model": "^0.1.1",
4747
"xstate": "^4.37.2"
4848
},
49+
"dependencies": {
50+
"sequential-workflow-model": "^0.1.1",
51+
"xstate": "^4.37.2"
52+
},
4953
"devDependencies": {
5054
"@types/jest": "^29.4.0",
5155
"@typescript-eslint/eslint-plugin": "^5.54.0",
@@ -58,9 +62,7 @@
5862
"rollup": "^3.18.0",
5963
"rollup-plugin-dts": "^5.2.0",
6064
"rollup-plugin-typescript2": "^0.34.1",
61-
"@rollup/plugin-node-resolve": "^15.0.1",
62-
"sequential-workflow-model": "^0.1.1",
63-
"xstate": "^4.37.2"
65+
"@rollup/plugin-node-resolve": "^15.0.1"
6466
},
6567
"keywords": [
6668
"workflow",

machine/src/activities/atom-activity/atom-activity-node-builder.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
11
import { ActivityNodeBuilder, MachineContext, ActivityNodeConfig, STATE_FAILED_TARGET, STATE_INTERRUPTED_TARGET } from '../../types';
2-
import { ActivityStateAccessor } from '../../core/activity-context-accessor';
2+
import { ActivityStateProvider } from '../../core/activity-context-provider';
33
import { AtomActivityConfig } from './types';
44
import { catchUnhandledError } from '../../core/catch-unhandled-error';
55
import { getStepNodeId } from '../../core/safe-node-id';
66
import { Step } from 'sequential-workflow-model';
77
import { isInterruptResult } from '../results/interrupt-result';
88

9-
export class AtomActivityNodeBuilder<TStep extends Step, GlobalState, ActivityState> implements ActivityNodeBuilder<GlobalState> {
10-
public constructor(
11-
private readonly activityStateAccessor: ActivityStateAccessor<GlobalState, ActivityState>,
12-
private readonly config: AtomActivityConfig<TStep, GlobalState, ActivityState>
13-
) {}
9+
export class AtomActivityNodeBuilder<TStep extends Step, TGlobalState, TActivityState> implements ActivityNodeBuilder<TGlobalState> {
10+
public constructor(private readonly config: AtomActivityConfig<TStep, TGlobalState, TActivityState>) {}
1411

15-
public build(step: TStep, nextNodeTarget: string): ActivityNodeConfig<GlobalState> {
12+
public build(step: TStep, nextNodeTarget: string): ActivityNodeConfig<TGlobalState> {
13+
const activityStateProvider = new ActivityStateProvider(step, this.config.init);
1614
const nodeId = getStepNodeId(step.id);
15+
1716
return {
1817
id: nodeId,
1918
invoke: {
20-
src: catchUnhandledError(async (context: MachineContext<GlobalState>) => {
21-
const activityState = this.activityStateAccessor.get(context, nodeId);
19+
src: catchUnhandledError(async (context: MachineContext<TGlobalState>) => {
20+
const activityState = activityStateProvider.get(context, nodeId);
2221

2322
const result = await this.config.handler(step, context.globalState, activityState);
2423
if (isInterruptResult(result)) {
@@ -29,7 +28,7 @@ export class AtomActivityNodeBuilder<TStep extends Step, GlobalState, ActivitySt
2928
onDone: [
3029
{
3130
target: STATE_INTERRUPTED_TARGET,
32-
cond: (context: MachineContext<GlobalState>) => Boolean(context.interrupted)
31+
cond: (context: MachineContext<TGlobalState>) => Boolean(context.interrupted)
3332
},
3433
{
3534
target: nextNodeTarget
Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import { Activity } from '../../types';
2-
import { ActivityStateAccessor } from '../../core/activity-context-accessor';
32
import { AtomActivityNodeBuilder } from './atom-activity-node-builder';
43
import { AtomActivityConfig } from './types';
54
import { Step } from 'sequential-workflow-model';
65

7-
export function createAtomActivity<TStep extends Step = Step, GlobalState = object, ActivityState = object>(
8-
config: AtomActivityConfig<TStep, GlobalState, ActivityState>
9-
): Activity<GlobalState> {
10-
const activityStateAccessor = new ActivityStateAccessor(config.init);
11-
6+
export function createAtomActivity<TStep extends Step = Step, TGlobalState = object, TActivityState = object>(
7+
config: AtomActivityConfig<TStep, TGlobalState, TActivityState>
8+
): Activity<TGlobalState> {
129
return {
1310
stepType: config.stepType,
14-
nodeBuilderFactory: () => new AtomActivityNodeBuilder(activityStateAccessor, config)
11+
nodeBuilderFactory: () => new AtomActivityNodeBuilder(config)
1512
};
1613
}

machine/src/activities/atom-activity/types.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { Step } from 'sequential-workflow-model';
22
import { ActivityConfig, ActivityStateInitializer } from '../../types';
33
import { InterruptResult } from '../results/interrupt-result';
44

5-
export type AtomActivityHandler<TStep extends Step, GlobalState, ActivityState> = (
5+
export type AtomActivityHandler<TStep extends Step, TGlobalState, TActivityState> = (
66
step: TStep,
7-
globalState: GlobalState,
8-
activityState: ActivityState
7+
globalState: TGlobalState,
8+
activityState: TActivityState
99
) => Promise<AtomActivityHandlerResult>;
1010

1111
export type AtomActivityHandlerResult = void | InterruptResult;
1212

13-
export interface AtomActivityConfig<TStep extends Step, GlobalState, ActivityState> extends ActivityConfig<TStep> {
14-
init: ActivityStateInitializer<GlobalState, ActivityState>;
15-
handler: AtomActivityHandler<TStep, GlobalState, ActivityState>;
13+
export interface AtomActivityConfig<TStep extends Step, TGlobalState, TActivityState> extends ActivityConfig<TStep> {
14+
init: ActivityStateInitializer<TStep, TGlobalState, TActivityState>;
15+
handler: AtomActivityHandler<TStep, TGlobalState, TActivityState>;
1616
}

machine/src/activities/break-activity/break-activity-node-builder.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,19 @@ import {
99
STATE_FAILED_TARGET,
1010
STATE_INTERRUPTED_TARGET
1111
} from '../../types';
12-
import { ActivityStateAccessor, catchUnhandledError, getStepNodeId } from '../../core';
12+
import { ActivityStateProvider, catchUnhandledError, getStepNodeId } from '../../core';
1313
import { isInterruptResult } from '../results';
1414
import { isBreakResult } from './break-result';
1515

16-
export class BreakActivityNodeBuilder<TStep extends Step, GlobalState, ActivityState> implements ActivityNodeBuilder<GlobalState> {
17-
public constructor(
18-
private readonly activityStateAccessor: ActivityStateAccessor<GlobalState, BreakActivityState<ActivityState>>,
19-
private readonly config: BreakActivityConfig<TStep, GlobalState, ActivityState>
20-
) {}
16+
export class BreakActivityNodeBuilder<TStep extends Step, TGlobalState, TActivityState> implements ActivityNodeBuilder<TGlobalState> {
17+
public constructor(private readonly config: BreakActivityConfig<TStep, TGlobalState, TActivityState>) {}
2118

22-
public build(step: TStep, nextNodeTarget: string, buildingContext: BuildingContext): ActivityNodeConfig<GlobalState> {
19+
public build(step: TStep, nextNodeTarget: string, buildingContext: BuildingContext): ActivityNodeConfig<TGlobalState> {
20+
const activityStateProvider = new ActivityStateProvider<TStep, TGlobalState, BreakActivityState<TActivityState>>(step, (s, g) => {
21+
return {
22+
activityState: this.config.init(s, g)
23+
};
24+
});
2325
const nodeId = getStepNodeId(step.id);
2426

2527
const loopName = this.config.loopName(step);
@@ -28,8 +30,8 @@ export class BreakActivityNodeBuilder<TStep extends Step, GlobalState, ActivityS
2830
return {
2931
id: nodeId,
3032
invoke: {
31-
src: catchUnhandledError(async (context: MachineContext<GlobalState>) => {
32-
const internalState = this.activityStateAccessor.get(context, nodeId);
33+
src: catchUnhandledError(async (context: MachineContext<TGlobalState>) => {
34+
const internalState = activityStateProvider.get(context, nodeId);
3335

3436
const result = await this.config.handler(step, context.globalState, internalState.activityState);
3537
if (isInterruptResult(result)) {
@@ -42,12 +44,12 @@ export class BreakActivityNodeBuilder<TStep extends Step, GlobalState, ActivityS
4244
onDone: [
4345
{
4446
target: STATE_INTERRUPTED_TARGET,
45-
cond: (context: MachineContext<GlobalState>) => Boolean(context.interrupted)
47+
cond: (context: MachineContext<TGlobalState>) => Boolean(context.interrupted)
4648
},
4749
{
4850
target: leaveNodeTarget,
49-
cond: (context: MachineContext<GlobalState>) => {
50-
const internalState = this.activityStateAccessor.get(context, nodeId);
51+
cond: (context: MachineContext<TGlobalState>) => {
52+
const internalState = activityStateProvider.get(context, nodeId);
5153
return Boolean(internalState.break);
5254
}
5355
},
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
import { BreakActivityConfig, BreakActivityState } from './types';
1+
import { BreakActivityConfig } from './types';
22
import { BreakActivityNodeBuilder } from './break-activity-node-builder';
33
import { Step } from 'sequential-workflow-model';
44
import { Activity } from '../../types';
5-
import { ActivityStateAccessor } from '../../core';
65

76
export function createBreakActivity<TStep extends Step = Step, GlobalState = object, ActivityState = object>(
87
config: BreakActivityConfig<TStep, GlobalState, ActivityState>
98
): Activity<GlobalState> {
10-
const activityStateAccessor = new ActivityStateAccessor<GlobalState, BreakActivityState<ActivityState>>(globalState => ({
11-
activityState: config.init(globalState)
12-
}));
13-
149
return {
1510
stepType: config.stepType,
16-
nodeBuilderFactory: () => new BreakActivityNodeBuilder(activityStateAccessor, config)
11+
nodeBuilderFactory: () => new BreakActivityNodeBuilder(config)
1712
};
1813
}

machine/src/activities/break-activity/types.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@ import { ActivityConfig, ActivityStateInitializer } from '../../types';
33
import { InterruptResult } from '../results';
44
import { BreakResult } from './break-result';
55

6-
export type BreakActivityHandler<TStep extends Step, GlobalState, ActivityState> = (
6+
export type BreakActivityHandler<TStep extends Step, TGlobalState, TActivityState> = (
77
step: TStep,
8-
globalState: GlobalState,
9-
activityState: ActivityState
8+
globalState: TGlobalState,
9+
activityState: TActivityState
1010
) => Promise<BreakActivityHandlerResult>;
1111

1212
export type BreakActivityHandlerResult = void | InterruptResult | BreakResult;
1313

14-
export interface BreakActivityConfig<TStep extends Step, GlobalState, ActivityState> extends ActivityConfig<TStep> {
14+
export interface BreakActivityConfig<TStep extends Step, TGlobalState, TActivityState> extends ActivityConfig<TStep> {
1515
loopName: (step: TStep) => string;
16-
init: ActivityStateInitializer<GlobalState, ActivityState>;
17-
handler: BreakActivityHandler<TStep, GlobalState, ActivityState>;
16+
init: ActivityStateInitializer<TStep, TGlobalState, TActivityState>;
17+
handler: BreakActivityHandler<TStep, TGlobalState, TActivityState>;
1818
}
1919

20-
export interface BreakActivityState<ActivityState> {
20+
export interface BreakActivityState<TActivityState> {
2121
break?: boolean;
22-
activityState: ActivityState;
22+
activityState: TActivityState;
2323
}

machine/src/activities/container-activity/container-activity-node-builder.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,24 @@ import {
66
STATE_INTERRUPTED_TARGET,
77
BuildingContext
88
} from '../../types';
9-
import { ActivityStateAccessor } from '../../core/activity-context-accessor';
9+
import { ActivityStateProvider } from '../../core/activity-context-provider';
1010
import { catchUnhandledError } from '../../core/catch-unhandled-error';
1111
import { getStepNodeId } from '../../core/safe-node-id';
1212
import { SequentialStep } from 'sequential-workflow-model';
1313
import { ContainerActivityConfig, ContainerActivityHandler } from './types';
1414
import { SequenceNodeBuilder } from '../../core';
1515
import { isInterruptResult } from '../results/interrupt-result';
1616

17-
export class ContainerActivityNodeBuilder<TStep extends SequentialStep, GlobalState, ActivityState>
18-
implements ActivityNodeBuilder<GlobalState>
17+
export class ContainerActivityNodeBuilder<TStep extends SequentialStep, TGlobalState, TActivityState>
18+
implements ActivityNodeBuilder<TGlobalState>
1919
{
2020
public constructor(
21-
private readonly sequenceNodeBuilder: SequenceNodeBuilder<GlobalState>,
22-
private readonly activityStateAccessor: ActivityStateAccessor<GlobalState, ActivityState>,
23-
private readonly config: ContainerActivityConfig<TStep, GlobalState, ActivityState>
21+
private readonly sequenceNodeBuilder: SequenceNodeBuilder<TGlobalState>,
22+
private readonly config: ContainerActivityConfig<TStep, TGlobalState, TActivityState>
2423
) {}
2524

26-
public build(step: TStep, nextNodeTarget: string, buildingContext: BuildingContext): ActivityNodeConfig<GlobalState> {
25+
public build(step: TStep, nextNodeTarget: string, buildingContext: BuildingContext): ActivityNodeConfig<TGlobalState> {
26+
const activityStateProvider = new ActivityStateProvider<TStep, TGlobalState, TActivityState>(step, this.config.init);
2727
const nodeId = getStepNodeId(step.id);
2828

2929
const enterNodeId = `ENTER.${nodeId}`;
@@ -32,15 +32,15 @@ export class ContainerActivityNodeBuilder<TStep extends SequentialStep, GlobalSt
3232

3333
const createState = (
3434
id: string,
35-
handle: ContainerActivityHandler<TStep, GlobalState, ActivityState> | undefined,
35+
handle: ContainerActivityHandler<TStep, TGlobalState, TActivityState> | undefined,
3636
nextStateNodeTarget: string
3737
) => {
3838
return {
3939
id,
4040
invoke: {
41-
src: catchUnhandledError(async (context: MachineContext<GlobalState>) => {
41+
src: catchUnhandledError(async (context: MachineContext<TGlobalState>) => {
4242
if (handle) {
43-
const activityState = this.activityStateAccessor.get(context, nodeId);
43+
const activityState = activityStateProvider.get(context, nodeId);
4444

4545
const result = await handle(step, context.globalState, activityState);
4646
if (isInterruptResult(result)) {
@@ -52,7 +52,7 @@ export class ContainerActivityNodeBuilder<TStep extends SequentialStep, GlobalSt
5252
onDone: [
5353
{
5454
target: STATE_INTERRUPTED_TARGET,
55-
cond: (context: MachineContext<GlobalState>) => Boolean(context.interrupted)
55+
cond: (context: MachineContext<TGlobalState>) => Boolean(context.interrupted)
5656
},
5757
{
5858
target: nextStateNodeTarget
Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import { Activity } from '../../types';
2-
import { ActivityStateAccessor } from '../../core/activity-context-accessor';
32
import { SequentialStep } from 'sequential-workflow-model';
43
import { ContainerActivityConfig } from './types';
54
import { ContainerActivityNodeBuilder } from './container-activity-node-builder';
65

7-
export function createContainerActivity<TStep extends SequentialStep = SequentialStep, GlobalState = object, ActivityState = object>(
8-
config: ContainerActivityConfig<TStep, GlobalState, ActivityState>
9-
): Activity<GlobalState> {
10-
const activityStateAccessor = new ActivityStateAccessor(config.init);
11-
6+
export function createContainerActivity<TStep extends SequentialStep = SequentialStep, TGlobalState = object, TActivityState = object>(
7+
config: ContainerActivityConfig<TStep, TGlobalState, TActivityState>
8+
): Activity<TGlobalState> {
129
return {
1310
stepType: config.stepType,
14-
nodeBuilderFactory: sequenceNodeBuilder => new ContainerActivityNodeBuilder(sequenceNodeBuilder, activityStateAccessor, config)
11+
nodeBuilderFactory: sequenceNodeBuilder => new ContainerActivityNodeBuilder(sequenceNodeBuilder, config)
1512
};
1613
}

machine/src/activities/container-activity/types.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import { Step } from 'sequential-workflow-model';
22
import { ActivityConfig, ActivityStateInitializer } from '../../types';
33
import { InterruptResult } from '../results/interrupt-result';
44

5-
export type ContainerActivityHandler<TStep extends Step, GlobalState, ActivityState> = (
5+
export type ContainerActivityHandler<TStep extends Step, TGlobalState, TActivityState> = (
66
step: TStep,
7-
globalState: GlobalState,
8-
activityState: ActivityState
7+
globalState: TGlobalState,
8+
activityState: TActivityState
99
) => Promise<ContainerActivityHandlerResult>;
1010

1111
export type ContainerActivityHandlerResult = void | InterruptResult;
1212

13-
export interface ContainerActivityConfig<TStep extends Step, GlobalState, ActivityState> extends ActivityConfig<TStep> {
14-
init: ActivityStateInitializer<GlobalState, ActivityState>;
15-
onEnter?: ContainerActivityHandler<TStep, GlobalState, ActivityState>;
16-
onLeave?: ContainerActivityHandler<TStep, GlobalState, ActivityState>;
13+
export interface ContainerActivityConfig<TStep extends Step, TGlobalState, TActivityState> extends ActivityConfig<TStep> {
14+
init: ActivityStateInitializer<TStep, TGlobalState, TActivityState>;
15+
onEnter?: ContainerActivityHandler<TStep, TGlobalState, TActivityState>;
16+
onLeave?: ContainerActivityHandler<TStep, TGlobalState, TActivityState>;
1717
}

0 commit comments

Comments
 (0)