import type { ArkError, ArkErrors, Morph } from "@ark/schema"; import { type anyOrNever, type array, type Brand, type equals, type Hkt, type intersectArrays, type isSafelyMappable, type merge, type optionalKeyOf, type Primitive, type show, type unionKeyOf, type unionToTuple } from "@ark/util"; import type { arkPrototypes } from "./keywords/constructors.ts"; import type { type } from "./keywords/keywords.ts"; import type { Type } from "./type.ts"; export type { arkPrototypes as object } from "./keywords/constructors.ts"; export type Comparator = "<" | "<=" | ">" | ">=" | "=="; export type RegexLiteral = `/${source}/`; export type DateLiteral = `d"${source}"` | `d'${source}'`; export type LimitLiteral = number | DateLiteral; export type normalizeLimit = limit extends DateLiteral ? source : limit extends number | string ? limit : never; export type distill = finalizeDistillation>; export declare namespace distill { type Endpoint = "in" | "out" | "out.introspectable"; type In = distill; type Out = distill; namespace introspectable { type Out = distill; } } type finalizeDistillation = equals extends true ? t : distilled; type _distill = t extends undefined ? t : [t] extends [anyOrNever] ? t : unknown extends t ? unknown : t extends Brand ? endpoint extends "in" ? base : t : t extends TerminallyInferredObject | Primitive ? t : t extends Function ? t extends (...args: never) => anyOrNever ? t : t extends InferredMorph ? distillIo : t : t extends Default ? _distill : t extends array ? distillArray : isSafelyMappable extends true ? distillMappable : t; type distillMappable = endpoint extends "in" ? show<{ [k in keyof o as k extends inferredDefaultKeyOf ? never : k]: _distill; } & { [k in inferredDefaultKeyOf]?: _distill; }> : { [k in keyof o]: _distill; }; type distillIo = endpoint extends "out" ? _distill : endpoint extends "in" ? _distill : o extends To ? _distill : unknown; type unwrapInput = t extends InferredMorph ? t extends anyOrNever ? t : i : t; type inferredDefaultKeyOf = keyof o extends infer k ? k extends keyof o ? unwrapInput extends Default ? [ t ] extends [anyOrNever] ? never : k : never : never : never; type distillArray = t[number][] extends t ? alignReadonly<_distill[], t> : distillNonArraykeys, t>, endpoint>; type alignReadonly = original extends unknown[] ? result : Readonly; type distillNonArraykeys = keyof originalArray extends keyof distilledArray ? distilledArray : distilledArray & _distill<{ [k in keyof originalArray as k extends keyof distilledArray ? never : k]: originalArray[k]; }, endpoint>; type distillArrayFromPrefix = t extends readonly [infer head, ...infer tail] ? distillArrayFromPrefix ]> : [...prefix, ...distillArrayFromPostfix]; type distillArrayFromPostfix = t extends readonly [...infer init, infer last] ? distillArrayFromPostfix, ...postfix ]> : [...{ [i in keyof t]: _distill; }, ...postfix]; type BuiltinTerminalObjectKind = Exclude; /** Objects we don't want to expand during inference like Date or Promise */ type TerminallyInferredObject = arkPrototypes.instanceOf | ArkEnv.prototypes; export type inferPredicate = predicate extends (data: any, ...args: any[]) => data is infer narrowed ? narrowed : t; export type inferNaryPipe = _inferNaryPipe; type _inferNaryPipe = remaining extends (readonly [infer head extends Morph, ...infer tail extends Morph[]]) ? _inferNaryPipe> : result; export type inferNaryIntersection = number extends types["length"] ? _inferNaryIntersection, unknown> : _inferNaryIntersection; type _inferNaryIntersection = remaining extends readonly [infer head, ...infer tail] ? _inferNaryIntersection> : result; export type inferNaryMerge = number extends types["length"] ? _inferUnorderedMerge : _inferNaryMerge; type _inferUnorderedMerge, requiredKey extends PropertyKey = Exclude, optionalKey>> = show<{ [k in requiredKey]: types[number] extends infer v ? v extends unknown ? k extends keyof v ? v[k] : never : never : never; } & { [k in optionalKey]?: types[number] extends infer v ? v extends unknown ? k extends keyof v ? v[k] : never : never : never; }>; /** Coalesce keys that exist and are optional on one or more branches of a union */ type optionalAtLeastOnceUnionKeyOf = t extends unknown ? optionalKeyOf : never; type _inferNaryMerge = remaining extends (readonly [infer head, ...infer tail extends readonly unknown[]]) ? _inferNaryMerge> : result; export type inferMorphOut = Exclude, ArkError | ArkErrors>; declare const isMorphOutKey: " isMorphOut"; export interface Out { [isMorphOutKey]: true; t: o; introspectable: boolean; } export interface To extends Out { introspectable: true; } export type InferredMorph = (In: i) => o; declare const defaultsToKey: " defaultsTo"; export type Default = { [defaultsToKey]: [t, v]; }; export type withDefault = t extends InferredMorph ? addDefaultToMorph : Default, v>; type addDefaultToMorph = [ normalizeMorphDistribution ] extends [InferredMorph] ? (In: Default) => o : never; type normalizeMorphDistribution ? i : never, undistributedOut extends Out = t extends InferredMorph ? [ o ] extends [To] ? To : o : never> = (Extract extends anyOrNever ? never : Extract extends InferredMorph ? [ undistributedOut ] extends [o] ? (In: undistributedIn) => undistributedOut : [undistributedIn] extends [i] ? (In: undistributedIn) => undistributedOut : t : never) | Exclude extends infer _ ? _ : never; export type defaultFor = (Primitive extends t ? Primitive : t extends Primitive ? t : never) | (() => t); export type termOrType = t | Type; export type inferIntersection = normalizeMorphDistribution<_inferIntersection>; export type inferMorph = morph extends type.cast ? inferPipe : inferMorphOut extends infer out ? (In: distill.In) => Out : never; export type inferPipe = normalizeMorphDistribution<_inferIntersection>; type _inferIntersection = [ l & r ] extends [infer t extends anyOrNever] ? t : l extends InferredMorph ? r extends InferredMorph ? piped extends true ? (In: lIn) => rOut : never : piped extends true ? (In: lIn) => To : (In: _inferIntersection) => lOut : r extends InferredMorph ? (In: _inferIntersection) => rOut : [l, r] extends [object, object] ? intersectObjects extends infer result ? result : never : l & r; interface MorphableIntersection extends Hkt<[unknown, unknown]> { body: _inferIntersection; } type intersectObjects = l extends array ? r extends array ? intersectArrays> : // for an intersection with exactly one array operand like { name: string } & string[], l & r : r extends array ? l & r : show<{ [k in keyof l]: k extends keyof r ? _inferIntersection : l[k]; } & { [k in keyof r]: k extends keyof l ? _inferIntersection : r[k]; }>;