SchemaGetter
Builds one-way conversions used by schemas.
A Getter<T, E, R> receives an optional encoded value and returns an optional decoded value. It can also report a schema issue or require Effect services. Schema transformations use getters to describe one direction of a conversion, for example decoding a field from input data. This module includes basic getters, validation helpers, pure and effectful conversions, and ready-made conversions for common string, number, binary, date, form, and URL-related values.
Combining
joinKeyValue
Signature
declare function joinKeyValue<E extends Record<PropertyKey, string>>(options?: {
readonly keyValueSeparator?: string;
readonly separator?: string;
}): Getter<string, E>;Constructors
Creates a getter that always fails with the given issue.
When to use
Use when you need a schema getter that unconditionally rejects input. - Building custom validation getters that produce specific error types.
Details
- Always fails with the Issue returned by f. - The failure function receives the original Option<E> input for error context.
See
forbiddenfor a convenience helper forForbiddenissuescheckEffectto fail conditionally based on input value
Signature
declare function fail<T, E>(f: (oe: Option<E>) => Issue): Getter<T, E>;Creates a getter that always fails with a Forbidden issue.
When to use
Use when you need a schema getter to disallow a field or direction (encode/decode) entirely. - You want a clear "forbidden" error message in schema validation output.
Details
- Always fails with SchemaIssue.Forbidden. - The message function receives the Option<E> input for context.
See
failto fail with a custom issue type
Signature
declare function forbidden<T, E>(message: (oe: Option<E>) => string): Getter<T, E>;makeTreeRecord
Builds a nested tree object from a list of bracket-path entries.
When to use
Use when you need a schema getter to parse FormData or URLSearchParams entries into structured objects. - You have flat key-value pairs with bracket-path keys that need nesting.
Details
- A bracket path is a string like "user[address][city]" that describes nested object/array structure. - Interprets bracket paths and constructs the corresponding nested object. - Builds and returns a nested object from the input entries. - Supported syntax: - "foo" → object key "foo" - "foo[bar]" → nested { foo: { bar: ... } } - "foo[0]" → array index { foo: [value] } - "foo[]" → append to array foo - "" → real empty key - Duplicate keys for the same path are merged into arrays. - If a structural path conflicts with a previous leaf or a different container type, the later structural path replaces the conflicting value. - The notation has no escaping for ., [ or ], so keys containing these delimiters cannot be round-tripped without changing their structure.
See
collectBracketPathEntriesfor flattening trees into bracket-path entriesdecodeFormDatafor a higher-level FormData decoderdecodeURLSearchParamsfor a higher-level URLSearchParams decoder
Signature
declare function makeTreeRecord<A>(bracketPathEntries: readonly Array<readonly [string, A]>): TreeRecord<A>passthrough
Returns the identity getter — passes the value through unchanged.
When to use
Use when you need a schema getter for one side of a decodeTo pair, either encode or decode, to pass values through unchanged.
Details
- Pure, no allocation (singleton instance). - Optimized away during .compose() — composing with a passthrough is free. - The default overload requires T === E. Pass { strict: false } to opt out of the type constraint.
See
passthroughSupertypewhenT extends EpassthroughSubtypewhenE extends Ttransformwhen you need to change the value
Signature
declare function passthrough<T, E>(options: { readonly strict: false }): Getter<T, E>;
declare function passthrough<T>(): Getter<T, T>;passthroughSubtype
Returns the identity getter, typed for when the encoded type E is a subtype of T.
When to use
Use when you need a schema getter that passes values through without { strict: false } for an encoded type that narrows the decoded type.
Details
- Same singleton as passthrough — no allocation, optimized in composition.
See
passthroughwhen types are identicalpassthroughSupertypewhenT extends E
Signature
declare function passthroughSubtype<T, E>(): Getter<T, E>;passthroughSupertype
Returns the identity getter typed for the relationship T extends E.
When to use
Use when you need a schema getter that passes values through when the decoded/output type is narrower than the encoded/input type.
Details
- Same singleton as passthrough — no allocation, optimized in composition.
See
passthroughwhen types are identicalpassthroughSubtypewhenE extends T
Signature
declare function passthroughSupertype<T, E>(): Getter<T, E>;Creates a getter that always produces the given constant value, ignoring the input.
When to use
Use when you need a schema getter that always decodes a field to a fixed value.
Details
The getter is pure and always returns Option.some(t) regardless of whether the input is Some or None.
See
transformwhen you need to use the input valuepassthroughwhen you want to keep the input as-is
Signature
declare function succeed<T, E>(t: T): Getter<T, E>;Converting
Coerces a value to bigint using the global BigInt() constructor.
When to use
Use when you need a schema getter to convert a present string, number, or boolean value to bigint.
Details
- Delegates to globalThis.BigInt. - Throws at runtime if the input cannot be converted (e.g. non-numeric string).
Signature
declare function BigInt<E extends string | number | bigint | boolean>(): Getter<bigint, E>;Coerces any value to a boolean using the global Boolean() constructor.
When to use
Use when you need a schema getter to coerce a present encoded value to a boolean with Boolean().
Details
The getter is pure, never fails, and delegates to globalThis.Boolean.
Signature
declare function Boolean<E>(): Getter<boolean, E>;collectBracketPathEntries
Flattens a nested object into bracket-path entries, filtering leaf values by a type guard.
When to use
Use when you need a schema getter to serialize structured objects to flat key-value entries. - Building custom FormData or URLSearchParams encoders.
Details
- Takes a nested object and produces flat [bracketPath, value] pairs suitable for FormData or URLSearchParams. - Returns a curried function: first call provides the leaf type guard, second call provides the object. - Recursively traverses objects and arrays. - If all elements of an array are leaves, encodes them as multiple entries with the same key (e.g. tags=a&tags=b). Otherwise uses indexed bracket paths (e.g. items[0], items[1]). - Non-leaf values that aren't objects or arrays are silently skipped. - Empty arrays and objects produce no entries, and path delimiters in property names are not escaped. The resulting format is therefore lossy.
See
makeTreeRecordfor building trees from bracket-path entriesencodeFormDatafor a higher-level FormData encoderencodeURLSearchParamsfor a higher-level URLSearchParams encoder
Signature
declare function collectBracketPathEntries<A>(
isLeaf: (value: unknown) => value is A,
): (input: object) => Array<[bracketPath: string, value: A]>;Coerces a value to a Date using new Date(input).
When to use
Use when you need a schema getter to coerce a present string, number, or existing date object into a new date object.
Details
- Delegates to new globalThis.Date(input). - Does not validate the result — may produce an invalid Date.
See
dateTimeUtcFromInputfor validated DateTime parsing
Signature
declare function Date<E extends string | number | Date>(): Getter<Date, E>;dateTimeUtcFromInput
Parses a DateTime.Input value into a DateTime.Utc.
When to use
Use when you need a schema getter to decode a present encoded date/time value to a DateTime.Utc.
Details
- Accepted input includes existing DateTime values, partial date/time parts, instant objects, zoned instant objects, JavaScript Date instances, epoch milliseconds, and date strings. - Converts successfully parsed values to UTC. - Fails with SchemaIssue.InvalidValue if the input cannot be parsed as a valid DateTime.
See
Datefor a simpler coercion toDate(no validation)
Signature
declare function dateTimeUtcFromInput<E extends Input>(): Getter<Utc, E>;Coerces any value to a number using the global Number() constructor.
When to use
Use when you need a schema getter to coerce a present encoded value to a number with Number().
Details
The getter is pure, never fails, and delegates to globalThis.Number. It may produce NaN for non-numeric inputs.
See
transformOrFailfor validated number parsing
Signature
declare function Number<E>(): Getter<number, E>;Coerces any value to a string using the global String() constructor.
When to use
Use when you need a schema getter to coerce a present encoded value to a string with String().
Details
The getter is pure, never fails, and delegates to globalThis.String.
See
transformfor custom string conversions
Signature
declare function String<E>(): Getter<string, E>;Decoding
decodeBase64
Decodes a Base64 string to a Uint8Array.
Details
- Fails with SchemaIssue.InvalidValue if the input is not valid Base64.
See
decodeBase64Stringto decode tostringinsteadencodeBase64for the inverse operation
Signature
declare function decodeBase64<E extends string>(): Getter<Uint8Array<ArrayBufferLike>, E>;decodeBase64String
Decodes a Base64 string to a UTF-8 string.
Details
- Fails with SchemaIssue.InvalidValue if the input is not valid Base64.
See
decodeBase64to decode toUint8ArrayinsteadencodeBase64for the inverse operation
Signature
declare function decodeBase64String<E extends string>(): Getter<string, E>;decodeBase64Url
Decodes a URL-safe Base64 string to a Uint8Array.
Details
- Fails with SchemaIssue.InvalidValue if the input is not valid Base64Url.
See
decodeBase64UrlStringto decode tostringinsteadencodeBase64Urlfor the inverse operation
Signature
declare function decodeBase64Url<E extends string>(): Getter<Uint8Array<ArrayBufferLike>, E>;decodeBase64UrlString
Decodes a URL-safe Base64 string to a UTF-8 string.
Details
- Fails with SchemaIssue.InvalidValue if the input is not valid Base64Url.
See
decodeBase64Urlto decode toUint8ArrayinsteadencodeBase64Urlfor the inverse operation
Signature
declare function decodeBase64UrlString<E extends string>(): Getter<string, E>;decodeFormData
Decodes a FormData object into a nested tree structure using bracket-path notation.
When to use
Use when you need a schema getter to parse FormData from HTTP requests into structured objects.
Details
The getter is pure and never fails. It interprets bracket-path keys such as user[name] and items[0] to build nested objects or arrays, and each leaf value is a string or Blob.
See
encodeFormDatafor the corresponding encodermakeTreeRecordfor the underlying bracket-path parserdecodeURLSearchParamsfor the URLSearchParams variant
Signature
declare function decodeFormData(): Getter<TreeRecord<string | Blob>, FormData>;Decodes a hexadecimal string to a Uint8Array.
Details
- Fails with SchemaIssue.InvalidValue if the input is not valid hex.
See
decodeHexStringto decode tostringinsteadencodeHexfor the inverse operation
Signature
declare function decodeHex<E extends string>(): Getter<Uint8Array<ArrayBufferLike>, E>;decodeHexString
Decodes a hexadecimal string to a UTF-8 string.
Details
- Fails with SchemaIssue.InvalidValue if the input is not valid hex.
See
Signature
declare function decodeHexString<E extends string>(): Getter<string, E>;decodeUriComponent
Decodes a URI component encoded string using decodeURIComponent.
Details
- Fails with SchemaIssue.InvalidValue if the input contains malformed percent-encoding sequences.
See
encodeUriComponentfor the inverse operation
Signature
declare function decodeUriComponent<E extends string>(): Getter<string, E>;decodeURLSearchParams
Decodes a URLSearchParams object into a nested tree structure using bracket-path notation.
When to use
Use when you need a schema getter to parse query parameters from URLs into structured objects.
Details
The getter is pure and never fails. It interprets bracket-path keys such as user[name] and items[0] to build nested objects or arrays, and each leaf value is a string.
See
encodeURLSearchParamsfor the corresponding encodermakeTreeRecordfor the underlying bracket-path parserdecodeFormDatafor the FormData variant
Signature
declare function decodeURLSearchParams(): Getter<TreeRecord<string>, URLSearchParams>;Parses a JSON string into a value.
When to use
Use when you need a schema getter to parse a present encoded JSON string during decoding.
Details
- Skips None inputs. - Without reviver: returns Schema.MutableJson (typed JSON). - With reviver: returns unknown (reviver may produce arbitrary values). - On parse failure, fails with SchemaIssue.InvalidValue containing a static message.
See
stringifyJsonfor the inverse operation
Signature
declare function parseJson<E extends string>(): Getter<MutableJson, E>;
declare function parseJson<E extends string>(options: ParseJsonOptions): Getter<unknown, E>;Encoding
encodeBase64
Encodes a Uint8Array or string to a Base64 string.
Details
The getter is pure and never fails.
See
decodeBase64for the inverse operation toUint8ArraydecodeBase64Stringfor the inverse operation tostringencodeBase64Urlfor the URL-safe variant
Signature
declare function encodeBase64<E extends string | Uint8Array<ArrayBufferLike>>(): Getter<string, E>;encodeBase64Url
Encodes a Uint8Array or string to a URL-safe Base64 string.
Details
The getter is pure and never fails.
See
decodeBase64Urlfor the inverse operation toUint8ArraydecodeBase64UrlStringfor the inverse operation tostringencodeBase64for the standard Base64 variant
Signature
declare function encodeBase64Url<E extends string | Uint8Array<ArrayBufferLike>>(): Getter<
string,
E
>;encodeFormData
Encodes a nested object into a FormData instance using bracket-path notation.
When to use
Use when you need a schema getter to serialize structured data to FormData for HTTP requests.
Details
The getter is pure and never fails. It flattens nested objects or arrays into bracket-path keys such as user[name] and items[0]. Non-object inputs produce an empty FormData.
See
decodeFormDatafor the corresponding decodercollectBracketPathEntriesfor the underlying flattenerencodeURLSearchParamsfor the URLSearchParams variant
Signature
declare function encodeFormData(): Getter<FormData, unknown>;Encodes a Uint8Array or string to a hexadecimal string.
Details
The getter is pure and never fails.
See
decodeHexfor the inverse operation toUint8ArraydecodeHexStringfor the inverse operation tostring
Signature
declare function encodeHex<E extends string | Uint8Array<ArrayBufferLike>>(): Getter<string, E>;encodeUriComponent
Encodes a present string using encodeURIComponent.
Details
- Skips None inputs. - May throw a URIError for malformed surrogate pairs; this exception is not converted into an Issue.
See
decodeUriComponentfor the inverse operation
Signature
declare function encodeUriComponent<E extends string>(): Getter<string, E>;encodeURLSearchParams
Encodes a nested object into a URLSearchParams instance using bracket-path notation.
When to use
Use when you need a schema getter to serialize structured data to query parameters for URLs.
Details
The getter is pure and never fails. It flattens nested objects or arrays into bracket-path keys. Non-object inputs produce an empty URLSearchParams.
See
decodeURLSearchParamsfor the corresponding decodercollectBracketPathEntriesfor the underlying flattenerencodeFormDatafor the FormData variant
Signature
declare function encodeURLSearchParams(): Getter<URLSearchParams, unknown>;stringifyJson
Stringifies a present value using JSON.stringify.
When to use
Use when you need a schema getter to serialize a present decoded value to JSON text during encoding.
Details
- Skips None inputs. - If JSON.stringify throws or returns undefined, fails with SchemaIssue.InvalidValue. - Supports optional replacer and space options, matching JSON.stringify.
See
parseJsonfor the inverse operation
Signature
declare function stringifyJson(options?: StringifyJsonOptions): Getter<string, unknown>;Filtering
Creates a getter that always returns None, effectively omitting the value from output.
When to use
Use when you need a schema getter to exclude a field during decoding or encoding.
Details
- Always returns Option.None regardless of input. - Never fails.
See
transformOptionalwhen you want conditional omissionforbiddenwhen you want to fail instead of silently omit
Signature
declare function omit<T>(): Getter<never, T>;Models
Represents a composable transformation from an encoded type E to a decoded type T.
When to use
Use when you need a schema getter to build and compose custom transformations for Schema.decodeTo or Schema.decode.
Details
A getter wraps a function Option<E> -> Effect<Option<T>, Issue, R>. It receives Option.None when the encoded key is absent, such as a missing struct field, and returns Option.None to omit the value from the decoded output. It fails with Issue on invalid input and may require Effect services via R. .map(f) applies f to the decoded value inside Some while leaving None unchanged. .compose(other) chains two getters by feeding the output of this into other; passthrough getters on either side are optimized away.
See
transformto create a getter from a pure functionpassthroughfor the identity gettertransformOrFailfor fallible transformation
Signature
declare class Getter<out T, in E, R = never> extends Class {
constructor<out T, in E, R = never>(run: (input: Option<E>, options: ParseOptions) => Effect<Option<T>, Issue, R>);
readonly run: (input: Option<E>, options: ParseOptions) => Effect<Option<T>, Issue, R>;
compose<T2, R2>(other: Getter<T2, T, R2>): Getter<T2, E, R | R2>;
map<T2>(f: (t: T) => T2): Getter<T2, E, R>;
}Splitting
Splits a string into an array of strings by a separator.
When to use
Use when you need a schema getter to split a present encoded string containing a delimited list, such as CSV values.
Details
The getter is pure and never fails. It splits by separator (default ,). An empty string produces an empty array, not [""].
See
splitKeyValuewhen values are key-value pairs
Signature
declare function split<E extends string>(options?: {
readonly separator?: string;
}): Getter<readonly Array<string>, E>splitKeyValue
Parses a string into a record of key-value pairs.
When to use
Use when you need a schema getter to parse a present encoded string that contains delimited key-value pairs (e.g. "a=1,b=2").
Details
The getter is pure and never fails. It splits the string by separator (default ,) and then each pair by keyValueSeparator (default =). Pairs missing a key or value are silently skipped.
See
joinKeyValuefor the inverse operationsplitto split into an array of strings
Signature
declare function splitKeyValue<E extends string>(options?: {
readonly keyValueSeparator?: string;
readonly separator?: string;
}): Getter<Record<string, string>, E>;Transforming
camelToSnake
Converts a camelCase string to snake_case.
Details
- Pure, delegates to String.camelToSnake.
See
snakeToCamelfor the inverse operation
Signature
declare function camelToSnake<E extends string>(): Getter<string, E>;capitalize
Capitalizes the first character of a string.
Details
- Pure, delegates to String.capitalize.
Signature
declare function capitalize<E extends string>(): Getter<string, E>;Creates a getter that handles the case when the input is absent (Option.None).
When to use
Use when you need a schema getter to provide a fallback or computed value for missing struct keys. - Building custom "default value" logic more complex than withDefault.
Details
- When input is None, calls f to produce the result. - When input is Some, passes it through unchanged. - f receives the parse options and may return None to keep the value absent.
See
requiredwhen absent input should failwithDefaultfor a simpler default value for undefined inputsonSometo handle only present values
Signature
declare function onNone<T, E = T, R = never>(
f: (options: ParseOptions) => Effect<Option<T>, Issue, R>,
): Getter<T, E, R>;Creates a getter that handles present values (Option.Some), passing None through.
When to use
Use when you need a schema getter to transform or validate only when a field value is present. - Missing keys should remain absent in the output.
Details
- When input is None, returns None (no-op). - When input is Some(e), calls f(e, options) to produce the result. - f may return None to omit the value, or fail with an Issue.
See
onNoneto handle only absent valuestransformfor a simpler pure transformation of present valuestransformOrFailfor fallible transformation of present values
Signature
declare function onSome<T, E, R = never>(
f: (e: E, options: ParseOptions) => Effect<Option<T>, Issue, R>,
): Getter<T, E, R>;snakeToCamel
Converts a snake_case string to camelCase.
Details
- Pure, delegates to String.snakeToCamel.
See
camelToSnakefor the inverse operation
Signature
declare function snakeToCamel<E extends string>(): Getter<string, E>;toLowerCase
Converts a string to lowercase.
Details
- Pure, delegates to String.toLowerCase.
See
toUpperCasefor the inverse operation
Signature
declare function toLowerCase<E extends string>(): Getter<string, E>;toUpperCase
Converts a string to uppercase.
Details
- Pure, delegates to String.toUpperCase.
See
toLowerCasefor the inverse operation
Signature
declare function toUpperCase<E extends string>(): Getter<string, E>;Creates a getter that applies a pure function to present values.
When to use
Use when you need a schema getter for a pure, infallible transformation between types. - Building encode/decode pairs for Schema.decodeTo.
Details
- This is the most commonly used constructor. - Transforms Some(e) to Some(f(e)) and leaves None unchanged. - Skips None inputs — only called when a value is present. - Never fails.
See
transformOrFailwhen the transformation can failtransformOptionalwhen you need to handleNoneinputspassthroughwhen no transformation is needed
Signature
declare function transform<T, E>(f: (e: E) => T): Getter<T, E>;transformOptional
Creates a getter that transforms the full Option — both present and absent values.
When to use
Use when you need a schema getter to handle both Some and None cases.
Details
The getter is pure and never fails. It receives the full Option<E> and must return Option<T>, so it can turn a present value into absent or an absent value into present.
See
Signature
declare function transformOptional<T, E>(f: (oe: Option<E>) => Option<T>): Getter<T, E>;transformOrFail
Creates a getter that applies a fallible, effectful transformation to present values.
When to use
Use when you need a schema getter for a transformation that may fail, require Effect services, or run asynchronously.
Details
- Skips None inputs — only called when a value is present. - On success, wraps the result in Some. - On failure, propagates the Issue.
See
Signature
declare function transformOrFail<T, E, R = never>(
f: (e: E, options: ParseOptions) => Effect<T, Issue, R>,
): Getter<T, E, R>;Strips whitespace from both ends of a string.
Details
- Pure, delegates to String.trim.
Signature
declare function trim<E extends string>(): Getter<string, E>;uncapitalize
Uncapitalizes the first character of a string.
Details
- Pure, delegates to String.uncapitalize.
Signature
declare function uncapitalize<E extends string>(): Getter<string, E>;withDefault
Creates a getter that replaces undefined values with a default.
When to use
Use when you need a schema getter to provide a fallback for a field that may be undefined in the encoded input.
Details
- If the input is Some(undefined) or None, produces Some(T). - If the input is Some(value) where value is not undefined, passes it through. - defaultValue is an Effect that will be executed each time a default is needed.
See
Signature
declare function withDefault<T, R = never>(
defaultValue: Effect<T, Issue, R>,
): Getter<T, T | undefined, R>;Utility Types
JsonReplacer type
Replacer function or property allowlist accepted by JSON.stringify.
Signature
type JsonReplacer = (this: any, key: string, value: any) => any | Array<string | number> | null;Validation
checkEffect
Creates a getter that validates a value using an effectful check function.
When to use
Use when you need a schema getter to validate a decoded value (e.g. check a constraint or call an external service). - The validation may be asynchronous or require Effect services.
Details
- Only runs when input is Some — None passes through. - The check function returns a validation result: - undefined or true — value is valid, passes through. - false or a string — value is invalid, fails with an Issue. - An Issue object — fails with that issue directly. - { path, issue } — fails with a nested path issue (issue may be a message string or a full SchemaIssue.Issue). - Does not transform the value — input and output types are the same.
See
Signature
declare function checkEffect<T, R = never>(
f: (input: T, options: ParseOptions) => Effect<boolean | FilterIssue | undefined, never, R>,
): Getter<T, T, R>;Creates a getter that fails with MissingKey if the input is absent (Option.None).
When to use
Use when you need a schema getter to require a struct field in the encoded input and report a missing key error when it is absent.
Details
- When input is None, fails with SchemaIssue.MissingKey. - When input is Some, passes it through unchanged. - Optional annotations customize the error message for the missing key.
See
onNoneto provide a fallback instead of failingwithDefaultto substitute a default for undefined values
Signature
declare function required<T, E = T>(annotations?: Key<T>): Getter<T, E>;
Joins a record of key-value pairs into a delimited string.
When to use
Use when you need a schema getter to serialize a present decoded record as a delimited key-value string.
Details
The getter is pure and never fails. It joins entries with
separator(default,) and joins each key and value withkeyValueSeparator(default=).See
splitKeyValuefor the inverse operation