@ontrails/core 1.0.0-beta.14 → 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 (314) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +73 -24
  3. package/package.json +11 -4
  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/branded.ts +1 -1
  10. package/src/context.ts +28 -4
  11. package/src/contour.ts +344 -0
  12. package/src/cross-batch.ts +69 -0
  13. package/src/cross-schema.ts +36 -0
  14. package/src/detours.ts +8 -0
  15. package/src/draft.ts +60 -52
  16. package/src/error-projection.ts +51 -0
  17. package/src/errors.ts +245 -48
  18. package/src/execute.ts +1250 -40
  19. package/src/fire.ts +1169 -0
  20. package/src/index.ts +383 -49
  21. package/src/internal/fork-ctx.ts +69 -0
  22. package/src/layer-projection.ts +192 -0
  23. package/src/layer.ts +81 -0
  24. package/src/observe.ts +361 -0
  25. package/src/path-security.ts +1 -1
  26. package/src/permits.ts +12 -0
  27. package/src/redaction/patterns.ts +6 -3
  28. package/src/resilience.ts +11 -11
  29. package/src/resource-config.ts +792 -0
  30. package/src/resource.ts +175 -0
  31. package/src/result.ts +18 -0
  32. package/src/run.ts +7 -6
  33. package/src/schedule-runtime.ts +689 -0
  34. package/src/schedule.ts +324 -0
  35. package/src/serialization.ts +90 -55
  36. package/src/signal-diagnostics.ts +633 -0
  37. package/src/signal-ref.ts +87 -0
  38. package/src/signal.ts +37 -0
  39. package/src/store/accessor-protocol.ts +56 -0
  40. package/src/store/index.ts +4 -0
  41. package/src/structured-examples.ts +245 -0
  42. package/src/surface-derivation.ts +91 -0
  43. package/src/surface-filter.ts +176 -0
  44. package/src/topo.ts +710 -59
  45. package/src/tracing.ts +345 -0
  46. package/src/trail.ts +347 -33
  47. package/src/trails/derive-trail.ts +842 -0
  48. package/src/trails/index.ts +9 -0
  49. package/src/trails/ingest.ts +138 -0
  50. package/src/{internal/trails-db.ts → trails-db.ts} +50 -31
  51. package/src/transport-error-map.ts +174 -0
  52. package/src/type-utils.ts +17 -2
  53. package/src/types.ts +208 -17
  54. package/src/validate-established-topo.ts +8 -2
  55. package/src/validate-topo.ts +244 -13
  56. package/src/validation.ts +58 -1
  57. package/src/webhook.ts +276 -0
  58. package/src/workspace.ts +1 -1
  59. package/src/zod-wrappers.ts +72 -0
  60. package/.turbo/turbo-build.log +0 -1
  61. package/.turbo/turbo-lint.log +0 -3
  62. package/.turbo/turbo-typecheck.log +0 -1
  63. package/dist/adapters.d.ts +0 -39
  64. package/dist/adapters.d.ts.map +0 -1
  65. package/dist/adapters.js +0 -2
  66. package/dist/adapters.js.map +0 -1
  67. package/dist/blob-ref.d.ts +0 -20
  68. package/dist/blob-ref.d.ts.map +0 -1
  69. package/dist/blob-ref.js +0 -22
  70. package/dist/blob-ref.js.map +0 -1
  71. package/dist/branded.d.ts +0 -36
  72. package/dist/branded.d.ts.map +0 -1
  73. package/dist/branded.js +0 -89
  74. package/dist/branded.js.map +0 -1
  75. package/dist/collections.d.ts +0 -31
  76. package/dist/collections.d.ts.map +0 -1
  77. package/dist/collections.js +0 -60
  78. package/dist/collections.js.map +0 -1
  79. package/dist/context.d.ts +0 -10
  80. package/dist/context.d.ts.map +0 -1
  81. package/dist/context.js +0 -21
  82. package/dist/context.js.map +0 -1
  83. package/dist/derive.d.ts +0 -44
  84. package/dist/derive.d.ts.map +0 -1
  85. package/dist/derive.js +0 -149
  86. package/dist/derive.js.map +0 -1
  87. package/dist/dispatch.d.ts +0 -27
  88. package/dist/dispatch.d.ts.map +0 -1
  89. package/dist/dispatch.js +0 -34
  90. package/dist/dispatch.js.map +0 -1
  91. package/dist/draft.d.ts +0 -28
  92. package/dist/draft.d.ts.map +0 -1
  93. package/dist/draft.js +0 -156
  94. package/dist/draft.js.map +0 -1
  95. package/dist/errors.d.ts +0 -83
  96. package/dist/errors.d.ts.map +0 -1
  97. package/dist/errors.js +0 -142
  98. package/dist/errors.js.map +0 -1
  99. package/dist/event.d.ts +0 -8
  100. package/dist/event.d.ts.map +0 -1
  101. package/dist/event.js +0 -7
  102. package/dist/event.js.map +0 -1
  103. package/dist/execute.d.ts +0 -35
  104. package/dist/execute.d.ts.map +0 -1
  105. package/dist/execute.js +0 -90
  106. package/dist/execute.js.map +0 -1
  107. package/dist/fetch.d.ts +0 -15
  108. package/dist/fetch.d.ts.map +0 -1
  109. package/dist/fetch.js +0 -102
  110. package/dist/fetch.js.map +0 -1
  111. package/dist/gate.d.ts +0 -17
  112. package/dist/gate.d.ts.map +0 -1
  113. package/dist/gate.js +0 -21
  114. package/dist/gate.js.map +0 -1
  115. package/dist/guards.d.ts +0 -17
  116. package/dist/guards.d.ts.map +0 -1
  117. package/dist/guards.js +0 -25
  118. package/dist/guards.js.map +0 -1
  119. package/dist/health.d.ts +0 -18
  120. package/dist/health.d.ts.map +0 -1
  121. package/dist/health.js +0 -5
  122. package/dist/health.js.map +0 -1
  123. package/dist/index.d.ts +0 -48
  124. package/dist/index.d.ts.map +0 -1
  125. package/dist/index.js +0 -51
  126. package/dist/index.js.map +0 -1
  127. package/dist/internal/topo-saves.d.ts +0 -47
  128. package/dist/internal/topo-saves.d.ts.map +0 -1
  129. package/dist/internal/topo-saves.js +0 -310
  130. package/dist/internal/topo-saves.js.map +0 -1
  131. package/dist/internal/topo-store-read.d.ts +0 -67
  132. package/dist/internal/topo-store-read.d.ts.map +0 -1
  133. package/dist/internal/topo-store-read.js +0 -222
  134. package/dist/internal/topo-store-read.js.map +0 -1
  135. package/dist/internal/topo-store.d.ts +0 -12
  136. package/dist/internal/topo-store.d.ts.map +0 -1
  137. package/dist/internal/topo-store.js +0 -571
  138. package/dist/internal/topo-store.js.map +0 -1
  139. package/dist/internal/trails-db.d.ts +0 -16
  140. package/dist/internal/trails-db.d.ts.map +0 -1
  141. package/dist/internal/trails-db.js +0 -118
  142. package/dist/internal/trails-db.js.map +0 -1
  143. package/dist/job.d.ts +0 -24
  144. package/dist/job.d.ts.map +0 -1
  145. package/dist/job.js +0 -17
  146. package/dist/job.js.map +0 -1
  147. package/dist/layer.d.ts +0 -6
  148. package/dist/layer.d.ts.map +0 -1
  149. package/dist/layer.js +0 -4
  150. package/dist/layer.js.map +0 -1
  151. package/dist/path-security.d.ts +0 -28
  152. package/dist/path-security.d.ts.map +0 -1
  153. package/dist/path-security.js +0 -63
  154. package/dist/path-security.js.map +0 -1
  155. package/dist/patterns/bulk.d.ts +0 -15
  156. package/dist/patterns/bulk.d.ts.map +0 -1
  157. package/dist/patterns/bulk.js +0 -14
  158. package/dist/patterns/bulk.js.map +0 -1
  159. package/dist/patterns/change.d.ts +0 -10
  160. package/dist/patterns/change.d.ts.map +0 -1
  161. package/dist/patterns/change.js +0 -10
  162. package/dist/patterns/change.js.map +0 -1
  163. package/dist/patterns/date-range.d.ts +0 -10
  164. package/dist/patterns/date-range.d.ts.map +0 -1
  165. package/dist/patterns/date-range.js +0 -10
  166. package/dist/patterns/date-range.js.map +0 -1
  167. package/dist/patterns/index.d.ts +0 -9
  168. package/dist/patterns/index.d.ts.map +0 -1
  169. package/dist/patterns/index.js +0 -9
  170. package/dist/patterns/index.js.map +0 -1
  171. package/dist/patterns/pagination.d.ts +0 -18
  172. package/dist/patterns/pagination.d.ts.map +0 -1
  173. package/dist/patterns/pagination.js +0 -18
  174. package/dist/patterns/pagination.js.map +0 -1
  175. package/dist/patterns/progress.d.ts +0 -11
  176. package/dist/patterns/progress.d.ts.map +0 -1
  177. package/dist/patterns/progress.js +0 -11
  178. package/dist/patterns/progress.js.map +0 -1
  179. package/dist/patterns/sorting.d.ts +0 -13
  180. package/dist/patterns/sorting.d.ts.map +0 -1
  181. package/dist/patterns/sorting.js +0 -10
  182. package/dist/patterns/sorting.js.map +0 -1
  183. package/dist/patterns/status.d.ts +0 -15
  184. package/dist/patterns/status.d.ts.map +0 -1
  185. package/dist/patterns/status.js +0 -9
  186. package/dist/patterns/status.js.map +0 -1
  187. package/dist/patterns/timestamps.d.ts +0 -10
  188. package/dist/patterns/timestamps.d.ts.map +0 -1
  189. package/dist/patterns/timestamps.js +0 -10
  190. package/dist/patterns/timestamps.js.map +0 -1
  191. package/dist/provision-config.d.ts +0 -22
  192. package/dist/provision-config.d.ts.map +0 -1
  193. package/dist/provision-config.js +0 -210
  194. package/dist/provision-config.js.map +0 -1
  195. package/dist/provision.d.ts +0 -71
  196. package/dist/provision.d.ts.map +0 -1
  197. package/dist/provision.js +0 -56
  198. package/dist/provision.js.map +0 -1
  199. package/dist/redaction/index.d.ts +0 -4
  200. package/dist/redaction/index.d.ts.map +0 -1
  201. package/dist/redaction/index.js +0 -3
  202. package/dist/redaction/index.js.map +0 -1
  203. package/dist/redaction/patterns.d.ts +0 -9
  204. package/dist/redaction/patterns.d.ts.map +0 -1
  205. package/dist/redaction/patterns.js +0 -39
  206. package/dist/redaction/patterns.js.map +0 -1
  207. package/dist/redaction/redactor.d.ts +0 -27
  208. package/dist/redaction/redactor.d.ts.map +0 -1
  209. package/dist/redaction/redactor.js +0 -89
  210. package/dist/redaction/redactor.js.map +0 -1
  211. package/dist/resilience.d.ts +0 -34
  212. package/dist/resilience.d.ts.map +0 -1
  213. package/dist/resilience.js +0 -164
  214. package/dist/resilience.js.map +0 -1
  215. package/dist/result.d.ts +0 -57
  216. package/dist/result.d.ts.map +0 -1
  217. package/dist/result.js +0 -156
  218. package/dist/result.js.map +0 -1
  219. package/dist/run.d.ts +0 -27
  220. package/dist/run.d.ts.map +0 -1
  221. package/dist/run.js +0 -34
  222. package/dist/run.js.map +0 -1
  223. package/dist/serialization.d.ts +0 -27
  224. package/dist/serialization.d.ts.map +0 -1
  225. package/dist/serialization.js +0 -153
  226. package/dist/serialization.js.map +0 -1
  227. package/dist/service-config.d.ts +0 -22
  228. package/dist/service-config.d.ts.map +0 -1
  229. package/dist/service-config.js +0 -210
  230. package/dist/service-config.js.map +0 -1
  231. package/dist/service.d.ts +0 -71
  232. package/dist/service.d.ts.map +0 -1
  233. package/dist/service.js +0 -56
  234. package/dist/service.js.map +0 -1
  235. package/dist/signal.d.ts +0 -33
  236. package/dist/signal.d.ts.map +0 -1
  237. package/dist/signal.js +0 -17
  238. package/dist/signal.js.map +0 -1
  239. package/dist/topo-store.d.ts +0 -48
  240. package/dist/topo-store.d.ts.map +0 -1
  241. package/dist/topo-store.js +0 -175
  242. package/dist/topo-store.js.map +0 -1
  243. package/dist/topo.d.ts +0 -25
  244. package/dist/topo.d.ts.map +0 -1
  245. package/dist/topo.js +0 -112
  246. package/dist/topo.js.map +0 -1
  247. package/dist/trail.d.ts +0 -96
  248. package/dist/trail.d.ts.map +0 -1
  249. package/dist/trail.js +0 -20
  250. package/dist/trail.js.map +0 -1
  251. package/dist/type-utils.d.ts +0 -24
  252. package/dist/type-utils.d.ts.map +0 -1
  253. package/dist/type-utils.js +0 -12
  254. package/dist/type-utils.js.map +0 -1
  255. package/dist/types.d.ts +0 -71
  256. package/dist/types.d.ts.map +0 -1
  257. package/dist/types.js +0 -3
  258. package/dist/types.js.map +0 -1
  259. package/dist/validate-established-topo.d.ts +0 -76
  260. package/dist/validate-established-topo.d.ts.map +0 -1
  261. package/dist/validate-established-topo.js +0 -43
  262. package/dist/validate-established-topo.js.map +0 -1
  263. package/dist/validate-topo.d.ts +0 -24
  264. package/dist/validate-topo.d.ts.map +0 -1
  265. package/dist/validate-topo.js +0 -176
  266. package/dist/validate-topo.js.map +0 -1
  267. package/dist/validation.d.ts +0 -27
  268. package/dist/validation.d.ts.map +0 -1
  269. package/dist/validation.js +0 -165
  270. package/dist/validation.js.map +0 -1
  271. package/dist/workspace.d.ts +0 -25
  272. package/dist/workspace.d.ts.map +0 -1
  273. package/dist/workspace.js +0 -57
  274. package/dist/workspace.js.map +0 -1
  275. package/src/__tests__/blob-ref.test.ts +0 -103
  276. package/src/__tests__/branded.test.ts +0 -148
  277. package/src/__tests__/collections.test.ts +0 -126
  278. package/src/__tests__/context.test.ts +0 -77
  279. package/src/__tests__/derive.test.ts +0 -260
  280. package/src/__tests__/errors.test.ts +0 -309
  281. package/src/__tests__/execute.test.ts +0 -525
  282. package/src/__tests__/fetch.test.ts +0 -217
  283. package/src/__tests__/gate.test.ts +0 -125
  284. package/src/__tests__/guards.test.ts +0 -102
  285. package/src/__tests__/path-security.test.ts +0 -114
  286. package/src/__tests__/patterns.test.ts +0 -273
  287. package/src/__tests__/redaction.test.ts +0 -244
  288. package/src/__tests__/resilience.test.ts +0 -246
  289. package/src/__tests__/result.test.ts +0 -155
  290. package/src/__tests__/run.test.ts +0 -181
  291. package/src/__tests__/serialization.test.ts +0 -401
  292. package/src/__tests__/service-config.test.ts +0 -228
  293. package/src/__tests__/service.test.ts +0 -197
  294. package/src/__tests__/signal.test.ts +0 -82
  295. package/src/__tests__/topo-store-read.test.ts +0 -251
  296. package/src/__tests__/topo-store.test.ts +0 -469
  297. package/src/__tests__/topo.test.ts +0 -277
  298. package/src/__tests__/trail-permit.test.ts +0 -60
  299. package/src/__tests__/trail.test.ts +0 -261
  300. package/src/__tests__/trails-db.test.ts +0 -191
  301. package/src/__tests__/type-utils.test.ts +0 -90
  302. package/src/__tests__/validate-topo.test.ts +0 -489
  303. package/src/__tests__/validation.test.ts +0 -336
  304. package/src/__tests__/workspace.test.ts +0 -183
  305. package/src/event.ts +0 -15
  306. package/src/gate.ts +0 -44
  307. package/src/internal/topo-saves.ts +0 -429
  308. package/src/internal/topo-store-read.ts +0 -473
  309. package/src/internal/topo-store.ts +0 -1087
  310. package/src/provision-config.ts +0 -373
  311. package/src/provision.ts +0 -148
  312. package/src/topo-store.ts +0 -301
  313. package/tsconfig.json +0 -9
  314. package/tsconfig.tsbuildinfo +0 -1
