UNPKG

@solid-primitives/controlled-props

Version:

The primitives in this package allow you to create controlls for component props.

88 lines (87 loc) 4.07 kB
import type { Accessor, Component, JSX, Setter } from "solid-js"; export type TestPropType = "boolean" | "number" | "string" | "object"; export type TestPropObjectOptions<T> = T[] | Record<string, T> | any; export type TestPropOptions<T> = (T extends undefined ? { initialValue?: T; } : { initialValue: T; }) & { min?: T extends number ? number : undefined; max?: T extends number ? number : undefined; options?: TestPropObjectOptions<T>; type?: TestPropType; }; export type TestPropReturn<T> = [value: Accessor<T>, setValue: Setter<T>, field: Component]; export type TestPropProps<T> = { name: string; value: Accessor<T>; setValue: Setter<T>; min?: T extends number ? number : undefined; max?: T extends number ? number : undefined; }; export declare const BoolProp: Component<TestPropProps<boolean>>; export declare const NumberProp: Component<TestPropProps<number>>; export declare const StringProp: Component<TestPropProps<string>>; export declare const SelectProp: <T>(props: TestPropProps<T> & { options: TestPropObjectOptions<T>; }) => JSX.Element; /** * creates a getter, a setter and a form control for a single prop * * @param name {string} The name of the property * @param options initialValue or Options object * * @example ```ts * createControlledProp('value', 'test'); * createControlledProp('page', { initialValue: 7, min: 1, max: 99 }); * createControlledProp('language', { * initialValue: 'en', * options: ['en', 'de', 'it', 'jp', 'cn', 'xy'] * }); * // => { value: Accessor<string>, setValue: Setter<string>, field: Component } * ``` */ export declare function createControlledProp<T extends undefined>(name: string, options?: TestPropOptions<T>): TestPropReturn<T>; export declare function createControlledProp<T = boolean>(name: string, options: TestPropOptions<T> | T): TestPropReturn<T>; export declare function createControlledProp<T = number>(name: string, options: TestPropOptions<T> | T): TestPropReturn<T>; export declare function createControlledProp<T = string>(name: string, options: TestPropOptions<T> | T): TestPropReturn<T>; export declare function createControlledProp<T = any>(name: string, options: TestPropOptions<T>): TestPropReturn<T>; export declare function createControlledProp<T>(name: string, options: T extends undefined ? never : T extends object ? TestPropOptions<T> : TestPropOptions<T> | T): TestPropReturn<T>; export type CreateTestProps = <Props extends { [name: string]: boolean | number | string | TestPropOptions<boolean | number | string | object>; }>(props: Props) => [ props: { [name in keyof Props]: Accessor<Props[name] extends object ? Props[name]["options"] extends object ? Props[name]["options"][keyof Props[name]["options"]] : Props[name]["initialValue"] : Props[name] extends boolean ? boolean : Props[name]>; } & { [name in keyof Props as `set${Capitalize<name & string>}`]: Setter<Props[name] extends object ? Props[name]["options"] extends object ? Props[name]["options"][keyof Props[name]["options"]] : Props[name]["initialValue"] : Props[name] extends boolean ? boolean : Props[name]>; }, fields: JSX.Element[] ]; /** * creates reactive props for testing a component * * @param props {Record<string, TestPropOptions>} * @returns ```ts * [ * props: { [name: string]: Accessor<T>, [setName: string]: Setter<T> } * fields: JSX.Element[] * ] * ``` * You get the fields to render the prop controls and getter and setter names derived from the name in `props` based on common practice, i.e. `count` would automatically translate to * ```ts * { count: Accessor<T>, getCount: Setter<T> } * ``` * @example ```ts * const [props, fields] = createControlledProps({ * value: { initialValue: '' }, * disabled: { initialValue: false }, * invalid: { initialValue: false }, * type: { initialValue: 'text', options: ['text', 'password', 'email'] } * }) * return <> * <Input {...props} /> * {fields} * </> * ``` */ export declare const createControlledProps: CreateTestProps;