react-new-hoc
Version:
Work with React and HOCs (Higher-Order Components)
61 lines (55 loc) • 1.6 kB
text/typescript
import { ComponentType } from "react";
import { componentDisplayName } from "./componentDisplayName";
import { GetHocArgs, HocDefinition, NewHocReturn } from "./newHoc";
export function createHocNameFunction<TNewHocReturn extends NewHocReturn<any>>(
selector: (...args: GetHocArgs<TNewHocReturn>) => unknown | undefined
) {
return function hocName(
{
Component,
hoc,
}: {
Component: ComponentType<any>;
hoc: HocDefinition<GetHocArgs<TNewHocReturn>>;
},
...args: GetHocArgs<TNewHocReturn>
): string {
function parseArg(arg: any): string | undefined {
if (typeof arg === "string") {
return arg;
}
if (typeof arg === "number") {
return String(arg);
}
if (typeof arg === "function") {
return arg.name || "[unnamed function]";
}
if (Array.isArray(arg)) {
return arg
.map((a) => parseArg(a))
.filter(Boolean)
.join(".");
}
if (arg === undefined || typeof arg === "function") {
return undefined;
}
if (arg === null) {
return "null";
}
if (typeof arg === "object") {
return Object.keys(arg).join(".");
}
return String(arg);
}
const nameByArgs = ((): string | undefined => {
const arg = selector(...args);
return parseArg(arg);
})();
return `${[hoc.name, nameByArgs]
.filter(Boolean)
.join(".")}(${componentDisplayName.get(Component)})`;
};
}
export const defaultHocName = createHocNameFunction(
(firstArg: unknown) => firstArg
);