@@ -1,309 +0,0 @@
1
- import { describe, test, expect } from 'bun:test';
2
-
3
- import {
4
- TrailsError,
5
- ValidationError,
6
- AmbiguousError,
7
- AssertionError,
8
- NotFoundError,
9
- AlreadyExistsError,
10
- ConflictError,
11
- PermissionError,
12
- TimeoutError,
13
- RateLimitError,
14
- NetworkError,
15
- InternalError,
16
- AuthError,
17
- CancelledError,
18
- exitCodeMap,
19
- statusCodeMap,
20
- jsonRpcCodeMap,
21
- retryableMap,
22
- isRetryable,
23
- isTrailsError,
24
- } from '../errors.js';
25
- import type { ErrorCategory } from '../errors.js';
26
-
27
- // ---------------------------------------------------------------------------
28
- // Error class matrix
29
- // ---------------------------------------------------------------------------
30
-
31
- const errorMatrix: readonly {
32
- Class: new (
33
- message: string,
34
- options?: { cause?: Error; context?: Record<string, unknown> }
35
- ) => TrailsError;
36
- category: ErrorCategory;
37
- retryable: boolean;
38
- name: string;
39
- }[] = [
40
- {
41
- Class: ValidationError,
42
- category: 'validation',
43
- name: 'ValidationError',
44
- retryable: false,
45
- },
46
- {
47
- Class: AmbiguousError,
48
- category: 'validation',
49
- name: 'AmbiguousError',
50
- retryable: false,
51
- },
52
- {
53
- Class: AssertionError,
54
- category: 'internal',
55
- name: 'AssertionError',
56
- retryable: false,
57
- },
58
- {
59
- Class: NotFoundError,
60
- category: 'not_found',
61
- name: 'NotFoundError',
62
- retryable: false,
63
- },
64
- {
65
- Class: AlreadyExistsError,
66
- category: 'conflict',
67
- name: 'AlreadyExistsError',
68
- retryable: false,
69
- },
70
- {
71
- Class: ConflictError,
72
- category: 'conflict',
73
- name: 'ConflictError',
74
- retryable: false,
75
- },
76
- {
77
- Class: PermissionError,
78
- category: 'permission',
79
- name: 'PermissionError',
80
- retryable: false,
81
- },
82
- {
83
- Class: TimeoutError,
84
- category: 'timeout',
85
- name: 'TimeoutError',
86
- retryable: true,
87
- },
88
- {
89
- Class: RateLimitError,
90
- category: 'rate_limit',
91
- name: 'RateLimitError',
92
- retryable: true,
93
- },
94
- {
95
- Class: NetworkError,
96
- category: 'network',
97
- name: 'NetworkError',
98
- retryable: true,
99
- },
100
- {
101
- Class: InternalError,
102
- category: 'internal',
103
- name: 'InternalError',
104
- retryable: false,
105
- },
106
- { Class: AuthError, category: 'auth', name: 'AuthError', retryable: false },
107
- {
108
- Class: CancelledError,
109
- category: 'cancelled',
110
- name: 'CancelledError',
111
- retryable: false,
112
- },
113
- ];
114
-
115
- describe('error classes', () => {
116
- // oxlint-disable-next-line prefer-each -- describe.each loses type safety on heterogeneous class matrix
117
- for (const { Class, category, retryable, name } of errorMatrix) {
118
- describe(name, () => {
119
- test('sets correct category', () => {
120
- const err = new Class('test');
121
- expect(err.category).toBe(category);
122
- });
123
-
124
- test('sets correct retryable', () => {
125
- const err = new Class('test');
126
- expect(err.retryable).toBe(retryable);
127
- });
128
-
129
- test('sets message', () => {
130
- const err = new Class('something went wrong');
131
- expect(err.message).toBe('something went wrong');
132
- });
133
-
134
- test('sets name to constructor name', () => {
135
- const err = new Class('test');
136
- expect(err.name).toBe(name);
137
- });
138
-
139
- test('sets cause when provided', () => {
140
- const cause = new Error('root cause');
141
- const err = new Class('test', { cause });
142
- expect(err.cause).toBe(cause);
143
- });
144
-
145
- test('sets context when provided', () => {
146
- const ctx = { action: 'delete', userId: 'u_123' };
147
- const err = new Class('test', { context: ctx });
148
- expect(err.context).toEqual(ctx);
149
- });
150
-
151
- test('context is undefined when not provided', () => {
152
- const err = new Class('test');
153
- expect(err.context).toBeUndefined();
154
- });
155
-
156
- test('is instanceof TrailsError', () => {
157
- const err = new Class('test');
158
- expect(err).toBeInstanceOf(TrailsError);
159
- });
160
-
161
- test('is instanceof Error', () => {
162
- const err = new Class('test');
163
- expect(err).toBeInstanceOf(Error);
164
- });
165
-
166
- test('is instanceof its own class', () => {
167
- const err = new Class('test');
168
- expect(err).toBeInstanceOf(Class);
169
- });
170
- });
171
- }
172
- });
173
-
174
- // ---------------------------------------------------------------------------
175
- // RateLimitError.retryAfter
176
- // ---------------------------------------------------------------------------
177
-
178
- describe('RateLimitError.retryAfter', () => {
179
- test('stores retryAfter when provided', () => {
180
- const err = new RateLimitError('slow down', { retryAfter: 30 });
181
- expect(err.retryAfter).toBe(30);
182
- });
183
-
184
- test('retryAfter is undefined when not provided', () => {
185
- const err = new RateLimitError('slow down');
186
- expect(err.retryAfter).toBeUndefined();
187
- });
188
-
189
- test('retryAfter coexists with cause and context', () => {
190
- const cause = new Error('upstream');
191
- const err = new RateLimitError('slow down', {
192
- cause,
193
- context: { endpoint: '/api' },
194
- retryAfter: 60,
195
- });
196
- expect(err.retryAfter).toBe(60);
197
- expect(err.cause).toBe(cause);
198
- expect(err.context).toEqual({ endpoint: '/api' });
199
- });
200
- });
201
-
202
- // ---------------------------------------------------------------------------
203
- // Taxonomy maps
204
- // ---------------------------------------------------------------------------
205
-
206
- describe('exitCodeMap', () => {
207
- test('maps all categories to expected exit codes', () => {
208
- expect(exitCodeMap.validation).toBe(1);
209
- expect(exitCodeMap.not_found).toBe(2);
210
- expect(exitCodeMap.conflict).toBe(3);
211
- expect(exitCodeMap.permission).toBe(4);
212
- expect(exitCodeMap.timeout).toBe(5);
213
- expect(exitCodeMap.rate_limit).toBe(6);
214
- expect(exitCodeMap.network).toBe(7);
215
- expect(exitCodeMap.internal).toBe(8);
216
- expect(exitCodeMap.auth).toBe(9);
217
- expect(exitCodeMap.cancelled).toBe(130);
218
- });
219
- });
220
-
221
- describe('statusCodeMap', () => {
222
- test('maps all categories to expected HTTP status codes', () => {
223
- expect(statusCodeMap.validation).toBe(400);
224
- expect(statusCodeMap.not_found).toBe(404);
225
- expect(statusCodeMap.conflict).toBe(409);
226
- expect(statusCodeMap.permission).toBe(403);
227
- expect(statusCodeMap.timeout).toBe(504);
228
- expect(statusCodeMap.rate_limit).toBe(429);
229
- expect(statusCodeMap.network).toBe(502);
230
- expect(statusCodeMap.internal).toBe(500);
231
- expect(statusCodeMap.auth).toBe(401);
232
- expect(statusCodeMap.cancelled).toBe(499);
233
- });
234
- });
235
-
236
- describe('jsonRpcCodeMap', () => {
237
- test('maps all categories to expected JSON-RPC codes', () => {
238
- expect(jsonRpcCodeMap.validation).toBe(-32_602);
239
- expect(jsonRpcCodeMap.not_found).toBe(-32_601);
240
- expect(jsonRpcCodeMap.conflict).toBe(-32_603);
241
- expect(jsonRpcCodeMap.permission).toBe(-32_600);
242
- expect(jsonRpcCodeMap.timeout).toBe(-32_603);
243
- expect(jsonRpcCodeMap.rate_limit).toBe(-32_603);
244
- expect(jsonRpcCodeMap.network).toBe(-32_603);
245
- expect(jsonRpcCodeMap.internal).toBe(-32_603);
246
- expect(jsonRpcCodeMap.auth).toBe(-32_600);
247
- expect(jsonRpcCodeMap.cancelled).toBe(-32_603);
248
- });
249
- });
250
-
251
- describe('retryableMap', () => {
252
- test('only timeout, rate_limit, and network are retryable', () => {
253
- expect(retryableMap.timeout).toBe(true);
254
- expect(retryableMap.rate_limit).toBe(true);
255
- expect(retryableMap.network).toBe(true);
256
-
257
- expect(retryableMap.validation).toBe(false);
258
- expect(retryableMap.not_found).toBe(false);
259
- expect(retryableMap.conflict).toBe(false);
260
- expect(retryableMap.permission).toBe(false);
261
- expect(retryableMap.internal).toBe(false);
262
- expect(retryableMap.auth).toBe(false);
263
- expect(retryableMap.cancelled).toBe(false);
264
- });
265
- });
266
-
267
- // ---------------------------------------------------------------------------
268
- // Helper functions
269
- // ---------------------------------------------------------------------------
270
-
271
- describe('isRetryable', () => {
272
- test('returns true for retryable errors', () => {
273
- expect(isRetryable(new TimeoutError('timed out'))).toBe(true);
274
- expect(isRetryable(new RateLimitError('too fast'))).toBe(true);
275
- expect(isRetryable(new NetworkError('disconnected'))).toBe(true);
276
- });
277
-
278
- test('returns false for non-retryable errors', () => {
279
- expect(isRetryable(new ValidationError('bad input'))).toBe(false);
280
- expect(isRetryable(new NotFoundError('missing'))).toBe(false);
281
- expect(isRetryable(new AuthError('unauthorized'))).toBe(false);
282
- expect(isRetryable(new InternalError('oops'))).toBe(false);
283
- expect(isRetryable(new CancelledError('aborted'))).toBe(false);
284
- });
285
-
286
- test('returns false for plain Error', () => {
287
- expect(isRetryable(new Error('generic'))).toBe(false);
288
- });
289
- });
290
-
291
- describe('isTrailsError', () => {
292
- test('returns true for TrailsError subclasses', () => {
293
- expect(isTrailsError(new ValidationError('bad'))).toBe(true);
294
- expect(isTrailsError(new NetworkError('down'))).toBe(true);
295
- expect(isTrailsError(new CancelledError('stop'))).toBe(true);
296
- });
297
-
298
- test('returns false for plain Error', () => {
299
- expect(isTrailsError(new Error('nope'))).toBe(false);
300
- });
301
-
302
- test('returns false for non-error values', () => {
303
- expect(isTrailsError(null)).toBe(false);
304
- expect(isTrailsError()).toBe(false);
305
- expect(isTrailsError('string')).toBe(false);
306
- expect(isTrailsError(42)).toBe(false);
307
- expect(isTrailsError({})).toBe(false);
308
- });
309
- });