import { IfNoDeepValue } from './helpers.js'; import { Or } from './logical.js'; import { OmitTypes } from './omit.js'; import { IfEquals, IfNever } from './type-check.js'; /** * Marks given keys as required */ export type RequiredSome = OmitTypes< Required>, null > & Omit; /** * Make all properties in T required deeply */ export type DeepRequired = { [K in keyof T as IfNever< Exclude, never, K >]-?: IfNoDeepValue> extends true // Do not deep process No-Deep values ? Exclude : // Deep process objects DeepRequired>; }; /** * Make all properties in T required deeply including arrays */ export type DeeperRequired = { [K in keyof T as IfNever, never, K>]-?: NonNullable< T[K] > extends (infer U)[] // Deep process arrays ? DeeperRequired[] : // Do not deep process No-Deep values IfNoDeepValue> extends true ? Exclude : // Deep process objects DeepRequired>; }; /** * RequiredKeys * @desc Returns required keys of an object */ export type RequiredKeys = keyof PickRequired; /** * Pick all required properties in T */ export type PickRequired = { [K in keyof T as Or< // Omit never keys IfNever>, // Omit optional IfEquals<{ [Q in K]: T[K] }, { [Q in K]?: T[K] }> > extends true ? never : K]: T[K]; }; /** * Pick all required properties in T */ export type OmitRequired = { [K in keyof T as Or< // Omit never keys IfNever>, // Omit optional IfEquals<{ [Q in K]: T[K] }, { [Q in K]?: T[K] }, false, true> > extends true ? never : K]: T[K]; }; /** * Pick all required properties in T deeply */ export type DeepPickRequired = { [K in keyof T as Or< // Omit never keys IfNever>, // Omit optional IfEquals<{ [Q in K]: T[K] }, { [Q in K]?: T[K] }> > extends true ? never : K]: IfNoDeepValue> extends true // Do not deep process No-Deep values ? T[K] : // Deep process objects DeepPickRequired>; }; /** * Omit all required properties in T deeply */ export type DeepOmitRequired = { [K in keyof T as Or< // Omit never keys IfNever>, // Omit required IfEquals<{ [Q in K]: T[K] }, { [Q in K]-?: T[K] }> > extends true ? never : K]?: IfNoDeepValue> extends true // Do not deep process No-Deep values ? T[K] : // Deep process objects DeepOmitRequired>; }; /** * Pick all required properties in T deeply including arrays */ export type DeeperPickRequired = { [K in keyof T as Or< // Omit never keys IfNever>, // Omit required IfEquals<{ [Q in K]: T[K] }, { [Q in K]?: T[K] }> > extends true ? never : K]: NonNullable extends (infer U)[] // Deep process arrays ? DeeperPickRequired[] : // Do not deep process No-Deep values IfNoDeepValue> extends true ? T[K] : // Deep process objects DeeperPickRequired>; }; /** * Omit all required properties in T deeply including arrays */ export type DeeperOmitRequired = { [K in keyof T as Or< // Omit never keys IfNever>, // Omit required IfEquals<{ [Q in K]: T[K] }, { [Q in K]-?: T[K] }> > extends true ? never : K]: NonNullable extends (infer U)[] // Deep process arrays ? DeeperOmitRequired[] : // Do not deep process No-Deep values IfNoDeepValue> extends true ? T[K] : // Deep process objects DeeperOmitRequired>; };