@sanity/form-toolkit

3.0.163.0.17
dist/form-renderer/index.js.map
~dist/form-renderer/index.js.mapModified
+1−1
Index: package/dist/form-renderer/index.js.map
===================================================================
--- package/dist/form-renderer/index.js.map
+++ package/dist/form-renderer/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["ChangeEvent","FC","Ref","FieldComponentProps","toRef","HTMLElement","ref","T","DefaultField","t0","$","_c","field","fieldState","error","type","label","name","options","t1","choices","t2","validation","t3","t4","undefined","t5","t6","t7","Symbol","for","bb0","reduce","_temp","validationRules","value","onChange","onBlur","isControlled","t8","e","target","handleChange","t9","e_0","choiceValue","Array","isArray","newValue","checked","filter","v_0","v","handleCheckboxChange","t10","fallback","defaultValue","textValueProps","t11","placeholder","map","_temp2","choice_0","choice","includes","e_1","renderInput","t12","t13","t14","t15","acc","choice_1","ComponentType","FC","HTMLProps","DefaultField","FieldComponentProps","FieldState","FormDataProps","FormField","FormRendererProps","HTMLFormElement","formData","getFieldState","fieldName","getFieldError","fieldComponents","Record","EMPTY_FIELD_STATE","defaultGetFieldState","defaultFieldComponents","FormRenderer","props","$","_c","t0","t1","children","undefined","t2","field","CustomComponent","type","fieldState","name","error","renderField","elProps","Object","assign","t3","id","current","t4","fields","map","field_0","_key","t5","submitButton","text","t6","label","t7"],"sources":["../../src/form-renderer/components/default-field.tsx","../../src/form-renderer/components/form-renderer.tsx"],"sourcesContent":["import type {ChangeEvent, FC, Ref} from 'react'\n\nimport type {FieldComponentProps} from './types'\n\n// oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- FieldState.ref is loosely typed so refs from any form library can be passed through\nconst toRef = <T extends HTMLElement>(ref: unknown) => ref as Ref<T> | undefined\n\nexport const DefaultField: FC<FieldComponentProps> = ({field, fieldState, error}) => {\n  const {type, label, name, options = {}, choices = [], validation = []} = field\n  if (!type || !name) return null\n  const validationRules = validation.reduce((acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }, {})\n  const {value, onChange, onBlur, ref} = fieldState\n  // Without an onChange handler the fields render as uncontrolled inputs, so the\n  // browser keeps them interactive (e.g. the default native-form usage). When a\n  // handler is provided (react-hook-form, TanStack Form, etc.) they're controlled.\n  const isControlled = typeof onChange === 'function'\n\n  const handleChange = (\n    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>,\n  ) => {\n    onChange?.(e.target.value)\n  }\n\n  const handleCheckboxChange = (e: ChangeEvent<HTMLInputElement>, choiceValue: string) => {\n    if (Array.isArray(value)) {\n      const newValue = e.target.checked\n        ? [...value, choiceValue]\n        : value.filter((v: string) => v !== choiceValue)\n      onChange?.(newValue)\n    } else {\n      onChange?.(e.target.checked ? choiceValue : '')\n    }\n  }\n\n  // Controlled inputs bind `value`/`onChange` from form state only — never the\n  // schema default, which would desync the UI from what the form library submits.\n  // Uncontrolled (native) inputs use `defaultValue` so the browser owns state.\n  const textValueProps = (fallback?: string) =>\n    isControlled ? {value: value ?? '', onChange: handleChange} : {defaultValue: fallback}\n\n  const renderInput = () => {\n    switch (type) {\n      case 'submit':\n        return <button type=\"submit\">{label || 'Submit'}</button>\n      case 'textarea':\n        return (\n          <textarea\n            ref={toRef<HTMLTextAreaElement>(ref)}\n            name={name}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n            {...validationRules}\n            {...textValueProps(options.defaultValue)}\n          />\n        )\n\n      case 'select':\n        return (\n          <select\n            ref={toRef<HTMLSelectElement>(ref)}\n            name={name}\n            {...textValueProps()}\n            {...validationRules}\n            onBlur={onBlur}\n          >\n            {choices?.map((choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            ))}\n          </select>\n        )\n\n      case 'radio':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"radio\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled ? {checked: value === choice.value, onChange: handleChange} : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      case 'checkbox':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"checkbox\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled\n                ? {\n                    checked: Array.isArray(value)\n                      ? value.includes(choice.value)\n                      : value === choice.value,\n                    onChange: (e: ChangeEvent<HTMLInputElement>) =>\n                      handleCheckboxChange(e, choice.value),\n                  }\n                : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      default:\n        return (\n          <input\n            type={type}\n            ref={toRef<HTMLInputElement>(ref)}\n            name={name}\n            {...textValueProps(options.defaultValue)}\n            {...validationRules}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n          />\n        )\n    }\n  }\n\n  return (\n    <>\n      {label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>}\n      {renderInput()}\n      {error && <span className=\"error\">{error}</span>}\n    </>\n  )\n}\n","import type {ComponentType, FC, HTMLProps} from 'react'\n\nimport {DefaultField} from './default-field'\nimport type {FieldComponentProps, FieldState, FormDataProps, FormField} from './types'\n\ninterface FormRendererProps extends HTMLProps<HTMLFormElement> {\n  formData?: FormDataProps\n  // Function to get field state for a given field name\n  getFieldState?: (fieldName: string) => FieldState\n  // Function to get field error for a given field name\n  getFieldError?: (fieldName: string) => string | undefined\n  // Override default field components\n  fieldComponents?: Record<string, ComponentType<FieldComponentProps>>\n}\n\n// No field state by default: fields render as uncontrolled, interactive inputs\n// so the form works out of the box (e.g. as a native HTML form). Consumers can\n// pass `getFieldState` to make the fields controlled.\nconst EMPTY_FIELD_STATE: FieldState = {}\nconst defaultGetFieldState = (): FieldState => EMPTY_FIELD_STATE\n\nconst defaultFieldComponents: Record<string, ComponentType<FieldComponentProps>> = {}\n\nexport const FormRenderer: FC<FormRendererProps> = (props) => {\n  const {\n    formData,\n    getFieldState = defaultGetFieldState,\n    getFieldError,\n    fieldComponents = defaultFieldComponents,\n    children,\n  } = props\n  const renderField = (field: FormField) => {\n    const CustomComponent = fieldComponents[field.type]\n    const fieldState = getFieldState(field.name)\n    const error = getFieldError?.(field.name)\n\n    if (CustomComponent) {\n      return <CustomComponent field={field} fieldState={fieldState} error={error} />\n    }\n\n    return <DefaultField field={field} fieldState={fieldState} error={error} />\n  }\n  const elProps = Object.assign({}, props)\n  delete elProps.formData\n  delete elProps.getFieldState\n  delete elProps.getFieldError\n  delete elProps.fieldComponents\n\n  return (\n    <form {...elProps} id={elProps.id ?? formData?.id?.current}>\n      {formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))}\n\n      {children}\n\n      {renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })}\n    </form>\n  )\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{field, fieldState, error}","options = {}","choices = []","validation = []","validation.reduce((acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }, {})","(acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }","(\n    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>,\n  ) => {\n    onChange?.(e.target.value)\n  }","(e: ChangeEvent<HTMLInputElement>, choiceValue: string) => {\n    if (Array.isArray(value)) {\n      const newValue = e.target.checked\n        ? [...value, choiceValue]\n        : value.filter((v: string) => v !== choiceValue)\n      onChange?.(newValue)\n    } else {\n      onChange?.(e.target.checked ? choiceValue : '')\n    }\n  }","e","v","(fallback?: string) =>\n    isControlled ? {value: value ?? '', onChange: handleChange} : {defaultValue: fallback}","() => {\n    switch (type) {\n      case 'submit':\n        return <button type=\"submit\">{label || 'Submit'}</button>\n      case 'textarea':\n        return (\n          <textarea\n            ref={toRef<HTMLTextAreaElement>(ref)}\n            name={name}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n            {...validationRules}\n            {...textValueProps(options.defaultValue)}\n          />\n        )\n\n      case 'select':\n        return (\n          <select\n            ref={toRef<HTMLSelectElement>(ref)}\n            name={name}\n            {...textValueProps()}\n            {...validationRules}\n            onBlur={onBlur}\n          >\n            {choices?.map((choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            ))}\n          </select>\n        )\n\n      case 'radio':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"radio\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled ? {checked: value === choice.value, onChange: handleChange} : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      case 'checkbox':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"checkbox\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled\n                ? {\n                    checked: Array.isArray(value)\n                      ? value.includes(choice.value)\n                      : value === choice.value,\n                    onChange: (e: ChangeEvent<HTMLInputElement>) =>\n                      handleCheckboxChange(e, choice.value),\n                  }\n                : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      default:\n        return (\n          <input\n            type={type}\n            ref={toRef<HTMLInputElement>(ref)}\n            name={name}\n            {...textValueProps(options.defaultValue)}\n            {...validationRules}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n          />\n        )\n    }\n  }","choices?.map","options.defaultValue","(choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            )","choice","label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>","renderInput()","error && <span className=\"error\">{error}</span>","<>\n      {label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>}\n      {renderInput()}\n      {error && <span className=\"error\">{error}</span>}\n    </>","getFieldState = defaultGetFieldState","fieldComponents = defaultFieldComponents","(field: FormField) => {\n    const CustomComponent = fieldComponents[field.type]\n    const fieldState = getFieldState(field.name)\n    const error = getFieldError?.(field.name)\n\n    if (CustomComponent) {\n      return <CustomComponent field={field} fieldState={fieldState} error={error} />\n    }\n\n    return <DefaultField field={field} fieldState={fieldState} error={error} />\n  }","formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))","fields","field","renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })","formData?.submitButton?.text || 'Submit'","<form {...elProps} id={elProps.id ?? formData?.id?.current}>\n      {formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))}\n\n      {children}\n\n      {renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })}\n    </form>","elProps.id ?? formData?.id?.current"],"sources":["../../src/form-renderer/components/default-field.tsx","../../src/form-renderer/components/form-renderer.tsx"],"sourcesContent":["import type {ChangeEvent, FC, Ref} from 'react'\n\nimport type {FieldComponentProps} from './types'\n\n// oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- FieldState.ref is loosely typed so refs from any form library can be passed through\nconst toRef = <T extends HTMLElement>(ref: unknown) => ref as Ref<T> | undefined\n\nexport const DefaultField: FC<FieldComponentProps> = ({field, fieldState, error}) => {\n  const {type, label, name, options = {}, choices = [], validation = []} = field\n  if (!type || !name) return null\n  const validationRules = validation.reduce((acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }, {})\n  const {value, onChange, onBlur, ref} = fieldState\n  // Without an onChange handler the fields render as uncontrolled inputs, so the\n  // browser keeps them interactive (e.g. the default native-form usage). When a\n  // handler is provided (react-hook-form, TanStack Form, etc.) they're controlled.\n  const isControlled = typeof onChange === 'function'\n\n  const handleChange = (\n    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>,\n  ) => {\n    onChange?.(e.target.value)\n  }\n\n  const handleCheckboxChange = (e: ChangeEvent<HTMLInputElement>, choiceValue: string) => {\n    if (Array.isArray(value)) {\n      const newValue = e.target.checked\n        ? [...value, choiceValue]\n        : value.filter((v: string) => v !== choiceValue)\n      onChange?.(newValue)\n    } else {\n      onChange?.(e.target.checked ? choiceValue : '')\n    }\n  }\n\n  // Controlled inputs bind `value`/`onChange` from form state only — never the\n  // schema default, which would desync the UI from what the form library submits.\n  // Uncontrolled (native) inputs use `defaultValue` so the browser owns state.\n  const textValueProps = (fallback?: string) =>\n    isControlled ? {value: value ?? '', onChange: handleChange} : {defaultValue: fallback}\n\n  const renderInput = () => {\n    switch (type) {\n      case 'submit':\n        return <button type=\"submit\">{label || 'Submit'}</button>\n      case 'textarea':\n        return (\n          <textarea\n            ref={toRef<HTMLTextAreaElement>(ref)}\n            name={name}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n            {...validationRules}\n            {...textValueProps(options.defaultValue)}\n          />\n        )\n\n      case 'select':\n        return (\n          <select\n            ref={toRef<HTMLSelectElement>(ref)}\n            name={name}\n            {...textValueProps()}\n            {...validationRules}\n            onBlur={onBlur}\n          >\n            {choices?.map((choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            ))}\n          </select>\n        )\n\n      case 'radio':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"radio\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled ? {checked: value === choice.value, onChange: handleChange} : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      case 'checkbox':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"checkbox\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled\n                ? {\n                    checked: Array.isArray(value)\n                      ? value.includes(choice.value)\n                      : value === choice.value,\n                    onChange: (e: ChangeEvent<HTMLInputElement>) =>\n                      handleCheckboxChange(e, choice.value),\n                  }\n                : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      default:\n        return (\n          <input\n            type={type}\n            ref={toRef<HTMLInputElement>(ref)}\n            name={name}\n            {...textValueProps(options.defaultValue)}\n            {...validationRules}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n          />\n        )\n    }\n  }\n\n  return (\n    <>\n      {label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>}\n      {renderInput()}\n      {error && <span className=\"error\">{error}</span>}\n    </>\n  )\n}\n","import type {ComponentType, FC, HTMLProps} from 'react'\n\nimport {DefaultField} from './default-field'\nimport type {FieldComponentProps, FieldState, FormDataProps, FormField} from './types'\n\ninterface FormRendererProps extends HTMLProps<HTMLFormElement> {\n  formData?: FormDataProps\n  // Function to get field state for a given field name\n  getFieldState?: (fieldName: string) => FieldState\n  // Function to get field error for a given field name\n  getFieldError?: (fieldName: string) => string | undefined\n  // Override default field components\n  fieldComponents?: Record<string, ComponentType<FieldComponentProps>>\n}\n\n// No field state by default: fields render as uncontrolled, interactive inputs\n// so the form works out of the box (e.g. as a native HTML form). Consumers can\n// pass `getFieldState` to make the fields controlled.\nconst EMPTY_FIELD_STATE: FieldState = {}\nconst defaultGetFieldState = (): FieldState => EMPTY_FIELD_STATE\n\nconst defaultFieldComponents: Record<string, ComponentType<FieldComponentProps>> = {}\n\nexport const FormRenderer: FC<FormRendererProps> = (props) => {\n  const {\n    formData,\n    getFieldState = defaultGetFieldState,\n    getFieldError,\n    fieldComponents = defaultFieldComponents,\n    children,\n  } = props\n  const renderField = (field: FormField) => {\n    const CustomComponent = fieldComponents[field.type]\n    const fieldState = getFieldState(field.name)\n    const error = getFieldError?.(field.name)\n\n    if (CustomComponent) {\n      return <CustomComponent field={field} fieldState={fieldState} error={error} />\n    }\n\n    return <DefaultField field={field} fieldState={fieldState} error={error} />\n  }\n  const elProps = Object.assign({}, props)\n  delete elProps.formData\n  delete elProps.getFieldState\n  delete elProps.getFieldError\n  delete elProps.fieldComponents\n\n  return (\n    <form {...elProps} id={elProps.id ?? formData?.id?.current}>\n      {formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))}\n\n      {children}\n\n      {renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })}\n    </form>\n  )\n}\n"],"mappings":"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"}
\ No newline at end of file