@t4h.framework/core 0.7.0 → 0.9.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.
Files changed (149) hide show
  1. package/.ai/skills/framework-core/SKILL.md +103 -287
  2. package/.ai/skills/framework-workflow-creation/SKILL.md +108 -60
  3. package/.ai/skills/framework-workflow-testing/SKILL.md +165 -111
  4. package/README.md +123 -37
  5. package/dist/activities/StartWorkflowActivity.d.ts +52 -9
  6. package/dist/activities/StartWorkflowActivity.d.ts.map +1 -1
  7. package/dist/activities/StartWorkflowActivity.js +45 -5
  8. package/dist/activities/StartWorkflowActivity.js.map +1 -1
  9. package/dist/core.d.ts +2 -0
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +2 -0
  12. package/dist/core.js.map +1 -1
  13. package/dist/models/ContinueAsNew.d.ts +24 -0
  14. package/dist/models/ContinueAsNew.d.ts.map +1 -0
  15. package/dist/models/ContinueAsNew.js +28 -0
  16. package/dist/models/ContinueAsNew.js.map +1 -0
  17. package/dist/models/ExecutionContext.d.ts +8 -0
  18. package/dist/models/ExecutionContext.d.ts.map +1 -0
  19. package/dist/models/ExecutionContext.js +22 -0
  20. package/dist/models/ExecutionContext.js.map +1 -0
  21. package/dist/models/WorkflowBatchClaim.d.ts +10 -0
  22. package/dist/models/WorkflowBatchClaim.d.ts.map +1 -0
  23. package/dist/models/WorkflowBatchClaim.js +3 -0
  24. package/dist/models/WorkflowBatchClaim.js.map +1 -0
  25. package/dist/models/WorkflowBatchRef.d.ts +6 -0
  26. package/dist/models/WorkflowBatchRef.d.ts.map +1 -0
  27. package/dist/models/WorkflowBatchRef.js +9 -0
  28. package/dist/models/WorkflowBatchRef.js.map +1 -0
  29. package/dist/models/WorkflowRef.d.ts +2 -2
  30. package/dist/models/WorkflowRef.d.ts.map +1 -1
  31. package/dist/models/WorkflowRef.js.map +1 -1
  32. package/dist/testing/ActivityTesting.d.ts +25 -0
  33. package/dist/testing/ActivityTesting.d.ts.map +1 -0
  34. package/dist/testing/ActivityTesting.js +74 -0
  35. package/dist/testing/ActivityTesting.js.map +1 -0
  36. package/dist/testing/NonDeterministicWorkflowError.d.ts +4 -0
  37. package/dist/testing/NonDeterministicWorkflowError.d.ts.map +1 -0
  38. package/dist/testing/NonDeterministicWorkflowError.js +7 -0
  39. package/dist/testing/NonDeterministicWorkflowError.js.map +1 -0
  40. package/dist/testing/StrictGuard.d.ts +4 -0
  41. package/dist/testing/StrictGuard.d.ts.map +1 -0
  42. package/dist/testing/StrictGuard.js +26 -0
  43. package/dist/testing/StrictGuard.js.map +1 -0
  44. package/dist/testing/TestClock.d.ts +12 -0
  45. package/dist/testing/TestClock.d.ts.map +1 -0
  46. package/dist/testing/TestClock.js +64 -0
  47. package/dist/testing/TestClock.js.map +1 -0
  48. package/dist/testing/TestWorkflowEnvironment.d.ts +27 -0
  49. package/dist/testing/TestWorkflowEnvironment.d.ts.map +1 -0
  50. package/dist/testing/TestWorkflowEnvironment.js +64 -0
  51. package/dist/testing/TestWorkflowEnvironment.js.map +1 -0
  52. package/dist/testing/WorkflowTesting.d.ts +1 -1
  53. package/dist/testing/async-activity-results.d.ts +12 -0
  54. package/dist/testing/async-activity-results.d.ts.map +1 -0
  55. package/dist/testing/async-activity-results.js +10 -0
  56. package/dist/testing/async-activity-results.js.map +1 -0
  57. package/dist/testing/create-mock-claim.d.ts +11 -0
  58. package/dist/testing/create-mock-claim.d.ts.map +1 -0
  59. package/dist/testing/create-mock-claim.js +26 -0
  60. package/dist/testing/create-mock-claim.js.map +1 -0
  61. package/dist/testing/create-mock-claims.d.ts +13 -0
  62. package/dist/testing/create-mock-claims.d.ts.map +1 -0
  63. package/dist/testing/create-mock-claims.js +8 -0
  64. package/dist/testing/create-mock-claims.js.map +1 -0
  65. package/dist/testing/create-test-env.d.ts +10 -0
  66. package/dist/testing/create-test-env.d.ts.map +1 -0
  67. package/dist/testing/create-test-env.js +7 -0
  68. package/dist/testing/create-test-env.js.map +1 -0
  69. package/dist/testing/exceptions/NonDeterministicWorkflowError.d.ts +4 -0
  70. package/dist/testing/exceptions/NonDeterministicWorkflowError.d.ts.map +1 -0
  71. package/dist/testing/exceptions/NonDeterministicWorkflowError.js +7 -0
  72. package/dist/testing/exceptions/NonDeterministicWorkflowError.js.map +1 -0
  73. package/dist/testing/index.d.ts +8 -1
  74. package/dist/testing/index.d.ts.map +1 -1
  75. package/dist/testing/index.js +8 -1
  76. package/dist/testing/index.js.map +1 -1
  77. package/dist/testing/mock-async.d.ts +48 -0
  78. package/dist/testing/mock-async.d.ts.map +1 -0
  79. package/dist/testing/mock-async.js +58 -0
  80. package/dist/testing/mock-async.js.map +1 -0
  81. package/dist/testing/outcomes.d.ts +12 -0
  82. package/dist/testing/outcomes.d.ts.map +1 -0
  83. package/dist/testing/outcomes.js +10 -0
  84. package/dist/testing/outcomes.js.map +1 -0
  85. package/dist/testing/run-workflow.d.ts +22 -21
  86. package/dist/testing/run-workflow.d.ts.map +1 -1
  87. package/dist/testing/run-workflow.js +47 -23
  88. package/dist/testing/run-workflow.js.map +1 -1
  89. package/dist/testing/tools/clone.d.ts +2 -0
  90. package/dist/testing/tools/clone.d.ts.map +1 -0
  91. package/dist/testing/tools/clone.js +42 -0
  92. package/dist/testing/tools/clone.js.map +1 -0
  93. package/dist/testing/tools/create-mock-claim.d.ts +5 -0
  94. package/dist/testing/tools/create-mock-claim.d.ts.map +1 -0
  95. package/dist/testing/tools/create-mock-claim.js +26 -0
  96. package/dist/testing/tools/create-mock-claim.js.map +1 -0
  97. package/dist/testing/tools/create-mock-claims.d.ts +8 -0
  98. package/dist/testing/tools/create-mock-claims.d.ts.map +1 -0
  99. package/dist/testing/tools/create-mock-claims.js +5 -0
  100. package/dist/testing/tools/create-mock-claims.js.map +1 -0
  101. package/dist/testing/tools/create-test-env.d.ts +4 -0
  102. package/dist/testing/tools/create-test-env.d.ts.map +1 -0
  103. package/dist/testing/tools/create-test-env.js +7 -0
  104. package/dist/testing/tools/create-test-env.js.map +1 -0
  105. package/dist/testing/tools/mock-async.d.ts +20 -0
  106. package/dist/testing/tools/mock-async.d.ts.map +1 -0
  107. package/dist/testing/tools/mock-async.js +57 -0
  108. package/dist/testing/tools/mock-async.js.map +1 -0
  109. package/dist/testing/tools/resolve-activity.d.ts +11 -0
  110. package/dist/testing/tools/resolve-activity.d.ts.map +1 -0
  111. package/dist/testing/tools/resolve-activity.js +23 -0
  112. package/dist/testing/tools/resolve-activity.js.map +1 -0
  113. package/dist/testing/tools/resolve-async-activity.d.ts +15 -0
  114. package/dist/testing/tools/resolve-async-activity.d.ts.map +1 -0
  115. package/dist/testing/tools/resolve-async-activity.js +69 -0
  116. package/dist/testing/tools/resolve-async-activity.js.map +1 -0
  117. package/dist/testing/tools/run-with-clock.d.ts +3 -0
  118. package/dist/testing/tools/run-with-clock.d.ts.map +1 -0
  119. package/dist/testing/tools/run-with-clock.js +7 -0
  120. package/dist/testing/tools/run-with-clock.js.map +1 -0
  121. package/dist/testing/tools/run-workflow-ticks.d.ts +8 -0
  122. package/dist/testing/tools/run-workflow-ticks.d.ts.map +1 -0
  123. package/dist/testing/tools/run-workflow-ticks.js +26 -0
  124. package/dist/testing/tools/run-workflow-ticks.js.map +1 -0
  125. package/dist/testing/tools/run-workflow.d.ts +25 -0
  126. package/dist/testing/tools/run-workflow.d.ts.map +1 -0
  127. package/dist/testing/tools/run-workflow.js +25 -0
  128. package/dist/testing/tools/run-workflow.js.map +1 -0
  129. package/dist/testing/tools/serializable-clone.d.ts +21 -0
  130. package/dist/testing/tools/serializable-clone.d.ts.map +1 -0
  131. package/dist/testing/tools/serializable-clone.js +77 -0
  132. package/dist/testing/tools/serializable-clone.js.map +1 -0
  133. package/dist/testing/types.d.ts +19 -0
  134. package/dist/testing/types.d.ts.map +1 -0
  135. package/dist/testing/types.js +2 -0
  136. package/dist/testing/types.js.map +1 -0
  137. package/dist/testing/typings/AsyncActivityResult.d.ts +10 -0
  138. package/dist/testing/typings/AsyncActivityResult.d.ts.map +1 -0
  139. package/dist/testing/typings/AsyncActivityResult.js +2 -0
  140. package/dist/testing/typings/AsyncActivityResult.js.map +1 -0
  141. package/dist/testing/typings/ClaimConstructor.d.ts +2 -0
  142. package/dist/testing/typings/ClaimConstructor.d.ts.map +1 -0
  143. package/dist/testing/typings/ClaimConstructor.js +2 -0
  144. package/dist/testing/typings/ClaimConstructor.js.map +1 -0
  145. package/dist/testing/typings/MockAsyncActivity.d.ts +10 -0
  146. package/dist/testing/typings/MockAsyncActivity.d.ts.map +1 -0
  147. package/dist/testing/typings/MockAsyncActivity.js +2 -0
  148. package/dist/testing/typings/MockAsyncActivity.js.map +1 -0
  149. package/package.json +1 -1
