@ontrails/core 1.0.0-beta.13 → 1.0.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +17 -0
- package/README.md +19 -14
- package/dist/branded.d.ts +1 -1
- package/dist/branded.d.ts.map +1 -1
- package/dist/branded.js +1 -1
- package/dist/branded.js.map +1 -1
- package/dist/context.d.ts +13 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +19 -3
- package/dist/context.js.map +1 -1
- package/dist/contour.d.ts +81 -0
- package/dist/contour.d.ts.map +1 -0
- package/dist/contour.js +176 -0
- package/dist/contour.js.map +1 -0
- package/dist/cross-schema.d.ts +18 -0
- package/dist/cross-schema.d.ts.map +1 -0
- package/dist/cross-schema.js +29 -0
- package/dist/cross-schema.js.map +1 -0
- package/dist/derive.d.ts +6 -0
- package/dist/derive.d.ts.map +1 -1
- package/dist/derive.js +29 -5
- package/dist/derive.js.map +1 -1
- package/dist/draft.d.ts +28 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js +157 -0
- package/dist/draft.js.map +1 -0
- package/dist/errors.d.ts +62 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +44 -1
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +26 -9
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +441 -20
- package/dist/execute.js.map +1 -1
- package/dist/fire.d.ts +43 -0
- package/dist/fire.d.ts.map +1 -0
- package/dist/fire.js +185 -0
- package/dist/fire.js.map +1 -0
- package/dist/index.d.ts +33 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -12
- package/dist/index.js.map +1 -1
- package/dist/internal/cross-batch.d.ts +44 -0
- package/dist/internal/cross-batch.d.ts.map +1 -0
- package/dist/internal/cross-batch.js +58 -0
- package/dist/internal/cross-batch.js.map +1 -0
- package/dist/internal/fork-ctx.d.ts +41 -0
- package/dist/internal/fork-ctx.d.ts.map +1 -0
- package/dist/internal/fork-ctx.js +47 -0
- package/dist/internal/fork-ctx.js.map +1 -0
- package/dist/internal/signal-ref.d.ts +15 -0
- package/dist/internal/signal-ref.d.ts.map +1 -0
- package/dist/internal/signal-ref.js +41 -0
- package/dist/internal/signal-ref.js.map +1 -0
- package/dist/internal/topo-saves.d.ts +53 -0
- package/dist/internal/topo-saves.d.ts.map +1 -0
- package/dist/internal/topo-saves.js +449 -0
- package/dist/internal/topo-saves.js.map +1 -0
- package/dist/internal/topo-snapshots.d.ts +57 -0
- package/dist/internal/topo-snapshots.d.ts.map +1 -0
- package/dist/internal/topo-snapshots.js +372 -0
- package/dist/internal/topo-snapshots.js.map +1 -0
- package/dist/internal/topo-store-read.d.ts +70 -0
- package/dist/internal/topo-store-read.d.ts.map +1 -0
- package/dist/internal/topo-store-read.js +221 -0
- package/dist/internal/topo-store-read.js.map +1 -0
- package/dist/internal/topo-store.d.ts +26 -0
- package/dist/internal/topo-store.d.ts.map +1 -0
- package/dist/internal/topo-store.js +621 -0
- package/dist/internal/topo-store.js.map +1 -0
- package/dist/internal/tracing.d.ts +98 -0
- package/dist/internal/tracing.d.ts.map +1 -0
- package/dist/internal/tracing.js +102 -0
- package/dist/internal/tracing.js.map +1 -0
- package/dist/internal/trails-db.d.ts +16 -0
- package/dist/internal/trails-db.d.ts.map +1 -0
- package/dist/internal/trails-db.js +118 -0
- package/dist/internal/trails-db.js.map +1 -0
- package/dist/internal/zod-wrappers.d.ts +40 -0
- package/dist/internal/zod-wrappers.d.ts.map +1 -0
- package/dist/internal/zod-wrappers.js +59 -0
- package/dist/internal/zod-wrappers.js.map +1 -0
- package/dist/layer.d.ts +22 -5
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +20 -3
- package/dist/layer.js.map +1 -1
- package/dist/path-security.d.ts +1 -1
- package/dist/path-security.d.ts.map +1 -1
- package/dist/path-security.js +1 -1
- package/dist/path-security.js.map +1 -1
- package/dist/resilience.d.ts +1 -1
- package/dist/resilience.d.ts.map +1 -1
- package/dist/resilience.js +3 -3
- package/dist/resilience.js.map +1 -1
- package/dist/resource-config.d.ts +22 -0
- package/dist/resource-config.d.ts.map +1 -0
- package/dist/resource-config.js +210 -0
- package/dist/resource-config.js.map +1 -0
- package/dist/resource.d.ts +74 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +61 -0
- package/dist/resource.js.map +1 -0
- package/dist/run.d.ts +4 -3
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +5 -4
- package/dist/run.js.map +1 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2 -1
- package/dist/serialization.js.map +1 -1
- package/dist/store/accessor-protocol.d.ts +51 -0
- package/dist/store/accessor-protocol.d.ts.map +1 -0
- package/dist/store/accessor-protocol.js +2 -0
- package/dist/store/accessor-protocol.js.map +1 -0
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -0
- package/dist/surface-filter.d.ts +13 -0
- package/dist/surface-filter.d.ts.map +1 -0
- package/dist/surface-filter.js +76 -0
- package/dist/surface-filter.js.map +1 -0
- package/dist/topo-store.d.ts +62 -0
- package/dist/topo-store.d.ts.map +1 -0
- package/dist/topo-store.js +319 -0
- package/dist/topo-store.js.map +1 -0
- package/dist/topo.d.ts +23 -9
- package/dist/topo.d.ts.map +1 -1
- package/dist/topo.js +175 -46
- package/dist/topo.js.map +1 -1
- package/dist/trail.d.ts +86 -19
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +59 -4
- package/dist/trail.js.map +1 -1
- package/dist/trails/derive-trail.d.ts +66 -0
- package/dist/trails/derive-trail.d.ts.map +1 -0
- package/dist/trails/derive-trail.js +378 -0
- package/dist/trails/derive-trail.js.map +1 -0
- package/dist/trails/index.d.ts +5 -0
- package/dist/trails/index.d.ts.map +1 -0
- package/dist/trails/index.js +3 -0
- package/dist/trails/index.js.map +1 -0
- package/dist/trails/ingest.d.ts +24 -0
- package/dist/trails/ingest.d.ts.map +1 -0
- package/dist/trails/ingest.js +63 -0
- package/dist/trails/ingest.js.map +1 -0
- package/dist/transport-error-map.d.ts +106 -0
- package/dist/transport-error-map.d.ts.map +1 -0
- package/dist/transport-error-map.js +24 -0
- package/dist/transport-error-map.js.map +1 -0
- package/dist/type-checks.test-d.d.ts +71 -0
- package/dist/type-checks.test-d.d.ts.map +1 -0
- package/dist/type-checks.test-d.js +12 -0
- package/dist/type-checks.test-d.js.map +1 -0
- package/dist/type-utils.d.ts +11 -2
- package/dist/type-utils.d.ts.map +1 -1
- package/dist/type-utils.js.map +1 -1
- package/dist/types.d.ts +113 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validate-established-topo.d.ts +76 -0
- package/dist/validate-established-topo.d.ts.map +1 -0
- package/dist/validate-established-topo.js +43 -0
- package/dist/validate-established-topo.js.map +1 -0
- package/dist/validate-topo.d.ts.map +1 -1
- package/dist/validate-topo.js +27 -8
- package/dist/validate-topo.js.map +1 -1
- package/dist/workspace.d.ts +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -1
- package/dist/workspace.js.map +1 -1
- package/package.json +10 -1
- package/src/__tests__/branded.test.ts +5 -5
- package/src/__tests__/context.test.ts +3 -3
- package/src/__tests__/contour.test.ts +263 -0
- package/src/__tests__/derive-trail.test.ts +668 -0
- package/src/__tests__/derive.test.ts +58 -1
- package/src/__tests__/errors.test.ts +118 -0
- package/src/__tests__/execute.test.ts +1179 -141
- package/src/__tests__/fire.test.ts +1056 -0
- package/src/__tests__/fork-ctx.test.ts +83 -0
- package/src/__tests__/ingest.test.ts +191 -0
- package/src/__tests__/{gate.test.ts → layer.test.ts} +21 -21
- package/src/__tests__/path-security.test.ts +7 -7
- package/src/__tests__/resilience.test.ts +8 -8
- package/src/__tests__/resource.test.ts +204 -0
- package/src/__tests__/run.test.ts +13 -13
- package/src/__tests__/service-config.test.ts +28 -32
- package/src/__tests__/surface-filter.test.ts +196 -0
- package/src/__tests__/topo-store-read.test.ts +256 -0
- package/src/__tests__/topo-store.test.ts +869 -0
- package/src/__tests__/topo.test.ts +350 -54
- package/src/__tests__/trail.test.ts +189 -24
- package/src/__tests__/trails-db.test.ts +198 -0
- package/src/__tests__/transport-error-map.test.ts +82 -0
- package/src/__tests__/type-utils.test.ts +29 -1
- package/src/__tests__/validate-topo.test.ts +305 -16
- package/src/__tests__/workspace.test.ts +6 -6
- package/src/__tests__/zod-wrappers.test.ts +62 -0
- package/src/branded.ts +1 -1
- package/src/context.ts +24 -4
- package/src/contour.ts +344 -0
- package/src/cross-schema.ts +36 -0
- package/src/derive.ts +39 -8
- package/src/draft.ts +338 -0
- package/src/errors.ts +62 -18
- package/src/execute.ts +840 -29
- package/src/fire.ts +295 -0
- package/src/index.ts +142 -26
- package/src/internal/cross-batch.ts +77 -0
- package/src/internal/fork-ctx.ts +69 -0
- package/src/internal/signal-ref.ts +87 -0
- package/src/internal/topo-snapshots.ts +517 -0
- package/src/internal/topo-store-read.ts +481 -0
- package/src/internal/topo-store.ts +1192 -0
- package/src/internal/tracing.ts +187 -0
- package/src/internal/trails-db.ts +187 -0
- package/src/internal/zod-wrappers.ts +78 -0
- package/src/layer.ts +50 -0
- package/src/path-security.ts +1 -1
- package/src/resilience.ts +3 -3
- package/src/{provision-config.ts → resource-config.ts} +109 -123
- package/src/resource.ts +155 -0
- package/src/run.ts +5 -4
- package/src/serialization.ts +2 -0
- package/src/store/accessor-protocol.ts +56 -0
- package/src/store/index.ts +4 -0
- package/src/surface-filter.ts +182 -0
- package/src/topo-store.ts +510 -0
- package/src/topo.ts +328 -57
- package/src/trail.ts +199 -31
- package/src/trails/derive-trail.ts +842 -0
- package/src/trails/index.ts +9 -0
- package/src/trails/ingest.ts +146 -0
- package/src/transport-error-map.ts +56 -0
- package/src/type-checks.test-d.ts +106 -0
- package/src/type-utils.ts +17 -2
- package/src/types.ts +148 -11
- package/src/validate-established-topo.ts +63 -0
- package/src/validate-topo.ts +37 -9
- package/src/workspace.ts +1 -1
- package/tsconfig.tests.json +10 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/adapters.d.ts +0 -39
- package/dist/adapters.d.ts.map +0 -1
- package/dist/adapters.js +0 -2
- package/dist/adapters.js.map +0 -1
- package/dist/dispatch.d.ts +0 -27
- package/dist/dispatch.d.ts.map +0 -1
- package/dist/dispatch.js +0 -34
- package/dist/dispatch.js.map +0 -1
- package/dist/event.d.ts +0 -8
- package/dist/event.d.ts.map +0 -1
- package/dist/event.js +0 -7
- package/dist/event.js.map +0 -1
- package/dist/gate.d.ts +0 -17
- package/dist/gate.d.ts.map +0 -1
- package/dist/gate.js +0 -21
- package/dist/gate.js.map +0 -1
- package/dist/health.d.ts +0 -18
- package/dist/health.d.ts.map +0 -1
- package/dist/health.js +0 -5
- package/dist/health.js.map +0 -1
- package/dist/job.d.ts +0 -24
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -17
- package/dist/job.js.map +0 -1
- package/dist/provision-config.d.ts +0 -22
- package/dist/provision-config.d.ts.map +0 -1
- package/dist/provision-config.js +0 -210
- package/dist/provision-config.js.map +0 -1
- package/dist/provision.d.ts +0 -71
- package/dist/provision.d.ts.map +0 -1
- package/dist/provision.js +0 -56
- package/dist/provision.js.map +0 -1
- package/dist/service-config.d.ts +0 -22
- package/dist/service-config.d.ts.map +0 -1
- package/dist/service-config.js +0 -210
- package/dist/service-config.js.map +0 -1
- package/dist/service.d.ts +0 -71
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -56
- package/dist/service.js.map +0 -1
- package/src/__tests__/service.test.ts +0 -197
- package/src/event.ts +0 -15
- package/src/gate.ts +0 -44
- package/src/provision.ts +0 -148
|
@@ -2,13 +2,45 @@ import { describe, test, expect } from 'bun:test';
|
|
|
2
2
|
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
|
|
5
|
-
import { deriveFields } from '../derive.js';
|
|
5
|
+
import { deriveCliPath, deriveFields } from '../derive.js';
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
// Tests
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
10
|
|
|
11
11
|
describe('derive', () => {
|
|
12
|
+
describe('cli paths', () => {
|
|
13
|
+
test('top-level trail IDs derive to a one-segment CLI path', () => {
|
|
14
|
+
expect(deriveCliPath('search')).toEqual(['search']);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('multi-dot trail IDs derive to the full ordered CLI path', () => {
|
|
18
|
+
expect(deriveCliPath('topo.pin.remove')).toEqual([
|
|
19
|
+
'topo',
|
|
20
|
+
'pin',
|
|
21
|
+
'remove',
|
|
22
|
+
]);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('trail IDs with consecutive dots throw a ValidationError', () => {
|
|
26
|
+
expect(() => deriveCliPath('topo..pin')).toThrow(
|
|
27
|
+
'Trail ID "topo..pin" contains an empty segment'
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('trail IDs with a leading dot throw a ValidationError', () => {
|
|
32
|
+
expect(() => deriveCliPath('.pin')).toThrow(
|
|
33
|
+
'Trail ID ".pin" contains an empty segment'
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('trail IDs with a trailing dot throw a ValidationError', () => {
|
|
38
|
+
expect(() => deriveCliPath('pin.')).toThrow(
|
|
39
|
+
'Trail ID "pin." contains an empty segment'
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
12
44
|
describe('primitive types', () => {
|
|
13
45
|
test('z.string() derives string field', () => {
|
|
14
46
|
const schema = z.object({ name: z.string() });
|
|
@@ -119,6 +151,31 @@ describe('derive', () => {
|
|
|
119
151
|
expect(fields[0]?.type).toBe('string[]');
|
|
120
152
|
expect(fields[0]?.default).toEqual(['a', 'b']);
|
|
121
153
|
});
|
|
154
|
+
|
|
155
|
+
test('z.array(z.object(...)) is omitted when it cannot be represented faithfully', () => {
|
|
156
|
+
const schema = z.object({
|
|
157
|
+
files: z.array(
|
|
158
|
+
z.object({
|
|
159
|
+
content: z.string(),
|
|
160
|
+
filename: z.string(),
|
|
161
|
+
})
|
|
162
|
+
),
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
expect(deriveFields(schema)).toEqual([]);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe('unsupported shapes', () => {
|
|
170
|
+
test('nested objects are omitted when they cannot be represented faithfully', () => {
|
|
171
|
+
const schema = z.object({
|
|
172
|
+
filter: z.object({
|
|
173
|
+
query: z.string(),
|
|
174
|
+
}),
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
expect(deriveFields(schema)).toEqual([]);
|
|
178
|
+
});
|
|
122
179
|
});
|
|
123
180
|
|
|
124
181
|
describe('modifiers', () => {
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
InternalError,
|
|
16
16
|
AuthError,
|
|
17
17
|
CancelledError,
|
|
18
|
+
RetryExhaustedError,
|
|
18
19
|
exitCodeMap,
|
|
19
20
|
statusCodeMap,
|
|
20
21
|
jsonRpcCodeMap,
|
|
@@ -307,3 +308,120 @@ describe('isTrailsError', () => {
|
|
|
307
308
|
expect(isTrailsError({})).toBe(false);
|
|
308
309
|
});
|
|
309
310
|
});
|
|
311
|
+
|
|
312
|
+
// ---------------------------------------------------------------------------
|
|
313
|
+
// RetryExhaustedError
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
|
|
316
|
+
describe('RetryExhaustedError', () => {
|
|
317
|
+
describe('category and retryability', () => {
|
|
318
|
+
test('inherits category from wrapped error', () => {
|
|
319
|
+
const err = new RetryExhaustedError(new ConflictError('conflict'), {
|
|
320
|
+
attempts: 1,
|
|
321
|
+
detour: 'ConflictError',
|
|
322
|
+
});
|
|
323
|
+
expect(err.category).toBe('conflict');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test('inherits category from retryable error class', () => {
|
|
327
|
+
const err = new RetryExhaustedError(new TimeoutError('timed out'), {
|
|
328
|
+
attempts: 3,
|
|
329
|
+
detour: 'TimeoutError',
|
|
330
|
+
});
|
|
331
|
+
expect(err.category).toBe('timeout');
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
test('retryable is always false regardless of wrapped category', () => {
|
|
335
|
+
const fromTimeout = new RetryExhaustedError(
|
|
336
|
+
new TimeoutError('timed out'),
|
|
337
|
+
{ attempts: 3, detour: 'TimeoutError' }
|
|
338
|
+
);
|
|
339
|
+
expect(fromTimeout.retryable).toBe(false);
|
|
340
|
+
|
|
341
|
+
const fromNetwork = new RetryExhaustedError(
|
|
342
|
+
new NetworkError('disconnected'),
|
|
343
|
+
{ attempts: 2, detour: 'NetworkError' }
|
|
344
|
+
);
|
|
345
|
+
expect(fromNetwork.retryable).toBe(false);
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
test('isRetryable returns false even when wrapping a retryable error', () => {
|
|
349
|
+
const err = new RetryExhaustedError(new TimeoutError('timed out'), {
|
|
350
|
+
attempts: 3,
|
|
351
|
+
detour: 'TimeoutError',
|
|
352
|
+
});
|
|
353
|
+
expect(isRetryable(err)).toBe(false);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
describe('metadata properties', () => {
|
|
358
|
+
test('cause preserves the original error', () => {
|
|
359
|
+
const original = new ConflictError('version mismatch');
|
|
360
|
+
const err = new RetryExhaustedError(original, {
|
|
361
|
+
attempts: 1,
|
|
362
|
+
detour: 'ConflictError',
|
|
363
|
+
});
|
|
364
|
+
expect(err.cause).toBe(original);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test('exposes attempts as a typed readonly property', () => {
|
|
368
|
+
const err = new RetryExhaustedError(
|
|
369
|
+
new ConflictError('version mismatch'),
|
|
370
|
+
{ attempts: 3, detour: 'ConflictError' }
|
|
371
|
+
);
|
|
372
|
+
expect(err.attempts).toBe(3);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
test('exposes detour as a typed readonly property', () => {
|
|
376
|
+
const err = new RetryExhaustedError(new TimeoutError('timed out'), {
|
|
377
|
+
attempts: 2,
|
|
378
|
+
detour: 'TimeoutRetry',
|
|
379
|
+
});
|
|
380
|
+
expect(err.detour).toBe('TimeoutRetry');
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
test('message includes attempt count and wrapped message', () => {
|
|
384
|
+
const err = new RetryExhaustedError(
|
|
385
|
+
new ConflictError('version mismatch'),
|
|
386
|
+
{ attempts: 3, detour: 'ConflictError' }
|
|
387
|
+
);
|
|
388
|
+
expect(err.message).toBe(
|
|
389
|
+
'Recovery exhausted after 3 attempts: version mismatch'
|
|
390
|
+
);
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
describe('identity', () => {
|
|
395
|
+
test('is instanceof InternalError', () => {
|
|
396
|
+
const err = new RetryExhaustedError(new ConflictError('x'), {
|
|
397
|
+
attempts: 1,
|
|
398
|
+
detour: 'ConflictError',
|
|
399
|
+
});
|
|
400
|
+
expect(err).toBeInstanceOf(InternalError);
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
test('name is RetryExhaustedError', () => {
|
|
404
|
+
const err = new RetryExhaustedError(new ConflictError('x'), {
|
|
405
|
+
attempts: 1,
|
|
406
|
+
detour: 'ConflictError',
|
|
407
|
+
});
|
|
408
|
+
expect(err.name).toBe('RetryExhaustedError');
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
test('is instanceof TrailsError', () => {
|
|
412
|
+
const err = new RetryExhaustedError(new ConflictError('x'), {
|
|
413
|
+
attempts: 1,
|
|
414
|
+
detour: 'ConflictError',
|
|
415
|
+
});
|
|
416
|
+
expect(err).toBeInstanceOf(TrailsError);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
test('is instanceof Error', () => {
|
|
420
|
+
const err = new RetryExhaustedError(new ConflictError('x'), {
|
|
421
|
+
attempts: 1,
|
|
422
|
+
detour: 'ConflictError',
|
|
423
|
+
});
|
|
424
|
+
expect(err).toBeInstanceOf(Error);
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
});
|