UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

43 lines (42 loc) 1.78 kB
import React from 'react'; /** * withSnakeCaseProps is a HOC for function components * it will return a React Component where all camelCase props gets converted to snake_case * * Use the same for TypeScript types by using: ToSnakeCase * * @param Base the original function or class * @returns extended function or class */ export declare function withSnakeCaseProps<TBase, P>(Base: ((props: P) => JSX.Element) & TBase): typeof Base; /** * withSnakeCaseProps is a HOC for classes * it will return a React Component where all camelCase props gets converted to snake_case * * Use the same for TypeScript types by using: ToSnakeCase * * @param Base the original function or class * @returns extended function or class */ export declare function classWithSnakeCaseProps<TBase extends React.ComponentClass>(Base: TBase): typeof Base; export declare function convertSnakeCaseProps<P>(props: P, { overrideExistingValue }?: { overrideExistingValue?: boolean; }): P; /** * Convert recursively Types from camelCase to snake_case * * Use it like so: * OriginalProps & ToSnakeCase<OriginalProps> * * Disclaimer: Be careful using these with required props * - ToSnakeCase makes the required camelCase props also required in snake_case * - ToSnakeCasePartial removes required for the snake_case props * */ export type ToSnakeCasePartial<T> = Partial<ToSnakeCase<T>>; export type ToSnakeCase<T> = T extends object ? { [K in keyof T as ConvertCamelToSnakeCase<K & string>]: T[K] | ToSnakeCase<T[K]>; } : T; export type IncludeSnakeCase<T> = Partial<T> & ToSnakeCasePartial<T>; type ConvertCamelToSnakeCase<S extends string> = S extends `${infer T}${infer U}` ? `${T extends Capitalize<T> ? '_' : ''}${Lowercase<T>}${ConvertCamelToSnakeCase<U>}` : S; export {};