@ontrails/core 1.0.0-beta.15 → 1.0.0-beta.16

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 (348) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +61 -16
  3. package/package.json +9 -8
  4. package/src/activation-provenance.ts +111 -0
  5. package/src/activation-source-compatibility.ts +430 -0
  6. package/src/activation-source-projection.ts +221 -0
  7. package/src/activation-source.ts +91 -0
  8. package/src/blob-ref.ts +51 -0
  9. package/src/context.ts +4 -0
  10. package/src/{internal/cross-batch.ts → cross-batch.ts} +3 -11
  11. package/src/detours.ts +8 -0
  12. package/src/draft.ts +4 -0
  13. package/src/error-projection.ts +51 -0
  14. package/src/errors.ts +192 -39
  15. package/src/execute.ts +443 -44
  16. package/src/fire.ts +965 -91
  17. package/src/index.ts +285 -38
  18. package/src/layer-projection.ts +192 -0
  19. package/src/layer.ts +32 -1
  20. package/src/observe.ts +361 -0
  21. package/src/permits.ts +12 -0
  22. package/src/redaction/patterns.ts +6 -3
  23. package/src/resilience.ts +8 -8
  24. package/src/resource-config.ts +477 -44
  25. package/src/resource.ts +21 -1
  26. package/src/result.ts +18 -0
  27. package/src/run.ts +2 -2
  28. package/src/schedule-runtime.ts +689 -0
  29. package/src/schedule.ts +324 -0
  30. package/src/serialization.ts +90 -57
  31. package/src/signal-diagnostics.ts +633 -0
  32. package/src/{internal/signal-ref.ts → signal-ref.ts} +1 -1
  33. package/src/signal.ts +37 -0
  34. package/src/store/accessor-protocol.ts +5 -5
  35. package/src/structured-examples.ts +245 -0
  36. package/src/surface-derivation.ts +91 -0
  37. package/src/surface-filter.ts +7 -13
  38. package/src/topo.ts +386 -6
  39. package/src/tracing.ts +345 -0
  40. package/src/trail.ts +168 -22
  41. package/src/trails/derive-trail.ts +1 -1
  42. package/src/trails/ingest.ts +7 -15
  43. package/src/{internal/trails-db.ts → trails-db.ts} +42 -21
  44. package/src/transport-error-map.ts +146 -28
  45. package/src/types.ts +82 -28
  46. package/src/validate-established-topo.ts +6 -0
  47. package/src/validate-topo.ts +212 -5
  48. package/src/validation.ts +58 -1
  49. package/src/webhook.ts +276 -0
  50. package/src/{internal/zod-wrappers.ts → zod-wrappers.ts} +0 -6
  51. package/.turbo/turbo-build.log +0 -1
  52. package/.turbo/turbo-lint.log +0 -3
  53. package/.turbo/turbo-typecheck.log +0 -1
  54. package/dist/blob-ref.d.ts +0 -20
  55. package/dist/blob-ref.d.ts.map +0 -1
  56. package/dist/blob-ref.js +0 -22
  57. package/dist/blob-ref.js.map +0 -1
  58. package/dist/branded.d.ts +0 -36
  59. package/dist/branded.d.ts.map +0 -1
  60. package/dist/branded.js +0 -89
  61. package/dist/branded.js.map +0 -1
  62. package/dist/collections.d.ts +0 -31
  63. package/dist/collections.d.ts.map +0 -1
  64. package/dist/collections.js +0 -60
  65. package/dist/collections.js.map +0 -1
  66. package/dist/context.d.ts +0 -22
  67. package/dist/context.d.ts.map +0 -1
  68. package/dist/context.js +0 -37
  69. package/dist/context.js.map +0 -1
  70. package/dist/contour.d.ts +0 -81
  71. package/dist/contour.d.ts.map +0 -1
  72. package/dist/contour.js +0 -176
  73. package/dist/contour.js.map +0 -1
  74. package/dist/cross-schema.d.ts +0 -18
  75. package/dist/cross-schema.d.ts.map +0 -1
  76. package/dist/cross-schema.js +0 -29
  77. package/dist/cross-schema.js.map +0 -1
  78. package/dist/derive.d.ts +0 -44
  79. package/dist/derive.d.ts.map +0 -1
  80. package/dist/derive.js +0 -149
  81. package/dist/derive.js.map +0 -1
  82. package/dist/draft.d.ts +0 -28
  83. package/dist/draft.d.ts.map +0 -1
  84. package/dist/draft.js +0 -157
  85. package/dist/draft.js.map +0 -1
  86. package/dist/errors.d.ts +0 -141
  87. package/dist/errors.d.ts.map +0 -1
  88. package/dist/errors.js +0 -185
  89. package/dist/errors.js.map +0 -1
  90. package/dist/execute.d.ts +0 -52
  91. package/dist/execute.d.ts.map +0 -1
  92. package/dist/execute.js +0 -511
  93. package/dist/execute.js.map +0 -1
  94. package/dist/fetch.d.ts +0 -15
  95. package/dist/fetch.d.ts.map +0 -1
  96. package/dist/fetch.js +0 -102
  97. package/dist/fetch.js.map +0 -1
  98. package/dist/fire.d.ts +0 -43
  99. package/dist/fire.d.ts.map +0 -1
  100. package/dist/fire.js +0 -185
  101. package/dist/fire.js.map +0 -1
  102. package/dist/guards.d.ts +0 -17
  103. package/dist/guards.d.ts.map +0 -1
  104. package/dist/guards.js +0 -25
  105. package/dist/guards.js.map +0 -1
  106. package/dist/index.d.ts +0 -59
  107. package/dist/index.d.ts.map +0 -1
  108. package/dist/index.js +0 -61
  109. package/dist/index.js.map +0 -1
  110. package/dist/internal/cross-batch.d.ts +0 -44
  111. package/dist/internal/cross-batch.d.ts.map +0 -1
  112. package/dist/internal/cross-batch.js +0 -58
  113. package/dist/internal/cross-batch.js.map +0 -1
  114. package/dist/internal/fork-ctx.d.ts +0 -41
  115. package/dist/internal/fork-ctx.d.ts.map +0 -1
  116. package/dist/internal/fork-ctx.js +0 -47
  117. package/dist/internal/fork-ctx.js.map +0 -1
  118. package/dist/internal/signal-ref.d.ts +0 -15
  119. package/dist/internal/signal-ref.d.ts.map +0 -1
  120. package/dist/internal/signal-ref.js +0 -41
  121. package/dist/internal/signal-ref.js.map +0 -1
  122. package/dist/internal/topo-saves.d.ts +0 -53
  123. package/dist/internal/topo-saves.d.ts.map +0 -1
  124. package/dist/internal/topo-saves.js +0 -449
  125. package/dist/internal/topo-saves.js.map +0 -1
  126. package/dist/internal/topo-snapshots.d.ts +0 -57
  127. package/dist/internal/topo-snapshots.d.ts.map +0 -1
  128. package/dist/internal/topo-snapshots.js +0 -372
  129. package/dist/internal/topo-snapshots.js.map +0 -1
  130. package/dist/internal/topo-store-read.d.ts +0 -70
  131. package/dist/internal/topo-store-read.d.ts.map +0 -1
  132. package/dist/internal/topo-store-read.js +0 -221
  133. package/dist/internal/topo-store-read.js.map +0 -1
  134. package/dist/internal/topo-store.d.ts +0 -26
  135. package/dist/internal/topo-store.d.ts.map +0 -1
  136. package/dist/internal/topo-store.js +0 -621
  137. package/dist/internal/topo-store.js.map +0 -1
  138. package/dist/internal/tracing.d.ts +0 -98
  139. package/dist/internal/tracing.d.ts.map +0 -1
  140. package/dist/internal/tracing.js +0 -102
  141. package/dist/internal/tracing.js.map +0 -1
  142. package/dist/internal/trails-db.d.ts +0 -16
  143. package/dist/internal/trails-db.d.ts.map +0 -1
  144. package/dist/internal/trails-db.js +0 -118
  145. package/dist/internal/trails-db.js.map +0 -1
  146. package/dist/internal/zod-wrappers.d.ts +0 -40
  147. package/dist/internal/zod-wrappers.d.ts.map +0 -1
  148. package/dist/internal/zod-wrappers.js +0 -59
  149. package/dist/internal/zod-wrappers.js.map +0 -1
  150. package/dist/layer.d.ts +0 -23
  151. package/dist/layer.d.ts.map +0 -1
  152. package/dist/layer.js +0 -21
  153. package/dist/layer.js.map +0 -1
  154. package/dist/path-security.d.ts +0 -28
  155. package/dist/path-security.d.ts.map +0 -1
  156. package/dist/path-security.js +0 -63
  157. package/dist/path-security.js.map +0 -1
  158. package/dist/patterns/bulk.d.ts +0 -15
  159. package/dist/patterns/bulk.d.ts.map +0 -1
  160. package/dist/patterns/bulk.js +0 -14
  161. package/dist/patterns/bulk.js.map +0 -1
  162. package/dist/patterns/change.d.ts +0 -10
  163. package/dist/patterns/change.d.ts.map +0 -1
  164. package/dist/patterns/change.js +0 -10
  165. package/dist/patterns/change.js.map +0 -1
  166. package/dist/patterns/date-range.d.ts +0 -10
  167. package/dist/patterns/date-range.d.ts.map +0 -1
  168. package/dist/patterns/date-range.js +0 -10
  169. package/dist/patterns/date-range.js.map +0 -1
  170. package/dist/patterns/index.d.ts +0 -9
  171. package/dist/patterns/index.d.ts.map +0 -1
  172. package/dist/patterns/index.js +0 -9
  173. package/dist/patterns/index.js.map +0 -1
  174. package/dist/patterns/pagination.d.ts +0 -18
  175. package/dist/patterns/pagination.d.ts.map +0 -1
  176. package/dist/patterns/pagination.js +0 -18
  177. package/dist/patterns/pagination.js.map +0 -1
  178. package/dist/patterns/progress.d.ts +0 -11
  179. package/dist/patterns/progress.d.ts.map +0 -1
  180. package/dist/patterns/progress.js +0 -11
  181. package/dist/patterns/progress.js.map +0 -1
  182. package/dist/patterns/sorting.d.ts +0 -13
  183. package/dist/patterns/sorting.d.ts.map +0 -1
  184. package/dist/patterns/sorting.js +0 -10
  185. package/dist/patterns/sorting.js.map +0 -1
  186. package/dist/patterns/status.d.ts +0 -15
  187. package/dist/patterns/status.d.ts.map +0 -1
  188. package/dist/patterns/status.js +0 -9
  189. package/dist/patterns/status.js.map +0 -1
  190. package/dist/patterns/timestamps.d.ts +0 -10
  191. package/dist/patterns/timestamps.d.ts.map +0 -1
  192. package/dist/patterns/timestamps.js +0 -10
  193. package/dist/patterns/timestamps.js.map +0 -1
  194. package/dist/redaction/index.d.ts +0 -4
  195. package/dist/redaction/index.d.ts.map +0 -1
  196. package/dist/redaction/index.js +0 -3
  197. package/dist/redaction/index.js.map +0 -1
  198. package/dist/redaction/patterns.d.ts +0 -9
  199. package/dist/redaction/patterns.d.ts.map +0 -1
  200. package/dist/redaction/patterns.js +0 -39
  201. package/dist/redaction/patterns.js.map +0 -1
  202. package/dist/redaction/redactor.d.ts +0 -27
  203. package/dist/redaction/redactor.d.ts.map +0 -1
  204. package/dist/redaction/redactor.js +0 -89
  205. package/dist/redaction/redactor.js.map +0 -1
  206. package/dist/resilience.d.ts +0 -34
  207. package/dist/resilience.d.ts.map +0 -1
  208. package/dist/resilience.js +0 -164
  209. package/dist/resilience.js.map +0 -1
  210. package/dist/resource-config.d.ts +0 -22
  211. package/dist/resource-config.d.ts.map +0 -1
  212. package/dist/resource-config.js +0 -210
  213. package/dist/resource-config.js.map +0 -1
  214. package/dist/resource.d.ts +0 -74
  215. package/dist/resource.d.ts.map +0 -1
  216. package/dist/resource.js +0 -61
  217. package/dist/resource.js.map +0 -1
  218. package/dist/result.d.ts +0 -57
  219. package/dist/result.d.ts.map +0 -1
  220. package/dist/result.js +0 -156
  221. package/dist/result.js.map +0 -1
  222. package/dist/run.d.ts +0 -28
  223. package/dist/run.d.ts.map +0 -1
  224. package/dist/run.js +0 -35
  225. package/dist/run.js.map +0 -1
  226. package/dist/serialization.d.ts +0 -27
  227. package/dist/serialization.d.ts.map +0 -1
  228. package/dist/serialization.js +0 -154
  229. package/dist/serialization.js.map +0 -1
  230. package/dist/signal.d.ts +0 -33
  231. package/dist/signal.d.ts.map +0 -1
  232. package/dist/signal.js +0 -17
  233. package/dist/signal.js.map +0 -1
  234. package/dist/store/accessor-protocol.d.ts +0 -51
  235. package/dist/store/accessor-protocol.d.ts.map +0 -1
  236. package/dist/store/accessor-protocol.js +0 -2
  237. package/dist/store/accessor-protocol.js.map +0 -1
  238. package/dist/store/index.d.ts +0 -2
  239. package/dist/store/index.d.ts.map +0 -1
  240. package/dist/store/index.js +0 -2
  241. package/dist/store/index.js.map +0 -1
  242. package/dist/surface-filter.d.ts +0 -13
  243. package/dist/surface-filter.d.ts.map +0 -1
  244. package/dist/surface-filter.js +0 -76
  245. package/dist/surface-filter.js.map +0 -1
  246. package/dist/topo-store.d.ts +0 -62
  247. package/dist/topo-store.d.ts.map +0 -1
  248. package/dist/topo-store.js +0 -319
  249. package/dist/topo-store.js.map +0 -1
  250. package/dist/topo.d.ts +0 -39
  251. package/dist/topo.d.ts.map +0 -1
  252. package/dist/topo.js +0 -241
  253. package/dist/topo.js.map +0 -1
  254. package/dist/trail.d.ts +0 -163
  255. package/dist/trail.d.ts.map +0 -1
  256. package/dist/trail.js +0 -75
  257. package/dist/trail.js.map +0 -1
  258. package/dist/trails/derive-trail.d.ts +0 -66
  259. package/dist/trails/derive-trail.d.ts.map +0 -1
  260. package/dist/trails/derive-trail.js +0 -378
  261. package/dist/trails/derive-trail.js.map +0 -1
  262. package/dist/trails/index.d.ts +0 -5
  263. package/dist/trails/index.d.ts.map +0 -1
  264. package/dist/trails/index.js +0 -3
  265. package/dist/trails/index.js.map +0 -1
  266. package/dist/trails/ingest.d.ts +0 -24
  267. package/dist/trails/ingest.d.ts.map +0 -1
  268. package/dist/trails/ingest.js +0 -63
  269. package/dist/trails/ingest.js.map +0 -1
  270. package/dist/transport-error-map.d.ts +0 -106
  271. package/dist/transport-error-map.d.ts.map +0 -1
  272. package/dist/transport-error-map.js +0 -24
  273. package/dist/transport-error-map.js.map +0 -1
  274. package/dist/type-checks.test-d.d.ts +0 -71
  275. package/dist/type-checks.test-d.d.ts.map +0 -1
  276. package/dist/type-checks.test-d.js +0 -12
  277. package/dist/type-checks.test-d.js.map +0 -1
  278. package/dist/type-utils.d.ts +0 -33
  279. package/dist/type-utils.d.ts.map +0 -1
  280. package/dist/type-utils.js +0 -12
  281. package/dist/type-utils.js.map +0 -1
  282. package/dist/types.d.ts +0 -177
  283. package/dist/types.d.ts.map +0 -1
  284. package/dist/types.js +0 -3
  285. package/dist/types.js.map +0 -1
  286. package/dist/validate-established-topo.d.ts +0 -76
  287. package/dist/validate-established-topo.d.ts.map +0 -1
  288. package/dist/validate-established-topo.js +0 -43
  289. package/dist/validate-established-topo.js.map +0 -1
  290. package/dist/validate-topo.d.ts +0 -24
  291. package/dist/validate-topo.d.ts.map +0 -1
  292. package/dist/validate-topo.js +0 -193
  293. package/dist/validate-topo.js.map +0 -1
  294. package/dist/validation.d.ts +0 -27
  295. package/dist/validation.d.ts.map +0 -1
  296. package/dist/validation.js +0 -165
  297. package/dist/validation.js.map +0 -1
  298. package/dist/workspace.d.ts +0 -25
  299. package/dist/workspace.d.ts.map +0 -1
  300. package/dist/workspace.js +0 -57
  301. package/dist/workspace.js.map +0 -1
  302. package/src/__tests__/blob-ref.test.ts +0 -103
  303. package/src/__tests__/branded.test.ts +0 -148
  304. package/src/__tests__/collections.test.ts +0 -126
  305. package/src/__tests__/context.test.ts +0 -77
  306. package/src/__tests__/contour.test.ts +0 -263
  307. package/src/__tests__/derive-trail.test.ts +0 -668
  308. package/src/__tests__/derive.test.ts +0 -260
  309. package/src/__tests__/errors.test.ts +0 -427
  310. package/src/__tests__/execute.test.ts +0 -1563
  311. package/src/__tests__/fetch.test.ts +0 -217
  312. package/src/__tests__/fire.test.ts +0 -1056
  313. package/src/__tests__/fork-ctx.test.ts +0 -83
  314. package/src/__tests__/guards.test.ts +0 -102
  315. package/src/__tests__/ingest.test.ts +0 -191
  316. package/src/__tests__/layer.test.ts +0 -125
  317. package/src/__tests__/path-security.test.ts +0 -114
  318. package/src/__tests__/patterns.test.ts +0 -273
  319. package/src/__tests__/redaction.test.ts +0 -244
  320. package/src/__tests__/resilience.test.ts +0 -246
  321. package/src/__tests__/resource.test.ts +0 -204
  322. package/src/__tests__/result.test.ts +0 -155
  323. package/src/__tests__/run.test.ts +0 -181
  324. package/src/__tests__/serialization.test.ts +0 -401
  325. package/src/__tests__/service-config.test.ts +0 -224
  326. package/src/__tests__/signal.test.ts +0 -82
  327. package/src/__tests__/surface-filter.test.ts +0 -196
  328. package/src/__tests__/topo-store-read.test.ts +0 -256
  329. package/src/__tests__/topo-store.test.ts +0 -869
  330. package/src/__tests__/topo.test.ts +0 -573
  331. package/src/__tests__/trail-permit.test.ts +0 -60
  332. package/src/__tests__/trail.test.ts +0 -426
  333. package/src/__tests__/trails-db.test.ts +0 -198
  334. package/src/__tests__/transport-error-map.test.ts +0 -82
  335. package/src/__tests__/type-utils.test.ts +0 -118
  336. package/src/__tests__/validate-topo.test.ts +0 -611
  337. package/src/__tests__/validation.test.ts +0 -336
  338. package/src/__tests__/workspace.test.ts +0 -183
  339. package/src/__tests__/zod-wrappers.test.ts +0 -62
  340. package/src/internal/topo-snapshots.ts +0 -517
  341. package/src/internal/topo-store-read.ts +0 -481
  342. package/src/internal/topo-store.ts +0 -1192
  343. package/src/internal/tracing.ts +0 -187
  344. package/src/topo-store.ts +0 -510
  345. package/src/type-checks.test-d.ts +0 -106
  346. package/tsconfig.json +0 -9
  347. package/tsconfig.tests.json +0 -10
  348. package/tsconfig.tsbuildinfo +0 -1
