{"version":3,"sources":["../../src/use-form/bind-dom.ts"],"sourcesContent":["/**\n * Whether the element is a form item element\n */\n/* v8 ignore next 180 */\nexport function isValidFormChildElement(\n  element: unknown,\n): element is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement {\n  return [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement].some((type) => element instanceof type)\n}\n\n/**\n * Sync the form DOM state with the form value\n */\nexport function syncFormStateToDom<FormState extends object>(\n  formEl: HTMLFormElement,\n  form: FormState,\n  defaultForm: FormState,\n): void {\n  for (const element of Array.from(formEl.elements)) {\n    if (isValidFormChildElement(element) && 'name' in element) {\n      const name = element.name as keyof FormState\n      const value = form[name]\n\n      switch (true) {\n        // <input />\n        case element instanceof HTMLInputElement: {\n          switch (element.type) {\n            case 'checkbox': {\n              const checkbox = element\n\n              if (Array.isArray(defaultForm[name])) {\n                checkbox.defaultChecked = defaultForm[name].includes(checkbox.value)\n              } else {\n                checkbox.defaultChecked = defaultForm[name] && checkbox.value === 'on'\n              }\n\n              if (Array.isArray(value)) {\n                checkbox.checked = value.includes(checkbox.value)\n              } else {\n                checkbox.checked = Boolean(value)\n              }\n\n              break\n            }\n\n            case 'radio': {\n              const radio = element\n              radio.defaultChecked = defaultForm[name] === radio.value\n              radio.checked = radio.value === value\n              break\n            }\n\n            // range / date / time / number / text / password / email / tel / url / search\n            default: {\n              element.defaultValue = defaultForm[name] as string\n              element.value = String(value ?? '')\n              break\n            }\n          }\n\n          break\n        }\n\n        // <select />\n        case element instanceof HTMLSelectElement: {\n          const select = element\n\n          if (Array.isArray(value) && Array.isArray(defaultForm[name])) {\n            select.multiple = true\n\n            for (const option of Array.from(select.options)) {\n              option.defaultSelected = defaultForm[name].includes(option.value)\n              option.selected = value.includes(option.value)\n            }\n          } else {\n            select.multiple = false\n\n            for (const option of Array.from(select.options)) {\n              option.defaultSelected = defaultForm[name] === option.value\n              option.selected = value === option.value\n            }\n\n            select.value = String(value ?? '')\n          }\n\n          break\n        }\n\n        // <textarea />\n        case element instanceof HTMLTextAreaElement: {\n          element.defaultValue = String(defaultForm[name]) as string\n          element.value = String(value ?? '')\n\n          break\n        }\n      }\n    }\n  }\n}\n\n/**\n * Get the form value from the form element\n */\nexport function getFormStateFromDom<FormState extends object>(formEl: HTMLFormElement, form: FormState): FormState {\n  const formValue = structuredClone(form)\n\n  for (const element of Array.from(formEl.elements)) {\n    if (isValidFormChildElement(element) && 'name' in element) {\n      const name = element.name as keyof FormState\n\n      switch (true) {\n        // <input />\n        case element instanceof HTMLInputElement: {\n          switch (element.type) {\n            case 'checkbox': {\n              const checkbox = element\n\n              if (Array.isArray(formValue[name])) {\n                if (checkbox.checked) {\n                  formValue[name] = [...new Set([...formValue[name], checkbox.value])] as FormState[typeof name]\n                } else {\n                  formValue[name] = formValue[name].filter((v) => v !== checkbox.value) as FormState[typeof name]\n                }\n              } else {\n                formValue[name] = checkbox.checked as FormState[typeof name]\n              }\n\n              break\n            }\n\n            case 'radio': {\n              const radio = element\n\n              if (radio.checked) {\n                formValue[name] = radio.value as FormState[typeof name]\n              }\n\n              break\n            }\n\n            // range / date / time / number / text / password / email / tel / url / search\n            default: {\n              formValue[name] = element.value as FormState[typeof name]\n\n              break\n            }\n          }\n\n          break\n        }\n\n        // <select />\n        case element instanceof HTMLSelectElement: {\n          const select = element\n          const opts = Array.from(select.options)\n\n          if (select.multiple) {\n            formValue[name] = opts.filter((op) => op.selected).map((op) => op.value) as FormState[typeof name]\n          } else {\n            formValue[name] = (opts.find((op) => op.selected)?.value || select.value) as FormState[typeof name]\n          }\n\n          break\n        }\n\n        // <textarea />\n        case element instanceof HTMLTextAreaElement: {\n          formValue[name] = element.value as FormState[typeof name]\n\n          break\n        }\n\n        default:\n          break\n      }\n    }\n  }\n\n  return formValue\n}\n"],"names":["getFormStateFromDom","isValidFormChildElement","syncFormStateToDom","element","HTMLInputElement","HTMLSelectElement","HTMLTextAreaElement","some","type","formEl","form","defaultForm","Array","from","elements","name","value","checkbox","isArray","defaultChecked","includes","checked","Boolean","radio","defaultValue","String","select","multiple","options","option","defaultSelected","selected","formValue","structuredClone","Set","filter","v","opts","op","map","find"],"mappings":"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"}