import { type BaseParseContext, type BaseRoot, type writeInvalidPropertyKeyMessage } from "@ark/schema"; import { Backslash, type anyOrNever, type Dict, type ErrorMessage, type ErrorType, type Key, type merge, type show } from "@ark/util"; import type { validateString } from "./ast/validate.ts"; import type { inferDefinition } from "./definition.ts"; import { type OptionalPropertyDefinition, type validateProperty } from "./property.ts"; export declare const parseObjectLiteral: (def: Dict, ctx: BaseParseContext) => BaseRoot; export type inferObjectLiteral = show<"..." extends keyof def ? merge, _inferObjectLiteral> : _inferObjectLiteral>; /** * Infers the contents of an object literal, ignoring a spread definition */ type _inferObjectLiteral = { -readonly [k in keyof def as nonOptionalKeyFromEntry]: inferDefinition; } & { -readonly [k in keyof def as optionalKeyFromEntry]?: def[k] extends OptionalPropertyDefinition ? inferDefinition : inferDefinition; }; export type validateObjectLiteral = { [k in keyof def]: preparseKey extends (infer parsedKey extends PreparsedKey) ? parsedKey extends PreparsedEntryKey<"index"> ? validateString extends (ErrorMessage) ? ErrorType : inferDefinition extends Key ? validateProperty : ErrorMessage> : validateProperty : never; }; type nonOptionalKeyFromEntry = preparseKey extends infer parsedKey ? parsedKey extends PreparsedEntryKey<"required"> ? [ v ] extends [OptionalPropertyDefinition] ? [ v ] extends [anyOrNever] ? parsedKey["normalized"] : never : parsedKey["normalized"] : parsedKey extends PreparsedEntryKey<"index"> ? inferDefinition & Key : never : never; type optionalKeyFromEntry = preparseKey extends infer parsedKey ? parsedKey extends PreparsedEntryKey<"optional"> ? parsedKey["normalized"] : v extends OptionalPropertyDefinition ? k : never : never; export declare const writeInvalidUndeclaredBehaviorMessage: (actual: unknown) => string; export declare const nonLeadingSpreadError = "Spread operator may only be used as the first key in an object"; export type PreparsedKey = PreparsedEntryKey | PreparsedSpecialKey; type normalizedKeyKind = kind extends "index" ? string : Key; export type PreparsedEntryKey = normalizedKeyKind> = { kind: kind; normalized: normalized; }; export type PreparsedSpecialKey = { kind: kind; }; declare namespace PreparsedKey { type from = t; } export type ParsedKeyKind = EntryKeyKind | SpecialKeyKind; export type EntryKeyKind = "required" | "optional" | "index"; export type SpecialKeyKind = "spread" | "undeclared"; export type MetaKey = "..." | "+"; export type IndexKey = `[${def}]`; export declare const preparseKey: (key: Key) => PreparsedKey; export type preparseKey = k extends symbol ? PreparsedKey.from<{ kind: "required"; normalized: k; }> : k extends `${infer inner}?` ? inner extends `${infer baseName}${Backslash}` ? PreparsedKey.from<{ kind: "required"; normalized: `${baseName}?`; }> : PreparsedKey.from<{ kind: "optional"; normalized: inner; }> : k extends "+" ? { kind: "undeclared"; } : k extends "..." ? { kind: "spread"; } : k extends `${Backslash}${infer escapedMeta extends MetaKey}` ? PreparsedKey.from<{ kind: "required"; normalized: escapedMeta; }> : k extends IndexKey ? PreparsedKey.from<{ kind: "index"; normalized: def; }> : PreparsedKey.from<{ kind: "required"; normalized: k extends (`${Backslash}${infer escapedIndexKey extends IndexKey}`) ? escapedIndexKey : k extends Key ? k : `${k & number}`; }>; export declare const writeInvalidSpreadTypeMessage: (def: def) => writeInvalidSpreadTypeMessage; export type writeInvalidSpreadTypeMessage = `Spread operand must resolve to an object literal type (was ${def})`; export {};