awaitly 1.34.0 → 2.0.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 (241) hide show
  1. package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
  2. package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
  3. package/dist/errors-DtXvrCiO.d.cts +708 -0
  4. package/dist/errors-DtXvrCiO.d.ts +708 -0
  5. package/dist/index.cjs +4594 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +1970 -141
  8. package/dist/index.d.ts +1970 -141
  9. package/dist/index.js +4398 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/result.cjs +641 -1
  12. package/dist/result.cjs.map +1 -1
  13. package/dist/result.d.cts +35 -5
  14. package/dist/result.d.ts +35 -5
  15. package/dist/result.js +561 -1
  16. package/dist/result.js.map +1 -1
  17. package/dist/testing.cjs +4202 -8
  18. package/dist/testing.cjs.map +1 -1
  19. package/dist/testing.d.cts +2 -6
  20. package/dist/testing.d.ts +2 -6
  21. package/dist/testing.js +4154 -8
  22. package/dist/testing.js.map +1 -1
  23. package/dist/{run-entry-D2MmJFj9.d.cts → types-B8NfNRGX.d.ts} +1152 -1499
  24. package/dist/{run-entry-Dduz-is2.d.ts → types-BZ2f4MRR.d.cts} +1152 -1499
  25. package/dist/workflow.cjs +7096 -6
  26. package/dist/workflow.cjs.map +1 -1
  27. package/dist/workflow.d.cts +3346 -22
  28. package/dist/workflow.d.ts +3346 -22
  29. package/dist/workflow.js +6929 -6
  30. package/dist/workflow.js.map +1 -1
  31. package/package.json +13 -178
  32. package/dist/adapters.cjs +0 -7
  33. package/dist/adapters.cjs.map +0 -1
  34. package/dist/adapters.d.cts +0 -179
  35. package/dist/adapters.d.ts +0 -179
  36. package/dist/adapters.js +0 -7
  37. package/dist/adapters.js.map +0 -1
  38. package/dist/batch.cjs +0 -7
  39. package/dist/batch.cjs.map +0 -1
  40. package/dist/batch.d.cts +0 -200
  41. package/dist/batch.d.ts +0 -200
  42. package/dist/batch.js +0 -7
  43. package/dist/batch.js.map +0 -1
  44. package/dist/bind-deps.cjs +0 -2
  45. package/dist/bind-deps.cjs.map +0 -1
  46. package/dist/bind-deps.d.cts +0 -28
  47. package/dist/bind-deps.d.ts +0 -28
  48. package/dist/bind-deps.js +0 -2
  49. package/dist/bind-deps.js.map +0 -1
  50. package/dist/cache.cjs +0 -2
  51. package/dist/cache.cjs.map +0 -1
  52. package/dist/cache.d.cts +0 -269
  53. package/dist/cache.d.ts +0 -269
  54. package/dist/cache.js +0 -2
  55. package/dist/cache.js.map +0 -1
  56. package/dist/circuit-breaker.cjs +0 -7
  57. package/dist/circuit-breaker.cjs.map +0 -1
  58. package/dist/circuit-breaker.d.cts +0 -211
  59. package/dist/circuit-breaker.d.ts +0 -211
  60. package/dist/circuit-breaker.js +0 -7
  61. package/dist/circuit-breaker.js.map +0 -1
  62. package/dist/conditional.cjs +0 -2
  63. package/dist/conditional.cjs.map +0 -1
  64. package/dist/conditional.d.cts +0 -252
  65. package/dist/conditional.d.ts +0 -252
  66. package/dist/conditional.js +0 -2
  67. package/dist/conditional.js.map +0 -1
  68. package/dist/core.cjs +0 -7
  69. package/dist/core.cjs.map +0 -1
  70. package/dist/core.d.cts +0 -5
  71. package/dist/core.d.ts +0 -5
  72. package/dist/core.js +0 -7
  73. package/dist/core.js.map +0 -1
  74. package/dist/di-COl5oFnR.d.cts +0 -15
  75. package/dist/di-CyDj_JyZ.d.ts +0 -15
  76. package/dist/diagnostics.cjs +0 -8
  77. package/dist/diagnostics.cjs.map +0 -1
  78. package/dist/diagnostics.d.cts +0 -68
  79. package/dist/diagnostics.d.ts +0 -68
  80. package/dist/diagnostics.js +0 -8
  81. package/dist/diagnostics.js.map +0 -1
  82. package/dist/durable.cjs +0 -11
  83. package/dist/durable.cjs.map +0 -1
  84. package/dist/durable.d.cts +0 -9
  85. package/dist/durable.d.ts +0 -9
  86. package/dist/durable.js +0 -11
  87. package/dist/durable.js.map +0 -1
  88. package/dist/duration.cjs +0 -2
  89. package/dist/duration.cjs.map +0 -1
  90. package/dist/duration.js +0 -2
  91. package/dist/duration.js.map +0 -1
  92. package/dist/engine.cjs +0 -11
  93. package/dist/engine.cjs.map +0 -1
  94. package/dist/engine.d.cts +0 -115
  95. package/dist/engine.d.ts +0 -115
  96. package/dist/engine.js +0 -11
  97. package/dist/engine.js.map +0 -1
  98. package/dist/errors.cjs +0 -2
  99. package/dist/errors.cjs.map +0 -1
  100. package/dist/errors.d.cts +0 -361
  101. package/dist/errors.d.ts +0 -361
  102. package/dist/errors.js +0 -2
  103. package/dist/errors.js.map +0 -1
  104. package/dist/fetch.cjs +0 -7
  105. package/dist/fetch.cjs.map +0 -1
  106. package/dist/fetch.d.cts +0 -86
  107. package/dist/fetch.d.ts +0 -86
  108. package/dist/fetch.js +0 -7
  109. package/dist/fetch.js.map +0 -1
  110. package/dist/flow.cjs +0 -7
  111. package/dist/flow.cjs.map +0 -1
  112. package/dist/flow.d.cts +0 -163
  113. package/dist/flow.d.ts +0 -163
  114. package/dist/flow.js +0 -7
  115. package/dist/flow.js.map +0 -1
  116. package/dist/functional.cjs +0 -2
  117. package/dist/functional.cjs.map +0 -1
  118. package/dist/functional.d.cts +0 -444
  119. package/dist/functional.d.ts +0 -444
  120. package/dist/functional.js +0 -2
  121. package/dist/functional.js.map +0 -1
  122. package/dist/guards-BodHXLzX.d.cts +0 -72
  123. package/dist/guards-CeWoQ8fn.d.ts +0 -72
  124. package/dist/hitl-BPE_1UiM.d.cts +0 -468
  125. package/dist/hitl-byp570uC.d.ts +0 -468
  126. package/dist/hitl.cjs +0 -7
  127. package/dist/hitl.cjs.map +0 -1
  128. package/dist/hitl.d.cts +0 -442
  129. package/dist/hitl.d.ts +0 -442
  130. package/dist/hitl.js +0 -7
  131. package/dist/hitl.js.map +0 -1
  132. package/dist/index-BYT3amEz.d.ts +0 -417
  133. package/dist/index-C_ak66jy.d.cts +0 -417
  134. package/dist/match-entry-DjI2bLpD.d.cts +0 -209
  135. package/dist/match-entry-DjI2bLpD.d.ts +0 -209
  136. package/dist/match.cjs +0 -2
  137. package/dist/match.cjs.map +0 -1
  138. package/dist/match.d.cts +0 -1
  139. package/dist/match.d.ts +0 -1
  140. package/dist/match.js +0 -2
  141. package/dist/match.js.map +0 -1
  142. package/dist/otel.cjs +0 -2
  143. package/dist/otel.cjs.map +0 -1
  144. package/dist/otel.d.cts +0 -188
  145. package/dist/otel.d.ts +0 -188
  146. package/dist/otel.js +0 -2
  147. package/dist/otel.js.map +0 -1
  148. package/dist/persistence-entry-DOMx3woy.d.ts +0 -822
  149. package/dist/persistence-entry-ymCA4iDu.d.cts +0 -822
  150. package/dist/persistence.cjs +0 -2
  151. package/dist/persistence.cjs.map +0 -1
  152. package/dist/persistence.d.cts +0 -7
  153. package/dist/persistence.d.ts +0 -7
  154. package/dist/persistence.js +0 -2
  155. package/dist/persistence.js.map +0 -1
  156. package/dist/policies.cjs +0 -2
  157. package/dist/policies.cjs.map +0 -1
  158. package/dist/policies.d.cts +0 -379
  159. package/dist/policies.d.ts +0 -379
  160. package/dist/policies.js +0 -2
  161. package/dist/policies.js.map +0 -1
  162. package/dist/ratelimit.cjs +0 -7
  163. package/dist/ratelimit.cjs.map +0 -1
  164. package/dist/ratelimit.d.cts +0 -458
  165. package/dist/ratelimit.d.ts +0 -458
  166. package/dist/ratelimit.js +0 -7
  167. package/dist/ratelimit.js.map +0 -1
  168. package/dist/reliability.cjs +0 -11
  169. package/dist/reliability.cjs.map +0 -1
  170. package/dist/reliability.d.cts +0 -11
  171. package/dist/reliability.d.ts +0 -11
  172. package/dist/reliability.js +0 -11
  173. package/dist/reliability.js.map +0 -1
  174. package/dist/resolver.cjs +0 -7
  175. package/dist/resolver.cjs.map +0 -1
  176. package/dist/resolver.d.cts +0 -68
  177. package/dist/resolver.d.ts +0 -68
  178. package/dist/resolver.js +0 -7
  179. package/dist/resolver.js.map +0 -1
  180. package/dist/resource.cjs +0 -7
  181. package/dist/resource.cjs.map +0 -1
  182. package/dist/resource.d.cts +0 -174
  183. package/dist/resource.d.ts +0 -174
  184. package/dist/resource.js +0 -7
  185. package/dist/resource.js.map +0 -1
  186. package/dist/result/retry.cjs +0 -2
  187. package/dist/result/retry.cjs.map +0 -1
  188. package/dist/result/retry.d.cts +0 -70
  189. package/dist/result/retry.d.ts +0 -70
  190. package/dist/result/retry.js +0 -2
  191. package/dist/result/retry.js.map +0 -1
  192. package/dist/retry.cjs +0 -2
  193. package/dist/retry.cjs.map +0 -1
  194. package/dist/retry.d.cts +0 -388
  195. package/dist/retry.d.ts +0 -388
  196. package/dist/retry.js +0 -2
  197. package/dist/retry.js.map +0 -1
  198. package/dist/run.cjs +0 -7
  199. package/dist/run.cjs.map +0 -1
  200. package/dist/run.d.cts +0 -4
  201. package/dist/run.d.ts +0 -4
  202. package/dist/run.js +0 -7
  203. package/dist/run.js.map +0 -1
  204. package/dist/saga.cjs +0 -11
  205. package/dist/saga.cjs.map +0 -1
  206. package/dist/saga.d.cts +0 -164
  207. package/dist/saga.d.ts +0 -164
  208. package/dist/saga.js +0 -11
  209. package/dist/saga.js.map +0 -1
  210. package/dist/singleflight.cjs +0 -2
  211. package/dist/singleflight.cjs.map +0 -1
  212. package/dist/singleflight.d.cts +0 -145
  213. package/dist/singleflight.d.ts +0 -145
  214. package/dist/singleflight.js +0 -2
  215. package/dist/singleflight.js.map +0 -1
  216. package/dist/slugs.cjs +0 -2
  217. package/dist/slugs.cjs.map +0 -1
  218. package/dist/slugs.d.cts +0 -67
  219. package/dist/slugs.d.ts +0 -67
  220. package/dist/slugs.js +0 -2
  221. package/dist/slugs.js.map +0 -1
  222. package/dist/streaming.cjs +0 -9
  223. package/dist/streaming.cjs.map +0 -1
  224. package/dist/streaming.d.cts +0 -596
  225. package/dist/streaming.d.ts +0 -596
  226. package/dist/streaming.js +0 -9
  227. package/dist/streaming.js.map +0 -1
  228. package/dist/tagged-error.cjs +0 -2
  229. package/dist/tagged-error.cjs.map +0 -1
  230. package/dist/tagged-error.d.cts +0 -275
  231. package/dist/tagged-error.d.ts +0 -275
  232. package/dist/tagged-error.js +0 -2
  233. package/dist/tagged-error.js.map +0 -1
  234. package/dist/types-DQmzO9f4.d.ts +0 -323
  235. package/dist/types-qBUOYi-4.d.cts +0 -323
  236. package/dist/webhook.cjs +0 -7
  237. package/dist/webhook.cjs.map +0 -1
  238. package/dist/webhook.d.cts +0 -499
  239. package/dist/webhook.d.ts +0 -499
  240. package/dist/webhook.js +0 -7
  241. package/dist/webhook.js.map +0 -1
