All files / types PartialDeepBy.ts

0% Statements 0/0
0% Branches 0/0
0% Functions 0/0
0% Lines 0/0

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41                                                                                 
// https://github.com/sindresorhus/type-fest/blob/main/source/set-required-deep.d.ts
 
import {
  IsAny,
  Paths,
  RequiredDeep,
  SetOptional,
  SimplifyDeep,
  UnionToTuple,
  UnknownArray,
} from 'type-fest'
import { NonRecursiveType, StringToNumber } from 'type-fest/source/internal'
 
export type PartialDeepBy<
  BaseType,
  KeyPaths extends Paths<BaseType>,
> = IsAny<KeyPaths> extends true
  ? SimplifyDeep<RequiredDeep<BaseType>>
  : PartialDeepByHelper<BaseType, UnionToTuple<KeyPaths>>
 
type PartialDeepByHelper<
  BaseType,
  KeyPathsTuple extends UnknownArray,
> = KeyPathsTuple extends [infer KeyPath, ...infer RestPaths]
  ? PartialDeepByHelper<PartialDeepBySinglePath<BaseType, KeyPath>, RestPaths>
  : BaseType
 
type PartialDeepBySinglePath<BaseType, KeyPath> =
  BaseType extends NonRecursiveType
    ? BaseType
    : KeyPath extends `${infer Property}.${infer RestPath}`
    ? {
        [Key in keyof BaseType]: Property extends `${Key & (string | number)}`
          ? PartialDeepBySinglePath<BaseType[Key], RestPath>
          : BaseType[Key]
      }
    : SetOptional<
        BaseType,
        (KeyPath | StringToNumber<KeyPath & string>) & keyof BaseType
      >