@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
43 lines (42 loc) • 1.78 kB
TypeScript
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 {};