awaitly 1.31.1 → 1.32.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 (169) hide show
  1. package/dist/adapters.cjs +2 -2
  2. package/dist/adapters.cjs.map +1 -1
  3. package/dist/adapters.d.cts +3 -1
  4. package/dist/adapters.d.ts +3 -1
  5. package/dist/adapters.js +2 -2
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/batch.cjs +2 -2
  8. package/dist/batch.cjs.map +1 -1
  9. package/dist/batch.d.cts +3 -1
  10. package/dist/batch.d.ts +3 -1
  11. package/dist/batch.js +2 -2
  12. package/dist/batch.js.map +1 -1
  13. package/dist/circuit-breaker.cjs +2 -2
  14. package/dist/circuit-breaker.cjs.map +1 -1
  15. package/dist/circuit-breaker.d.cts +3 -1
  16. package/dist/circuit-breaker.d.ts +3 -1
  17. package/dist/circuit-breaker.js +2 -2
  18. package/dist/circuit-breaker.js.map +1 -1
  19. package/dist/conditional.d.cts +3 -1
  20. package/dist/conditional.d.ts +3 -1
  21. package/dist/core.cjs +2 -2
  22. package/dist/core.cjs.map +1 -1
  23. package/dist/core.d.cts +2 -1
  24. package/dist/core.d.ts +2 -1
  25. package/dist/core.js +2 -2
  26. package/dist/core.js.map +1 -1
  27. package/dist/diagnostics.cjs +3 -3
  28. package/dist/diagnostics.cjs.map +1 -1
  29. package/dist/diagnostics.d.cts +3 -1
  30. package/dist/diagnostics.d.ts +3 -1
  31. package/dist/diagnostics.js +3 -3
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/durable.cjs +3 -3
  34. package/dist/durable.cjs.map +1 -1
  35. package/dist/durable.d.cts +8 -361
  36. package/dist/durable.d.ts +8 -361
  37. package/dist/durable.js +3 -3
  38. package/dist/durable.js.map +1 -1
  39. package/dist/engine.cjs +11 -0
  40. package/dist/engine.cjs.map +1 -0
  41. package/dist/engine.d.cts +114 -0
  42. package/dist/engine.d.ts +114 -0
  43. package/dist/engine.js +11 -0
  44. package/dist/engine.js.map +1 -0
  45. package/dist/errors-entry-CMH73Eym.d.cts +339 -0
  46. package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
  47. package/dist/errors.cjs +1 -1
  48. package/dist/errors.cjs.map +1 -1
  49. package/dist/errors.d.cts +2 -318
  50. package/dist/errors.d.ts +2 -318
  51. package/dist/errors.js +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/fetch.cjs +2 -2
  54. package/dist/fetch.cjs.map +1 -1
  55. package/dist/fetch.d.cts +3 -1
  56. package/dist/fetch.d.ts +3 -1
  57. package/dist/fetch.js +2 -2
  58. package/dist/fetch.js.map +1 -1
  59. package/dist/functional.cjs +1 -1
  60. package/dist/functional.cjs.map +1 -1
  61. package/dist/functional.d.cts +2 -0
  62. package/dist/functional.d.ts +2 -0
  63. package/dist/functional.js +1 -1
  64. package/dist/functional.js.map +1 -1
  65. package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
  66. package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
  67. package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
  68. package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
  69. package/dist/hitl.cjs +2 -2
  70. package/dist/hitl.cjs.map +1 -1
  71. package/dist/hitl.d.cts +9 -6
  72. package/dist/hitl.d.ts +9 -6
  73. package/dist/hitl.js +2 -2
  74. package/dist/hitl.js.map +1 -1
  75. package/dist/index-BVUAOWGG.d.ts +417 -0
  76. package/dist/index-CQnpmUcC.d.cts +417 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.d.cts +4 -3
  80. package/dist/index.d.ts +4 -3
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/otel.d.cts +3 -1
  84. package/dist/otel.d.ts +3 -1
  85. package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
  86. package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
  87. package/dist/persistence.d.cts +6 -3
  88. package/dist/persistence.d.ts +6 -3
  89. package/dist/policies.d.cts +3 -1
  90. package/dist/policies.d.ts +3 -1
  91. package/dist/ratelimit.cjs +2 -2
  92. package/dist/ratelimit.cjs.map +1 -1
  93. package/dist/ratelimit.d.cts +3 -1
  94. package/dist/ratelimit.d.ts +3 -1
  95. package/dist/ratelimit.js +2 -2
  96. package/dist/ratelimit.js.map +1 -1
  97. package/dist/reliability.cjs +2 -2
  98. package/dist/reliability.cjs.map +1 -1
  99. package/dist/reliability.d.cts +3 -1
  100. package/dist/reliability.d.ts +3 -1
  101. package/dist/reliability.js +2 -2
  102. package/dist/reliability.js.map +1 -1
  103. package/dist/resolver.cjs +2 -2
  104. package/dist/resolver.cjs.map +1 -1
  105. package/dist/resolver.d.cts +5 -3
  106. package/dist/resolver.d.ts +5 -3
  107. package/dist/resolver.js +2 -2
  108. package/dist/resolver.js.map +1 -1
  109. package/dist/resource.cjs +2 -2
  110. package/dist/resource.cjs.map +1 -1
  111. package/dist/resource.d.cts +3 -1
  112. package/dist/resource.d.ts +3 -1
  113. package/dist/resource.js +2 -2
  114. package/dist/resource.js.map +1 -1
  115. package/dist/result/retry.cjs +1 -1
  116. package/dist/result/retry.cjs.map +1 -1
  117. package/dist/result/retry.d.cts +2 -0
  118. package/dist/result/retry.d.ts +2 -0
  119. package/dist/result/retry.js +1 -1
  120. package/dist/result/retry.js.map +1 -1
  121. package/dist/result.cjs +1 -1
  122. package/dist/result.cjs.map +1 -1
  123. package/dist/result.d.cts +8 -23
  124. package/dist/result.d.ts +8 -23
  125. package/dist/result.js +1 -1
  126. package/dist/result.js.map +1 -1
  127. package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
  128. package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
  129. package/dist/run.cjs +2 -2
  130. package/dist/run.cjs.map +1 -1
  131. package/dist/run.d.cts +3 -1
  132. package/dist/run.d.ts +3 -1
  133. package/dist/run.js +2 -2
  134. package/dist/run.js.map +1 -1
  135. package/dist/saga.cjs +2 -2
  136. package/dist/saga.cjs.map +1 -1
  137. package/dist/saga.d.cts +3 -1
  138. package/dist/saga.d.ts +3 -1
  139. package/dist/saga.js +2 -2
  140. package/dist/saga.js.map +1 -1
  141. package/dist/singleflight.d.cts +3 -1
  142. package/dist/singleflight.d.ts +3 -1
  143. package/dist/streaming.cjs +4 -4
  144. package/dist/streaming.cjs.map +1 -1
  145. package/dist/streaming.d.cts +5 -3
  146. package/dist/streaming.d.ts +5 -3
  147. package/dist/streaming.js +4 -4
  148. package/dist/streaming.js.map +1 -1
  149. package/dist/testing.cjs +8 -4
  150. package/dist/testing.cjs.map +1 -1
  151. package/dist/testing.d.cts +87 -4
  152. package/dist/testing.d.ts +87 -4
  153. package/dist/testing.js +8 -4
  154. package/dist/testing.js.map +1 -1
  155. package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
  156. package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
  157. package/dist/webhook.cjs +2 -2
  158. package/dist/webhook.cjs.map +1 -1
  159. package/dist/webhook.d.cts +7 -4
  160. package/dist/webhook.d.ts +7 -4
  161. package/dist/webhook.js +2 -2
  162. package/dist/webhook.js.map +1 -1
  163. package/dist/workflow.cjs +3 -3
  164. package/dist/workflow.cjs.map +1 -1
  165. package/dist/workflow.d.cts +47 -11
  166. package/dist/workflow.d.ts +47 -11
  167. package/dist/workflow.js +3 -3
  168. package/dist/workflow.js.map +1 -1
  169. package/package.json +15 -1
