@step-forge/step-forge 0.0.6 → 0.0.7-beta.1

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.
Files changed (48) hide show
  1. package/dist/step-forge.js +212 -0
  2. package/package.json +9 -8
  3. package/.eslintignore +0 -6
  4. package/.eslintrc +0 -18
  5. package/.prettierignore +0 -6
  6. package/.prettierrc +0 -15
  7. package/CHANGELOG.md +0 -28
  8. package/cucumber.mjs +0 -38
  9. package/docs/assets/state_deps.gif +0 -0
  10. package/dts-bundle-generator.config.ts +0 -11
  11. package/features/basic.feature +0 -21
  12. package/features/exported.feature +0 -6
  13. package/features/steps/commonSteps.ts +0 -93
  14. package/features/steps/exportedSteps.ts +0 -42
  15. package/features/steps/world.ts +0 -29
  16. package/src/builderTypeUtils.js +0 -2
  17. package/src/builderTypeUtils.js.map +0 -1
  18. package/src/builderTypeUtils.ts +0 -27
  19. package/src/common.js +0 -73
  20. package/src/common.js.map +0 -1
  21. package/src/common.ts +0 -138
  22. package/src/given.js +0 -34
  23. package/src/given.js.map +0 -1
  24. package/src/given.ts +0 -102
  25. package/src/index.js +0 -6
  26. package/src/index.js.map +0 -1
  27. package/src/index.ts +0 -6
  28. package/src/then.js +0 -34
  29. package/src/then.js.map +0 -1
  30. package/src/then.ts +0 -128
  31. package/src/utils.js +0 -54
  32. package/src/utils.js.map +0 -1
  33. package/src/utils.ts +0 -74
  34. package/src/vite-env.d.ts.old +0 -1
  35. package/src/when.js +0 -34
  36. package/src/when.js.map +0 -1
  37. package/src/when.ts +0 -118
  38. package/src/world.js +0 -51
  39. package/src/world.js.map +0 -1
  40. package/src/world.ts +0 -90
  41. package/test/givenCompilationTests.ts +0 -130
  42. package/test/testUtils.ts +0 -30
  43. package/test/thenCompilationTests.ts +0 -207
  44. package/test/whenCompilationTests.ts +0 -157
  45. package/ts-node-esm-register.js +0 -8
  46. package/tsconfig.cucumber.json +0 -23
  47. package/tsconfig.json +0 -28
  48. package/vite.config.ts +0 -36
