selaws 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +355 -2
- package/dist/evidence.d.ts +45 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +22 -0
- package/dist/evidence.js.map +1 -0
- package/dist/identity.d.ts +52 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +22 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/callback.d.ts +13 -0
- package/dist/internal/callback.d.ts.map +1 -0
- package/dist/internal/callback.js +2 -0
- package/dist/internal/callback.js.map +1 -0
- package/dist/internal/promise-like.d.ts +8 -0
- package/dist/internal/promise-like.d.ts.map +1 -0
- package/dist/internal/promise-like.js +12 -0
- package/dist/internal/promise-like.js.map +1 -0
- package/dist/internal/scalar.d.ts +18 -0
- package/dist/internal/scalar.d.ts.map +1 -0
- package/dist/internal/scalar.js +6 -0
- package/dist/internal/scalar.js.map +1 -0
- package/dist/option.d.ts +90 -0
- package/dist/option.d.ts.map +1 -0
- package/dist/option.js +96 -0
- package/dist/option.js.map +1 -0
- package/dist/protocol.d.ts +42 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +67 -0
- package/dist/protocol.js.map +1 -0
- package/dist/result/capture.d.ts +42 -0
- package/dist/result/capture.d.ts.map +1 -0
- package/dist/result/capture.js +41 -0
- package/dist/result/capture.js.map +1 -0
- package/dist/result/core.d.ts +98 -0
- package/dist/result/core.d.ts.map +1 -0
- package/dist/result/core.js +103 -0
- package/dist/result/core.js.map +1 -0
- package/dist/result/index.d.ts +4 -0
- package/dist/result/index.d.ts.map +1 -0
- package/dist/result/index.js +4 -0
- package/dist/result/index.js.map +1 -0
- package/dist/result/throw.d.ts +4 -0
- package/dist/result/throw.d.ts.map +1 -0
- package/dist/result/throw.js +8 -0
- package/dist/result/throw.js.map +1 -0
- package/dist/validation.d.ts +126 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +240 -0
- package/dist/validation.js.map +1 -0
- package/dist/variant.d.ts +97 -0
- package/dist/variant.d.ts.map +1 -0
- package/dist/variant.js +102 -0
- package/dist/variant.js.map +1 -0
- package/docs/API.md +543 -0
- package/docs/GUIDE.md +739 -0
- package/docs/SEMANTICS.md +319 -0
- package/docs/laws/evidence.md +113 -0
- package/docs/laws/identity.md +126 -0
- package/docs/laws/match.md +163 -0
- package/docs/laws/option.md +100 -0
- package/docs/laws/protocol.md +152 -0
- package/docs/laws/result.md +124 -0
- package/docs/laws/validation.md +111 -0
- package/docs/laws/variant.md +251 -0
- package/package.json +87 -3
- package/src/evidence.ts +120 -0
- package/src/identity.ts +129 -0
- package/src/index.ts +54 -0
- package/src/internal/callback.ts +54 -0
- package/src/internal/promise-like.ts +32 -0
- package/src/internal/scalar.ts +43 -0
- package/src/option.ts +214 -0
- package/src/protocol.ts +174 -0
- package/src/result/capture.ts +209 -0
- package/src/result/core.ts +229 -0
- package/src/result/index.ts +3 -0
- package/src/result/throw.ts +13 -0
- package/src/validation.ts +491 -0
- package/src/variant.ts +363 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { assertNotPromiseLike } from "../internal/promise-like.js";
|
|
2
|
+
/** Constructs a successful Result and preserves the error axis as never. */
|
|
3
|
+
export const ok = (value) => ({
|
|
4
|
+
ok: true,
|
|
5
|
+
value,
|
|
6
|
+
});
|
|
7
|
+
/** Constructs an error Result and preserves the value axis as never. */
|
|
8
|
+
export const err = (error) => ({
|
|
9
|
+
error,
|
|
10
|
+
ok: false,
|
|
11
|
+
});
|
|
12
|
+
/** Narrows a Result to Ok. */
|
|
13
|
+
export const isOk = (result) => result.ok;
|
|
14
|
+
/** Narrows a Result to Err. */
|
|
15
|
+
export const isErr = (result) => !result.ok;
|
|
16
|
+
/** Eliminates a Result under the shared Match law. */
|
|
17
|
+
export const match = (result, arms) => {
|
|
18
|
+
if (result.ok) {
|
|
19
|
+
const selected = arms.ok;
|
|
20
|
+
return selected(result.value);
|
|
21
|
+
}
|
|
22
|
+
const selected = arms.err;
|
|
23
|
+
return selected(result.error);
|
|
24
|
+
};
|
|
25
|
+
/** Transforms Ok and preserves Err. */
|
|
26
|
+
export const map = (result, transform) => (result.ok ? ok(transform(result.value)) : result);
|
|
27
|
+
/** Transforms Err and preserves Ok. */
|
|
28
|
+
export const mapError = (result, transform) => (result.ok ? result : err(transform(result.error)));
|
|
29
|
+
/** Sequences a dependent Result-producing success step. */
|
|
30
|
+
export const andThen = (result, next) => (result.ok ? next(result.value) : result);
|
|
31
|
+
/** Recovers from Err with another Result. */
|
|
32
|
+
export const orElse = (result, recover) => (result.ok ? result : recover(result.error));
|
|
33
|
+
/** Removes one explicit nested Result layer. */
|
|
34
|
+
export const flatten = (result) => result.ok ? result.value : result;
|
|
35
|
+
/** Synchronously observes Ok and returns the original Result. */
|
|
36
|
+
export const inspect = (result, observe) => {
|
|
37
|
+
if (result.ok) {
|
|
38
|
+
const completion = observe(result.value);
|
|
39
|
+
assertNotPromiseLike(completion, "Result.inspect() expects a synchronous observer.");
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
/** Synchronously observes Err and returns the original Result. */
|
|
44
|
+
export const inspectError = (result, observe) => {
|
|
45
|
+
if (!result.ok) {
|
|
46
|
+
const completion = observe(result.error);
|
|
47
|
+
assertNotPromiseLike(completion, "Result.inspectError() expects a synchronous observer.");
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
/** Returns the Ok value or an eager fallback. */
|
|
52
|
+
export const unwrapOr = (result, fallback) => result.ok ? result.value : fallback;
|
|
53
|
+
/** Returns the Ok value or evaluates a lazy fallback from Err. */
|
|
54
|
+
export const unwrapOrElse = (result, fallback) => (result.ok ? result.value : fallback(result.error));
|
|
55
|
+
/**
|
|
56
|
+
* Combines already-materialized Results in input order.
|
|
57
|
+
*
|
|
58
|
+
* The first Err is returned; complete success preserves tuple positions.
|
|
59
|
+
*/
|
|
60
|
+
export const all = (results) => {
|
|
61
|
+
const values = [];
|
|
62
|
+
const length = results.length;
|
|
63
|
+
for (let index = 0; index < length; index += 1) {
|
|
64
|
+
const result = results[index];
|
|
65
|
+
if (!result.ok) {
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
values.push(result.value);
|
|
69
|
+
}
|
|
70
|
+
return ok(values);
|
|
71
|
+
};
|
|
72
|
+
/** Converts presence into Result, lazily creating an error for None. */
|
|
73
|
+
export const fromOption = (option, onNone) => option.some ? ok(option.value) : err(onNone());
|
|
74
|
+
/**
|
|
75
|
+
* Converts Validation into Result.
|
|
76
|
+
*
|
|
77
|
+
* Invalid contributes its complete non-empty issue collection as one Result
|
|
78
|
+
* error value.
|
|
79
|
+
*/
|
|
80
|
+
export const fromValidation = (validation) => validation.valid
|
|
81
|
+
? ok(validation.value)
|
|
82
|
+
: err(validation.errors);
|
|
83
|
+
/** Facade for Result construction, transformation, elimination, and collection. */
|
|
84
|
+
export const Result = {
|
|
85
|
+
all,
|
|
86
|
+
andThen,
|
|
87
|
+
err,
|
|
88
|
+
flatten,
|
|
89
|
+
fromOption,
|
|
90
|
+
fromValidation,
|
|
91
|
+
inspect,
|
|
92
|
+
inspectError,
|
|
93
|
+
isErr,
|
|
94
|
+
isOk,
|
|
95
|
+
map,
|
|
96
|
+
mapError,
|
|
97
|
+
match,
|
|
98
|
+
ok,
|
|
99
|
+
orElse,
|
|
100
|
+
unwrapOr,
|
|
101
|
+
unwrapOrElse,
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/result/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/result/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/result/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Result } from "./core.js";
|
|
2
|
+
/** Converts Err into an explicitly mapped thrown value and returns Ok unchanged. */
|
|
3
|
+
export declare const orThrow: <T, E>(result: Result<T, E>, mapErrorToThrowable: (error: E) => unknown) => T;
|
|
4
|
+
//# sourceMappingURL=throw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throw.d.ts","sourceRoot":"","sources":["../../src/result/throw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,oFAAoF;AACpF,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,CAAC,UAClB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,uBACC,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,KACzC,CAMF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Converts Err into an explicitly mapped thrown value and returns Ok unchanged. */
|
|
2
|
+
export const orThrow = (result, mapErrorToThrowable) => {
|
|
3
|
+
if (result.ok) {
|
|
4
|
+
return result.value;
|
|
5
|
+
}
|
|
6
|
+
throw mapErrorToThrowable(result.error);
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=throw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throw.js","sourceRoot":"","sources":["../../src/result/throw.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAoB,EACpB,mBAA0C,EACvC,EAAE;IACL,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,MAAM,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { CallbackResult } from "./internal/callback.js";
|
|
2
|
+
import { type NotPromiseLike } from "./internal/promise-like.js";
|
|
3
|
+
import type { SingleName, SingleSymbol } from "./internal/scalar.js";
|
|
4
|
+
import type { Option } from "./option.js";
|
|
5
|
+
import type { Result } from "./result/core.js";
|
|
6
|
+
/** Non-empty ordered Validation issues. */
|
|
7
|
+
export type ValidationIssues<E> = readonly [E, ...E[]];
|
|
8
|
+
/** A successful Validation value. */
|
|
9
|
+
export type Valid<T> = Readonly<{
|
|
10
|
+
valid: true;
|
|
11
|
+
value: T;
|
|
12
|
+
}>;
|
|
13
|
+
/** One-or-more accumulated Validation issues. */
|
|
14
|
+
export type Invalid<E> = Readonly<{
|
|
15
|
+
valid: false;
|
|
16
|
+
errors: ValidationIssues<E>;
|
|
17
|
+
}>;
|
|
18
|
+
/** Valid data or a non-empty ordered issue collection. */
|
|
19
|
+
export type Validation<T, E> = Valid<T> | Invalid<E>;
|
|
20
|
+
/** Extracts the successful value type from a Validation union. */
|
|
21
|
+
export type ValidationValue<V> = V extends Valid<infer T> ? T : never;
|
|
22
|
+
/** Extracts one issue type from a Validation union. */
|
|
23
|
+
export type ValidationError<V> = V extends Invalid<infer E> ? E : never;
|
|
24
|
+
type ValidationValues<V extends readonly Validation<unknown, unknown>[]> = {
|
|
25
|
+
[K in keyof V]: ValidationValue<V[K]>;
|
|
26
|
+
};
|
|
27
|
+
type ValidationStructKey = string | symbol;
|
|
28
|
+
type ValidationStructEntry = readonly [
|
|
29
|
+
key: ValidationStructKey,
|
|
30
|
+
validation: Validation<unknown, unknown>
|
|
31
|
+
];
|
|
32
|
+
type IsUnion<T, Whole = T> = T extends Whole ? [Whole] extends [T] ? false : true : never;
|
|
33
|
+
type StructKey<Entry> = Entry extends readonly [
|
|
34
|
+
infer Key extends ValidationStructKey,
|
|
35
|
+
Validation<unknown, unknown>
|
|
36
|
+
] ? Key : never;
|
|
37
|
+
type StructValidation<Entry> = Entry extends readonly [
|
|
38
|
+
ValidationStructKey,
|
|
39
|
+
infer V extends Validation<unknown, unknown>
|
|
40
|
+
] ? V : never;
|
|
41
|
+
type InvalidStructEntry<Entries extends readonly ValidationStructEntry[]> = {
|
|
42
|
+
[Index in keyof Entries]: Entries[Index] extends readonly [
|
|
43
|
+
infer Key extends ValidationStructKey,
|
|
44
|
+
Validation<unknown, unknown>
|
|
45
|
+
] ? Key extends string ? Key extends SingleName<Key> ? never : Index : Key extends symbol ? Key extends SingleSymbol<Key> ? never : Index : Index : Index;
|
|
46
|
+
}[number];
|
|
47
|
+
type DuplicateStructKey<Entries extends readonly ValidationStructEntry[], Seen extends ValidationStructKey = never> = Entries extends readonly [
|
|
48
|
+
infer Head extends ValidationStructEntry,
|
|
49
|
+
...infer Tail extends readonly ValidationStructEntry[]
|
|
50
|
+
] ? StructKey<Head> extends Seen ? StructKey<Head> : DuplicateStructKey<Tail, Seen | StructKey<Head>> : never;
|
|
51
|
+
type IsMutableArray<Value> = Value extends unknown[] ? true : false;
|
|
52
|
+
type ClosedStructEntries<Entries extends readonly ValidationStructEntry[]> = true extends IsUnion<Entries> ? never : true extends IsMutableArray<Entries> ? never : true extends IsMutableArray<Entries[number]> ? never : number extends Entries["length"] ? never : [InvalidStructEntry<Entries>] extends [never] ? [DuplicateStructKey<Entries>] extends [never] ? unknown : never : never;
|
|
53
|
+
type ValidationForKey<Entries extends readonly ValidationStructEntry[], Key extends ValidationStructKey> = StructValidation<Extract<Entries[number], readonly [Key, Validation<unknown, unknown>]>>;
|
|
54
|
+
type ValidationStructValues<Entries extends readonly ValidationStructEntry[]> = Readonly<{
|
|
55
|
+
[Key in StructKey<Entries[number]>]: ValidationValue<ValidationForKey<Entries, Key>>;
|
|
56
|
+
}>;
|
|
57
|
+
type ValidationStructError<Entries extends readonly ValidationStructEntry[]> = ValidationError<StructValidation<Entries[number]>>;
|
|
58
|
+
type SynchronousReturn<T> = [T] extends [NotPromiseLike<T>] ? unknown : never;
|
|
59
|
+
type StableArrayInput<Value extends readonly unknown[]> = true extends IsMutableArray<Value> ? never : unknown;
|
|
60
|
+
/** Constructs a successful Validation and preserves the issue axis as never. */
|
|
61
|
+
export declare const valid: <T>(value: T) => Validation<T, never>;
|
|
62
|
+
/** Constructs an Invalid with at least one issue and preserves issue order. */
|
|
63
|
+
export declare const invalid: <const E extends readonly [unknown, ...unknown[]]>(...errors: E) => Validation<never, E[number]>;
|
|
64
|
+
/** Narrows a Validation to Valid. */
|
|
65
|
+
export declare const isValid: <T, E>(validation: Validation<T, E>) => validation is Valid<T>;
|
|
66
|
+
/** Narrows a Validation to Invalid. */
|
|
67
|
+
export declare const isInvalid: <T, E>(validation: Validation<T, E>) => validation is Invalid<E>;
|
|
68
|
+
/** Eliminates a Validation under the shared Match law. */
|
|
69
|
+
export declare const match: <T, E, ValidHandler extends (this: void, value: NoInfer<T>) => unknown, InvalidHandler extends (this: void, errors: ValidationIssues<NoInfer<E>>) => unknown>(validation: Validation<T, E>, arms: Readonly<{
|
|
70
|
+
valid: ValidHandler;
|
|
71
|
+
invalid: InvalidHandler;
|
|
72
|
+
}>) => CallbackResult<ValidHandler> | CallbackResult<InvalidHandler>;
|
|
73
|
+
/** Transforms Valid and preserves Invalid. */
|
|
74
|
+
export declare const map: <T, E, U>(validation: Validation<T, E>, transform: (value: T) => U) => Validation<U, E>;
|
|
75
|
+
/** Transforms every issue one-for-one while preserving issue order. */
|
|
76
|
+
export declare const mapError: <T, E, F>(validation: Validation<T, E>, transform: (error: E) => F) => Validation<T, F>;
|
|
77
|
+
/** Synchronously observes Valid and returns the original Validation. */
|
|
78
|
+
export declare const inspect: <T, E, R>(validation: Validation<T, E>, observe: ((value: T) => R) & SynchronousReturn<R>) => Validation<T, E>;
|
|
79
|
+
/**
|
|
80
|
+
* Synchronously observes the complete Invalid issue collection and returns the
|
|
81
|
+
* original Validation.
|
|
82
|
+
*/
|
|
83
|
+
export declare const inspectErrors: <T, E, R>(validation: Validation<T, E>, observe: ((errors: ValidationIssues<E>) => R) & SynchronousReturn<R>) => Validation<T, E>;
|
|
84
|
+
/** Returns the Valid value or an eager fallback. */
|
|
85
|
+
export declare const unwrapOr: <T, E, U>(validation: Validation<T, E>, fallback: U) => T | U;
|
|
86
|
+
/** Returns the Valid value or evaluates a lazy fallback from all issues. */
|
|
87
|
+
export declare const unwrapOrElse: <T, E, U>(validation: Validation<T, E>, fallback: (errors: ValidationIssues<E>) => U) => T | U;
|
|
88
|
+
/**
|
|
89
|
+
* Accumulates already-materialized tuple/array Validations.
|
|
90
|
+
*
|
|
91
|
+
* Complete success preserves value positions. Failure concatenates every issue
|
|
92
|
+
* collection in input order.
|
|
93
|
+
*/
|
|
94
|
+
export declare const all: <const V extends readonly Validation<unknown, unknown>[]>(validations: V & StableArrayInput<V>) => Validation<ValidationValues<V>, ValidationError<V[number]>>;
|
|
95
|
+
/**
|
|
96
|
+
* Accumulates a finite exact list of keyed, already-materialized Validations.
|
|
97
|
+
*
|
|
98
|
+
* Complete success preserves the declared key/value shape. Failure concatenates
|
|
99
|
+
* every issue collection in entry order.
|
|
100
|
+
*/
|
|
101
|
+
export declare const struct: <const Entries extends readonly ValidationStructEntry[]>(entries: Entries, ..._closed: ClosedStructEntries<Entries> extends never ? [never] : []) => Validation<ValidationStructValues<Entries>, ValidationStructError<Entries>>;
|
|
102
|
+
/** Converts Ok to Valid and Err to one Invalid issue. */
|
|
103
|
+
export declare const fromResult: <T, E>(result: Result<T, E>) => Validation<T, E>;
|
|
104
|
+
/** Converts presence into Validation, lazily creating one issue for None. */
|
|
105
|
+
export declare const fromOption: <T, E>(option: Option<T>, onNone: () => E) => Validation<T, E>;
|
|
106
|
+
type ValidationFacade = Readonly<{
|
|
107
|
+
all: typeof all;
|
|
108
|
+
fromOption: typeof fromOption;
|
|
109
|
+
fromResult: typeof fromResult;
|
|
110
|
+
inspect: typeof inspect;
|
|
111
|
+
inspectErrors: typeof inspectErrors;
|
|
112
|
+
invalid: typeof invalid;
|
|
113
|
+
isInvalid: typeof isInvalid;
|
|
114
|
+
isValid: typeof isValid;
|
|
115
|
+
map: typeof map;
|
|
116
|
+
mapError: typeof mapError;
|
|
117
|
+
match: typeof match;
|
|
118
|
+
struct: typeof struct;
|
|
119
|
+
unwrapOr: typeof unwrapOr;
|
|
120
|
+
unwrapOrElse: typeof unwrapOrElse;
|
|
121
|
+
valid: typeof valid;
|
|
122
|
+
}>;
|
|
123
|
+
/** Facade for Validation construction, transformation, and accumulation. */
|
|
124
|
+
export declare const Validation: ValidationFacade;
|
|
125
|
+
export {};
|
|
126
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { assertNotPromiseLike } from "./internal/promise-like.js";
|
|
2
|
+
const isObjectLike = (value) => (typeof value === "object" || typeof value === "function") && value !== null;
|
|
3
|
+
const readValidationValue = (value) => {
|
|
4
|
+
if (!isObjectLike(value) || !Object.hasOwn(value, "valid")) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const valid = value.valid;
|
|
8
|
+
if (valid === true) {
|
|
9
|
+
if (!Object.hasOwn(value, "value")) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
valid: true,
|
|
14
|
+
value: value.value,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (valid === false) {
|
|
18
|
+
if (!Object.hasOwn(value, "errors")) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const errors = value.errors;
|
|
22
|
+
if (!Array.isArray(errors)) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const length = errors.length;
|
|
26
|
+
if (length === 0) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const snapshot = [];
|
|
30
|
+
for (let index = 0; index < length; index += 1) {
|
|
31
|
+
if (!Object.hasOwn(errors, index)) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
snapshot.push(errors[index]);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
errors: snapshot,
|
|
38
|
+
valid: false,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
};
|
|
43
|
+
const appendIssues = (target, issues) => {
|
|
44
|
+
const length = issues.length;
|
|
45
|
+
for (let index = 0; index < length; index += 1) {
|
|
46
|
+
target.push(issues[index]);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
/** Constructs a successful Validation and preserves the issue axis as never. */
|
|
50
|
+
export const valid = (value) => ({
|
|
51
|
+
valid: true,
|
|
52
|
+
value,
|
|
53
|
+
});
|
|
54
|
+
/** Constructs an Invalid with at least one issue and preserves issue order. */
|
|
55
|
+
export const invalid = (...errors) => {
|
|
56
|
+
if (errors.length === 0) {
|
|
57
|
+
throw new TypeError("Validation.invalid() expects at least one issue.");
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
errors,
|
|
61
|
+
valid: false,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/** Narrows a Validation to Valid. */
|
|
65
|
+
export const isValid = (validation) => validation.valid;
|
|
66
|
+
/** Narrows a Validation to Invalid. */
|
|
67
|
+
export const isInvalid = (validation) => !validation.valid;
|
|
68
|
+
/** Eliminates a Validation under the shared Match law. */
|
|
69
|
+
export const match = (validation, arms) => {
|
|
70
|
+
if (validation.valid) {
|
|
71
|
+
const selected = arms.valid;
|
|
72
|
+
return selected(validation.value);
|
|
73
|
+
}
|
|
74
|
+
const selected = arms.invalid;
|
|
75
|
+
return selected(validation.errors);
|
|
76
|
+
};
|
|
77
|
+
/** Transforms Valid and preserves Invalid. */
|
|
78
|
+
export const map = (validation, transform) => validation.valid ? valid(transform(validation.value)) : validation;
|
|
79
|
+
/** Transforms every issue one-for-one while preserving issue order. */
|
|
80
|
+
export const mapError = (validation, transform) => {
|
|
81
|
+
if (validation.valid) {
|
|
82
|
+
return validation;
|
|
83
|
+
}
|
|
84
|
+
const sourceErrors = validation.errors;
|
|
85
|
+
const length = sourceErrors.length;
|
|
86
|
+
const snapshot = [];
|
|
87
|
+
for (let index = 0; index < length; index += 1) {
|
|
88
|
+
snapshot.push(sourceErrors[index]);
|
|
89
|
+
}
|
|
90
|
+
const errors = [];
|
|
91
|
+
for (let index = 0; index < length; index += 1) {
|
|
92
|
+
errors.push(transform(snapshot[index]));
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
errors: errors,
|
|
96
|
+
valid: false,
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
/** Synchronously observes Valid and returns the original Validation. */
|
|
100
|
+
export const inspect = (validation, observe) => {
|
|
101
|
+
if (validation.valid) {
|
|
102
|
+
const completion = observe(validation.value);
|
|
103
|
+
assertNotPromiseLike(completion, "Validation.inspect() expects a synchronous observer.");
|
|
104
|
+
}
|
|
105
|
+
return validation;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Synchronously observes the complete Invalid issue collection and returns the
|
|
109
|
+
* original Validation.
|
|
110
|
+
*/
|
|
111
|
+
export const inspectErrors = (validation, observe) => {
|
|
112
|
+
if (!validation.valid) {
|
|
113
|
+
const completion = observe(validation.errors);
|
|
114
|
+
assertNotPromiseLike(completion, "Validation.inspectErrors() expects a synchronous observer.");
|
|
115
|
+
}
|
|
116
|
+
return validation;
|
|
117
|
+
};
|
|
118
|
+
/** Returns the Valid value or an eager fallback. */
|
|
119
|
+
export const unwrapOr = (validation, fallback) => validation.valid ? validation.value : fallback;
|
|
120
|
+
/** Returns the Valid value or evaluates a lazy fallback from all issues. */
|
|
121
|
+
export const unwrapOrElse = (validation, fallback) => (validation.valid ? validation.value : fallback(validation.errors));
|
|
122
|
+
/**
|
|
123
|
+
* Accumulates already-materialized tuple/array Validations.
|
|
124
|
+
*
|
|
125
|
+
* Complete success preserves value positions. Failure concatenates every issue
|
|
126
|
+
* collection in input order.
|
|
127
|
+
*/
|
|
128
|
+
export const all = (validations) => {
|
|
129
|
+
const values = [];
|
|
130
|
+
const errors = [];
|
|
131
|
+
let hasErrors = false;
|
|
132
|
+
const length = validations.length;
|
|
133
|
+
for (let index = 0; index < length; index += 1) {
|
|
134
|
+
const validation = validations[index];
|
|
135
|
+
if (validation.valid) {
|
|
136
|
+
values.push(validation.value);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
hasErrors = true;
|
|
140
|
+
appendIssues(errors, validation.errors);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (hasErrors) {
|
|
144
|
+
return {
|
|
145
|
+
errors: errors,
|
|
146
|
+
valid: false,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return valid(values);
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Accumulates a finite exact list of keyed, already-materialized Validations.
|
|
153
|
+
*
|
|
154
|
+
* Complete success preserves the declared key/value shape. Failure concatenates
|
|
155
|
+
* every issue collection in entry order.
|
|
156
|
+
*/
|
|
157
|
+
export const struct = (entries, ..._closed) => {
|
|
158
|
+
if (!Array.isArray(entries)) {
|
|
159
|
+
throw new TypeError("Validation.struct() expects an array of entries.");
|
|
160
|
+
}
|
|
161
|
+
const entryCount = entries.length;
|
|
162
|
+
const keys = [];
|
|
163
|
+
const values = [];
|
|
164
|
+
const errors = [];
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
let hasErrors = false;
|
|
167
|
+
for (let index = 0; index < entryCount; index += 1) {
|
|
168
|
+
if (!Object.hasOwn(entries, index)) {
|
|
169
|
+
throw new TypeError("Validation.struct() expects own entry positions.");
|
|
170
|
+
}
|
|
171
|
+
const entry = entries[index];
|
|
172
|
+
if (!Array.isArray(entry) ||
|
|
173
|
+
entry.length !== 2 ||
|
|
174
|
+
!Object.hasOwn(entry, 0) ||
|
|
175
|
+
!Object.hasOwn(entry, 1)) {
|
|
176
|
+
throw new TypeError("Validation.struct() expects own [key, Validation] pairs.");
|
|
177
|
+
}
|
|
178
|
+
const key = entry[0];
|
|
179
|
+
if (typeof key !== "string" && typeof key !== "symbol") {
|
|
180
|
+
throw new TypeError("Validation.struct() keys must be strings or symbols.");
|
|
181
|
+
}
|
|
182
|
+
if (seen.has(key)) {
|
|
183
|
+
throw new TypeError("Validation.struct() keys must be unique.");
|
|
184
|
+
}
|
|
185
|
+
seen.add(key);
|
|
186
|
+
keys.push(key);
|
|
187
|
+
const validation = readValidationValue(entry[1]);
|
|
188
|
+
if (validation === undefined) {
|
|
189
|
+
throw new TypeError("Validation.struct() expects every entry value to be a Validation.");
|
|
190
|
+
}
|
|
191
|
+
if (validation.valid) {
|
|
192
|
+
values.push(validation.value);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
hasErrors = true;
|
|
196
|
+
values.push(undefined);
|
|
197
|
+
appendIssues(errors, validation.errors);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (hasErrors) {
|
|
201
|
+
return {
|
|
202
|
+
errors: errors,
|
|
203
|
+
valid: false,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const output = {};
|
|
207
|
+
for (let index = 0; index < entryCount; index += 1) {
|
|
208
|
+
const key = keys[index];
|
|
209
|
+
Object.defineProperty(output, key, {
|
|
210
|
+
configurable: true,
|
|
211
|
+
enumerable: true,
|
|
212
|
+
value: values[index],
|
|
213
|
+
writable: true,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return valid(output);
|
|
217
|
+
};
|
|
218
|
+
/** Converts Ok to Valid and Err to one Invalid issue. */
|
|
219
|
+
export const fromResult = (result) => result.ok ? valid(result.value) : invalid(result.error);
|
|
220
|
+
/** Converts presence into Validation, lazily creating one issue for None. */
|
|
221
|
+
export const fromOption = (option, onNone) => (option.some ? valid(option.value) : invalid(onNone()));
|
|
222
|
+
/** Facade for Validation construction, transformation, and accumulation. */
|
|
223
|
+
export const Validation = {
|
|
224
|
+
all,
|
|
225
|
+
fromOption,
|
|
226
|
+
fromResult,
|
|
227
|
+
inspect,
|
|
228
|
+
inspectErrors,
|
|
229
|
+
invalid,
|
|
230
|
+
isInvalid,
|
|
231
|
+
isValid,
|
|
232
|
+
map,
|
|
233
|
+
mapError,
|
|
234
|
+
match,
|
|
235
|
+
struct,
|
|
236
|
+
unwrapOr,
|
|
237
|
+
unwrapOrElse,
|
|
238
|
+
valid,
|
|
239
|
+
};
|
|
240
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { CallbackResult } from "./internal/callback.js";
|
|
2
|
+
import type { SingleName, SingleSymbol, Token } from "./internal/scalar.js";
|
|
3
|
+
type UnitSpec = symbol & {
|
|
4
|
+
readonly "~selaws.variant.case": "unit";
|
|
5
|
+
};
|
|
6
|
+
type PayloadSpec<T> = symbol & {
|
|
7
|
+
readonly "~selaws.variant.case": "payload";
|
|
8
|
+
readonly "~selaws.variant.payload": T;
|
|
9
|
+
};
|
|
10
|
+
type CaseSpec = UnitSpec | PayloadSpec<unknown>;
|
|
11
|
+
type CaseSpecs = Readonly<Record<string, CaseSpec>>;
|
|
12
|
+
type CaseEntry = readonly [name: string, spec: CaseSpec];
|
|
13
|
+
type IsUnion<T, Whole = T> = T extends Whole ? [Whole] extends [T] ? false : true : never;
|
|
14
|
+
type EntryName<Entry> = Entry extends readonly [infer Name extends string, CaseSpec] ? Name : never;
|
|
15
|
+
type EntrySpec<Entry> = Entry extends readonly [string, infer Spec extends CaseSpec] ? Spec : never;
|
|
16
|
+
type InvalidCaseEntry<Entries extends readonly CaseEntry[]> = {
|
|
17
|
+
[Index in keyof Entries]: Entries[Index] extends readonly [
|
|
18
|
+
infer Name extends string,
|
|
19
|
+
infer Spec extends CaseSpec
|
|
20
|
+
] ? Name extends SingleName<Name> ? [Spec] extends [UnitSpec] ? never : [Spec] extends [PayloadSpec<unknown>] ? never : Index : Index : Index;
|
|
21
|
+
}[number];
|
|
22
|
+
type DuplicateCaseName<Entries extends readonly CaseEntry[], Seen extends string = never> = Entries extends readonly [
|
|
23
|
+
infer Head extends CaseEntry,
|
|
24
|
+
...infer Tail extends readonly CaseEntry[]
|
|
25
|
+
] ? EntryName<Head> extends Seen ? EntryName<Head> : DuplicateCaseName<Tail, Seen | EntryName<Head>> : never;
|
|
26
|
+
type IsMutableArray<Value> = Value extends unknown[] ? true : false;
|
|
27
|
+
type ClosedCaseEntries<Entries extends readonly CaseEntry[]> = true extends IsUnion<Entries> ? never : true extends IsMutableArray<Entries> ? never : true extends IsMutableArray<Entries[number]> ? never : number extends Entries["length"] ? never : [InvalidCaseEntry<Entries>] extends [never] ? [DuplicateCaseName<Entries>] extends [never] ? unknown : never : never;
|
|
28
|
+
type EntrySpecForName<Entries extends readonly CaseEntry[], Name extends string> = EntrySpec<Extract<Entries[number], readonly [Name, CaseSpec]>>;
|
|
29
|
+
type CaseSpecsFromEntries<Entries extends readonly CaseEntry[]> = Readonly<{
|
|
30
|
+
[Name in EntryName<Entries[number]>]: EntrySpecForName<Entries, Name>;
|
|
31
|
+
}>;
|
|
32
|
+
type CaseName<Specs extends CaseSpecs> = Extract<keyof Specs, string>;
|
|
33
|
+
type PayloadOf<Spec> = Spec extends PayloadSpec<infer T> ? T : never;
|
|
34
|
+
type CaseSignature<Spec extends CaseSpec> = Spec extends UnitSpec ? Readonly<{
|
|
35
|
+
kind: "unit";
|
|
36
|
+
}> : Spec extends PayloadSpec<infer T> ? Readonly<{
|
|
37
|
+
kind: "payload";
|
|
38
|
+
payload: T;
|
|
39
|
+
}> : never;
|
|
40
|
+
type FamilySignature<Specs extends CaseSpecs> = {
|
|
41
|
+
readonly [K in keyof Specs]: CaseSignature<Specs[K]>;
|
|
42
|
+
};
|
|
43
|
+
type VariantMarker<Specs extends CaseSpecs> = Readonly<{
|
|
44
|
+
"~selaws.variant": true;
|
|
45
|
+
cases: FamilySignature<Specs>;
|
|
46
|
+
names: (name: keyof Specs) => keyof Specs;
|
|
47
|
+
}>;
|
|
48
|
+
type FamilyBrand<TokenValue extends Token, Specs extends CaseSpecs> = TokenValue extends string ? {
|
|
49
|
+
readonly [K in `~selaws.variant:${TokenValue}`]: VariantMarker<Specs>;
|
|
50
|
+
} : TokenValue extends symbol ? {
|
|
51
|
+
readonly [K in TokenValue]: VariantMarker<Specs>;
|
|
52
|
+
} : never;
|
|
53
|
+
type UnitCase<TokenValue extends Token, Specs extends CaseSpecs, Name extends CaseName<Specs>> = Readonly<{
|
|
54
|
+
tag: Name;
|
|
55
|
+
}> & FamilyBrand<TokenValue, Specs>;
|
|
56
|
+
type PayloadCase<TokenValue extends Token, Specs extends CaseSpecs, Name extends CaseName<Specs>, Payload> = Readonly<{
|
|
57
|
+
tag: Name;
|
|
58
|
+
value: Payload;
|
|
59
|
+
}> & FamilyBrand<TokenValue, Specs>;
|
|
60
|
+
type VariantValue<TokenValue extends Token, Specs extends CaseSpecs, Name extends CaseName<Specs> = CaseName<Specs>> = Name extends CaseName<Specs> ? Specs[Name] extends UnitSpec ? UnitCase<TokenValue, Specs, Name> : PayloadCase<TokenValue, Specs, Name, PayloadOf<Specs[Name]>> : never;
|
|
61
|
+
type Constructors<TokenValue extends Token, Specs extends CaseSpecs> = Readonly<{
|
|
62
|
+
[Name in CaseName<Specs>]: Specs[Name] extends UnitSpec ? () => UnitCase<TokenValue, Specs, Name> : <Value extends PayloadOf<Specs[Name]>>(value: Value) => PayloadCase<TokenValue, Specs, Name, Value>;
|
|
63
|
+
}>;
|
|
64
|
+
type Matchers<Specs extends CaseSpecs> = Readonly<{
|
|
65
|
+
[Name in CaseName<Specs>]: Specs[Name] extends UnitSpec ? (this: void) => unknown : (this: void, value: PayloadOf<Specs[Name]>) => unknown;
|
|
66
|
+
}>;
|
|
67
|
+
type MatchResult<Specs extends CaseSpecs, Handlers extends Matchers<Specs>> = CallbackResult<Handlers[CaseName<Specs>]>;
|
|
68
|
+
type VariantFamily<TokenValue extends Token, Specs extends CaseSpecs> = Readonly<{
|
|
69
|
+
make: Constructors<TokenValue, Specs>;
|
|
70
|
+
/** Eliminates this family under the shared Match law. */
|
|
71
|
+
match<const Handlers extends Matchers<Specs>>(value: VariantValue<TokenValue, Specs>, handlers: Handlers): MatchResult<Specs, Handlers>;
|
|
72
|
+
}>;
|
|
73
|
+
type ConstructorValue<Constructor> = Constructor extends (...args: never[]) => infer Value ? Value : never;
|
|
74
|
+
/** Extracts the closed value union produced by one Variant family. */
|
|
75
|
+
export type Variant<Family> = Family extends {
|
|
76
|
+
readonly make: infer Make extends object;
|
|
77
|
+
} ? ConstructorValue<Make[keyof Make]> : never;
|
|
78
|
+
/** Declares one nullary Variant case. */
|
|
79
|
+
export declare const unit: UnitSpec;
|
|
80
|
+
/** Declares one Variant case carrying a payload of T. */
|
|
81
|
+
export declare const payload: <T>() => PayloadSpec<T>;
|
|
82
|
+
type VariantToken<TokenValue extends Token> = [TokenValue] extends [string] ? TokenValue & SingleName<TokenValue & string> : [TokenValue] extends [symbol] ? TokenValue & SingleSymbol<TokenValue & symbol> : never;
|
|
83
|
+
/** Defines one named or declaration-owned closed Variant family. */
|
|
84
|
+
export declare const define: <const TokenValue extends Token, const Entries extends readonly CaseEntry[]>(token: VariantToken<TokenValue>, entries: Entries, ..._closed: ClosedCaseEntries<Entries> extends never ? [never] : []) => VariantFamily<TokenValue, CaseSpecsFromEntries<Entries>>;
|
|
85
|
+
type VariantFacade = Readonly<{
|
|
86
|
+
define: typeof define;
|
|
87
|
+
payload: typeof payload;
|
|
88
|
+
unit: typeof unit;
|
|
89
|
+
}>;
|
|
90
|
+
/** Closed labeled alternatives with correlated payloads and exhaustive elimination. */
|
|
91
|
+
export declare const Variant: VariantFacade;
|
|
92
|
+
export declare namespace Variant {
|
|
93
|
+
/** Extracts the closed value union produced by one Variant family. */
|
|
94
|
+
type Value<Family> = import("./variant.js").Variant<Family>;
|
|
95
|
+
}
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=variant.d.ts.map
|