@ontrails/core 1.0.0-beta.0 → 1.0.0-beta.1
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 +8 -0
- package/README.md +67 -139
- package/dist/result.d.ts +11 -11
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js.map +1 -1
- package/package.json +1 -1
- package/src/result.ts +11 -11
package/.turbo/turbo-lint.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @ontrails/core
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fix two blocking bugs from real-world migration:
|
|
8
|
+
- Published packages now resolve correctly (workspace:^ instead of workspace:\*)
|
|
9
|
+
- Error forwarding works across different success types (Err no longer carries phantom T)
|
|
10
|
+
|
|
3
11
|
## 1.0.0-beta.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,35 +1,31 @@
|
|
|
1
1
|
# @ontrails/core
|
|
2
2
|
|
|
3
|
-
The foundation
|
|
3
|
+
The foundation. Define trails, compose them into topos, return typed Results, and let the framework derive everything else.
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
bun add @ontrails/core
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Quick Start
|
|
5
|
+
## Usage
|
|
12
6
|
|
|
13
7
|
```typescript
|
|
14
|
-
import { trail,
|
|
8
|
+
import { trail, topo, Result } from '@ontrails/core';
|
|
15
9
|
import { z } from 'zod';
|
|
16
10
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
output: z.object({ name: z.string(), type: z.string() }),
|
|
11
|
+
const greet = trail('greet', {
|
|
12
|
+
input: z.object({ name: z.string().describe('Who to greet') }),
|
|
13
|
+
output: z.object({ message: z.string() }),
|
|
21
14
|
readOnly: true,
|
|
22
15
|
examples: [
|
|
23
|
-
{
|
|
24
|
-
name: 'Show an entity',
|
|
25
|
-
input: { name: 'Alpha' },
|
|
26
|
-
expected: { name: 'Alpha', type: 'concept' },
|
|
27
|
-
},
|
|
16
|
+
{ name: 'Hello', input: { name: 'World' }, expected: { message: 'Hello, World!' } },
|
|
28
17
|
],
|
|
29
|
-
implementation: (input) => Result.ok({
|
|
18
|
+
implementation: (input) => Result.ok({ message: `Hello, ${input.name}!` }),
|
|
30
19
|
});
|
|
31
20
|
|
|
32
|
-
|
|
21
|
+
const app = topo('myapp', { greet });
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Hikes compose trails through `ctx.follow()`:
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { hike } from '@ontrails/core';
|
|
28
|
+
|
|
33
29
|
const onboard = hike('entity.onboard', {
|
|
34
30
|
follows: ['entity.add', 'entity.relate'],
|
|
35
31
|
input: z.object({ name: z.string(), type: z.string() }),
|
|
@@ -39,141 +35,73 @@ const onboard = hike('entity.onboard', {
|
|
|
39
35
|
return Result.ok({ entity: added.value });
|
|
40
36
|
},
|
|
41
37
|
});
|
|
42
|
-
|
|
43
|
-
// Collect into an app
|
|
44
|
-
import * as entity from './trails/entity';
|
|
45
|
-
const app = topo('myapp', entity);
|
|
46
38
|
```
|
|
47
39
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
## API Overview
|
|
51
|
-
|
|
52
|
-
### Trail Primitives
|
|
53
|
-
|
|
54
|
-
- **`trail(id, spec)`** -- Define an atomic unit of work. Typed input via Zod, returns `Result`. Authoring may be sync or async.
|
|
55
|
-
- **`hike(id, spec)`** -- Define a composite that follows multiple trails via `ctx.follow()`. Declares dependencies with `follows: string[]`.
|
|
56
|
-
- **`event(id, spec)`** -- Define a server-originated push with a typed data schema.
|
|
57
|
-
- **`topo(name, ...modules)`** -- Collect trail modules into an app. Scans exports for `Trail` shapes and builds the topo.
|
|
58
|
-
|
|
59
|
-
### Result Type
|
|
60
|
-
|
|
61
|
-
Built-in `Result<T, E>` with no external dependency.
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
Result.ok(value); // Create a success
|
|
65
|
-
Result.err(error); // Create a failure
|
|
66
|
-
Result.combine(results); // Collect Result<T>[] into Result<T[]>
|
|
67
|
-
|
|
68
|
-
result.isOk(); // Type guard for Ok
|
|
69
|
-
result.isErr(); // Type guard for Err
|
|
70
|
-
result.map(fn); // Transform success value
|
|
71
|
-
result.flatMap(fn); // Chain Result-returning functions
|
|
72
|
-
result.match({ ok, err }); // Pattern match
|
|
73
|
-
result.unwrapOr(fallback); // Value or fallback
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Implementations return `Result`, never `throw`.
|
|
77
|
-
|
|
78
|
-
### Error Taxonomy
|
|
40
|
+
## API
|
|
79
41
|
|
|
80
|
-
|
|
42
|
+
### Trail primitives
|
|
81
43
|
|
|
82
|
-
|
|
|
83
|
-
| --- | --- |
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `rate_limit` | `RateLimitError` | 6 | 429 | Yes |
|
|
90
|
-
| `network` | `NetworkError` | 7 | 502 | Yes |
|
|
91
|
-
| `internal` | `InternalError` | 8 | 500 | No |
|
|
92
|
-
| `auth` | `AuthError` | 9 | 401 | No |
|
|
93
|
-
| `cancelled` | `CancelledError` | 130 | 499 | No |
|
|
94
|
-
|
|
95
|
-
All extend `TrailsError` directly (class inheritance, no factory pattern). Pattern matching via `instanceof` or `error.category`.
|
|
96
|
-
|
|
97
|
-
### Patterns (`@ontrails/core/patterns`)
|
|
98
|
-
|
|
99
|
-
Reusable Zod schemas for common input/output shapes:
|
|
100
|
-
|
|
101
|
-
- **Pagination** -- `paginationInput`, `paginationOutput` (cursor-based)
|
|
102
|
-
- **Bulk operations** -- `bulkInput`, `bulkOutput` (batch with per-item results)
|
|
103
|
-
- **Timestamps** -- `timestamps` (`createdAt`/`updatedAt`)
|
|
104
|
-
- **Date ranges** -- `dateRangeInput` (`since`/`until`)
|
|
105
|
-
- **Sorting** -- `sortInput` (`sortBy`/`sortOrder`)
|
|
106
|
-
- **Status** -- `statusField` (lifecycle state)
|
|
107
|
-
- **Change tracking** -- `changeOutput` (before/after snapshots)
|
|
108
|
-
- **Progress** -- `progressOutput` (completion reporting)
|
|
109
|
-
|
|
110
|
-
### Redaction (`@ontrails/core/redaction`)
|
|
44
|
+
| Export | What it does |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| `trail(id, spec)` | Define an atomic unit of work with typed input and `Result` output |
|
|
47
|
+
| `hike(id, spec)` | Define a composition that follows other trails via `ctx.follow()` |
|
|
48
|
+
| `event(id, spec)` | Define a server-originated push with a typed data schema |
|
|
49
|
+
| `topo(name, ...modules)` | Collect trail modules into a queryable topology |
|
|
50
|
+
| `validateTopo(topo)` | Structural validation: follows exist, no cycles, examples parse, output schemas present |
|
|
111
51
|
|
|
112
|
-
|
|
52
|
+
### Result
|
|
113
53
|
|
|
114
54
|
```typescript
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
55
|
+
Result.ok(value); // Success
|
|
56
|
+
Result.err(error); // Failure
|
|
57
|
+
Result.combine(results); // Result<T>[] → Result<T[]>
|
|
58
|
+
Result.fromJson(json); // Parse JSON string into Result
|
|
59
|
+
Result.toJson(value); // Serialize to JSON string as Result
|
|
60
|
+
Result.fromFetch(response); // Convert fetch Response to Result
|
|
61
|
+
|
|
62
|
+
result.isOk(); // Type guard
|
|
63
|
+
result.isErr(); // Type guard
|
|
64
|
+
result.map(fn); // Transform success
|
|
65
|
+
result.flatMap(fn); // Chain Result-returning functions
|
|
66
|
+
result.match({ ok, err }); // Pattern match
|
|
67
|
+
result.unwrapOr(fallback); // Value or fallback
|
|
125
68
|
```
|
|
126
69
|
|
|
127
|
-
###
|
|
128
|
-
|
|
129
|
-
- **`validateInput(schema, data)`** -- Validate data against a Zod schema, returning `Result`.
|
|
130
|
-
- **`formatZodIssues(issues)`** -- Format Zod issues into human-readable strings.
|
|
131
|
-
- **`zodToJsonSchema(schema)`** -- Convert a Zod schema to JSON Schema for MCP/HTTP surfaces.
|
|
70
|
+
### Error taxonomy
|
|
132
71
|
|
|
133
|
-
|
|
72
|
+
13 error classes across 10 categories. Each maps deterministically to exit codes, HTTP status, and JSON-RPC codes on every surface.
|
|
134
73
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
74
|
+
| Category | Classes | HTTP | Retryable |
|
|
75
|
+
| --- | --- | --- | --- |
|
|
76
|
+
| `validation` | `ValidationError`, `AmbiguousError`, `AssertionError` | 400 | No |
|
|
77
|
+
| `not_found` | `NotFoundError` | 404 | No |
|
|
78
|
+
| `conflict` | `AlreadyExistsError`, `ConflictError` | 409 | No |
|
|
79
|
+
| `permission` | `PermissionError` | 403 | No |
|
|
80
|
+
| `timeout` | `TimeoutError` | 504 | Yes |
|
|
81
|
+
| `rate_limit` | `RateLimitError` | 429 | Yes |
|
|
82
|
+
| `network` | `NetworkError` | 502 | Yes |
|
|
83
|
+
| `internal` | `InternalError` | 500 | No |
|
|
84
|
+
| `auth` | `AuthError` | 401 | No |
|
|
85
|
+
| `cancelled` | `CancelledError` | 499 | No |
|
|
139
86
|
|
|
140
|
-
|
|
141
|
-
const addr = email('user@example.com');
|
|
142
|
-
```
|
|
87
|
+
The developer returns `Result.err(new NotFoundError(...))`. The framework maps it to the right code on every surface.
|
|
143
88
|
|
|
144
|
-
###
|
|
89
|
+
### Other exports
|
|
145
90
|
|
|
146
|
-
- **
|
|
147
|
-
- **
|
|
91
|
+
- **Schema derivation** -- `deriveFields(schema)` extracts field metadata from Zod for prompts and forms
|
|
92
|
+
- **Validation** -- `validateInput`, `formatZodIssues`, `zodToJsonSchema`
|
|
148
93
|
- **Resilience** -- `retry`, `withTimeout`, `shouldRetry`, `getBackoffDelay`
|
|
149
|
-
- **Serialization** -- `serializeError`, `deserializeError
|
|
150
|
-
- **
|
|
151
|
-
- **
|
|
94
|
+
- **Serialization** -- `serializeError`, `deserializeError`
|
|
95
|
+
- **Branded types** -- `uuid`, `email`, `nonEmptyString`, `positiveInt`
|
|
96
|
+
- **Layers** -- cross-cutting middleware via `composeLayers`
|
|
97
|
+
- **Guards and collections** -- `isDefined`, `chunk`, `dedupe`, `groupBy`, `sortBy`
|
|
98
|
+
- **Patterns** (`@ontrails/core/patterns`) -- reusable Zod schemas for pagination, bulk ops, timestamps, sorting
|
|
99
|
+
- **Redaction** (`@ontrails/core/redaction`) -- strip sensitive data before logging
|
|
152
100
|
|
|
153
|
-
|
|
101
|
+
See the [API Reference](../../docs/api-reference.md) for the full list.
|
|
154
102
|
|
|
155
|
-
|
|
103
|
+
## Installation
|
|
156
104
|
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
name: 'logging',
|
|
160
|
-
wrap: (next, trail) => async (input, ctx) => {
|
|
161
|
-
ctx.logger.info(`Executing ${trail.id}`);
|
|
162
|
-
return next(input, ctx);
|
|
163
|
-
},
|
|
164
|
-
};
|
|
105
|
+
```bash
|
|
106
|
+
bun add @ontrails/core zod
|
|
165
107
|
```
|
|
166
|
-
|
|
167
|
-
## Subpath Exports
|
|
168
|
-
|
|
169
|
-
| Export | Contents |
|
|
170
|
-
| --- | --- |
|
|
171
|
-
| `@ontrails/core` | trail, hike, event, topo, Result, errors, types, validation, guards, collections, layers |
|
|
172
|
-
| `@ontrails/core/patterns` | Reusable Zod schema patterns |
|
|
173
|
-
| `@ontrails/core/redaction` | Redactor, default patterns and keys |
|
|
174
|
-
|
|
175
|
-
## Further Reading
|
|
176
|
-
|
|
177
|
-
- [Getting Started](../../docs/getting-started.md)
|
|
178
|
-
- [Architecture](../../docs/architecture.md)
|
|
179
|
-
- [Vocabulary](../../docs/vocabulary.md)
|
package/dist/result.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ declare class Ok<T, E> {
|
|
|
6
6
|
readonly value: T;
|
|
7
7
|
constructor(value: T);
|
|
8
8
|
isOk(): this is Ok<T, E>;
|
|
9
|
-
isErr(): this is Err<
|
|
9
|
+
isErr(): this is Err<E>;
|
|
10
10
|
map<U>(fn: (value: T) => U): Result<U, E>;
|
|
11
11
|
flatMap<U, F = E>(fn: (value: T) => Result<U, F>): Result<U, E | F>;
|
|
12
12
|
mapErr<F>(_fn: (error: E) => F): Result<T, F>;
|
|
@@ -17,25 +17,25 @@ declare class Ok<T, E> {
|
|
|
17
17
|
unwrap(): T;
|
|
18
18
|
unwrapOr(_fallback: T): T;
|
|
19
19
|
}
|
|
20
|
-
declare class Err<
|
|
20
|
+
declare class Err<E> {
|
|
21
21
|
readonly error: E;
|
|
22
22
|
constructor(error: E);
|
|
23
|
-
isOk(): this is Ok<
|
|
24
|
-
isErr(): this is Err<
|
|
25
|
-
map<U>(_fn: (value:
|
|
26
|
-
flatMap<U, F = E>(_fn: (value:
|
|
27
|
-
mapErr<F>(fn: (error: E) => F): Result<
|
|
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
28
|
match<U>(handlers: {
|
|
29
|
-
ok: (value:
|
|
29
|
+
ok: (value: never) => U;
|
|
30
30
|
err: (error: E) => U;
|
|
31
31
|
}): U;
|
|
32
32
|
unwrap(): never;
|
|
33
|
-
unwrapOr(fallback: T): T;
|
|
33
|
+
unwrapOr<T>(fallback: T): T;
|
|
34
34
|
}
|
|
35
|
-
export type Result<T, E = Error> = Ok<T, E> | Err<
|
|
35
|
+
export type Result<T, E = Error> = Ok<T, E> | Err<E>;
|
|
36
36
|
export declare const Result: {
|
|
37
37
|
readonly combine: <T, E>(results: readonly Result<T, E>[]) => Result<T[], E>;
|
|
38
|
-
readonly err: <E>(error: E) =>
|
|
38
|
+
readonly err: <E>(error: E) => Err<E>;
|
|
39
39
|
/**
|
|
40
40
|
* Wrap a fetch call in a Result, mapping failures to TrailsError subclasses.
|
|
41
41
|
*
|
package/dist/result.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,cAAM,EAAE,CAAC,CAAC,EAAE,CAAC;IACX,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEN,KAAK,EAAE,CAAC;IAKpB,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAKxB,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
|
package/dist/result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,EAAE;IACG,KAAK,CAAI;IAElB,YAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,+FAA+F;IAC/F,IAAI;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+FAA+F;IAC/F,KAAK;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAI,EAAmB;QACxB,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAW,EAA8B;QAC9C,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,CAAI,GAAoB;QAC5B,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAI,QAAuD;QAC9D,OAAO,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,SAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,+FAA+F;AAC/F,MAAM,GAAG;IACE,KAAK,CAAI;IAElB,YAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,+FAA+F;IAC/F,IAAI;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+FAA+F;IAC/F,KAAK;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAI,
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/result.ts
CHANGED
|
@@ -17,7 +17,7 @@ class Ok<T, E> {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// oxlint-disable-next-line class-methods-use-this -- type guard for Result discriminated union
|
|
20
|
-
isErr(): this is Err<
|
|
20
|
+
isErr(): this is Err<E> {
|
|
21
21
|
return false;
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -47,7 +47,7 @@ class Ok<T, E> {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
// oxlint-disable-next-line max-classes-per-file -- Result monad requires paired Ok/Err classes
|
|
50
|
-
class Err<
|
|
50
|
+
class Err<E> {
|
|
51
51
|
readonly error: E;
|
|
52
52
|
|
|
53
53
|
constructor(error: E) {
|
|
@@ -55,28 +55,28 @@ class Err<T, E> {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// oxlint-disable-next-line class-methods-use-this -- type guard for Result discriminated union
|
|
58
|
-
isOk(): this is Ok<
|
|
58
|
+
isOk(): this is Ok<never, E> {
|
|
59
59
|
return false;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
// oxlint-disable-next-line class-methods-use-this -- type guard for Result discriminated union
|
|
63
|
-
isErr(): this is Err<
|
|
63
|
+
isErr(): this is Err<E> {
|
|
64
64
|
return true;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
map<U>(_fn: (value:
|
|
67
|
+
map<U>(_fn: (value: never) => U): Result<U, E> {
|
|
68
68
|
return new Err(this.error);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
flatMap<U, F = E>(_fn: (value:
|
|
71
|
+
flatMap<U, F = E>(_fn: (value: never) => Result<U, F>): Result<U, E | F> {
|
|
72
72
|
return new Err(this.error);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
mapErr<F>(fn: (error: E) => F): Result<
|
|
75
|
+
mapErr<F>(fn: (error: E) => F): Result<never, F> {
|
|
76
76
|
return new Err(fn(this.error));
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
match<U>(handlers: { ok: (value:
|
|
79
|
+
match<U>(handlers: { ok: (value: never) => U; err: (error: E) => U }): U {
|
|
80
80
|
return handlers.err(this.error);
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -87,12 +87,12 @@ class Err<T, E> {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
// oxlint-disable-next-line class-methods-use-this -- symmetric API with Ok.unwrapOr
|
|
90
|
-
unwrapOr(fallback: T): T {
|
|
90
|
+
unwrapOr<T>(fallback: T): T {
|
|
91
91
|
return fallback;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
export type Result<T, E = Error> = Ok<T, E> | Err<
|
|
95
|
+
export type Result<T, E = Error> = Ok<T, E> | Err<E>;
|
|
96
96
|
|
|
97
97
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
98
98
|
export const Result = {
|
|
@@ -107,7 +107,7 @@ export const Result = {
|
|
|
107
107
|
return new Ok(values);
|
|
108
108
|
},
|
|
109
109
|
|
|
110
|
-
err<E>(error: E):
|
|
110
|
+
err<E>(error: E): Err<E> {
|
|
111
111
|
return new Err(error);
|
|
112
112
|
},
|
|
113
113
|
|