@atomic-design/di
Version:
Lightweight, type-safe dependency inversion utilities for Atomic Design architectures in React
18 lines (17 loc) • 1.32 kB
TypeScript
import { DepsWithoutDeps } from './types';
import { ReactNode, ComponentType } from 'react';
export declare function createVariantsContext<Ctx extends DepsWithoutDeps<Record<string, unknown>>, V extends Partial<Record<keyof Ctx, Record<string, () => WrappedPromise<Ctx[keyof Ctx], Ctx>>>>>(context: {
[SpaceName in keyof Ctx]: () => WrappedPromise<Ctx[SpaceName], Ctx>;
}, variantsBySpace: V): [() => Ctx, ({ children, variants, space, variant }: AtomicProviderProps<{ [SpaceName in keyof Ctx]?: keyof V[SpaceName] | undefined; }>) => import("react/jsx-runtime").JSX.Element, <Space extends keyof Ctx, Name extends { [Name_1 in keyof Ctx[Space]]: Ctx[Space][Name_1] extends ComponentType<any> ? Name_1 : never; }[keyof Ctx[Space]]>(space: Space, name: Name) => ComponentType<Ctx[Space][Name] extends ComponentType<infer P> ? P : never>];
interface AtomicProviderProps<Variants extends Record<string, unknown>> {
children: ReactNode;
variants?: Partial<Variants>;
space?: keyof Variants;
variant?: Variants[keyof Variants];
}
type Wrapped<OutputContext, InputContext> = {
output: OutputContext;
setDepsHook: (c: () => InputContext) => void;
};
type WrappedPromise<OutputContext, InputContext> = Wrapped<OutputContext, InputContext> | Promise<Wrapped<OutputContext, InputContext>>;
export {};