@jagreehal/workflow 1.7.0 → 1.8.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.
package/README.md CHANGED
@@ -580,6 +580,250 @@ if (!result.ok && isPendingApproval(result.error)) {
580
580
  | **Events** | `onEvent` streams everything - timing, retries, failures - for visualization or logging |
581
581
  | **Resume** | Save completed steps, pick up later (great for approvals or crashes) |
582
582
  | **UnexpectedError** | Safety net for throws outside your declared union; use `strict` mode to force explicit handling |
583
+ | **TaggedError** | Factory for rich error types with exhaustive pattern matching |
584
+
585
+ ## Tagged Errors: When String Literals Aren't Enough
586
+
587
+ String literal errors like `'NOT_FOUND'` are perfect for simple cases. But sometimes you need **rich error objects** with contextual data. That's where `TaggedError` shines.
588
+
589
+ ### When to Use What
590
+
591
+ | Use Case | Recommendation |
592
+ |----------|----------------|
593
+ | Simple, distinct error states | String literals: `'NOT_FOUND' \| 'UNAUTHORIZED'` |
594
+ | Errors with contextual data | TaggedError: `NotFoundError { id, resource }` |
595
+ | Multiple error variants to handle | TaggedError with `match()` for exhaustive handling |
596
+ | API responses or user messages | TaggedError for structured error details |
597
+
598
+ ### String Literals (Simple Cases)
599
+
600
+ For most workflows, string literals are cleaner and simpler:
601
+
602
+ ```typescript
603
+ const fetchUser = async (id: string): AsyncResult<User, 'NOT_FOUND' | 'DB_ERROR'> =>
604
+ id ? ok({ id, name: 'Alice' }) : err('NOT_FOUND');
605
+
606
+ const result = await workflow(async (step) => {
607
+ const user = await step(fetchUser('123'));
608
+ return user;
609
+ });
610
+
611
+ if (!result.ok) {
612
+ switch (result.error) {
613
+ case 'NOT_FOUND': return res.status(404).send('User not found');
614
+ case 'DB_ERROR': return res.status(500).send('Database error');
615
+ }
616
+ }
617
+ ```
618
+
619
+ ### TaggedError (Rich Error Objects)
620
+
621
+ Use `TaggedError` when you need to carry additional context:
622
+
623
+ ```typescript
624
+ import { TaggedError, ok, err, type AsyncResult } from '@jagreehal/workflow';
625
+
626
+ // Pattern 1: Props via generic (default message = tag name)
627
+ class NotFoundError extends TaggedError('NotFoundError')<{
628
+ resource: string;
629
+ id: string;
630
+ }> {}
631
+
632
+ // Pattern 2: Type-safe message (Props inferred from callback annotation)
633
+ class ValidationError extends TaggedError('ValidationError', {
634
+ message: (p: { field: string; reason: string }) => `Validation failed for ${p.field}: ${p.reason}`,
635
+ }) {}
636
+
637
+ class RateLimitError extends TaggedError('RateLimitError', {
638
+ message: (p: { retryAfter: number }) => `Rate limited. Retry after ${p.retryAfter}s`,
639
+ }) {}
640
+
641
+ // Runtime type checks work!
642
+ const error = new NotFoundError({ resource: 'User', id: '123' });
643
+ console.log(error instanceof TaggedError); // true
644
+
645
+ // Use in your functions
646
+ type UserError = NotFoundError | ValidationError | RateLimitError;
647
+
648
+ const fetchUser = async (id: string): AsyncResult<User, UserError> => {
649
+ if (!id) return err(new ValidationError({ field: 'id', reason: 'required' }));
650
+ if (id === 'limited') return err(new RateLimitError({ retryAfter: 60 }));
651
+ if (id === 'missing') return err(new NotFoundError({ resource: 'User', id }));
652
+ return ok({ id, name: 'Alice' });
653
+ };
654
+ ```
655
+
656
+ ### Exhaustive Matching with `TaggedError.match()`
657
+
658
+ TypeScript enforces you handle **every** error variant:
659
+
660
+ ```typescript
661
+ const result = await workflow(async (step) => {
662
+ const user = await step(fetchUser('123'));
663
+ return user;
664
+ });
665
+
666
+ if (!result.ok) {
667
+ // TypeScript enforces all variants are handled
668
+ const response = TaggedError.match(result.error, {
669
+ NotFoundError: (e) => ({
670
+ status: 404,
671
+ body: { error: 'not_found', resource: e.resource, id: e.id },
672
+ }),
673
+ ValidationError: (e) => ({
674
+ status: 400,
675
+ body: { error: 'validation', field: e.field, reason: e.reason },
676
+ }),
677
+ RateLimitError: (e) => ({
678
+ status: 429,
679
+ body: { error: 'rate_limited', retryAfter: e.retryAfter },
680
+ }),
681
+ });
682
+
683
+ return res.status(response.status).json(response.body);
684
+ }
685
+ ```
686
+
687
+ **Add a new error type? TypeScript will error until you handle it.** This catches bugs at compile time, not production.
688
+
689
+ ### Partial Matching with Fallback
690
+
691
+ Handle specific errors and catch-all for the rest:
692
+
693
+ ```typescript
694
+ const message = TaggedError.matchPartial(
695
+ result.error,
696
+ {
697
+ RateLimitError: (e) => `Please wait ${e.retryAfter} seconds`,
698
+ },
699
+ (e) => `Something went wrong: ${e.message}` // Fallback for other errors
700
+ );
701
+ ```
702
+
703
+ ### Real-World Example: Payment Errors
704
+
705
+ ```typescript
706
+ // Type-safe message with Props inferred from callback annotation
707
+ class PaymentDeclinedError extends TaggedError('PaymentDeclinedError', {
708
+ message: (p: {
709
+ code: string;
710
+ declineReason: 'insufficient_funds' | 'card_expired' | 'fraud_suspected';
711
+ }) => `Payment declined: ${p.declineReason}`,
712
+ }) {}
713
+
714
+ class PaymentProviderError extends TaggedError('PaymentProviderError', {
715
+ message: (p: { provider: string; statusCode: number }) => `${p.provider} returned ${p.statusCode}`,
716
+ }) {}
717
+
718
+ type PaymentError = PaymentDeclinedError | PaymentProviderError;
719
+
720
+ // In your workflow
721
+ if (!result.ok) {
722
+ TaggedError.match(result.error, {
723
+ PaymentDeclinedError: (e) => {
724
+ switch (e.declineReason) {
725
+ case 'insufficient_funds': notifyUser('Please use a different card');
726
+ case 'card_expired': notifyUser('Your card has expired');
727
+ case 'fraud_suspected': alertFraudTeam(e);
728
+ }
729
+ },
730
+ PaymentProviderError: (e) => {
731
+ logToDatadog({ provider: e.provider, status: e.statusCode });
732
+ retryWithBackup(e.provider);
733
+ },
734
+ });
735
+ }
736
+ ```
737
+
738
+ ### Type Helpers
739
+
740
+ ```typescript
741
+ import { type TagOf, type ErrorByTag } from '@jagreehal/workflow';
742
+
743
+ type PaymentError = PaymentDeclinedError | PaymentProviderError;
744
+
745
+ // Extract the tag literal type
746
+ type Tags = TagOf<PaymentError>; // 'PaymentDeclinedError' | 'PaymentProviderError'
747
+
748
+ // Extract a specific variant from the union
749
+ type Declined = ErrorByTag<PaymentError, 'PaymentDeclinedError'>; // PaymentDeclinedError
750
+ ```
751
+
752
+ ### Reserved Keys & Cause Handling
753
+
754
+ **Reserved property names** are stripped from props to preserve Error semantics:
755
+
756
+ | Key | Reason |
757
+ |-----|--------|
758
+ | `_tag` | Discriminant for pattern matching (cannot be forged) |
759
+ | `name` | Error.name (shown in stack traces/logs) |
760
+ | `message` | Error.message (shown in logs/telemetry) |
761
+ | `stack` | Error.stack (the stack trace) |
762
+
763
+ ```typescript
764
+ // These reserved keys are silently stripped - use different names!
765
+ class BadExample extends TaggedError('BadExample')<{
766
+ message: string; // ❌ Won't work - use 'details' or 'description' instead
767
+ id: string;
768
+ }> {}
769
+
770
+ // Better approach:
771
+ class GoodExample extends TaggedError('GoodExample')<{
772
+ details: string; // ✅ Custom prop name
773
+ id: string;
774
+ }> {}
775
+ ```
776
+
777
+ **The `cause` property** is special - it can be used as a user prop for domain data:
778
+
779
+ ```typescript
780
+ // cause as domain data (e.g., structured validation errors)
781
+ class ValidationError extends TaggedError('ValidationError')<{
782
+ cause: { field: string; reason: string }; // ✅ Allowed as user prop
783
+ }> {}
784
+
785
+ const error = new ValidationError({
786
+ cause: { field: 'email', reason: 'invalid format' },
787
+ });
788
+ console.log(error.cause); // { field: 'email', reason: 'invalid format' }
789
+ ```
790
+
791
+ **Conflict detection**: You cannot provide `cause` in both props AND ErrorOptions:
792
+
793
+ ```typescript
794
+ // This throws TypeError at runtime!
795
+ const error = new ValidationError(
796
+ { cause: { field: 'email', reason: 'invalid' } }, // cause in props
797
+ { cause: new Error('original') } // cause in options
798
+ );
799
+ // TypeError: cannot provide 'cause' in props when also setting ErrorOptions.cause
800
+ ```
801
+
802
+ Use ErrorOptions.cause for error chaining (linking to the original error):
803
+
804
+ ```typescript
805
+ class NetworkError extends TaggedError('NetworkError')<{
806
+ url: string;
807
+ statusCode: number;
808
+ }> {}
809
+
810
+ try {
811
+ await fetch('/api');
812
+ } catch (original) {
813
+ // Chain to original error via ErrorOptions (not props)
814
+ throw new NetworkError(
815
+ { url: '/api', statusCode: 500 },
816
+ { cause: original } // ✅ Error chaining
817
+ );
818
+ }
819
+ ```
820
+
821
+ ### Summary
822
+
823
+ - **String literals**: Simple, great for distinct states without extra data
824
+ - **TaggedError**: Rich errors with context, exhaustive matching, proper stack traces
825
+ - **`match()`**: Forces you to handle every variant (compile-time safety)
826
+ - **`matchPartial()`**: Handle some variants with a catch-all fallback
583
827
 
584
828
  ## Recipes & Patterns
585
829
 
package/dist/core.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var q=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var me=(e,t)=>{for(var n in t)q(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let y of Ee(t))!ye.call(e,y)&&y!==n&&q(e,y,{get:()=>t[y],enumerable:!(a=ce(t,y))||a.enumerable});return e};var Te=e=>we(q({},"__esModule",{value:!0}),e);var He={};me(He,{EARLY_EXIT_SYMBOL:()=>Z,STEP_TIMEOUT_MARKER:()=>D,UnwrapError:()=>W,all:()=>Xe,allAsync:()=>Ye,allSettled:()=>$e,allSettledAsync:()=>Ge,andThen:()=>Oe,any:()=>Be,anyAsync:()=>qe,bimap:()=>Fe,createEarlyExit:()=>oe,err:()=>d,from:()=>be,fromNullable:()=>_e,fromPromise:()=>Pe,getStepTimeoutMeta:()=>re,isEarlyExit:()=>se,isErr:()=>de,isOk:()=>ke,isStepTimeoutError:()=>z,isUnexpectedError:()=>ne,map:()=>ve,mapError:()=>Me,mapErrorTry:()=>je,mapTry:()=>Ke,match:()=>Ie,ok:()=>g,orElse:()=>Ne,orElseAsync:()=>Ve,partition:()=>Je,recover:()=>Le,recoverAsync:()=>We,run:()=>Q,tap:()=>Ue,tapError:()=>De,tryAsync:()=>he,unwrap:()=>Se,unwrapOr:()=>ge,unwrapOrElse:()=>Ae});module.exports=Te(He);var g=e=>({ok:!0,value:e}),d=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}}),ke=e=>e.ok,de=e=>!e.ok,ne=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",D=Symbol.for("step_timeout_marker");function z(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:D in e}function re(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(D in e)return e[D]}}var Z=Symbol("early-exit");function oe(e,t){return{[Z]:!0,error:e,meta:t}}function se(e){return typeof e=="object"&&e!==null&&e[Z]===!0}var ue=Symbol("mapper-exception");function fe(e){return{[ue]:!0,thrown:e}}function Re(e){return typeof e=="object"&&e!==null&&e[ue]===!0}function Ce(e){return typeof e=="string"?{name:e}:e??{}}function G(e,t){let{backoff:n,initialDelay:a,maxDelay:y,jitter:A}=t,x;switch(n){case"fixed":x=a;break;case"linear":x=a*e;break;case"exponential":x=a*Math.pow(2,e-1);break}if(x=Math.min(x,y),A){let r=x*.25*Math.random();x=x+r}return Math.floor(x)}function H(e){return new Promise(t=>setTimeout(t,e))}var te=Symbol("timeout");async function xe(e,t,n){let a=new AbortController,y=t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},A,x=new Promise((I,R)=>{A=setTimeout(()=>{a.abort(),R({[te]:!0,error:y})},t.ms)}),r;t.signal?r=Promise.resolve(e(a.signal)):r=Promise.resolve(e());try{return await Promise.race([r,x])}catch(I){if(typeof I=="object"&&I!==null&&I[te]===!0){let R=I.error;if(typeof R=="object"&&R!==null&&R.type!=="STEP_TIMEOUT"){let V={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};D in R?R[D]=V:Object.defineProperty(R,D,{value:V,enumerable:!1,writable:!0,configurable:!1})}throw R}throw I}finally{clearTimeout(A)}}var F={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Q(e,t){let{onError:n,onEvent:a,catchUnexpected:y,workflowId:A,context:x}=t&&typeof t=="object"?t:{},r=A??crypto.randomUUID(),I=!n&&!y,R=[],V=0,X=o=>o??`step_${++V}`,E=o=>{if(o.type==="step_success"){let P=o.stepId;for(let h=R.length-1;h>=0;h--){let K=R[h];if(K.type==="race"&&!K.winnerId){K.winnerId=P;break}}}a?.(o,x)},O=oe,ee=o=>se(o),Y=(o,P)=>I?P?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o,...P.resultCause!==void 0?{cause:P.resultCause}:{}}}:P?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:o,thrown:P.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o}}:o,ae=o=>o.origin==="result"?o.resultCause:o.thrown,ie=o=>({type:"UNEXPECTED_ERROR",cause:o.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:o.error,...o.meta.resultCause!==void 0?{cause:o.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:o.error,thrown:o.meta.thrown}});try{let P=function(w,p){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;R.push({scopeId:i,type:"parallel"});let C=()=>{if(u)return;u=!0;let c=R.findIndex(l=>l.scopeId===i);c!==-1&&R.splice(c,1),E({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};E({type:"scope_start",workflowId:r,scopeId:i,scopeType:"parallel",name:w,ts:Date.now()});try{let c=await p();if(C(),!c.ok)throw n?.(c.error,w),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw C(),c}})()},h=function(w,p){let i=Object.keys(w),s=p.name??`Parallel(${i.join(", ")})`,u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let C=performance.now(),c=!1;R.push({scopeId:u,type:"parallel"});let l=()=>{if(c)return;c=!0;let T=R.findIndex(f=>f.scopeId===u);T!==-1&&R.splice(T,1),E({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-C})};E({type:"scope_start",workflowId:r,scopeId:u,scopeType:"parallel",name:s,ts:Date.now()});try{let T=await new Promise(_=>{if(i.length===0){_([]);return}let v=!1,S=i.length,N=new Array(i.length);for(let M=0;M<i.length;M++){let j=i[M],$=M;Promise.resolve(w[j]()).catch(k=>d({type:"PROMISE_REJECTED",cause:k},{cause:{type:"PROMISE_REJECTION",reason:k}})).then(k=>{if(!v){if(!k.ok){v=!0,_([{key:j,result:k}]);return}N[$]={key:j,result:k},S--,S===0&&_(N)}})}});l();let f={};for(let{key:_,result:v}of T){if(!v.ok)throw n?.(v.error,_),O(v.error,{origin:"result",resultCause:v.cause});f[_]=v.value}return f}catch(T){throw l(),T}})()};var ze=P,Qe=h;let o=(w,p)=>(async()=>{let i=Ce(p),{name:s,key:u,retry:C,timeout:c}=i,l=X(u),T=a,f=T?performance.now():0;if(!(typeof w=="function")){if(C&&C.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(c)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let S={attempts:Math.max(1,C?.attempts??1),backoff:C?.backoff??F.backoff,initialDelay:C?.initialDelay??F.initialDelay,maxDelay:C?.maxDelay??F.maxDelay,jitter:C?.jitter??F.jitter,retryOn:C?.retryOn??F.retryOn,onRetry:C?.onRetry??F.onRetry};a&&E({type:"step_start",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now()});let N;for(let k=1;k<=S.attempts;k++){let le=T?performance.now():0;try{let m;if(typeof w=="function"?c?m=await xe(w,c,{name:s,key:u,attempt:k}):m=await w():m=await w,m.ok){let U=performance.now()-f;return E({type:"step_success",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:U,result:m}),m.value}if(N=m,k<S.attempts&&S.retryOn(m.error,k)){let U=G(k,S);E({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:k+1,maxAttempts:S.attempts,delayMs:U,error:m.error}),S.onRetry(m.error,k,U),await H(U);continue}S.attempts>1&&E({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:m.error});break}catch(m){let U=performance.now()-le;if(ee(m))throw E({type:"step_aborted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),m;if(z(m)){let b=re(m),J=c?.ms??b?.timeoutMs??0;if(E({type:"step_timeout",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),timeoutMs:J,attempt:k}),k<S.attempts&&S.retryOn(m,k)){let B=G(k,S);E({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:k+1,maxAttempts:S.attempts,delayMs:B,error:m}),S.onRetry(m,k,B),await H(B);continue}S.attempts>1&&E({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:m})}if(k<S.attempts&&S.retryOn(m,k)){let b=G(k,S);E({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:k+1,maxAttempts:S.attempts,delayMs:b,error:m}),S.onRetry(m,k,b),await H(b);continue}S.attempts>1&&!z(m)&&E({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-f,attempts:k,lastError:m});let L=performance.now()-f;if(y){let b;try{b=y(m)}catch(J){throw fe(J)}throw E({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:L,error:b}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:L,result:d(b,{cause:m}),meta:{origin:"throw",thrown:m}}),n?.(b,s),O(b,{origin:"throw",thrown:m})}else{let b={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:m}};throw E({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:L,error:b}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:L,result:d(b,{cause:m}),meta:{origin:"throw",thrown:m}}),m}}}let M=N,j=performance.now()-f,$=Y(M.error,{origin:"result",resultCause:M.cause});throw E({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:j,error:$}),u&&E({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:j,result:M,meta:{origin:"result",resultCause:M.cause}}),n?.(M.error,s),O(M.error,{origin:"result",resultCause:M.cause})})();o.try=(w,p)=>{let i=p.name,s=p.key,u=X(s),C="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&E({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});try{let T=await w(),f=performance.now()-l;return E({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:f}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:f,result:g(T)}),T}catch(T){let f=C(T),_=performance.now()-l,v=Y(f,{origin:"throw",thrown:T});throw E({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:_,error:v}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:_,result:d(f,{cause:T}),meta:{origin:"throw",thrown:T}}),n?.(f,i),O(f,{origin:"throw",thrown:T})}})()},o.fromResult=(w,p)=>{let i=p.name,s=p.key,u=X(s),C="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&E({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});let T=await w();if(T.ok){let f=performance.now()-l;return E({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:f}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:f,result:g(T.value)}),T.value}else{let f=C(T.error),_=performance.now()-l,v=Y(f,{origin:"result",resultCause:T.error});throw E({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:_,error:v}),s&&E({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:_,result:d(f,{cause:T.error}),meta:{origin:"result",resultCause:T.error}}),n?.(f,i),O(f,{origin:"result",resultCause:T.error})}})()},o.retry=(w,p)=>o(w,{name:p.name,key:p.key,retry:{attempts:p.attempts,backoff:p.backoff,initialDelay:p.initialDelay,maxDelay:p.maxDelay,jitter:p.jitter,retryOn:p.retryOn,onRetry:p.onRetry},timeout:p.timeout}),o.withTimeout=(w,p)=>o(w,{name:p.name,key:p.key,timeout:p}),o.parallel=((...w)=>{if(typeof w[0]=="string"){let p=w[0],i=w[1];return P(p,i)}else{let p=w[0],i=w[1]??{};return h(p,i)}}),o.race=(w,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1,C={scopeId:i,type:"race",winnerId:void 0};R.push(C);let c=()=>{if(u)return;u=!0;let l=R.findIndex(T=>T.scopeId===i);l!==-1&&R.splice(l,1),E({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s,winnerId:C.winnerId})};E({type:"scope_start",workflowId:r,scopeId:i,scopeType:"race",name:w,ts:Date.now()});try{let l=await p();if(c(),!l.ok)throw n?.(l.error,w),O(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw c(),l}})()},o.allSettled=(w,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;R.push({scopeId:i,type:"allSettled"});let C=()=>{if(u)return;u=!0;let c=R.findIndex(l=>l.scopeId===i);c!==-1&&R.splice(c,1),E({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};E({type:"scope_start",workflowId:r,scopeId:i,scopeType:"allSettled",name:w,ts:Date.now()});try{let c=await p();if(C(),!c.ok)throw n?.(c.error,w),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw C(),c}})()};let pe=await e(o);return g(pe)}catch(o){if(Re(o))throw o.thrown;if(ee(o)){let h=ae(o.meta);if(y||n)return d(o.error,{cause:h});if(ne(o.error))return d(o.error,{cause:h});let K=ie(o);return d(K,{cause:h})}if(y){let h=y(o);return n?.(h,"unexpected"),d(h,{cause:o})}let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:o}};return n?.(P,"unexpected"),d(P,{cause:o})}}Q.strict=(e,t)=>Q(e,t);var W=class extends Error{constructor(n,a){super(`Unwrap called on an error result: ${String(n)}`);this.error=n;this.cause=a;this.name="UnwrapError"}},Se=e=>{if(e.ok)return e.value;throw new W(e.error,e.cause)},ge=(e,t)=>e.ok?e.value:t,Ae=(e,t)=>e.ok?e.value:t(e.error,e.cause);function be(e,t){try{return g(e())}catch(n){return t?d(t(n),{cause:n}):d(n)}}async function Pe(e,t){try{return g(await e)}catch(n){return t?d(t(n),{cause:n}):d(n)}}async function he(e,t){try{return g(await e())}catch(n){return t?d(t(n),{cause:n}):d(n)}}function _e(e,t){return e!=null?g(e):d(t())}function ve(e,t){return e.ok?g(t(e.value)):e}function Me(e,t){return e.ok?e:d(t(e.error),{cause:e.cause})}function Ie(e,t){return e.ok?t.ok(e.value):t.err(e.error,e.cause)}function Oe(e,t){return e.ok?t(e.value):e}function Ue(e,t){return e.ok&&t(e.value),e}function De(e,t){return e.ok||t(e.error,e.cause),e}function Ke(e,t,n){if(!e.ok)return e;try{return g(t(e.value))}catch(a){return d(n(a),{cause:a})}}function je(e,t,n){if(e.ok)return e;try{return d(t(e.error),{cause:e.cause})}catch(a){return d(n(a),{cause:a})}}function Fe(e,t,n){return e.ok?g(t(e.value)):d(n(e.error),{cause:e.cause})}function Ne(e,t){return e.ok?e:t(e.error,e.cause)}async function Ve(e,t){let n=await e;return n.ok?n:t(n.error,n.cause)}function Le(e,t){return e.ok?g(e.value):g(t(e.error,e.cause))}async function We(e,t){let n=await e;return n.ok?g(n.value):g(await t(n.error,n.cause))}function Xe(e){let t=[];for(let n of e){if(!n.ok)return n;t.push(n.value)}return g(t)}async function Ye(e){return e.length===0?g([]):new Promise(t=>{let n=!1,a=e.length,y=new Array(e.length);for(let A=0;A<e.length;A++){let x=A;Promise.resolve(e[x]).catch(r=>d({type:"PROMISE_REJECTED",cause:r},{cause:{type:"PROMISE_REJECTION",reason:r}})).then(r=>{if(!n){if(!r.ok){n=!0,t(r);return}y[x]=r.value,a--,a===0&&t(g(y))}})}})}function $e(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push({error:a.error,cause:a.cause});return n.length>0?d(n):g(t)}function Je(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push(a.error);return{values:t,errors:n}}function Be(e){if(e.length===0)return d({type:"EMPTY_INPUT",message:"any() requires at least one Result"});let t=null;for(let n of e){if(n.ok)return n;t||(t=n)}return t}async function qe(e){return e.length===0?d({type:"EMPTY_INPUT",message:"anyAsync() requires at least one Result"}):new Promise(t=>{let n=!1,a=e.length,y=null;for(let A of e)Promise.resolve(A).catch(x=>d({type:"PROMISE_REJECTED",cause:x},{cause:{type:"PROMISE_REJECTION",reason:x}})).then(x=>{if(!n){if(x.ok){n=!0,t(x);return}y||(y=x),a--,a===0&&t(y)}})})}async function Ge(e){let t=await Promise.all(e.map(y=>Promise.resolve(y).then(A=>({status:"result",result:A})).catch(A=>({status:"rejected",error:{type:"PROMISE_REJECTED",cause:A},cause:{type:"PROMISE_REJECTION",reason:A}})))),n=[],a=[];for(let y of t)y.status==="rejected"?a.push({error:y.error,cause:y.cause}):y.result.ok?n.push(y.result.value):a.push({error:y.result.error,cause:y.result.cause});return a.length>0?d(a):g(n)}0&&(module.exports={EARLY_EXIT_SYMBOL,STEP_TIMEOUT_MARKER,UnwrapError,all,allAsync,allSettled,allSettledAsync,andThen,any,anyAsync,bimap,createEarlyExit,err,from,fromNullable,fromPromise,getStepTimeoutMeta,isEarlyExit,isErr,isOk,isStepTimeoutError,isUnexpectedError,map,mapError,mapErrorTry,mapTry,match,ok,orElse,orElseAsync,partition,recover,recoverAsync,run,tap,tapError,tryAsync,unwrap,unwrapOr,unwrapOrElse});
1
+ "use strict";var G=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var me=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})},Te=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let w of ye(t))!we.call(e,w)&&w!==n&&G(e,w,{get:()=>t[w],enumerable:!(a=Ee(t,w))||a.enumerable});return e};var ke=e=>Te(G({},"__esModule",{value:!0}),e);var Qe={};me(Qe,{EARLY_EXIT_SYMBOL:()=>ee,STEP_TIMEOUT_MARKER:()=>D,UnwrapError:()=>X,all:()=>$e,allAsync:()=>Je,allSettled:()=>Be,allSettledAsync:()=>ze,andThen:()=>Ue,any:()=>Ge,anyAsync:()=>He,bimap:()=>Ne,createEarlyExit:()=>se,err:()=>f,from:()=>Pe,fromNullable:()=>ve,fromPromise:()=>he,getStepTimeoutMeta:()=>oe,hydrate:()=>ie,isEarlyExit:()=>ue,isErr:()=>fe,isOk:()=>de,isSerializedResult:()=>Ye,isStepTimeoutError:()=>Q,isUnexpectedError:()=>re,map:()=>Me,mapError:()=>Ie,mapErrorTry:()=>Fe,mapTry:()=>je,match:()=>Oe,ok:()=>g,orElse:()=>Ve,orElseAsync:()=>Le,partition:()=>qe,recover:()=>We,recoverAsync:()=>Xe,run:()=>Z,tap:()=>De,tapError:()=>Ke,tryAsync:()=>_e,unwrap:()=>ge,unwrapOr:()=>Ae,unwrapOrElse:()=>be});module.exports=ke(Qe);var g=e=>({ok:!0,value:e}),f=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}}),de=e=>e.ok,fe=e=>!e.ok,re=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",D=Symbol.for("step_timeout_marker");function Q(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:D in e}function oe(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(D in e)return e[D]}}var ee=Symbol("early-exit");function se(e,t){return{[ee]:!0,error:e,meta:t}}function ue(e){return typeof e=="object"&&e!==null&&e[ee]===!0}var ae=Symbol("mapper-exception");function Re(e){return{[ae]:!0,thrown:e}}function Ce(e){return typeof e=="object"&&e!==null&&e[ae]===!0}function xe(e){return typeof e=="string"?{name:e}:e??{}}function H(e,t){let{backoff:n,initialDelay:a,maxDelay:w,jitter:A}=t,E;switch(n){case"fixed":E=a;break;case"linear":E=a*e;break;case"exponential":E=a*Math.pow(2,e-1);break}if(E=Math.min(E,w),A){let r=E*.25*Math.random();E=E+r}return Math.floor(E)}function z(e){return new Promise(t=>setTimeout(t,e))}var ne=Symbol("timeout");async function Se(e,t,n){let a=new AbortController,w=t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},A,E=new Promise((I,C)=>{A=setTimeout(()=>{a.abort(),C({[ne]:!0,error:w})},t.ms)}),r;t.signal?r=Promise.resolve(e(a.signal)):r=Promise.resolve(e());try{return await Promise.race([r,E])}catch(I){if(typeof I=="object"&&I!==null&&I[ne]===!0){let C=I.error;if(typeof C=="object"&&C!==null&&C.type!=="STEP_TIMEOUT"){let L={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};D in C?C[D]=L:Object.defineProperty(C,D,{value:L,enumerable:!1,writable:!0,configurable:!1})}throw C}throw I}finally{clearTimeout(A)}}var F={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Z(e,t){let{onError:n,onEvent:a,catchUnexpected:w,workflowId:A,context:E}=t&&typeof t=="object"?t:{},r=A??crypto.randomUUID(),I=!n&&!w,C=[],L=0,Y=o=>o??`step_${++L}`,y=o=>{let b=o.context!==void 0||E===void 0?o:{...o,context:E};if(b.type==="step_success"){let M=b.stepId;for(let K=C.length-1;K>=0;K--){let N=C[K];if(N.type==="race"&&!N.winnerId){N.winnerId=M;break}}}a?.(b,E)},O=se,te=o=>ue(o),$=(o,b)=>I?b?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o,...b.resultCause!==void 0?{cause:b.resultCause}:{}}}:b?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:o,thrown:b.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o}}:o,pe=o=>o.origin==="result"?o.resultCause:o.thrown,le=o=>({type:"UNEXPECTED_ERROR",cause:o.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:o.error,...o.meta.resultCause!==void 0?{cause:o.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:o.error,thrown:o.meta.thrown}});try{let b=function(T,p){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;C.push({scopeId:i,type:"parallel"});let x=()=>{if(u)return;u=!0;let c=C.findIndex(l=>l.scopeId===i);c!==-1&&C.splice(c,1),y({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};y({type:"scope_start",workflowId:r,scopeId:i,scopeType:"parallel",name:T,ts:Date.now()});try{let c=await p();if(x(),!c.ok)throw n?.(c.error,T,E),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw x(),c}})()},M=function(T,p){let i=Object.keys(T),s=p.name??`Parallel(${i.join(", ")})`,u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let x=performance.now(),c=!1;C.push({scopeId:u,type:"parallel"});let l=()=>{if(c)return;c=!0;let k=C.findIndex(R=>R.scopeId===u);k!==-1&&C.splice(k,1),y({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-x})};y({type:"scope_start",workflowId:r,scopeId:u,scopeType:"parallel",name:s,ts:Date.now()});try{let k=await new Promise(h=>{if(i.length===0){h([]);return}let _=!1,S=i.length,V=new Array(i.length);for(let v=0;v<i.length;v++){let j=i[v],J=v;Promise.resolve(T[j]()).catch(d=>f({type:"PROMISE_REJECTED",cause:d},{cause:{type:"PROMISE_REJECTION",reason:d}})).then(d=>{if(!_){if(!d.ok){_=!0,h([{key:j,result:d}]);return}V[J]={key:j,result:d},S--,S===0&&h(V)}})}});l();let R={};for(let{key:h,result:_}of k){if(!_.ok)throw n?.(_.error,h,E),O(_.error,{origin:"result",resultCause:_.cause});R[h]=_.value}return R}catch(k){throw l(),k}})()};var Ze=b,et=M;let o=(T,p)=>(async()=>{let i=xe(p),{name:s,key:u,retry:x,timeout:c}=i,l=Y(u),k=a,R=k?performance.now():0;if(!(typeof T=="function")){if(x&&x.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(c)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let S={attempts:Math.max(1,x?.attempts??1),backoff:x?.backoff??F.backoff,initialDelay:x?.initialDelay??F.initialDelay,maxDelay:x?.maxDelay??F.maxDelay,jitter:x?.jitter??F.jitter,retryOn:x?.retryOn??F.retryOn,onRetry:x?.onRetry??F.onRetry};a&&y({type:"step_start",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now()});let V;for(let d=1;d<=S.attempts;d++){let ce=k?performance.now():0;try{let m;if(typeof T=="function"?c?m=await Se(T,c,{name:s,key:u,attempt:d}):m=await T():m=await T,m.ok){let U=performance.now()-R;return y({type:"step_success",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:U,result:m}),m.value}if(V=m,d<S.attempts&&S.retryOn(m.error,d)){let U=H(d,S);y({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:d+1,maxAttempts:S.attempts,delayMs:U,error:m.error}),S.onRetry(m.error,d,U),await z(U);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-R,attempts:d,lastError:m.error});break}catch(m){let U=performance.now()-ce;if(te(m))throw y({type:"step_aborted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:U}),m;if(Q(m)){let P=oe(m),B=c?.ms??P?.timeoutMs??0;if(y({type:"step_timeout",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),timeoutMs:B,attempt:d}),d<S.attempts&&S.retryOn(m,d)){let q=H(d,S);y({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:d+1,maxAttempts:S.attempts,delayMs:q,error:m}),S.onRetry(m,d,q),await z(q);continue}S.attempts>1&&y({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-R,attempts:d,lastError:m})}if(d<S.attempts&&S.retryOn(m,d)){let P=H(d,S);y({type:"step_retry",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),attempt:d+1,maxAttempts:S.attempts,delayMs:P,error:m}),S.onRetry(m,d,P),await z(P);continue}S.attempts>1&&!Q(m)&&y({type:"step_retries_exhausted",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:performance.now()-R,attempts:d,lastError:m});let W=performance.now()-R;if(w){let P;try{P=w(m)}catch(B){throw Re(B)}throw y({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:W,error:P}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:W,result:f(P,{cause:m}),meta:{origin:"throw",thrown:m}}),n?.(P,s,E),O(P,{origin:"throw",thrown:m})}else{let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:m}};throw y({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:W,error:P}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:W,result:f(P,{cause:m}),meta:{origin:"throw",thrown:m}}),m}}}let v=V,j=performance.now()-R,J=$(v.error,{origin:"result",resultCause:v.cause});throw y({type:"step_error",workflowId:r,stepId:l,stepKey:u,name:s,ts:Date.now(),durationMs:j,error:J}),u&&y({type:"step_complete",workflowId:r,stepKey:u,name:s,ts:Date.now(),durationMs:j,result:v,meta:{origin:"result",resultCause:v.cause}}),n?.(v.error,s,E),O(v.error,{origin:"result",resultCause:v.cause})})();o.try=(T,p)=>{let i=p.name,s=p.key,u=Y(s),x="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&y({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});try{let k=await T(),R=performance.now()-l;return y({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:R}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:R,result:g(k)}),k}catch(k){let R=x(k),h=performance.now()-l,_=$(R,{origin:"throw",thrown:k});throw y({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:h,error:_}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:h,result:f(R,{cause:k}),meta:{origin:"throw",thrown:k}}),n?.(R,i,E),O(R,{origin:"throw",thrown:k})}})()},o.fromResult=(T,p)=>{let i=p.name,s=p.key,u=Y(s),x="error"in p?()=>p.error:p.onError,c=a;return(async()=>{let l=c?performance.now():0;a&&y({type:"step_start",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now()});let k=await T();if(k.ok){let R=performance.now()-l;return y({type:"step_success",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:R}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:R,result:g(k.value)}),k.value}else{let R=x(k.error),h=performance.now()-l,_=$(R,{origin:"result",resultCause:k.error});throw y({type:"step_error",workflowId:r,stepId:u,stepKey:s,name:i,ts:Date.now(),durationMs:h,error:_}),s&&y({type:"step_complete",workflowId:r,stepKey:s,name:i,ts:Date.now(),durationMs:h,result:f(R,{cause:k.error}),meta:{origin:"result",resultCause:k.error}}),n?.(R,i,E),O(R,{origin:"result",resultCause:k.error})}})()},o.retry=(T,p)=>o(T,{name:p.name,key:p.key,retry:{attempts:p.attempts,backoff:p.backoff,initialDelay:p.initialDelay,maxDelay:p.maxDelay,jitter:p.jitter,retryOn:p.retryOn,onRetry:p.onRetry},timeout:p.timeout}),o.withTimeout=(T,p)=>o(T,{name:p.name,key:p.key,timeout:p}),o.parallel=((...T)=>{if(typeof T[0]=="string"){let p=T[0],i=T[1];return b(p,i)}else{let p=T[0],i=T[1]??{};return M(p,i)}}),o.race=(T,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1,x={scopeId:i,type:"race",winnerId:void 0};C.push(x);let c=()=>{if(u)return;u=!0;let l=C.findIndex(k=>k.scopeId===i);l!==-1&&C.splice(l,1),y({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s,winnerId:x.winnerId})};y({type:"scope_start",workflowId:r,scopeId:i,scopeType:"race",name:T,ts:Date.now()});try{let l=await p();if(c(),!l.ok)throw n?.(l.error,T,E),O(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw c(),l}})()},o.allSettled=(T,p)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),u=!1;C.push({scopeId:i,type:"allSettled"});let x=()=>{if(u)return;u=!0;let c=C.findIndex(l=>l.scopeId===i);c!==-1&&C.splice(c,1),y({type:"scope_end",workflowId:r,scopeId:i,ts:Date.now(),durationMs:performance.now()-s})};y({type:"scope_start",workflowId:r,scopeId:i,scopeType:"allSettled",name:T,ts:Date.now()});try{let c=await p();if(x(),!c.ok)throw n?.(c.error,T,E),O(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw x(),c}})()};let N=await e(o);return g(N)}catch(o){if(Ce(o))throw o.thrown;if(te(o)){let M=pe(o.meta);if(w||n)return f(o.error,{cause:M});if(re(o.error))return f(o.error,{cause:M});let K=le(o);return f(K,{cause:M})}if(w){let M=w(o);return n?.(M,"unexpected",E),f(M,{cause:o})}let b={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:o}};return n?.(b,"unexpected",E),f(b,{cause:o})}}Z.strict=(e,t)=>Z(e,t);var X=class extends Error{constructor(n,a){super(`Unwrap called on an error result: ${String(n)}`);this.error=n;this.cause=a;this.name="UnwrapError"}},ge=e=>{if(e.ok)return e.value;throw new X(e.error,e.cause)},Ae=(e,t)=>e.ok?e.value:t,be=(e,t)=>e.ok?e.value:t(e.error,e.cause);function Pe(e,t){try{return g(e())}catch(n){return t?f(t(n),{cause:n}):f(n)}}async function he(e,t){try{return g(await e)}catch(n){return t?f(t(n),{cause:n}):f(n)}}async function _e(e,t){try{return g(await e())}catch(n){return t?f(t(n),{cause:n}):f(n)}}function ve(e,t){return e!=null?g(e):f(t())}function Me(e,t){return e.ok?g(t(e.value)):e}function Ie(e,t){return e.ok?e:f(t(e.error),{cause:e.cause})}function Oe(e,t){return e.ok?t.ok(e.value):t.err(e.error,e.cause)}function Ue(e,t){return e.ok?t(e.value):e}function De(e,t){return e.ok&&t(e.value),e}function Ke(e,t){return e.ok||t(e.error,e.cause),e}function je(e,t,n){if(!e.ok)return e;try{return g(t(e.value))}catch(a){return f(n(a),{cause:a})}}function Fe(e,t,n){if(e.ok)return e;try{return f(t(e.error),{cause:e.cause})}catch(a){return f(n(a),{cause:a})}}function Ne(e,t,n){return e.ok?g(t(e.value)):f(n(e.error),{cause:e.cause})}function Ve(e,t){return e.ok?e:t(e.error,e.cause)}async function Le(e,t){let n=await e;return n.ok?n:t(n.error,n.cause)}function We(e,t){return e.ok?g(e.value):g(t(e.error,e.cause))}async function Xe(e,t){let n=await e;return n.ok?g(n.value):g(await t(n.error,n.cause))}function ie(e){return e!==null&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&(e.ok===!0&&"value"in e||e.ok===!1&&"error"in e)?e:null}function Ye(e){return ie(e)!==null}function $e(e){let t=[];for(let n of e){if(!n.ok)return n;t.push(n.value)}return g(t)}async function Je(e){return e.length===0?g([]):new Promise(t=>{let n=!1,a=e.length,w=new Array(e.length);for(let A=0;A<e.length;A++){let E=A;Promise.resolve(e[E]).catch(r=>f({type:"PROMISE_REJECTED",cause:r},{cause:{type:"PROMISE_REJECTION",reason:r}})).then(r=>{if(!n){if(!r.ok){n=!0,t(r);return}w[E]=r.value,a--,a===0&&t(g(w))}})}})}function Be(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push({error:a.error,cause:a.cause});return n.length>0?f(n):g(t)}function qe(e){let t=[],n=[];for(let a of e)a.ok?t.push(a.value):n.push(a.error);return{values:t,errors:n}}function Ge(e){if(e.length===0)return f({type:"EMPTY_INPUT",message:"any() requires at least one Result"});let t=null;for(let n of e){if(n.ok)return n;t||(t=n)}return t}async function He(e){return e.length===0?f({type:"EMPTY_INPUT",message:"anyAsync() requires at least one Result"}):new Promise(t=>{let n=!1,a=e.length,w=null;for(let A of e)Promise.resolve(A).catch(E=>f({type:"PROMISE_REJECTED",cause:E},{cause:{type:"PROMISE_REJECTION",reason:E}})).then(E=>{if(!n){if(E.ok){n=!0,t(E);return}w||(w=E),a--,a===0&&t(w)}})})}async function ze(e){let t=await Promise.all(e.map(w=>Promise.resolve(w).then(A=>({status:"result",result:A})).catch(A=>({status:"rejected",error:{type:"PROMISE_REJECTED",cause:A},cause:{type:"PROMISE_REJECTION",reason:A}})))),n=[],a=[];for(let w of t)w.status==="rejected"?a.push({error:w.error,cause:w.cause}):w.result.ok?n.push(w.result.value):a.push({error:w.result.error,cause:w.result.cause});return a.length>0?f(a):g(n)}0&&(module.exports={EARLY_EXIT_SYMBOL,STEP_TIMEOUT_MARKER,UnwrapError,all,allAsync,allSettled,allSettledAsync,andThen,any,anyAsync,bimap,createEarlyExit,err,from,fromNullable,fromPromise,getStepTimeoutMeta,hydrate,isEarlyExit,isErr,isOk,isSerializedResult,isStepTimeoutError,isUnexpectedError,map,mapError,mapErrorTry,mapTry,match,ok,orElse,orElseAsync,partition,recover,recoverAsync,run,tap,tapError,tryAsync,unwrap,unwrapOr,unwrapOrElse});
2
2
  //# sourceMappingURL=core.cjs.map