UNPKG

@toolpad/utils

Version:

Shared utilities used by Toolpad packages.

61 lines (60 loc) 2.58 kB
declare const brand: unique symbol; export type WithControlledProp<V, K extends string = 'value', O extends string = K extends 'value' ? 'onChange' : `on${Capitalize<K>}Change`> = Record<K, V> & Record<O, (newValue: V) => void>; export type ExactEntriesOf<P> = Exclude<{ [K in keyof P]: [K, P[K]]; }[keyof P], undefined>[]; /** * The inverse of Awaited. */ export type Awaitable<T> = T | Promise<T> | PromiseLike<T>; /** * @example * type T0 = Join<[1, 2, 3, 4], '.'>; // '1.2.3.4' * type T1 = Join<['foo', 'bar', 'baz'], '-'>; // 'foo-bar-baz' * type T2 = Join<[], '.'>; // '' */ export type Join<T extends unknown[], D extends string> = T extends [] ? '' : T extends [string | number | boolean | bigint] ? `${T[0]}` : T extends [string | number | boolean | bigint, ...infer U] ? `${T[0]}${D}${Join<U, D>}` : string; /** * @example * type T0 = Split<'foo', '.'>; // ['foo'] * type T1 = Split<'foo.bar.baz', '.'>; // ['foo', 'bar', 'baz'] * type T2 = Split<'foo.bar', ''>; // ['f', 'o', 'o', '.', 'b', 'a', 'r'] */ export type Split<S extends string, D extends string> = string extends S ? string[] : S extends '' ? [] : S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] : [S]; /** * @example * type T0 = CapitalizeAll<['foo', 'bar']>; // ['Foo', 'Bar'] * type T1 = CapitalizeAll<[]>; // [] */ export type CapitalizeAll<T extends string[]> = T extends [] ? [] : T extends [string, ...infer U] ? U extends string[] ? [Capitalize<T[0]>, ...CapitalizeAll<U>] : never : never; /** * @example * type T0 = CapitalizeAll<['foo', 'bar', 'baz']>; // ['foo', 'Bar', 'Baz'] * type T1 = CapitalizeAll<['foo']>; // ['foo'] * type T2 = CapitalizeAll<[]>; // [] */ export type CapitalizeTail<T extends string[]> = T extends [] ? [] : T extends [string, ...infer U] ? U extends string[] ? [T[0], ...CapitalizeAll<U>] : never : never; /** * sString template type that converts snake-case to camel-case * @example * type T0 = SnakeToCamel<'foo-bar-baz'>; // 'fooBarBaz' * type T1 = CapitalizeAll<'foo'>; // 'foo' * type T2 = CapitalizeAll<''>; // '' */ export type SnakeToCamel<T extends string> = Join<CapitalizeTail<Split<T, '-'>>, ''>; /** * The inverso of NonNullable */ export type Maybe<T> = T | undefined | null; export type ValueOf<T> = T[keyof T]; export interface Brand<B> { readonly [brand]: B; } export type Branded<A, B> = A & Brand<B>; export type Expand<T> = T extends infer O ? { [K in keyof O]: O[K]; } : never; export type ExpandNested<T> = T extends infer O ? { [K in keyof O]: Expand<O[K]>; } : never; export {};