@os-design/form 1.0.8 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +70 -36
  2. package/dist/cjs/BroadcastObserverManager.js +44 -0
  3. package/dist/cjs/BroadcastObserverManager.js.map +1 -0
  4. package/dist/cjs/{SubscribableData.js → ErrorData.js} +20 -18
  5. package/dist/cjs/ErrorData.js.map +1 -0
  6. package/dist/cjs/ErrorObserverManager.js +64 -0
  7. package/dist/cjs/ErrorObserverManager.js.map +1 -0
  8. package/dist/cjs/Form.js +46 -0
  9. package/dist/cjs/Form.js.map +1 -0
  10. package/dist/cjs/Node.js +60 -0
  11. package/dist/cjs/Node.js.map +1 -0
  12. package/dist/cjs/ValueData.js +55 -0
  13. package/dist/cjs/ValueData.js.map +1 -0
  14. package/dist/cjs/ValueObserverManager.js +124 -0
  15. package/dist/cjs/ValueObserverManager.js.map +1 -0
  16. package/dist/cjs/index.js +115 -106
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/types.js +6 -0
  19. package/dist/cjs/types.js.map +1 -0
  20. package/dist/cjs/useFormContext.js +27 -0
  21. package/dist/cjs/useFormContext.js.map +1 -0
  22. package/dist/cjs/utils/clone.js +1 -1
  23. package/dist/cjs/utils/deleteFromArray.js +17 -0
  24. package/dist/cjs/utils/deleteFromArray.js.map +1 -0
  25. package/dist/cjs/utils/isEqual.js +1 -1
  26. package/dist/cjs/utils/path.js +53 -0
  27. package/dist/cjs/utils/path.js.map +1 -0
  28. package/dist/esm/BroadcastObserverManager.js +18 -0
  29. package/dist/esm/BroadcastObserverManager.js.map +1 -0
  30. package/dist/esm/ErrorData.js +20 -0
  31. package/dist/esm/ErrorData.js.map +1 -0
  32. package/dist/esm/ErrorObserverManager.js +26 -0
  33. package/dist/esm/ErrorObserverManager.js.map +1 -0
  34. package/dist/esm/Form.js +26 -0
  35. package/dist/esm/Form.js.map +1 -0
  36. package/dist/esm/Node.js +31 -0
  37. package/dist/esm/Node.js.map +1 -0
  38. package/dist/esm/ValueData.js +21 -0
  39. package/dist/esm/ValueData.js.map +1 -0
  40. package/dist/esm/ValueObserverManager.js +67 -0
  41. package/dist/esm/ValueObserverManager.js.map +1 -0
  42. package/dist/esm/index.js +44 -66
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/types.js +2 -0
  45. package/dist/esm/types.js.map +1 -0
  46. package/dist/esm/useFormContext.js +17 -0
  47. package/dist/esm/useFormContext.js.map +1 -0
  48. package/dist/esm/utils/deleteFromArray.js +8 -0
  49. package/dist/esm/utils/deleteFromArray.js.map +1 -0
  50. package/dist/esm/utils/path.js +31 -0
  51. package/dist/esm/utils/path.js.map +1 -0
  52. package/dist/types/BroadcastObserverManager.d.ts +10 -0
  53. package/dist/types/BroadcastObserverManager.d.ts.map +1 -0
  54. package/dist/types/ErrorData.d.ts +11 -0
  55. package/dist/types/ErrorData.d.ts.map +1 -0
  56. package/dist/types/ErrorObserverManager.d.ts +12 -0
  57. package/dist/types/ErrorObserverManager.d.ts.map +1 -0
  58. package/dist/types/Form.d.ts +12 -0
  59. package/dist/types/Form.d.ts.map +1 -0
  60. package/dist/types/Node.d.ts +15 -0
  61. package/dist/types/Node.d.ts.map +1 -0
  62. package/dist/types/ValueData.d.ts +11 -0
  63. package/dist/types/ValueData.d.ts.map +1 -0
  64. package/dist/types/ValueObserverManager.d.ts +13 -0
  65. package/dist/types/ValueObserverManager.d.ts.map +1 -0
  66. package/dist/types/index.d.ts +32 -46
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/types.d.ts +15 -0
  69. package/dist/types/types.d.ts.map +1 -0
  70. package/dist/types/useFormContext.d.ts +11 -0
  71. package/dist/types/useFormContext.d.ts.map +1 -0
  72. package/dist/types/utils/deleteFromArray.d.ts +3 -0
  73. package/dist/types/utils/deleteFromArray.d.ts.map +1 -0
  74. package/dist/types/utils/path.d.ts +5 -0
  75. package/dist/types/utils/path.d.ts.map +1 -0
  76. package/package.json +3 -3
  77. package/dist/cjs/SubscribableData.js.map +0 -1
  78. package/dist/cjs/SubscriptionManager.js +0 -83
  79. package/dist/cjs/SubscriptionManager.js.map +0 -1
  80. package/dist/esm/SubscribableData.js +0 -23
  81. package/dist/esm/SubscribableData.js.map +0 -1
  82. package/dist/esm/SubscriptionManager.js +0 -46
  83. package/dist/esm/SubscriptionManager.js.map +0 -1
  84. package/dist/types/SubscribableData.d.ts +0 -11
  85. package/dist/types/SubscribableData.d.ts.map +0 -1
  86. package/dist/types/SubscriptionManager.d.ts +0 -19
  87. package/dist/types/SubscriptionManager.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","SubscribableData","clone","isEqual","useDeepEqualMemo","Form","constructor","initValues","values","errors","reset","Object","keys","getAll","forEach","name","set","undefined","FormContext","FormProvider","form","children","createUseValueHook","value","setValue","get","subscription","subscribeToField","v","unsubscribe","useError","currentForm","Error","createUseTransformerHook","useValue","transformer","transformerRef","current","partialValues","entries","n","createFieldComponent","props","toValue","fromValue","render","transformedValue","error","modified","fromValueRef","onChange","renderRef","inputProps","fieldState","useModifiedFields","modifiedFields","setModifiedFields","modifiedFieldsRef","initValuesRef","subscribeToAllFields","isInitValue","fields","includes","filter","field","useFormResponse","useTransformer","Field","length","useForm","memoizedInitValues","useExistingForm"],"sources":["../../src/index.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport SubscribableData from './SubscribableData';\nimport clone from './utils/clone';\nimport isEqual from './utils/isEqual';\nimport useDeepEqualMemo from './utils/useDeepEqualMemo';\n\nexport * from './SubscriptionManager';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Values = Record<string, any>;\ntype Errors<TValues extends Values> = Record<keyof TValues, string | undefined>;\n\nexport class Form<\n TValues extends Values = Values,\n TErrors extends Errors<TValues> = Errors<TValues>\n> {\n public readonly initValues: TValues;\n\n public readonly values: SubscribableData<TValues>;\n\n public readonly errors: SubscribableData<TErrors>;\n\n public constructor(initValues: TValues) {\n this.initValues = initValues;\n this.values = new SubscribableData(clone(initValues));\n this.errors = new SubscribableData({} as TErrors);\n }\n\n public reset() {\n // Reset values\n Object.keys(this.values.getAll()).forEach((name) => {\n this.values.set(name, this.initValues[name]);\n });\n\n // Reset errors\n Object.keys(this.errors.getAll()).forEach((name) => {\n this.errors.set(name, undefined as any);\n });\n }\n}\n\nconst FormContext = createContext<any>(null);\n\ninterface FormProviderProps<TValues extends Values> {\n form: Form<TValues>;\n children?: ReactNode;\n}\n\n// eslint-disable-next-line react/function-component-definition\nexport function FormProvider<TValues extends Values>({\n form,\n children,\n}: FormProviderProps<TValues>) {\n return <FormContext.Provider value={form}>{children}</FormContext.Provider>;\n}\n\nconst createUseValueHook =\n <TValues extends Values>(form: Form<TValues>) =>\n <TName extends keyof TValues>(name: TName) => {\n const [value, setValue] = useState<TValues[TName]>(form.values.get(name));\n\n useEffect(() => {\n const subscription = form.values.subscribeToField(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [name]);\n\n return value;\n };\n\nexport const useError = <\n TValues extends Values = Values,\n TName extends keyof TValues = keyof TValues\n>(\n name: TName,\n form?: Form<TValues>\n) => {\n const currentForm = useContext(FormContext) || form;\n if (!currentForm) throw new Error('Specify the form');\n const [value, setValue] = useState<string | undefined>(\n currentForm.errors.get(name)\n );\n\n useEffect(() => {\n const subscription = currentForm.errors.subscribeToField(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [currentForm.errors, name]);\n\n return value;\n};\n\nexport type Transformer<TValues extends Values, TName extends keyof TValues> = (\n value: TValues[TName]\n) => Partial<TValues>;\n\nconst createUseTransformerHook = <TValues extends Values>(\n form: Form<TValues>\n) => {\n const useValue = createUseValueHook(form);\n return <TName extends keyof TValues>(\n name: TName,\n transformer: Transformer<TValues, TName>\n ) => {\n const value = useValue(name);\n\n const transformerRef = useRef(transformer);\n useEffect(() => {\n transformerRef.current = transformer;\n }, [transformer]);\n\n useEffect(() => {\n const partialValues = transformerRef.current(value);\n Object.entries(partialValues).forEach(([n, v]) => {\n form.values.set(n, v);\n });\n }, [value]);\n };\n};\n\ninterface InputProps<T> {\n value: T;\n onChange: (value: T) => void;\n}\ninterface FieldState {\n error: string | null;\n modified: boolean;\n reset: () => void;\n}\ninterface FieldPropsWithoutTransformers<TName, TStateValue> {\n name: TName;\n toValue?: never;\n fromValue?: never;\n render: (\n inputProps: InputProps<TStateValue>,\n fieldState: FieldState\n ) => ReactElement | null;\n}\ninterface FieldPropsWithTransformers<TName, TStateValue, TInputValue> {\n name: TName;\n toValue: (value: TStateValue) => TInputValue;\n fromValue?: (value: TInputValue) => TStateValue;\n render: (\n inputProps: InputProps<TInputValue>,\n fieldState: FieldState\n ) => ReactElement | null;\n}\ntype FieldProps<TName, TStateValue, TInputValue> =\n | FieldPropsWithoutTransformers<TName, TStateValue>\n | FieldPropsWithTransformers<TName, TStateValue, TInputValue>;\n\nconst createFieldComponent = <TValues extends Values>(form: Form<TValues>) => {\n const useValue = createUseValueHook(form);\n return <TName extends keyof TValues>(\n props: FieldProps<TName, TValues[TName], any>\n ) => {\n const { name, toValue, fromValue, render } = props;\n\n const value = useValue(name);\n const transformedValue = useMemo<any>(\n () => (toValue ? toValue(value) : value),\n [toValue, value]\n );\n const error = useError<TValues>(name, form);\n\n const modified = useMemo(\n () => !isEqual(value, form.initValues[name]),\n [name, value]\n );\n const reset = useCallback(\n () => form.values.set(name, form.initValues[name]),\n [name]\n );\n\n const fromValueRef = useRef(fromValue);\n useEffect(() => {\n fromValueRef.current = fromValue;\n }, [fromValue]);\n\n const onChange = useCallback(\n (v: any) => {\n form.values.set(\n name,\n fromValueRef.current ? fromValueRef.current(v) : (v as TValues[TName])\n );\n form.errors.set(name, undefined);\n },\n [name]\n );\n\n const renderRef = useRef(render);\n useEffect(() => {\n renderRef.current = render;\n }, [render]);\n\n const inputProps = useMemo(\n () => ({ value: transformedValue, onChange }),\n [onChange, transformedValue]\n );\n const fieldState = useMemo(\n () => ({ error: error || null, modified, reset }),\n [error, modified, reset]\n );\n\n return useMemo(\n () => renderRef.current(inputProps, fieldState),\n [fieldState, inputProps]\n );\n };\n};\n\nconst useModifiedFields = <TValues extends Values>(form: Form<TValues>) => {\n const [modifiedFields, setModifiedFields] = useState<Array<keyof TValues>>(\n []\n );\n\n const modifiedFieldsRef = useRef(modifiedFields);\n useEffect(() => {\n modifiedFieldsRef.current = modifiedFields;\n }, [modifiedFields]);\n\n const initValuesRef = useRef(form.initValues);\n useEffect(() => {\n initValuesRef.current = form.initValues;\n }, [form.initValues]);\n\n useEffect(() => {\n const subscription = form.values.subscribeToAllFields((name, value) => {\n const isInitValue = isEqual(value, initValuesRef.current[name]);\n const fields = modifiedFieldsRef.current;\n\n if (fields.includes(name)) {\n if (isInitValue) {\n setModifiedFields(fields.filter((field) => field !== name));\n }\n } else if (!isInitValue) {\n setModifiedFields([...fields, name]);\n }\n });\n return () => subscription.unsubscribe();\n }, [form.values]);\n\n return modifiedFields;\n};\n\nconst useFormResponse = <TValues extends Values>(form: Form<TValues>) => {\n const useValue = useMemo(() => createUseValueHook(form), [form]);\n const useTransformer = useMemo(() => createUseTransformerHook(form), [form]);\n const Field = useMemo(() => createFieldComponent(form), [form]);\n\n const modifiedFields = useModifiedFields(form);\n const modified = useMemo(\n () => modifiedFields.length > 0,\n [modifiedFields.length]\n );\n\n return useMemo(\n () => ({\n form,\n Field,\n useValue,\n useTransformer,\n modifiedFields,\n modified,\n }),\n [Field, form, modified, modifiedFields, useTransformer, useValue]\n );\n};\n\nexport const useForm = <TValues extends Values = Values>(\n initValues: TValues\n) => {\n const memoizedInitValues = useDeepEqualMemo<TValues>(\n () => initValues,\n [initValues]\n );\n const form = useMemo(\n () => new Form<TValues>(memoizedInitValues),\n [memoizedInitValues]\n );\n return useFormResponse(form);\n};\n\nexport const useExistingForm = <TValues extends Values = Values>() => {\n const form = useContext<Form<TValues> | null>(FormContext);\n if (!form) throw new Error('Wrap your form in a FormProvider');\n return useFormResponse(form);\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IACVC,aAAa,EAGbC,WAAW,EACXC,UAAU,EACVC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,OAAOC,gBAAgB,MAAM,oBAAoB;AACjD,OAAOC,KAAK,MAAM,eAAe;AACjC,OAAOC,OAAO,MAAM,iBAAiB;AACrC,OAAOC,gBAAgB,MAAM,0BAA0B;AAEvD,cAAc,uBAAuB;;AAErC;;AAKA,OAAO,MAAMC,IAAI,CAGf;EAOOC,WAAW,CAACC,UAAmB,EAAE;IAAA,KANxBA,UAAU;IAAA,KAEVC,MAAM;IAAA,KAENC,MAAM;IAGpB,IAAI,CAACF,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,MAAM,GAAG,IAAIP,gBAAgB,CAACC,KAAK,CAACK,UAAU,CAAC,CAAC;IACrD,IAAI,CAACE,MAAM,GAAG,IAAIR,gBAAgB,CAAC,CAAC,CAAC,CAAY;EACnD;EAEOS,KAAK,GAAG;IACb;IACAC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACJ,MAAM,CAACK,MAAM,EAAE,CAAC,CAACC,OAAO,CAAEC,IAAI,IAAK;MAClD,IAAI,CAACP,MAAM,CAACQ,GAAG,CAACD,IAAI,EAAE,IAAI,CAACR,UAAU,CAACQ,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC;;IAEF;IACAJ,MAAM,CAACC,IAAI,CAAC,IAAI,CAACH,MAAM,CAACI,MAAM,EAAE,CAAC,CAACC,OAAO,CAAEC,IAAI,IAAK;MAClD,IAAI,CAACN,MAAM,CAACO,GAAG,CAACD,IAAI,EAAEE,SAAS,CAAQ;IACzC,CAAC,CAAC;EACJ;AACF;AAEA,MAAMC,WAAW,gBAAGxB,aAAa,CAAM,IAAI,CAAC;AAO5C;AACA,OAAO,SAASyB,YAAY,CAAyB;EACnDC,IAAI;EACJC;AAC0B,CAAC,EAAE;EAC7B,oBAAO,oBAAC,WAAW,CAAC,QAAQ;IAAC,KAAK,EAAED;EAAK,GAAEC,QAAQ,CAAwB;AAC7E;AAEA,MAAMC,kBAAkB,GACGF,IAAmB,IACdL,IAAW,IAAK;EAC5C,MAAM,CAACQ,KAAK,EAAEC,QAAQ,CAAC,GAAGxB,QAAQ,CAAiBoB,IAAI,CAACZ,MAAM,CAACiB,GAAG,CAACV,IAAI,CAAC,CAAC;EAEzElB,SAAS,CAAC,MAAM;IACd,MAAM6B,YAAY,GAAGN,IAAI,CAACZ,MAAM,CAACmB,gBAAgB,CAACZ,IAAI,EAAGa,CAAC,IAAK;MAC7DJ,QAAQ,CAACI,CAAC,CAAC;IACb,CAAC,CAAC;IACF,OAAO,MAAMF,YAAY,CAACG,WAAW,EAAE;EACzC,CAAC,EAAE,CAACd,IAAI,CAAC,CAAC;EAEV,OAAOQ,KAAK;AACd,CAAC;AAEH,OAAO,MAAMO,QAAQ,GAAG,CAItBf,IAAW,EACXK,IAAoB,KACjB;EACH,MAAMW,WAAW,GAAGnC,UAAU,CAACsB,WAAW,CAAC,IAAIE,IAAI;EACnD,IAAI,CAACW,WAAW,EAAE,MAAM,IAAIC,KAAK,CAAC,kBAAkB,CAAC;EACrD,MAAM,CAACT,KAAK,EAAEC,QAAQ,CAAC,GAAGxB,QAAQ,CAChC+B,WAAW,CAACtB,MAAM,CAACgB,GAAG,CAACV,IAAI,CAAC,CAC7B;EAEDlB,SAAS,CAAC,MAAM;IACd,MAAM6B,YAAY,GAAGK,WAAW,CAACtB,MAAM,CAACkB,gBAAgB,CAACZ,IAAI,EAAGa,CAAC,IAAK;MACpEJ,QAAQ,CAACI,CAAC,CAAC;IACb,CAAC,CAAC;IACF,OAAO,MAAMF,YAAY,CAACG,WAAW,EAAE;EACzC,CAAC,EAAE,CAACE,WAAW,CAACtB,MAAM,EAAEM,IAAI,CAAC,CAAC;EAE9B,OAAOQ,KAAK;AACd,CAAC;AAMD,MAAMU,wBAAwB,GAC5Bb,IAAmB,IAChB;EACH,MAAMc,QAAQ,GAAGZ,kBAAkB,CAACF,IAAI,CAAC;EACzC,OAAO,CACLL,IAAW,EACXoB,WAAwC,KACrC;IACH,MAAMZ,KAAK,GAAGW,QAAQ,CAACnB,IAAI,CAAC;IAE5B,MAAMqB,cAAc,GAAGrC,MAAM,CAACoC,WAAW,CAAC;IAC1CtC,SAAS,CAAC,MAAM;MACduC,cAAc,CAACC,OAAO,GAAGF,WAAW;IACtC,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;IAEjBtC,SAAS,CAAC,MAAM;MACd,MAAMyC,aAAa,GAAGF,cAAc,CAACC,OAAO,CAACd,KAAK,CAAC;MACnDZ,MAAM,CAAC4B,OAAO,CAACD,aAAa,CAAC,CAACxB,OAAO,CAAC,CAAC,CAAC0B,CAAC,EAAEZ,CAAC,CAAC,KAAK;QAChDR,IAAI,CAACZ,MAAM,CAACQ,GAAG,CAACwB,CAAC,EAAEZ,CAAC,CAAC;MACvB,CAAC,CAAC;IACJ,CAAC,EAAE,CAACL,KAAK,CAAC,CAAC;EACb,CAAC;AACH,CAAC;AAiCD,MAAMkB,oBAAoB,GAA4BrB,IAAmB,IAAK;EAC5E,MAAMc,QAAQ,GAAGZ,kBAAkB,CAACF,IAAI,CAAC;EACzC,OACEsB,KAA6C,IAC1C;IACH,MAAM;MAAE3B,IAAI;MAAE4B,OAAO;MAAEC,SAAS;MAAEC;IAAO,CAAC,GAAGH,KAAK;IAElD,MAAMnB,KAAK,GAAGW,QAAQ,CAACnB,IAAI,CAAC;IAC5B,MAAM+B,gBAAgB,GAAGhD,OAAO,CAC9B,MAAO6C,OAAO,GAAGA,OAAO,CAACpB,KAAK,CAAC,GAAGA,KAAM,EACxC,CAACoB,OAAO,EAAEpB,KAAK,CAAC,CACjB;IACD,MAAMwB,KAAK,GAAGjB,QAAQ,CAAUf,IAAI,EAAEK,IAAI,CAAC;IAE3C,MAAM4B,QAAQ,GAAGlD,OAAO,CACtB,MAAM,CAACK,OAAO,CAACoB,KAAK,EAAEH,IAAI,CAACb,UAAU,CAACQ,IAAI,CAAC,CAAC,EAC5C,CAACA,IAAI,EAAEQ,KAAK,CAAC,CACd;IACD,MAAMb,KAAK,GAAGf,WAAW,CACvB,MAAMyB,IAAI,CAACZ,MAAM,CAACQ,GAAG,CAACD,IAAI,EAAEK,IAAI,CAACb,UAAU,CAACQ,IAAI,CAAC,CAAC,EAClD,CAACA,IAAI,CAAC,CACP;IAED,MAAMkC,YAAY,GAAGlD,MAAM,CAAC6C,SAAS,CAAC;IACtC/C,SAAS,CAAC,MAAM;MACdoD,YAAY,CAACZ,OAAO,GAAGO,SAAS;IAClC,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;IAEf,MAAMM,QAAQ,GAAGvD,WAAW,CACzBiC,CAAM,IAAK;MACVR,IAAI,CAACZ,MAAM,CAACQ,GAAG,CACbD,IAAI,EACJkC,YAAY,CAACZ,OAAO,GAAGY,YAAY,CAACZ,OAAO,CAACT,CAAC,CAAC,GAAIA,CAAoB,CACvE;MACDR,IAAI,CAACX,MAAM,CAACO,GAAG,CAACD,IAAI,EAAEE,SAAS,CAAC;IAClC,CAAC,EACD,CAACF,IAAI,CAAC,CACP;IAED,MAAMoC,SAAS,GAAGpD,MAAM,CAAC8C,MAAM,CAAC;IAChChD,SAAS,CAAC,MAAM;MACdsD,SAAS,CAACd,OAAO,GAAGQ,MAAM;IAC5B,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;IAEZ,MAAMO,UAAU,GAAGtD,OAAO,CACxB,OAAO;MAAEyB,KAAK,EAAEuB,gBAAgB;MAAEI;IAAS,CAAC,CAAC,EAC7C,CAACA,QAAQ,EAAEJ,gBAAgB,CAAC,CAC7B;IACD,MAAMO,UAAU,GAAGvD,OAAO,CACxB,OAAO;MAAEiD,KAAK,EAAEA,KAAK,IAAI,IAAI;MAAEC,QAAQ;MAAEtC;IAAM,CAAC,CAAC,EACjD,CAACqC,KAAK,EAAEC,QAAQ,EAAEtC,KAAK,CAAC,CACzB;IAED,OAAOZ,OAAO,CACZ,MAAMqD,SAAS,CAACd,OAAO,CAACe,UAAU,EAAEC,UAAU,CAAC,EAC/C,CAACA,UAAU,EAAED,UAAU,CAAC,CACzB;EACH,CAAC;AACH,CAAC;AAED,MAAME,iBAAiB,GAA4BlC,IAAmB,IAAK;EACzE,MAAM,CAACmC,cAAc,EAAEC,iBAAiB,CAAC,GAAGxD,QAAQ,CAClD,EAAE,CACH;EAED,MAAMyD,iBAAiB,GAAG1D,MAAM,CAACwD,cAAc,CAAC;EAChD1D,SAAS,CAAC,MAAM;IACd4D,iBAAiB,CAACpB,OAAO,GAAGkB,cAAc;EAC5C,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpB,MAAMG,aAAa,GAAG3D,MAAM,CAACqB,IAAI,CAACb,UAAU,CAAC;EAC7CV,SAAS,CAAC,MAAM;IACd6D,aAAa,CAACrB,OAAO,GAAGjB,IAAI,CAACb,UAAU;EACzC,CAAC,EAAE,CAACa,IAAI,CAACb,UAAU,CAAC,CAAC;EAErBV,SAAS,CAAC,MAAM;IACd,MAAM6B,YAAY,GAAGN,IAAI,CAACZ,MAAM,CAACmD,oBAAoB,CAAC,CAAC5C,IAAI,EAAEQ,KAAK,KAAK;MACrE,MAAMqC,WAAW,GAAGzD,OAAO,CAACoB,KAAK,EAAEmC,aAAa,CAACrB,OAAO,CAACtB,IAAI,CAAC,CAAC;MAC/D,MAAM8C,MAAM,GAAGJ,iBAAiB,CAACpB,OAAO;MAExC,IAAIwB,MAAM,CAACC,QAAQ,CAAC/C,IAAI,CAAC,EAAE;QACzB,IAAI6C,WAAW,EAAE;UACfJ,iBAAiB,CAACK,MAAM,CAACE,MAAM,CAAEC,KAAK,IAAKA,KAAK,KAAKjD,IAAI,CAAC,CAAC;QAC7D;MACF,CAAC,MAAM,IAAI,CAAC6C,WAAW,EAAE;QACvBJ,iBAAiB,CAAC,CAAC,GAAGK,MAAM,EAAE9C,IAAI,CAAC,CAAC;MACtC;IACF,CAAC,CAAC;IACF,OAAO,MAAMW,YAAY,CAACG,WAAW,EAAE;EACzC,CAAC,EAAE,CAACT,IAAI,CAACZ,MAAM,CAAC,CAAC;EAEjB,OAAO+C,cAAc;AACvB,CAAC;AAED,MAAMU,eAAe,GAA4B7C,IAAmB,IAAK;EACvE,MAAMc,QAAQ,GAAGpC,OAAO,CAAC,MAAMwB,kBAAkB,CAACF,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAChE,MAAM8C,cAAc,GAAGpE,OAAO,CAAC,MAAMmC,wBAAwB,CAACb,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAC5E,MAAM+C,KAAK,GAAGrE,OAAO,CAAC,MAAM2C,oBAAoB,CAACrB,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAE/D,MAAMmC,cAAc,GAAGD,iBAAiB,CAAClC,IAAI,CAAC;EAC9C,MAAM4B,QAAQ,GAAGlD,OAAO,CACtB,MAAMyD,cAAc,CAACa,MAAM,GAAG,CAAC,EAC/B,CAACb,cAAc,CAACa,MAAM,CAAC,CACxB;EAED,OAAOtE,OAAO,CACZ,OAAO;IACLsB,IAAI;IACJ+C,KAAK;IACLjC,QAAQ;IACRgC,cAAc;IACdX,cAAc;IACdP;EACF,CAAC,CAAC,EACF,CAACmB,KAAK,EAAE/C,IAAI,EAAE4B,QAAQ,EAAEO,cAAc,EAAEW,cAAc,EAAEhC,QAAQ,CAAC,CAClE;AACH,CAAC;AAED,OAAO,MAAMmC,OAAO,GAClB9D,UAAmB,IAChB;EACH,MAAM+D,kBAAkB,GAAGlE,gBAAgB,CACzC,MAAMG,UAAU,EAChB,CAACA,UAAU,CAAC,CACb;EACD,MAAMa,IAAI,GAAGtB,OAAO,CAClB,MAAM,IAAIO,IAAI,CAAUiE,kBAAkB,CAAC,EAC3C,CAACA,kBAAkB,CAAC,CACrB;EACD,OAAOL,eAAe,CAAC7C,IAAI,CAAC;AAC9B,CAAC;AAED,OAAO,MAAMmD,eAAe,GAAG,MAAuC;EACpE,MAAMnD,IAAI,GAAGxB,UAAU,CAAuBsB,WAAW,CAAC;EAC1D,IAAI,CAACE,IAAI,EAAE,MAAM,IAAIY,KAAK,CAAC,kCAAkC,CAAC;EAC9D,OAAOiC,eAAe,CAAC7C,IAAI,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"index.js","names":["useCallback","useEffect","useMemo","useRef","useState","Form","useFormContext","isEqual","get","useDeepEqualMemo","default","createUseValueHook","form","name","value","setValue","values","subscription","subscribe","v","unsubscribe","createUseErrorHook","errors","createUseTransformerHook","useValue","transformer","transformerRef","current","partialValues","Object","entries","forEach","n","set","createFieldComponent","useError","props","render","error","initValue","initValues","modified","reset","onChange","undefined","renderRef","inputProps","fieldState","useModifiedFields","modifiedFields","setModifiedFields","modifiedFieldsRef","initValuesRef","subscribeToAll","isInitValue","fields","includes","filter","field","useFormResponse","Field","useTransformer","length","useForm","memoizedInitValues","formRef","useExistingForm","Error"],"sources":["../../src/index.tsx"],"sourcesContent":["import {\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Form from './Form';\nimport { PathReturn, Path, StringMap } from './types';\nimport useFormContext from './useFormContext';\nimport isEqual from './utils/isEqual';\nimport { get } from './utils/path';\nimport useDeepEqualMemo from './utils/useDeepEqualMemo';\n\nexport * from './BroadcastObserverManager';\nexport * from './ErrorObserverManager';\nexport { default as Form } from './Form';\nexport * from './types';\nexport * from './useFormContext';\n\nconst createUseValueHook =\n <TValues extends StringMap>(form: Form<TValues>) =>\n <TName extends Path<TValues>>(name: TName) => {\n const [value, setValue] = useState<PathReturn<TValues, TName>>(\n form.values.get(name)\n );\n\n useEffect(() => {\n const subscription = form.values.subscribe(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [name]);\n\n return value;\n };\n\nconst createUseErrorHook =\n <TValues extends StringMap>(form: Form<TValues>) =>\n <TName extends Path<TValues>>(name: TName) => {\n const [value, setValue] = useState<string | undefined>(\n form.errors.get(name)\n );\n\n useEffect(() => {\n const subscription = form.errors.subscribe(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [name]);\n\n return value;\n };\n\nexport type Transformer<\n TValues extends StringMap,\n TName extends Path<TValues>\n> = (value: PathReturn<TValues, TName>) => {\n [K in Path<TValues>]?: PathReturn<TValues, K>;\n};\n\nconst createUseTransformerHook = <TValues extends StringMap>(\n form: Form<TValues>\n) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const useValue = createUseValueHook(form);\n return <TName extends Path<TValues>>(\n name: TName,\n transformer: Transformer<TValues, TName>\n ) => {\n const value = useValue(name);\n\n const transformerRef = useRef(transformer);\n useEffect(() => {\n transformerRef.current = transformer;\n }, [transformer]);\n\n useEffect(() => {\n const partialValues = transformerRef.current(value);\n Object.entries(partialValues).forEach(([n, v]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n form.values.set(n as Path<TValues>, v as any);\n });\n }, [value]);\n };\n};\n\ninterface InputProps<TValue> {\n value: TValue;\n onChange: (value: TValue) => void;\n}\ninterface FieldState {\n error?: string;\n modified: boolean;\n reset: () => void;\n}\ninterface FieldProps<TName, TValue> {\n name: TName;\n transformer?: (value: TValue) => TValue;\n render: (\n inputProps: InputProps<TValue>,\n fieldState: FieldState\n ) => ReactElement | null;\n}\n\nconst createFieldComponent = <TValues extends StringMap>(\n form: Form<TValues>\n) => {\n const useValue = createUseValueHook(form);\n const useError = createUseErrorHook(form);\n return <TName extends Path<TValues>>(\n props: FieldProps<TName, PathReturn<TValues, TName>>\n ) => {\n const { name, transformer = (v) => v, render } = props;\n\n const value = useValue(name);\n const error = useError(name);\n\n const initValue = useMemo(() => get(form.initValues, name), [name]);\n const modified = useMemo(\n () => !isEqual(value, initValue),\n [initValue, value]\n );\n const reset = useCallback(\n () => form.values.set(name, initValue),\n [initValue, name]\n );\n\n const transformerRef = useRef(transformer);\n useEffect(() => {\n transformerRef.current = transformer;\n }, [transformer]);\n\n const onChange = useCallback(\n (v: PathReturn<TValues, TName>) => {\n form.values.set(name, transformerRef.current(v));\n form.errors.set(name, undefined); // Reset the error when the value is changed\n },\n [name]\n );\n\n const renderRef = useRef(render);\n useEffect(() => {\n renderRef.current = render;\n }, [render]);\n\n const inputProps = useMemo(() => ({ value, onChange }), [onChange, value]);\n const fieldState = useMemo(\n () => ({ error, modified, reset }),\n [error, modified, reset]\n );\n\n return useMemo(\n () => renderRef.current(inputProps, fieldState),\n [fieldState, inputProps]\n );\n };\n};\n\nconst useModifiedFields = <TValues extends StringMap>(form: Form<TValues>) => {\n const [modifiedFields, setModifiedFields] = useState<Array<Path<TValues>>>(\n []\n );\n\n const modifiedFieldsRef = useRef(modifiedFields);\n useEffect(() => {\n modifiedFieldsRef.current = modifiedFields;\n }, [modifiedFields]);\n\n const initValuesRef = useRef(form.initValues);\n useEffect(() => {\n initValuesRef.current = form.initValues;\n }, [form.initValues]);\n\n useEffect(() => {\n const subscription = form.values.subscribeToAll((name, value) => {\n const isInitValue = isEqual(value, get(initValuesRef.current, name));\n const fields = modifiedFieldsRef.current;\n\n if (fields.includes(name)) {\n if (isInitValue) {\n setModifiedFields(fields.filter((field) => field !== name));\n }\n } else if (!isInitValue) {\n setModifiedFields([...fields, name]);\n }\n });\n return () => subscription.unsubscribe();\n }, [form.values]);\n\n return modifiedFields;\n};\n\nconst useFormResponse = <TValues extends StringMap>(form: Form<TValues>) => {\n const Field = useMemo(() => createFieldComponent(form), [form]);\n const useValue = useMemo(() => createUseValueHook(form), [form]);\n const useError = useMemo(() => createUseErrorHook(form), [form]);\n const useTransformer = useMemo(() => createUseTransformerHook(form), [form]);\n\n const modifiedFields = useModifiedFields(form);\n const modified = useMemo(\n () => modifiedFields.length > 0,\n [modifiedFields.length]\n );\n\n return useMemo(\n () => ({\n form,\n Field,\n useValue,\n useError,\n useTransformer,\n modifiedFields,\n modified,\n }),\n [Field, form, modified, modifiedFields, useError, useTransformer, useValue]\n );\n};\n\nexport const useForm = <TValues extends StringMap = StringMap>(\n initValues: TValues\n) => {\n const memoizedInitValues = useDeepEqualMemo<TValues>(\n () => initValues,\n [initValues]\n );\n\n const formRef = useRef(new Form<TValues>(memoizedInitValues));\n useEffect(() => {\n formRef.current.initValues = memoizedInitValues;\n formRef.current.reset();\n }, [memoizedInitValues]);\n\n return useFormResponse(formRef.current);\n};\n\nexport const useExistingForm = <TValues extends StringMap = StringMap>() => {\n const form = useFormContext<Form<TValues> | null>();\n if (!form) throw new Error('Wrap your form in a FormProvider');\n return useFormResponse(form);\n};\n"],"mappings":"AAAA,SAEEA,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,OAAOC,IAAI,MAAM,QAAQ;AAEzB,OAAOC,cAAc,MAAM,kBAAkB;AAC7C,OAAOC,OAAO,MAAM,iBAAiB;AACrC,SAASC,GAAG,QAAQ,cAAc;AAClC,OAAOC,gBAAgB,MAAM,0BAA0B;AAEvD,cAAc,4BAA4B;AAC1C,cAAc,wBAAwB;AACtC,SAASC,OAAO,IAAIL,IAAI,QAAQ,QAAQ;AACxC,cAAc,SAAS;AACvB,cAAc,kBAAkB;AAEhC,MAAMM,kBAAkB,GACMC,IAAmB,IACjBC,IAAW,IAAK;EAC5C,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGX,QAAQ,CAChCQ,IAAI,CAACI,MAAM,CAACR,GAAG,CAACK,IAAI,CAAC,CACtB;EAEDZ,SAAS,CAAC,MAAM;IACd,MAAMgB,YAAY,GAAGL,IAAI,CAACI,MAAM,CAACE,SAAS,CAACL,IAAI,EAAGM,CAAC,IAAK;MACtDJ,QAAQ,CAACI,CAAC,CAAC;IACb,CAAC,CAAC;IACF,OAAO,MAAMF,YAAY,CAACG,WAAW,EAAE;EACzC,CAAC,EAAE,CAACP,IAAI,CAAC,CAAC;EAEV,OAAOC,KAAK;AACd,CAAC;AAEH,MAAMO,kBAAkB,GACMT,IAAmB,IACjBC,IAAW,IAAK;EAC5C,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGX,QAAQ,CAChCQ,IAAI,CAACU,MAAM,CAACd,GAAG,CAACK,IAAI,CAAC,CACtB;EAEDZ,SAAS,CAAC,MAAM;IACd,MAAMgB,YAAY,GAAGL,IAAI,CAACU,MAAM,CAACJ,SAAS,CAACL,IAAI,EAAGM,CAAC,IAAK;MACtDJ,QAAQ,CAACI,CAAC,CAAC;IACb,CAAC,CAAC;IACF,OAAO,MAAMF,YAAY,CAACG,WAAW,EAAE;EACzC,CAAC,EAAE,CAACP,IAAI,CAAC,CAAC;EAEV,OAAOC,KAAK;AACd,CAAC;AASH,MAAMS,wBAAwB,GAC5BX,IAAmB,IAChB;EACH;EACA;EACA,MAAMY,QAAQ,GAAGb,kBAAkB,CAACC,IAAI,CAAC;EACzC,OAAO,CACLC,IAAW,EACXY,WAAwC,KACrC;IACH,MAAMX,KAAK,GAAGU,QAAQ,CAACX,IAAI,CAAC;IAE5B,MAAMa,cAAc,GAAGvB,MAAM,CAACsB,WAAW,CAAC;IAC1CxB,SAAS,CAAC,MAAM;MACdyB,cAAc,CAACC,OAAO,GAAGF,WAAW;IACtC,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;IAEjBxB,SAAS,CAAC,MAAM;MACd,MAAM2B,aAAa,GAAGF,cAAc,CAACC,OAAO,CAACb,KAAK,CAAC;MACnDe,MAAM,CAACC,OAAO,CAACF,aAAa,CAAC,CAACG,OAAO,CAAC,CAAC,CAACC,CAAC,EAAEb,CAAC,CAAC,KAAK;QAChD;QACAP,IAAI,CAACI,MAAM,CAACiB,GAAG,CAACD,CAAC,EAAmBb,CAAC,CAAQ;MAC/C,CAAC,CAAC;IACJ,CAAC,EAAE,CAACL,KAAK,CAAC,CAAC;EACb,CAAC;AACH,CAAC;AAoBD,MAAMoB,oBAAoB,GACxBtB,IAAmB,IAChB;EACH,MAAMY,QAAQ,GAAGb,kBAAkB,CAACC,IAAI,CAAC;EACzC,MAAMuB,QAAQ,GAAGd,kBAAkB,CAACT,IAAI,CAAC;EACzC,OACEwB,KAAoD,IACjD;IACH,MAAM;MAAEvB,IAAI;MAAEY,WAAW,GAAIN,CAAC,IAAKA,CAAC;MAAEkB;IAAO,CAAC,GAAGD,KAAK;IAEtD,MAAMtB,KAAK,GAAGU,QAAQ,CAACX,IAAI,CAAC;IAC5B,MAAMyB,KAAK,GAAGH,QAAQ,CAACtB,IAAI,CAAC;IAE5B,MAAM0B,SAAS,GAAGrC,OAAO,CAAC,MAAMM,GAAG,CAACI,IAAI,CAAC4B,UAAU,EAAE3B,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;IACnE,MAAM4B,QAAQ,GAAGvC,OAAO,CACtB,MAAM,CAACK,OAAO,CAACO,KAAK,EAAEyB,SAAS,CAAC,EAChC,CAACA,SAAS,EAAEzB,KAAK,CAAC,CACnB;IACD,MAAM4B,KAAK,GAAG1C,WAAW,CACvB,MAAMY,IAAI,CAACI,MAAM,CAACiB,GAAG,CAACpB,IAAI,EAAE0B,SAAS,CAAC,EACtC,CAACA,SAAS,EAAE1B,IAAI,CAAC,CAClB;IAED,MAAMa,cAAc,GAAGvB,MAAM,CAACsB,WAAW,CAAC;IAC1CxB,SAAS,CAAC,MAAM;MACdyB,cAAc,CAACC,OAAO,GAAGF,WAAW;IACtC,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;IAEjB,MAAMkB,QAAQ,GAAG3C,WAAW,CACzBmB,CAA6B,IAAK;MACjCP,IAAI,CAACI,MAAM,CAACiB,GAAG,CAACpB,IAAI,EAAEa,cAAc,CAACC,OAAO,CAACR,CAAC,CAAC,CAAC;MAChDP,IAAI,CAACU,MAAM,CAACW,GAAG,CAACpB,IAAI,EAAE+B,SAAS,CAAC,CAAC,CAAC;IACpC,CAAC,EACD,CAAC/B,IAAI,CAAC,CACP;IAED,MAAMgC,SAAS,GAAG1C,MAAM,CAACkC,MAAM,CAAC;IAChCpC,SAAS,CAAC,MAAM;MACd4C,SAAS,CAAClB,OAAO,GAAGU,MAAM;IAC5B,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;IAEZ,MAAMS,UAAU,GAAG5C,OAAO,CAAC,OAAO;MAAEY,KAAK;MAAE6B;IAAS,CAAC,CAAC,EAAE,CAACA,QAAQ,EAAE7B,KAAK,CAAC,CAAC;IAC1E,MAAMiC,UAAU,GAAG7C,OAAO,CACxB,OAAO;MAAEoC,KAAK;MAAEG,QAAQ;MAAEC;IAAM,CAAC,CAAC,EAClC,CAACJ,KAAK,EAAEG,QAAQ,EAAEC,KAAK,CAAC,CACzB;IAED,OAAOxC,OAAO,CACZ,MAAM2C,SAAS,CAAClB,OAAO,CAACmB,UAAU,EAAEC,UAAU,CAAC,EAC/C,CAACA,UAAU,EAAED,UAAU,CAAC,CACzB;EACH,CAAC;AACH,CAAC;AAED,MAAME,iBAAiB,GAA+BpC,IAAmB,IAAK;EAC5E,MAAM,CAACqC,cAAc,EAAEC,iBAAiB,CAAC,GAAG9C,QAAQ,CAClD,EAAE,CACH;EAED,MAAM+C,iBAAiB,GAAGhD,MAAM,CAAC8C,cAAc,CAAC;EAChDhD,SAAS,CAAC,MAAM;IACdkD,iBAAiB,CAACxB,OAAO,GAAGsB,cAAc;EAC5C,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpB,MAAMG,aAAa,GAAGjD,MAAM,CAACS,IAAI,CAAC4B,UAAU,CAAC;EAC7CvC,SAAS,CAAC,MAAM;IACdmD,aAAa,CAACzB,OAAO,GAAGf,IAAI,CAAC4B,UAAU;EACzC,CAAC,EAAE,CAAC5B,IAAI,CAAC4B,UAAU,CAAC,CAAC;EAErBvC,SAAS,CAAC,MAAM;IACd,MAAMgB,YAAY,GAAGL,IAAI,CAACI,MAAM,CAACqC,cAAc,CAAC,CAACxC,IAAI,EAAEC,KAAK,KAAK;MAC/D,MAAMwC,WAAW,GAAG/C,OAAO,CAACO,KAAK,EAAEN,GAAG,CAAC4C,aAAa,CAACzB,OAAO,EAAEd,IAAI,CAAC,CAAC;MACpE,MAAM0C,MAAM,GAAGJ,iBAAiB,CAACxB,OAAO;MAExC,IAAI4B,MAAM,CAACC,QAAQ,CAAC3C,IAAI,CAAC,EAAE;QACzB,IAAIyC,WAAW,EAAE;UACfJ,iBAAiB,CAACK,MAAM,CAACE,MAAM,CAAEC,KAAK,IAAKA,KAAK,KAAK7C,IAAI,CAAC,CAAC;QAC7D;MACF,CAAC,MAAM,IAAI,CAACyC,WAAW,EAAE;QACvBJ,iBAAiB,CAAC,CAAC,GAAGK,MAAM,EAAE1C,IAAI,CAAC,CAAC;MACtC;IACF,CAAC,CAAC;IACF,OAAO,MAAMI,YAAY,CAACG,WAAW,EAAE;EACzC,CAAC,EAAE,CAACR,IAAI,CAACI,MAAM,CAAC,CAAC;EAEjB,OAAOiC,cAAc;AACvB,CAAC;AAED,MAAMU,eAAe,GAA+B/C,IAAmB,IAAK;EAC1E,MAAMgD,KAAK,GAAG1D,OAAO,CAAC,MAAMgC,oBAAoB,CAACtB,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAC/D,MAAMY,QAAQ,GAAGtB,OAAO,CAAC,MAAMS,kBAAkB,CAACC,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAChE,MAAMuB,QAAQ,GAAGjC,OAAO,CAAC,MAAMmB,kBAAkB,CAACT,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAChE,MAAMiD,cAAc,GAAG3D,OAAO,CAAC,MAAMqB,wBAAwB,CAACX,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAE5E,MAAMqC,cAAc,GAAGD,iBAAiB,CAACpC,IAAI,CAAC;EAC9C,MAAM6B,QAAQ,GAAGvC,OAAO,CACtB,MAAM+C,cAAc,CAACa,MAAM,GAAG,CAAC,EAC/B,CAACb,cAAc,CAACa,MAAM,CAAC,CACxB;EAED,OAAO5D,OAAO,CACZ,OAAO;IACLU,IAAI;IACJgD,KAAK;IACLpC,QAAQ;IACRW,QAAQ;IACR0B,cAAc;IACdZ,cAAc;IACdR;EACF,CAAC,CAAC,EACF,CAACmB,KAAK,EAAEhD,IAAI,EAAE6B,QAAQ,EAAEQ,cAAc,EAAEd,QAAQ,EAAE0B,cAAc,EAAErC,QAAQ,CAAC,CAC5E;AACH,CAAC;AAED,OAAO,MAAMuC,OAAO,GAClBvB,UAAmB,IAChB;EACH,MAAMwB,kBAAkB,GAAGvD,gBAAgB,CACzC,MAAM+B,UAAU,EAChB,CAACA,UAAU,CAAC,CACb;EAED,MAAMyB,OAAO,GAAG9D,MAAM,CAAC,IAAIE,IAAI,CAAU2D,kBAAkB,CAAC,CAAC;EAC7D/D,SAAS,CAAC,MAAM;IACdgE,OAAO,CAACtC,OAAO,CAACa,UAAU,GAAGwB,kBAAkB;IAC/CC,OAAO,CAACtC,OAAO,CAACe,KAAK,EAAE;EACzB,CAAC,EAAE,CAACsB,kBAAkB,CAAC,CAAC;EAExB,OAAOL,eAAe,CAACM,OAAO,CAACtC,OAAO,CAAC;AACzC,CAAC;AAED,OAAO,MAAMuC,eAAe,GAAG,MAA6C;EAC1E,MAAMtD,IAAI,GAAGN,cAAc,EAAwB;EACnD,IAAI,CAACM,IAAI,EAAE,MAAM,IAAIuD,KAAK,CAAC,kCAAkC,CAAC;EAC9D,OAAOR,eAAe,CAAC/C,IAAI,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type StringMap<T = any> = Record<string, T>;\n\ntype Separator = '.';\ntype KeysWithSeparator<K1, K2> = `${K1 & string}${Separator}${K2 & string}`;\ntype KeyOf<T> = Exclude<keyof T, symbol | keyof any[]>;\ntype Depth = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\ntype MaxDepth = 9; // To avoid \"Type instantiation is excessively deep and possibly infinite\"\n\nexport type Path<\n T,\n N extends Depth[number] = MaxDepth,\n K = KeyOf<T>\n> = N extends never\n ? never\n : T extends StringMap\n ?\n | K\n | (K extends keyof T\n ? T[K] extends StringMap\n ? KeysWithSeparator<K, Path<T[K], Depth[N]>>\n : never\n : never)\n : never;\n\nexport type PathReturn<T, K> = K extends keyof T\n ? T[K]\n : K extends `${infer U}${Separator}${infer R}`\n ? U extends keyof T\n ? PathReturn<T[U], R>\n : never\n : never;\n\nexport type Errors<T> = Record<Path<T>, string | undefined>;\n\nexport type Observer<V = any> = (value: V) => void;\nexport interface Subscription {\n unsubscribe: () => void;\n}\n"],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import React, { createContext, useContext } from 'react';
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const FormContext = /*#__PURE__*/createContext(null);
4
+ // eslint-disable-next-line react/function-component-definition
5
+ export function FormProvider({
6
+ form,
7
+ children
8
+ }) {
9
+ return /*#__PURE__*/React.createElement(FormContext.Provider, {
10
+ value: form
11
+ }, children);
12
+ }
13
+ function useFormContext() {
14
+ return useContext(FormContext);
15
+ }
16
+ export default useFormContext;
17
+ //# sourceMappingURL=useFormContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormContext.js","names":["React","createContext","useContext","FormContext","FormProvider","form","children","useFormContext"],"sources":["../../src/useFormContext.tsx"],"sourcesContent":["import React, { createContext, ReactNode, useContext } from 'react';\nimport Form from './Form';\nimport { StringMap } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FormContext = createContext<any>(null);\n\nexport interface FormProviderProps<TValues extends StringMap> {\n form: Form<TValues>;\n children?: ReactNode;\n}\n\n// eslint-disable-next-line react/function-component-definition\nexport function FormProvider<TValues extends StringMap>({\n form,\n children,\n}: FormProviderProps<TValues>) {\n return <FormContext.Provider value={form}>{children}</FormContext.Provider>;\n}\n\nfunction useFormContext<T>() {\n return useContext<T>(FormContext);\n}\n\nexport default useFormContext;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,aAAa,EAAaC,UAAU,QAAQ,OAAO;AAInE;AACA,MAAMC,WAAW,gBAAGF,aAAa,CAAM,IAAI,CAAC;AAO5C;AACA,OAAO,SAASG,YAAY,CAA4B;EACtDC,IAAI;EACJC;AAC0B,CAAC,EAAE;EAC7B,oBAAO,oBAAC,WAAW,CAAC,QAAQ;IAAC,KAAK,EAAED;EAAK,GAAEC,QAAQ,CAAwB;AAC7E;AAEA,SAASC,cAAc,GAAM;EAC3B,OAAOL,UAAU,CAAIC,WAAW,CAAC;AACnC;AAEA,eAAeI,cAAc"}
@@ -0,0 +1,8 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ const deleteFromArray = (arr, item) => {
3
+ const index = arr.findIndex(i => i === item);
4
+ if (index === -1) return;
5
+ arr.splice(index, 1);
6
+ };
7
+ export default deleteFromArray;
8
+ //# sourceMappingURL=deleteFromArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteFromArray.js","names":["deleteFromArray","arr","item","index","findIndex","i","splice"],"sources":["../../../src/utils/deleteFromArray.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst deleteFromArray = (arr: any[], item: any) => {\n const index = arr.findIndex((i) => i === item);\n if (index === -1) return;\n arr.splice(index, 1);\n};\n\nexport default deleteFromArray;\n"],"mappings":"AAAA;AACA,MAAMA,eAAe,GAAG,CAACC,GAAU,EAAEC,IAAS,KAAK;EACjD,MAAMC,KAAK,GAAGF,GAAG,CAACG,SAAS,CAAEC,CAAC,IAAKA,CAAC,KAAKH,IAAI,CAAC;EAC9C,IAAIC,KAAK,KAAK,CAAC,CAAC,EAAE;EAClBF,GAAG,CAACK,MAAM,CAACH,KAAK,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,eAAeH,eAAe"}
@@ -0,0 +1,31 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any,no-param-reassign */
2
+
3
+ export const isObjectOrArray = value => typeof value === 'object' && value !== null;
4
+ const split = path => {
5
+ const groups = path.match(/^([^.]*)\.(.*)$/);
6
+ return groups ? [groups[1], groups[2]] : null;
7
+ };
8
+ export const get = (data, path) => {
9
+ if (Object.hasOwn(data, path)) {
10
+ return data[path];
11
+ }
12
+ const groups = split(path);
13
+ if (!groups) return undefined;
14
+ const [key, nextPath] = groups;
15
+ if (!Object.hasOwn(data, key)) return undefined;
16
+ if (!isObjectOrArray(data[key])) return undefined;
17
+ return get(data[key], nextPath);
18
+ };
19
+ export const set = (data, path, value) => {
20
+ if (Object.hasOwn(data, path)) {
21
+ data[path] = value;
22
+ return true;
23
+ }
24
+ const groups = split(path);
25
+ if (!groups) return false;
26
+ const [key, nextPath] = groups;
27
+ if (!Object.hasOwn(data, key)) return false;
28
+ if (!isObjectOrArray(data[key])) return false;
29
+ return set(data[key], nextPath, value);
30
+ };
31
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","names":["isObjectOrArray","value","split","path","groups","match","get","data","Object","hasOwn","undefined","key","nextPath","set"],"sources":["../../../src/utils/path.ts"],"sourcesContent":["import { StringMap } from '../types';\n\n/* eslint-disable @typescript-eslint/no-explicit-any,no-param-reassign */\n\nexport const isObjectOrArray = (value: any): value is object =>\n typeof value === 'object' && value !== null;\n\nconst split = (path: string) => {\n const groups = path.match(/^([^.]*)\\.(.*)$/);\n return groups ? [groups[1], groups[2]] : null;\n};\n\nexport const get = (data: StringMap, path: string): any => {\n if (Object.hasOwn(data, path)) {\n return data[path];\n }\n\n const groups = split(path);\n if (!groups) return undefined;\n\n const [key, nextPath] = groups;\n if (!Object.hasOwn(data, key)) return undefined;\n if (!isObjectOrArray(data[key])) return undefined;\n\n return get(data[key], nextPath);\n};\n\nexport const set = (data: StringMap, path: string, value: any): boolean => {\n if (Object.hasOwn(data, path)) {\n data[path] = value;\n return true;\n }\n\n const groups = split(path);\n if (!groups) return false;\n\n const [key, nextPath] = groups;\n if (!Object.hasOwn(data, key)) return false;\n if (!isObjectOrArray(data[key])) return false;\n\n return set(data[key], nextPath, value);\n};\n"],"mappings":"AAEA;;AAEA,OAAO,MAAMA,eAAe,GAAIC,KAAU,IACxC,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI;AAE7C,MAAMC,KAAK,GAAIC,IAAY,IAAK;EAC9B,MAAMC,MAAM,GAAGD,IAAI,CAACE,KAAK,CAAC,iBAAiB,CAAC;EAC5C,OAAOD,MAAM,GAAG,CAACA,MAAM,CAAC,CAAC,CAAC,EAAEA,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AAC/C,CAAC;AAED,OAAO,MAAME,GAAG,GAAG,CAACC,IAAe,EAAEJ,IAAY,KAAU;EACzD,IAAIK,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEJ,IAAI,CAAC,EAAE;IAC7B,OAAOI,IAAI,CAACJ,IAAI,CAAC;EACnB;EAEA,MAAMC,MAAM,GAAGF,KAAK,CAACC,IAAI,CAAC;EAC1B,IAAI,CAACC,MAAM,EAAE,OAAOM,SAAS;EAE7B,MAAM,CAACC,GAAG,EAAEC,QAAQ,CAAC,GAAGR,MAAM;EAC9B,IAAI,CAACI,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEI,GAAG,CAAC,EAAE,OAAOD,SAAS;EAC/C,IAAI,CAACV,eAAe,CAACO,IAAI,CAACI,GAAG,CAAC,CAAC,EAAE,OAAOD,SAAS;EAEjD,OAAOJ,GAAG,CAACC,IAAI,CAACI,GAAG,CAAC,EAAEC,QAAQ,CAAC;AACjC,CAAC;AAED,OAAO,MAAMC,GAAG,GAAG,CAACN,IAAe,EAAEJ,IAAY,EAAEF,KAAU,KAAc;EACzE,IAAIO,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEJ,IAAI,CAAC,EAAE;IAC7BI,IAAI,CAACJ,IAAI,CAAC,GAAGF,KAAK;IAClB,OAAO,IAAI;EACb;EAEA,MAAMG,MAAM,GAAGF,KAAK,CAACC,IAAI,CAAC;EAC1B,IAAI,CAACC,MAAM,EAAE,OAAO,KAAK;EAEzB,MAAM,CAACO,GAAG,EAAEC,QAAQ,CAAC,GAAGR,MAAM;EAC9B,IAAI,CAACI,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEI,GAAG,CAAC,EAAE,OAAO,KAAK;EAC3C,IAAI,CAACX,eAAe,CAACO,IAAI,CAACI,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK;EAE7C,OAAOE,GAAG,CAACN,IAAI,CAACI,GAAG,CAAC,EAAEC,QAAQ,EAAEX,KAAK,CAAC;AACxC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Subscription } from './types';
2
+ export type BroadcastObserver<TName, TValue> = (name: TName, value: TValue) => void;
3
+ declare class BroadcastObserverManager<TName, TValue> {
4
+ private readonly broadcastObservers;
5
+ constructor();
6
+ subscribeToAll(observer: BroadcastObserver<TName, TValue>): Subscription;
7
+ protected callBroadcastObservers<N extends TName, V extends TValue>(name: N, value: V): void;
8
+ }
9
+ export default BroadcastObserverManager;
10
+ //# sourceMappingURL=BroadcastObserverManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BroadcastObserverManager.d.ts","sourceRoot":"","sources":["../../src/BroadcastObserverManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAI,CAC7C,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,MAAM,KACV,IAAI,CAAC;AAEV,cAAM,wBAAwB,CAAC,KAAK,EAAE,MAAM;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0C;;IAMtE,cAAc,CACnB,QAAQ,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GACzC,YAAY;IAOf,SAAS,CAAC,sBAAsB,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,SAAS,MAAM,EAChE,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,GACP,IAAI;CAGR;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import ErrorObserverManager from './ErrorObserverManager';
2
+ import { StringMap } from './types';
3
+ declare class ErrorData<TErrors extends StringMap<string | undefined>, TName extends keyof TErrors = keyof TErrors> extends ErrorObserverManager<TErrors> {
4
+ private readonly errors;
5
+ constructor(errors: TErrors);
6
+ get<T extends TName>(name: T): TErrors[T];
7
+ getAll(): TErrors;
8
+ set<T extends TName>(name: T, value: TErrors[T]): void;
9
+ }
10
+ export default ErrorData;
11
+ //# sourceMappingURL=ErrorData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorData.d.ts","sourceRoot":"","sources":["../../src/ErrorData.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,cAAM,SAAS,CACb,OAAO,SAAS,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAC7C,KAAK,SAAS,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3C,SAAQ,oBAAoB,CAAC,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAEd,MAAM,EAAE,OAAO;IAK3B,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzC,MAAM,IAAI,OAAO;IAIjB,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;CAI9D;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,12 @@
1
+ import BroadcastObserverManager from './BroadcastObserverManager';
2
+ import { Observer, StringMap, Subscription } from './types';
3
+ export type ErrorObserver = Observer<string | undefined>;
4
+ declare class ErrorObserverManager<TErrors extends StringMap<string | undefined>, TName extends keyof TErrors = keyof TErrors> extends BroadcastObserverManager<TName, string | undefined> {
5
+ private readonly observers;
6
+ constructor();
7
+ private getObservers;
8
+ subscribe<T extends TName>(name: T, observer: ErrorObserver): Subscription;
9
+ protected callObservers<T extends TName>(name: T, value: string | undefined): void;
10
+ }
11
+ export default ErrorObserverManager;
12
+ //# sourceMappingURL=ErrorObserverManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorObserverManager.d.ts","sourceRoot":"","sources":["../../src/ErrorObserverManager.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5D,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEzD,cAAM,oBAAoB,CACxB,OAAO,SAAS,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAC7C,KAAK,SAAS,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3C,SAAQ,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;;IAOF,OAAO,CAAC,YAAY;IAKb,SAAS,CAAC,CAAC,SAAS,KAAK,EAC9B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,aAAa,GACtB,YAAY;IAMf,SAAS,CAAC,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;CAI5E;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import ErrorData from './ErrorData';
2
+ import { Errors, StringMap } from './types';
3
+ import ValueData from './ValueData';
4
+ declare class Form<TValues extends StringMap = StringMap, TErrors extends Errors<TValues> = Errors<TValues>> {
5
+ initValues: TValues;
6
+ readonly values: ValueData<TValues>;
7
+ readonly errors: ErrorData<TErrors>;
8
+ constructor(initValues: TValues);
9
+ reset(): void;
10
+ }
11
+ export default Form;
12
+ //# sourceMappingURL=Form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../src/Form.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAQ,SAAS,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,cAAM,IAAI,CACR,OAAO,SAAS,SAAS,GAAG,SAAS,EACrC,OAAO,SAAS,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IAE1C,UAAU,EAAE,OAAO,CAAC;IAE3B,SAAgB,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAE3C,SAAgB,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAExB,UAAU,EAAE,OAAO;IAM/B,KAAK;CAcb;AAED,eAAe,IAAI,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Observer } from './types';
2
+ declare class Node {
3
+ readonly name: string;
4
+ readonly parent: Node | null;
5
+ readonly nodes: Record<string, Node>;
6
+ readonly observers: Observer[];
7
+ constructor(parent?: Node | null, name?: string);
8
+ getNode(name: string): Node | undefined;
9
+ createNode(name: string): Node;
10
+ deleteNode(name: string): void;
11
+ addObserver(observer: Observer): void;
12
+ deleteObserver(observer: Observer): void;
13
+ }
14
+ export default Node;
15
+ //# sourceMappingURL=Node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../src/Node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,cAAM,IAAI;IACR,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,SAAgB,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IAEpC,SAAgB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE5C,SAAgB,SAAS,EAAE,QAAQ,EAAE,CAAC;gBAEnB,MAAM,GAAE,IAAI,GAAG,IAAW,EAAE,IAAI,SAAK;IAOjD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIvC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAGhD;AAED,eAAe,IAAI,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { PathReturn, Path, StringMap } from './types';
2
+ import ValueObserverManager from './ValueObserverManager';
3
+ declare class ValueData<TValues extends StringMap, TName extends Path<TValues> = Path<TValues>> extends ValueObserverManager<TValues> {
4
+ private readonly values;
5
+ constructor(values: TValues);
6
+ get<T extends TName>(name: T): PathReturn<TValues, T>;
7
+ getAll(): TValues;
8
+ set<T extends TName>(name: T, value: PathReturn<TValues, T>): void;
9
+ }
10
+ export default ValueData;
11
+ //# sourceMappingURL=ValueData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueData.d.ts","sourceRoot":"","sources":["../../src/ValueData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAE1D,cAAM,SAAS,CACb,OAAO,SAAS,SAAS,EACzB,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAC3C,SAAQ,oBAAoB,CAAC,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAEd,MAAM,EAAE,OAAO;IAK3B,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAIrD,MAAM,IAAI,OAAO;IAIjB,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI;CAI1E;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,13 @@
1
+ import BroadcastObserverManager from './BroadcastObserverManager';
2
+ import { Observer, PathReturn, Path, StringMap, Subscription } from './types';
3
+ declare class ValueObserverManager<TValues extends StringMap, TName extends Path<TValues> = Path<TValues>> extends BroadcastObserverManager<TName, TValues[TName]> {
4
+ private readonly root;
5
+ constructor();
6
+ private findNode;
7
+ subscribe<T extends TName>(name: T, observer: Observer<PathReturn<TValues, T>>): Subscription;
8
+ protected callObservers<T extends TName>(name: T, data: TValues): void;
9
+ private callNodeObservers;
10
+ private callChildObservers;
11
+ }
12
+ export default ValueObserverManager;
13
+ //# sourceMappingURL=ValueObserverManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueObserverManager.d.ts","sourceRoot":"","sources":["../../src/ValueObserverManager.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK9E,cAAM,oBAAoB,CACxB,OAAO,SAAS,SAAS,EACzB,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAC3C,SAAQ,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;;IAO5B,OAAO,CAAC,QAAQ;IAST,SAAS,CAAC,CAAC,SAAS,KAAK,EAC9B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GACzC,YAAY;IAcf,SAAS,CAAC,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAKtE,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,kBAAkB;CAQ3B;AAED,eAAe,oBAAoB,CAAC"}