import type { BaseParseContext, BaseRoot, UndeclaredKeyBehavior } from "@ark/schema"; import { type anyOrNever, type ErrorMessage, type ErrorType, type typeToString } from "@ark/util"; import { type inferDefinition, type validateInnerDefinition } from "./definition.ts"; import type { ParsedKeyKind, writeInvalidSpreadTypeMessage } from "./objectLiteral.ts"; import type { ParsedDefaultableProperty } from "./shift/operator/default.ts"; import type { parseString } from "./string.ts"; export type ParsedPropertyKind = "plain" | "optional" | "defaultable"; export type ParsedProperty = ParsedRequiredProperty | ParsedOptionalProperty | ParsedDefaultableProperty; export type ParsedRequiredProperty = BaseRoot; export type ParsedOptionalProperty = readonly [BaseRoot, "?"]; export declare const parseProperty: (def: unknown, ctx: BaseParseContext) => ParsedProperty; export type validateProperty = [ def ] extends [anyOrNever] ? /** this extra [anyOrNever] check is required to ensure that nested `type` invocations * like the following are not prematurely validated by the outer call: * * ```ts * type({ * "test?": type("string").pipe(x => x === "true") * }) * ``` */ def : keyKind extends "spread" ? def extends validateInnerDefinition ? inferDefinition extends object ? def : ErrorType>>> : validateInnerDefinition : keyKind extends "undeclared" ? UndeclaredKeyBehavior : keyKind extends "required" ? validateInnerDefinition : def extends OptionalPropertyDefinition ? ErrorMessage : isDefaultable extends true ? ErrorMessage : validateInnerDefinition; export type isDefaultable = def extends DefaultablePropertyTuple ? true : def extends PossibleDefaultableStringDefinition ? parseString extends DefaultablePropertyTuple ? true : false : false; export type OptionalPropertyDefinition = OptionalPropertyTuple | OptionalPropertyString; export type OptionalPropertyString = `${baseDef}?`; export type OptionalPropertyTuple = readonly [baseDef, "?"]; export type PossibleDefaultableStringDefinition = `${string}=${string}`; export type DefaultablePropertyTuple = readonly [baseDef, "=", thunkableProperty]; export declare const invalidOptionalKeyKindMessage = "Only required keys may make their values optional, e.g. { [mySymbol]: ['number', '?'] }"; export type invalidOptionalKeyKindMessage = typeof invalidOptionalKeyKindMessage; export declare const invalidDefaultableKeyKindMessage = "Only required keys may specify default values, e.g. { value: 'number = 0' }"; export type invalidDefaultableKeyKindMessage = typeof invalidDefaultableKeyKindMessage;