import { createComponent, type JSX, type Context, type Component, type ParentComponent, type FlowProps, type ContextProviderComponent } from "solid-js"; export type MultiProviderItem = T extends Component ? Partial extends U ? Omit extends Record ? T : T | [provider: T, props?: Omit] : [provider: T, props: Omit] : T extends Context ? [context: T, value: V] : never; /** * @interface */ export type MultiProviderProps = { providers: { [K in keyof T]: MultiProviderItem; }; children: JSX.Element; } const isContext = ( item: unknown ): item is Context => typeof item !== "function"; export const MultiProvider = < T extends readonly [unknown, ...unknown[]] >(props: MultiProviderProps): JSX.Element => { const { providers } = props; const resolveContexts = (index: number) => { const item: any = providers[index]; if (!item) return props.children; const baseProps: FlowProps = { get children() { return resolveContexts(index + 1); }, }; if (Array.isArray(item)) { const contextOrProvider = item[0]; const value = item[1]; return isContext(contextOrProvider) ? createComponent( contextOrProvider.Provider, Object.assign(baseProps, { value }), ) : createComponent( contextOrProvider, Object.assign(baseProps, value ?? {}), ); } return createComponent( isContext(item) ? item.Provider : item, baseProps, ); }; return resolveContexts(0); }