@@ -0,0 +1,74 @@
1
+ import { AsyncActivity, } from '../models/AsyncActivity.js';
2
+ import { AsyncActivityResultFulfilled, AsyncActivityResultPending, AsyncActivityResultRejected, } from '../models/AsyncActivityAdvanceResult.js';
3
+ import { SyncActivity } from '../models/SyncActivity.js';
4
+ import { Internals } from '../tools/Internals.js';
5
+ export class ActivityTesting {
6
+ static async run(ActivityClass, args = [], options = {}) {
7
+ const activity = new ActivityClass();
8
+ const context = {
9
+ claims: options.claims ?? [],
10
+ env: options.env ?? {},
11
+ };
12
+ const input = await activity.toInput(...args);
13
+ if (activity instanceof SyncActivity) {
14
+ const output = await Internals.runActivity(activity, context, instance => instance.run(input));
15
+ return activity.toOutput(output, ...args);
16
+ }
17
+ if (activity instanceof AsyncActivity) {
18
+ return resolveAsyncActivity(activity, input, args, context, options);
19
+ }
20
+ throw new Error(`Unknown activity type: ${ActivityClass.name}`);
21
+ }
22
+ }
23
+ async function resolveAsyncActivity(activity, input, args, context, options) {
24
+ const bootstrap = await Internals.runActivity(activity, context, instance => instance.bootstrap(input));
25
+ if (bootstrap instanceof AsyncActivityResultFulfilled)
26
+ return activity.toOutput(bootstrap.payload, ...args);
27
+ if (bootstrap instanceof AsyncActivityResultRejected)
28
+ throw new AsyncActivityRejectedError(bootstrap.payload);
29
+ if (!(bootstrap instanceof AsyncActivityResultPending))
30
+ throw new Error(`Unknown async bootstrap result for "${activity.constructor.name}"`);
31
+ const asyncOptions = options.async;
32
+ if (asyncOptions && 'advance' in asyncOptions) {
33
+ const result = await Internals.runActivity(activity, context, instance => instance.advance(asyncOptions.advance, bootstrap));
34
+ if (result instanceof AsyncActivityResultFulfilled)
35
+ return activity.toOutput(result.payload, ...args);
36
+ if (result instanceof AsyncActivityResultRejected)
37
+ throw new AsyncActivityRejectedError(result.payload);
38
+ throw new Error(`Async activity "${activity.constructor.name}" stayed pending after advance`);
39
+ }
40
+ if (asyncOptions?.outcome) {
41
+ switch (asyncOptions.outcome.status) {
42
+ case 'fulfilled':
43
+ return activity.toOutput(asyncOptions.outcome.output, ...args);
44
+ case 'rejected':
45
+ throw new AsyncActivityRejectedError(asyncOptions.outcome.reason);
46
+ case 'timeout': {
47
+ const onTimeout = activity.onTimeout?.bind(activity);
48
+ if (!onTimeout)
49
+ throw new Error(`Async activity "${activity.constructor.name}" timed out but defines no onTimeout handler`);
50
+ const result = await Internals.runActivity(activity, context, () => onTimeout(bootstrap));
51
+ if (result instanceof AsyncActivityResultFulfilled)
52
+ return activity.toOutput(result.payload, ...args);
53
+ if (result instanceof AsyncActivityResultRejected)
54
+ throw new AsyncActivityRejectedError(result.payload);
55
+ throw new Error(`Async activity "${activity.constructor.name}" stayed pending after onTimeout`);
56
+ }
57
+ default:
58
+ throw new Error(`Unknown async activity outcome for "${activity.constructor.name}"`);
59
+ }
60
+ }
61
+ throw new Error(`Async activity "${activity.constructor.name}" is pending. ` +
62
+ `Provide options.async.advance or options.async.outcome in ActivityTesting.run().`);
63
+ }
64
+ export class AsyncActivityRejectedError extends Error {
65
+ reason;
66
+ constructor(reason) {
67
+ super(reason instanceof Error
68
+ ? reason.message
69
+ : `Async activity rejected: ${JSON.stringify(reason)}`);
70
+ this.reason = reason;
71
+ this.name = 'AsyncActivityRejectedError';
72
+ }
73
+ }
74
+ //# sourceMappingURL=ActivityTesting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityTesting.js","sourceRoot":"","sources":["../../src/testing/ActivityTesting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class NonDeterministicWorkflowError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ //# sourceMappingURL=NonDeterministicWorkflowError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonDeterministicWorkflowError.d.ts","sourceRoot":"","sources":["../../src/testing/NonDeterministicWorkflowError.ts"],"names":[],"mappings":"AAAA,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,7 @@
1
+ export class NonDeterministicWorkflowError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'NonDeterministicWorkflowError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=NonDeterministicWorkflowError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonDeterministicWorkflowError.js","sourceRoot":"","sources":["../../src/testing/NonDeterministicWorkflowError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export declare class StrictGuard {
2
+ static install(): () => void;
3
+ }
4
+ //# sourceMappingURL=StrictGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrictGuard.d.ts","sourceRoot":"","sources":["../../src/testing/StrictGuard.ts"],"names":[],"mappings":"AAMA,qBAAa,WAAW;WACR,OAAO,IAAI,MAAM,IAAI;CA6BpC"}
@@ -0,0 +1,26 @@
1
+ import { ExecutionContext } from '../models/ExecutionContext.js';
2
+ import { NonDeterministicWorkflowError } from './NonDeterministicWorkflowError.js';
3
+ const WORKFLOW_SIDE_EFFECT_MESSAGE = 'Side effects must go through History.reconciler and activities — not directly from workflow code.';
4
+ export class StrictGuard {
5
+ static install() {
6
+ const originalRandom = Math.random;
7
+ const originalFetch = globalThis.fetch;
8
+ Math.random = () => {
9
+ if (ExecutionContext.isWorkflow())
10
+ throw new NonDeterministicWorkflowError(`Math.random() is not allowed in workflow code. ${WORKFLOW_SIDE_EFFECT_MESSAGE}`);
11
+ return originalRandom.call(Math);
12
+ };
13
+ if (originalFetch)
14
+ globalThis.fetch = ((...args) => {
15
+ if (ExecutionContext.isWorkflow())
16
+ throw new NonDeterministicWorkflowError(`fetch() is not allowed in workflow code. ${WORKFLOW_SIDE_EFFECT_MESSAGE}`);
17
+ return originalFetch(...args);
18
+ });
19
+ return () => {
20
+ Math.random = originalRandom;
21
+ if (originalFetch)
22
+ globalThis.fetch = originalFetch;
23
+ };
24
+ }
25
+ }
26
+ //# sourceMappingURL=StrictGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrictGuard.js","sourceRoot":"","sources":["../../src/testing/StrictGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAElF,MAAM,4BAA4B,GAChC,mGAAmG,CAAA;AAErG,MAAM,OAAO,WAAW;IACf,MAAM,CAAC,OAAO;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAA;QAClC,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAA;QAEtC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE;YACjB,IAAI,gBAAgB,CAAC,UAAU,EAAE;gBAC/B,MAAM,IAAI,6BAA6B,CACrC,kDAAkD,4BAA4B,EAAE,CACjF,CAAA;YAEH,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC,CAAA;QAED,IAAI,aAAa;YACf,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAA8B,EAAE,EAAE;gBACxD,IAAI,gBAAgB,CAAC,UAAU,EAAE;oBAC/B,MAAM,IAAI,6BAA6B,CACrC,4CAA4C,4BAA4B,EAAE,CAC3E,CAAA;gBAEH,OAAO,aAAa,CAAC,GAAG,IAAI,CAAC,CAAA;YAC/B,CAAC,CAAiB,CAAA;QAEpB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,GAAG,cAAc,CAAA;YAE5B,IAAI,aAAa;gBAAE,UAAU,CAAC,KAAK,GAAG,aAAa,CAAA;QACrD,CAAC,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export interface TestClockRunOptions {
2
+ now?: Date | number;
3
+ }
4
+ export declare class TestClock {
5
+ static run<T>(options: TestClockRunOptions, fn: () => T): T;
6
+ static isActive(): boolean;
7
+ static now(): number;
8
+ static advance(ms: number): void;
9
+ static set(now: Date | number): void;
10
+ static sleep(ms: number): void;
11
+ }
12
+ //# sourceMappingURL=TestClock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestClock.d.ts","sourceRoot":"","sources":["../../src/testing/TestClock.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CACpB;AAwBD,qBAAa,SAAS;WACN,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;WA+BpD,QAAQ,IAAI,OAAO;WAInB,GAAG,IAAI,MAAM;WAIb,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;WAWzB,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;WAW7B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGtC"}
@@ -0,0 +1,64 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ const storage = new AsyncLocalStorage();
3
+ const OriginalDate = globalThis.Date;
4
+ function createPatchedDateConstructor() {
5
+ return class extends OriginalDate {
6
+ constructor(...args) {
7
+ if (args.length === 0) {
8
+ super(TestClock.now());
9
+ return;
10
+ }
11
+ super(...args);
12
+ }
13
+ static now() {
14
+ return TestClock.now();
15
+ }
16
+ };
17
+ }
18
+ export class TestClock {
19
+ static run(options, fn) {
20
+ const now = options.now instanceof Date
21
+ ? options.now.getTime()
22
+ : (options.now ?? OriginalDate.now());
23
+ return storage.run({ now }, () => {
24
+ const PatchedDate = createPatchedDateConstructor();
25
+ globalThis.Date = PatchedDate;
26
+ const finish = () => {
27
+ globalThis.Date = OriginalDate;
28
+ };
29
+ try {
30
+ const result = fn();
31
+ if (result instanceof Promise)
32
+ return result.finally(finish);
33
+ finish();
34
+ return result;
35
+ }
36
+ catch (error) {
37
+ finish();
38
+ throw error;
39
+ }
40
+ });
41
+ }
42
+ static isActive() {
43
+ return storage.getStore() !== undefined;
44
+ }
45
+ static now() {
46
+ return storage.getStore()?.now ?? OriginalDate.now();
47
+ }
48
+ static advance(ms) {
49
+ const state = storage.getStore();
50
+ if (!state)
51
+ throw new Error('TestClock.advance() must be called inside TestClock.run() or WorkflowTesting.run({ clock: ... })');
52
+ state.now += ms;
53
+ }
54
+ static set(now) {
55
+ const state = storage.getStore();
56
+ if (!state)
57
+ throw new Error('TestClock.set() must be called inside TestClock.run() or WorkflowTesting.run({ clock: ... })');
58
+ state.now = now instanceof Date ? now.getTime() : now;
59
+ }
60
+ static sleep(ms) {
61
+ TestClock.advance(ms);
62
+ }
63
+ }
64
+ //# sourceMappingURL=TestClock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestClock.js","sourceRoot":"","sources":["../../src/testing/TestClock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAUpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAA;AAEvD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAA;AAEpC,SAAS,4BAA4B;IACnC,OAAO,KAAM,SAAQ,YAAY;QAC/B,YAAY,GAAG,IAAmC;YAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;gBAEtB,OAAM;YACR,CAAC;YAED,KAAK,CAAC,GAAI,IAAmD,CAAC,CAAA;QAChE,CAAC;QAEM,MAAM,CAAC,GAAG;YACf,OAAO,SAAS,CAAC,GAAG,EAAE,CAAA;QACxB,CAAC;KACiB,CAAA;AACtB,CAAC;AAED,MAAM,OAAO,SAAS;IACb,MAAM,CAAC,GAAG,CAAI,OAA4B,EAAE,EAAW;QAC5D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,YAAY,IAAI;YACzB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;YACvB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,CAAA;QAEzC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE;YAC/B,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAA;YAElD,UAAU,CAAC,IAAI,GAAG,WAAW,CAAA;YAE7B,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,UAAU,CAAC,IAAI,GAAG,YAAY,CAAA;YAChC,CAAC,CAAA;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;gBAEnB,IAAI,MAAM,YAAY,OAAO;oBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAM,CAAA;gBAEjE,MAAM,EAAE,CAAA;gBAER,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,EAAE,CAAA;gBAER,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,MAAM,CAAC,QAAQ;QACpB,OAAO,OAAO,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAA;IACzC,CAAC;IAEM,MAAM,CAAC,GAAG;QACf,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAA;IACtD,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,EAAU;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAEhC,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAA;QAEH,KAAK,CAAC,GAAG,IAAI,EAAE,CAAA;IACjB,CAAC;IAEM,MAAM,CAAC,GAAG,CAAC,GAAkB;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAEhC,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAA;QAEH,KAAK,CAAC,GAAG,GAAG,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACvD,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,EAAU;QAC5B,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { ClaimProvider } from '../models/Claim.js';
2
+ import type { Env } from '../models/Env.js';
3
+ import type { Workflow, WorkflowInput } from '../models/Workflow.js';
4
+ import type { MockAsyncActivity } from './typings/MockAsyncActivity.js';
5
+ export interface TestWorkflowEnvironmentOptions {
6
+ now?: Date | number;
7
+ resolveActivityTimeouts?: boolean;
8
+ }
9
+ export interface TestWorkflowEnvironmentExecuteOptions {
10
+ claims?: readonly ClaimProvider<any>[];
11
+ env?: Env.Entries;
12
+ mockAsyncActivity?: MockAsyncActivity;
13
+ }
14
+ export declare class TestWorkflowEnvironment {
15
+ private resolveActivityTimeouts;
16
+ private now;
17
+ private constructor();
18
+ static create(options?: TestWorkflowEnvironmentOptions): TestWorkflowEnvironment;
19
+ readonly clock: {
20
+ now: () => number;
21
+ advance: (ms: number) => void;
22
+ set: (now: Date | number) => void;
23
+ };
24
+ execute<T extends Workflow<any, any>>(workflow: T, input?: WorkflowInput<T>, options?: TestWorkflowEnvironmentExecuteOptions): Promise<unknown>;
25
+ private assertWorkflowReplays;
26
+ }
27
+ //# sourceMappingURL=TestWorkflowEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestWorkflowEnvironment.d.ts","sourceRoot":"","sources":["../../src/testing/TestWorkflowEnvironment.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,qCAAqC;IACpD,MAAM,CAAC,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;IACtC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACjB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,GAAG,CAAY;IAEvB,OAAO;WASO,MAAM,CAClB,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB;IAI1B,SAAgB,KAAK;;sBAGL,MAAM;mBAMT,IAAI,GAAG,MAAM;MAKzB;IAEY,OAAO,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAC/C,QAAQ,EAAE,CAAC,EACX,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,OAAO,GAAE,qCAA0C;YAgCvC,qBAAqB;CAwBpC"}
@@ -0,0 +1,64 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { NonDeterministicWorkflowError } from './exceptions/NonDeterministicWorkflowError.js';
3
+ import { TestClock } from './TestClock.js';
4
+ import { clone } from './tools/clone.js';
5
+ import { runWorkflow } from './tools/run-workflow.js';
6
+ import { Internals } from '../tools/Internals.js';
7
+ export class TestWorkflowEnvironment {
8
+ resolveActivityTimeouts = true;
9
+ now = 0;
10
+ constructor(options) {
11
+ if (options.now)
12
+ this.now =
13
+ options.now instanceof Date ? options.now.getTime() : options.now;
14
+ if (typeof options.resolveActivityTimeouts === 'boolean')
15
+ this.resolveActivityTimeouts = options.resolveActivityTimeouts;
16
+ }
17
+ static create(options = {}) {
18
+ return new TestWorkflowEnvironment(options);
19
+ }
20
+ clock = {
21
+ now: () => this.now,
22
+ advance: (ms) => {
23
+ this.now += ms;
24
+ if (TestClock.isActive())
25
+ TestClock.advance(ms);
26
+ },
27
+ set: (now) => {
28
+ this.now = now instanceof Date ? now.getTime() : now;
29
+ if (TestClock.isActive())
30
+ TestClock.set(now);
31
+ },
32
+ };
33
+ async execute(workflow, input, options = {}) {
34
+ const runWorkflowOptions = {
35
+ claims: options.claims ?? [],
36
+ env: options.env ?? {},
37
+ history: [],
38
+ logs: [],
39
+ clock: { now: this.now },
40
+ resolveActivityTimeouts: this.resolveActivityTimeouts,
41
+ };
42
+ if (options.mockAsyncActivity !== undefined)
43
+ runWorkflowOptions.mockAsyncActivity = options.mockAsyncActivity;
44
+ const result = await runWorkflow(workflow, input, runWorkflowOptions);
45
+ if (result.clockNow !== undefined)
46
+ this.now = result.clockNow;
47
+ await this.assertWorkflowReplays(workflow, input, result.output, runWorkflowOptions);
48
+ return result.output;
49
+ }
50
+ async assertWorkflowReplays(workflow, input, output, context) {
51
+ const history = await clone(context.history);
52
+ const replay = await TestClock.run({ now: this.now }, () => Internals.runWorkflow(workflow, {
53
+ input,
54
+ claims: context.claims,
55
+ env: context.env,
56
+ history,
57
+ logs: [],
58
+ }));
59
+ if (isDeepStrictEqual(output, replay))
60
+ return;
61
+ throw new NonDeterministicWorkflowError('Replay from recorded history produced a different workflow output.');
62
+ }
63
+ }
64
+ //# sourceMappingURL=TestWorkflowEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestWorkflowEnvironment.js","sourceRoot":"","sources":["../../src/testing/TestWorkflowEnvironment.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type RunWorkflowOptions } from './run-workflow.js';
2
2
  import type { Workflow, WorkflowInput } from '../models/Workflow.js';
