/* eslint-disable @typescript-eslint/no-explicit-any */ import { get } from 'lodash-es'; import { ModelTypes } from '@/zeus/index.js'; import { FieldFrontType } from '@/graphql/core/selectors.js'; type RecordFieldsAll = Record; type FieldWithVisuals = Omit & { visual?: { [P in keyof ModelTypes['Visual']]: ModelTypes['Visual'][P] extends infer R | null ? R : ModelTypes['Visual'][P]; }; }; const fieldsToObject = (fields: ModelTypes['CMSField'][]): RecordFieldsAll => { return Object.fromEntries( fields.map((f) => { return [ f.name, { ...(f.fields ? fieldsToObject(f.fields) : undefined), __field: f, }, ]; }), ); }; export const useHusar = () => { const cmsFields = (fields: ModelTypes['CMSField'][]) => (query: FlattenKeys) => { const obj = fieldsToObject(fields); return noNulls(get(obj, `${String(query)}.__field`)) as FieldWithVisuals; }; return { cmsFields, }; }; type TrimDot = S extends `${infer R}.` ? R : S; export type RemoveArrays = T extends Array ? R : T; export type FlattenKeysStart = T extends object ? { [K in keyof T]-?: T[K] extends infer U ? U extends undefined ? never : `${Extract}${FlattenKeysStart> extends '' ? '' : '.'}${FlattenKeysStart>}` : never; }[keyof T] : ''; export type FlattenKeys = TrimDot>; export type RemoveNullKeys = { [K in keyof T]: null extends T[K] ? never : K; }[keyof T]; type CleanedType = Pick>; export const noNulls = >(t?: T) => { if (!t) return t; return Object.fromEntries(Object.entries(t).filter(([, v]) => v !== null)) as CleanedType; }; // type Example = FlattenedKeyType; export type FlattenedKeyType = T extends (infer E)[] ? FlattenedKeyType : P extends `${infer K}.${infer Rest}` ? K extends keyof T ? FlattenedKeyType extends infer R ? undefined extends T[K] ? R | undefined : R : never : never : P extends keyof T ? T[P] : never; export type ComponentsOverride = Partial<{ [P in FlattenKeys]: (props: { attrs: { [P in keyof ModelTypes['Visual']]: ModelTypes['Visual'][P] extends infer R | null ? R : ModelTypes['Visual'][P]; }; data?: FlattenedKeyType | null; component?: React.JSX.Element; f: FieldFrontType; }) => React.JSX.Element; }>; export type AttributesOverride = Partial<{ [P in FlattenKeys]: (props: { attrs: { [P in keyof ModelTypes['Visual']]: ModelTypes['Visual'][P] extends infer R | null ? R : ModelTypes['Visual'][P]; }; data?: X extends true ? FlattenedKeyType extends (infer E)[] | undefined | null ? E | null : FlattenedKeyType | null : FlattenedKeyType | null; }) => React.DetailedHTMLProps, Y>; }>;