@@ -1,209 +0,0 @@
1
- /**
2
- * awaitly/match
3
- *
4
- * Exhaustive pattern matching for discriminated unions.
5
- * Extends the TaggedError.match pattern to work with any tagged union.
6
- *
7
- * @example
8
- * ```typescript
9
- * type Event =
10
- * | { _tag: 'UserCreated'; user: User }
11
- * | { _tag: 'UserUpdated'; userId: string }
12
- * | { _tag: 'UserDeleted'; userId: string }
13
- *
14
- * const message = Match.value(event)
15
- * .pipe(Match.tag("UserCreated", e => `Created: ${e.user.name}`))
16
- * .pipe(Match.tag("UserUpdated", e => `Updated: ${e.userId}`))
17
- * .pipe(Match.tag("UserDeleted", e => `Deleted: ${e.userId}`))
18
- * .pipe(Match.exhaustive)
19
- * ```
20
- */
21
- /**
22
- * Any object with a _tag discriminator.
23
- */
24
- type Tagged<Tag extends string = string> = {
25
- readonly _tag: Tag;
26
- };
27
- /**
28
- * Extract the tag from a tagged union member.
29
- */
30
- type TagOf<T extends Tagged> = T["_tag"];
31
- /**
32
- * Extract union members that match a specific tag.
33
- */
34
- type MatchTag<T extends Tagged, Tag extends string> = Extract<T, {
35
- _tag: Tag;
36
- }>;
37
- /**
38
- * A matcher that is accumulating handlers for a tagged union.
39
- *
40
- * @typeParam Input - The full union type being matched
41
- * @typeParam Remaining - Union members that haven't been handled yet
42
- * @typeParam Output - The output type (union of all handler return types)
43
- */
44
- interface Matcher<Input extends Tagged, Remaining extends Tagged, Output> {
45
- readonly _tag: "Matcher";
46
- readonly value: Input;
47
- readonly handlers: Map<string, (value: Tagged) => unknown>;
48
- readonly _remaining: Remaining;
49
- readonly _output: Output;
50
- }
51
- /**
52
- * Add a handler for a specific tag.
53
- *
54
- * @example
55
- * ```typescript
56
- * Match.value(event)
57
- * .pipe(Match.tag("UserCreated", e => e.user.name))
58
- * ```
59
- */
60
- declare function tag<Input extends Tagged, Remaining extends Tagged, Output, Tag extends TagOf<Remaining>, NewOutput>(tagValue: Tag, handler: (value: MatchTag<Remaining, Tag>) => NewOutput): (matcher: Matcher<Input, Remaining, Output>) => Matcher<Input, Exclude<Remaining, {
61
- _tag: Tag;
62
- }>, Output | NewOutput>;
63
- /**
64
- * Add handlers for multiple tags at once.
65
- *
66
- * @example
67
- * ```typescript
68
- * Match.value(event)
69
- * .pipe(Match.tags({
70
- * UserCreated: e => e.user.name,
71
- * UserUpdated: e => e.userId,
72
- * }))
73
- * ```
74
- */
75
- declare function tags<Input extends Tagged, Remaining extends Tagged, Output, Handlers extends {
76
- [K in TagOf<Remaining>]?: (value: MatchTag<Remaining, K>) => unknown;
77
- }>(handlers: Handlers): (matcher: Matcher<Input, Remaining, Output>) => Matcher<Input, Exclude<Remaining, {
78
- _tag: keyof Handlers;
79
- }>, Output | ReturnType<NonNullable<Handlers[keyof Handlers]>>>;
80
- /**
81
- * Complete the match, requiring all cases to be handled.
82
- * This is a compile-time check - if any cases are missing, TypeScript will error.
83
- *
84
- * @example
85
- * ```typescript
86
- * // TypeScript error if any tag is not handled
87
- * const result = Match.value(event)
88
- * .pipe(Match.tag("UserCreated", e => e.user))
89
- * .pipe(Match.tag("UserUpdated", e => e.userId))
90
- * .pipe(Match.tag("UserDeleted", e => e.userId))
91
- * .pipe(Match.exhaustive)
92
- * ```
93
- */
94
- declare function exhaustive<Input extends Tagged, Output>(matcher: Matcher<Input, never, Output>): Output;
95
- /**
96
- * Complete the match with a default handler for any remaining cases.
97
- *
98
- * @example
99
- * ```typescript
100
- * const result = Match.value(event)
101
- * .pipe(Match.tag("UserCreated", e => `Created: ${e.user.name}`))
102
- * .pipe(Match.orElse(e => `Other event: ${e._tag}`))
103
- * ```
104
- */
105
- declare function orElse<Input extends Tagged, Remaining extends Tagged, Output, DefaultOutput>(handler: (value: Remaining) => DefaultOutput): (matcher: Matcher<Input, Remaining, Output>) => Output | DefaultOutput;
106
- /**
107
- * Complete the match with a default value for any remaining cases.
108
- *
109
- * @example
110
- * ```typescript
111
- * const result = Match.value(event)
112
- * .pipe(Match.tag("UserCreated", e => e.user.name))
113
- * .pipe(Match.orElseValue("Unknown event"))
114
- * ```
115
- */
116
- declare function orElseValue<Input extends Tagged, Remaining extends Tagged, Output, DefaultOutput>(defaultValue: DefaultOutput): (matcher: Matcher<Input, Remaining, Output>) => Output | DefaultOutput;
117
- /**
118
- * Add a handler with an additional predicate.
119
- * The handler only runs if both the tag matches AND the predicate returns true.
120
- *
121
- * @example
122
- * ```typescript
123
- * Match.value(event)
124
- * .pipe(Match.when(
125
- * "UserCreated",
126
- * e => e.user.isAdmin,
127
- * e => `Admin created: ${e.user.name}`
128
- * ))
129
- * ```
130
- */
131
- declare function when<Input extends Tagged, Remaining extends Tagged, Output, Tag extends TagOf<Input>, NewOutput>(tagValue: Tag, predicate: (value: MatchTag<Input, Tag>) => boolean, handler: (value: MatchTag<Input, Tag>) => NewOutput): (matcher: Matcher<Input, Remaining, Output>) => Matcher<Input, Remaining, Output | NewOutput>;
132
- /**
133
- * Check if a tagged value has a specific tag.
134
- * Type guard that narrows the type.
135
- *
136
- * @example
137
- * ```typescript
138
- * if (Match.is("UserCreated")(event)) {
139
- * // event is narrowed to { _tag: 'UserCreated'; user: User }
140
- * console.log(event.user.name);
141
- * }
142
- * ```
143
- */
144
- declare function is<T extends Tagged, Tag extends string>(tagValue: Tag): (value: T) => value is Extract<T, {
145
- _tag: Tag;
146
- }>;
147
- /**
148
- * Check if a tagged value has one of several tags.
149
- *
150
- * @example
151
- * ```typescript
152
- * if (Match.isOneOf("UserCreated", "UserUpdated")(event)) {
153
- * // event is narrowed to UserCreated | UserUpdated
154
- * }
155
- * ```
156
- */
157
- declare function isOneOf<T extends Tagged, Tags extends TagOf<T>[]>(...tags: Tags): (value: T) => value is Extract<T, {
158
- _tag: Tags[number];
159
- }>;
160
- type PipedMatcher<Input extends Tagged, Remaining extends Tagged, Output> = Matcher<Input, Remaining, Output> & {
161
- pipe: <NewRemaining extends Tagged, NewOutput>(fn: (self: Matcher<Input, Remaining, Output>) => Matcher<Input, NewRemaining, NewOutput>) => PipedMatcher<Input, NewRemaining, NewOutput>;
162
- } & {
163
- pipe: <R>(fn: (self: Matcher<Input, Remaining, Output>) => R) => R;
164
- };
165
- /**
166
- * Start matching on a value (with pipe support).
167
- *
168
- * @example
169
- * ```typescript
170
- * const result = Match.value(event)
171
- * .pipe(Match.tag("Created", e => e.id))
172
- * .pipe(Match.exhaustive)
173
- * ```
174
- */
175
- declare function matchValue<T extends Tagged>(input: T): PipedMatcher<T, T, never>;
176
- /**
177
- * Match namespace for exhaustive pattern matching.
178
- *
179
- * @example
180
- * ```typescript
181
- * import { Match } from "awaitly";
182
- *
183
- * type Event =
184
- * | { _tag: 'Created'; id: string }
185
- * | { _tag: 'Updated'; id: string; data: unknown }
186
- * | { _tag: 'Deleted'; id: string }
187
- *
188
- * function handle(event: Event): string {
189
- * return Match.value(event)
190
- * .pipe(Match.tag("Created", e => `Created: ${e.id}`))
191
- * .pipe(Match.tag("Updated", e => `Updated: ${e.id}`))
192
- * .pipe(Match.tag("Deleted", e => `Deleted: ${e.id}`))
193
- * .pipe(Match.exhaustive)
194
- * }
195
- * ```
196
- */
197
- declare const Match: {
198
- readonly value: typeof matchValue;
199
- readonly tag: typeof tag;
200
- readonly tags: typeof tags;
201
- readonly when: typeof when;
202
- readonly exhaustive: typeof exhaustive;
203
- readonly orElse: typeof orElse;
204
- readonly orElseValue: typeof orElseValue;
205
- readonly is: typeof is;
206
- readonly isOneOf: typeof isOneOf;
207
- };
208
-
209
- export { Match as M, type Tagged as T, type MatchTag as a, type Matcher as b, is as c, tags as d, exhaustive as e, orElseValue as f, isOneOf as i, matchValue as m, orElse as o, tag as t, when as w };
package/dist/match.cjs DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var r=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var R=(e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})},_=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let u of M(t))!w.call(e,u)&&u!==n&&r(e,u,{get:()=>t[u],enumerable:!(a=m(t,u))||a.enumerable});return e};var v=e=>_(r({},"__esModule",{value:!0}),e);var k={};R(k,{Match:()=>f,exhaustive:()=>p,isOneOf:()=>o,isTag:()=>l,matchOrElse:()=>g,matchTag:()=>i,matchTags:()=>s,matchValue:()=>T,orElseValue:()=>d});module.exports=v(k);function i(e,t){return n=>{let a=new Map(n.handlers);return a.set(e,t),{_tag:"Matcher",value:n.value,handlers:a,_remaining:void 0,_output:void 0}}}function s(e){return t=>{let n=new Map(t.handlers);for(let[a,u]of Object.entries(e))u&&n.set(a,u);return{_tag:"Matcher",value:t.value,handlers:n,_remaining:void 0,_output:void 0}}}function p(e){let t=e.handlers.get(e.value._tag);if(!t)throw new Error(`No handler for tag: ${e.value._tag}`);return t(e.value)}function g(e){return t=>{let n=t.handlers.get(t.value._tag);return n?n(t.value):e(t.value)}}function d(e){return g(()=>e)}function I(e,t,n){return a=>{let u=new Map(a.handlers),c=a.handlers.get(e);return u.set(e,h=>{let O=h;if(t(O))return n(O);if(c)return c(h);throw new Error(`No handler matched for tag: ${e}`)}),{_tag:"Matcher",value:a.value,handlers:u,_remaining:a._remaining,_output:void 0}}}function l(e){return t=>t._tag===e}function o(...e){let t=new Set(e);return n=>t.has(n._tag)}function y(e){return typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="Matcher"}function x(e){return{...e,pipe(t){let n=t(e);return y(n)?x(n):n}}}function T(e){return x({_tag:"Matcher",value:e,handlers:new Map,_remaining:e,_output:void 0})}var f={value:T,tag:i,tags:s,when:I,exhaustive:p,orElse:g,orElseValue:d,is:l,isOneOf:o};0&&(module.exports={Match,exhaustive,isOneOf,isTag,matchOrElse,matchTag,matchTags,matchValue,orElseValue});
2
- //# sourceMappingURL=match.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/match-entry.ts","../src/match.ts"],"sourcesContent":["/**\n * awaitly/match\n *\n * Exhaustive pattern matching for tagged unions: type-safe switch statements.\n *\n * @example\n * ```typescript\n * import { Match } from 'awaitly/match';\n *\n * type Event = { _tag: 'Click'; x: number } | { _tag: 'Scroll'; y: number };\n *\n * const handle = (event: Event) => Match.value(event)({\n * Click: (e) => `Clicked at ${e.x}`,\n * Scroll: (e) => `Scrolled to ${e.y}`,\n * });\n * ```\n */\n\nexport {\n // Types\n type Tagged,\n type Matcher,\n\n // Namespace\n Match,\n\n // Individual exports\n matchValue,\n tag as matchTag,\n tags as matchTags,\n exhaustive,\n orElse as matchOrElse,\n orElseValue,\n is as isTag,\n isOneOf,\n} from \"./match\";\n","/**\n * awaitly/match\n *\n * Exhaustive pattern matching for discriminated unions.\n * Extends the TaggedError.match pattern to work with any tagged union.\n *\n * @example\n * ```typescript\n * type Event =\n * | { _tag: 'UserCreated'; user: User }\n * | { _tag: 'UserUpdated'; userId: string }\n * | { _tag: 'UserDeleted'; userId: string }\n *\n * const message = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => `Created: ${e.user.name}`))\n * .pipe(Match.tag(\"UserUpdated\", e => `Updated: ${e.userId}`))\n * .pipe(Match.tag(\"UserDeleted\", e => `Deleted: ${e.userId}`))\n * .pipe(Match.exhaustive)\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Any object with a _tag discriminator.\n */\nexport type Tagged<Tag extends string = string> = { readonly _tag: Tag };\n\n/**\n * Extract the tag from a tagged union member.\n */\nexport type TagOf<T extends Tagged> = T[\"_tag\"];\n\n/**\n * Extract union members that match a specific tag.\n */\nexport type MatchTag<T extends Tagged, Tag extends string> = Extract<T, { _tag: Tag }>;\n\n/**\n * A matcher that is accumulating handlers for a tagged union.\n *\n * @typeParam Input - The full union type being matched\n * @typeParam Remaining - Union members that haven't been handled yet\n * @typeParam Output - The output type (union of all handler return types)\n */\nexport interface Matcher<Input extends Tagged, Remaining extends Tagged, Output> {\n readonly _tag: \"Matcher\";\n readonly value: Input;\n readonly handlers: Map<string, (value: Tagged) => unknown>;\n readonly _remaining: Remaining;\n readonly _output: Output;\n}\n\n/**\n * A completed matcher that has handled all cases.\n */\nexport interface CompletedMatcher<Output> {\n readonly _tag: \"CompletedMatcher\";\n readonly result: Output;\n}\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n\n/**\n * Add a handler for a specific tag.\n *\n * @example\n * ```typescript\n * Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => e.user.name))\n * ```\n */\nexport function tag<\n Input extends Tagged,\n Remaining extends Tagged,\n Output,\n Tag extends TagOf<Remaining>,\n NewOutput,\n>(\n tagValue: Tag,\n handler: (value: MatchTag<Remaining, Tag>) => NewOutput\n): (\n matcher: Matcher<Input, Remaining, Output>\n) => Matcher<Input, Exclude<Remaining, { _tag: Tag }>, Output | NewOutput> {\n return (matcher) => {\n const newHandlers = new Map(matcher.handlers);\n newHandlers.set(tagValue, handler as (value: Tagged) => unknown);\n\n return {\n _tag: \"Matcher\",\n value: matcher.value,\n handlers: newHandlers,\n _remaining: undefined as unknown as Exclude<Remaining, { _tag: Tag }>,\n _output: undefined as unknown as Output | NewOutput,\n };\n };\n}\n\n/**\n * Add handlers for multiple tags at once.\n *\n * @example\n * ```typescript\n * Match.value(event)\n * .pipe(Match.tags({\n * UserCreated: e => e.user.name,\n * UserUpdated: e => e.userId,\n * }))\n * ```\n */\nexport function tags<\n Input extends Tagged,\n Remaining extends Tagged,\n Output,\n Handlers extends {\n [K in TagOf<Remaining>]?: (value: MatchTag<Remaining, K>) => unknown;\n },\n>(\n handlers: Handlers\n): (\n matcher: Matcher<Input, Remaining, Output>\n) => Matcher<\n Input,\n Exclude<Remaining, { _tag: keyof Handlers }>,\n Output | ReturnType<NonNullable<Handlers[keyof Handlers]>>\n> {\n return (matcher) => {\n const newHandlers = new Map(matcher.handlers);\n for (const [tagValue, handler] of Object.entries(handlers)) {\n if (handler) {\n newHandlers.set(tagValue, handler as (value: Tagged) => unknown);\n }\n }\n\n return {\n _tag: \"Matcher\",\n value: matcher.value,\n handlers: newHandlers,\n _remaining: undefined as unknown as Exclude<Remaining, { _tag: keyof Handlers }>,\n _output: undefined as unknown as Output | ReturnType<NonNullable<Handlers[keyof Handlers]>>,\n };\n };\n}\n\n/**\n * Complete the match, requiring all cases to be handled.\n * This is a compile-time check - if any cases are missing, TypeScript will error.\n *\n * @example\n * ```typescript\n * // TypeScript error if any tag is not handled\n * const result = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => e.user))\n * .pipe(Match.tag(\"UserUpdated\", e => e.userId))\n * .pipe(Match.tag(\"UserDeleted\", e => e.userId))\n * .pipe(Match.exhaustive)\n * ```\n */\nexport function exhaustive<Input extends Tagged, Output>(\n matcher: Matcher<Input, never, Output>\n): Output {\n const handler = matcher.handlers.get(matcher.value._tag);\n if (!handler) {\n throw new Error(`No handler for tag: ${matcher.value._tag}`);\n }\n return handler(matcher.value) as Output;\n}\n\n/**\n * Complete the match with a default handler for any remaining cases.\n *\n * @example\n * ```typescript\n * const result = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => `Created: ${e.user.name}`))\n * .pipe(Match.orElse(e => `Other event: ${e._tag}`))\n * ```\n */\nexport function orElse<Input extends Tagged, Remaining extends Tagged, Output, DefaultOutput>(\n handler: (value: Remaining) => DefaultOutput\n): (matcher: Matcher<Input, Remaining, Output>) => Output | DefaultOutput {\n return (matcher) => {\n const specificHandler = matcher.handlers.get(matcher.value._tag);\n if (specificHandler) {\n return specificHandler(matcher.value) as Output;\n }\n return handler(matcher.value as unknown as Remaining);\n };\n}\n\n/**\n * Complete the match with a default value for any remaining cases.\n *\n * @example\n * ```typescript\n * const result = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => e.user.name))\n * .pipe(Match.orElseValue(\"Unknown event\"))\n * ```\n */\nexport function orElseValue<Input extends Tagged, Remaining extends Tagged, Output, DefaultOutput>(\n defaultValue: DefaultOutput\n): (matcher: Matcher<Input, Remaining, Output>) => Output | DefaultOutput {\n return orElse(() => defaultValue);\n}\n\n// =============================================================================\n// Predicates & Guards\n// =============================================================================\n\n/**\n * Add a handler with an additional predicate.\n * The handler only runs if both the tag matches AND the predicate returns true.\n *\n * @example\n * ```typescript\n * Match.value(event)\n * .pipe(Match.when(\n * \"UserCreated\",\n * e => e.user.isAdmin,\n * e => `Admin created: ${e.user.name}`\n * ))\n * ```\n */\nexport function when<\n Input extends Tagged,\n Remaining extends Tagged,\n Output,\n Tag extends TagOf<Input>,\n NewOutput,\n>(\n tagValue: Tag,\n predicate: (value: MatchTag<Input, Tag>) => boolean,\n handler: (value: MatchTag<Input, Tag>) => NewOutput\n): (matcher: Matcher<Input, Remaining, Output>) => Matcher<Input, Remaining, Output | NewOutput> {\n return (matcher) => {\n const newHandlers = new Map(matcher.handlers);\n const existingHandler = matcher.handlers.get(tagValue);\n\n newHandlers.set(tagValue, (value: Tagged) => {\n const typedValue = value as MatchTag<Input, Tag>;\n if (predicate(typedValue)) {\n return handler(typedValue);\n }\n if (existingHandler) {\n return existingHandler(value);\n }\n throw new Error(`No handler matched for tag: ${tagValue}`);\n });\n\n return {\n _tag: \"Matcher\",\n value: matcher.value,\n handlers: newHandlers,\n _remaining: matcher._remaining,\n _output: undefined as unknown as Output | NewOutput,\n };\n };\n}\n\n// =============================================================================\n// Type Narrowing Utilities\n// =============================================================================\n\n/**\n * Check if a tagged value has a specific tag.\n * Type guard that narrows the type.\n *\n * @example\n * ```typescript\n * if (Match.is(\"UserCreated\")(event)) {\n * // event is narrowed to { _tag: 'UserCreated'; user: User }\n * console.log(event.user.name);\n * }\n * ```\n */\nexport function is<T extends Tagged, Tag extends string>(\n tagValue: Tag\n): (value: T) => value is Extract<T, { _tag: Tag }> {\n return (value): value is Extract<T, { _tag: Tag }> => value._tag === tagValue;\n}\n\n/**\n * Check if a tagged value has one of several tags.\n *\n * @example\n * ```typescript\n * if (Match.isOneOf(\"UserCreated\", \"UserUpdated\")(event)) {\n * // event is narrowed to UserCreated | UserUpdated\n * }\n * ```\n */\nexport function isOneOf<T extends Tagged, Tags extends TagOf<T>[]>(\n ...tags: Tags\n): (value: T) => value is Extract<T, { _tag: Tags[number] }> {\n const tagSet = new Set(tags);\n return (value): value is Extract<T, { _tag: Tags[number] }> =>\n tagSet.has(value._tag as Tags[number]);\n}\n\n// =============================================================================\n// Pipe Helper\n// =============================================================================\n\n/**\n * Type guard to check if a value is a Matcher.\n */\nfunction isMatcher(value: unknown): value is Matcher<Tagged, Tagged, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n (value as { _tag: unknown })._tag === \"Matcher\"\n );\n}\n\ntype PipedMatcher<Input extends Tagged, Remaining extends Tagged, Output> =\n Matcher<Input, Remaining, Output> & {\n pipe: <NewRemaining extends Tagged, NewOutput>(\n fn: (self: Matcher<Input, Remaining, Output>) => Matcher<Input, NewRemaining, NewOutput>\n ) => PipedMatcher<Input, NewRemaining, NewOutput>;\n } & {\n pipe: <R>(fn: (self: Matcher<Input, Remaining, Output>) => R) => R;\n };\n\nfunction addPipe<Input extends Tagged, Remaining extends Tagged, Output>(\n matcher: Matcher<Input, Remaining, Output>\n): PipedMatcher<Input, Remaining, Output> {\n return {\n ...matcher,\n pipe(fn: (self: Matcher<Input, Remaining, Output>) => unknown): unknown {\n const result = fn(matcher);\n // If result is a Matcher, add pipe to it too\n if (isMatcher(result)) {\n return addPipe(result as Matcher<Tagged, Tagged, unknown>);\n }\n return result;\n },\n } as PipedMatcher<Input, Remaining, Output>;\n}\n\n/**\n * Start matching on a value (with pipe support).\n *\n * @example\n * ```typescript\n * const result = Match.value(event)\n * .pipe(Match.tag(\"Created\", e => e.id))\n * .pipe(Match.exhaustive)\n * ```\n */\nexport function matchValue<T extends Tagged>(input: T): PipedMatcher<T, T, never> {\n const matcher: Matcher<T, T, never> = {\n _tag: \"Matcher\",\n value: input,\n handlers: new Map(),\n _remaining: input as T,\n _output: undefined as never,\n };\n\n return addPipe(matcher);\n}\n\n// =============================================================================\n// Namespace Export\n// =============================================================================\n\n/**\n * Match namespace for exhaustive pattern matching.\n *\n * @example\n * ```typescript\n * import { Match } from \"awaitly\";\n *\n * type Event =\n * | { _tag: 'Created'; id: string }\n * | { _tag: 'Updated'; id: string; data: unknown }\n * | { _tag: 'Deleted'; id: string }\n *\n * function handle(event: Event): string {\n * return Match.value(event)\n * .pipe(Match.tag(\"Created\", e => `Created: ${e.id}`))\n * .pipe(Match.tag(\"Updated\", e => `Updated: ${e.id}`))\n * .pipe(Match.tag(\"Deleted\", e => `Deleted: ${e.id}`))\n * .pipe(Match.exhaustive)\n * }\n * ```\n */\nexport const Match = {\n value: matchValue,\n tag,\n tags,\n when,\n exhaustive,\n orElse,\n orElseValue,\n is,\n isOneOf,\n} as const;\n"],"mappings":"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","names":["match_entry_exports","__export","Match","exhaustive","isOneOf","is","orElse","tag","tags","matchValue","orElseValue","__toCommonJS","tag","tagValue","handler","matcher","newHandlers","tags","handlers","exhaustive","orElse","specificHandler","orElseValue","defaultValue","when","predicate","existingHandler","value","typedValue","is","isOneOf","tagSet","isMatcher","addPipe","fn","result","matchValue","input","Match"]}
package/dist/match.d.cts DELETED
@@ -1 +0,0 @@
1
- export { M as Match, b as Matcher, T as Tagged, e as exhaustive, i as isOneOf, c as isTag, o as matchOrElse, t as matchTag, d as matchTags, m as matchValue, f as orElseValue } from './match-entry-DjI2bLpD.cjs';
package/dist/match.d.ts DELETED
@@ -1 +0,0 @@
1
- export { M as Match, b as Matcher, T as Tagged, e as exhaustive, i as isOneOf, c as isTag, o as matchOrElse, t as matchTag, d as matchTags, m as matchValue, f as orElseValue } from './match-entry-DjI2bLpD.js';
package/dist/match.js DELETED
@@ -1,2 +0,0 @@
1
- function p(e,t){return n=>{let a=new Map(n.handlers);return a.set(e,t),{_tag:"Matcher",value:n.value,handlers:a,_remaining:void 0,_output:void 0}}}function d(e){return t=>{let n=new Map(t.handlers);for(let[a,u]of Object.entries(e))u&&n.set(a,u);return{_tag:"Matcher",value:t.value,handlers:n,_remaining:void 0,_output:void 0}}}function l(e){let t=e.handlers.get(e.value._tag);if(!t)throw new Error(`No handler for tag: ${e.value._tag}`);return t(e.value)}function g(e){return t=>{let n=t.handlers.get(t.value._tag);return n?n(t.value):e(t.value)}}function o(e){return g(()=>e)}function x(e,t,n){return a=>{let u=new Map(a.handlers),r=a.handlers.get(e);return u.set(e,i=>{let s=i;if(t(s))return n(s);if(r)return r(i);throw new Error(`No handler matched for tag: ${e}`)}),{_tag:"Matcher",value:a.value,handlers:u,_remaining:a._remaining,_output:void 0}}}function T(e){return t=>t._tag===e}function c(...e){let t=new Set(e);return n=>t.has(n._tag)}function f(e){return typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="Matcher"}function h(e){return{...e,pipe(t){let n=t(e);return f(n)?h(n):n}}}function O(e){return h({_tag:"Matcher",value:e,handlers:new Map,_remaining:e,_output:void 0})}var m={value:O,tag:p,tags:d,when:x,exhaustive:l,orElse:g,orElseValue:o,is:T,isOneOf:c};export{m as Match,l as exhaustive,c as isOneOf,T as isTag,g as matchOrElse,p as matchTag,d as matchTags,O as matchValue,o as orElseValue};
2
- //# sourceMappingURL=match.js.map
package/dist/match.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/match.ts"],"sourcesContent":["/**\n * awaitly/match\n *\n * Exhaustive pattern matching for discriminated unions.\n * Extends the TaggedError.match pattern to work with any tagged union.\n *\n * @example\n * ```typescript\n * type Event =\n * | { _tag: 'UserCreated'; user: User }\n * | { _tag: 'UserUpdated'; userId: string }\n * | { _tag: 'UserDeleted'; userId: string }\n *\n * const message = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => `Created: ${e.user.name}`))\n * .pipe(Match.tag(\"UserUpdated\", e => `Updated: ${e.userId}`))\n * .pipe(Match.tag(\"UserDeleted\", e => `Deleted: ${e.userId}`))\n * .pipe(Match.exhaustive)\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Any object with a _tag discriminator.\n */\nexport type Tagged<Tag extends string = string> = { readonly _tag: Tag };\n\n/**\n * Extract the tag from a tagged union member.\n */\nexport type TagOf<T extends Tagged> = T[\"_tag\"];\n\n/**\n * Extract union members that match a specific tag.\n */\nexport type MatchTag<T extends Tagged, Tag extends string> = Extract<T, { _tag: Tag }>;\n\n/**\n * A matcher that is accumulating handlers for a tagged union.\n *\n * @typeParam Input - The full union type being matched\n * @typeParam Remaining - Union members that haven't been handled yet\n * @typeParam Output - The output type (union of all handler return types)\n */\nexport interface Matcher<Input extends Tagged, Remaining extends Tagged, Output> {\n readonly _tag: \"Matcher\";\n readonly value: Input;\n readonly handlers: Map<string, (value: Tagged) => unknown>;\n readonly _remaining: Remaining;\n readonly _output: Output;\n}\n\n/**\n * A completed matcher that has handled all cases.\n */\nexport interface CompletedMatcher<Output> {\n readonly _tag: \"CompletedMatcher\";\n readonly result: Output;\n}\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n\n/**\n * Add a handler for a specific tag.\n *\n * @example\n * ```typescript\n * Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => e.user.name))\n * ```\n */\nexport function tag<\n Input extends Tagged,\n Remaining extends Tagged,\n Output,\n Tag extends TagOf<Remaining>,\n NewOutput,\n>(\n tagValue: Tag,\n handler: (value: MatchTag<Remaining, Tag>) => NewOutput\n): (\n matcher: Matcher<Input, Remaining, Output>\n) => Matcher<Input, Exclude<Remaining, { _tag: Tag }>, Output | NewOutput> {\n return (matcher) => {\n const newHandlers = new Map(matcher.handlers);\n newHandlers.set(tagValue, handler as (value: Tagged) => unknown);\n\n return {\n _tag: \"Matcher\",\n value: matcher.value,\n handlers: newHandlers,\n _remaining: undefined as unknown as Exclude<Remaining, { _tag: Tag }>,\n _output: undefined as unknown as Output | NewOutput,\n };\n };\n}\n\n/**\n * Add handlers for multiple tags at once.\n *\n * @example\n * ```typescript\n * Match.value(event)\n * .pipe(Match.tags({\n * UserCreated: e => e.user.name,\n * UserUpdated: e => e.userId,\n * }))\n * ```\n */\nexport function tags<\n Input extends Tagged,\n Remaining extends Tagged,\n Output,\n Handlers extends {\n [K in TagOf<Remaining>]?: (value: MatchTag<Remaining, K>) => unknown;\n },\n>(\n handlers: Handlers\n): (\n matcher: Matcher<Input, Remaining, Output>\n) => Matcher<\n Input,\n Exclude<Remaining, { _tag: keyof Handlers }>,\n Output | ReturnType<NonNullable<Handlers[keyof Handlers]>>\n> {\n return (matcher) => {\n const newHandlers = new Map(matcher.handlers);\n for (const [tagValue, handler] of Object.entries(handlers)) {\n if (handler) {\n newHandlers.set(tagValue, handler as (value: Tagged) => unknown);\n }\n }\n\n return {\n _tag: \"Matcher\",\n value: matcher.value,\n handlers: newHandlers,\n _remaining: undefined as unknown as Exclude<Remaining, { _tag: keyof Handlers }>,\n _output: undefined as unknown as Output | ReturnType<NonNullable<Handlers[keyof Handlers]>>,\n };\n };\n}\n\n/**\n * Complete the match, requiring all cases to be handled.\n * This is a compile-time check - if any cases are missing, TypeScript will error.\n *\n * @example\n * ```typescript\n * // TypeScript error if any tag is not handled\n * const result = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => e.user))\n * .pipe(Match.tag(\"UserUpdated\", e => e.userId))\n * .pipe(Match.tag(\"UserDeleted\", e => e.userId))\n * .pipe(Match.exhaustive)\n * ```\n */\nexport function exhaustive<Input extends Tagged, Output>(\n matcher: Matcher<Input, never, Output>\n): Output {\n const handler = matcher.handlers.get(matcher.value._tag);\n if (!handler) {\n throw new Error(`No handler for tag: ${matcher.value._tag}`);\n }\n return handler(matcher.value) as Output;\n}\n\n/**\n * Complete the match with a default handler for any remaining cases.\n *\n * @example\n * ```typescript\n * const result = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => `Created: ${e.user.name}`))\n * .pipe(Match.orElse(e => `Other event: ${e._tag}`))\n * ```\n */\nexport function orElse<Input extends Tagged, Remaining extends Tagged, Output, DefaultOutput>(\n handler: (value: Remaining) => DefaultOutput\n): (matcher: Matcher<Input, Remaining, Output>) => Output | DefaultOutput {\n return (matcher) => {\n const specificHandler = matcher.handlers.get(matcher.value._tag);\n if (specificHandler) {\n return specificHandler(matcher.value) as Output;\n }\n return handler(matcher.value as unknown as Remaining);\n };\n}\n\n/**\n * Complete the match with a default value for any remaining cases.\n *\n * @example\n * ```typescript\n * const result = Match.value(event)\n * .pipe(Match.tag(\"UserCreated\", e => e.user.name))\n * .pipe(Match.orElseValue(\"Unknown event\"))\n * ```\n */\nexport function orElseValue<Input extends Tagged, Remaining extends Tagged, Output, DefaultOutput>(\n defaultValue: DefaultOutput\n): (matcher: Matcher<Input, Remaining, Output>) => Output | DefaultOutput {\n return orElse(() => defaultValue);\n}\n\n// =============================================================================\n// Predicates & Guards\n// =============================================================================\n\n/**\n * Add a handler with an additional predicate.\n * The handler only runs if both the tag matches AND the predicate returns true.\n *\n * @example\n * ```typescript\n * Match.value(event)\n * .pipe(Match.when(\n * \"UserCreated\",\n * e => e.user.isAdmin,\n * e => `Admin created: ${e.user.name}`\n * ))\n * ```\n */\nexport function when<\n Input extends Tagged,\n Remaining extends Tagged,\n Output,\n Tag extends TagOf<Input>,\n NewOutput,\n>(\n tagValue: Tag,\n predicate: (value: MatchTag<Input, Tag>) => boolean,\n handler: (value: MatchTag<Input, Tag>) => NewOutput\n): (matcher: Matcher<Input, Remaining, Output>) => Matcher<Input, Remaining, Output | NewOutput> {\n return (matcher) => {\n const newHandlers = new Map(matcher.handlers);\n const existingHandler = matcher.handlers.get(tagValue);\n\n newHandlers.set(tagValue, (value: Tagged) => {\n const typedValue = value as MatchTag<Input, Tag>;\n if (predicate(typedValue)) {\n return handler(typedValue);\n }\n if (existingHandler) {\n return existingHandler(value);\n }\n throw new Error(`No handler matched for tag: ${tagValue}`);\n });\n\n return {\n _tag: \"Matcher\",\n value: matcher.value,\n handlers: newHandlers,\n _remaining: matcher._remaining,\n _output: undefined as unknown as Output | NewOutput,\n };\n };\n}\n\n// =============================================================================\n// Type Narrowing Utilities\n// =============================================================================\n\n/**\n * Check if a tagged value has a specific tag.\n * Type guard that narrows the type.\n *\n * @example\n * ```typescript\n * if (Match.is(\"UserCreated\")(event)) {\n * // event is narrowed to { _tag: 'UserCreated'; user: User }\n * console.log(event.user.name);\n * }\n * ```\n */\nexport function is<T extends Tagged, Tag extends string>(\n tagValue: Tag\n): (value: T) => value is Extract<T, { _tag: Tag }> {\n return (value): value is Extract<T, { _tag: Tag }> => value._tag === tagValue;\n}\n\n/**\n * Check if a tagged value has one of several tags.\n *\n * @example\n * ```typescript\n * if (Match.isOneOf(\"UserCreated\", \"UserUpdated\")(event)) {\n * // event is narrowed to UserCreated | UserUpdated\n * }\n * ```\n */\nexport function isOneOf<T extends Tagged, Tags extends TagOf<T>[]>(\n ...tags: Tags\n): (value: T) => value is Extract<T, { _tag: Tags[number] }> {\n const tagSet = new Set(tags);\n return (value): value is Extract<T, { _tag: Tags[number] }> =>\n tagSet.has(value._tag as Tags[number]);\n}\n\n// =============================================================================\n// Pipe Helper\n// =============================================================================\n\n/**\n * Type guard to check if a value is a Matcher.\n */\nfunction isMatcher(value: unknown): value is Matcher<Tagged, Tagged, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n (value as { _tag: unknown })._tag === \"Matcher\"\n );\n}\n\ntype PipedMatcher<Input extends Tagged, Remaining extends Tagged, Output> =\n Matcher<Input, Remaining, Output> & {\n pipe: <NewRemaining extends Tagged, NewOutput>(\n fn: (self: Matcher<Input, Remaining, Output>) => Matcher<Input, NewRemaining, NewOutput>\n ) => PipedMatcher<Input, NewRemaining, NewOutput>;\n } & {\n pipe: <R>(fn: (self: Matcher<Input, Remaining, Output>) => R) => R;\n };\n\nfunction addPipe<Input extends Tagged, Remaining extends Tagged, Output>(\n matcher: Matcher<Input, Remaining, Output>\n): PipedMatcher<Input, Remaining, Output> {\n return {\n ...matcher,\n pipe(fn: (self: Matcher<Input, Remaining, Output>) => unknown): unknown {\n const result = fn(matcher);\n // If result is a Matcher, add pipe to it too\n if (isMatcher(result)) {\n return addPipe(result as Matcher<Tagged, Tagged, unknown>);\n }\n return result;\n },\n } as PipedMatcher<Input, Remaining, Output>;\n}\n\n/**\n * Start matching on a value (with pipe support).\n *\n * @example\n * ```typescript\n * const result = Match.value(event)\n * .pipe(Match.tag(\"Created\", e => e.id))\n * .pipe(Match.exhaustive)\n * ```\n */\nexport function matchValue<T extends Tagged>(input: T): PipedMatcher<T, T, never> {\n const matcher: Matcher<T, T, never> = {\n _tag: \"Matcher\",\n value: input,\n handlers: new Map(),\n _remaining: input as T,\n _output: undefined as never,\n };\n\n return addPipe(matcher);\n}\n\n// =============================================================================\n// Namespace Export\n// =============================================================================\n\n/**\n * Match namespace for exhaustive pattern matching.\n *\n * @example\n * ```typescript\n * import { Match } from \"awaitly\";\n *\n * type Event =\n * | { _tag: 'Created'; id: string }\n * | { _tag: 'Updated'; id: string; data: unknown }\n * | { _tag: 'Deleted'; id: string }\n *\n * function handle(event: Event): string {\n * return Match.value(event)\n * .pipe(Match.tag(\"Created\", e => `Created: ${e.id}`))\n * .pipe(Match.tag(\"Updated\", e => `Updated: ${e.id}`))\n * .pipe(Match.tag(\"Deleted\", e => `Deleted: ${e.id}`))\n * .pipe(Match.exhaustive)\n * }\n * ```\n */\nexport const Match = {\n value: matchValue,\n tag,\n tags,\n when,\n exhaustive,\n orElse,\n orElseValue,\n is,\n isOneOf,\n} as const;\n"],"mappings":"AA6EO,SAASA,EAOdC,EACAC,EAGyE,CACzE,OAAQC,GAAY,CAClB,IAAMC,EAAc,IAAI,IAAID,EAAQ,QAAQ,EAC5C,OAAAC,EAAY,IAAIH,EAAUC,CAAqC,EAExD,CACL,KAAM,UACN,MAAOC,EAAQ,MACf,SAAUC,EACV,WAAY,OACZ,QAAS,MACX,CACF,CACF,CAcO,SAASC,EAQdC,EAOA,CACA,OAAQH,GAAY,CAClB,IAAMC,EAAc,IAAI,IAAID,EAAQ,QAAQ,EAC5C,OAAW,CAACF,EAAUC,CAAO,IAAK,OAAO,QAAQI,CAAQ,EACnDJ,GACFE,EAAY,IAAIH,EAAUC,CAAqC,EAInE,MAAO,CACL,KAAM,UACN,MAAOC,EAAQ,MACf,SAAUC,EACV,WAAY,OACZ,QAAS,MACX,CACF,CACF,CAgBO,SAASG,EACdJ,EACQ,CACR,IAAMD,EAAUC,EAAQ,SAAS,IAAIA,EAAQ,MAAM,IAAI,EACvD,GAAI,CAACD,EACH,MAAM,IAAI,MAAM,uBAAuBC,EAAQ,MAAM,IAAI,EAAE,EAE7D,OAAOD,EAAQC,EAAQ,KAAK,CAC9B,CAYO,SAASK,EACdN,EACwE,CACxE,OAAQC,GAAY,CAClB,IAAMM,EAAkBN,EAAQ,SAAS,IAAIA,EAAQ,MAAM,IAAI,EAC/D,OAAIM,EACKA,EAAgBN,EAAQ,KAAK,EAE/BD,EAAQC,EAAQ,KAA6B,CACtD,CACF,CAYO,SAASO,EACdC,EACwE,CACxE,OAAOH,EAAO,IAAMG,CAAY,CAClC,CAoBO,SAASC,EAOdX,EACAY,EACAX,EAC+F,CAC/F,OAAQC,GAAY,CAClB,IAAMC,EAAc,IAAI,IAAID,EAAQ,QAAQ,EACtCW,EAAkBX,EAAQ,SAAS,IAAIF,CAAQ,EAErD,OAAAG,EAAY,IAAIH,EAAWc,GAAkB,CAC3C,IAAMC,EAAaD,EACnB,GAAIF,EAAUG,CAAU,EACtB,OAAOd,EAAQc,CAAU,EAE3B,GAAIF,EACF,OAAOA,EAAgBC,CAAK,EAE9B,MAAM,IAAI,MAAM,+BAA+Bd,CAAQ,EAAE,CAC3D,CAAC,EAEM,CACL,KAAM,UACN,MAAOE,EAAQ,MACf,SAAUC,EACV,WAAYD,EAAQ,WACpB,QAAS,MACX,CACF,CACF,CAkBO,SAASc,EACdhB,EACkD,CAClD,OAAQc,GAA8CA,EAAM,OAASd,CACvE,CAYO,SAASiB,KACXb,EACwD,CAC3D,IAAMc,EAAS,IAAI,IAAId,CAAI,EAC3B,OAAQU,GACNI,EAAO,IAAIJ,EAAM,IAAoB,CACzC,CASA,SAASK,EAAUL,EAA2D,CAC5E,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,SAAUA,GACTA,EAA4B,OAAS,SAE1C,CAWA,SAASM,EACPlB,EACwC,CACxC,MAAO,CACL,GAAGA,EACH,KAAKmB,EAAmE,CACtE,IAAMC,EAASD,EAAGnB,CAAO,EAEzB,OAAIiB,EAAUG,CAAM,EACXF,EAAQE,CAA0C,EAEpDA,CACT,CACF,CACF,CAYO,SAASC,EAA6BC,EAAqC,CAShF,OAAOJ,EAR+B,CACpC,KAAM,UACN,MAAOI,EACP,SAAU,IAAI,IACd,WAAYA,EACZ,QAAS,MACX,CAEsB,CACxB,CA2BO,IAAMC,EAAQ,CACnB,MAAOF,EACP,IAAAxB,EACA,KAAAK,EACA,KAAAO,EACA,WAAAL,EACA,OAAAC,EACA,YAAAE,EACA,GAAAO,EACA,QAAAC,CACF","names":["tag","tagValue","handler","matcher","newHandlers","tags","handlers","exhaustive","orElse","specificHandler","orElseValue","defaultValue","when","predicate","existingHandler","value","typedValue","is","isOneOf","tagSet","isMatcher","addPipe","fn","result","matchValue","input","Match"]}
package/dist/otel.cjs DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var w=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var T=(a,s)=>{for(var n in s)w(a,n,{get:s[n],enumerable:!0})},I=(a,s,n,e)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of A(s))!$.call(a,r)&&r!==n&&w(a,r,{get:()=>s[r],enumerable:!(e=y(s,r))||e.enumerable});return a};var M=a=>I(w({},"__esModule",{value:!0}),a);var S={};T(S,{createAutotelAdapter:()=>m,createAutotelEventHandler:()=>k,withAutotelTracing:()=>g});module.exports=M(S);function m(a={}){let{serviceName:s="workflow",createStepSpans:n=!0,recordMetrics:e=!0,defaultAttributes:r={},recordRetryEvents:u=!0,markErrorsOnSpan:f=!0}=a,i={workflows:new Map,steps:new Map},o={stepDurations:[],retryCount:0,errorCount:0,cacheHits:0,cacheMisses:0,defaultAttributes:r};function d(t,p){return t?`${s}.${t}`:p?`${s}.step.${p}`:`${s}.step`}function b(t){switch(t.type){case"workflow_start":i.workflows.set(t.workflowId,{workflowId:t.workflowId,startTime:t.ts});break;case"workflow_success":case"workflow_error":i.workflows.get(t.workflowId)&&i.workflows.delete(t.workflowId),t.type==="workflow_error"&&f&&o.errorCount++;break;case"step_start":if(n){let p=t.stepId;i.steps.set(p,{workflowId:t.workflowId,stepId:p,stepKey:t.stepKey,name:t.name,startTime:t.ts,metadata:t.metadata})}break;case"step_success":case"step_error":if(n){let p=t.stepId,c=i.steps.get(p);if(c){if(i.steps.delete(p),e){let l={...Object.keys(r).length>0?r:{}};c.metadata&&(c.metadata.domain&&(l["step.domain"]=c.metadata.domain),c.metadata.owner&&(l["step.owner"]=c.metadata.owner),c.metadata.intent&&c.metadata.intent.length<=100&&(l["step.intent"]=c.metadata.intent)),t.type==="step_error"&&t.diagnostics&&(t.diagnostics.classification?.severity&&(l["error.severity"]=t.diagnostics.classification.severity),t.diagnostics.classification?.retryable!==void 0&&(l["error.retryable"]=t.diagnostics.classification.retryable)),o.stepDurations.push({name:d(c.name,c.stepKey),durationMs:t.durationMs,success:t.type==="step_success",attributes:Object.keys(l).length>0?l:void 0})}t.type==="step_error"&&f&&o.errorCount++}}break;case"step_retry":u&&o.retryCount++;break;case"step_cache_hit":o.cacheHits++;break;case"step_cache_miss":o.cacheMisses++;break;default:break}}return{handleEvent:b,getActiveSpansCount(){return{workflows:i.workflows.size,steps:i.steps.size}},getMetrics(){return{...o,stepDurations:[...o.stepDurations]}},reset(){i.workflows.clear(),i.steps.clear(),o.stepDurations.length=0,o.retryCount=0,o.errorCount=0,o.cacheHits=0,o.cacheMisses=0}}}function k(a){let{serviceName:s="workflow",includeStepDetails:n=!0}=a??{};return e=>{if(process.env.AUTOTEL_DEBUG==="true"){let r=`[${s}]`;switch(e.type){case"workflow_start":console.log(`${r} Workflow started: ${e.workflowId}`);break;case"workflow_success":console.log(`${r} Workflow success: ${e.workflowId} (${e.durationMs}ms)`);break;case"workflow_error":console.log(`${r} Workflow error: ${e.workflowId}`,e.error);break;case"step_start":n&&console.log(`${r} Step started: ${e.name??e.stepKey??e.stepId}`);break;case"step_success":n&&console.log(`${r} Step success: ${e.name??e.stepKey??e.stepId} (${e.durationMs}ms)`);break;case"step_error":n&&console.log(`${r} Step error: ${e.name??e.stepKey??e.stepId}`,e.error);break;case"step_retry":console.log(`${r} Step retry: ${e.name??e.stepKey??e.stepId} (attempt ${e.attempt}/${e.maxAttempts})`);break}}}}function g(a,s){let{serviceName:n="workflow"}=s??{};return async(e,r,u)=>{let f=`${n}.${e}`;return a(f,async i=>{if(u)for(let[o,d]of Object.entries(u))i.setAttribute(o,d);return r()})}}0&&(module.exports={createAutotelAdapter,createAutotelEventHandler,withAutotelTracing});
2
- //# sourceMappingURL=otel.cjs.map
package/dist/otel.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/otel-entry.ts","../src/autotel.ts"],"sourcesContent":["/**\n * awaitly/otel\n *\n * OpenTelemetry integration: automatic tracing, metrics, and spans\n * for workflow execution with zero configuration.\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter, withAutotelTracing } from 'awaitly/otel';\n * import { trace } from '@opentelemetry/api';\n *\n * const tracer = trace.getTracer('my-service');\n * const adapter = createAutotelAdapter({ tracer });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: adapter.handleEvent,\n * });\n *\n * // Or wrap individual operations\n * const tracedFetch = withAutotelTracing(fetchUser, { tracer, name: 'fetchUser' });\n * ```\n */\n\nexport {\n // Types\n type AutotelAdapterConfig,\n type AutotelMetrics,\n type AutotelAdapter,\n type AutotelTraceFn,\n\n // Functions\n createAutotelAdapter,\n createAutotelEventHandler,\n withAutotelTracing,\n} from \"./autotel\";\n","/**\n * Autotel Integration\n *\n * First-class OpenTelemetry spans and metrics from the workflow event stream\n * using the autotel library.\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter } from 'awaitly/autotel';\n * import { init } from 'autotel';\n *\n * // Initialize autotel\n * init({ service: 'checkout-api' });\n *\n * // Create adapter\n * const otel = createAutotelAdapter({ serviceName: 'checkout' });\n *\n * // Use with workflow\n * const workflow = createWorkflow(deps, { onEvent: otel.handleEvent });\n *\n * // Automatic spans: workflow > step > retry attempts\n * // Automatic metrics: step_duration, retry_count, error_rate\n * ```\n */\n\nimport type { WorkflowEvent, StepMetadata } from \"./core\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Configuration for the autotel adapter.\n */\nexport interface AutotelAdapterConfig {\n /**\n * Service name for spans (used as prefix).\n */\n serviceName?: string;\n\n /**\n * Whether to create spans for each step.\n * @default true\n */\n createStepSpans?: boolean;\n\n /**\n * Whether to record metrics for steps.\n * @default true\n */\n recordMetrics?: boolean;\n\n /**\n * Custom attributes to add to all spans.\n */\n defaultAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Whether to record retry events as span events.\n * @default true\n */\n recordRetryEvents?: boolean;\n\n /**\n * Whether to mark workflow errors as span errors.\n * @default true\n */\n markErrorsOnSpan?: boolean;\n}\n\n/**\n * Span tracking info.\n */\ninterface SpanInfo {\n workflowId: string;\n stepId?: string;\n stepKey?: string;\n name?: string;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Active spans tracking.\n */\ninterface ActiveSpans {\n workflows: Map<string, SpanInfo>;\n steps: Map<string, SpanInfo>;\n}\n\n/**\n * Metrics collected by the adapter.\n */\nexport interface AutotelMetrics {\n stepDurations: Array<{ \n name: string; \n durationMs: number; \n success: boolean;\n attributes?: Record<string, string | number | boolean>;\n }>;\n retryCount: number;\n errorCount: number;\n cacheHits: number;\n cacheMisses: number;\n /** Default attributes applied to all metrics */\n defaultAttributes: Record<string, string | number | boolean>;\n}\n\n/**\n * Autotel adapter interface.\n */\nexport interface AutotelAdapter {\n /**\n * Handle workflow events (pass to onEvent option).\n */\n handleEvent: (event: WorkflowEvent<unknown>) => void;\n\n /**\n * Get current active spans count (for debugging).\n */\n getActiveSpansCount: () => { workflows: number; steps: number };\n\n /**\n * Get collected metrics.\n */\n getMetrics: () => AutotelMetrics;\n\n /**\n * Reset adapter state.\n */\n reset: () => void;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Create an autotel adapter for workflow observability.\n *\n * This adapter translates workflow events into metrics and tracking data.\n * When autotel is installed and initialized, it will also create OpenTelemetry spans.\n *\n * @param config - Adapter configuration\n * @returns An AutotelAdapter instance\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter } from 'awaitly/autotel';\n *\n * const otel = createAutotelAdapter({ serviceName: 'checkout' });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: otel.handleEvent,\n * });\n * ```\n */\nexport function createAutotelAdapter(\n config: AutotelAdapterConfig = {}\n): AutotelAdapter {\n const {\n serviceName = \"workflow\",\n createStepSpans = true,\n recordMetrics = true,\n defaultAttributes = {},\n recordRetryEvents = true,\n markErrorsOnSpan = true,\n } = config;\n\n // Track active spans\n const activeSpans: ActiveSpans = {\n workflows: new Map(),\n steps: new Map(),\n };\n\n // Metrics counters\n const metrics: AutotelMetrics = {\n stepDurations: [],\n retryCount: 0,\n errorCount: 0,\n cacheHits: 0,\n cacheMisses: 0,\n defaultAttributes,\n };\n\n /**\n * Get span name for a step.\n */\n function getSpanName(name?: string, stepKey?: string): string {\n if (name) return `${serviceName}.${name}`;\n if (stepKey) return `${serviceName}.step.${stepKey}`;\n return `${serviceName}.step`;\n }\n\n /**\n * Handle workflow event.\n */\n function handleEvent(event: WorkflowEvent<unknown>): void {\n switch (event.type) {\n case \"workflow_start\":\n activeSpans.workflows.set(event.workflowId, {\n workflowId: event.workflowId,\n startTime: event.ts,\n });\n break;\n\n case \"workflow_success\":\n case \"workflow_error\":\n {\n const span = activeSpans.workflows.get(event.workflowId);\n if (span) {\n activeSpans.workflows.delete(event.workflowId);\n }\n\n if (event.type === \"workflow_error\" && markErrorsOnSpan) {\n metrics.errorCount++;\n }\n }\n break;\n\n case \"step_start\":\n if (createStepSpans) {\n const stepId = event.stepId;\n activeSpans.steps.set(stepId, {\n workflowId: event.workflowId,\n stepId,\n stepKey: event.stepKey,\n name: event.name,\n startTime: event.ts,\n metadata: event.metadata,\n });\n }\n break;\n\n case \"step_success\":\n case \"step_error\":\n if (createStepSpans) {\n const stepId = event.stepId;\n const span = activeSpans.steps.get(stepId);\n if (span) {\n activeSpans.steps.delete(stepId);\n\n if (recordMetrics) {\n // Build attributes: default + low-cardinality metadata\n const attrs: Record<string, string | number | boolean> = {\n ...(Object.keys(defaultAttributes).length > 0 ? defaultAttributes : {}),\n };\n\n // Add low-cardinality metadata attributes (cardinality guardrails)\n if (span.metadata) {\n if (span.metadata.domain) attrs[\"step.domain\"] = span.metadata.domain;\n if (span.metadata.owner) attrs[\"step.owner\"] = span.metadata.owner;\n // step.intent only if <= 100 chars (cardinality guard)\n if (span.metadata.intent && span.metadata.intent.length <= 100) {\n attrs[\"step.intent\"] = span.metadata.intent;\n }\n // Omit step.tags and step.calls from span attributes (high cardinality)\n }\n\n // Add error diagnostics attributes\n if (event.type === \"step_error\" && event.diagnostics) {\n if (event.diagnostics.classification?.severity) {\n attrs[\"error.severity\"] = event.diagnostics.classification.severity;\n }\n if (event.diagnostics.classification?.retryable !== undefined) {\n attrs[\"error.retryable\"] = event.diagnostics.classification.retryable;\n }\n }\n\n metrics.stepDurations.push({\n name: getSpanName(span.name, span.stepKey),\n durationMs: event.durationMs,\n success: event.type === \"step_success\",\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n });\n }\n\n if (event.type === \"step_error\" && markErrorsOnSpan) {\n metrics.errorCount++;\n }\n }\n }\n break;\n\n case \"step_retry\":\n if (recordRetryEvents) {\n metrics.retryCount++;\n }\n break;\n\n case \"step_cache_hit\":\n metrics.cacheHits++;\n break;\n\n case \"step_cache_miss\":\n metrics.cacheMisses++;\n break;\n\n default:\n // Other events (timeout, etc.) - can be extended\n break;\n }\n }\n\n return {\n handleEvent,\n\n getActiveSpansCount() {\n return {\n workflows: activeSpans.workflows.size,\n steps: activeSpans.steps.size,\n };\n },\n\n getMetrics() {\n return { ...metrics, stepDurations: [...metrics.stepDurations] };\n },\n\n reset() {\n activeSpans.workflows.clear();\n activeSpans.steps.clear();\n metrics.stepDurations.length = 0;\n metrics.retryCount = 0;\n metrics.errorCount = 0;\n metrics.cacheHits = 0;\n metrics.cacheMisses = 0;\n // Note: defaultAttributes are preserved across resets\n },\n };\n}\n\n/**\n * Create an event handler that integrates with autotel's trace() function.\n *\n * This is a higher-level integration that creates actual OpenTelemetry spans\n * for each workflow and step when autotel is initialized.\n *\n * @param options - Configuration options\n * @returns An event handler function\n *\n * @example\n * ```typescript\n * import { createAutotelEventHandler } from 'awaitly/autotel';\n * import { init } from 'autotel';\n *\n * init({ service: 'checkout-api' });\n *\n * const handler = createAutotelEventHandler({ serviceName: 'checkout' });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: handler,\n * });\n * ```\n */\nexport function createAutotelEventHandler(options?: {\n serviceName?: string;\n includeStepDetails?: boolean;\n}): (event: WorkflowEvent<unknown>) => void {\n const { serviceName = \"workflow\", includeStepDetails = true } = options ?? {};\n\n // This is a simple pass-through handler\n // The actual autotel integration happens via the trace() wrapper\n return (event: WorkflowEvent<unknown>) => {\n // Log events for debugging when AUTOTEL_DEBUG is set\n if (process.env.AUTOTEL_DEBUG === \"true\") {\n const prefix = `[${serviceName}]`;\n switch (event.type) {\n case \"workflow_start\":\n console.log(`${prefix} Workflow started: ${event.workflowId}`);\n break;\n case \"workflow_success\":\n console.log(`${prefix} Workflow success: ${event.workflowId} (${event.durationMs}ms)`);\n break;\n case \"workflow_error\":\n console.log(`${prefix} Workflow error: ${event.workflowId}`, event.error);\n break;\n case \"step_start\":\n if (includeStepDetails) {\n console.log(`${prefix} Step started: ${event.name ?? event.stepKey ?? event.stepId}`);\n }\n break;\n case \"step_success\":\n if (includeStepDetails) {\n console.log(`${prefix} Step success: ${event.name ?? event.stepKey ?? event.stepId} (${event.durationMs}ms)`);\n }\n break;\n case \"step_error\":\n if (includeStepDetails) {\n console.log(`${prefix} Step error: ${event.name ?? event.stepKey ?? event.stepId}`, event.error);\n }\n break;\n case \"step_retry\":\n console.log(`${prefix} Step retry: ${event.name ?? event.stepKey ?? event.stepId} (attempt ${event.attempt}/${event.maxAttempts})`);\n break;\n }\n }\n };\n}\n\n/**\n * Wrapper type for autotel trace function.\n * Use this when you want to explicitly type the autotel integration.\n */\nexport type AutotelTraceFn = <T>(\n name: string,\n fn: (ctx: { setAttribute: (key: string, value: unknown) => void }) => T | Promise<T>\n) => T | Promise<T>;\n\n/**\n * Create a workflow wrapper that adds autotel tracing.\n *\n * This creates a higher-order function that wraps workflow execution\n * in an autotel trace span.\n *\n * @param traceFn - The autotel trace function\n * @param options - Wrapper options\n * @returns A workflow wrapper function\n *\n * @example\n * ```typescript\n * import { trace } from 'autotel';\n * import { withAutotelTracing } from 'awaitly/autotel';\n *\n * const traced = withAutotelTracing(trace, { serviceName: 'checkout' });\n *\n * const result = await traced('process-order', async () => {\n * return workflow(async ({ step }) => {\n * // ... workflow logic\n * });\n * });\n * ```\n */\nexport function withAutotelTracing(\n traceFn: AutotelTraceFn,\n options?: { serviceName?: string }\n): <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, string | number | boolean>\n) => Promise<T> {\n const { serviceName = \"workflow\" } = options ?? {};\n\n return async <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, string | number | boolean>\n ): Promise<T> => {\n const spanName = `${serviceName}.${name}`;\n return traceFn(spanName, async (ctx) => {\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n ctx.setAttribute(key, value);\n }\n }\n return fn();\n }) as Promise<T>;\n };\n}\n"],"mappings":"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","names":["otel_entry_exports","__export","createAutotelAdapter","createAutotelEventHandler","withAutotelTracing","__toCommonJS","createAutotelAdapter","config","serviceName","createStepSpans","recordMetrics","defaultAttributes","recordRetryEvents","markErrorsOnSpan","activeSpans","metrics","getSpanName","name","stepKey","handleEvent","event","stepId","span","attrs","createAutotelEventHandler","options","includeStepDetails","prefix","withAutotelTracing","traceFn","fn","attributes","spanName","ctx","key","value"]}
package/dist/otel.d.cts DELETED
@@ -1,188 +0,0 @@
1
- import { ag as WorkflowEvent } from './run-entry-D2MmJFj9.cjs';
2
- import './errors.cjs';
3
- import './tagged-error.cjs';
4
- import './slugs.cjs';
5
-
6
- /**
7
- * Autotel Integration
8
- *
9
- * First-class OpenTelemetry spans and metrics from the workflow event stream
10
- * using the autotel library.
11
- *
12
- * @example
13
- * ```typescript
14
- * import { createAutotelAdapter } from 'awaitly/autotel';
15
- * import { init } from 'autotel';
16
- *
17
- * // Initialize autotel
18
- * init({ service: 'checkout-api' });
19
- *
20
- * // Create adapter
21
- * const otel = createAutotelAdapter({ serviceName: 'checkout' });
22
- *
23
- * // Use with workflow
24
- * const workflow = createWorkflow(deps, { onEvent: otel.handleEvent });
25
- *
26
- * // Automatic spans: workflow > step > retry attempts
27
- * // Automatic metrics: step_duration, retry_count, error_rate
28
- * ```
29
- */
30
-
31
- /**
32
- * Configuration for the autotel adapter.
33
- */
34
- interface AutotelAdapterConfig {
35
- /**
36
- * Service name for spans (used as prefix).
37
- */
38
- serviceName?: string;
39
- /**
40
- * Whether to create spans for each step.
41
- * @default true
42
- */
43
- createStepSpans?: boolean;
44
- /**
45
- * Whether to record metrics for steps.
46
- * @default true
47
- */
48
- recordMetrics?: boolean;
49
- /**
50
- * Custom attributes to add to all spans.
51
- */
52
- defaultAttributes?: Record<string, string | number | boolean>;
53
- /**
54
- * Whether to record retry events as span events.
55
- * @default true
56
- */
57
- recordRetryEvents?: boolean;
58
- /**
59
- * Whether to mark workflow errors as span errors.
60
- * @default true
61
- */
62
- markErrorsOnSpan?: boolean;
63
- }
64
- /**
65
- * Metrics collected by the adapter.
66
- */
67
- interface AutotelMetrics {
68
- stepDurations: Array<{
69
- name: string;
70
- durationMs: number;
71
- success: boolean;
72
- attributes?: Record<string, string | number | boolean>;
73
- }>;
74
- retryCount: number;
75
- errorCount: number;
76
- cacheHits: number;
77
- cacheMisses: number;
78
- /** Default attributes applied to all metrics */
79
- defaultAttributes: Record<string, string | number | boolean>;
80
- }
81
- /**
82
- * Autotel adapter interface.
83
- */
84
- interface AutotelAdapter {
85
- /**
86
- * Handle workflow events (pass to onEvent option).
87
- */
88
- handleEvent: (event: WorkflowEvent<unknown>) => void;
89
- /**
90
- * Get current active spans count (for debugging).
91
- */
92
- getActiveSpansCount: () => {
93
- workflows: number;
94
- steps: number;
95
- };
96
- /**
97
- * Get collected metrics.
98
- */
99
- getMetrics: () => AutotelMetrics;
100
- /**
101
- * Reset adapter state.
102
- */
103
- reset: () => void;
104
- }
105
- /**
106
- * Create an autotel adapter for workflow observability.
107
- *
108
- * This adapter translates workflow events into metrics and tracking data.
109
- * When autotel is installed and initialized, it will also create OpenTelemetry spans.
110
- *
111
- * @param config - Adapter configuration
112
- * @returns An AutotelAdapter instance
113
- *
114
- * @example
115
- * ```typescript
116
- * import { createAutotelAdapter } from 'awaitly/autotel';
117
- *
118
- * const otel = createAutotelAdapter({ serviceName: 'checkout' });
119
- *
120
- * const workflow = createWorkflow(deps, {
121
- * onEvent: otel.handleEvent,
122
- * });
123
- * ```
124
- */
125
- declare function createAutotelAdapter(config?: AutotelAdapterConfig): AutotelAdapter;
126
- /**
127
- * Create an event handler that integrates with autotel's trace() function.
128
- *
129
- * This is a higher-level integration that creates actual OpenTelemetry spans
130
- * for each workflow and step when autotel is initialized.
131
- *
132
- * @param options - Configuration options
133
- * @returns An event handler function
134
- *
135
- * @example
136
- * ```typescript
137
- * import { createAutotelEventHandler } from 'awaitly/autotel';
138
- * import { init } from 'autotel';
139
- *
140
- * init({ service: 'checkout-api' });
141
- *
142
- * const handler = createAutotelEventHandler({ serviceName: 'checkout' });
143
- *
144
- * const workflow = createWorkflow(deps, {
145
- * onEvent: handler,
146
- * });
147
- * ```
148
- */
149
- declare function createAutotelEventHandler(options?: {
150
- serviceName?: string;
151
- includeStepDetails?: boolean;
152
- }): (event: WorkflowEvent<unknown>) => void;
153
- /**
154
- * Wrapper type for autotel trace function.
155
- * Use this when you want to explicitly type the autotel integration.
156
- */
157
- type AutotelTraceFn = <T>(name: string, fn: (ctx: {
158
- setAttribute: (key: string, value: unknown) => void;
159
- }) => T | Promise<T>) => T | Promise<T>;
160
- /**
161
- * Create a workflow wrapper that adds autotel tracing.
162
- *
163
- * This creates a higher-order function that wraps workflow execution
164
- * in an autotel trace span.
165
- *
166
- * @param traceFn - The autotel trace function
167
- * @param options - Wrapper options
168
- * @returns A workflow wrapper function
169
- *
170
- * @example
171
- * ```typescript
172
- * import { trace } from 'autotel';
173
- * import { withAutotelTracing } from 'awaitly/autotel';
174
- *
175
- * const traced = withAutotelTracing(trace, { serviceName: 'checkout' });
176
- *
177
- * const result = await traced('process-order', async () => {
178
- * return workflow(async ({ step }) => {
179
- * // ... workflow logic
180
- * });
181
- * });
182
- * ```
183
- */
184
- declare function withAutotelTracing(traceFn: AutotelTraceFn, options?: {
185
- serviceName?: string;
186
- }): <T>(name: string, fn: () => T | Promise<T>, attributes?: Record<string, string | number | boolean>) => Promise<T>;
187
-
188
- export { type AutotelAdapter, type AutotelAdapterConfig, type AutotelMetrics, type AutotelTraceFn, createAutotelAdapter, createAutotelEventHandler, withAutotelTracing };