3
3
  export declare class WorkflowTesting {
4
- static run<T extends Workflow<any, any>>(workflow: T, input?: WorkflowInput<T>, options?: RunWorkflowOptions): Promise<any>;
4
+ static run<T extends Workflow<any, any>>(workflow: T, input?: WorkflowInput<T>, options?: RunWorkflowOptions): Promise<unknown>;
5
5
  }
6
6
  //# sourceMappingURL=WorkflowTesting.d.ts.map
@@ -0,0 +1,12 @@
1
+ export declare function fulfilled<T>(output?: T): {
2
+ status: 'fulfilled';
3
+ output?: T;
4
+ };
5
+ export declare function rejected(reason?: unknown): {
6
+ status: 'rejected';
7
+ reason?: unknown;
8
+ };
9
+ export declare function timeout(): {
10
+ status: 'timeout';
11
+ };
12
+ //# sourceMappingURL=async-activity-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-activity-results.d.ts","sourceRoot":"","sources":["../../src/testing/async-activity-results.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAE5E;AAED,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;IAC1C,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAEA;AAED,wBAAgB,OAAO,IAAI;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAE/C"}
@@ -0,0 +1,10 @@
1
+ export function fulfilled(output) {
2
+ return { status: 'fulfilled', output };
3
+ }
4
+ export function rejected(reason) {
5
+ return { status: 'rejected', reason };
6
+ }
7
+ export function timeout() {
8
+ return { status: 'timeout' };
9
+ }
10
+ //# sourceMappingURL=async-activity-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-activity-results.js","sourceRoot":"","sources":["../../src/testing/async-activity-results.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAI,MAAU;IACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAgB;IAIvC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ClaimProvider } from '../../models/Claim.js'
2
+ import type { ClaimConstructor } from '../types.js'
3
+ export declare function createMockClaim<T extends ClaimConstructor>(
4
+ ClaimClass: T,
5
+ implementation?: Partial<InstanceType<T>>,
6
+ ): InstanceType<T>
7
+ export declare function mockClaim<T extends ClaimConstructor>(
8
+ ClaimClass: T,
9
+ implementation?: Partial<InstanceType<T>>,
10
+ ): ClaimProvider<InstanceType<T>>
11
+ //# sourceMappingURL=create-mock-claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-mock-claim.d.ts","sourceRoot":"","sources":["../../src/testing/create-mock-claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,wBAAgB,eAAe,CAAC,CAAC,SAAS,gBAAgB,EACxD,UAAU,EAAE,CAAC,EACb,cAAc,GAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAM,GAC5C,YAAY,CAAC,CAAC,CAAC,CAuBjB;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,gBAAgB,EAClD,UAAU,EAAE,CAAC,EACb,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACxC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAKhC"}
@@ -0,0 +1,26 @@
1
+ export function createMockClaim(ClaimClass, implementation = {}) {
2
+ const name = ClaimClass.name;
3
+ return new Proxy(implementation, {
4
+ get(target, propertyKey, receiver) {
5
+ if (propertyKey in target) {
6
+ const value = Reflect.get(target, propertyKey, receiver);
7
+ if (typeof value === 'function')
8
+ return value.bind(target);
9
+ return value;
10
+ }
11
+ if (propertyKey === 'then')
12
+ return undefined;
13
+ return (...args) => {
14
+ throw new Error(`Mock ${name}.${String(propertyKey)} was not implemented. ` +
15
+ `Provide it via mockClaim(${name}, { ${String(propertyKey)}: ... }).`);
16
+ };
17
+ },
18
+ });
19
+ }
20
+ export function mockClaim(ClaimClass, implementation) {
21
+ return {
22
+ provide: ClaimClass,
23
+ value: createMockClaim(ClaimClass, implementation ?? {}),
24
+ };
25
+ }
26
+ //# sourceMappingURL=create-mock-claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-mock-claim.js","sourceRoot":"","sources":["../../src/testing/create-mock-claim.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAC7B,UAAa,EACb,iBAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAE5B,OAAO,IAAI,KAAK,CAAC,cAAwB,EAAE;QACzC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ;YAC/B,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;gBAExD,IAAI,OAAO,KAAK,KAAK,UAAU;oBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAE1D,OAAO,KAAK,CAAA;YACd,CAAC;YAED,IAAI,WAAW,KAAK,MAAM;gBAAE,OAAO,SAAS,CAAA;YAE5C,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;gBAC5B,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC,wBAAwB;oBACzD,4BAA4B,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,WAAW,CACxE,CAAA;YACH,CAAC,CAAA;QACH,CAAC;KACF,CAAoB,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,UAAa,EACb,cAAyC;IAEzC,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC;KACzD,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ClaimConstructor } from '../types.js'
2
+ import type { ClaimProvider } from '../../models/Claim.js'
3
+ export declare function createMockClaims(
4
+ ...providers: readonly ClaimProvider<any>[]
5
+ ): readonly ClaimProvider<any>[]
6
+ export type MockClaimEntry = readonly [
7
+ claim: ClaimConstructor,
8
+ implementation?: Partial<InstanceType<ClaimConstructor>>,
9
+ ]
10
+ export declare function createMockClaimsFromMap(
11
+ entries: readonly MockClaimEntry[],
12
+ ): readonly ClaimProvider<any>[]
13
+ //# sourceMappingURL=create-mock-claims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-mock-claims.d.ts","sourceRoot":"","sources":["../../src/testing/create-mock-claims.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,wBAAgB,gBAAgB,CAC9B,GAAG,SAAS,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,GAC1C,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAE/B;AAED,MAAM,MAAM,cAAc,GAAG,SAAS;IACpC,KAAK,EAAE,gBAAgB;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;CACzD,CAAA;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,cAAc,EAAE,GACjC,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAI/B"}
@@ -0,0 +1,8 @@
1
+ import { mockClaim } from './create-mock-claim.js';
2
+ export function createMockClaims(...providers) {
3
+ return providers;
4
+ }
5
+ export function createMockClaimsFromMap(entries) {
6
+ return entries.map(([ClaimClass, implementation]) => mockClaim(ClaimClass, implementation ?? {}));
7
+ }
8
+ //# sourceMappingURL=create-mock-claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-mock-claims.js","sourceRoot":"","sources":["../../src/testing/create-mock-claims.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAIlD,MAAM,UAAU,gBAAgB,CAC9B,GAAG,SAAwC;IAE3C,OAAO,SAAS,CAAA;AAClB,CAAC;AAOD,MAAM,UAAU,uBAAuB,CACrC,OAAkC;IAElC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,CAClD,SAAS,CAAC,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC,CAC5C,CAAA;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Env } from '../../models/Env.js'
2
+ export declare function createTestEnv(
3
+ overrides: Record<string, string | undefined>,
4
+ base?: Record<string, string | undefined>,
5
+ ): Record<string, string | undefined>
6
+ export declare function createTestEnvEntries(
7
+ overrides: Record<string, string | undefined>,
8
+ base?: Record<string, string | undefined>,
9
+ ): Env.Entries
10
+ //# sourceMappingURL=create-test-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-test-env.d.ts","sourceRoot":"","sources":["../../src/testing/create-test-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC7C,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAEpC;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC7C,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM,GAC5C,GAAG,CAAC,OAAO,CAEb"}
@@ -0,0 +1,7 @@
1
+ export function createTestEnv(overrides, base = {}) {
2
+ return { ...base, ...overrides };
3
+ }
4
+ export function createTestEnvEntries(overrides, base = {}) {
5
+ return createTestEnv(overrides, base);
6
+ }
7
+ //# sourceMappingURL=create-test-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-test-env.js","sourceRoot":"","sources":["../../src/testing/create-test-env.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAC3B,SAA6C,EAC7C,OAA2C,EAAE;IAE7C,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAA6C,EAC7C,OAA2C,EAAE;IAE7C,OAAO,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare class NonDeterministicWorkflowError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ //# sourceMappingURL=NonDeterministicWorkflowError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonDeterministicWorkflowError.d.ts","sourceRoot":"","sources":["../../../src/testing/exceptions/NonDeterministicWorkflowError.ts"],"names":[],"mappings":"AAAA,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM;CAK5B"}
@@ -0,0 +1,7 @@
1
+ export class NonDeterministicWorkflowError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'NonDeterministicWorkflowError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=NonDeterministicWorkflowError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonDeterministicWorkflowError.js","sourceRoot":"","sources":["../../../src/testing/exceptions/NonDeterministicWorkflowError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,CAAC;CACF"}
@@ -1,2 +1,9 @@
1
- export * from './WorkflowTesting.js';
1
+ export * from './tools/mock-async.js';
2
+ export * from './tools/create-mock-claim.js';
3
+ export * from './tools/create-mock-claims.js';
4
+ export * from './tools/create-test-env.js';
5
+ export * from './async-activity-results.js';
6
+ export * from './TestClock.js';
7
+ export * from './TestWorkflowEnvironment.js';
8
+ export * from './exceptions/NonDeterministicWorkflowError.js';
2
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+CAA+C,CAAA"}
@@ -1,2 +1,9 @@
1
- export * from './WorkflowTesting.js';
1
+ export * from './tools/mock-async.js';
2
+ export * from './tools/create-mock-claim.js';
3
+ export * from './tools/create-mock-claims.js';
4
+ export * from './tools/create-test-env.js';
5
+ export * from './async-activity-results.js';
6
+ export * from './TestClock.js';
7
+ export * from './TestWorkflowEnvironment.js';
8
+ export * from './exceptions/NonDeterministicWorkflowError.js';
2
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+CAA+C,CAAA"}
@@ -0,0 +1,48 @@
1
+ import type { MockAsyncActivity } from '../types.js'
2
+ import {
3
+ AsyncActivity,
4
+ type AnyAsyncActivity,
5
+ } from '../../models/AsyncActivity.js'
6
+ import type { AsyncActivityResultPending } from '../../models/AsyncActivityAdvanceResult.js'
7
+ type InferSerializableOutput<T extends AnyAsyncActivity> =
8
+ T extends AsyncActivity<any, any, infer TSerializableOutput, any, any, any>
9
+ ? TSerializableOutput
10
+ : unknown
11
+ type TypedOutcome<TOutput> =
12
+ | {
13
+ status: 'fulfilled'
14
+ output?: TOutput
15
+ }
16
+ | {
17
+ status: 'rejected'
18
+ reason?: unknown
19
+ }
20
+ | {
21
+ status: 'timeout'
22
+ }
23
+ interface OnContext {
24
+ callCount: number
25
+ input: unknown
26
+ pending: AsyncActivityResultPending
27
+ }
28
+ type OnCallback<T extends AnyAsyncActivity> = (
29
+ activity: T,
30
+ context: OnContext,
31
+ ) =>
32
+ | TypedOutcome<InferSerializableOutput<T>>
33
+ | Promise<TypedOutcome<InferSerializableOutput<T>>>
34
+ type OnHandler<T extends AnyAsyncActivity> =
35
+ | TypedOutcome<InferSerializableOutput<T>>
36
+ | TypedOutcome<InferSerializableOutput<T>>[]
37
+ | OnCallback<T>
38
+ export interface MockAsyncBuilder extends MockAsyncActivity {
39
+ on<T extends AnyAsyncActivity>(
40
+ ActivityClass: new () => T,
41
+ handler: OnHandler<T>,
42
+ ): MockAsyncBuilder
43
+ timeout(): MockAsyncBuilder
44
+ fallback(handler: MockAsyncActivity): MockAsyncBuilder
45
+ }
46
+ export declare function mockAsync(): MockAsyncBuilder
47
+ export {}
48
+ //# sourceMappingURL=mock-async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-async.d.ts","sourceRoot":"","sources":["../../src/testing/mock-async.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EACb,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AAEzF,KAAK,uBAAuB,CAAC,CAAC,SAAS,gBAAgB,IACrD,CAAC,SAAS,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACvE,mBAAmB,GACnB,OAAO,CAAA;AAEb,KAAK,YAAY,CAAC,OAAO,IACrB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAEzB,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,0BAA0B,CAAA;CACpC;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAC5C,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,SAAS,KAEhB,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAErD,KAAK,SAAS,CAAC,CAAC,SAAS,gBAAgB,IACrC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GACxC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,GAC1C,UAAU,CAAC,CAAC,CAAC,CAAA;AAQjB,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAC3B,aAAa,EAAE,UAAU,CAAC,EAC1B,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GACpB,gBAAgB,CAAA;IAEnB,OAAO,IAAI,gBAAgB,CAAA;IAE3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAAA;CACvD;AAED,wBAAgB,SAAS,IAAI,gBAAgB,CA+E5C"}