@@ -1,164 +0,0 @@
1
- /**
2
- * Resilience utilities for @ontrails/core
3
- *
4
- * Retry with exponential backoff and timeout wrappers,
5
- * all returning Result types.
6
- */
7
- import { CancelledError, TimeoutError, isRetryable } from './errors.js';
8
- import { Result } from './result.js';
9
- // ---------------------------------------------------------------------------
10
- // Helpers (defined before usage)
11
- // ---------------------------------------------------------------------------
12
- const sleep = (ms, signal) =>
13
- // oxlint-disable-next-line avoid-new -- Promise constructor needed for setTimeout-based sleep
14
- new Promise((resolve) => {
15
- if (signal?.aborted) {
16
- resolve();
17
- return;
18
- }
19
- let settled = false;
20
- const done = () => {
21
- if (!settled) {
22
- settled = true;
23
- resolve();
24
- }
25
- };
26
- const timer = setTimeout(done, ms);
27
- const onAbort = () => {
28
- clearTimeout(timer);
29
- done();
30
- };
31
- signal?.addEventListener('abort', onAbort, { once: true });
32
- });
33
- // ---------------------------------------------------------------------------
34
- // shouldRetry (default)
35
- // ---------------------------------------------------------------------------
36
- /** Default retry predicate using the error taxonomy. */
37
- export const shouldRetry = (error) => isRetryable(error);
38
- // ---------------------------------------------------------------------------
39
- // deriveBackoffDelay
40
- // ---------------------------------------------------------------------------
41
- /** Compute exponential backoff delay with full jitter. */
42
- export const deriveBackoffDelay = (attempt, options) => {
43
- const base = options?.baseDelay ?? 1000;
44
- const max = options?.maxDelay ?? 30_000;
45
- const factor = options?.backoffFactor ?? 2;
46
- const exponential = base * factor ** attempt;
47
- const capped = Math.min(exponential, max);
48
- // Full jitter: random value in [0, capped]
49
- return Math.floor(Math.random() * capped);
50
- };
51
- // ---------------------------------------------------------------------------
52
- // retry
53
- // ---------------------------------------------------------------------------
54
- /**
55
- * Retry an async function that returns a Result.
56
- *
57
- * On each failure, checks whether the error is retryable and whether the
58
- * attempt budget remains. Applies exponential backoff with jitter between
59
- * retries.
60
- */
61
- /** Attempt a single retry iteration. Returns the result to stop, or undefined to continue. */
62
- const tryAttempt = async (fn, attempt, maxAttempts, retryPredicate, options) => {
63
- const result = await fn();
64
- if (result.isOk()) {
65
- return { done: true, result };
66
- }
67
- const isLast = attempt === maxAttempts - 1;
68
- if (isLast || !retryPredicate(result.error)) {
69
- return { done: true, result };
70
- }
71
- const delay = deriveBackoffDelay(attempt, options);
72
- if (delay > 0) {
73
- await sleep(delay, options?.signal);
74
- }
75
- return { done: false, result };
76
- };
77
- /** Resolve retry options to concrete values. */
78
- const resolveRetryOptions = (options) => ({
79
- maxAttempts: options?.maxAttempts ?? 3,
80
- retryPredicate: options?.shouldRetry ?? shouldRetry,
81
- signal: options?.signal,
82
- });
83
- export const retry = async (fn, options) => {
84
- const { maxAttempts, retryPredicate, signal } = resolveRetryOptions(options);
85
- let lastResult;
86
- for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
87
- if (signal?.aborted) {
88
- return Result.err(new CancelledError('Retry cancelled'));
89
- }
90
- const outcome = await tryAttempt(fn, attempt, maxAttempts, retryPredicate, options);
91
- lastResult = outcome.result;
92
- if (outcome.done) {
93
- return outcome.result;
94
- }
95
- }
96
- return lastResult ?? Result.err(new CancelledError('Retry exhausted'));
97
- };
98
- // ---------------------------------------------------------------------------
99
- // withTimeout
100
- // ---------------------------------------------------------------------------
101
- /**
102
- * Run an async Result-returning function with a timeout.
103
- *
104
- * If the timeout fires first, returns a TimeoutError result.
105
- * Also respects an external AbortSignal.
106
- */
107
- export const withTimeout = (fn, ms, signal) => {
108
- if (signal?.aborted) {
109
- return Promise.resolve(Result.err(new CancelledError('Already cancelled')));
110
- }
111
- // oxlint-disable-next-line avoid-new, promise/no-multiple-resolved -- Promise constructor needed for timeout race; settled guard ensures single resolution
112
- return new Promise((resolve) => {
113
- let settled = false;
114
- // oxlint-disable-next-line prefer-const -- assigned after declaration
115
- let timer;
116
- const onAbort = () => {
117
- if (settled) {
118
- return;
119
- }
120
- settled = true;
121
- clearTimeout(timer);
122
- signal?.removeEventListener('abort', onAbort);
123
- // oxlint-disable-next-line promise/no-multiple-resolved -- settled guard ensures single resolution
124
- resolve(Result.err(new CancelledError('Operation cancelled')));
125
- };
126
- signal?.addEventListener('abort', onAbort, { once: true });
127
- timer = setTimeout(() => {
128
- if (settled) {
129
- return;
130
- }
131
- settled = true;
132
- signal?.removeEventListener('abort', onAbort);
133
- // oxlint-disable-next-line promise/no-multiple-resolved -- settled guard ensures single resolution
134
- resolve(Result.err(new TimeoutError(`Operation timed out after ${ms}ms`, {
135
- context: { timeoutMs: ms },
136
- })));
137
- }, ms);
138
- // oxlint-disable-next-line prefer-await-to-then, no-void -- .then() needed inside Promise constructor; void discards unhandled rejection
139
- void fn().then(
140
- // oxlint-disable-next-line prefer-await-to-callbacks -- callback required inside .then()
141
- (result) => {
142
- if (settled) {
143
- return;
144
- }
145
- settled = true;
146
- clearTimeout(timer);
147
- signal?.removeEventListener('abort', onAbort);
148
- // oxlint-disable-next-line promise/no-multiple-resolved -- settled guard ensures single resolution
149
- resolve(result);
150
- },
151
- // oxlint-disable-next-line prefer-await-to-callbacks -- rejection handler required inside .then()
152
- (error) => {
153
- if (settled) {
154
- return;
155
- }
156
- settled = true;
157
- clearTimeout(timer);
158
- signal?.removeEventListener('abort', onAbort);
159
- // oxlint-disable-next-line promise/no-multiple-resolved -- settled guard ensures single resolution
160
- resolve(Result.err(error instanceof Error ? error : new Error(String(error))));
161
- });
162
- });
163
- };
164
- //# sourceMappingURL=resilience.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resilience.js","sourceRoot":"","sources":["../src/resilience.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Resource resolution pipeline.
3
- *
4
- * Extracted from execute.ts to keep both modules under the 400 LOC ceiling.
5
- * Handles config validation, singleton caching, concurrent-creation dedup,
6
- * and the full resolve-or-create flow for declared resources.
7
- */
8
- import type { ResourceOverrideMap } from './resource.js';
9
- import type { AnyTrail } from './trail.js';
10
- import type { TrailContext } from './types.js';
11
- import { Result } from './result.js';
12
- type ConfigValues = Readonly<Record<string, Record<string, unknown>>>;
13
- /**
14
- * Resolve all declared resources for a trail.
15
- *
16
- * Validates per-resource config, checks overrides and caches, and creates
17
- * new instances as needed. Returns an enriched context with all resource
18
- * instances injected into extensions.
19
- */
20
- export declare const createResources: (trail: AnyTrail, ctx: TrailContext, overrides?: ResourceOverrideMap, configValues?: ConfigValues) => Promise<Result<TrailContext, Error>>;
21
- export {};
22
- //# sourceMappingURL=resource-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-config.d.ts","sourceRoot":"","sources":["../src/resource-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,KAAK,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AA4StE;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,QAAQ,EACf,KAAK,YAAY,EACjB,YAAY,mBAAmB,EAC/B,eAAe,YAAY,KAC1B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAsBrC,CAAC"}
@@ -1,210 +0,0 @@
1
- /**
2
- * Resource resolution pipeline.
3
- *
4
- * Extracted from execute.ts to keep both modules under the 400 LOC ceiling.
5
- * Handles config validation, singleton caching, concurrent-creation dedup,
6
- * and the full resolve-or-create flow for declared resources.
7
- */
8
- import { InternalError, ValidationError } from './errors.js';
9
- import { Result } from './result.js';
10
- import { createResourceLookup } from './resource.js';
11
- // ---------------------------------------------------------------------------
12
- // Singleton caches
13
- // ---------------------------------------------------------------------------
14
- const singletonResources = new WeakMap();
15
- /** In-flight resource creation promises, keyed by resource x context. */
16
- const pendingCreations = new WeakMap();
17
- // ---------------------------------------------------------------------------
18
- // Context helpers
19
- // ---------------------------------------------------------------------------
20
- const toResourceContext = (ctx, config) => ({
21
- config,
22
- cwd: ctx.cwd,
23
- env: ctx.env,
24
- workspaceRoot: ctx.workspaceRoot,
25
- });
26
- const toResourceContextKey = (ctx) => JSON.stringify({
27
- config: ctx.config,
28
- cwd: ctx.cwd,
29
- env: Object.entries(ctx.env ?? {}).toSorted(([left], [right]) => left.localeCompare(right)),
30
- workspaceRoot: ctx.workspaceRoot,
31
- });
32
- // ---------------------------------------------------------------------------
33
- // Config validation
34
- // ---------------------------------------------------------------------------
35
- /** Validate and resolve a resource's config from the provided configValues map. */
36
- const resolveResourceConfig = (declaredResource, configValues) => {
37
- if (declaredResource.config === undefined) {
38
- return Result.ok();
39
- }
40
- const raw = configValues?.[declaredResource.id];
41
- if (raw === undefined) {
42
- return Result.err(new ValidationError(`Resource "${declaredResource.id}" declares a config schema but no config was provided`));
43
- }
44
- const parsed = declaredResource.config.safeParse(raw);
45
- if (!parsed.success) {
46
- return Result.err(new ValidationError(`Resource "${declaredResource.id}" config validation failed: ${parsed.error.message}`));
47
- }
48
- return Result.ok(parsed.data);
49
- };
50
- // ---------------------------------------------------------------------------
51
- // Override / cache lookups
52
- // ---------------------------------------------------------------------------
53
- const hasOwnResourceOverride = (overrides, id) => overrides !== undefined && Object.hasOwn(overrides, id);
54
- const getCachedSingletonResource = (declaredResource, resourceContext) => {
55
- const scopedCache = singletonResources.get(declaredResource);
56
- if (scopedCache === undefined) {
57
- return { found: false, value: undefined };
58
- }
59
- const key = toResourceContextKey(resourceContext);
60
- if (!scopedCache.has(key)) {
61
- return { found: false, value: undefined };
62
- }
63
- return {
64
- found: true,
65
- value: scopedCache.get(key),
66
- };
67
- };
68
- const getProvidedResource = (ctx, overrides, declaredResource, resourceContext) => {
69
- const { id } = declaredResource;
70
- if (hasOwnResourceOverride(overrides, id)) {
71
- return Result.ok(overrides[id]);
72
- }
73
- if (Object.hasOwn(ctx.extensions ?? {}, id)) {
74
- return Result.ok(ctx.extensions?.[id]);
75
- }
76
- const cached = getCachedSingletonResource(declaredResource, resourceContext);
77
- if (cached.found) {
78
- return Result.ok(cached.value);
79
- }
80
- return undefined;
81
- };
82
- const getOverrideOrExtension = (ctx, overrides, declaredResource) => getProvidedResource(ctx, overrides, declaredResource, toResourceContext(ctx));
83
- const resolveConfigAwareProvidedResource = (ctx, declaredResource, configValues) => {
84
- const configResult = resolveResourceConfig(declaredResource, configValues);
85
- if (configResult.isErr()) {
86
- return configResult;
87
- }
88
- const resourceContext = toResourceContext(ctx, configResult.value);
89
- const provided = getProvidedResource(ctx, undefined, declaredResource, resourceContext);
90
- return provided
91
- ? Result.ok({ kind: 'provided', value: provided.unwrap() })
92
- : Result.ok({ kind: 'context', resourceContext });
93
- };
94
- // ---------------------------------------------------------------------------
95
- // Instance creation
96
- // ---------------------------------------------------------------------------
97
- const toInternalResourceError = (id, error) => {
98
- const cause = error instanceof Error ? error : undefined;
99
- const message = cause?.message ?? String(error);
100
- return new InternalError(`Resource "${id}" failed to resolve: ${message}`, {
101
- ...(cause ? { cause } : {}),
102
- context: { resourceId: id },
103
- });
104
- };
105
- const getSingletonResourceCache = (declaredResource) => {
106
- const existing = singletonResources.get(declaredResource);
107
- if (existing !== undefined) {
108
- return existing;
109
- }
110
- const created = new Map();
111
- singletonResources.set(declaredResource, created);
112
- return created;
113
- };
114
- const doCreateResourceInstance = async (declaredResource, resourceContext) => {
115
- try {
116
- const created = await declaredResource.create(resourceContext);
117
- if (created.isErr()) {
118
- return Result.err(created.error);
119
- }
120
- const instance = created.unwrap();
121
- getSingletonResourceCache(declaredResource).set(toResourceContextKey(resourceContext), instance);
122
- return Result.ok(instance);
123
- }
124
- catch (error) {
125
- return Result.err(toInternalResourceError(declaredResource.id, error));
126
- }
127
- };
128
- const trackPendingCreation = (declaredResource, key, promise) => {
129
- const pending = pendingCreations.get(declaredResource);
130
- if (pending) {
131
- pending.set(key, promise);
132
- }
133
- else {
134
- pendingCreations.set(declaredResource, new Map([[key, promise]]));
135
- }
136
- };
137
- /**
138
- * Deduplicates concurrent creation of the same resource singleton.
139
- * If a creation is already in flight for this resource x context key,
140
- * returns the existing promise instead of spawning a second factory call.
141
- */
142
- const createResourceInstance = async (declaredResource, resourceContext) => {
143
- const key = toResourceContextKey(resourceContext);
144
- const inflight = pendingCreations.get(declaredResource)?.get(key);
145
- if (inflight) {
146
- return inflight;
147
- }
148
- const promise = doCreateResourceInstance(declaredResource, resourceContext);
149
- trackPendingCreation(declaredResource, key, promise);
150
- try {
151
- return await promise;
152
- }
153
- finally {
154
- pendingCreations.get(declaredResource)?.delete(key);
155
- }
156
- };
157
- /** Validate config and resolve a single declared resource. */
158
- const resolveDeclaredResource = async (declaredResource, ctx, overrides, configValues) => {
159
- // Check overrides/extensions first — skip config validation entirely when
160
- // a resource instance is already provided.
161
- const overrideOrExtension = getOverrideOrExtension(ctx, overrides, declaredResource);
162
- if (overrideOrExtension !== undefined) {
163
- return overrideOrExtension;
164
- }
165
- // Resolve config before consulting the singleton cache so config-aware
166
- // resources use the same canonical context for cache reads and writes.
167
- const configAwareResource = resolveConfigAwareProvidedResource(ctx, declaredResource, configValues);
168
- if (configAwareResource.isErr()) {
169
- return configAwareResource;
170
- }
171
- // No provided instance — create via factory.
172
- const resolved = configAwareResource.unwrap();
173
- if (resolved.kind === 'provided') {
174
- return Result.ok(resolved.value);
175
- }
176
- return await createResourceInstance(declaredResource, resolved.resourceContext);
177
- };
178
- // ---------------------------------------------------------------------------
179
- // Full trail resource resolution
180
- // ---------------------------------------------------------------------------
181
- const withResolvedResources = (ctx, resolvedResources) => {
182
- const extensions = { ...ctx.extensions, ...resolvedResources };
183
- const resolvedCtx = { ...ctx, extensions };
184
- const lookup = createResourceLookup(() => resolvedCtx);
185
- resolvedCtx.resource = lookup;
186
- return resolvedCtx;
187
- };
188
- /**
189
- * Resolve all declared resources for a trail.
190
- *
191
- * Validates per-resource config, checks overrides and caches, and creates
192
- * new instances as needed. Returns an enriched context with all resource
193
- * instances injected into extensions.
194
- */
195
- export const createResources = async (trail, ctx, overrides, configValues) => {
196
- const { resources } = trail;
197
- if (resources.length === 0) {
198
- return Result.ok(ctx);
199
- }
200
- const resolvedResources = {};
201
- for (const declaredResource of resources) {
202
- const resolved = await resolveDeclaredResource(declaredResource, ctx, overrides, configValues);
203
- if (resolved.isErr()) {
204
- return resolved;
205
- }
206
- resolvedResources[declaredResource.id] = resolved.unwrap();
207
- }
208
- return Result.ok(withResolvedResources(ctx, resolvedResources));
209
- };
210
- //# sourceMappingURL=resource-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-config.js","sourceRoot":"","sources":["../src/resource-config.ts"],"names":[],"mappings":"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"}
@@ -1,74 +0,0 @@
1
- import type { Result } from './result.js';
2
- import type { AnySignal } from './signal.js';
3
- import type { ResourceLookup, TrailContext } from './types.js';
4
- import type { z } from 'zod';
5
- /**
6
- * Stable process-scoped fields available when constructing a resource.
7
- *
8
- * Resources are app-level singletons, so they intentionally do not receive
9
- * the full per-request TrailContext. When a resource declares a `config` schema,
10
- * the validated config is passed as `svc.config`.
11
- */
12
- export type ResourceContext<C = unknown> = Pick<TrailContext, 'cwd' | 'env' | 'workspaceRoot'> & {
13
- readonly config: C;
14
- };
15
- /**
16
- * Everything needed to describe a resource before a factory is introduced.
17
- *
18
- * When `config` is a Zod schema, the `create` callback receives
19
- * `ResourceContext<C>` with the validated config value.
20
- */
21
- export interface ResourceSpec<T, C = unknown> {
22
- /** Create the resource instance from stable process-scoped context. */
23
- readonly create: (svc: ResourceContext<C>) => Result<T, Error> | Promise<Result<T, Error>>;
24
- /** Config schema — when present, config is validated and passed to `create`. */
25
- readonly config?: z.ZodType<C> | undefined;
26
- /** Optional cleanup performed when the hosting trailhead shuts down. */
27
- readonly dispose?: ((resource: T) => void | Promise<void>) | undefined;
28
- /** Optional operational readiness probe for introspection tooling. */
29
- readonly health?: ((resource: T) => Result<unknown, Error> | Promise<Result<unknown, Error>>) | undefined;
30
- /** Optional test factory used by higher-level helpers. */
31
- readonly mock?: (() => T | Promise<T>) | undefined;
32
- /** Human-readable description. */
33
- readonly description?: string | undefined;
34
- /** Arbitrary meta for tooling and filtering. */
35
- readonly meta?: Readonly<Record<string, unknown>> | undefined;
36
- /** Signals projected or owned by this resource. */
37
- readonly signals?: readonly AnySignal[] | undefined;
38
- }
39
- /** A typed resource definition. */
40
- export interface Resource<T> extends ResourceSpec<T> {
41
- readonly kind: 'resource';
42
- readonly id: string;
43
- /** Read the resolved resource instance from a trail context. */
44
- from(ctx: TrailContext): T;
45
- }
46
- /**
47
- * Existential type for heterogeneous resource collections.
48
- *
49
- * `Resource<T>` includes function parameters in `dispose`/`health`, so
50
- * `unknown` is too narrow for mixed resource arrays. `any` is the correct
51
- * existential here.
52
- */
53
- export type AnyResource = Resource<any>;
54
- /** Explicit runtime overrides keyed by resource ID. */
55
- export type ResourceOverrideMap = Readonly<Record<string, unknown>>;
56
- /** Create a `ctx.resource(...)` accessor bound to a concrete context snapshot. */
57
- export declare const createResourceLookup: (getContext: () => Pick<TrailContext, "extensions">) => ResourceLookup;
58
- /**
59
- * Create a typed resource definition.
60
- *
61
- * The resource object is inert until a later execution branch resolves concrete
62
- * instances into TrailContext extensions.
63
- */
64
- export declare const resource: <T>(id: string, spec: ResourceSpec<T>) => Resource<T>;
65
- /** Narrow unknown values to resource definitions during topo discovery. */
66
- export declare const isResource: (value: unknown) => value is AnyResource;
67
- /**
68
- * Return the first duplicate resource ID in a collection, if any.
69
- *
70
- * This supports later topo registration without each caller duplicating the
71
- * same scan logic.
72
- */
73
- export declare const findDuplicateResourceId: (resources: readonly Pick<AnyResource, "id">[]) => string | undefined;
74
- //# sourceMappingURL=resource.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
package/dist/resource.js DELETED
@@ -1,61 +0,0 @@
1
- import { InternalError } from './errors.js';
2
- const getResourceId = (resourceOrId) => typeof resourceOrId === 'string' ? resourceOrId : resourceOrId.id;
3
- const getResourceInstance = (ctx, resourceOrId) => {
4
- const id = getResourceId(resourceOrId);
5
- return ctx.extensions?.[id];
6
- };
7
- const hasResourceInstance = (ctx, resourceOrId) => Object.hasOwn(ctx.extensions ?? {}, getResourceId(resourceOrId));
8
- /** Create a `ctx.resource(...)` accessor bound to a concrete context snapshot. */
9
- export const createResourceLookup = (getContext) => ((resourceOrId) => {
10
- const id = getResourceId(resourceOrId);
11
- const ctx = getContext();
12
- if (!hasResourceInstance(ctx, id)) {
13
- throw new InternalError(`Resource "${id}" not provisioned in context`);
14
- }
15
- return getResourceInstance(ctx, id);
16
- });
17
- /**
18
- * Create a typed resource definition.
19
- *
20
- * The resource object is inert until a later execution branch resolves concrete
21
- * instances into TrailContext extensions.
22
- */
23
- export const resource = (id, spec) => (() => {
24
- if (id.includes(':')) {
25
- throw new InternalError(`Resource "${id}" is invalid because resource ids may not contain ":"`);
26
- }
27
- return Object.freeze({
28
- ...spec,
29
- from(ctx) {
30
- const lookup = ctx.resource ?? createResourceLookup(() => ctx);
31
- return lookup(this);
32
- },
33
- id,
34
- kind: 'resource',
35
- });
36
- })();
37
- /** Narrow unknown values to resource definitions during topo discovery. */
38
- export const isResource = (value) => {
39
- if (typeof value !== 'object' || value === null) {
40
- return false;
41
- }
42
- const v = value;
43
- return v.kind === 'resource' && typeof v.id === 'string';
44
- };
45
- /**
46
- * Return the first duplicate resource ID in a collection, if any.
47
- *
48
- * This supports later topo registration without each caller duplicating the
49
- * same scan logic.
50
- */
51
- export const findDuplicateResourceId = (resources) => {
52
- const seen = new Set();
53
- for (const candidate of resources) {
54
- if (seen.has(candidate.id)) {
55
- return candidate.id;
56
- }
57
- seen.add(candidate.id);
58
- }
59
- return undefined;
60
- };
61
- //# sourceMappingURL=resource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwE5C,MAAM,aAAa,GAAG,CACpB,YAA8C,EACtC,EAAE,CACV,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;AAEpE,MAAM,mBAAmB,GAAG,CAC1B,GAAqC,EACrC,YAA8C,EAC3C,EAAE;IACL,MAAM,EAAE,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAM,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,GAAqC,EACrC,YAA8C,EACrC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;AAE/E,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,UAAkD,EAClC,EAAE,CAClB,CAAC,CAAC,YAA8C,EAAE,EAAE;IAClD,MAAM,EAAE,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC,CAAmB,CAAC;AAEvB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,EAAU,EAAE,IAAqB,EAAe,EAAE,CAC5E,CAAC,GAAG,EAAE;IACJ,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,aAAa,CACrB,aAAa,EAAE,uDAAuD,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,IAAI;QACP,IAAI,CAAC,GAAiB;YACpB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,oBAAoB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,EAAE;QACF,IAAI,EAAE,UAAmB;KAC1B,CAAC,CAAC;AACL,CAAC,CAAC,EAAE,CAAC;AAEP,2EAA2E;AAC3E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAwB,EAAE;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,GAAG,KAAyC,CAAC;IACpD,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;AAC3D,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAA6C,EACzB,EAAE;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
package/dist/result.d.ts DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * A type-safe Result monad for representing success/failure without exceptions.
3
- */
4
- import { InternalError, ValidationError } from './errors.js';
5
- declare class Ok<T, E> {
6
- readonly value: T;
7
- constructor(value: T);
8
- isOk(): this is Ok<T, E>;
9
- isErr(): this is Err<E>;
10
- map<U>(fn: (value: T) => U): Result<U, E>;
11
- flatMap<U, F = E>(fn: (value: T) => Result<U, F>): Result<U, E | F>;
12
- mapErr<F>(_fn: (error: E) => F): Result<T, F>;
13
- match<U>(handlers: {
14
- ok: (value: T) => U;
15
- err: (error: E) => U;
16
- }): U;
17
- unwrap(): T;
18
- unwrapOr(_fallback: T): T;
19
- }
20
- declare class Err<E> {
21
- readonly error: E;
22
- constructor(error: E);
23
- isOk(): this is Ok<never, E>;
24
- isErr(): this is Err<E>;
25
- map<U>(_fn: (value: never) => U): Result<U, E>;
26
- flatMap<U, F = E>(_fn: (value: never) => Result<U, F>): Result<U, E | F>;
27
- mapErr<F>(fn: (error: E) => F): Result<never, F>;
28
- match<U>(handlers: {
29
- ok: (value: never) => U;
30
- err: (error: E) => U;
31
- }): U;
32
- unwrap(): never;
33
- unwrapOr<T>(fallback: T): T;
34
- }
35
- export type Result<T, E = Error> = Ok<T, E> | Err<E>;
36
- export declare const Result: {
37
- readonly combine: <T, E>(results: readonly Result<T, E>[]) => Result<T[], E>;
38
- readonly err: <E>(error: E) => Err<E>;
39
- /**
40
- * Wrap a fetch call in a Result, mapping failures to TrailsError subclasses.
41
- *
42
- * Network errors become NetworkError. Abort signals become CancelledError.
43
- * HTTP error status codes map to the appropriate error category.
44
- */
45
- readonly fromFetch: (input: string | URL | Request, init?: RequestInit) => Promise<Result<Response, Error>>;
46
- /**
47
- * Parse a JSON string, returning a Result instead of throwing.
48
- */
49
- readonly fromJson: (json: string) => Result<unknown, ValidationError>;
50
- readonly ok: <T = void>(value?: T) => Result<T, never>;
51
- /**
52
- * Stringify a value to JSON, returning a Result. Handles circular references.
53
- */
54
- readonly toJson: (value: unknown) => Result<string, InternalError>;
55
- };
56
- export {};
57
- //# sourceMappingURL=result.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}