import { RuntypeBase } from '../runtype'; import { Array as Arr, ReadonlyArray } from './array'; import { InternalRecord, RecordFields } from './Object'; import { Record, KeyRuntypeBase, ReadonlyRecord } from './Record'; import { Tuple, ReadonlyTuple } from './tuple'; export type Readonly = T extends InternalRecord< infer TFields, infer TPartial, false > ? InternalRecord : T extends Arr ? ReadonlyArray : T extends Tuple ? ReadonlyTuple : T extends Record ? ReadonlyRecord : unknown; export function Readonly( input: InternalRecord, ): InternalRecord; export function Readonly( input: Arr, ): ReadonlyArray; export function Readonly< TElements extends readonly RuntypeBase[] = readonly RuntypeBase[], >(input: Tuple): ReadonlyTuple; export function Readonly>( record: Record, ): ReadonlyRecord; export function Readonly(input: any): any { const result = { ...input }; result.isReadonly = true; for (const m of [`asPartial`, `pick`, `omit`]) { if (typeof input[m] === 'function') { result[m] = (...args: any[]) => Readonly(input[m](...args)); } } return result; }