@jagreehal/workflow 1.0.0 → 1.2.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
@@ -103,6 +103,92 @@ const result = await checkout(async (step) => {
103
103
  // result.error: 'UNAUTHORIZED' | 'ORDER_NOT_FOUND' | 'PAYMENT_FAILED' | UnexpectedError
104
104
  ```
105
105
 
106
+ ### Composing workflows
107
+
108
+ You can combine multiple workflows together. The error types automatically aggregate:
109
+
110
+ ```typescript
111
+ // Validation workflow
112
+ const validateEmail = async (email: string): AsyncResult<string, 'INVALID_EMAIL'> =>
113
+ email.includes('@') ? ok(email) : err('INVALID_EMAIL');
114
+
115
+ const validatePassword = async (pwd: string): AsyncResult<string, 'WEAK_PASSWORD'> =>
116
+ pwd.length >= 8 ? ok(pwd) : err('WEAK_PASSWORD');
117
+
118
+ const validationWorkflow = createWorkflow({ validateEmail, validatePassword });
119
+
120
+ // Checkout workflow (from example above)
121
+ const authenticate = async (token: string): AsyncResult<{ userId: string }, 'UNAUTHORIZED'> =>
122
+ token === 'valid' ? ok({ userId: 'user-1' }) : err('UNAUTHORIZED');
123
+
124
+ const fetchOrder = async (id: string): AsyncResult<{ total: number }, 'ORDER_NOT_FOUND'> =>
125
+ ok({ total: 99 });
126
+
127
+ const chargeCard = async (amount: number): AsyncResult<{ txId: string }, 'PAYMENT_FAILED'> =>
128
+ ok({ txId: 'tx-123' });
129
+
130
+ const checkoutWorkflow = createWorkflow({ authenticate, fetchOrder, chargeCard });
131
+
132
+ // Composed workflow: validation + checkout
133
+ // Include all dependencies from both workflows
134
+ const validateAndCheckout = createWorkflow({
135
+ validateEmail,
136
+ validatePassword,
137
+ authenticate,
138
+ fetchOrder,
139
+ chargeCard,
140
+ });
141
+
142
+ const result = await validateAndCheckout(async (step, deps) => {
143
+ // Run validation workflow as a step (workflows return AsyncResult)
144
+ const validated = await step(() => validationWorkflow(async (innerStep) => {
145
+ const email = await innerStep(deps.validateEmail('user@example.com'));
146
+ const password = await innerStep(deps.validatePassword('secret123'));
147
+ return { email, password };
148
+ }));
149
+
150
+ // Run checkout workflow as a step
151
+ const checkout = await step(() => checkoutWorkflow(async (innerStep) => {
152
+ const auth = await innerStep(deps.authenticate('valid'));
153
+ const order = await innerStep(deps.fetchOrder('order-1'));
154
+ const payment = await innerStep(deps.chargeCard(order.total));
155
+ return { userId: auth.userId, txId: payment.txId };
156
+ }));
157
+
158
+ return { validated, checkout };
159
+ });
160
+
161
+ // result.error: 'INVALID_EMAIL' | 'WEAK_PASSWORD' | 'UNAUTHORIZED' | 'ORDER_NOT_FOUND' | 'PAYMENT_FAILED' | UnexpectedError
162
+ // ↑ All error types from both workflows are automatically aggregated
163
+ ```
164
+
165
+ **Alternative approach**: You can also combine workflows by including all their dependencies in a single workflow:
166
+
167
+ ```typescript
168
+ // Simpler composition - combine all dependencies
169
+ const composed = createWorkflow({
170
+ validateEmail,
171
+ validatePassword,
172
+ authenticate,
173
+ fetchOrder,
174
+ chargeCard,
175
+ });
176
+
177
+ const result = await composed(async (step, deps) => {
178
+ // Validation steps
179
+ const email = await step(deps.validateEmail('user@example.com'));
180
+ const password = await step(deps.validatePassword('secret123'));
181
+
182
+ // Checkout steps
183
+ const auth = await step(deps.authenticate('valid'));
184
+ const order = await step(deps.fetchOrder('order-1'));
185
+ const payment = await step(deps.chargeCard(order.total));
186
+
187
+ return { email, password, userId: auth.userId, txId: payment.txId };
188
+ });
189
+ // Same error union: 'INVALID_EMAIL' | 'WEAK_PASSWORD' | 'UNAUTHORIZED' | 'ORDER_NOT_FOUND' | 'PAYMENT_FAILED' | UnexpectedError
190
+ ```
191
+
106
192
  ### Wrapping throwing APIs with step.try
107
193
 
108
194
  ```typescript
@@ -131,6 +217,33 @@ const result = await workflow(async (step) => {
131
217
  // result.error: 'NOT_FOUND' | 'FETCH_FAILED' | 'PARSE_FAILED' | UnexpectedError
132
218
  ```
133
219
 
220
+ ### Wrapping Result-returning functions with step.fromResult
221
+
222
+ When calling functions that return `Result<T, E>`, use `step.fromResult()` to map their typed errors:
223
+
224
+ ```typescript
225
+ // callProvider returns Result<Response, ProviderError>
226
+ const callProvider = async (input: string): AsyncResult<Response, ProviderError> => { ... };
227
+
228
+ const result = await workflow(async (step) => {
229
+ // step.fromResult gives you typed errors in onError (not unknown like step.try)
230
+ const response = await step.fromResult(
231
+ () => callProvider(input),
232
+ {
233
+ onError: (e) => ({
234
+ type: 'PROVIDER_FAILED' as const,
235
+ provider: e.provider, // TypeScript knows e is ProviderError
236
+ code: e.code,
237
+ })
238
+ }
239
+ );
240
+
241
+ return response;
242
+ });
243
+ ```
244
+
245
+ Unlike `step.try()` where `onError` receives `unknown`, `step.fromResult()` preserves the error type.
246
+
134
247
  ### Parallel operations
135
248
 
136
249
  ```typescript
@@ -163,12 +276,46 @@ if (result.ok) {
163
276
  | Function | What it does |
164
277
  |----------|--------------|
165
278
  | `createWorkflow(deps)` | Create workflow with auto-inferred error types |
279
+ | `run(callback, options)` | Execute workflow with manual error types |
166
280
  | `step(op())` | Unwrap Result or exit early |
167
281
  | `step.try(fn, { error })` | Catch throws/rejects → typed error |
282
+ | `step.fromResult(fn, { onError })` | Map Result errors with typed onError |
168
283
  | `ok(value)` / `err(error)` | Create Results |
169
284
  | `map`, `andThen`, `match` | Transform Results |
170
285
  | `allAsync`, `partition` | Batch operations |
171
286
 
287
+ ### Choosing Between run() and createWorkflow()
288
+
289
+ | Use Case | Recommendation |
290
+ |----------|----------------|
291
+ | Dependencies known at compile time | `createWorkflow()` |
292
+ | Dependencies passed as parameters | `run()` |
293
+ | Need step caching or resume | `createWorkflow()` |
294
+ | One-off workflow invocation | `run()` |
295
+ | Want automatic error inference | `createWorkflow()` |
296
+ | Error types known upfront | `run()` |
297
+
298
+ **`run()`** - Best for dynamic dependencies, testing, or lightweight workflows where you know the error types:
299
+
300
+ ```typescript
301
+ import { run } from '@jagreehal/workflow';
302
+
303
+ const result = await run<Output, 'NOT_FOUND' | 'FETCH_ERROR'>(
304
+ async (step) => {
305
+ const user = await step(fetchUser(userId)); // userId from parameter
306
+ return user;
307
+ },
308
+ { onError: (e) => console.log('Failed:', e) }
309
+ );
310
+ ```
311
+
312
+ **`createWorkflow()`** - Best for reusable workflows with static dependencies. Provides automatic error type inference:
313
+
314
+ ```typescript
315
+ const loadUser = createWorkflow({ fetchUser, fetchPosts });
316
+ // Error type computed automatically from deps
317
+ ```
318
+
172
319
  ### Import paths
173
320
 
174
321
  ```typescript
package/dist/core.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var h=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var Y=(e,n)=>{for(var r in n)h(e,r,{get:n[r],enumerable:!0})},J=(e,n,r,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of X(n))!W.call(e,s)&&s!==r&&h(e,s,{get:()=>n[s],enumerable:!(t=L(n,s))||t.enumerable});return e};var G=e=>J(h({},"__esModule",{value:!0}),e);var Ce={};Y(Ce,{EARLY_EXIT_SYMBOL:()=>U,UnwrapError:()=>P,all:()=>we,allAsync:()=>ye,allSettled:()=>Te,allSettledAsync:()=>fe,andThen:()=>ie,any:()=>Re,anyAsync:()=>de,createEarlyExit:()=>M,err:()=>u,from:()=>ne,fromNullable:()=>oe,fromPromise:()=>re,isEarlyExit:()=>K,isErr:()=>B,isOk:()=>q,isUnexpectedError:()=>O,map:()=>se,mapError:()=>ue,mapErrorTry:()=>pe,mapTry:()=>ce,match:()=>ae,ok:()=>p,partition:()=>ke,run:()=>S,tap:()=>le,tapError:()=>Ee,tryAsync:()=>te,unwrap:()=>Q,unwrapOr:()=>Z,unwrapOrElse:()=>ee});module.exports=G(Ce);var p=e=>({ok:!0,value:e}),u=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}}),q=e=>e.ok,B=e=>!e.ok,O=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",U=Symbol("early-exit");function M(e,n){return{[U]:!0,error:e,meta:n}}function K(e){return typeof e=="object"&&e!==null&&e[U]===!0}var F=Symbol("mapper-exception");function H(e){return{[F]:!0,thrown:e}}function $(e){return typeof e=="object"&&e!==null&&e[F]===!0}function z(e){return typeof e=="string"?{name:e}:e??{}}async function S(e,n){let{onError:r,onEvent:t,catchUnexpected:s,workflowId:T,context:k}=n&&typeof n=="object"?n:{},a=T??crypto.randomUUID(),N=!r&&!s,E=o=>{t?.(o,k)},g=M,_=o=>K(o),b=(o,R)=>N?R?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o,...R.resultCause!==void 0?{cause:R.resultCause}:{}}}:R?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:o,thrown:R.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:o}}:o,V=o=>o.origin==="result"?o.resultCause:o.thrown,D=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 o=(m,x)=>(async()=>{let{name:l,key:i}=z(x),v=t?performance.now():0;t&&E({type:"step_start",workflowId:a,stepKey:i,name:l,ts:Date.now()});let c;try{c=await(typeof m=="function"?m():m)}catch(y){let A=performance.now()-v;if(_(y))throw E({type:"step_aborted",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:A}),y;if(s){let C;try{C=s(y)}catch(j){throw H(j)}throw E({type:"step_error",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:A,error:C}),i&&E({type:"step_complete",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:A,result:u(C,{cause:y}),meta:{origin:"throw",thrown:y}}),r?.(C,l),g(C,{origin:"throw",thrown:y})}else{let C={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:y}};throw E({type:"step_error",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:A,error:C}),i&&E({type:"step_complete",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:A,result:u(C,{cause:y}),meta:{origin:"throw",thrown:y}}),y}}let w=performance.now()-v;if(c.ok)return E({type:"step_success",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:w}),i&&E({type:"step_complete",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:w,result:c}),c.value;let d=b(c.error,{origin:"result",resultCause:c.cause});throw E({type:"step_error",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:w,error:d}),i&&E({type:"step_complete",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:w,result:c,meta:{origin:"result",resultCause:c.cause}}),r?.(c.error,l),g(c.error,{origin:"result",resultCause:c.cause})})();o.try=(m,x)=>{let l=x.name,i=x.key,I="error"in x?()=>x.error:x.onError,v=t;return(async()=>{let c=v?performance.now():0;t&&E({type:"step_start",workflowId:a,stepKey:i,name:l,ts:Date.now()});try{let w=await m(),d=performance.now()-c;return E({type:"step_success",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:d}),i&&E({type:"step_complete",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:d,result:p(w)}),w}catch(w){let d=I(w),y=performance.now()-c,A=b(d,{origin:"throw",thrown:w});throw E({type:"step_error",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:y,error:A}),i&&E({type:"step_complete",workflowId:a,stepKey:i,name:l,ts:Date.now(),durationMs:y,result:u(d,{cause:w}),meta:{origin:"throw",thrown:w}}),r?.(d,l),g(d,{origin:"throw",thrown:w})}})()};let f=await e(o);return p(f)}catch(o){if($(o))throw o.thrown;if(_(o)){let f=V(o.meta);if(s||r)return u(o.error,{cause:f});if(O(o.error))return u(o.error,{cause:f});let m=D(o);return u(m,{cause:f})}if(s){let f=s(o);return r?.(f,"unexpected"),u(f,{cause:o})}let R={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:o}};return r?.(R,"unexpected"),u(R,{cause:o})}}S.strict=(e,n)=>S(e,n);var P=class extends Error{constructor(r,t){super(`Unwrap called on an error result: ${String(r)}`);this.error=r;this.cause=t;this.name="UnwrapError"}},Q=e=>{if(e.ok)return e.value;throw new P(e.error,e.cause)},Z=(e,n)=>e.ok?e.value:n,ee=(e,n)=>e.ok?e.value:n(e.error,e.cause);function ne(e,n){try{return p(e())}catch(r){return n?u(n(r),{cause:r}):u(r)}}async function re(e,n){try{return p(await e)}catch(r){return n?u(n(r),{cause:r}):u(r)}}async function te(e,n){try{return p(await e())}catch(r){return n?u(n(r),{cause:r}):u(r)}}function oe(e,n){return e!=null?p(e):u(n())}function se(e,n){return e.ok?p(n(e.value)):e}function ue(e,n){return e.ok?e:u(n(e.error),{cause:e.cause})}function ae(e,n){return e.ok?n.ok(e.value):n.err(e.error,e.cause)}function ie(e,n){return e.ok?n(e.value):e}function le(e,n){return e.ok&&n(e.value),e}function Ee(e,n){return e.ok||n(e.error,e.cause),e}function ce(e,n,r){if(!e.ok)return e;try{return p(n(e.value))}catch(t){return u(r(t),{cause:t})}}function pe(e,n,r){if(e.ok)return e;try{return u(n(e.error),{cause:e.cause})}catch(t){return u(r(t),{cause:t})}}function we(e){let n=[];for(let r of e){if(!r.ok)return r;n.push(r.value)}return p(n)}async function ye(e){return e.length===0?p([]):new Promise(n=>{let r=!1,t=e.length,s=new Array(e.length);for(let T=0;T<e.length;T++){let k=T;Promise.resolve(e[k]).catch(a=>u({type:"PROMISE_REJECTED",cause:a},{cause:{type:"PROMISE_REJECTION",reason:a}})).then(a=>{if(!r){if(!a.ok){r=!0,n(a);return}s[k]=a.value,t--,t===0&&n(p(s))}})}})}function Te(e){let n=[],r=[];for(let t of e)t.ok?n.push(t.value):r.push({error:t.error,cause:t.cause});return r.length>0?u(r):p(n)}function ke(e){let n=[],r=[];for(let t of e)t.ok?n.push(t.value):r.push(t.error);return{values:n,errors:r}}function Re(e){if(e.length===0)return u({type:"EMPTY_INPUT",message:"any() requires at least one Result"});let n=null;for(let r of e){if(r.ok)return r;n||(n=r)}return n}async function de(e){return e.length===0?u({type:"EMPTY_INPUT",message:"anyAsync() requires at least one Result"}):new Promise(n=>{let r=!1,t=e.length,s=null;for(let T of e)Promise.resolve(T).catch(k=>u({type:"PROMISE_REJECTED",cause:k},{cause:{type:"PROMISE_REJECTION",reason:k}})).then(k=>{if(!r){if(k.ok){r=!0,n(k);return}s||(s=k),t--,t===0&&n(s)}})})}async function fe(e){let n=await Promise.all(e.map(s=>Promise.resolve(s).then(T=>({status:"result",result:T})).catch(T=>({status:"rejected",error:{type:"PROMISE_REJECTED",cause:T},cause:{type:"PROMISE_REJECTION",reason:T}})))),r=[],t=[];for(let s of n)s.status==="rejected"?t.push({error:s.error,cause:s.cause}):s.result.ok?r.push(s.result.value):t.push({error:s.result.error,cause:s.result.cause});return t.length>0?u(t):p(r)}0&&(module.exports={EARLY_EXIT_SYMBOL,UnwrapError,all,allAsync,allSettled,allSettledAsync,andThen,any,anyAsync,createEarlyExit,err,from,fromNullable,fromPromise,isEarlyExit,isErr,isOk,isUnexpectedError,map,mapError,mapErrorTry,mapTry,match,ok,partition,run,tap,tapError,tryAsync,unwrap,unwrapOr,unwrapOrElse});
1
+ "use strict";var b=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var q=(e,n)=>{for(var t in n)b(e,t,{get:n[t],enumerable:!0})},B=(e,n,t,u)=>{if(n&&typeof n=="object"||typeof n=="function")for(let c of $(n))!G.call(e,c)&&c!==t&&b(e,c,{get:()=>n[c],enumerable:!(u=J(n,c))||u.enumerable});return e};var H=e=>B(b({},"__esModule",{value:!0}),e);var ge={};q(ge,{EARLY_EXIT_SYMBOL:()=>O,UnwrapError:()=>I,all:()=>de,allAsync:()=>Re,allSettled:()=>fe,allSettledAsync:()=>Ae,andThen:()=>Ee,any:()=>Ce,anyAsync:()=>xe,createEarlyExit:()=>F,err:()=>l,from:()=>se,fromNullable:()=>ie,fromPromise:()=>ue,isEarlyExit:()=>N,isErr:()=>Q,isOk:()=>z,isUnexpectedError:()=>D,map:()=>pe,mapError:()=>ce,mapErrorTry:()=>ke,mapTry:()=>Te,match:()=>le,ok:()=>f,partition:()=>me,run:()=>M,tap:()=>we,tapError:()=>ye,tryAsync:()=>ae,unwrap:()=>te,unwrapOr:()=>re,unwrapOrElse:()=>oe});module.exports=H(ge);var f=e=>({ok:!0,value:e}),l=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}}),z=e=>e.ok,Q=e=>!e.ok,D=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",O=Symbol("early-exit");function F(e,n){return{[O]:!0,error:e,meta:n}}function N(e){return typeof e=="object"&&e!==null&&e[O]===!0}var V=Symbol("mapper-exception");function Z(e){return{[V]:!0,thrown:e}}function ee(e){return typeof e=="object"&&e!==null&&e[V]===!0}function ne(e){return typeof e=="string"?{name:e}:e??{}}async function M(e,n){let{onError:t,onEvent:u,catchUnexpected:c,workflowId:C,context:A}=n&&typeof n=="object"?n:{},a=C??crypto.randomUUID(),j=!t&&!c,g=[],L=0,_=r=>r??`step_${++L}`,E=r=>{if(r.type==="step_success"){let S=r.stepId;for(let x=g.length-1;x>=0;x--){let T=g[x];if(T.type==="race"&&!T.winnerId){T.winnerId=S;break}}}u?.(r,A)},h=F,K=r=>N(r),U=(r,S)=>j?S?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r,...S.resultCause!==void 0?{cause:S.resultCause}:{}}}:S?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:r,thrown:S.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:r}}:r,X=r=>r.origin==="result"?r.resultCause:r.thrown,W=r=>({type:"UNEXPECTED_ERROR",cause:r.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:r.error,...r.meta.resultCause!==void 0?{cause:r.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:r.error,thrown:r.meta.thrown}});try{let r=(T,k)=>(async()=>{let{name:o,key:s}=ne(k),y=_(s),p=u?performance.now():0;u&&E({type:"step_start",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now()});let i;try{i=await(typeof T=="function"?T():T)}catch(R){let v=performance.now()-p;if(K(R))throw E({type:"step_aborted",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:v}),R;if(c){let P;try{P=c(R)}catch(Y){throw Z(Y)}throw E({type:"step_error",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:v,error:P}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:v,result:l(P,{cause:R}),meta:{origin:"throw",thrown:R}}),t?.(P,o),h(P,{origin:"throw",thrown:R})}else{let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:R}};throw E({type:"step_error",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:v,error:P}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:v,result:l(P,{cause:R}),meta:{origin:"throw",thrown:R}}),R}}let w=performance.now()-p;if(i.ok)return E({type:"step_success",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:w}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:w,result:i}),i.value;let d=U(i.error,{origin:"result",resultCause:i.cause});throw E({type:"step_error",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:w,error:d}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:w,result:i,meta:{origin:"result",resultCause:i.cause}}),t?.(i.error,o),h(i.error,{origin:"result",resultCause:i.cause})})();r.try=(T,k)=>{let o=k.name,s=k.key,y=_(s),m="error"in k?()=>k.error:k.onError,p=u;return(async()=>{let i=p?performance.now():0;u&&E({type:"step_start",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now()});try{let w=await T(),d=performance.now()-i;return E({type:"step_success",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:d}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:d,result:f(w)}),w}catch(w){let d=m(w),R=performance.now()-i,v=U(d,{origin:"throw",thrown:w});throw E({type:"step_error",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:R,error:v}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:R,result:l(d,{cause:w}),meta:{origin:"throw",thrown:w}}),t?.(d,o),h(d,{origin:"throw",thrown:w})}})()},r.fromResult=(T,k)=>{let o=k.name,s=k.key,y=_(s),m="error"in k?()=>k.error:k.onError,p=u;return(async()=>{let i=p?performance.now():0;u&&E({type:"step_start",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now()});let w=await T();if(w.ok){let d=performance.now()-i;return E({type:"step_success",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:d}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:d,result:f(w.value)}),w.value}else{let d=m(w.error),R=performance.now()-i,v=U(d,{origin:"result",resultCause:w.error});throw E({type:"step_error",workflowId:a,stepId:y,stepKey:s,name:o,ts:Date.now(),durationMs:R,error:v}),s&&E({type:"step_complete",workflowId:a,stepKey:s,name:o,ts:Date.now(),durationMs:R,result:l(d,{cause:w.error}),meta:{origin:"result",resultCause:w.error}}),t?.(d,o),h(d,{origin:"result",resultCause:w.error})}})()},r.parallel=(T,k)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),y=!1;g.push({scopeId:o,type:"parallel"});let m=()=>{if(y)return;y=!0;let p=g.findIndex(i=>i.scopeId===o);p!==-1&&g.splice(p,1),E({type:"scope_end",workflowId:a,scopeId:o,ts:Date.now(),durationMs:performance.now()-s})};E({type:"scope_start",workflowId:a,scopeId:o,scopeType:"parallel",name:T,ts:Date.now()});try{let p=await k();if(m(),!p.ok)throw t?.(p.error,T),h(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw m(),p}})()},r.race=(T,k)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),y=!1,m={scopeId:o,type:"race",winnerId:void 0};g.push(m);let p=()=>{if(y)return;y=!0;let i=g.findIndex(w=>w.scopeId===o);i!==-1&&g.splice(i,1),E({type:"scope_end",workflowId:a,scopeId:o,ts:Date.now(),durationMs:performance.now()-s,winnerId:m.winnerId})};E({type:"scope_start",workflowId:a,scopeId:o,scopeType:"race",name:T,ts:Date.now()});try{let i=await k();if(p(),!i.ok)throw t?.(i.error,T),h(i.error,{origin:"result",resultCause:i.cause});return i.value}catch(i){throw p(),i}})()},r.allSettled=(T,k)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),y=!1;g.push({scopeId:o,type:"allSettled"});let m=()=>{if(y)return;y=!0;let p=g.findIndex(i=>i.scopeId===o);p!==-1&&g.splice(p,1),E({type:"scope_end",workflowId:a,scopeId:o,ts:Date.now(),durationMs:performance.now()-s})};E({type:"scope_start",workflowId:a,scopeId:o,scopeType:"allSettled",name:T,ts:Date.now()});try{let p=await k();if(m(),!p.ok)throw t?.(p.error,T),h(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw m(),p}})()};let x=await e(r);return f(x)}catch(r){if(ee(r))throw r.thrown;if(K(r)){let x=X(r.meta);if(c||t)return l(r.error,{cause:x});if(D(r.error))return l(r.error,{cause:x});let T=W(r);return l(T,{cause:x})}if(c){let x=c(r);return t?.(x,"unexpected"),l(x,{cause:r})}let S={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}};return t?.(S,"unexpected"),l(S,{cause:r})}}M.strict=(e,n)=>M(e,n);var I=class extends Error{constructor(t,u){super(`Unwrap called on an error result: ${String(t)}`);this.error=t;this.cause=u;this.name="UnwrapError"}},te=e=>{if(e.ok)return e.value;throw new I(e.error,e.cause)},re=(e,n)=>e.ok?e.value:n,oe=(e,n)=>e.ok?e.value:n(e.error,e.cause);function se(e,n){try{return f(e())}catch(t){return n?l(n(t),{cause:t}):l(t)}}async function ue(e,n){try{return f(await e)}catch(t){return n?l(n(t),{cause:t}):l(t)}}async function ae(e,n){try{return f(await e())}catch(t){return n?l(n(t),{cause:t}):l(t)}}function ie(e,n){return e!=null?f(e):l(n())}function pe(e,n){return e.ok?f(n(e.value)):e}function ce(e,n){return e.ok?e:l(n(e.error),{cause:e.cause})}function le(e,n){return e.ok?n.ok(e.value):n.err(e.error,e.cause)}function Ee(e,n){return e.ok?n(e.value):e}function we(e,n){return e.ok&&n(e.value),e}function ye(e,n){return e.ok||n(e.error,e.cause),e}function Te(e,n,t){if(!e.ok)return e;try{return f(n(e.value))}catch(u){return l(t(u),{cause:u})}}function ke(e,n,t){if(e.ok)return e;try{return l(n(e.error),{cause:e.cause})}catch(u){return l(t(u),{cause:u})}}function de(e){let n=[];for(let t of e){if(!t.ok)return t;n.push(t.value)}return f(n)}async function Re(e){return e.length===0?f([]):new Promise(n=>{let t=!1,u=e.length,c=new Array(e.length);for(let C=0;C<e.length;C++){let A=C;Promise.resolve(e[A]).catch(a=>l({type:"PROMISE_REJECTED",cause:a},{cause:{type:"PROMISE_REJECTION",reason:a}})).then(a=>{if(!t){if(!a.ok){t=!0,n(a);return}c[A]=a.value,u--,u===0&&n(f(c))}})}})}function fe(e){let n=[],t=[];for(let u of e)u.ok?n.push(u.value):t.push({error:u.error,cause:u.cause});return t.length>0?l(t):f(n)}function me(e){let n=[],t=[];for(let u of e)u.ok?n.push(u.value):t.push(u.error);return{values:n,errors:t}}function Ce(e){if(e.length===0)return l({type:"EMPTY_INPUT",message:"any() requires at least one Result"});let n=null;for(let t of e){if(t.ok)return t;n||(n=t)}return n}async function xe(e){return e.length===0?l({type:"EMPTY_INPUT",message:"anyAsync() requires at least one Result"}):new Promise(n=>{let t=!1,u=e.length,c=null;for(let C of e)Promise.resolve(C).catch(A=>l({type:"PROMISE_REJECTED",cause:A},{cause:{type:"PROMISE_REJECTION",reason:A}})).then(A=>{if(!t){if(A.ok){t=!0,n(A);return}c||(c=A),u--,u===0&&n(c)}})})}async function Ae(e){let n=await Promise.all(e.map(c=>Promise.resolve(c).then(C=>({status:"result",result:C})).catch(C=>({status:"rejected",error:{type:"PROMISE_REJECTED",cause:C},cause:{type:"PROMISE_REJECTION",reason:C}})))),t=[],u=[];for(let c of n)c.status==="rejected"?u.push({error:c.error,cause:c.cause}):c.result.ok?t.push(c.result.value):u.push({error:c.result.error,cause:c.result.cause});return u.length>0?l(u):f(t)}0&&(module.exports={EARLY_EXIT_SYMBOL,UnwrapError,all,allAsync,allSettled,allSettledAsync,andThen,any,anyAsync,createEarlyExit,err,from,fromNullable,fromPromise,isEarlyExit,isErr,isOk,isUnexpectedError,map,mapError,mapErrorTry,mapTry,match,ok,partition,run,tap,tapError,tryAsync,unwrap,unwrapOr,unwrapOrElse});
2
2
  //# sourceMappingURL=core.cjs.map