{"version":3,"file":"index.cjs","names":["matches: Record<KeyType, any>","castArrayPath","isObject","GeneralFormContext: Context<Form<any, any> | null>","value","form","useLatestFunction","calcDuration","form","calcDuration","useLatestFunction","keys: (string | number)[]","isObject","join","remove","Fragment","name","diff","deepEqual","get","remove","set","calcDuration","queue","useLatestFunction","deepEqual","debounce","FormContainer","get","set","deepEqual","isObject","join","options: FormOptions<TDraft, TOriginal>","useStore","form","createStore","lastDraft: TDraft | undefined","context: FormContext<TDraft, TOriginal>","reportValidity","options","transform","Form","fromExtendedJsonString","toExtendedJsonString","urlStore: Store<string>","createStore","Store","urlOptions: Required<UrlOptions<T>>","path: any","update: Update<any>","get","set","useLatestFunction","useMemoEquals","update","value","isPromise","delayedUpdate: (value: T) => void","debounce","throttle"],"sources":["../../src/react/form/customInput.tsx","../../src/lib/wildcardMatch.ts","../../src/react/form/closestFormContext.tsx","../../src/react/form/legacyFormField.tsx","../../src/react/form/formField.tsx","../../src/react/form/formForEach.tsx","../../src/react/form/formOnOriginalChange.tsx","../../src/react/form/useFormAutosave.ts","../../src/react/form/form.tsx","../../src/lib/castArray.ts","../../src/react/url/urlHelpers.ts","../../src/react/url/urlOptions.ts","../../src/react/url/urlParamStore.ts","../../src/react/useDecoupledState.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n  name: string;\n  children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): React.JSX.Element {\n  return (\n    <div\n      {...props}\n      style={{\n        position: 'relative',\n        ...props.style,\n      }}\n    >\n      {children}\n\n      <input\n        name={name}\n        style={{\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          opacity: 0,\n          width: '100%',\n          height: '100%',\n          pointerEvents: 'none',\n        }}\n      />\n    </div>\n  );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n  if (typeof s === 'string') {\n    s = castArrayPath(s);\n  }\n\n  if (typeof w === 'string') {\n    w = castArrayPath(w);\n  }\n\n  return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n  object: any,\n  path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n  const matches: Record<KeyType, any> = {};\n  const [first, second, ...rest] = castArrayPath(path);\n\n  if (first === undefined) {\n    throw new Error('Path is empty');\n  }\n\n  if (!Array.isArray(object) && !isObject(object)) {\n    object = {};\n  }\n\n  for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n    if (first !== '*' && first !== key) {\n      continue;\n    }\n\n    if (second === undefined) {\n      matches[key] = value;\n      continue;\n    }\n\n    for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n      matches[`${key}.${subKey}`] = subValue;\n    }\n  }\n\n  return matches;\n}\n","import { type Form } from '@react/form/form';\nimport { createContext, useContext, type Context } from 'react';\n\nexport const GeneralFormContext: Context<Form<any, any> | null> = createContext<Form<\n  any,\n  any\n> | null>(null);\n\nexport function useClosestForm<TDraft, TOriginal extends TDraft = TDraft>(): Form<\n  TDraft,\n  TOriginal\n> | null {\n  return useContext(GeneralFormContext) as Form<TDraft, TOriginal> | null;\n}\n","import { calcDuration } from '@lib/duration';\nimport type { Value } from '@lib/path';\nimport { getDerivedState, type Form, type FormInstance } from '@react/form/form';\nimport type {\n  FormFieldComponent,\n  FormFieldComponentProps,\n  FormFieldProps,\n} from '@react/form/formField';\nimport useLatestFunction from '@react/lib/useLatestFunction';\nimport { createElement, useEffect, useState, type ComponentPropsWithoutRef } from 'react';\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n  ComponentPropsWithoutRef<T> extends {\n    onChange?: (update: infer U) => void;\n  }\n    ? U extends { target: { value: infer V } }\n      ? V\n      : U\n    : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n  value: Value<TDraft, TPath>,\n  formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n  value: FieldChangeValue<TComponent>,\n  formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n  TDraft,\n  TOriginal,\n  TPath extends string,\n  TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n  component: TComponent;\n  render?: undefined;\n} & NoInfer<\n    {\n      inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n    } & MakeOptional<\n      Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n      'onChange' | 'onBlur'\n    > &\n      (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n        ? {\n            defaultValue?: FieldValue<TComponent>;\n            serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n          }\n        : Value<TDraft, TPath> extends FieldValue<TComponent>\n          ?\n              | {\n                  defaultValue: FieldValue<TComponent>;\n                  serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n                }\n              | {\n                  defaultValue?: FieldValue<TComponent>;\n                  serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n                }\n          : {\n              serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n            }) &\n      (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n        ? {\n            deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n          }\n        : {\n            deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n          })\n  >;\n\nexport function LegacyFormField<\n  TDraft,\n  TOriginal,\n  TPath extends string,\n  TComponent extends FormFieldComponent,\n>(\n  this: Form<TDraft, any>,\n  {\n    // id,\n    name = '' as any,\n    component,\n    commitOnBlur,\n    commitDebounce,\n    inputFilter,\n    defaultValue,\n    serialize,\n    deserialize = (x) => x as Value<TDraft, TPath>,\n    onChange,\n    onBlur,\n    ...restProps\n  }: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): React.JSX.Element | null {\n  type T = FieldChangeValue<TComponent>;\n\n  const form = this.useForm();\n  const getFormState = () => ({ ...form, ...getDerivedState(form) });\n  const [localValue, setLocalValue] = useState<T>();\n\n  const value = this.useFormState((form) => {\n    const value = form.getField(name as any).value;\n    if (serialize) {\n      return serialize(value as any, getFormState());\n    }\n    if (value !== undefined) {\n      return value;\n    }\n    return defaultValue;\n  });\n\n  const setValue = useLatestFunction((x: FieldChangeValue<TComponent>) =>\n    form.getField(name as any).setValue(deserialize(x, getFormState())),\n  );\n\n  const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n  const commitDebounceMs = commitDebounce !== undefined ? calcDuration(commitDebounce) : undefined;\n  useEffect(() => {\n    if (localValue === undefined || commitDebounceMs === undefined || commitDebounceMs <= 0) {\n      return;\n    }\n\n    const timeout = setTimeout(() => {\n      setValue(localValue);\n      setLocalValue(undefined);\n    }, commitDebounceMs);\n\n    return () => clearTimeout(timeout);\n  }, [localValue, commitDebounceMs, setValue]);\n\n  let props = {\n    name,\n    value: localValue ?? value,\n    onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n      const value =\n        typeof event === 'object' && event !== null && 'target' in event\n          ? event.target.value\n          : event;\n\n      if (inputFilter && !inputFilter(value)) {\n        return;\n      }\n\n      if (commitOnBlur || commitDebounce) {\n        setLocalValue(value);\n      } else {\n        setValue(value);\n      }\n\n      onChange?.(event, ...moreArgs);\n    },\n    onBlur(...args: any[]) {\n      if (localValue !== undefined) {\n        setValue(localValue);\n        setLocalValue(undefined);\n      }\n\n      onBlur?.(...args);\n    },\n  } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n  if (this.options.transformFieldProps) {\n    props = this.options.transformFieldProps(\n      props,\n      { ...form.getField(name as any), hasTriggeredValidations } as any,\n      form,\n    );\n  }\n\n  if (component) {\n    return createElement(component, { ...restProps, ...props });\n  }\n\n  return null;\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/duration';\nimport { type PathAsString, type Value } from '@lib/path';\nimport useLatestFunction from '@react/lib/useLatestFunction';\nimport { useEffect, useState, type Component, type ReactNode } from 'react';\nimport { Form, type Field, type FieldOptions, type FormContext } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n  name: TPath;\n  value: TValue;\n  onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n  onBlur: (...args: any[]) => void;\n  'data-invalid'?: boolean;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n  TDraft,\n  TOriginal,\n  TPath\n> & {\n  hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n  | (new (props: P, context?: any) => Component<P, any>)\n  | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\nexport interface FormFieldProps<TPath, TDraft> extends FieldOptions {\n  name: TPath extends PathAsString<TDraft> ? TPath : PathAsString<TDraft>;\n  commitOnBlur?: boolean;\n  commitDebounce?: Duration;\n}\n\nexport interface FormFieldPropsWithRender<\n  TDraft,\n  TOriginal,\n  TPath extends string,\n> extends FormFieldProps<TPath, TDraft> {\n  render: NoInfer<\n    (\n      props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n      info: FormFieldInfos<TDraft, TOriginal, TPath>,\n      form: FormContext<TDraft, TOriginal>,\n    ) => ReactNode\n  >;\n  children?: undefined;\n}\n\nexport interface FormFieldPropsWithChildren<\n  TDraft,\n  TOriginal,\n  TPath extends string,\n> extends FormFieldProps<TPath, TDraft> {\n  render?: undefined;\n  children: NoInfer<\n    (\n      props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n      info: FormFieldInfos<TDraft, TOriginal, TPath>,\n      form: FormContext<TDraft, TOriginal>,\n    ) => ReactNode\n  >;\n}\n\nexport function FormField<TDraft, TOriginal extends TDraft, TPath extends string>(\n  this: Form<TDraft, any>,\n  {\n    name = '' as any,\n    commitOnBlur,\n    commitDebounce,\n    children,\n    render = children,\n    includeNestedErrors,\n  }:\n    | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n    | FormFieldPropsWithChildren<TDraft, TOriginal, TPath>,\n): React.JSX.Element | null {\n  const form = this.useForm();\n  const field = this.useField(name);\n  const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n  const renderProps = useFormFieldProps.call<\n    Form<TDraft, TOriginal>,\n    [FormFieldProps<TPath, TDraft>],\n    FormFieldComponentProps<Value<TDraft, TPath>, TPath>\n  >(this, {\n    name,\n    commitOnBlur,\n    commitDebounce,\n    includeNestedErrors,\n  });\n\n  if (render) {\n    return <>{render(renderProps, { ...field, hasTriggeredValidations } as any, form)}</>;\n  }\n\n  return null;\n}\n\nexport function useFormFieldProps<TDraft, TPath extends string>(\n  this: Form<TDraft, any>,\n  {\n    name = '' as any,\n    commitOnBlur,\n    commitDebounce,\n    includeNestedErrors,\n  }: FormFieldProps<TPath, TDraft>,\n): FormFieldComponentProps<Value<TDraft, TPath>, TPath> {\n  type T = Value<TDraft, TPath>;\n\n  const form = this.useForm();\n  const field = this.useField(name, { includeNestedErrors });\n  const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n  const [localValue, setLocalValue] = useState<{ v: T }>();\n\n  const commitDebounceMs = commitDebounce !== undefined ? calcDuration(commitDebounce) : undefined;\n\n  const commitLocalValue = useLatestFunction(() => {\n    if (localValue) {\n      field.setValue(localValue.v);\n      setLocalValue(undefined);\n    }\n  });\n\n  useEffect(() => {\n    if (!localValue || commitDebounceMs === undefined || commitDebounceMs <= 0) {\n      return;\n    }\n\n    const timeout = setTimeout(commitLocalValue, commitDebounceMs);\n    return () => clearTimeout(timeout);\n  }, [localValue, commitDebounceMs, commitLocalValue]);\n\n  let props = {\n    name,\n    value: localValue ? localValue.v : field.value,\n    onChange: useLatestFunction((event: { target: { value: T } } | T) => {\n      const value =\n        typeof event === 'object' && event !== null && 'target' in event\n          ? event.target.value\n          : event;\n\n      if (commitOnBlur || (commitDebounceMs !== undefined && commitDebounceMs > 0)) {\n        setLocalValue({ v: value });\n      } else {\n        field.setValue(value as any);\n      }\n    }),\n    onBlur: useLatestFunction(() => {\n      if (localValue) {\n        commitLocalValue();\n      }\n    }),\n    'data-invalid': field.errors.length > 0 ? true : undefined,\n  } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n  if (this.options.transformFieldProps) {\n    props = this.options.transformFieldProps(\n      props,\n      { ...field, hasTriggeredValidations } as any,\n      form,\n    );\n  }\n\n  return props;\n}\n","import { isObject } from '@lib/helpers';\nimport { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { join } from '@lib/propAccess';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n  [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\ntype ItemValue<T> = T extends readonly (infer U)[] ? U : T[keyof T];\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n  name: TPath extends PathAsString<TDraft> ? TPath : PathAsString<TDraft>;\n  renderElement?: (props: {\n    name: ElementName<TDraft, TPath>;\n    key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n    index: number;\n    remove: () => void;\n    count: number;\n  }) => ReactNode;\n  renderAdditionalElement?: NonNullable<Value<TDraft, TPath>> extends readonly any[]\n    ? boolean\n    : never;\n  filter?: (\n    item: ItemValue<NonNullable<Value<TDraft, TPath>>>,\n    key: GetKeys<NonNullable<Value<TDraft, TPath>>>,\n    parent: NonNullable<Value<TDraft, TPath>>,\n  ) => boolean;\n  children?: (\n    props: {\n      setValue: (\n        value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n      ) => void;\n    } & FieldHelperMethods<TDraft, TPath>,\n  ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n  this: Form<TDraft, any>,\n  {\n    name,\n    renderElement,\n    renderAdditionalElement,\n    filter,\n    children,\n  }: FormForEachProps<TDraft, TPath>,\n): React.JSX.Element {\n  const form = this.useForm();\n\n  const items = this.useFormState(() => {\n    const field = form.getField(name);\n\n    let keys: (string | number)[] = isObject(field.value) ? Object.keys(field.value) : [];\n    const count = keys.length;\n\n    if (Array.isArray(field.value)) {\n      keys = keys.map(Number);\n    }\n\n    if (filter) {\n      keys = keys.filter((key, index) =>\n        filter((field.value as any)[index], key as any, field.value as any),\n      );\n    }\n\n    if (renderAdditionalElement) {\n      keys.push(count);\n    }\n\n    return keys.map((key) => ({\n      key,\n      name: join(name, String(key)),\n    }));\n  });\n\n  const add = useCallback(\n    (...args: any[]) => {\n      const field = form.getField(name as any) as any;\n      field.add(...args);\n    },\n    [form, name],\n  );\n\n  const remove = useCallback(\n    (key: any) => {\n      const field = form.getField(name as any) as any;\n      field.remove(key);\n    },\n    [form, name],\n  );\n\n  const setValue = useCallback(\n    (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n      const field = form.getField(name as any) as any;\n      field.setValue(value);\n    },\n    [form, name],\n  );\n\n  return (\n    <>\n      {renderElement &&\n        items.map(({ key, name }, index) => {\n          return (\n            <Fragment key={key}>\n              {renderElement({\n                name: name as any,\n                key: key as any,\n                index,\n                remove: () => remove(key),\n                count: items.length,\n              })}\n            </Fragment>\n          );\n        })}\n\n      {children?.({\n        names: items.map((item) => item.name),\n        add,\n        remove,\n        setValue,\n      } as any)}\n    </>\n  );\n}\n","import { diff } from '@lib/diff';\nimport type { FormContext } from './form';\nimport { get, remove, set } from '@lib/propAccess';\nimport { deepEqual } from '@lib/equals';\n\nexport interface OnOriginalChangeHandler<TDraft, TOriginal> {\n  (\n    oldOriginal: TOriginal | undefined,\n    newOriginal: TOriginal | undefined,\n    draft: TDraft,\n    form: FormContext<TDraft, TOriginal>,\n  ): TDraft | void;\n}\n\nexport type OnOriginalChangeBuiltin = 'default' | 'merge' | 'overwrite';\nexport type OnOriginalChange<TDraft, TOriginal> =\n  | OnOriginalChangeHandler<TDraft, TOriginal>\n  | OnOriginalChangeBuiltin;\n\nexport function onOriginalChangeDefault<TDraft, TOriginal>(\n  _oldOriginal: TOriginal | undefined,\n  _newOriginal: TOriginal | undefined,\n  draft: TDraft,\n  _form: FormContext<TDraft, TOriginal>,\n): TDraft | void {\n  return draft;\n}\n\nexport function onOriginalChangeMerge<TDraft, TOriginal>(\n  oldOriginal: TOriginal | undefined,\n  newOriginal: TOriginal | undefined,\n  draft: TDraft,\n  _form: FormContext<TDraft, TOriginal>,\n): TDraft | void {\n  const [patches] = diff(oldOriginal, newOriginal, { diffArrays: true });\n\n  for (const p of patches) {\n    const draftValue = get(draft, p.path as any);\n    const oldValue = get(oldOriginal, p.path as any);\n\n    if (deepEqual(draftValue, oldValue)) {\n      switch (p.op) {\n        case 'remove':\n          draft = remove(draft, p.path as any);\n          break;\n\n        default:\n          draft = set(draft, p.path as any, p.value);\n          break;\n      }\n    }\n  }\n\n  return draft;\n}\n\nexport function onOriginalChangeOverwrite<TDraft, TOriginal extends TDraft>(\n  _oldOriginal: TOriginal | undefined,\n  newOriginal: TOriginal | undefined,\n  _draft: TDraft,\n  _form: FormContext<TDraft, TOriginal>,\n): TDraft | void {\n  return newOriginal;\n}\n\nconst builtinHandlers = {\n  default: onOriginalChangeDefault,\n  merge: onOriginalChangeMerge,\n  overwrite: onOriginalChangeOverwrite,\n};\n\nexport function resolveOnOriginalChange<TDraft, TOriginal>(\n  onOriginalChange: OnOriginalChange<TDraft, TOriginal> | undefined,\n): OnOriginalChangeHandler<TDraft, TOriginal> {\n  if (typeof onOriginalChange === 'function') {\n    return onOriginalChange;\n  }\n\n  if (typeof onOriginalChange === 'string' && onOriginalChange in builtinHandlers) {\n    return builtinHandlers[onOriginalChange as OnOriginalChangeBuiltin] as OnOriginalChangeHandler<\n      TDraft,\n      TOriginal\n    >;\n  }\n\n  return onOriginalChangeDefault;\n}\n","import type { Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { calcDuration } from '@lib/duration';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport useLatestFunction from '@react/lib/useLatestFunction';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n  enabled?: boolean;\n  validateBeforeSave?: boolean;\n  save?: (draft: TDraft, prev: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n  debounce?: Duration;\n  resetAfterSave?: boolean;\n  equals?: (a: any, b: any) => boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n  form: FormContext<TDraft, TOriginal>,\n): {\n  flush(): Promise<void>;\n  cancel(): Promise<void>;\n} {\n  const { enabled = true, validateBeforeSave = true } = form.options.autoSave ?? {};\n\n  const isActive = enabled && !!form.options.autoSave?.save;\n  const debounceTime = calcDuration(form.options.autoSave?.debounce ?? 2_000);\n  const prev = useRef(form.getDraft());\n  const q = useMemo(() => queue(), []);\n\n  const latestSave = useLatestFunction(async () => {\n    if (validateBeforeSave && !form.validate()) {\n      return;\n    }\n\n    const draft = form.getDraft();\n    const equals =\n      form.options.autoSave?.equals ?? ((a, b) => deepEqual(a, b, { undefinedEqualsAbsent: true }));\n\n    if (!isActive || equals(draft, prev.current)) {\n      return;\n    }\n\n    form.formState.set('saveInProgress', true);\n\n    try {\n      await form.options.autoSave?.save?.(draft, prev.current, form);\n      prev.current = draft;\n\n      if (q.size === 0 && form.options.autoSave?.resetAfterSave) {\n        form.reset();\n      }\n    } catch (error) {\n      console.error('Unhandled error during form autosave:', error);\n    } finally {\n      form.formState.set('saveInProgress', false);\n    }\n  });\n\n  const scheduleSave = useMemo(\n    () =>\n      debounce(() => {\n        q.clear();\n        q(latestSave);\n      }, debounceTime),\n    [q, latestSave, debounceTime],\n  );\n\n  useEffect(() => {\n    if (!isActive) {\n      return;\n    }\n\n    return form.formState\n      .map((state) => state.draft)\n      .subscribe(\n        (draft) => {\n          if (draft === undefined) {\n            return;\n          }\n\n          scheduleSave();\n        },\n        {\n          runNow: false,\n        },\n      );\n  }, [isActive, form.formState, scheduleSave]);\n\n  useEffect(() => {\n    return () => {\n      scheduleSave.flush();\n    };\n  }, [scheduleSave]);\n\n  return {\n    flush() {\n      scheduleSave.flush();\n      return q.whenDone();\n    },\n    cancel() {\n      scheduleSave.cancel();\n      return q.whenDone();\n    },\n  };\n}\n","import { createStore, type Store, type Update } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { isObject } from '@lib/helpers';\nimport {\n  type PathAsString,\n  type Value,\n  type WildcardPathAsString,\n  type WildcardValue,\n} from '@lib/path';\nimport { get, join, set } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport { GeneralFormContext } from '@react/form/closestFormContext';\nimport { LegacyFormField, type FormFieldPropsWithComponent } from '@react/form/legacyFormField';\nimport { create, type Draft } from 'mutative';\nimport {\n  createContext,\n  forwardRef,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  type Context,\n  type FormEvent,\n  type ForwardedRef,\n  type FunctionComponent,\n  type HTMLProps,\n  type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n  FormField,\n  useFormFieldProps,\n  type FormFieldComponent,\n  type FormFieldComponentProps,\n  type FormFieldInfos,\n  type FormFieldProps,\n  type FormFieldPropsWithChildren,\n  type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { resolveOnOriginalChange, type OnOriginalChange } from './formOnOriginalChange';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport interface Transform<TDraft, TOriginal> {\n  (value: Draft<TDraft>, context: TransformContext<TDraft, TOriginal>): void | TDraft;\n}\n\nexport interface TransformContext<TDraft, TOriginal> extends FormContext<TDraft, TOriginal> {\n  previousValue: TDraft;\n}\n\nexport interface FormOptions<TDraft, TOriginal> {\n  id?: string;\n  defaultValue: TDraft;\n  validations?: Validations<TDraft, TOriginal>;\n  initiallyTriggerValidations?: boolean;\n  localizeError?: (error: string, field: string) => string | undefined;\n  autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n  transform?: Transform<TDraft, TOriginal>;\n  validatedClass?: string;\n  original?: TOriginal;\n  onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n  reportValidity?: boolean | 'browser' | 'scrollTo';\n  transformFieldProps?: <TPath extends string>(\n    props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n    info: FormFieldInfos<TDraft, TOriginal, TPath>,\n    form: FormContext<TDraft, TOriginal>,\n  ) => FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n  onOriginalChange?: OnOriginalChange<TDraft, TOriginal>;\n}\n\nexport type Validations<TDraft, TOriginal> =\n  | ((context: { draft: TDraft; original: TOriginal | undefined }) => Iterable<{\n      name: string;\n      error: string;\n    }>)\n  | ({\n      [TPath in WildcardPathAsString<TDraft>]?: Record<\n        string,\n        Validation<TDraft, TOriginal, TPath>\n      >;\n    } & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>);\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n  value: WildcardValue<TDraft, TPath>,\n  context: {\n    draft: TDraft;\n    original: TOriginal;\n    field: PathAsString<TDraft> | '';\n  },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n  originalValue: Value<TOriginal, TPath> | undefined;\n  value: Value<TDraft, TPath>;\n  setValue: (value: Update<Value<TDraft, TPath>>) => void;\n  removeValue: () => void;\n  hasChange: boolean;\n  errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n  names: ElementName<TDraft, TPath>[];\n  add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n    ? (element: T) => void\n    : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n      ? (key: K, value: V) => void\n      : never;\n  remove: NonNullable<Value<TDraft, TPath>> extends readonly any[]\n    ? (index: number) => void\n    : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n  draft: TDraft | undefined;\n  hasTriggeredValidations: boolean;\n  saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n  draft: TDraft;\n  hasTriggeredValidations: boolean;\n  saveInProgress: boolean;\n  hasChanges: boolean;\n  errors: Map<string, string[]>;\n  isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n  formState: Store<FormState<TDraft>>;\n  options: FormOptions<TDraft, TOriginal>;\n  original: TOriginal | undefined;\n  getField: <TPath extends string>(\n    name: TPath extends PathAsString<TDraft> ? TPath : PathAsString<TDraft>,\n    options?: FieldOptions,\n  ) => Field<TDraft, TOriginal, TPath>;\n  getDraft: () => TDraft;\n  hasTriggeredValidations: () => boolean;\n  saveInProgress: () => boolean;\n  flushAutosave: () => Promise<void>;\n  cancelAutosave: () => void;\n  hasChanges: () => boolean;\n  getErrors: () => Map<string, string[]>;\n  isValid: () => boolean;\n  validate: (options?: ValidateOptions) => boolean;\n  reset: () => void;\n}\n\nexport interface FieldOptions {\n  includeNestedErrors?: boolean;\n}\n\nexport interface ValidateOptions {\n  reportValidity?: boolean | 'browser' | 'scrollTo';\n  button?: HTMLButtonElement;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n  extends\n    FormDerivedState<TDraft>,\n    Pick<\n      FormContext<TDraft, TOriginal>,\n      'options' | 'original' | 'getField' | 'validate' | 'reset'\n    > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nconst FormContainer = forwardRef(function FormContainer(\n  {\n    form,\n    ...formProps\n  }: {\n    form: Form<any, any>;\n    onSubmit?: (\n      event: FormEvent<HTMLFormElement>,\n      form: FormInstance<any, any>,\n    ) => void | Promise<void>;\n  } & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>,\n  ref: ForwardedRef<HTMLFormElement>,\n) {\n  const formInstance = form.useForm();\n  const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n  const hasErrors = form.useFormState((state) => hasTriggeredValidations && state.errors.size > 0);\n\n  return (\n    <form\n      ref={ref}\n      noValidate\n      {...formProps}\n      className={[\n        formProps.className,\n        hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n      ]\n        .filter(Boolean)\n        .join(' ')}\n      data-validated={hasTriggeredValidations || undefined}\n      data-valid={hasErrors ? 'false' : hasTriggeredValidations ? 'true' : undefined}\n      onSubmit={async (event) => {\n        if (formInstance.saveInProgress()) {\n          return;\n        }\n\n        try {\n          formInstance.formState.set('saveInProgress', true);\n          event.preventDefault();\n\n          const button =\n            event.nativeEvent instanceof SubmitEvent &&\n            event.nativeEvent.submitter instanceof HTMLButtonElement\n              ? event.nativeEvent.submitter\n              : undefined;\n\n          const isValid = formInstance.validate({ button });\n          if (isValid) {\n            await formProps.onSubmit?.(event, {\n              ...formInstance,\n              ...getDerivedState(formInstance),\n            });\n          }\n        } finally {\n          formInstance.formState.set('saveInProgress', false);\n        }\n      }}\n    />\n  );\n});\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n  form: FormContext<TDraft, TOriginal>,\n  name: TPath extends PathAsString<TDraft> ? TPath : PathAsString<TDraft>,\n  { includeNestedErrors }: FieldOptions = {},\n): Field<TDraft, TOriginal, TPath> {\n  const field = {\n    get originalValue() {\n      return form.original !== undefined ? get(form.original as any, name as any) : undefined;\n    },\n\n    get value() {\n      const draft = form.getDraft();\n      return get(draft ?? form.original ?? form.options.defaultValue, name as any);\n    },\n\n    setValue(update: Update<Value<TDraft, TPath>>) {\n      form.formState.set('draft', (draft = form.original ?? form.options.defaultValue) => {\n        if (update instanceof Function) {\n          update = update(get(draft, name as any) as Value<TDraft, TPath>);\n        }\n\n        return set(draft, name as any, update as any);\n      });\n    },\n\n    get hasChange() {\n      return !deepEqual(this.originalValue, this.value, { undefinedEqualsAbsent: true });\n    },\n\n    get errors() {\n      const errors = form.getErrors();\n\n      if (includeNestedErrors) {\n        return Array.from(errors.entries())\n          .filter(([key]) => key === name || key.startsWith(`${name}.`))\n          .flatMap(([, value]) => value);\n      } else {\n        return errors.get(name) ?? [];\n      }\n    },\n\n    get names(): any {\n      const { value } = this;\n\n      if (isObject(value)) {\n        return Object.keys(value).map((key) => join(name, key));\n      }\n\n      return [];\n    },\n\n    add(...args: any[]) {\n      this.setValue((value): any => {\n        if (!value) {\n          throw new Error(`Cannot add element to ${JSON.stringify(value)}`);\n        }\n\n        if (Array.isArray(value)) {\n          return [...(value ?? []), args[0]];\n        }\n\n        if (isObject(value)) {\n          return {\n            ...value,\n            [args[0]]: args[1],\n          };\n        }\n\n        throw new Error(`Cannot add element to ${JSON.stringify(value)}`);\n      });\n    },\n\n    remove(key: string | number) {\n      this.setValue((value): any => {\n        if (!value) {\n          throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);\n        }\n\n        if (Array.isArray(value)) {\n          return value.filter((_, index) => index !== Number(key));\n        }\n\n        if (isObject(value)) {\n          const { [key]: _, ...rest } = value as Record<string | number, unknown>;\n          return rest;\n        }\n\n        throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);\n      });\n    },\n  };\n\n  return field as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n  draft: TDraft,\n  { original, validations, localizeError }: FormOptions<TDraft, TOriginal>,\n) {\n  const errors = new Map<string, string[]>();\n\n  if (typeof validations === 'function') {\n    const issues = validations({ draft, original });\n\n    for (const { name, error } of issues) {\n      const fieldErrors = errors.get(name) ?? [];\n      fieldErrors.push(error);\n      errors.set(name, fieldErrors);\n    }\n  } else {\n    for (const [path, block] of Object.entries(validations ?? {})) {\n      for (const [validationName, validate] of Object.entries(\n        block as Record<string, Validation<any, any, any>>,\n      )) {\n        let matched = false;\n\n        for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n          matched = true;\n          if (!validate(value, { draft, original, field })) {\n            const fieldErrors = errors.get(field) ?? [];\n            fieldErrors.push(validationName);\n            errors.set(field, fieldErrors);\n          }\n        }\n\n        if (!matched && !path.includes('*')) {\n          if (!validate(undefined, { draft, original, field: path })) {\n            const fieldErrors = errors.get(path) ?? [];\n            fieldErrors.push(validationName);\n            errors.set(path, fieldErrors);\n          }\n        }\n      }\n    }\n  }\n\n  if (localizeError) {\n    for (const [field, fieldErrors] of errors.entries()) {\n      errors.set(\n        field,\n        fieldErrors.map((error) => localizeError(error, field) ?? error),\n      );\n    }\n  }\n\n  return errors;\n}\n\nexport function getDerivedState<TDraft>(\n  instance: FormContext<TDraft, any>,\n): FormDerivedState<TDraft> {\n  return {\n    draft: instance.getDraft(),\n    hasTriggeredValidations: instance.hasTriggeredValidations(),\n    saveInProgress: instance.saveInProgress(),\n    hasChanges: instance.hasChanges(),\n    errors: instance.getErrors(),\n    isValid: instance.isValid(),\n  };\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n  context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n    TDraft,\n    TOriginal\n  > | null>(null);\n\n  constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n    autobind(Form);\n  }\n\n  useForm(): FormContext<TDraft, TOriginal> {\n    const context = useContext(this.context);\n\n    if (!context) {\n      throw new Error('Form context not found');\n    }\n\n    return context;\n  }\n\n  useFormState<S>(\n    selector: (state: FormInstance<TDraft, TOriginal>) => S,\n    useStoreOptions?: UseStoreOptions<S>,\n  ): S {\n    const form = this.useForm();\n\n    return useStore(\n      form.formState,\n      () =>\n        selector({\n          ...form,\n          ...getDerivedState(form),\n        }),\n\n      useStoreOptions,\n    );\n  }\n\n  useField<TPath extends string>(\n    name: TPath extends PathAsString<TDraft> ? TPath : PathAsString<TDraft>,\n    { includeNestedErrors, ...useStoreOptions }: FieldOptions & UseStoreOptions<unknown> = {},\n  ): Field<TDraft, TOriginal, TPath> {\n    const form = this.useForm();\n    this.useFormState((form) => [form.getField(name).value, form.original], useStoreOptions);\n\n    return form.getField(name, { includeNestedErrors });\n  }\n\n  useFieldProps<TPath extends string>(\n    name: TPath extends PathAsString<TDraft> ? TPath : PathAsString<TDraft>,\n    options?: Omit<FormFieldProps<TPath, TDraft>, 'name'>,\n  ): FormFieldComponentProps<Value<TDraft, TPath>, TPath> {\n    return useFormFieldProps.call<\n      Form<TDraft, TOriginal>,\n      [FormFieldProps<TPath, TDraft>],\n      FormFieldComponentProps<Value<TDraft, TPath>, TPath>\n    >(this, { name, ...options } as any);\n  }\n\n  // ///////////////////////////////////////////////////////////////////////////\n  // React Components\n  // ///////////////////////////////////////////////////////////////////////////\n\n  Form({\n    defaultValue,\n    validations,\n    initiallyTriggerValidations,\n    localizeError,\n    autoSave,\n    transform,\n    validatedClass,\n    original,\n    onSubmit,\n    reportValidity,\n    transformFieldProps,\n    onOriginalChange,\n    ...formProps\n  }: Partial<FormOptions<TDraft, TOriginal>> &\n    Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): React.JSX.Element {\n    const options: FormOptions<TDraft, TOriginal> = {\n      defaultValue: { ...this.options.defaultValue, ...defaultValue },\n      validations:\n        typeof validations === 'function'\n          ? validations\n          : validations\n            ? ({ ...this.options.validations, ...validations } as Validations<TDraft, TOriginal>)\n            : this.options.validations,\n      localizeError: localizeError ?? this.options.localizeError,\n      autoSave:\n        this.options.autoSave || autoSave\n          ? ({ ...this.options.autoSave, ...autoSave } as FormAutosaveOptions<TDraft, TOriginal>)\n          : undefined,\n      transform: transform ?? this.options.transform,\n      validatedClass: validatedClass ?? this.options.validatedClass,\n      original: original ?? this.options.original,\n      onSubmit: onSubmit ?? this.options.onSubmit,\n      reportValidity: reportValidity ?? this.options.reportValidity ?? 'browser',\n      transformFieldProps: transformFieldProps ?? this.options.transformFieldProps,\n      onOriginalChange: onOriginalChange ?? this.options.onOriginalChange ?? 'default',\n    };\n\n    const formState = useMemo(() => {\n      return createStore<FormState<TDraft>>({\n        draft: undefined,\n        hasTriggeredValidations: initiallyTriggerValidations ?? false,\n        saveInProgress: false,\n      });\n      // oxlint-disable-next-line exhaustive-deps\n    }, []);\n\n    const formRef = useRef<HTMLFormElement>(null);\n\n    let lastDraft: TDraft | undefined;\n    const cache = new Map<string, unknown>();\n    function lazy<T>(key: string, fn: () => T): T {\n      if (lastDraft !== formState.get().draft) {\n        cache.clear();\n        lastDraft = formState.get().draft;\n      }\n\n      let value = cache.get(key);\n      if (!cache.has(key)) {\n        value = fn();\n        cache.set(key, value);\n      }\n\n      return value as T;\n    }\n\n    const context: FormContext<TDraft, TOriginal> = {\n      formState,\n      options,\n      original: options.original,\n\n      getField() {\n        throw new Error('Not implemented');\n      },\n\n      getDraft() {\n        return formState.get().draft ?? options.original ?? options.defaultValue;\n      },\n\n      hasTriggeredValidations() {\n        return formState.get().hasTriggeredValidations;\n      },\n\n      saveInProgress() {\n        return formState.get().saveInProgress;\n      },\n\n      flushAutosave() {\n        return autosave.flush();\n      },\n\n      cancelAutosave() {\n        return autosave.cancel();\n      },\n\n      hasChanges() {\n        return lazy(\n          'hasChanges',\n          () =>\n            !deepEqual(this.getDraft(), options.original ?? options.defaultValue, {\n              undefinedEqualsAbsent: true,\n            }),\n        );\n      },\n\n      getErrors() {\n        return lazy('getErrors', () => getErrors(this.getDraft(), options));\n      },\n\n      isValid() {\n        return lazy('isValid', () => this.getErrors().size === 0);\n      },\n\n      validate({ reportValidity = options.reportValidity, button }: ValidateOptions = {}) {\n        formState.set('hasTriggeredValidations', true);\n\n        updateValidity(this.getErrors(), button);\n\n        switch (reportValidity) {\n          case 'browser':\n            formRef.current?.reportValidity();\n            break;\n\n          case true:\n          case 'scrollTo':\n            {\n              const invalidElement = document.querySelector(':invalid, [data-invalid=\"true\"]');\n              if (invalidElement && invalidElement instanceof HTMLElement) {\n                invalidElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n                invalidElement.focus({ preventScroll: true });\n              }\n            }\n            break;\n        }\n\n        return this.isValid();\n      },\n\n      reset() {\n        formState.set('draft', undefined);\n        formState.set('hasTriggeredValidations', false);\n      },\n    };\n\n    context.getField = (path, options) =>\n      lazy(`${path}:${options?.includeNestedErrors}`, () => getField(context, path, options));\n\n    useEffect(() => {\n      const transform = options.transform;\n      if (!transform) {\n        return;\n      }\n\n      return context.formState.subscribe((state, prev) => {\n        const value = state.draft ?? options.original ?? options.defaultValue;\n        const previousValue = prev?.draft ?? options.original ?? options.defaultValue;\n        const result = create(value, (draft) =>\n          transform(draft, { ...context, previousValue }),\n        ) as TDraft;\n\n        if (!deepEqual(result, value)) {\n          context.formState.set('draft', result);\n        }\n      });\n    });\n\n    const lastOriginal = useRef(options.original);\n\n    useEffect(() => {\n      const draft = formState.get().draft;\n\n      if (draft !== undefined && !deepEqual(options.original, lastOriginal.current)) {\n        const handler = resolveOnOriginalChange(options.onOriginalChange);\n        const result = handler(lastOriginal.current, options.original, draft, context);\n\n        if (result !== undefined && !deepEqual(result, draft)) {\n          formState.set('draft', result);\n        }\n      }\n\n      lastOriginal.current = options.original;\n      // oxlint-disable-next-line exhaustive-deps\n    }, [options.original]);\n\n    function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n      const formElement = formRef.current;\n      if (!formElement) {\n        return;\n      }\n\n      for (const element of Array.from(formElement.elements)) {\n        if ('name' in element && 'setCustomValidity' in element) {\n          (element as HTMLObjectElement).setCustomValidity(\n            errors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n          );\n        }\n      }\n\n      if (buttonElement && 'setCustomValidity' in buttonElement) {\n        const errorString = [...errors.values()].flat().join('\\n');\n\n        buttonElement.setCustomValidity(errorString);\n      }\n    }\n\n    useEffect(() => {\n      return formState.map(() => context.getErrors()).subscribe((errors) => updateValidity(errors));\n    });\n\n    const autosave = useFormAutosave(context);\n\n    return (\n      <GeneralFormContext.Provider value={this}>\n        <this.context.Provider value={context}>\n          <FormContainer {...formProps} ref={formRef} form={this} onSubmit={options.onSubmit} />\n        </this.context.Provider>\n      </GeneralFormContext.Provider>\n    );\n  }\n\n  FormState<S>({\n    selector,\n    children,\n  }: {\n    selector: (form: FormInstance<TDraft, TOriginal>) => S;\n    children: (selectedState: S) => ReactNode;\n  }): React.JSX.Element {\n    const selectedState = this.useFormState(selector);\n    return <>{children(selectedState)}</>;\n  }\n\n  Field<const TPath extends string>(\n    props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n  ): React.JSX.Element;\n\n  Field<const TPath extends string>(\n    props: FormFieldPropsWithChildren<TDraft, TOriginal, TPath>,\n  ): React.JSX.Element;\n\n  /** @deprecated */\n  Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n    props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n  ): React.JSX.Element;\n\n  Field(props: any): React.JSX.Element {\n    if (props.component) {\n      return Reflect.apply(LegacyFormField, this, [props]);\n    }\n\n    return Reflect.apply(FormField, this, [props]);\n  }\n\n  ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): React.JSX.Element {\n    return Reflect.apply(FormForEach, this, [props]);\n  }\n\n  withForm<TProps extends Record<string, unknown>>(\n    Component: React.ComponentType<TProps>,\n    formProps?: Parameters<this['Form']>[0],\n  ): FunctionComponent<TProps> {\n    const { Form } = this;\n    return function FormWrapper(props: TProps) {\n      return (\n        <Form {...formProps}>\n          <Component {...props} />\n        </Form>\n      );\n    };\n  }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n  options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n  return new Form(options);\n}\n","export function castArray<T>(value: T | T[]): T[] {\n  return Array.isArray(value) ? value : [value];\n}\n","import { fromExtendedJsonString, toExtendedJsonString } from '@lib/extendedJson';\n\nexport function defaultDeserializer<T>(value: string): T {\n  if (value === undefined) {\n    return undefined as T;\n  }\n\n  try {\n    return fromExtendedJsonString(value) as T;\n  } catch {\n    return undefined as T;\n  }\n}\n\nexport function defaultSerializer<T>(value: T): string {\n  return toExtendedJsonString(value);\n}\n\nexport function normalizePath<T>(path: string | T): string | T {\n  if (typeof path === 'string') {\n    return path.replace(/^\\//g, '').replace(/\\/$/g, '');\n  }\n  return path;\n}\n","import { castArray } from '@lib/castArray';\nimport { defaultDeserializer, defaultSerializer, normalizePath } from '@react/url/urlHelpers';\n\nexport interface UrlOptions<T> {\n  key: string;\n  type?: 'search' | 'hash';\n  serialize?: (value: T) => string;\n  deserialize?: (value: string) => T;\n  defaultValue: T;\n  writeDefaultValue?: boolean;\n  onCommit?: (value: T) => void;\n  persist?: { id: string } | null;\n  path?: string | RegExp | (string | RegExp)[] | null;\n}\n\nexport interface UrlOptionsWithoutDefaults<T> extends Omit<\n  UrlOptions<T | undefined>,\n  'defaultValue'\n> {\n  defaultValue?: T | undefined;\n}\n\nexport function createUrlOptions<T>(options: UrlOptions<T>): Required<UrlOptions<T>>;\nexport function createUrlOptions<T>(\n  options: UrlOptionsWithoutDefaults<T>,\n): Required<UrlOptions<T | undefined>>;\nexport function createUrlOptions<T>({\n  key,\n  type = 'hash',\n  serialize = defaultSerializer,\n  deserialize = defaultDeserializer,\n  defaultValue = undefined as T,\n  writeDefaultValue = false,\n  onCommit = () => undefined,\n  persist = null,\n  path = null,\n}: UrlOptionsWithoutDefaults<T>): Required<UrlOptionsWithoutDefaults<T>> {\n  return {\n    key,\n    type,\n    serialize,\n    deserialize,\n    defaultValue,\n    writeDefaultValue,\n    onCommit,\n    persist,\n    path: path === null ? null : castArray(path).map(normalizePath),\n  };\n}\n","import { createStore, Store, type Update } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { castArray } from '@lib/castArray';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { get, set } from '@lib/propAccess';\nimport { normalizePath } from '@react/url/urlHelpers';\nimport {\n  createUrlOptions,\n  type UrlOptions,\n  type UrlOptionsWithoutDefaults,\n} from '@react/url/urlOptions';\n\nexport const urlStore: Store<string> = createStore(() => window.location.href, {\n  cacheValue: false,\n  effect() {\n    const update = () => {\n      if (window.location.href !== this.calculatedValue?.value) {\n        this.invalidate();\n      }\n    };\n\n    const interval = setInterval(update, 1);\n    window.addEventListener('popstate', update);\n\n    return () => {\n      clearInterval(interval);\n      window.removeEventListener('popstate', update);\n    };\n  },\n});\n\nexport class UrlParamStore<T> extends Store<T> {\n  readonly storageKey: string | null;\n  private lastHref?: string;\n  private lastStorageValue?: string | null;\n  private lastValue?: T;\n\n  constructor(public readonly urlOptions: Required<UrlOptions<T>>) {\n    super(() => this.calc(), { cacheValue: false });\n    autobind(UrlParamStore);\n\n    this.storageKey =\n      urlOptions.persist && `cross-state:url:${urlOptions.persist.id}:${urlOptions.key}`;\n    this.addEffect(this.watch);\n  }\n\n  private watch() {\n    let isActive = false;\n    let urlValue = this.getUrlValue();\n    let storageValue = this.getStorageValue();\n\n    const update = () => {\n      const oldIsActive = isActive;\n      isActive = this.isPathActive();\n      const oldUrlValue = urlValue;\n      urlValue = this.getUrlValue();\n      const oldStorageValue = storageValue;\n      storageValue = this.getStorageValue();\n\n      // If inactive => ignore changes\n      if (!isActive) {\n        return;\n      }\n\n      // No changes => ignore\n      if (\n        isActive === oldIsActive &&\n        urlValue === oldUrlValue &&\n        storageValue === oldStorageValue\n      ) {\n        return;\n      }\n\n      if (!oldIsActive) {\n        // Became active =>\n        // - if url has value => update storage\n        // - else if storage has value or writeDefaultValue => update url\n        if (urlValue !== null) {\n          this.updateStorage(this.urlOptions.deserialize(urlValue));\n        } else if (storageValue !== null) {\n          this.updateUrl(this.urlOptions.deserialize(storageValue));\n        } else if (this.urlOptions.writeDefaultValue) {\n          this.updateUrl(this.urlOptions.defaultValue);\n        }\n      } else if (urlValue !== oldUrlValue) {\n        // Url change while active =>\n        // - if url has no value and writeDefaultValue => update url\n        // - update storage\n        if (urlValue === null && this.urlOptions.writeDefaultValue) {\n          this.updateUrl(this.urlOptions.defaultValue);\n        }\n\n        this.updateStorage(\n          urlValue !== null ? this.urlOptions.deserialize(urlValue) : this.urlOptions.defaultValue,\n        );\n      }\n\n      this.invalidate();\n    };\n\n    const cancel = urlStore.subscribe(update);\n    window.addEventListener('storage', update);\n\n    return () => {\n      cancel();\n      window.removeEventListener('storage', update);\n    };\n  }\n\n  private getUrlValue() {\n    const href = urlStore.get();\n    const url = new URL(href);\n    const params = new URLSearchParams(url[this.urlOptions.type].slice(1) || '');\n    return params.get(this.urlOptions.key);\n  }\n\n  private getStorageValue() {\n    return this.storageKey !== null ? localStorage.getItem(this.storageKey) : null;\n  }\n\n  private isPathActive() {\n    if (this.urlOptions.path === null) {\n      return true;\n    }\n\n    const path = normalizePath(window.location.pathname);\n\n    return castArray(this.urlOptions.path).some((p) => {\n      if (typeof p === 'string') {\n        return !p || p === path || path.startsWith(p + '/');\n      }\n\n      return p.test(path);\n    });\n  }\n\n  private calc() {\n    let href = window.location.href;\n    const storageValue = this.storageKey !== null ? localStorage.getItem(this.storageKey) : null;\n\n    if (!this.isPathActive() && this.lastHref !== undefined) {\n      href = this.lastHref;\n    }\n\n    if (this.lastHref === href && this.lastStorageValue === storageValue) {\n      return this.lastValue as T;\n    }\n\n    const url = new URL(href);\n    const params = new URLSearchParams(url[this.urlOptions.type].slice(1));\n    const urlValue = params.get(this.urlOptions.key);\n\n    const value =\n      urlValue !== null\n        ? this.urlOptions.deserialize(urlValue)\n        : this.storageKey !== null && storageValue !== null\n          ? this.urlOptions.deserialize(storageValue)\n          : this.urlOptions.defaultValue;\n\n    this.lastHref = href;\n    this.lastStorageValue = storageValue;\n    this.lastValue = value;\n    return value;\n  }\n\n  private updateUrl(value: T) {\n    const serializedValue = this.urlOptions.serialize(value);\n\n    const url = new URL(window.location.href);\n    const params = new URLSearchParams(url[this.urlOptions.type].slice(1));\n\n    if (\n      !this.urlOptions.writeDefaultValue &&\n      serializedValue === this.urlOptions.serialize(this.urlOptions.defaultValue)\n    ) {\n      params.delete(this.urlOptions.key);\n    } else {\n      params.set(this.urlOptions.key, serializedValue);\n    }\n\n    url[this.urlOptions.type] = params.toString();\n    window.history.replaceState(window.history.state, '', url.toString());\n    window.dispatchEvent(new PopStateEvent('popstate', { state: window.history.state }));\n  }\n\n  private updateStorage(value: T) {\n    if (this.storageKey === null) {\n      return;\n    }\n\n    const serializedValue = this.urlOptions.serialize(value);\n    localStorage.setItem(this.storageKey, serializedValue);\n  }\n\n  set(update: Update<T>): void;\n  set<const P>(path: Constrain<P, Path<T>>, update: Update<Value<T, P>>): void;\n  set(...args: any[]): void {\n    const path: any = args.length > 1 ? args[0] : [];\n    let update: Update<any> = args.length > 1 ? args[1] : args[0];\n\n    if (update instanceof Function) {\n      const before = this.get();\n      const valueBefore = get(before, path);\n      const valueAfter = update(valueBefore);\n      update = set(before, path, valueAfter);\n    } else if (path.length > 0) {\n      update = set(this.get(), path, update);\n    }\n\n    if (this.isPathActive()) {\n      this.updateUrl(update);\n    } else {\n      this.updateStorage(update);\n    }\n  }\n\n  parse(path: string): T {\n    const url = new URL(path, window.location.href);\n    const params = new URLSearchParams(url[this.urlOptions.type].slice(1) || '');\n    const urlValue = params.get(this.urlOptions.key);\n    return urlValue !== null ? this.urlOptions.deserialize(urlValue) : this.urlOptions.defaultValue;\n  }\n}\n\nexport function createUrlParam<T>(options: UrlOptions<T>): UrlParamStore<T>;\nexport function createUrlParam<T>(\n  options: UrlOptionsWithoutDefaults<T>,\n): UrlParamStore<T | undefined>;\nexport function createUrlParam<T>(options: UrlOptionsWithoutDefaults<T>) {\n  return new UrlParamStore(createUrlOptions(options));\n}\n","import { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport isPromise from '@lib/isPromise';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { throttle } from '@lib/throttle';\nimport useLatestFunction from '@react/lib/useLatestFunction';\nimport useMemoEquals from '@react/lib/useMemoEquals';\nimport { startTransition, useMemo, useRef, useState } from 'react';\n\nexport interface UseDecoupledStateOptions<T> {\n  debounce?: Duration;\n  throttle?: Duration;\n  onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n  value: T,\n  onChange: (value: T) => MaybePromise<void>,\n  options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n  const [dirty, setDirty] = useState<{ v: T }>();\n  const onChangeAC = useRef<AbortController>(undefined);\n\n  const latestOnChange = useLatestFunction(onChange);\n  const latestOnCommit = useLatestFunction(options.onCommit ?? (() => {}));\n  const debounceOptions = useMemoEquals(options.debounce);\n  const throttleOptions = useMemoEquals(options.throttle);\n\n  const update = useMemo(() => {\n    const update = async (value: T) => {\n      const result = latestOnChange(value);\n\n      if (isPromise(result)) {\n        const ac = (onChangeAC.current = new AbortController());\n\n        await result;\n\n        if (ac.signal.aborted) {\n          return;\n        }\n      }\n\n      latestOnCommit(value);\n      setDirty(undefined);\n    };\n\n    let delayedUpdate: (value: T) => void;\n\n    if (debounceOptions) {\n      delayedUpdate = debounce(update, debounceOptions);\n    } else if (throttleOptions) {\n      delayedUpdate = throttle(update, throttleOptions);\n    } else {\n      delayedUpdate = (value) => startTransition(() => update(value));\n    }\n\n    return (value: T) => {\n      onChangeAC.current?.abort();\n      setDirty({ v: value });\n      delayedUpdate(value);\n    };\n  }, [latestOnChange, latestOnCommit, debounceOptions, throttleOptions]);\n\n  return [dirty ? dirty.v : value, update];\n}\n"],"mappings":"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"}