package/src/when.ts DELETED
@@ -1,118 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
-
3
- import {
4
- EmptyDependencies,
5
- EmptyObject,
6
- GetFunctionArgs,
7
- isString,
8
- RequiredOrOptional,
9
- StepType,
10
- } from "./builderTypeUtils";
11
- import { addStep } from "./common";
12
-
13
- const whenDependencies =
14
- <
15
- Statement extends (...args: any[]) => string,
16
- ResolvedStepType extends StepType,
17
- Variables,
18
- GivenState,
19
- WhenState,
20
- >(
21
- statement: Statement,
22
- stepType: ResolvedStepType
23
- ) =>
24
- <
25
- GivenDeps extends RequiredOrOptional<GivenState>,
26
- WhenDeps extends RequiredOrOptional<WhenState>,
27
- >(dependencies: {
28
- given?: GivenDeps;
29
- when?: WhenDeps;
30
- }) => {
31
- type RestrictedGivenState = {
32
- [K in keyof GivenState as K extends keyof GivenDeps
33
- ? K
34
- : never]: GivenDeps[K] extends "optional"
35
- ? GivenState[K] | undefined
36
- : GivenState[K];
37
- };
38
- type RestrictedWhenState = {
39
- [K in keyof WhenState as K extends keyof WhenDeps
40
- ? K
41
- : never]: WhenDeps[K] extends "optional"
42
- ? WhenState[K] | undefined
43
- : WhenState[K];
44
- };
45
- type Dependencies = {
46
- given: GivenDeps;
47
- when: WhenDeps;
48
- then: EmptyObject;
49
- };
50
- const fullDependencies: Dependencies = {
51
- given: dependencies.given ?? ({} as GivenDeps),
52
- when: dependencies.when ?? ({} as WhenDeps),
53
- then: {},
54
- };
55
- return {
56
- step: addStep<
57
- ResolvedStepType,
58
- Statement,
59
- Dependencies,
60
- Variables,
61
- GivenState,
62
- WhenState,
63
- never,
64
- RestrictedGivenState,
65
- RestrictedWhenState,
66
- never
67
- >(statement, stepType, fullDependencies),
68
- };
69
- };
70
-
71
- const whenStatement =
72
- <ResolvedStepType extends StepType, GivenState, WhenState>(
73
- stepType: ResolvedStepType
74
- ) =>
75
- <Statement extends ((...args: [...any]) => string) | string>(
76
- statement: Statement
77
- ) => {
78
- let normalizedStatement: Statement extends string
79
- ? () => string
80
- : Statement;
81
- if (isString(statement)) {
82
- normalizedStatement = (() => statement) as any;
83
- } else {
84
- normalizedStatement = statement as any;
85
- }
86
- type NormalizedStatement = typeof normalizedStatement;
87
-
88
- type Variables = Statement extends string ? [] : GetFunctionArgs<Statement>;
89
- const dependencyFunc = whenDependencies<
90
- NormalizedStatement,
91
- ResolvedStepType,
92
- Variables,
93
- GivenState,
94
- WhenState
95
- >(normalizedStatement, stepType);
96
- const stepFunc = addStep<
97
- ResolvedStepType,
98
- NormalizedStatement,
99
- EmptyDependencies,
100
- Variables,
101
- GivenState,
102
- WhenState,
103
- never,
104
- never,
105
- never,
106
- never
107
- >(normalizedStatement, stepType);
108
- return {
109
- dependencies: dependencyFunc,
110
- step: stepFunc,
111
- };
112
- };
113
-
114
- export const whenBuilder = <GivenState, WhenState>() => {
115
- return {
116
- statement: whenStatement<"when", GivenState, WhenState>("when"),
117
- };
118
- };
package/src/world.js DELETED
@@ -1,51 +0,0 @@
1
- import _ from "lodash";
2
- function mergeCustomizer(objValue, srcValue) {
3
- if (_.isArray(objValue)) {
4
- return objValue.concat(srcValue);
5
- }
6
- else if (objValue && !_.isPlainObject(objValue) && objValue !== srcValue) {
7
- throw new Error(`Merge would have destroyed previous value ${objValue} with ${srcValue}`);
8
- }
9
- return objValue;
10
- }
11
- export const createMergeableState = (state) => {
12
- return {
13
- ...state,
14
- merge: (newState) => {
15
- state = _.merge({ ...state }, newState, mergeCustomizer);
16
- },
17
- };
18
- };
19
- export class BasicWorld {
20
- givenState = {};
21
- whenState = {};
22
- thenState = {};
23
- get given() {
24
- return {
25
- ...this.givenState,
26
- merge: (newState) => {
27
- this.givenState = _.merge({ ...this.givenState }, newState, mergeCustomizer);
28
- },
29
- };
30
- }
31
- get when() {
32
- return {
33
- ...this.whenState,
34
- merge: (newState) => {
35
- this.whenState = _.merge({ ...this.whenState }, newState, mergeCustomizer);
36
- },
37
- };
38
- }
39
- get then() {
40
- return {
41
- ...this.thenState,
42
- merge: (newState) => {
43
- this.thenState = _.merge({ ...this.thenState }, newState, mergeCustomizer);
44
- },
45
- };
46
- }
47
- }
48
- export const createBasicWorld = () => {
49
- return new BasicWorld();
50
- };
51
- //# sourceMappingURL=world.js.map
package/src/world.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"world.js","sourceRoot":"","sources":["world.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAUvB,SAAS,eAAe,CAAC,QAAiB,EAAE,QAAiB;IAC3D,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,6CAA6C,QAAQ,SAAS,QAAQ,EAAE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,KAAoB,EACI,EAAE;IAC1B,OAAO;QACL,GAAG,KAAK;QACR,KAAK,EAAE,CAAC,QAAoB,EAAE,EAAE;YAC9B,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAQF,MAAM,OAAO,UAAU;IACb,UAAU,GAAsB,EAAE,CAAC;IACnC,SAAS,GAAqB,EAAE,CAAC;IACjC,SAAS,GAAqB,EAAE,CAAC;IAEzC,IAAW,KAAK;QACd,OAAO;YACL,GAAG,IAAI,CAAC,UAAU;YAClB,KAAK,EAAE,CAAC,QAAwB,EAAE,EAAE;gBAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CACvB,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,EACtB,QAAQ,EACR,eAAe,CAChB,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;IAED,IAAW,IAAI;QACb,OAAO;YACL,GAAG,IAAI,CAAC,SAAS;YACjB,KAAK,EAAE,CAAC,QAAuB,EAAE,EAAE;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CACtB,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,EACrB,QAAQ,EACR,eAAe,CAChB,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;IAED,IAAW,IAAI;QACb,OAAO;YACL,GAAG,IAAI,CAAC,SAAS;YACjB,KAAK,EAAE,CAAC,QAAuB,EAAE,EAAE;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CACtB,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,EACrB,QAAQ,EACR,eAAe,CAChB,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAI9B,EAAE;IACF,OAAO,IAAI,UAAU,EAAqB,CAAC;AAC7C,CAAC,CAAC"}
package/src/world.ts DELETED
@@ -1,90 +0,0 @@
1
- import _ from "lodash";
2
-
3
- export type WorldState<State> = {
4
- readonly [K in keyof State]?: State[K];
5
- };
6
-
7
- export type MergeableWorldState<T> = WorldState<T> & {
8
- merge: (newState: Partial<T>) => void;
9
- };
10
-
11
- function mergeCustomizer(objValue: unknown, srcValue: unknown) {
12
- if (_.isArray(objValue)) {
13
- return objValue.concat(srcValue);
14
- } else if (objValue && !_.isPlainObject(objValue) && objValue !== srcValue) {
15
- throw new Error(
16
- `Merge would have destroyed previous value ${objValue} with ${srcValue}`
17
- );
18
- }
19
- return objValue;
20
- }
21
-
22
- export const createMergeableState = <T>(
23
- state: WorldState<T>
24
- ): MergeableWorldState<T> => {
25
- return {
26
- ...state,
27
- merge: (newState: Partial<T>) => {
28
- state = _.merge({ ...state }, newState, mergeCustomizer);
29
- },
30
- };
31
- };
32
-
33
- export type MergeableWorld<Given, When, Then> = {
34
- given: MergeableWorldState<Given>;
35
- when: MergeableWorldState<When>;
36
- then: MergeableWorldState<Then>;
37
- };
38
-
39
- export class BasicWorld<Given, When, Then> {
40
- private givenState: WorldState<Given> = {};
41
- private whenState: WorldState<When> = {};
42
- private thenState: WorldState<Then> = {};
43
-
44
- public get given(): MergeableWorldState<Given> {
45
- return {
46
- ...this.givenState,
47
- merge: (newState: Partial<Given>) => {
48
- this.givenState = _.merge(
49
- { ...this.givenState },
50
- newState,
51
- mergeCustomizer
52
- );
53
- },
54
- };
55
- }
56
-
57
- public get when(): MergeableWorldState<When> {
58
- return {
59
- ...this.whenState,
60
- merge: (newState: Partial<When>) => {
61
- this.whenState = _.merge(
62
- { ...this.whenState },
63
- newState,
64
- mergeCustomizer
65
- );
66
- },
67
- };
68
- }
69
-
70
- public get then(): MergeableWorldState<Then> {
71
- return {
72
- ...this.thenState,
73
- merge: (newState: Partial<Then>) => {
74
- this.thenState = _.merge(
75
- { ...this.thenState },
76
- newState,
77
- mergeCustomizer
78
- );
79
- },
80
- };
81
- }
82
- }
83
-
84
- export const createBasicWorld = <Given, When, Then>(): MergeableWorld<
85
- Given,
86
- When,
87
- Then
88
- > => {
89
- return new BasicWorld<Given, When, Then>();
90
- };
@@ -1,130 +0,0 @@
1
- import { givenBuilder } from "../src/given";
2
- import { SampleGivenState } from "./testUtils";
3
-
4
- // Simplest possible example
5
- givenBuilder<SampleGivenState>()
6
- .statement("Given a user")
7
- .step(() => {
8
- return {
9
- a: "user",
10
- };
11
- });
12
-
13
- // Simple dependency example
14
- givenBuilder<SampleGivenState>()
15
- .statement("Given a user")
16
- .dependencies({
17
- given: {
18
- a: "required",
19
- },
20
- })
21
- .step(({ given }) => {
22
- return {
23
- b: `I love ${given.a}`,
24
- };
25
- });
26
-
27
- // Simple variables example
28
- givenBuilder<SampleGivenState>()
29
- .statement((v1: string, v2: number) => `Given a user ${v1} ${v2}`)
30
- .step(({ variables: [v1, v2] }) => {
31
- return {
32
- b: `I love ${v1} ${v2}`,
33
- };
34
- });
35
-
36
- // Complex example
37
- givenBuilder<SampleGivenState>()
38
- .statement((v1: string, v2: number) => `Given a user ${v1} ${v2}`)
39
- .dependencies({
40
- given: {
41
- a: "required",
42
- b: "optional",
43
- c: "required",
44
- },
45
- })
46
- .step(({ variables: [v1, v2], given: { a, b, c } }) => {
47
- return {
48
- b: `I love ${v1} ${v2} ${a} ${b} ${c}`,
49
- };
50
- });
51
-
52
- // ----- Should not compile section ----
53
-
54
- // @ts-expect-error - Should not compile without a statement
55
- givenBuilder<SampleGivenState>().step(() => {
56
- return {
57
- a: "user",
58
- };
59
- });
60
-
61
- givenBuilder<SampleGivenState>()
62
- .statement(() => "Given a user")
63
- // @ts-expect-error - Should not compile since no variables are declared
64
- .step(({ variables: [v1, v2] }) => {
65
- return {
66
- a: `I love ${v1} ${v2}`,
67
- };
68
- });
69
-
70
- // TODO: Currently resolves variables to `any[]` which is incorrect
71
- givenBuilder<SampleGivenState>()
72
- .statement("Given a user")
73
- // @ts-expect-error - Should not compile since no variables are declared
74
- .step(({ variables: [v1, v2] }) => {
75
- return {
76
- a: `I love ${v1} ${v2}`,
77
- };
78
- });
79
-
80
- givenBuilder<SampleGivenState>()
81
- .statement(
82
- (v1: string, v2: number, v3: boolean) => `Given a user ${v1} ${v2} ${v3}`
83
- )
84
- // @ts-expect-error - Should not compile since the number of variables exceeds the number declared
85
- .step(({ variables: [v1, v2, v3, v4] }) => {
86
- return {
87
- a: `I love ${v1} ${v2} ${v3} ${v4}`,
88
- };
89
- });
90
-
91
- givenBuilder<SampleGivenState>()
92
- .statement("Given a user")
93
- .dependencies({ given: { a: "required" } })
94
- .step(({ given }) => {
95
- return {
96
- // @ts-expect-error - Should not compile if we attempt to access a part of state that was not declared as a dependency
97
- b: `I love ${given.b}`,
98
- };
99
- });
100
-
101
- givenBuilder<SampleGivenState>()
102
- .statement("a user")
103
- // @ts-expect-error - Should not compile if we attempt to access a part of state that was not declared as a dependency
104
- .dependencies({ when: { a: "required" } })
105
- .step(({ when }) => {
106
- return {
107
- // @ts-expect-error - Should not compile if we attempt to access a part of state that was not declared as a dependency
108
- b: `I love ${when.c}`,
109
- };
110
- });
111
-
112
- givenBuilder<SampleGivenState>()
113
- .statement("Given a user")
114
- .dependencies({ given: { a: "optional" } })
115
- .step(({ given }) => {
116
- // @ts-expect-error - Should not compile since a is optional and can be undefined
117
- const strictA: string = given.a;
118
- return {
119
- b: `I love ${strictA}`,
120
- };
121
- });
122
-
123
- givenBuilder<SampleGivenState>()
124
- .statement("Given a user")
125
- // @ts-expect-error - Should not compile since the return type is not a partial of given state
126
- .step(() => {
127
- return {
128
- f: "hello",
129
- };
130
- });
package/test/testUtils.ts DELETED
@@ -1,30 +0,0 @@
1
- import { createBasicWorld } from "../src/world";
2
-
3
- export const sampleGivenState = {
4
- a: "stuff",
5
- b: "things",
6
- c: 3,
7
- };
8
- export type SampleGivenState = typeof sampleGivenState;
9
-
10
- export const sampleWhenState = {
11
- d: 1,
12
- e: "other stuff",
13
- f: [3, 4, 5],
14
- };
15
- export type SampleWhenState = typeof sampleWhenState;
16
-
17
- export const sampleThenState = {
18
- g: 1,
19
- h: 2,
20
- i: { j: "k" },
21
- };
22
- export type SampleThenState = typeof sampleThenState;
23
-
24
- export const sampleWorld = createBasicWorld<
25
- SampleGivenState,
26
- SampleWhenState,
27
- SampleThenState
28
- >();
29
-
30
- export type SampleWorld = typeof sampleWorld;
@@ -1,207 +0,0 @@
1
- import { thenBuilder } from "../src/then";
2
- import {
3
- SampleGivenState,
4
- SampleThenState,
5
- SampleWhenState,
6
- } from "./testUtils";
7
-
8
- // Simplest possible example
9
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
10
- .statement("Then we should see something")
11
- .step(() => {
12
- return {
13
- i: { j: "result" },
14
- };
15
- });
16
-
17
- // Simple dependency on given state example
18
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
19
- .statement("Then we should see something")
20
- .dependencies({
21
- given: {
22
- a: "required",
23
- },
24
- })
25
- .step(({ given }) => {
26
- return {
27
- i: { j: `Result with ${given.a}` },
28
- };
29
- });
30
-
31
- // Simple dependency on when state example
32
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
33
- .statement("Then we should see something")
34
- .dependencies({
35
- when: {
36
- d: "required",
37
- },
38
- })
39
- .step(({ when }) => {
40
- return {
41
- i: { j: `Result with ${when.d}` },
42
- };
43
- });
44
-
45
- // Simple dependency on then state example
46
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
47
- .statement("Then we should see something")
48
- .dependencies({
49
- then: {
50
- g: "required",
51
- },
52
- })
53
- .step(({ then }) => {
54
- return {
55
- i: { j: `Result with ${then.g}` },
56
- };
57
- });
58
-
59
- // Simple variables example
60
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
61
- .statement((v1: string, v2: number) => `Then we should see ${v1} ${v2} times`)
62
- .step(({ variables: [v1, v2] }) => {
63
- return {
64
- i: { j: `Result ${v1} ${v2}` },
65
- };
66
- });
67
-
68
- // Complex example with all dependencies
69
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
70
- .statement((v1: string, v2: number) => `Then we should see ${v1} ${v2} times`)
71
- .dependencies({
72
- given: {
73
- a: "required",
74
- b: "optional",
75
- },
76
- when: {
77
- d: "required",
78
- e: "optional",
79
- },
80
- then: {
81
- g: "required",
82
- h: "optional",
83
- },
84
- })
85
- .step(
86
- ({
87
- variables: [v1, v2],
88
- given: { a, b },
89
- when: { d, e },
90
- then: { g, h },
91
- }) => {
92
- return {
93
- i: { j: `Result ${v1} ${v2} with ${a} ${b} ${d} ${e} ${g} ${h}` },
94
- };
95
- }
96
- );
97
-
98
- // ----- Should not compile section ----
99
-
100
- // @ts-expect-error - Should not compile without a statement
101
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>().step(() => {
102
- return {
103
- i: { j: "result" },
104
- };
105
- });
106
-
107
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
108
- .statement(() => "Then we should see something")
109
- // @ts-expect-error - Should not compile since no variables are declared
110
- .step(({ variables: [v1, v2] }) => {
111
- return {
112
- i: { j: `Result ${v1} ${v2}` },
113
- };
114
- });
115
-
116
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
117
- .statement("Then we should see something")
118
- // @ts-expect-error - Should not compile since no variables are declared
119
- .step(({ variables: [v1, v2] }) => {
120
- return {
121
- i: { j: `Result ${v1} ${v2}` },
122
- };
123
- });
124
-
125
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
126
- .statement(
127
- (v1: string, v2: number, v3: boolean) =>
128
- `Then we should see ${v1} ${v2} ${v3}`
129
- )
130
- // @ts-expect-error - Should not compile since the number of variables exceeds the number declared
131
- .step(({ variables: [v1, v2, v3, v4] }) => {
132
- return {
133
- i: { j: `Result ${v1} ${v2} ${v3} ${v4}` },
134
- };
135
- });
136
-
137
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
138
- .statement("Then we should see something")
139
- .dependencies({ given: { a: "required" } })
140
- .step(({ given }) => {
141
- return {
142
- // @ts-expect-error - Should not compile if we attempt to access a part of state that was not declared as a dependency
143
- i: { j: `Result ${given.b}` },
144
- };
145
- });
146
-
147
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
148
- .statement("Then we should see something")
149
- .dependencies({ when: { d: "required" } })
150
- .step(({ when }) => {
151
- return {
152
- // @ts-expect-error - Should not compile if we attempt to access a part of state that was not declared as a dependency
153
- i: { j: `Result ${when.f}` },
154
- };
155
- });
156
-
157
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
158
- .statement("Then we should see something")
159
- .dependencies({ then: { g: "required" } })
160
- .step(({ then }) => {
161
- return {
162
- // @ts-expect-error - Should not compile if we attempt to access a part of state that was not declared as a dependency
163
- i: { j: `Result ${then.i}` },
164
- };
165
- });
166
-
167
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
168
- .statement("Then we should see something")
169
- .dependencies({ given: { a: "optional" } })
170
- .step(({ given }) => {
171
- // @ts-expect-error - Should not compile since a is optional and can be undefined
172
- const strictA: string = given.a;
173
- return {
174
- i: { j: `Result ${strictA}` },
175
- };
176
- });
177
-
178
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
179
- .statement("Then we should see something")
180
- .dependencies({ when: { e: "optional" } })
181
- .step(({ when }) => {
182
- // @ts-expect-error - Should not compile since e is optional and can be undefined
183
- const strictE: string = when.e;
184
- return {
185
- i: { j: `Result ${strictE}` },
186
- };
187
- });
188
-
189
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
190
- .statement("Then we should see something")
191
- .dependencies({ then: { h: "optional" } })
192
- .step(({ then }) => {
193
- // @ts-expect-error - Should not compile since h is optional and can be undefined
194
- const strictH: string = then.h;
195
- return {
196
- i: { j: `Result ${strictH}` },
197
- };
198
- });
199
-
200
- thenBuilder<SampleGivenState, SampleWhenState, SampleThenState>()
201
- .statement("Then we should see something")
202
- // @ts-expect-error - Should not compile since the return type is not a partial of then state
203
- .step(() => {
204
- return {
205
- a: "hello",
206
- };
207
- });