package/dist/testing.cjs CHANGED
@@ -1,9 +1,13 @@
1
- "use strict";var me=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var He=Object.getOwnPropertyNames;var Xe=Object.prototype.hasOwnProperty;var Ye=(e,o)=>{for(var s in o)me(e,s,{get:o[s],enumerable:!0})},Ge=(e,o,s,w)=>{if(o&&typeof o=="object"||typeof o=="function")for(let E of He(o))!Xe.call(e,E)&&E!==s&&me(e,E,{get:()=>o[E],enumerable:!(w=qe(o,E))||w.enumerable});return e};var ze=e=>Ge(me({},"__esModule",{value:!0}),e);var pt={};Ye(pt,{assertEventEmitted:()=>fe,assertEventNotEmitted:()=>Ke,assertEventSequence:()=>Fe,compareSnapshots:()=>Me,createMockFn:()=>Pe,createSagaHarness:()=>je,createSnapshot:()=>_e,createTestClock:()=>De,createWorkflowHarness:()=>ye,errOutcome:()=>Ue,expectErr:()=>ke,expectOk:()=>Te,formatEvent:()=>xe,formatEvents:()=>Be,formatResult:()=>Le,okOutcome:()=>Ie,throwOutcome:()=>Ne,unwrapErr:()=>Re,unwrapErrAsync:()=>We,unwrapOk:()=>ge,unwrapOkAsync:()=>$e});module.exports=ze(pt);function Qe(e){let o=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!o)return;let s=parseFloat(o[1]),w=o[2].toLowerCase();return{_tag:"Duration",millis:s*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[w]??1)}}var Ze="UNEXPECTED_ERROR";function et(e){return Ze}function V(e){return{ok:!0,value:e}}function F(e,o){let s=o?.cause;return{ok:!1,error:e,...s!==void 0?{cause:s}:{}}}var Ae=e=>e.ok;function tt(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let o=e;if(typeof o._tag=="string"){let s=o._tag.trim();if(s)return s}if(typeof o.tag=="string"){let s=o.tag.trim();if(s)return s}if(typeof o.code=="string"){let s=o.code.trim();if(s)return s}else if(typeof o.code=="number")return String(o.code);if(e instanceof Error&&e.name){let s=e.name.trim();if(s)return s}}return"unknown"}function nt(e,o){if(!(!o||!e))return o[e]}function rt(e){let{intent:o,domain:s,owner:w,tags:E,stateChanges:f,emits:R,calls:y}=e;if(!o&&!s&&!w&&!E?.length&&!f?.length&&!R?.length&&!y?.length)return;let O={};return o&&(O.intent=o),s&&(O.domain=s),w&&(O.owner=w),E?.length&&(O.tags=E),f?.length&&(O.stateChanges=f),R?.length&&(O.emits=R),y?.length&&(O.calls=y),O}function Y(e,o,s,w,E){let f=tt(e),R=nt(f,o),y={tag:f,origin:s};return R!==void 0&&(y.classification=R),w!==void 0&&(y.attempt=w),E!==void 0&&(y.cumulativeDurationMs=E),y}var re=Symbol.for("step_timeout_marker");function Se(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:re in e}function ot(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let o=e;return{timeoutMs:o.timeoutMs,stepName:o.stepName,stepKey:o.stepKey,attempt:o.attempt}}if(re in e)return e[re]}}var ve=Symbol("early-exit");function st(e,o){return{[ve]:!0,error:e,meta:o}}function at(e){return typeof e=="object"&&e!==null&&e[ve]===!0}var Oe=Symbol("mapper-exception");function te(e){return{[Oe]:!0,thrown:e}}function it(e){return typeof e=="object"&&e!==null&&e[Oe]===!0}function Ee(e,o){let{backoff:s,initialDelay:w,maxDelay:E,jitter:f}=o,R;switch(s){case"fixed":R=w;break;case"linear":R=w*e;break;case"exponential":R=w*Math.pow(2,e-1);break}if(R=Math.min(R,E),f){let y=R*.25*Math.random();R=R+y}return Math.floor(R)}function we(e){return new Promise(o=>setTimeout(o,e))}var Ce=Symbol("timeout"),ae=Symbol("timeout-option");function ut(e){return typeof e=="object"&&e!==null&&e[ae]===!0}async function ct(e,o,s,w){let E=new AbortController,f=o.onTimeout??"error",R=()=>typeof f=="function"?f({name:s.name,key:s.key,ms:o.ms}):o.error??{type:"STEP_TIMEOUT",stepName:s.name,stepKey:s.key,timeoutMs:o.ms,attempt:s.attempt},y;w?.aborted&&E.abort(w.reason);let O;w&&!w.aborted&&(O=()=>E.abort(w.reason),w.addEventListener("abort",O,{once:!0}));let c=new Promise((P,J)=>{y=setTimeout(()=>{if(f!=="disconnect"&&E.abort(),f==="option"){J({[ae]:!0,ms:o.ms});return}J({[Ce]:!0,error:R()})},o.ms)}),K;o.signal?K=Promise.resolve(e(E.signal)):K=Promise.resolve(e());try{return await Promise.race([K,c])}catch(P){if(typeof P=="object"&&P!==null&&P[ae]===!0)throw{[ae]:!0,ms:o.ms};if(typeof P=="object"&&P!==null&&P[Ce]===!0){f==="disconnect"&&K.catch(()=>{});let J=P.error;if(typeof J=="object"&&J!==null&&J.type!=="STEP_TIMEOUT"){let j={timeoutMs:o.ms,stepName:s.name,stepKey:s.key,attempt:s.attempt};re in J?J[re]=j:Object.defineProperty(J,re,{value:j,enumerable:!1,writable:!0,configurable:!1})}throw J}throw P}finally{clearTimeout(y),O&&w&&w.removeEventListener("abort",O)}}var ne={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function he(e,o){let{onError:s,onEvent:w,catchUnexpected:E,workflowId:f,workflowName:R,context:y,_workflowSignal:O}=o&&typeof o=="object"?o:{},c=f??crypto.randomUUID(),K=E??et,P=[],J=0,j=i=>i??`step_${++J}`,u=i=>{let N=i.context!==void 0||y===void 0?i:{...i,context:y},W=R!==void 0&&N.workflowName===void 0?{...N,workflowName:R}:N;if(W.type==="step_success"){let H=W.stepId;for(let L=P.length-1;L>=0;L--){let B=P[L];if(B.type==="race"&&!B.winnerId){B.winnerId=H;break}}}w?.(W,y)},M=st,$=i=>at(i),q=(i,N)=>i,X=i=>typeof i=="function"?!1:!!(i&&typeof i=="object"&&"ok"in i||i&&typeof i=="object"&&"then"in i&&typeof i.then=="function");try{let N=function(a){let p={};for(let[n,r]of Object.entries(a))if(typeof r=="function")p[n]=r;else if(r&&typeof r=="object"&&"fn"in r)p[n]=r.fn;else throw new TypeError(`step.parallel: operation "${n}" must be a function or { fn, errors? } object`);return p},W=function(a,p){let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),t=!1;P.push({scopeId:n,type:"parallel"});let l=()=>{if(t)return;t=!0;let m=P.findIndex(d=>d.scopeId===n);m!==-1&&P.splice(m,1),u({type:"scope_end",workflowId:c,scopeId:n,ts:Date.now(),durationMs:performance.now()-r})};u({type:"scope_start",workflowId:c,scopeId:n,scopeType:"parallel",name:a,ts:Date.now()});try{let m=await p();if(l(),!m.ok)throw s?.(m.error,a,y),M(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw l(),m}})()},H=function(a,p){let n=Object.keys(a),r=p.name??`Parallel(${n.join(", ")})`,t=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let l=performance.now(),m=!1;P.push({scopeId:t,type:"parallel"});let d=()=>{if(m)return;m=!0;let T=P.findIndex(k=>k.scopeId===t);T!==-1&&P.splice(T,1),u({type:"scope_end",workflowId:c,scopeId:t,ts:Date.now(),durationMs:performance.now()-l})};u({type:"scope_start",workflowId:c,scopeId:t,scopeType:"parallel",name:r,ts:Date.now()});try{let T=await new Promise(x=>{if(n.length===0){x([]);return}let v=!1,U=n.length,S=new Array(n.length);for(let I=0;I<n.length;I++){let C=n[I],A=I;Promise.resolve(a[C]()).catch(h=>F({type:"PROMISE_REJECTED",cause:h},{cause:{type:"PROMISE_REJECTION",reason:h}})).then(h=>{if(!v){if(!h.ok){v=!0,x([{key:C,result:h}]);return}S[A]={key:C,result:h},U--,U===0&&x(S)}})}});d();let k={};for(let{key:x,result:v}of T){if(!v.ok)throw s?.(v.error,x,y),M(v.error,{origin:"result",resultCause:v.cause});k[x]=v.value}return k}catch(T){throw d(),T}})()};var ee=N,b=W,D=H;let i=(a,p,n)=>(async()=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let r=n??{},t=rt(r),l=a,m=r.key??a,d=r.key??a,{description:T,retry:k,timeout:x}=r,v=j(m),U=w,S=U?performance.now():0,C=X(p)?()=>p:p,h={attempts:Math.max(1,k?.attempts??1),backoff:k?.backoff??ne.backoff,initialDelay:k?.initialDelay??ne.initialDelay,maxDelay:k?.maxDelay??ne.maxDelay,jitter:k?.jitter??ne.jitter,retryOn:k?.retryOn??ne.retryOn,onRetry:k?.onRetry??ne.onRetry};w&&u({type:"step_start",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),...t&&{metadata:t}});let Z;for(let _=1;_<=h.attempts;_++){let Ve=U?performance.now():0;try{let g;if(x?g=await ct(C,x,{name:l,key:m,attempt:_},O):g=await C(),g.ok){let Q=performance.now()-S;return u({type:"step_success",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),durationMs:Q,...t&&{metadata:t}}),d&&u({type:"step_complete",workflowId:c,stepKey:d,name:l,description:T,ts:Date.now(),durationMs:Q,result:g,...t&&{metadata:t}}),g.value}if(Z=g,_<h.attempts&&h.retryOn(g.error,_)){let Q=Ee(_,h);u({type:"step_retry",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),attempt:_+1,maxAttempts:h.attempts,delayMs:Q,error:g.error,...t&&{metadata:t},diagnostics:Y(g.error,r.errorMeta,"result",_,performance.now()-S)}),h.onRetry(g.error,_,Q),await we(Q);continue}h.attempts>1&&u({type:"step_retries_exhausted",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),durationMs:performance.now()-S,attempts:_,lastError:g.error,...t&&{metadata:t},diagnostics:Y(g.error,r.errorMeta,"result",_,performance.now()-S)});break}catch(g){let Q=performance.now()-Ve;if(ut(g)){let G=g.ms;u({type:"step_timeout",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),timeoutMs:G,attempt:_,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"timeout",_)}),u({type:"step_success",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),durationMs:performance.now()-S,...t&&{metadata:t}}),d&&u({type:"step_complete",workflowId:c,stepKey:d,name:l,description:T,ts:Date.now(),durationMs:performance.now()-S,result:V(void 0),...t&&{metadata:t}});return}if($(g))throw u({type:"step_aborted",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),durationMs:Q,...t&&{metadata:t}}),g;if(Se(g)){let G=ot(g),Je=x?.ms??G?.timeoutMs??0;if(u({type:"step_timeout",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),timeoutMs:Je,attempt:_,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"timeout",_)}),_<h.attempts&&h.retryOn(g,_)){let le=Ee(_,h);u({type:"step_retry",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),attempt:_+1,maxAttempts:h.attempts,delayMs:le,error:g,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"timeout",_,performance.now()-S)}),h.onRetry(g,_,le),await we(le);continue}h.attempts>1&&u({type:"step_retries_exhausted",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),durationMs:performance.now()-S,attempts:_,lastError:g,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"timeout",_,performance.now()-S)});let pe=performance.now()-S;throw u({type:"step_error",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),durationMs:pe,error:g,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"timeout",_,pe)}),d&&u({type:"step_complete",workflowId:c,stepKey:d,name:l,description:T,ts:Date.now(),durationMs:pe,result:F(g,{cause:g}),meta:{origin:"throw",thrown:g},...t&&{metadata:t}}),s?.(g,l,y),M(g,{origin:"throw",thrown:g})}if(_<h.attempts&&h.retryOn(g,_)){let G=Ee(_,h);u({type:"step_retry",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),attempt:_+1,maxAttempts:h.attempts,delayMs:G,error:g,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"throw",_,performance.now()-S)}),h.onRetry(g,_,G),await we(G);continue}h.attempts>1&&!Se(g)&&u({type:"step_retries_exhausted",workflowId:c,stepId:v,stepKey:m,name:l,ts:Date.now(),durationMs:performance.now()-S,attempts:_,lastError:g,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"throw",_,performance.now()-S)});let ce=performance.now()-S,se;try{se=K(g)}catch(G){throw te(G)}throw u({type:"step_error",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),durationMs:ce,error:se,...t&&{metadata:t},diagnostics:Y(g,r.errorMeta,"throw",_,ce)}),d&&u({type:"step_complete",workflowId:c,stepKey:d,name:l,description:T,ts:Date.now(),durationMs:ce,result:F(se,{cause:g}),meta:{origin:"throw",thrown:g},...t&&{metadata:t}}),s?.(se,l,y),M(se,{origin:"throw",thrown:g})}}let z=Z,ie=performance.now()-S,ue=q(z.error,{origin:"result",resultCause:z.cause});throw u({type:"step_error",workflowId:c,stepId:v,stepKey:m,name:l,description:T,ts:Date.now(),durationMs:ie,error:ue,...t&&{metadata:t},diagnostics:Y(z.error,r.errorMeta,"result",h.attempts,ie)}),d&&u({type:"step_complete",workflowId:c,stepKey:d,name:l,description:T,ts:Date.now(),durationMs:ie,result:z,meta:{origin:"result",resultCause:z.cause},...t&&{metadata:t}}),s?.(ue,l,y),M(ue,{origin:"result",resultCause:z.cause})})();i.try=(a,p,n)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let r=n.key??a,t=a,l=a,m="error"in n?()=>n.error:n.onError,d=w;return(async()=>{let T=d?performance.now():0;w&&u({type:"step_start",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now()});try{let k=await p(),x=performance.now()-T;return u({type:"step_success",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:x}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:x,result:V(k)}),k}catch(k){let x=m(k),v=performance.now()-T,U=q(x,{origin:"throw",thrown:k});throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:v,error:U}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:v,result:F(x,{cause:k}),meta:{origin:"throw",thrown:k}}),s?.(U,t,y),M(U,{origin:"throw",thrown:k})}})()},i.fromResult=(a,p,n)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let r=n.key??a,t=a,l=a,m="error"in n?()=>n.error:n.onError,d=w;return(async()=>{let T=d?performance.now():0;w&&u({type:"step_start",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now()});let k=await p();if(k.ok){let x=performance.now()-T;return u({type:"step_success",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:x}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:x,result:V(k.value)}),k.value}else{let x=m(k.error),v=performance.now()-T,U=q(x,{origin:"result",resultCause:k.error});throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:v,error:U}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:v,result:F(x,{cause:k.error}),meta:{origin:"result",resultCause:k.error}}),s?.(U,t,y),M(U,{origin:"result",resultCause:k.error})}})()},i.fromNullable=(a,p,n,r)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return i(a,async()=>{let t=await p();return t!=null?V(t):F(n())},r)},i.retry=(a,p,n)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return i(a,p,{key:n.key??a,retry:{attempts:n.attempts,backoff:n.backoff,initialDelay:n.initialDelay,maxDelay:n.maxDelay,jitter:n.jitter,retryOn:n.retryOn,onRetry:n.onRetry},timeout:n.timeout})},i.withTimeout=(a,p,n)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return i(a,p,{key:n.key??a,timeout:n})},i.sleep=(a,p,n)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let r=typeof p=="string"?Qe(p):p;if(!r)throw new Error(`step.sleep: invalid duration '${p}'`);let t=r.millis,l=n?.signal;return i(a,async()=>{if(O?.aborted||l?.aborted){let m=new Error("Sleep aborted");throw m.name="AbortError",m}return new Promise((m,d)=>{let T={timeoutId:void 0},k=()=>{T.timeoutId&&clearTimeout(T.timeoutId);let x=new Error("Sleep aborted");x.name="AbortError",d(x)};O?.addEventListener("abort",k,{once:!0}),l?.addEventListener("abort",k,{once:!0}),T.timeoutId=setTimeout(()=>{O?.removeEventListener("abort",k),l?.removeEventListener("abort",k),m(V(void 0))},t)})},{key:n?.key??a,description:n?.description})},i.parallel=((...a)=>{if(typeof a[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let p=a[0],n=a[1];if(typeof n=="function")return W(p,n);if(n&&typeof n=="object"&&!Array.isArray(n)){let t=N(n);return H(t,{name:p})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),i.race=(a,p)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),t=!1,l={scopeId:n,type:"race",winnerId:void 0};P.push(l);let m=()=>{if(t)return;t=!0;let d=P.findIndex(T=>T.scopeId===n);d!==-1&&P.splice(d,1),u({type:"scope_end",workflowId:c,scopeId:n,ts:Date.now(),durationMs:performance.now()-r,winnerId:l.winnerId})};u({type:"scope_start",workflowId:c,scopeId:n,scopeType:"race",name:a,ts:Date.now()});try{let d=await p();if(m(),!d.ok)throw s?.(d.error,a,y),M(d.error,{origin:"result",resultCause:d.cause});return d.value}catch(d){throw m(),d}})()},i.allSettled=(a,p)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),t=!1;P.push({scopeId:n,type:"allSettled"});let l=()=>{if(t)return;t=!0;let m=P.findIndex(d=>d.scopeId===n);m!==-1&&P.splice(m,1),u({type:"scope_end",workflowId:c,scopeId:n,ts:Date.now(),durationMs:performance.now()-r})};u({type:"scope_start",workflowId:c,scopeId:n,scopeType:"allSettled",name:a,ts:Date.now()});try{let m=await p();if(l(),!m.ok)throw s?.(m.error,a,y),M(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw l(),m}})()},i.if=(a,p,n)=>n(),i.label=i.if,i.branch=async(a,p)=>{let{condition:n,then:r,else:t}=p;if(n())return await r();if(t)return await t()},i.arm=(a,p)=>({fn:a,errors:p}),i.forEach=async(a,p,n)=>{let r=[],t=n.maxIterations,l=0,m="run"in n,d=Symbol.asyncIterator in p?p:(async function*(){yield*p})();for await(let T of d){if(t!==void 0&&l>=t)break;let k;m?k=await n.run(T,l):k=await n.item.handler(T,l,i),r.push(k),l++}return r},i.item=a=>({__forEachItemHandler:!0,handler:a}),i.dep=(a,p)=>p,i.run=(a,p,n)=>i(a,()=>p,n),i.workflow=(a,p,n)=>i(a,p,n),i.andThen=(a,p,n,r)=>i(a,()=>n(p),r),i.match=async(a,p,n,r)=>i(a,async()=>{let t=await p;return t.ok?V(await n.ok(t.value)):V(await n.err(t.error,t.cause))},r),i.all=i.parallel,i.map=async(a,p,n,r)=>{let t=r?.concurrency??p.length;return i(a,()=>t>=p.length?be(p.map((l,m)=>n(l,m))):(async()=>{let l=[];for(let m=0;m<p.length;m+=t){let d=p.slice(m,m+t),T=await be(d.map((k,x)=>n(k,m+x)));if(!T.ok)return T;l.push(...T.value)}return V(l)})(),{key:r?.key})},i.withFallback=(a,p,n)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let r=n.key??a,t=a,l=j(r),m=w;return(async()=>{let d=m?performance.now():0;w&&u({type:"step_start",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now()});let T;try{T=await p()}catch(S){if($(S))throw u({type:"step_aborted",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:performance.now()-d}),S;let I;try{I=K(S)}catch(A){throw te(A)}if(n.on!==void 0&&n.on!==I){let A=performance.now()-d;throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:A,error:I}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:A,result:F(I,{cause:S}),meta:{origin:"throw",thrown:S}}),s?.(I,t,y),M(I,{origin:"throw",thrown:S})}let C;try{C=await n.fallback()}catch(A){if($(A))throw u({type:"step_aborted",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:performance.now()-d}),A;let h;try{h=K(A)}catch(z){throw te(z)}let Z=performance.now()-d;throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:Z,error:h}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:Z,result:F(h,{cause:A}),meta:{origin:"throw",thrown:A}}),s?.(h,t,y),M(h,{origin:"throw",thrown:A})}if(C.ok){let A=performance.now()-d;return u({type:"step_success",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:A}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:A,result:C,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(I)}}),C.value}else{let A=performance.now()-d,h=q(C.error,{origin:"result",resultCause:C.cause});throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:A,error:h}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:A,result:C,meta:{origin:"result",resultCause:C.cause}}),s?.(h,t,y),M(h,{origin:"result",resultCause:C.cause})}}if(T.ok){let S=performance.now()-d;return u({type:"step_success",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:S}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:S,result:T}),T.value}let k=T.error;if(n.on!==void 0&&n.on!==k){let S=performance.now()-d,I=q(k,{origin:"result",resultCause:T.cause});throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:S,error:I}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:S,result:T,meta:{origin:"result",resultCause:T.cause}}),s?.(I,t,y),M(I,{origin:"result",resultCause:T.cause})}let x;try{x=await n.fallback()}catch(S){if($(S))throw u({type:"step_aborted",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:performance.now()-d}),S;let I;try{I=K(S)}catch(A){throw te(A)}let C=performance.now()-d;throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:C,error:I}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:C,result:F(I,{cause:S}),meta:{origin:"throw",thrown:S}}),s?.(I,t,y),M(I,{origin:"throw",thrown:S})}if(x.ok){let S=performance.now()-d;return u({type:"step_success",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:S}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:S,result:x,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(k)}}),x.value}let v=performance.now()-d,U=q(x.error,{origin:"result",resultCause:x.cause});throw u({type:"step_error",workflowId:c,stepId:l,stepKey:r,name:t,ts:Date.now(),durationMs:v,error:U}),r&&u({type:"step_complete",workflowId:c,stepKey:r,name:t,ts:Date.now(),durationMs:v,result:x,meta:{origin:"result",resultCause:x.cause}}),s?.(U,t,y),M(U,{origin:"result",resultCause:x.cause})})()},i.withResource=(a,p)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let n=a,r=a,t=j(n),l=w;return(async()=>{let m=l?performance.now():0;w&&u({type:"step_start",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now()});let d;try{d=await p.acquire()}catch(C){if($(C))throw u({type:"step_aborted",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now(),durationMs:performance.now()-m}),C;let A;try{A=K(C)}catch(Z){throw te(Z)}let h=performance.now()-m;throw u({type:"step_error",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now(),durationMs:h,error:A}),n&&u({type:"step_complete",workflowId:c,stepKey:n,name:r,ts:Date.now(),durationMs:h,result:F(A,{cause:C}),meta:{origin:"throw",thrown:C}}),s?.(A,r,y),M(A,{origin:"throw",thrown:C})}if(!d.ok){let C=performance.now()-m,A=q(d.error,{origin:"result",resultCause:d.cause});throw u({type:"step_error",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now(),durationMs:C,error:A}),n&&u({type:"step_complete",workflowId:c,stepKey:n,name:r,ts:Date.now(),durationMs:C,result:d,meta:{origin:"result",resultCause:d.cause}}),s?.(A,r,y),M(A,{origin:"result",resultCause:d.cause})}let T=d.value,k,x,v=!1;try{k=await p.use(T)}catch(C){if($(C)){try{await p.release(T)}catch(A){console.warn(`[awaitly] step.withResource("${a}"): release threw after earlyExit:`,A)}throw C}x=C,v=!0}try{await p.release(T)}catch(C){console.warn(`[awaitly] step.withResource("${a}"): release threw:`,C)}if(v){let C;try{C=K(x)}catch(h){throw te(h)}let A=performance.now()-m;throw u({type:"step_error",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now(),durationMs:A,error:C}),n&&u({type:"step_complete",workflowId:c,stepKey:n,name:r,ts:Date.now(),durationMs:A,result:F(C,{cause:x}),meta:{origin:"throw",thrown:x}}),s?.(C,r,y),M(C,{origin:"throw",thrown:x})}let U=k;if(U.ok){let C=performance.now()-m;return u({type:"step_success",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now(),durationMs:C}),n&&u({type:"step_complete",workflowId:c,stepKey:n,name:r,ts:Date.now(),durationMs:C,result:U}),U.value}let S=performance.now()-m,I=q(U.error,{origin:"result",resultCause:U.cause});throw u({type:"step_error",workflowId:c,stepId:t,stepKey:n,name:r,ts:Date.now(),durationMs:S,error:I}),n&&u({type:"step_complete",workflowId:c,stepKey:n,name:r,ts:Date.now(),durationMs:S,result:U,meta:{origin:"result",resultCause:U.cause}}),s?.(I,r,y),M(I,{origin:"result",resultCause:U.cause})})()};let B=await e({step:i});if(process.env.NODE_ENV!=="production"&&B!==null&&typeof B=="object"&&"ok"in B&&typeof B.ok=="boolean"){let a=B;(a.ok===!0&&"value"in a||a.ok===!1&&"error"in a)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
1
+ "use strict";var Ve=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var Ht=Object.getOwnPropertyNames;var Jt=Object.prototype.hasOwnProperty;var qt=(e,t)=>{for(var r in t)Ve(e,r,{get:t[r],enumerable:!0})},zt=(e,t,r,f)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of Ht(t))!Jt.call(e,l)&&l!==r&&Ve(e,l,{get:()=>t[l],enumerable:!(f=Lt(t,l))||f.enumerable});return e};var Yt=e=>zt(Ve({},"__esModule",{value:!0}),e);var dr={};qt(dr,{assertEventEmitted:()=>tt,assertEventNotEmitted:()=>Ft,assertEventSequence:()=>jt,compareSnapshots:()=>Dt,createMockFn:()=>_t,createSagaHarness:()=>Nt,createSnapshot:()=>Pt,createTestClock:()=>Mt,createWorkflowHarness:()=>et,errOutcome:()=>Wt,expectErr:()=>nt,expectOk:()=>rt,formatEvent:()=>at,formatEvents:()=>Vt,formatResult:()=>Bt,okOutcome:()=>It,testWorkflow:()=>Qe,throwOutcome:()=>Ut,unwrapErr:()=>st,unwrapErrAsync:()=>$t,unwrapOk:()=>ot,unwrapOkAsync:()=>Kt});module.exports=Yt(dr);var We=class extends Error{_tag};function ye(e,t){return class extends We{_tag=e;constructor(r,f){let l=t?.message?t.message(r??{}):e;if(super(l),this.name=e,Object.setPrototypeOf(this,new.target.prototype),r&&typeof r=="object"){let{_tag:y,name:A,message:S,stack:K,...i}=r,Y=Object.prototype.hasOwnProperty.call(i,"cause"),v=Y?i.cause:void 0;Y&&delete i.cause;let x=f?.cause!==void 0;if(Y&&x)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,i),Y&&(this.cause=v),x&&(this.cause=f?.cause)}else f?.cause!==void 0&&(this.cause=f.cause)}}}Object.defineProperty(ye,Symbol.hasInstance,{value:e=>e instanceof We});(l=>{function e(y){return y instanceof Error}l.isError=e;function t(y){return y instanceof We}l.isTaggedError=t;function r(y,A){let S=y._tag,K=A[S];return K(y)}l.match=r;function f(y,A,S){let K=y._tag,i=A[K];return i?i(y):S(y)}l.matchPartial=f})(ye||={});var ut=class extends ye("TimeoutError",{message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},lt=class extends ye("RetryExhaustedError",{message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},ct=class extends ye("RateLimitError",{message:t=>t.limiterName?`RateLimitError: Rate limit exceeded for ${t.limiterName}${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`}){},pt=class extends ye("CircuitBreakerOpenError",{message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},mt=class extends ye("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},dt=class extends ye("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},ft=class extends ye("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},Et=class extends ye("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},wt=class extends ye("CompensationError",{message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},Se=class extends ye("UnexpectedError",{message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function Gt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]),f=t[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[f]??1)}}function Fe(e){return new Se({cause:e})}function z(e){return{ok:!0,value:e}}function U(e,t){let r=t?.cause;return{ok:!1,error:e,...r!==void 0?{cause:r}:{}}}var Tt=e=>e.ok;var Rt=e=>e instanceof Se||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function Xt(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let r=t._tag.trim();if(r)return r}if(typeof t.tag=="string"){let r=t.tag.trim();if(r)return r}if(typeof t.code=="string"){let r=t.code.trim();if(r)return r}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let r=e.name.trim();if(r)return r}}return"unknown"}function Qt(e,t){if(!(!t||!e))return t[e]}function Je(e){let{intent:t,domain:r,owner:f,tags:l,stateChanges:y,emits:A,calls:S}=e;if(!t&&!r&&!f&&!l?.length&&!y?.length&&!A?.length&&!S?.length)return;let K={};return t&&(K.intent=t),r&&(K.domain=r),f&&(K.owner=f),l?.length&&(K.tags=l),y?.length&&(K.stateChanges=y),A?.length&&(K.emits=A),S?.length&&(K.calls=S),K}function ge(e,t,r,f,l){let y=Xt(e),A=Qt(y,t),S={tag:y,origin:r};return A!==void 0&&(S.classification=A),f!==void 0&&(S.attempt=f),l!==void 0&&(S.cumulativeDurationMs=l),S}var Oe=Symbol.for("step_timeout_marker");function yt(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Oe in e}function Zt(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(Oe in e)return e[Oe]}}var St=Symbol("early-exit");function _e(e,t){return{[St]:!0,error:e,meta:t}}function be(e){return typeof e=="object"&&e!==null&&e[St]===!0}var xt=Symbol("mapper-exception");function ve(e){return{[xt]:!0,thrown:e}}function er(e){return typeof e=="object"&&e!==null&&e[xt]===!0}function Le(e,t){let{backoff:r,initialDelay:f,maxDelay:l,jitter:y}=t,A;switch(r){case"fixed":A=f;break;case"linear":A=f*e;break;case"exponential":A=f*Math.pow(2,e-1);break}if(A=Math.min(A,l),y){let S=A*.25*Math.random();A=A+S}return Math.floor(A)}function He(e){return new Promise(t=>setTimeout(t,e))}var kt=Symbol("timeout"),Ne=Symbol("timeout-option");function tr(e){return typeof e=="object"&&e!==null&&e[Ne]===!0}async function rr(e,t,r,f){let l=new AbortController,y=t.onTimeout??"error",A=()=>typeof y=="function"?y({name:r.name,key:r.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:t.ms,attempt:r.attempt},S;f?.aborted&&l.abort(f.reason);let K;f&&!f.aborted&&(K=()=>l.abort(f.reason),f.addEventListener("abort",K,{once:!0}));let i=new Promise((v,x)=>{S=setTimeout(()=>{if(y!=="disconnect"&&l.abort(),y==="option"){x({[Ne]:!0,ms:t.ms});return}x({[kt]:!0,error:A()})},t.ms)}),Y;t.signal?Y=Promise.resolve(e(l.signal)):Y=Promise.resolve(e());try{return await Promise.race([Y,i])}catch(v){if(typeof v=="object"&&v!==null&&v[Ne]===!0)throw{[Ne]:!0,ms:t.ms};if(typeof v=="object"&&v!==null&&v[kt]===!0){y==="disconnect"&&Y.catch(()=>{});let x=v.error;if(typeof x=="object"&&x!==null&&x.type!=="STEP_TIMEOUT"){let G={timeoutMs:t.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};Oe in x?x[Oe]=G:Object.defineProperty(x,Oe,{value:G,enumerable:!1,writable:!0,configurable:!1})}throw x}throw v}finally{clearTimeout(S),K&&f&&f.removeEventListener("abort",K)}}var Ae={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function je(e,t){let{onError:r,onEvent:f,catchUnexpected:l,workflowId:y,workflowName:A,context:S,_workflowSignal:K}=t&&typeof t=="object"?t:{},i=y??crypto.randomUUID(),Y=l??Fe,v=[],x=0,G=p=>p??`step_${++x}`,d=p=>{let X=p.context!==void 0||S===void 0?p:{...p,context:S},se=A!==void 0&&X.workflowName===void 0?{...X,workflowName:A}:X;if(se.type==="step_success"){let we=se.stepId;for(let ie=v.length-1;ie>=0;ie--){let ue=v[ie];if(ue.type==="race"&&!ue.winnerId){ue.winnerId=we;break}}}f?.(se,S)},$=_e,P=p=>be(p),ce=(p,X)=>p,Ee=p=>typeof p=="function"?!1:!!(p&&typeof p=="object"&&"ok"in p||p&&typeof p=="object"&&"then"in p&&typeof p.then=="function");try{let X=function(c){let u={};for(let[o,s]of Object.entries(c))if(typeof s=="function")u[o]=s;else if(s&&typeof s=="object"&&"fn"in s)u[o]=s.fn;else throw new TypeError(`step.parallel: operation "${o}" must be a function or { fn, errors? } object`);return u},se=function(c,u){let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),n=!1;v.push({scopeId:o,type:"parallel"});let k=()=>{if(n)return;n=!0;let T=v.findIndex(m=>m.scopeId===o);T!==-1&&v.splice(T,1),d({type:"scope_end",workflowId:i,scopeId:o,ts:Date.now(),durationMs:performance.now()-s})};d({type:"scope_start",workflowId:i,scopeId:o,scopeType:"parallel",name:c,ts:Date.now()});try{let T=await u();if(k(),!T.ok)throw r?.(T.error,c,S),$(T.error,{origin:"result",resultCause:T.cause});return T.value}catch(T){throw k(),T}})()},we=function(c,u){let o=Object.keys(c),s=u.name??`Parallel(${o.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let k=performance.now(),T=!1;v.push({scopeId:n,type:"parallel"});let m=()=>{if(T)return;T=!0;let O=v.findIndex(D=>D.scopeId===n);O!==-1&&v.splice(O,1),d({type:"scope_end",workflowId:i,scopeId:n,ts:Date.now(),durationMs:performance.now()-k})};d({type:"scope_start",workflowId:i,scopeId:n,scopeType:"parallel",name:s,ts:Date.now()});try{let O=await new Promise(N=>{if(o.length===0){N([]);return}let J=!1,ee=o.length,M=new Array(o.length);for(let re=0;re<o.length;re++){let F=o[re],W=re;Promise.resolve(c[F]()).catch(V=>U({type:"PROMISE_REJECTED",cause:V},{cause:{type:"PROMISE_REJECTION",reason:V}})).then(V=>{if(!J){if(!V.ok){J=!0,N([{key:F,result:V}]);return}M[W]={key:F,result:V},ee--,ee===0&&N(M)}})}});m();let D={};for(let{key:N,result:J}of O){if(!J.ok)throw r?.(J.error,N,S),$(J.error,{origin:"result",resultCause:J.cause});D[N]=J.value}return D}catch(O){throw m(),O}})()};var ke=X,B=se,q=we;let p=(c,u,o)=>(async()=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let s=o??{},n=Je(s),k=c,T=s.key??c,m=s.key??c,{description:O,retry:D,timeout:N}=s,J=G(T),ee=f,M=ee?performance.now():0,F=Ee(u)?()=>u:u,V={attempts:Math.max(1,D?.attempts??1),backoff:D?.backoff??Ae.backoff,initialDelay:D?.initialDelay??Ae.initialDelay,maxDelay:D?.maxDelay??Ae.maxDelay,jitter:D?.jitter??Ae.jitter,retryOn:D?.retryOn??Ae.retryOn,onRetry:D?.onRetry??Ae.onRetry};f&&d({type:"step_start",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),...n&&{metadata:n}});let Te;for(let a=1;a<=V.attempts;a++){let Q=ee?performance.now():0;try{let R;if(N?R=await rr(F,N,{name:k,key:T,attempt:a},K):R=await F(),R.ok){let E=performance.now()-M;return d({type:"step_success",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),durationMs:E,...n&&{metadata:n}}),m&&d({type:"step_complete",workflowId:i,stepKey:m,name:k,description:O,ts:Date.now(),durationMs:E,result:R,...n&&{metadata:n}}),R.value}if(Te=R,a<V.attempts&&V.retryOn(R.error,a)){let E=Le(a,V);d({type:"step_retry",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),attempt:a+1,maxAttempts:V.attempts,delayMs:E,error:R.error,...n&&{metadata:n},diagnostics:ge(R.error,s.errorMeta,"result",a,performance.now()-M)}),V.onRetry(R.error,a,E),await He(E);continue}V.attempts>1&&d({type:"step_retries_exhausted",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),durationMs:performance.now()-M,attempts:a,lastError:R.error,...n&&{metadata:n},diagnostics:ge(R.error,s.errorMeta,"result",a,performance.now()-M)});break}catch(R){let E=performance.now()-Q;if(tr(R)){let h=R.ms;d({type:"step_timeout",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),timeoutMs:h,attempt:a,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"timeout",a)}),d({type:"step_success",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),durationMs:performance.now()-M,...n&&{metadata:n}}),m&&d({type:"step_complete",workflowId:i,stepKey:m,name:k,description:O,ts:Date.now(),durationMs:performance.now()-M,result:z(void 0),...n&&{metadata:n}});return}if(P(R))throw d({type:"step_aborted",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),durationMs:E,...n&&{metadata:n}}),R;if(yt(R)){let h=Zt(R),_=N?.ms??h?.timeoutMs??0;if(d({type:"step_timeout",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),timeoutMs:_,attempt:a,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"timeout",a)}),a<V.attempts&&V.retryOn(R,a)){let g=Le(a,V);d({type:"step_retry",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),attempt:a+1,maxAttempts:V.attempts,delayMs:g,error:R,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"timeout",a,performance.now()-M)}),V.onRetry(R,a,g),await He(g);continue}V.attempts>1&&d({type:"step_retries_exhausted",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),durationMs:performance.now()-M,attempts:a,lastError:R,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"timeout",a,performance.now()-M)});let j=performance.now()-M;throw d({type:"step_error",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),durationMs:j,error:R,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"timeout",a,j)}),m&&d({type:"step_complete",workflowId:i,stepKey:m,name:k,description:O,ts:Date.now(),durationMs:j,result:U(R,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),r?.(R,k,S),$(R,{origin:"throw",thrown:R})}if(a<V.attempts&&V.retryOn(R,a)){let h=Le(a,V);d({type:"step_retry",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),attempt:a+1,maxAttempts:V.attempts,delayMs:h,error:R,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"throw",a,performance.now()-M)}),V.onRetry(R,a,h),await He(h);continue}V.attempts>1&&!yt(R)&&d({type:"step_retries_exhausted",workflowId:i,stepId:J,stepKey:T,name:k,ts:Date.now(),durationMs:performance.now()-M,attempts:a,lastError:R,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"throw",a,performance.now()-M)});let C=performance.now()-M,b;try{b=Y(R)}catch(h){throw ve(h)}throw d({type:"step_error",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),durationMs:C,error:b,...n&&{metadata:n},diagnostics:ge(R,s.errorMeta,"throw",a,C)}),m&&d({type:"step_complete",workflowId:i,stepKey:m,name:k,description:O,ts:Date.now(),durationMs:C,result:U(b,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),r?.(b,k,S),$(b,{origin:"throw",thrown:R})}}let le=Te,xe=performance.now()-M,w=ce(le.error,{origin:"result",resultCause:le.cause});throw d({type:"step_error",workflowId:i,stepId:J,stepKey:T,name:k,description:O,ts:Date.now(),durationMs:xe,error:w,...n&&{metadata:n},diagnostics:ge(le.error,s.errorMeta,"result",V.attempts,xe)}),m&&d({type:"step_complete",workflowId:i,stepKey:m,name:k,description:O,ts:Date.now(),durationMs:xe,result:le,meta:{origin:"result",resultCause:le.cause},...n&&{metadata:n}}),r?.(w,k,S),$(w,{origin:"result",resultCause:le.cause})})();p.try=(c,u,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let s=o.key??c,n=c,k=c,T="error"in o?()=>o.error:o.onError,m=f;return(async()=>{let O=m?performance.now():0;f&&d({type:"step_start",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now()});try{let D=await u(),N=performance.now()-O;return d({type:"step_success",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:N}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:N,result:z(D)}),D}catch(D){let N=T(D),J=performance.now()-O,ee=ce(N,{origin:"throw",thrown:D});throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:J,error:ee}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:J,result:U(N,{cause:D}),meta:{origin:"throw",thrown:D}}),r?.(ee,n,S),$(ee,{origin:"throw",thrown:D})}})()},p.fromResult=(c,u,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let s=o.key??c,n=c,k=c,T="error"in o?()=>o.error:o.onError,m=f;return(async()=>{let O=m?performance.now():0;f&&d({type:"step_start",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now()});let D=await u();if(D.ok){let N=performance.now()-O;return d({type:"step_success",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:N}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:N,result:z(D.value)}),D.value}else{let N=T(D.error),J=performance.now()-O,ee=ce(N,{origin:"result",resultCause:D.error});throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:J,error:ee}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:J,result:U(N,{cause:D.error}),meta:{origin:"result",resultCause:D.error}}),r?.(ee,n,S),$(ee,{origin:"result",resultCause:D.error})}})()},p.fromNullable=(c,u,o,s)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return p(c,async()=>{let n=await u();return n!=null?z(n):U(o())},s)},p.retry=(c,u,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return p(c,u,{key:o.key??c,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,retryOn:o.retryOn,onRetry:o.onRetry},timeout:o.timeout})},p.withTimeout=(c,u,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return p(c,u,{key:o.key??c,timeout:o})},p.sleep=(c,u,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let s=typeof u=="string"?Gt(u):u;if(!s)throw new Error(`step.sleep: invalid duration '${u}'`);let n=s.millis,k=o?.signal;return p(c,async()=>{if(K?.aborted||k?.aborted){let T=new Error("Sleep aborted");throw T.name="AbortError",T}return new Promise((T,m)=>{let O={timeoutId:void 0},D=()=>{O.timeoutId&&clearTimeout(O.timeoutId);let N=new Error("Sleep aborted");N.name="AbortError",m(N)};K?.addEventListener("abort",D,{once:!0}),k?.addEventListener("abort",D,{once:!0}),O.timeoutId=setTimeout(()=>{K?.removeEventListener("abort",D),k?.removeEventListener("abort",D),T(z(void 0))},n)})},{key:o?.key??c,description:o?.description})},p.parallel=((...c)=>{if(typeof c[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let u=c[0],o=c[1];if(typeof o=="function")return se(u,o);if(o&&typeof o=="object"&&!Array.isArray(o)){let n=X(o);return we(n,{name:u})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),p.race=(c,u)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),n=!1,k={scopeId:o,type:"race",winnerId:void 0};v.push(k);let T=()=>{if(n)return;n=!0;let m=v.findIndex(O=>O.scopeId===o);m!==-1&&v.splice(m,1),d({type:"scope_end",workflowId:i,scopeId:o,ts:Date.now(),durationMs:performance.now()-s,winnerId:k.winnerId})};d({type:"scope_start",workflowId:i,scopeId:o,scopeType:"race",name:c,ts:Date.now()});try{let m=await u();if(T(),!m.ok)throw r?.(m.error,c,S),$(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw T(),m}})()},p.allSettled=(c,u)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),n=!1;v.push({scopeId:o,type:"allSettled"});let k=()=>{if(n)return;n=!0;let T=v.findIndex(m=>m.scopeId===o);T!==-1&&v.splice(T,1),d({type:"scope_end",workflowId:i,scopeId:o,ts:Date.now(),durationMs:performance.now()-s})};d({type:"scope_start",workflowId:i,scopeId:o,scopeType:"allSettled",name:c,ts:Date.now()});try{let T=await u();if(k(),!T.ok)throw r?.(T.error,c,S),$(T.error,{origin:"result",resultCause:T.cause});return T.value}catch(T){throw k(),T}})()},p.if=(c,u,o)=>o(),p.label=p.if,p.branch=async(c,u)=>{let{condition:o,then:s,else:n}=u;if(o())return await s();if(n)return await n()},p.arm=(c,u)=>({fn:c,errors:u}),p.forEach=async(c,u,o)=>{let s=[],n=o.maxIterations,k=0,T="run"in o,m=Symbol.asyncIterator in u?u:(async function*(){yield*u})();for await(let O of m){if(n!==void 0&&k>=n)break;let D;T?D=await o.run(O,k):D=await o.item.handler(O,k,p),s.push(D),k++}return s},p.item=c=>({__forEachItemHandler:!0,handler:c}),p.dep=(c,u)=>u,p.run=(c,u,o)=>p(c,()=>u,o),p.workflow=(c,u,o)=>p(c,u,o),p.andThen=(c,u,o,s)=>p(c,()=>o(u),s),p.match=async(c,u,o,s)=>p(c,async()=>{let n=await u;return n.ok?z(await o.ok(n.value)):z(await o.err(n.error,n.cause))},s),p.all=p.parallel,p.map=async(c,u,o,s)=>{let n=s?.concurrency??u.length;return p(c,()=>n>=u.length?gt(u.map((k,T)=>o(k,T))):(async()=>{let k=[];for(let T=0;T<u.length;T+=n){let m=u.slice(T,T+n),O=await gt(m.map((D,N)=>o(D,T+N)));if(!O.ok)return O;k.push(...O.value)}return z(k)})(),{key:s?.key})},p.withFallback=(c,u,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let s=o.key??c,n=c,k=G(s),T=f;return(async()=>{let m=T?performance.now():0;f&&d({type:"step_start",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now()});let O;try{O=await u()}catch(M){if(P(M))throw d({type:"step_aborted",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:performance.now()-m}),M;let re;try{re=Y(M)}catch(W){throw ve(W)}if(o.on!==void 0&&o.on!==re){let W=performance.now()-m;throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:W,error:re}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:W,result:U(re,{cause:M}),meta:{origin:"throw",thrown:M}}),r?.(re,n,S),$(re,{origin:"throw",thrown:M})}let F;try{F=await o.fallback()}catch(W){if(P(W))throw d({type:"step_aborted",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:performance.now()-m}),W;let V;try{V=Y(W)}catch(le){throw ve(le)}let Te=performance.now()-m;throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:Te,error:V}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:Te,result:U(V,{cause:W}),meta:{origin:"throw",thrown:W}}),r?.(V,n,S),$(V,{origin:"throw",thrown:W})}if(F.ok){let W=performance.now()-m;return d({type:"step_success",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:W}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:W,result:F,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(re)}}),F.value}else{let W=performance.now()-m,V=ce(F.error,{origin:"result",resultCause:F.cause});throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:W,error:V}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:W,result:F,meta:{origin:"result",resultCause:F.cause}}),r?.(V,n,S),$(V,{origin:"result",resultCause:F.cause})}}if(O.ok){let M=performance.now()-m;return d({type:"step_success",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:M}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:M,result:O}),O.value}let D=O.error;if(o.on!==void 0&&o.on!==D){let M=performance.now()-m,re=ce(D,{origin:"result",resultCause:O.cause});throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:M,error:re}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:M,result:O,meta:{origin:"result",resultCause:O.cause}}),r?.(re,n,S),$(re,{origin:"result",resultCause:O.cause})}let N;try{N=await o.fallback()}catch(M){if(P(M))throw d({type:"step_aborted",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:performance.now()-m}),M;let re;try{re=Y(M)}catch(W){throw ve(W)}let F=performance.now()-m;throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:F,error:re}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:F,result:U(re,{cause:M}),meta:{origin:"throw",thrown:M}}),r?.(re,n,S),$(re,{origin:"throw",thrown:M})}if(N.ok){let M=performance.now()-m;return d({type:"step_success",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:M}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:M,result:N,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(D)}}),N.value}let J=performance.now()-m,ee=ce(N.error,{origin:"result",resultCause:N.cause});throw d({type:"step_error",workflowId:i,stepId:k,stepKey:s,name:n,ts:Date.now(),durationMs:J,error:ee}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:n,ts:Date.now(),durationMs:J,result:N,meta:{origin:"result",resultCause:N.cause}}),r?.(ee,n,S),$(ee,{origin:"result",resultCause:N.cause})})()},p.withResource=(c,u)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let o=c,s=c,n=G(o),k=f;return(async()=>{let T=k?performance.now():0;f&&d({type:"step_start",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now()});let m;try{m=await u.acquire()}catch(F){if(P(F))throw d({type:"step_aborted",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:performance.now()-T}),F;let W;try{W=Y(F)}catch(Te){throw ve(Te)}let V=performance.now()-T;throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:V,error:W}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:s,ts:Date.now(),durationMs:V,result:U(W,{cause:F}),meta:{origin:"throw",thrown:F}}),r?.(W,s,S),$(W,{origin:"throw",thrown:F})}if(!m.ok){let F=performance.now()-T,W=ce(m.error,{origin:"result",resultCause:m.cause});throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:F,error:W}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:s,ts:Date.now(),durationMs:F,result:m,meta:{origin:"result",resultCause:m.cause}}),r?.(W,s,S),$(W,{origin:"result",resultCause:m.cause})}let O=m.value,D,N,J=!1;try{D=await u.use(O)}catch(F){if(P(F)){try{await u.release(O)}catch(W){console.warn(`[awaitly] step.withResource("${c}"): release threw after earlyExit:`,W)}throw F}N=F,J=!0}try{await u.release(O)}catch(F){console.warn(`[awaitly] step.withResource("${c}"): release threw:`,F)}if(J){let F;try{F=Y(N)}catch(V){throw ve(V)}let W=performance.now()-T;throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:W,error:F}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:s,ts:Date.now(),durationMs:W,result:U(F,{cause:N}),meta:{origin:"throw",thrown:N}}),r?.(F,s,S),$(F,{origin:"throw",thrown:N})}let ee=D;if(ee.ok){let F=performance.now()-T;return d({type:"step_success",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:F}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:s,ts:Date.now(),durationMs:F,result:ee}),ee.value}let M=performance.now()-T,re=ce(ee.error,{origin:"result",resultCause:ee.cause});throw d({type:"step_error",workflowId:i,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:M,error:re}),o&&d({type:"step_complete",workflowId:i,stepKey:o,name:s,ts:Date.now(),durationMs:M,result:ee,meta:{origin:"result",resultCause:ee.cause}}),r?.(re,s,S),$(re,{origin:"result",resultCause:ee.cause})})()};let ue=await e({step:p});if(process.env.NODE_ENV!=="production"&&ue!==null&&typeof ue=="object"&&"ok"in ue&&typeof ue.ok=="boolean"){let c=ue;(c.ok===!0&&"value"in c||c.ok===!1&&"error"in c)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
2
2
 
3
3
  Incorrect: return ok({ data });
4
4
  Correct: return { data };
5
5
 
6
- See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return V(B)}catch(i){if(it(i))throw i.thrown;if($(i)){let W=i.meta.origin==="throw"?i.meta.thrown:i.meta.origin==="result"?i.meta.resultCause:void 0;return F(i.error,{cause:W})}let N=K(i);return s?.(N,"unexpected",y),F(N,{cause:i})}}he.strict=(e,o)=>he(e,o);async function be(e){return e.length===0?V([]):new Promise(o=>{let s=!1,w=e.length,E=new Array(e.length);for(let f=0;f<e.length;f++){let R=f;Promise.resolve(e[R]).catch(y=>F({type:"PROMISE_REJECTED",cause:y},{cause:{type:"PROMISE_REJECTION",reason:y}})).then(y=>{if(!s){if(!y.ok){s=!0,o(y);return}E[R]=y.value,w--,w===0&&o(V(E))}})}})}function de(e){return typeof e=="object"&&e!==null&&"__earlyExit"in e&&e.__earlyExit===!0}function ye(e,o={}){let{recordInvocations:s=!0,clock:w=Date.now}=o,E=[],f=new Map,R=0,y=[];function O(b){E=[...b],R=0,f.clear()}function c(b,D){f.set(b,D)}function K(b){if(b&&f.has(b))return f.get(b);if(R<E.length)return E[R++]}function P(){let b=async(D,i,N)=>{let W,H,L;typeof D=="string"?(W=D,H=i,L=N??{}):(H=D,typeof i=="string"?(W=i,L={}):(L=i??{},W=L.key??"step"));let B=w(),a={name:W,key:L.key,order:y.length,timestamp:B};s&&y.push(a);let p=K(W);if(p)switch(a.durationMs=w()-B,p.type){case"ok":return a.result=V(p.value),p.value;case"err":throw a.result=F(p.error),{__earlyExit:!0,error:p.error};case"throw":throw p.error}let n=typeof H=="function"?await H():await H;if(a.durationMs=w()-B,a.result=n,!n.ok)throw{__earlyExit:!0,error:n.error};return n.value};return b.try=async(D,i,N)=>{let W,H,L;typeof D=="string"?(W=D,H=i,L=N):(H=D,L=i,W=L.key??"step");let B=w(),a={name:W,key:"key"in L?L.key:void 0,order:y.length,timestamp:B};s&&y.push(a);let p=K(W);if(p)switch(a.durationMs=w()-B,p.type){case"ok":return a.result=V(p.value),p.value;case"err":throw a.result=F(p.error),{__earlyExit:!0,error:p.error};case"throw":throw p.error}try{let n=await H();return a.durationMs=w()-B,a.result=V(n),n}catch(n){a.durationMs=w()-B;let r="error"in L?L.error:L.onError(n);throw a.result=F(r),{__earlyExit:!0,error:r}}},b}async function J(b){let D=P();try{let i=await b({step:D,deps:e});return V(i)}catch(i){return de(i)?F(i.error):F({type:"UNEXPECTED_ERROR",cause:i})}}async function j(b,D){let i=P();try{let N=await D({step:i,deps:e,input:b});return V(N)}catch(N){return de(N)?F(N.error):F({type:"UNEXPECTED_ERROR",cause:N})}}function u(){return[...y]}function M(b){let D=y.map(N=>N.name??N.key??"unnamed").filter(N=>N!=="unnamed"),i=JSON.stringify(D)===JSON.stringify(b);return{passed:i,message:i?`Steps invoked in order: ${b.join(", ")}`:`Expected steps [${b.join(", ")}] but got [${D.join(", ")}]`,expected:b,actual:D}}function $(b){let D=y.some(i=>i.name===b||i.key===b);return{passed:D,message:D?`Step "${b}" was invoked`:`Step "${b}" was NOT invoked`,expected:b,actual:D}}function q(b){let D=y.some(i=>i.name===b||i.key===b);return{passed:!D,message:D?`Step "${b}" was invoked but should not have been`:`Step "${b}" was correctly NOT invoked`,expected:"not called",actual:D?"called":"not called"}}function X(b,D){let i=b.ok===D.ok&&(b.ok?JSON.stringify(b.value)===JSON.stringify(D.value):JSON.stringify(b.error)===JSON.stringify(D.error));return{passed:i,message:i?"Result matches expected":"Result does not match expected",expected:D,actual:b}}function ee(){E=[],f.clear(),R=0,y=[]}return{script:O,scriptStep:c,run:J,runWithInput:j,getInvocations:u,assertSteps:M,assertStepCalled:$,assertStepNotCalled:q,assertResult:X,reset:ee}}function Pe(){let e,o=[],s=[],w=((...E)=>{if(s.push(E),o.length>0)return Promise.resolve(o.shift());if(e)return Promise.resolve(e);throw new Error("Mock function called without configured return value")});return w.returns=E=>(e=E,w),w.returnsOnce=E=>(o.push(E),w),w.getCalls=()=>[...s],w.getCallCount=()=>s.length,w.reset=()=>{e=void 0,o.length=0,s.length=0},w}function _e(e,o,s){let w=e.reduce((E,f)=>E+(f.durationMs??0),0);return{invocations:e.map(E=>({...E,timestamp:0})),result:o,events:s?.map(E=>({...E,ts:0})),durationMs:w}}function Me(e,o){let s=[];e.invocations.length!==o.invocations.length&&s.push(`Invocation count: ${e.invocations.length} vs ${o.invocations.length}`);let w=Math.max(e.invocations.length,o.invocations.length);for(let E=0;E<w;E++){let f=e.invocations[E],R=o.invocations[E];if(!f){s.push(`Step ${E}: missing in first snapshot`);continue}if(!R){s.push(`Step ${E}: missing in second snapshot`);continue}f.name!==R.name&&s.push(`Step ${E} name: "${f.name}" vs "${R.name}"`),f.key!==R.key&&s.push(`Step ${E} key: "${f.key}" vs "${R.key}"`),f.result?.ok!==R.result?.ok&&s.push(`Step ${E} result: ${f.result?.ok?"ok":"err"} vs ${R.result?.ok?"ok":"err"}`)}return e.result.ok!==o.result.ok&&s.push(`Final result: ${e.result.ok?"ok":"err"} vs ${o.result.ok?"ok":"err"}`),{equal:s.length===0,differences:s}}function De(e=0){let o=e;return{now:()=>o,advance:s=>{o+=s},set:s=>{o=s},reset:()=>{o=e}}}function Ie(e){return{type:"ok",value:e}}function Ue(e){return{type:"err",error:e}}function Ne(e){return{type:"throw",error:e}}function je(e,o={}){let{clock:s=Date.now}=o,w=ye(e,o),E=[],f=[];async function R(j){E=[],f=[];let u={step:async($,q)=>{try{let X=await w.run(async({step:ee})=>ee("saga-step",$));if(!X.ok)throw await M(),{__earlyExit:!0,error:X.error};return q?.compensate&&f.push({value:X.value,compensate:q.compensate}),X.value}catch(X){throw f.length>0&&await M(),X}}};async function M(){let $=[...f].reverse();f=[];for(let{name:q,value:X,compensate:ee}of $)try{await ee(X),E.push({stepName:q,order:E.length,value:X,timestamp:s()})}catch(b){console.error(`Compensation failed for step "${q}":`,b)}}try{let $=await j({saga:u,deps:e});return V($)}catch($){return de($)?F($.error):(await M(),F({type:"UNEXPECTED_ERROR",cause:$}))}}function y(){return[...E]}function O(j){let u=E.map($=>$.stepName),M=JSON.stringify(u)===JSON.stringify(j);return{passed:M,message:M?`Compensations ran in order: ${j.join(" \u2192 ")}`:`Expected compensations [${j.join(" \u2192 ")}] but got [${u.join(" \u2192 ")}]`,expected:j,actual:u}}function c(j){let u=E.some(M=>M.stepName===j);return{passed:u,message:u?`Step "${j}" was compensated`:`Step "${j}" was NOT compensated`,expected:j,actual:u}}function K(j){let u=E.some(M=>M.stepName===j);return{passed:!u,message:u?`Step "${j}" was compensated but should not have been`:`Step "${j}" was correctly NOT compensated`,expected:"not compensated",actual:u?"compensated":"not compensated"}}let P=w.reset;function J(){P(),E=[],f=[]}return{...w,reset:J,getCompensations:y,assertCompensationOrder:O,assertCompensated:c,assertNotCompensated:K,runSaga:R}}function Fe(e,o,s={}){let{strict:w=!0}=s,E=o.map(O=>{let[c,K]=O.split(":");return{type:c,name:K}}),R=(w?e:e.filter(O=>E.some(c=>O.type===c.type))).map(O=>{let c="name"in O?O.name:void 0,K="stepKey"in O?O.stepKey:void 0,P=c??K;return P?`${O.type}:${P}`:O.type}),y=JSON.stringify(R)===JSON.stringify(o);return{passed:y,message:y?`Event sequence matches: ${o.join(" \u2192 ")}`:`Event sequence mismatch.
7
- Expected: ${o.join(" \u2192 ")}
8
- Actual: ${R.join(" \u2192 ")}`,expected:o,actual:R}}function fe(e,o){let s=e.find(w=>Object.entries(o).every(([E,f])=>{let R=w[E];return typeof f=="object"&&f!==null?JSON.stringify(R)===JSON.stringify(f):R===f}));return{passed:!!s,message:s?`Event matching ${JSON.stringify(o)} was emitted`:`No event matching ${JSON.stringify(o)} was found`,expected:o,actual:s??"not found"}}function Ke(e,o){let s=fe(e,o);return{passed:!s.passed,message:s.passed?`Event matching ${JSON.stringify(o)} was found but should not have been`:`Correctly, no event matching ${JSON.stringify(o)} was emitted`,expected:"not emitted",actual:s.actual}}function Te(e){if(!e.ok)throw new Error(`Expected Ok result, got Err: ${JSON.stringify(e.error,null,2)}`)}function ke(e){if(e.ok)throw new Error(`Expected Err result, got Ok: ${JSON.stringify(e.value,null,2)}`)}function ge(e){return Te(e),e.value}function Re(e){return ke(e),e.error}async function $e(e){return ge(await e)}async function We(e){return Re(await e)}function Le(e){return Ae(e)?`Ok(${oe(e.value)})`:`Err(${oe(e.error)})`}function oe(e){if(e===null)return"null";if(e===void 0)return"undefined";if(typeof e=="string")return`'${e}'`;if(typeof e=="number"||typeof e=="boolean")return String(e);if(typeof e=="function")return`[Function: ${e.name||"anonymous"}]`;if(Array.isArray(e))return e.length===0?"[]":e.length<=3?`[${e.map(oe).join(", ")}]`:`[${e.slice(0,3).map(oe).join(", ")}, ... (${e.length} items)]`;if(typeof e=="object"){let o=e,s=Object.keys(o);return s.length===0?"{}":s.length<=4?`{ ${s.map(f=>`${f}: ${oe(o[f])}`).join(", ")} }`:`{ ${s.slice(0,3).map(E=>`${E}: ${oe(o[E])}`).join(", ")}, ... (${s.length} keys) }`}return String(e)}function xe(e){let o=e.type,s="name"in e?e.name:void 0,w="stepKey"in e?e.stepKey:void 0,E=s??w;return E?`${o}:${E}`:o}function Be(e){return e.map(xe).join(" \u2192 ")}0&&(module.exports={assertEventEmitted,assertEventNotEmitted,assertEventSequence,compareSnapshots,createMockFn,createSagaHarness,createSnapshot,createTestClock,createWorkflowHarness,errOutcome,expectErr,expectOk,formatEvent,formatEvents,formatResult,okOutcome,throwOutcome,unwrapErr,unwrapErrAsync,unwrapOk,unwrapOkAsync});
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return z(ue)}catch(p){if(er(p))throw p.thrown;if(P(p)){let se=p.meta.origin==="throw"?p.meta.thrown:p.meta.origin==="result"?p.meta.resultCause:void 0;return U(p.error,{cause:se})}let X=Y(p);return r?.(X,"unexpected",S),U(X,{cause:p})}}je.strict=(e,t)=>je(e,t);async function gt(e){return e.length===0?z([]):new Promise(t=>{let r=!1,f=e.length,l=new Array(e.length);for(let y=0;y<e.length;y++){let A=y;Promise.resolve(e[A]).catch(S=>U({type:"PROMISE_REJECTED",cause:S},{cause:{type:"PROMISE_REJECTION",reason:S}})).then(S=>{if(!r){if(!S.ok){r=!0,t(S);return}l[A]=S.value,f--,f===0&&t(z(l))}})}})}function ht(e){return e.type==="step_complete"}function qe(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var Ke=class extends Error{constructor(r,f,l){super(r);this.stepId=f;this.originalError=l;this.name="SnapshotDecodeError"}};function ze(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=ze(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function nr(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Ce(e,t,r){return U(e,{cause:{__cachedMeta:!0,originalCause:r,meta:t}})}function Ue(e){return nr(e)?e.meta:{origin:"result",resultCause:e}}function Ct(){let e=new Map;return{handleEvent:t=>{ht(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var or="STREAM_WRITE_ERROR",sr="STREAM_READ_ERROR",ar="STREAM_CLOSE_ERROR";var ir="STREAM_ENDED";function $e(e,t,r){return{type:or,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function Ye(e,t,r){return{type:sr,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function Ge(e,t,r){return{type:ar,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function Be(e){return{type:ir,finalPosition:e}}function bt(e={}){let t=e.highWaterMark??16,r=e.lowWaterMark??Math.floor(t/2),f=e.onStateChange,l="flowing",y=0,A=[];function S(i){if(l!==i&&(l=i,f?.(i),i==="flowing"&&A.length>0)){let Y=A;A=[];for(let v of Y)v()}}function K(){l==="flowing"&&y>=t?S("paused"):l==="paused"&&y<=r&&S("flowing")}return{get state(){return l},get bufferedCount(){return y},get highWaterMark(){return t},get lowWaterMark(){return r},increment(){y++,K()},decrement(){y>0&&(y--,K())},setCount(i){y=Math.max(0,i),K()},waitForDrain(){return l==="flowing"?Promise.resolve():new Promise(i=>{A.push(i)})},reset(){y=0,A=[],S("flowing")}}}function ur(e){return{_tag:"Duration",millis:e}}function lr(e){return{_tag:"Duration",millis:e*1e3}}function cr(e){return{_tag:"Duration",millis:e*60*1e3}}function pr(e){return{_tag:"Duration",millis:e*60*60*1e3}}function mr(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function vt(e){return e.millis}function At(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return ur(r);case"s":return lr(r);case"m":return cr(r);case"h":return pr(r);case"d":return mr(r);default:return}}async function Ot(e,t){let r=e["~standard"].validate(t),f=r instanceof Promise?await r:r;return f.issues?U({type:"INPUT_VALIDATION_ERROR",issues:f.issues.map(l=>({message:l.message,path:l.path?.map(y=>typeof y=="object"?y.key:y)})),message:`Input validation failed: ${f.issues.map(l=>l.message).join(", ")}`}):z(f.value)}function Xe(e,t,r){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let f=t??{},l=r;async function y(i,Y,v){let x=i??crypto.randomUUID(),G=v?.deps?{...f,...v.deps}:f,d=v?.createContext??l?.createContext,$=d?await d():void 0,P=v?.signal??l?.signal,ce=v?.onEvent??l?.onEvent,Ee=v?.onError??l?.onError,ke=v?.shouldRun??l?.shouldRun,B=v?.onBeforeStart??l?.onBeforeStart,q=v?.onAfterStep??l?.onAfterStep,p=v?.resumeState??l?.resumeState,X=l?.catchUnexpected??Fe,se={},we=(v?.devWarnings??l?.devWarnings)===!0&&process.env.NODE_ENV!=="production",ie=new Set,ue=new Set,c={workflowId:x,onEvent:ce,context:$!==void 0?$:void 0,signal:P,input:{},ref:w=>se[w],set:(w,a)=>{we&&!ie.has(w)&&(ie.add(w),console.warn(`awaitly: ctx.set('${w}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${w}' }) instead.`)),se[w]=a},get:w=>(we&&!ue.has(w)&&(ue.add(w),console.warn(`awaitly: ctx.get('${w}') is deprecated for static analysis. Use ctx.ref('${w}') instead for tracked dependencies.`)),se[w])},u=w=>{let a=w.context!==void 0||$===void 0?w:{...w,context:$},Q=a.workflowName===void 0?{...a,workflowName:e}:a;ce?.(Q,$)},o=(w,a)=>{let Q={type:"WORKFLOW_CANCELLED",reason:w,lastStepKey:a};return U(X(Q),{cause:Q})};if(P?.aborted){let w=typeof P.reason=="string"?P.reason:P.reason instanceof Error?P.reason.message:void 0;return u({type:"workflow_cancelled",workflowId:x,ts:Date.now(),durationMs:0,reason:w}),o(w)}if(ke){let w=performance.now();try{let a=await ke(x,$),Q=performance.now()-w;if(u({type:"hook_should_run",workflowId:x,ts:Date.now(),durationMs:Q,result:a,skipped:!a}),!a){let R=new Error("Workflow skipped by shouldRun hook");return U(X(R),{cause:R})}}catch(a){let Q=performance.now()-w;return u({type:"hook_should_run_error",workflowId:x,ts:Date.now(),durationMs:Q,error:a}),U(X(a),{cause:a})}}if(B){let w=performance.now();try{let a=await B(x,$),Q=performance.now()-w;if(u({type:"hook_before_start",workflowId:x,ts:Date.now(),durationMs:Q,result:a,skipped:!a}),!a){let R=new Error("Workflow skipped by onBeforeStart hook");return U(X(R),{cause:R})}}catch(a){let Q=performance.now()-w;return u({type:"hook_before_start_error",workflowId:x,ts:Date.now(),durationMs:Q,error:a}),U(X(a),{cause:a})}}let s=l?.inputSchema,n=l?.input;if(s&&n!==void 0){let w=await Ot(s,n);if(!w.ok)return U(w.error);c.input=w.value}else n!==void 0&&(c.input=n);let k=Date.now(),T=performance.now();u({type:"workflow_start",workflowId:x,ts:k});let m=v?.cache??l?.cache,O=v?.streamStore??l?.streamStore;if(p&&!m&&(m=new Map),p&&m){let w=typeof p=="function"?await p():p;w.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof w.steps}). This usually happens when state is serialized with JSON.stringify() directly.
7
+ Use stringifyState() and parseState() from 'awaitly/persistence' instead:
8
+ import { stringifyState, parseState } from 'awaitly/persistence';
9
+ const json = stringifyState(state); // Save this
10
+ const restored = parseState(json); // Load this`),typeof w.steps=="object"&&w.steps!==null&&(w.steps=new Map(Object.entries(w.steps))));for(let[a,Q]of w.steps){let{result:R,meta:E}=Q;if(R.ok)m.set(a,R);else{let C=E??{origin:"result",resultCause:R.cause};m.set(a,Ce(R.error,C,R.cause))}}}let D=v?.snapshot??l?.snapshot,N=l?.serialization;if(D&&!p){m||(m=new Map);let w=D,a=N?.decode;for(let[Q,R]of Object.entries(w.steps))if(Object.prototype.hasOwnProperty.call(w.steps,Q))try{if(R.ok){let E=a?a(R.value):R.value;m.set(Q,z(E))}else{let E=a?a(R.error):R.error,C=ze(R.cause),b=R.meta?.origin==="throw"?{origin:"throw",thrown:C}:{origin:"result",resultCause:C};m.set(Q,Ce(E,b,C))}}catch(E){throw new Ke(`Failed to decode step "${Q}": ${E instanceof Error?E.message:String(E)}`,Q,E instanceof Error?E:void 0)}}let J=!1,ee,M,re=()=>{J=!0,ee=typeof P?.reason=="string"?P.reason:P?.reason instanceof Error?P.reason.message:void 0};P&&!P.aborted&&P.addEventListener("abort",re,{once:!0});let F=()=>{if(J||P?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:ee??(typeof P?.reason=="string"?P.reason:P?.reason instanceof Error?P.reason.message:void 0),lastStepKey:M}},W=async(w,a,Q)=>{if(!q)return;let R=performance.now();try{await q(w,a,x,$);let E=performance.now()-R;u({type:"hook_after_step",workflowId:x,stepKey:w,ts:Date.now(),durationMs:E})}catch(E){let C=performance.now()-R;throw u({type:"hook_after_step_error",workflowId:x,stepKey:w,ts:Date.now(),durationMs:C,error:E}),E}},V=w=>{let a=async(E,C,b)=>{if(typeof E!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let h=E,_=b??{},j=h,g=Object.prototype.hasOwnProperty.call(_,"key")?_.key:h,{ttl:L,out:ne}=_;F();let te=Je(_);if(g&&m&&m.has(g)){u({type:"step_cache_hit",workflowId:x,stepKey:g,name:j,ts:Date.now(),...te&&{metadata:te}});let I=m.get(g);if(I.ok)return M=g,ne&&(se[ne]=I.value),I.value;let H=Ue(I.cause);throw _e(I.error,H)}g&&m&&u({type:"step_cache_miss",workflowId:x,stepKey:g,name:j,ts:Date.now(),...te&&{metadata:te}});try{let I=await w(h,C,_);return ne&&(se[ne]=I),g&&(M=g,m&&m.set(g,z(I),L?{ttl:L}:void 0),await W(g,z(I))),I}catch(I){if(g&&be(I)){let H=I,pe=H.meta.origin==="result"?H.meta.resultCause:H.meta.origin==="throw"?H.meta.thrown:void 0,Z=Ce(H.error,H.meta,pe);m&&m.set(g,Z,L?{ttl:L}:void 0),await W(g,Z,H.meta)}throw I}};a.try=async(E,C,b)=>{let{ttl:h}=b,_=b.key??E,j=E;if(m&&m.has(_)){u({type:"step_cache_hit",workflowId:x,stepKey:_,name:j,ts:Date.now()});let g=m.get(_);if(g.ok)return g.value;let L=Ue(g.cause);throw _e(g.error,L)}m&&u({type:"step_cache_miss",workflowId:x,stepKey:_,name:j,ts:Date.now()});try{let g=await w.try(E,C,{...b,key:_});return m&&m.set(_,z(g),h?{ttl:h}:void 0),await W(_,z(g)),g}catch(g){if(be(g)){let L=g,ne=L.meta.origin==="result"?L.meta.resultCause:L.meta.origin==="throw"?L.meta.thrown:void 0,te=Ce(L.error,L.meta,ne);m&&m.set(_,te,h?{ttl:h}:void 0),await W(_,te,L.meta)}throw g}},a.fromResult=async(E,C,b)=>{let{ttl:h}=b,_=b.key??E,j=E;if(m&&m.has(_)){u({type:"step_cache_hit",workflowId:x,stepKey:_,name:j,ts:Date.now()});let g=m.get(_);if(g.ok)return g.value;let L=Ue(g.cause);throw _e(g.error,L)}m&&u({type:"step_cache_miss",workflowId:x,stepKey:_,name:j,ts:Date.now()});try{let g=await w.fromResult(E,C,{...b,key:_});return m&&m.set(_,z(g),h?{ttl:h}:void 0),await W(_,z(g)),g}catch(g){if(be(g)){let L=g,ne=L.meta.origin==="result"?L.meta.resultCause:L.meta.origin==="throw"?L.meta.thrown:void 0,te=Ce(L.error,L.meta,ne);m&&m.set(_,te,h?{ttl:h}:void 0),await W(_,te,L.meta)}throw g}},a.parallel=w.parallel,a.race=w.race,a.allSettled=w.allSettled,a.withFallback=async(E,C,b)=>{let h=b.key??E,_=E;if(m&&m.has(h)){u({type:"step_cache_hit",workflowId:x,stepKey:h,name:_,ts:Date.now()});let j=m.get(h);if(j.ok)return j.value;let g=Ue(j.cause);throw _e(j.error,g)}m&&u({type:"step_cache_miss",workflowId:x,stepKey:h,name:_,ts:Date.now()});try{let j=await w.withFallback(E,C,b);return m&&m.set(h,z(j)),await W(h,z(j)),j}catch(j){if(be(j)){let g=j,L=g.meta.origin==="result"?g.meta.resultCause:g.meta.origin==="throw"?g.meta.thrown:void 0,ne=Ce(g.error,g.meta,L);m&&m.set(h,ne),await W(h,ne,g.meta)}throw j}},a.withResource=async(E,C)=>{let b=E;try{let h=await w.withResource(E,C);return await W(b,z(h)),h}catch(h){if(be(h)){let _=h,j=_.meta.origin==="result"?_.meta.resultCause:_.meta.origin==="throw"?_.meta.thrown:void 0,g=Ce(_.error,_.meta,j);await W(b,g,_.meta)}throw h}},a.retry=(E,C,b)=>{let h={key:b.key,retry:{attempts:b.attempts,backoff:b.backoff,initialDelay:b.initialDelay,maxDelay:b.maxDelay,jitter:b.jitter,retryOn:b.retryOn,onRetry:b.onRetry},timeout:b.timeout,ttl:b.ttl};return a(E,C,h)},a.withTimeout=(E,C,b)=>{let h={key:b.key,timeout:b,ttl:b.ttl};return a(E,C,h)},a.sleep=(E,C,b)=>{if(typeof E!="string"||E.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let h=typeof C=="string"?At(C):C;if(!h)throw new Error(`step.sleep: invalid duration '${C}'`);let _=vt(h),j=b?.signal;return a(E,async()=>{if(P?.aborted||j?.aborted){let L=new Error("Sleep aborted");throw L.name="AbortError",L}return new Promise((L,ne)=>{let te={timeoutId:void 0},I=()=>{te.timeoutId&&clearTimeout(te.timeoutId);let H=new Error("Sleep aborted");H.name="AbortError",ne(H)};P?.addEventListener("abort",I,{once:!0}),j?.addEventListener("abort",I,{once:!0}),te.timeoutId=setTimeout(()=>{P?.removeEventListener("abort",I),j?.removeEventListener("abort",I),L(z(void 0))},_)})},{key:b?.key,ttl:b?.ttl,description:b?.description})};let Q=new Map,R=new Map;return a.getWritable=E=>{let C=E?.namespace??"default",b=E?.highWaterMark??16;if(!O)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let h=`${x}:${C}`,_=Q.get(h);if(_&&!_.closed&&!_.aborted)return _.writer;let j=bt({highWaterMark:b,onStateChange:H=>{u({type:"stream_backpressure",workflowId:x,namespace:C,bufferedCount:j.bufferedCount,state:H,ts:Date.now()})}}),g=0,L=!0,ne=!1,te=!1;u({type:"stream_created",workflowId:x,namespace:C,ts:Date.now()});let I={async write(H){if(te)return U($e("closed","Stream is closed"));if(ne)return U($e("aborted","Stream was aborted"));j.state==="paused"&&await j.waitForDrain();let pe={value:H,position:g,ts:Date.now()},Z=await O.append(x,C,pe);return Z.ok?(u({type:"stream_write",workflowId:x,namespace:C,position:g,ts:Date.now()}),g++,j.increment(),z(void 0)):(u({type:"stream_error",workflowId:x,namespace:C,error:Z.error,position:g,ts:Date.now()}),U($e("store_error",Z.error.message,Z.error)))},async close(){if(te)return U(Ge("already_closed","Stream is already closed"));let H=await O.closeStream(x,C);return H.ok?(te=!0,L=!1,u({type:"stream_close",workflowId:x,namespace:C,finalPosition:g,ts:Date.now()}),Q.delete(h),z(void 0)):U(Ge("store_error",H.error.message,H.error))},abort(H){ne=!0,L=!1,te=!0,u({type:"stream_error",workflowId:x,namespace:C,error:H,position:g,ts:Date.now()}),Q.delete(h)},get writable(){return L},get position(){return g},get namespace(){return C}};return Q.set(h,{writer:I,backpressure:j,aborted:ne,closed:te}),I},a.getReadable=E=>{let C=E?.namespace??"default",b=E?.startIndex??0,h=E?.pollInterval??10,_=E?.pollTimeout??3e4;if(!O)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let j=`${x}:${C}:${b}`,g=R.get(j);if(g&&!g.closed)return g.reader;let L=()=>{let Re=`${x}:${C}`,ae=Q.get(Re);ae&&ae.backpressure.decrement()},ne=b,te=!0,I=!1,H=[],pe=0,Z={async read(){if(I)return U(Ye("closed","Reader is closed"));if(pe<H.length){let fe=H[pe++];return ne=fe.position+1,L(),u({type:"stream_read",workflowId:x,namespace:C,position:fe.position,ts:Date.now()}),z(fe.value)}let Re=`${x}:${C}`,ae=Date.now(),de=Q.has(Re),oe=await O.getMetadata(x,C),me=oe.ok&&oe.value!==void 0;for(;Date.now()-ae<_;){let fe=await O.read(x,C,ne,100);if(!fe.ok)return U(Ye("store_error",fe.error.message,fe.error));let De=fe.value;if(De.length>0){H=De,pe=1;let Ie=De[0];return ne=Ie.position+1,L(),u({type:"stream_read",workflowId:x,namespace:C,position:Ie.position,ts:Date.now()}),z(Ie.value)}let Me=Q.has(Re),he=await O.getMetadata(x,C),it=he.ok&&he.value!==void 0;if(Me&&(de=!0),it&&(me=!0),he.ok&&he.value?.closed)return te=!1,U(Be(ne));if(de&&!Me&&!it)return te=!1,U(Be(ne));me&&!Me&&he.ok&&he.value?.closed,await new Promise(Ie=>setTimeout(Ie,h))}return te=!1,U(Be(ne))},close(){I=!0,te=!1,H=[],R.delete(j)},get readable(){return te},get position(){return ne},get namespace(){return C}};return R.set(j,{reader:Z,position:ne,closed:I}),Z},a.streamForEach=async(E,C,b)=>{let h=b?.checkpointInterval??1,_=b?.concurrency??1,j=[],g=0,L=-1,ne=I=>typeof I=="object"&&I!==null&&"read"in I&&typeof I.read=="function",te=async(I,H,pe,Z)=>{let ae=h>0&&H%h===0?`stream-foreach:${Z}:pos-${pe}`:void 0,de=ae??`stream-item-${pe}`,oe=await a(de,()=>C(I,H),{key:ae});return{index:H,position:pe,result:oe}};if(ne(E))if(_<=1){let I=E.position,H=await E.read();for(;H.ok;){let pe=H.value,{result:Z}=await te(pe,g,I,E.namespace);j.push(Z),L=I,g++,I=E.position,H=await E.read()}}else{let I=new Map,H=0,pe=0,Z=new Array(_).fill(null),Re=async()=>{for(let fe=0;fe<Z.length;fe++)if(Z[fe]===null)return fe;let oe=Z.filter(fe=>fe!==null),me=await Promise.race(oe);return I.set(me.index,{position:me.position,result:me.result}),Z[me.slotIndex]=null,me.slotIndex},ae=E.position,de=await E.read();for(;de.ok;){let oe=await Re(),me=H,fe=ae,De=de.value,Me=oe;Z[oe]=te(De,me,fe,E.namespace).then(he=>({slotIndex:Me,...he})),pe++,H++,ae=E.position,de=await E.read()}for(let oe=0;oe<Z.length;oe++)if(Z[oe]!==null){let me=await Z[oe];I.set(me.index,{position:me.position,result:me.result})}for(let oe=0;oe<pe;oe++){let me=I.get(oe);me&&(j.push(me.result),L=me.position,g++)}}else if(_<=1){let I=0;for await(let H of E){let{result:pe}=await te(H,I,I,"async-iterable");j.push(pe),L=I,g++,I++}}else{let I=new Map,H=0,pe=0,Z=new Array(_).fill(null),Re=async()=>{for(let oe=0;oe<Z.length;oe++)if(Z[oe]===null)return oe;let ae=Z.filter(oe=>oe!==null),de=await Promise.race(ae);return I.set(de.index,de.result),Z[de.slotIndex]=null,de.slotIndex};for await(let ae of E){let de=await Re(),oe=H,me=de;Z[de]=te(ae,oe,oe,"async-iterable").then(fe=>({slotIndex:me,...fe})),pe++,H++}for(let ae=0;ae<Z.length;ae++)if(Z[ae]!==null){let de=await Z[ae];I.set(de.index,de.result)}for(let ae=0;ae<pe;ae++)I.has(ae)&&(j.push(I.get(ae)),L=ae,g++)}return{results:j,processedCount:g,lastPosition:L}},a.if=w.if,a.label=w.label,a.branch=w.branch,a.arm=w.arm,a.forEach=w.forEach,a.item=w.item,a.dep=w.dep,a.run=(E,C,b)=>a(E,typeof C=="function"?C:()=>C,b),a.workflow=(E,C,b)=>a(E,C,b),a.andThen=(E,C,b,h)=>a(E,()=>b(C),h),a.match=(E,C,b,h)=>a(E,async()=>{let _=await C;return _.ok?z(await b.ok(_.value)):z(await b.err(_.error,_.cause))},h),a.all=(E,C,b)=>{let h=b!==void 0&&Object.prototype.hasOwnProperty.call(b,"key")?b:{...b,key:void 0};return a(E,async()=>z(await w.all(E,C)),h)},a.map=(E,C,b,h)=>{let _=h!==void 0&&Object.prototype.hasOwnProperty.call(h,"key")?h:{...h,key:void 0};return a(E,async()=>z(await w.map(E,C,b,h)),_)},a},Te=({step:w})=>Y({step:V(w),deps:G,ctx:c}),le;try{le=await je(Te,{onError:Ee,onEvent:ce,catchUnexpected:X,workflowId:x,workflowName:e,context:$,_workflowSignal:P})}finally{P&&P.removeEventListener("abort",re)}let xe=performance.now()-T;if(!le.ok){let w;if(qe(le.cause)&&(w=le.cause),!w&&J&&Rt(le.error)){let a=le.cause;a!=null&&typeof a=="object"&&"name"in a&&a.name==="AbortError"&&(w={type:"WORKFLOW_CANCELLED",reason:ee??(typeof P?.reason=="string"?P.reason:P?.reason instanceof Error?P.reason.message:void 0),lastStepKey:M})}if(w)return u({type:"workflow_cancelled",workflowId:x,ts:Date.now(),durationMs:xe,reason:w.reason,lastStepKey:w.lastStepKey}),w&&!qe(le.cause)?U(le.error,{cause:w}):le}if(le.ok&&J){let w=ee??(typeof P?.reason=="string"?P.reason:P?.reason instanceof Error?P.reason.message:void 0);u({type:"workflow_cancelled",workflowId:x,ts:Date.now(),durationMs:xe,reason:w,lastStepKey:M});let a={type:"WORKFLOW_CANCELLED",reason:w,lastStepKey:M};return U(X(a),{cause:a})}return le.ok?u({type:"workflow_success",workflowId:x,ts:Date.now(),durationMs:xe}):u({type:"workflow_error",workflowId:x,ts:Date.now(),durationMs:xe,error:le.error}),le}function A(i,Y,v){let x,G,d;return typeof i=="string"?(x=i,G=Y,d=v):(G=i,d=Y),y(x,G,d)}async function S(i,Y,v){let x,G,d;typeof i=="string"?(x=i,G=Y,d=v):(G=i,d=Y);let $=Ct(),P=d?.onEvent,Ee={...d,onEvent:(q,p)=>{$.handleEvent(q);try{P?.(q,p)}catch{}}},ke,B;try{ke=await y(x,G,Ee)}catch(q){let p=l?.catchUnexpected??Fe;ke=U(p(q),{cause:q})}finally{B=$.getResumeState()}return{result:ke,resumeState:B}}return{run:A,runWithState:S}}async function Qe(e,t,r){let f=[],l={},y=[],A=v=>{if(f.push(v),v.type==="step_complete"&&v.stepKey){let x={output:v.result.ok?v.result.value:void 0,durationMs:v.durationMs,result:v.result};l[v.stepKey]=x,y.push(v.stepKey)}},S=Xe("test-workflow",e),K=performance.now(),i=await S.run(t,{onEvent:A,signal:r?.signal}),Y=performance.now()-K;return{result:i,steps:l,events:f,durationMs:Y,stepOrder:y}}function Ze(e){return typeof e=="object"&&e!==null&&"__earlyExit"in e&&e.__earlyExit===!0}function et(e,t={}){let{recordInvocations:r=!0,clock:f=Date.now}=t,l=[],y=new Map,A=0,S=[];function K(B){l=[...B],A=0,y.clear()}function i(B,q){y.set(B,q)}function Y(B){if(B&&y.has(B))return y.get(B);if(A<l.length)return l[A++]}function v(){let B=async(q,p,X)=>{let se,we,ie;typeof q=="string"?(se=q,we=p,ie=X??{}):(we=q,typeof p=="string"?(se=p,ie={}):(ie=p??{},se=ie.key??"step"));let ue=f(),c={name:se,key:ie.key,order:S.length,timestamp:ue};r&&S.push(c);let u=Y(se);if(u)switch(c.durationMs=f()-ue,u.type){case"ok":return c.result=z(u.value),u.value;case"err":throw c.result=U(u.error),{__earlyExit:!0,error:u.error};case"throw":throw u.error}let o=typeof we=="function"?await we():await we;if(c.durationMs=f()-ue,c.result=o,!o.ok)throw{__earlyExit:!0,error:o.error};return o.value};return B.try=async(q,p,X)=>{let se,we,ie;typeof q=="string"?(se=q,we=p,ie=X):(we=q,ie=p,se=ie.key??"step");let ue=f(),c={name:se,key:"key"in ie?ie.key:void 0,order:S.length,timestamp:ue};r&&S.push(c);let u=Y(se);if(u)switch(c.durationMs=f()-ue,u.type){case"ok":return c.result=z(u.value),u.value;case"err":throw c.result=U(u.error),{__earlyExit:!0,error:u.error};case"throw":throw u.error}try{let o=await we();return c.durationMs=f()-ue,c.result=z(o),o}catch(o){c.durationMs=f()-ue;let s="error"in ie?ie.error:ie.onError(o);throw c.result=U(s),{__earlyExit:!0,error:s}}},B}async function x(B){let q=v();try{let p=await B({step:q,deps:e});return z(p)}catch(p){return Ze(p)?U(p.error):U(new Se({cause:p}))}}async function G(B,q){let p=v();try{let X=await q({step:p,deps:e,input:B});return z(X)}catch(X){return Ze(X)?U(X.error):U(new Se({cause:X}))}}function d(){return[...S]}function $(B){let q=S.map(X=>X.name??X.key??"unnamed").filter(X=>X!=="unnamed"),p=JSON.stringify(q)===JSON.stringify(B);return{passed:p,message:p?`Steps invoked in order: ${B.join(", ")}`:`Expected steps [${B.join(", ")}] but got [${q.join(", ")}]`,expected:B,actual:q}}function P(B){let q=S.some(p=>p.name===B||p.key===B);return{passed:q,message:q?`Step "${B}" was invoked`:`Step "${B}" was NOT invoked`,expected:B,actual:q}}function ce(B){let q=S.some(p=>p.name===B||p.key===B);return{passed:!q,message:q?`Step "${B}" was invoked but should not have been`:`Step "${B}" was correctly NOT invoked`,expected:"not called",actual:q?"called":"not called"}}function Ee(B,q){let p=B.ok===q.ok&&(B.ok?JSON.stringify(B.value)===JSON.stringify(q.value):JSON.stringify(B.error)===JSON.stringify(q.error));return{passed:p,message:p?"Result matches expected":"Result does not match expected",expected:q,actual:B}}function ke(){l=[],y.clear(),A=0,S=[]}return{script:K,scriptStep:i,run:x,runWithInput:G,getInvocations:d,assertSteps:$,assertStepCalled:P,assertStepNotCalled:ce,assertResult:Ee,reset:ke}}function _t(){let e,t=[],r=[],f=((...l)=>{if(r.push(l),t.length>0)return Promise.resolve(t.shift());if(e)return Promise.resolve(e);throw new Error("Mock function called without configured return value")});return f.returns=l=>(e=l,f),f.returnsOnce=l=>(t.push(l),f),f.getCalls=()=>[...r],f.getCallCount=()=>r.length,f.reset=()=>{e=void 0,t.length=0,r.length=0},f}function Pt(e,t,r){let f=e.reduce((l,y)=>l+(y.durationMs??0),0);return{invocations:e.map(l=>({...l,timestamp:0})),result:t,events:r?.map(l=>({...l,ts:0})),durationMs:f}}function Dt(e,t){let r=[];e.invocations.length!==t.invocations.length&&r.push(`Invocation count: ${e.invocations.length} vs ${t.invocations.length}`);let f=Math.max(e.invocations.length,t.invocations.length);for(let l=0;l<f;l++){let y=e.invocations[l],A=t.invocations[l];if(!y){r.push(`Step ${l}: missing in first snapshot`);continue}if(!A){r.push(`Step ${l}: missing in second snapshot`);continue}y.name!==A.name&&r.push(`Step ${l} name: "${y.name}" vs "${A.name}"`),y.key!==A.key&&r.push(`Step ${l} key: "${y.key}" vs "${A.key}"`),y.result?.ok!==A.result?.ok&&r.push(`Step ${l} result: ${y.result?.ok?"ok":"err"} vs ${A.result?.ok?"ok":"err"}`)}return e.result.ok!==t.result.ok&&r.push(`Final result: ${e.result.ok?"ok":"err"} vs ${t.result.ok?"ok":"err"}`),{equal:r.length===0,differences:r}}function Mt(e=0){let t=e;return{now:()=>t,advance:r=>{t+=r},set:r=>{t=r},reset:()=>{t=e}}}function It(e){return{type:"ok",value:e}}function Wt(e){return{type:"err",error:e}}function Ut(e){return{type:"throw",error:e}}function Nt(e,t={}){let{clock:r=Date.now}=t,f=et(e,t),l=[],y=[];async function A(G){l=[],y=[];let d={step:async(P,ce)=>{try{let Ee=await f.run(async({step:ke})=>ke("saga-step",P));if(!Ee.ok)throw await $(),{__earlyExit:!0,error:Ee.error};return ce?.compensate&&y.push({value:Ee.value,compensate:ce.compensate}),Ee.value}catch(Ee){throw y.length>0&&await $(),Ee}}};async function $(){let P=[...y].reverse();y=[];for(let{name:ce,value:Ee,compensate:ke}of P)try{await ke(Ee),l.push({stepName:ce,order:l.length,value:Ee,timestamp:r()})}catch(B){console.error(`Compensation failed for step "${ce}":`,B)}}try{let P=await G({saga:d,deps:e});return z(P)}catch(P){return Ze(P)?U(P.error):(await $(),U(new Se({cause:P})))}}function S(){return[...l]}function K(G){let d=l.map(P=>P.stepName),$=JSON.stringify(d)===JSON.stringify(G);return{passed:$,message:$?`Compensations ran in order: ${G.join(" \u2192 ")}`:`Expected compensations [${G.join(" \u2192 ")}] but got [${d.join(" \u2192 ")}]`,expected:G,actual:d}}function i(G){let d=l.some($=>$.stepName===G);return{passed:d,message:d?`Step "${G}" was compensated`:`Step "${G}" was NOT compensated`,expected:G,actual:d}}function Y(G){let d=l.some($=>$.stepName===G);return{passed:!d,message:d?`Step "${G}" was compensated but should not have been`:`Step "${G}" was correctly NOT compensated`,expected:"not compensated",actual:d?"compensated":"not compensated"}}let v=f.reset;function x(){v(),l=[],y=[]}return{...f,reset:x,getCompensations:S,assertCompensationOrder:K,assertCompensated:i,assertNotCompensated:Y,runSaga:A}}function jt(e,t,r={}){let{strict:f=!0}=r,l=t.map(K=>{let[i,Y]=K.split(":");return{type:i,name:Y}}),A=(f?e:e.filter(K=>l.some(i=>K.type===i.type))).map(K=>{let i="name"in K?K.name:void 0,Y="stepKey"in K?K.stepKey:void 0,v=i??Y;return v?`${K.type}:${v}`:K.type}),S=JSON.stringify(A)===JSON.stringify(t);return{passed:S,message:S?`Event sequence matches: ${t.join(" \u2192 ")}`:`Event sequence mismatch.
11
+ Expected: ${t.join(" \u2192 ")}
12
+ Actual: ${A.join(" \u2192 ")}`,expected:t,actual:A}}function tt(e,t){let r=e.find(f=>Object.entries(t).every(([l,y])=>{let A=f[l];return typeof y=="object"&&y!==null?JSON.stringify(A)===JSON.stringify(y):A===y}));return{passed:!!r,message:r?`Event matching ${JSON.stringify(t)} was emitted`:`No event matching ${JSON.stringify(t)} was found`,expected:t,actual:r??"not found"}}function Ft(e,t){let r=tt(e,t);return{passed:!r.passed,message:r.passed?`Event matching ${JSON.stringify(t)} was found but should not have been`:`Correctly, no event matching ${JSON.stringify(t)} was emitted`,expected:"not emitted",actual:r.actual}}function rt(e){if(!e.ok)throw new Error(`Expected Ok result, got Err: ${JSON.stringify(e.error,null,2)}`)}function nt(e){if(e.ok)throw new Error(`Expected Err result, got Ok: ${JSON.stringify(e.value,null,2)}`)}function ot(e){return rt(e),e.value}function st(e){return nt(e),e.error}async function Kt(e){return ot(await e)}async function $t(e){return st(await e)}function Bt(e){return Tt(e)?`Ok(${Pe(e.value)})`:`Err(${Pe(e.error)})`}function Pe(e){if(e===null)return"null";if(e===void 0)return"undefined";if(typeof e=="string")return`'${e}'`;if(typeof e=="number"||typeof e=="boolean")return String(e);if(typeof e=="function")return`[Function: ${e.name||"anonymous"}]`;if(Array.isArray(e))return e.length===0?"[]":e.length<=3?`[${e.map(Pe).join(", ")}]`:`[${e.slice(0,3).map(Pe).join(", ")}, ... (${e.length} items)]`;if(typeof e=="object"){let t=e,r=Object.keys(t);return r.length===0?"{}":r.length<=4?`{ ${r.map(y=>`${y}: ${Pe(t[y])}`).join(", ")} }`:`{ ${r.slice(0,3).map(l=>`${l}: ${Pe(t[l])}`).join(", ")}, ... (${r.length} keys) }`}return String(e)}function at(e){let t=e.type,r="name"in e?e.name:void 0,f="stepKey"in e?e.stepKey:void 0,l=r??f;return l?`${t}:${l}`:t}function Vt(e){return e.map(at).join(" \u2192 ")}0&&(module.exports={assertEventEmitted,assertEventNotEmitted,assertEventSequence,compareSnapshots,createMockFn,createSagaHarness,createSnapshot,createTestClock,createWorkflowHarness,errOutcome,expectErr,expectOk,formatEvent,formatEvents,formatResult,okOutcome,testWorkflow,throwOutcome,unwrapErr,unwrapErrAsync,unwrapOk,unwrapOkAsync});
9
13
  //# sourceMappingURL=testing.cjs.map