remix-validated-form 5.1.2 → 5.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../../node_modules/use-sync-external-store/shim/index.js","../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../../../node_modules/use-sync-external-store/shim/with-selector.js","../src/hooks.ts","../src/internal/getInputProps.ts","../src/internal/logic/getCheckboxChecked.ts","../src/internal/logic/getRadioChecked.ts","../src/internal/hooks.ts","../../set-get/src/stringToPathArray.ts","../../set-get/src/setPath.ts","../../set-get/src/getPath.ts","../src/internal/constants.ts","../src/internal/formContext.ts","../src/internal/hydratable.ts","../src/internal/state/createFormStore.ts","../../../node_modules/zustand/esm/vanilla.mjs","../../../node_modules/zustand/esm/index.mjs","../../../node_modules/immer/src/utils/errors.ts","../../../node_modules/immer/src/utils/common.ts","../../../node_modules/immer/src/utils/plugins.ts","../../../node_modules/immer/src/core/scope.ts","../../../node_modules/immer/src/core/finalize.ts","../../../node_modules/immer/src/core/proxy.ts","../../../node_modules/immer/src/core/immerClass.ts","../../../node_modules/immer/src/core/current.ts","../../../node_modules/immer/src/plugins/es5.ts","../../../node_modules/immer/src/plugins/patches.ts","../../../node_modules/immer/src/plugins/mapset.ts","../../../node_modules/immer/src/plugins/all.ts","../../../node_modules/immer/src/immer.ts","../../../node_modules/immer/src/utils/env.ts","../../../node_modules/zustand/esm/middleware/immer.mjs","../src/internal/logic/requestSubmit.ts","../src/internal/state/arrayUtil.ts","../src/internal/state/storeHooks.ts","../src/internal/state/controlledFields.ts","../src/server.ts","../src/ValidatedForm.tsx","../src/internal/MultiValueMap.ts","../src/internal/submissionCallbacks.ts","../src/internal/util.ts","../src/validation/createValidator.ts","../src/internal/flatten.ts","../src/userFacingFormContext.ts","../src/unreleased/formStateHooks.ts","../src/internal/state/fieldArray.tsx"],"sourcesContent":["/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = require('react');\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\n// dispatch for CommonJS interop named imports.\n\nvar useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nvar didWarnOld18Alpha = false;\nvar didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works\n// because of a very particular set of implementation details and assumptions\n// -- change any one of them and it will break. The most important assumption\n// is that updates are always synchronous, because concurrent rendering is\n// only available in versions of React that also have a built-in\n// useSyncExternalStore API. And we only use this shim when the built-in API\n// does not exist.\n//\n// Do not assume that the clever hacks used by this hook also work in general.\n// The point of this shim is to replace the need for hacks by other libraries.\n\nfunction useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of\n// React do not expose a way to check if we're hydrating. So users of the shim\n// will need to track that themselves and return the correct value\n// from `getSnapshot`.\ngetServerSnapshot) {\n {\n if (!didWarnOld18Alpha) {\n if (React.startTransition !== undefined) {\n didWarnOld18Alpha = true;\n\n error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.');\n }\n }\n } // Read the current snapshot from the store on every render. Again, this\n // breaks the rules of React, and only works here because of specific\n // implementation details, most importantly that updates are\n // always synchronous.\n\n\n var value = getSnapshot();\n\n {\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n\n if (!objectIs(value, cachedValue)) {\n error('The result of getSnapshot should be cached to avoid an infinite loop');\n\n didWarnUncachedGetSnapshot = true;\n }\n }\n } // Because updates are synchronous, we don't queue them. Instead we force a\n // re-render whenever the subscribed state changes by updating an some\n // arbitrary useState hook. Then, during render, we call getSnapshot to read\n // the current value.\n //\n // Because we don't actually use the state returned by the useState hook, we\n // can save a bit of memory by storing other stuff in that slot.\n //\n // To implement the early bailout, we need to track some things on a mutable\n // object. Usually, we would put that in a useRef hook, but we can stash it in\n // our useState hook instead.\n //\n // To force a re-render, we call forceUpdate({inst}). That works because the\n // new object always fails an equality check.\n\n\n var _useState = useState({\n inst: {\n value: value,\n getSnapshot: getSnapshot\n }\n }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated\n // in the layout phase so we can access it during the tearing check that\n // happens on subscribe.\n\n\n useLayoutEffect(function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the\n // commit phase if there was an interleaved mutation. In concurrent mode\n // this can happen all the time, but even in synchronous mode, an earlier\n // effect may have mutated the store.\n\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n }, [subscribe, value, getSnapshot]);\n useEffect(function () {\n // Check for changes right before subscribing. Subsequent changes will be\n // detected in the subscription handler.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n\n var handleStoreChange = function () {\n // TODO: Because there is no cross-renderer API for batching updates, it's\n // up to the consumer of this library to wrap their subscription event\n // with unstable_batchedUpdates. Should we try to detect when this isn't\n // the case and print a warning in development?\n // The store changed. Check if the snapshot changed since the last time we\n // read from the store.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n }; // Subscribe to the store and return a clean-up function.\n\n\n return subscribe(handleStoreChange);\n }, [subscribe]);\n useDebugValue(value);\n return value;\n}\n\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n var prevValue = inst.value;\n\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(prevValue, nextValue);\n } catch (error) {\n return true;\n }\n}\n\nfunction useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {\n // Note: The shim does not use getServerSnapshot, because pre-18 versions of\n // React do not expose a way to check if we're hydrating. So users of the shim\n // will need to track that themselves and return the correct value\n // from `getSnapshot`.\n return getSnapshot();\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\nvar isServerEnvironment = !canUseDOM;\n\nvar shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;\nvar useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;\n\nexports.useSyncExternalStore = useSyncExternalStore$2;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = require('react');\nvar shim = require('use-sync-external-store/shim');\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\nvar useSyncExternalStore = shim.useSyncExternalStore;\n\n// for CommonJS interop.\n\nvar useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.\n\nfunction useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {\n // Use this to track the rendered snapshot.\n var instRef = useRef(null);\n var inst;\n\n if (instRef.current === null) {\n inst = {\n hasValue: false,\n value: null\n };\n instRef.current = inst;\n } else {\n inst = instRef.current;\n }\n\n var _useMemo = useMemo(function () {\n // Track the memoized state using closure variables that are local to this\n // memoized instance of a getSnapshot function. Intentionally not using a\n // useRef hook, because that state would be shared across all concurrent\n // copies of the hook/component.\n var hasMemo = false;\n var memoizedSnapshot;\n var memoizedSelection;\n\n var memoizedSelector = function (nextSnapshot) {\n if (!hasMemo) {\n // The first time the hook is called, there is no memoized result.\n hasMemo = true;\n memoizedSnapshot = nextSnapshot;\n\n var _nextSelection = selector(nextSnapshot);\n\n if (isEqual !== undefined) {\n // Even if the selector has changed, the currently rendered selection\n // may be equal to the new selection. We should attempt to reuse the\n // current value if possible, to preserve downstream memoizations.\n if (inst.hasValue) {\n var currentSelection = inst.value;\n\n if (isEqual(currentSelection, _nextSelection)) {\n memoizedSelection = currentSelection;\n return currentSelection;\n }\n }\n }\n\n memoizedSelection = _nextSelection;\n return _nextSelection;\n } // We may be able to reuse the previous invocation's result.\n\n\n // We may be able to reuse the previous invocation's result.\n var prevSnapshot = memoizedSnapshot;\n var prevSelection = memoizedSelection;\n\n if (objectIs(prevSnapshot, nextSnapshot)) {\n // The snapshot is the same as last time. Reuse the previous selection.\n return prevSelection;\n } // The snapshot has changed, so we need to compute a new selection.\n\n\n // The snapshot has changed, so we need to compute a new selection.\n var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data\n // has changed. If it hasn't, return the previous selection. That signals\n // to React that the selections are conceptually equal, and we can bail\n // out of rendering.\n\n // If a custom isEqual function is provided, use that to check if the data\n // has changed. If it hasn't, return the previous selection. That signals\n // to React that the selections are conceptually equal, and we can bail\n // out of rendering.\n if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {\n return prevSelection;\n }\n\n memoizedSnapshot = nextSnapshot;\n memoizedSelection = nextSelection;\n return nextSelection;\n }; // Assigning this to a constant so that Flow knows it can't change.\n\n\n // Assigning this to a constant so that Flow knows it can't change.\n var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;\n\n var getSnapshotWithSelector = function () {\n return memoizedSelector(getSnapshot());\n };\n\n var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n };\n return [getSnapshotWithSelector, getServerSnapshotWithSelector];\n }, [getSnapshot, getServerSnapshot, selector, isEqual]),\n getSelection = _useMemo[0],\n getServerSelection = _useMemo[1];\n\n var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);\n useEffect(function () {\n inst.hasValue = true;\n inst.value = value;\n }, [value]);\n useDebugValue(value);\n return value;\n}\n\nexports.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { useEffect, useMemo } from \"react\";\nimport {\n createGetInputProps,\n GetInputProps,\n ValidationBehaviorOptions,\n} from \"./internal/getInputProps\";\nimport {\n useInternalFormContext,\n useFieldTouched,\n useFieldError,\n useFieldDefaultValue,\n useClearError,\n useInternalIsSubmitting,\n useInternalIsValid,\n useInternalHasBeenSubmitted,\n useRegisterReceiveFocus,\n useSmartValidate,\n} from \"./internal/hooks\";\nimport {\n useControllableValue,\n useUpdateControllableValue,\n} from \"./internal/state/controlledFields\";\n\n/**\n * Returns whether or not the parent form is currently being submitted.\n * This is different from Remix's `useNavigation()` in that it\n * is aware of what form it's in and when _that_ form is being submitted.\n *\n * @param formId\n */\nexport const useIsSubmitting = (formId?: string) => {\n const formContext = useInternalFormContext(formId, \"useIsSubmitting\");\n return useInternalIsSubmitting(formContext.formId);\n};\n\n/**\n * Returns whether or not the current form is valid.\n *\n * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.\n */\nexport const useIsValid = (formId?: string) => {\n const formContext = useInternalFormContext(formId, \"useIsValid\");\n return useInternalIsValid(formContext.formId);\n};\n\nexport type FieldProps = {\n /**\n * The validation error message if there is one.\n */\n error?: string;\n /**\n * Clears the error message.\n */\n clearError: () => void;\n /**\n * Validates the field.\n */\n validate: () => void;\n /**\n * The default value of the field, if there is one.\n */\n defaultValue?: any;\n /**\n * Whether or not the field has been touched.\n */\n touched: boolean;\n /**\n * Helper to set the touched state of the field.\n */\n setTouched: (touched: boolean) => void;\n /**\n * Helper to get all the props necessary for a regular input.\n */\n getInputProps: GetInputProps;\n};\n\n/**\n * Provides the data and helpers necessary to set up a field.\n */\nexport const useField = (\n name: string,\n options?: {\n /**\n * Allows you to configure a custom function that will be called\n * when the input needs to receive focus due to a validation error.\n * This is useful for custom components that use a hidden input.\n */\n handleReceiveFocus?: () => void;\n /**\n * Allows you to specify when a field gets validated (when using getInputProps)\n */\n validationBehavior?: Partial<ValidationBehaviorOptions>;\n /**\n * The formId of the form you want to use.\n * This is not necesary if the input is used inside a form.\n */\n formId?: string;\n }\n): FieldProps => {\n const { formId: providedFormId, handleReceiveFocus } = options ?? {};\n const formContext = useInternalFormContext(providedFormId, \"useField\");\n\n const defaultValue = useFieldDefaultValue(name, formContext);\n const [touched, setTouched] = useFieldTouched(name, formContext);\n const error = useFieldError(name, formContext);\n const clearError = useClearError(formContext);\n\n const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);\n const smartValidate = useSmartValidate(formContext.formId);\n const registerReceiveFocus = useRegisterReceiveFocus(formContext.formId);\n\n useEffect(() => {\n if (handleReceiveFocus)\n return registerReceiveFocus(name, handleReceiveFocus);\n }, [handleReceiveFocus, name, registerReceiveFocus]);\n\n const field = useMemo<FieldProps>(() => {\n const helpers = {\n error,\n clearError: () => clearError(name),\n validate: () => smartValidate({ alwaysIncludeErrorsFromFields: [name] }),\n defaultValue,\n touched,\n setTouched,\n };\n const getInputProps = createGetInputProps({\n ...helpers,\n name,\n hasBeenSubmitted,\n validationBehavior: options?.validationBehavior,\n });\n return {\n ...helpers,\n getInputProps,\n };\n }, [\n error,\n clearError,\n defaultValue,\n touched,\n setTouched,\n name,\n hasBeenSubmitted,\n options?.validationBehavior,\n smartValidate,\n ]);\n\n return field;\n};\n\nexport const useControlField = <T>(name: string, formId?: string) => {\n const context = useInternalFormContext(formId, \"useControlField\");\n const [value, setValue] = useControllableValue(context, name);\n return [value as T, setValue as (value: T) => void] as const;\n};\n\nexport const useUpdateControlledField = (formId?: string) => {\n const context = useInternalFormContext(formId, \"useControlField\");\n return useUpdateControllableValue(context.formId);\n};\n","import * as R from \"remeda\";\nimport { getCheckboxChecked } from \"./logic/getCheckboxChecked\";\nimport { getRadioChecked } from \"./logic/getRadioChecked\";\n\nexport type ValidationBehavior = \"onBlur\" | \"onChange\" | \"onSubmit\";\n\nexport type ValidationBehaviorOptions = {\n initial: ValidationBehavior;\n whenTouched: ValidationBehavior;\n whenSubmitted: ValidationBehavior;\n};\n\nexport type CreateGetInputPropsOptions = {\n clearError: () => void;\n validate: () => void;\n defaultValue?: any;\n touched: boolean;\n setTouched: (touched: boolean) => void;\n hasBeenSubmitted: boolean;\n validationBehavior?: Partial<ValidationBehaviorOptions>;\n name: string;\n};\n\ntype HandledProps = \"name\" | \"defaultValue\" | \"defaultChecked\";\ntype Callbacks = \"onChange\" | \"onBlur\";\n\ntype MinimalInputProps = {\n onChange?: ((...args: any[]) => void) | undefined;\n onBlur?: ((...args: any[]) => void) | undefined;\n defaultValue?: any;\n defaultChecked?: boolean | undefined;\n name?: string | undefined;\n type?: string | undefined;\n};\n\nexport type GetInputProps = <T extends MinimalInputProps>(\n props?: Omit<T, HandledProps | Callbacks> & Partial<Pick<T, Callbacks>>\n) => T;\n\nconst defaultValidationBehavior: ValidationBehaviorOptions = {\n initial: \"onBlur\",\n whenTouched: \"onChange\",\n whenSubmitted: \"onChange\",\n};\n\nexport const createGetInputProps = ({\n clearError,\n validate,\n defaultValue,\n touched,\n setTouched,\n hasBeenSubmitted,\n validationBehavior,\n name,\n}: CreateGetInputPropsOptions): GetInputProps => {\n const validationBehaviors = {\n ...defaultValidationBehavior,\n ...validationBehavior,\n };\n\n return <T extends MinimalInputProps>(props = {} as any) => {\n const behavior = hasBeenSubmitted\n ? validationBehaviors.whenSubmitted\n : touched\n ? validationBehaviors.whenTouched\n : validationBehaviors.initial;\n\n const inputProps: MinimalInputProps = {\n ...props,\n onChange: (...args: unknown[]) => {\n if (behavior === \"onChange\") validate();\n else clearError();\n return props?.onChange?.(...args);\n },\n onBlur: (...args: unknown[]) => {\n if (behavior === \"onBlur\") validate();\n setTouched(true);\n return props?.onBlur?.(...args);\n },\n name,\n };\n\n if (props.type === \"checkbox\") {\n inputProps.defaultChecked = getCheckboxChecked(props.value, defaultValue);\n } else if (props.type === \"radio\") {\n inputProps.defaultChecked = getRadioChecked(props.value, defaultValue);\n } else if (props.value === undefined) {\n // We should only set the defaultValue if the input is uncontrolled.\n inputProps.defaultValue = defaultValue;\n }\n\n return R.omitBy(inputProps, (value) => value === undefined) as T;\n };\n};\n","export const getCheckboxChecked = (\n checkboxValue: string | undefined = \"on\",\n newValue: unknown\n): boolean | undefined => {\n if (Array.isArray(newValue))\n return newValue.some((val) => val === true || val === checkboxValue);\n if (typeof newValue === \"boolean\") return newValue;\n if (typeof newValue === \"string\") return newValue === checkboxValue;\n return undefined;\n};\n","export const getRadioChecked = (\n radioValue: string | undefined = \"on\",\n newValue: unknown\n) => {\n if (typeof newValue === \"string\") return newValue === radioValue;\n return undefined;\n};\n\nif (import.meta.vitest) {\n const { it, expect } = import.meta.vitest;\n it(\"getRadioChecked\", () => {\n expect(getRadioChecked(\"on\", \"on\")).toBe(true);\n expect(getRadioChecked(\"on\", undefined)).toBe(undefined);\n expect(getRadioChecked(\"trueValue\", undefined)).toBe(undefined);\n expect(getRadioChecked(\"trueValue\", \"bob\")).toBe(false);\n expect(getRadioChecked(\"trueValue\", \"trueValue\")).toBe(true);\n });\n}\n","import { useActionData, useMatches, useNavigation } from \"@remix-run/react\";\nimport { useCallback, useContext } from \"react\";\nimport { getPath } from \"set-get\";\nimport invariant from \"tiny-invariant\";\nimport { FieldErrors, ValidationErrorResponseData } from \"..\";\nimport { formDefaultValuesKey } from \"./constants\";\nimport { InternalFormContext, InternalFormContextValue } from \"./formContext\";\nimport { Hydratable, hydratable } from \"./hydratable\";\nimport { useFormStore } from \"./state/storeHooks\";\nimport { InternalFormId } from \"./state/types\";\n\nexport const useInternalFormContext = (\n formId?: string | symbol,\n hookName?: string\n) => {\n const formContext = useContext(InternalFormContext);\n\n if (formId) return { formId };\n if (formContext) return formContext;\n\n throw new Error(\n `Unable to determine form for ${hookName}. Please use it inside a ValidatedForm or pass a 'formId'.`\n );\n};\n\nexport function useErrorResponseForForm({\n fetcher,\n subaction,\n formId,\n}: InternalFormContextValue): ValidationErrorResponseData | null {\n const actionData = useActionData<any>();\n if (fetcher) {\n if ((fetcher.data as any)?.fieldErrors) return fetcher.data as any;\n return null;\n }\n\n if (!actionData?.fieldErrors) return null;\n\n // If there's an explicit id, we should ignore data that has the wrong id\n if (typeof formId === \"string\" && actionData.formId)\n return actionData.formId === formId ? actionData : null;\n\n if (\n (!subaction && !actionData.subaction) ||\n actionData.subaction === subaction\n )\n return actionData;\n\n return null;\n}\n\nexport const useFieldErrorsForForm = (\n context: InternalFormContextValue\n): Hydratable<FieldErrors | undefined> => {\n const response = useErrorResponseForForm(context);\n const hydrated = useFormStore(context.formId, (state) => state.isHydrated);\n return hydratable.from(response?.fieldErrors, hydrated);\n};\n\nexport const useDefaultValuesFromLoader = ({\n formId,\n}: InternalFormContextValue) => {\n const matches = useMatches();\n if (typeof formId === \"string\") {\n const dataKey = formDefaultValuesKey(formId);\n // If multiple loaders declare the same default values,\n // we should use the data from the deepest route.\n const match = matches\n .reverse()\n .find(\n (match) =>\n match.data && typeof match.data === \"object\" && dataKey in match.data\n );\n return match?.data[dataKey];\n }\n\n return null;\n};\n\nexport const useDefaultValuesForForm = (\n context: InternalFormContextValue\n): Hydratable<{ [fieldName: string]: any }> => {\n const { formId, defaultValuesProp } = context;\n const hydrated = useFormStore(formId, (state) => state.isHydrated);\n const errorResponse = useErrorResponseForForm(context);\n const defaultValuesFromLoader = useDefaultValuesFromLoader(context);\n\n // Typical flow is:\n // - Default values only available from props or server\n // - Props have a higher priority than server\n // - State gets hydrated with default values\n // - After submit, we may need to use values from the error\n\n if (hydrated) return hydratable.hydratedData();\n if (errorResponse?.repopulateFields) {\n invariant(\n typeof errorResponse.repopulateFields === \"object\",\n \"repopulateFields returned something other than an object\"\n );\n return hydratable.serverData(errorResponse.repopulateFields);\n }\n if (defaultValuesProp) return hydratable.serverData(defaultValuesProp);\n\n return hydratable.serverData(defaultValuesFromLoader);\n};\n\nexport const useHasActiveFormSubmit = ({\n fetcher,\n}: InternalFormContextValue): boolean => {\n let navigation = useNavigation();\n const hasActiveSubmission = fetcher\n ? fetcher.state === \"submitting\"\n : navigation.state === \"submitting\" || navigation.state === \"loading\";\n return hasActiveSubmission;\n};\n\nexport const useFieldTouched = (\n field: string,\n { formId }: InternalFormContextValue\n) => {\n const touched = useFormStore(formId, (state) => state.touchedFields[field]);\n const setFieldTouched = useFormStore(formId, (state) => state.setTouched);\n const setTouched = useCallback(\n (touched: boolean) => setFieldTouched(field, touched),\n [field, setFieldTouched]\n );\n return [touched, setTouched] as const;\n};\n\nexport const useFieldError = (\n name: string,\n context: InternalFormContextValue\n) => {\n const fieldErrors = useFieldErrorsForForm(context);\n const state = useFormStore(\n context.formId,\n (state) => state.fieldErrors[name]\n );\n return fieldErrors.map((fieldErrors) => fieldErrors?.[name]).hydrateTo(state);\n};\n\nexport const useClearError = (context: InternalFormContextValue) => {\n const { formId } = context;\n return useFormStore(formId, (state) => state.clearFieldError);\n};\n\nexport const useCurrentDefaultValueForField = (\n formId: InternalFormId,\n field: string\n) =>\n useFormStore(formId, (state) => getPath(state.currentDefaultValues, field));\n\nexport const useFieldDefaultValue = (\n name: string,\n context: InternalFormContextValue\n) => {\n const defaultValues = useDefaultValuesForForm(context);\n const state = useCurrentDefaultValueForField(context.formId, name);\n\n return defaultValues.map((val) => getPath(val, name)).hydrateTo(state);\n};\n\nexport const useInternalIsSubmitting = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.isSubmitting);\n\nexport const useInternalIsValid = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.isValid());\n\nexport const useInternalHasBeenSubmitted = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.hasBeenSubmitted);\n\nexport const useSmartValidate = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.smartValidate);\n\nexport const useValidate = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.validate);\n\nconst noOpReceiver = () => () => {};\nexport const useRegisterReceiveFocus = (formId: InternalFormId) =>\n useFormStore(\n formId,\n (state) => state.formProps?.registerReceiveFocus ?? noOpReceiver\n );\n\nconst defaultDefaultValues = {};\nexport const useSyncedDefaultValues = (formId: InternalFormId) =>\n useFormStore(\n formId,\n (state) => state.formProps?.defaultValues ?? defaultDefaultValues\n );\n\nexport const useSetTouched = ({ formId }: InternalFormContextValue) =>\n useFormStore(formId, (state) => state.setTouched);\n\nexport const useTouchedFields = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.touchedFields);\n\nexport const useFieldErrors = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.fieldErrors);\n\nexport const useSetFieldErrors = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.setFieldErrors);\n\nexport const useResetFormElement = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.resetFormElement);\n\nexport const useSubmitForm = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.submit);\n\nexport const useFormActionProp = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.formProps?.action);\n\nexport const useFormSubactionProp = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.formProps?.subaction);\n\nexport const useFormValues = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.getValues);\n","export const stringToPathArray = <T extends string>(\n path: T\n): (string | number)[] => {\n if (path.length === 0) return [];\n\n const match =\n path.match(/^\\[(.+?)\\](.*)$/) || path.match(/^\\.?([^\\.\\[\\]]+)(.*)$/);\n if (match) {\n const [_, key, rest] = match;\n return [/^\\d+$/.test(key) ? Number(key) : key, ...stringToPathArray(rest)];\n }\n return [path];\n};\n","import { stringToPathArray } from \"./stringToPathArray\";\n\nexport function setPath<T>(object: T, path: string, defaultValue: any) {\n return _setPathNormalized(object, stringToPathArray(path), defaultValue);\n}\n\nfunction _setPathNormalized(\n object: any,\n path: (string | number)[],\n value: any\n): any {\n const leadingSegments = path.slice(0, -1);\n const lastSegment = path[path.length - 1];\n\n let obj = object;\n for (let i = 0; i < leadingSegments.length; i++) {\n const segment = leadingSegments[i];\n if (obj[segment] === undefined) {\n const nextSegment = leadingSegments[i + 1] ?? lastSegment;\n obj[segment] = typeof nextSegment === \"number\" ? [] : {};\n }\n obj = obj[segment];\n }\n obj[lastSegment] = value;\n return object;\n}\n","import get from \"lodash.get\";\n\nexport const getPath = (object: any, path: string) => {\n return get(object, path);\n};\n","export const FORM_ID_FIELD = \"__rvfInternalFormId\" as const;\nexport const FORM_DEFAULTS_FIELD = \"__rvfInternalFormDefaults\" as const;\nexport const formDefaultValuesKey = (formId: string) =>\n `${FORM_DEFAULTS_FIELD}_${formId}`;\n","import { FetcherWithComponents } from \"@remix-run/react\";\nimport { createContext } from \"react\";\n\nexport type InternalFormContextValue = {\n formId: string | symbol;\n action?: string;\n subaction?: string;\n defaultValuesProp?: { [fieldName: string]: any };\n fetcher?: FetcherWithComponents<unknown>;\n};\n\nexport const InternalFormContext =\n createContext<InternalFormContextValue | null>(null);\n","/**\n * The purpose of this type is to simplify the logic\n * around data that needs to come from the server initially,\n * but from the internal state after hydration.\n */\nexport type Hydratable<T> = {\n hydrateTo: (data: T) => T;\n map: <U>(fn: (data: T) => U) => Hydratable<U>;\n};\n\nconst serverData = <T>(data: T): Hydratable<T> => ({\n hydrateTo: () => data,\n map: (fn) => serverData(fn(data)),\n});\n\nconst hydratedData = <T>(): Hydratable<T> => ({\n hydrateTo: (hydratedData: T) => hydratedData,\n map: <U>() => hydratedData<U>(),\n});\n\nconst from = <T>(data: T, hydrated: boolean): Hydratable<T> =>\n hydrated ? hydratedData<T>() : serverData<T>(data);\n\nexport const hydratable = {\n serverData,\n hydratedData,\n from,\n};\n","import { WritableDraft } from \"immer/dist/internal\";\nimport { getPath, setPath } from \"set-get\";\nimport invariant from \"tiny-invariant\";\nimport { create, GetState } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport {\n FieldErrors,\n TouchedFields,\n ValidationResult,\n Validator,\n} from \"../../validation/types\";\nimport { requestSubmit } from \"../logic/requestSubmit\";\nimport * as arrayUtil from \"./arrayUtil\";\nimport { InternalFormId } from \"./types\";\n\nexport type SyncedFormProps = {\n formId?: string;\n action?: string;\n subaction?: string;\n defaultValues: { [fieldName: string]: any };\n registerReceiveFocus: (fieldName: string, handler: () => void) => () => void;\n validator: Validator<unknown>;\n};\n\nexport type SmartValidateOpts = {\n alwaysIncludeErrorsFromFields?: string[];\n};\n\nexport type FormStoreState = {\n forms: { [formId: InternalFormId]: FormState };\n form: (formId: InternalFormId) => FormState;\n registerForm: (formId: InternalFormId) => void;\n cleanupForm: (formId: InternalFormId) => void;\n};\n\nexport type FormState = {\n isHydrated: boolean;\n isSubmitting: boolean;\n hasBeenSubmitted: boolean;\n fieldErrors: FieldErrors;\n touchedFields: TouchedFields;\n formProps?: SyncedFormProps;\n formElement: HTMLFormElement | null;\n currentDefaultValues: Record<string, any>;\n\n isValid: () => boolean;\n startSubmit: () => void;\n endSubmit: () => void;\n setTouched: (field: string, touched: boolean) => void;\n setFieldError: (field: string, error: string) => void;\n setFieldErrors: (errors: FieldErrors) => void;\n clearFieldError: (field: string) => void;\n reset: () => void;\n syncFormProps: (props: SyncedFormProps) => void;\n setFormElement: (formElement: HTMLFormElement | null) => void;\n validate: () => Promise<ValidationResult<unknown>>;\n smartValidate: (\n opts?: SmartValidateOpts\n ) => Promise<ValidationResult<unknown>>;\n resetFormElement: () => void;\n submit: () => void;\n getValues: () => FormData;\n\n controlledFields: {\n values: { [fieldName: string]: any };\n refCounts: { [fieldName: string]: number };\n valueUpdatePromises: { [fieldName: string]: Promise<void> };\n valueUpdateResolvers: { [fieldName: string]: () => void };\n\n register: (fieldName: string) => void;\n unregister: (fieldName: string) => void;\n setValue: (fieldName: string, value: unknown) => void;\n kickoffValueUpdate: (fieldName: string) => void;\n getValue: (fieldName: string) => unknown;\n awaitValueUpdate: (fieldName: string) => Promise<void>;\n\n array: {\n push: (fieldName: string, value: unknown) => void;\n swap: (fieldName: string, indexA: number, indexB: number) => void;\n move: (fieldName: string, fromIndex: number, toIndex: number) => void;\n insert: (fieldName: string, index: number, value: unknown) => void;\n unshift: (fieldName: string, value: unknown) => void;\n remove: (fieldName: string, index: number) => void;\n pop: (fieldName: string) => void;\n replace: (fieldName: string, index: number, value: unknown) => void;\n };\n };\n};\n\nconst noOp = () => {};\nconst defaultFormState: FormState = {\n isHydrated: false,\n isSubmitting: false,\n hasBeenSubmitted: false,\n touchedFields: {},\n fieldErrors: {},\n formElement: null,\n isValid: () => true,\n startSubmit: noOp,\n endSubmit: noOp,\n setTouched: noOp,\n setFieldError: noOp,\n setFieldErrors: noOp,\n clearFieldError: noOp,\n currentDefaultValues: {},\n\n reset: () => noOp,\n syncFormProps: noOp,\n setFormElement: noOp,\n\n validate: async () => {\n throw new Error(\"Validate called before form was initialized.\");\n },\n\n smartValidate: async () => {\n throw new Error(\"Validate called before form was initialized.\");\n },\n\n submit: async () => {\n throw new Error(\"Submit called before form was initialized.\");\n },\n\n resetFormElement: noOp,\n getValues: () => new FormData(),\n\n controlledFields: {\n values: {},\n refCounts: {},\n valueUpdatePromises: {},\n valueUpdateResolvers: {},\n\n register: noOp,\n unregister: noOp,\n setValue: noOp,\n getValue: noOp,\n kickoffValueUpdate: noOp,\n awaitValueUpdate: async () => {\n throw new Error(\"AwaitValueUpdate called before form was initialized.\");\n },\n\n array: {\n push: noOp,\n swap: noOp,\n move: noOp,\n insert: noOp,\n unshift: noOp,\n remove: noOp,\n pop: noOp,\n replace: noOp,\n },\n },\n};\n\nconst createFormState = (\n set: (setter: (draft: WritableDraft<FormState>) => void) => void,\n get: GetState<FormState>\n): FormState => ({\n // It's not \"hydrated\" until the form props are synced\n isHydrated: false,\n isSubmitting: false,\n hasBeenSubmitted: false,\n touchedFields: {},\n fieldErrors: {},\n formElement: null,\n currentDefaultValues: {},\n\n isValid: () => Object.keys(get().fieldErrors).length === 0,\n startSubmit: () =>\n set((state) => {\n state.isSubmitting = true;\n state.hasBeenSubmitted = true;\n }),\n endSubmit: () =>\n set((state) => {\n state.isSubmitting = false;\n }),\n setTouched: (fieldName, touched) =>\n set((state) => {\n state.touchedFields[fieldName] = touched;\n }),\n setFieldError: (fieldName: string, error: string) =>\n set((state) => {\n state.fieldErrors[fieldName] = error;\n }),\n setFieldErrors: (errors: FieldErrors) =>\n set((state) => {\n state.fieldErrors = errors;\n }),\n clearFieldError: (fieldName: string) =>\n set((state) => {\n delete state.fieldErrors[fieldName];\n }),\n reset: () =>\n set((state) => {\n state.fieldErrors = {};\n state.touchedFields = {};\n state.hasBeenSubmitted = false;\n const nextDefaults = state.formProps?.defaultValues ?? {};\n state.controlledFields.values = nextDefaults;\n state.currentDefaultValues = nextDefaults;\n }),\n syncFormProps: (props: SyncedFormProps) =>\n set((state) => {\n if (!state.isHydrated) {\n state.controlledFields.values = props.defaultValues;\n state.currentDefaultValues = props.defaultValues;\n }\n\n state.formProps = props;\n state.isHydrated = true;\n }),\n setFormElement: (formElement: HTMLFormElement | null) => {\n // This gets called frequently, so we want to avoid calling set() every time\n // Or else we wind up with an infinite loop\n if (get().formElement === formElement) return;\n set((state) => {\n // weird type issue here\n // seems to be because formElement is a writable draft\n state.formElement = formElement as any;\n });\n },\n validate: async () => {\n const formElement = get().formElement;\n invariant(\n formElement,\n \"Cannot find reference to form. This is probably a bug in remix-validated-form.\"\n );\n\n const validator = get().formProps?.validator;\n invariant(\n validator,\n \"Cannot find validator. This is probably a bug in remix-validated-form.\"\n );\n\n const result = await validator.validate(new FormData(formElement));\n if (result.error) get().setFieldErrors(result.error.fieldErrors);\n return result;\n },\n\n smartValidate: async ({ alwaysIncludeErrorsFromFields = [] } = {}) => {\n const formElement = get().formElement;\n invariant(\n formElement,\n \"Cannot find reference to form. This is probably a bug in remix-validated-form.\"\n );\n\n const validator = get().formProps?.validator;\n invariant(\n validator,\n \"Cannot find validator. This is probably a bug in remix-validated-form.\"\n );\n\n await Promise.all(\n alwaysIncludeErrorsFromFields.map((field) =>\n get().controlledFields.awaitValueUpdate?.(field)\n )\n );\n\n const validationResult = await validator.validate(\n new FormData(formElement)\n );\n if (!validationResult.error) {\n // Only update the field errors if it hasn't changed\n const hadErrors = Object.keys(get().fieldErrors).length > 0;\n if (hadErrors) get().setFieldErrors({});\n return validationResult;\n }\n\n const {\n error: { fieldErrors },\n } = validationResult;\n const errorFields = new Set<string>();\n const incomingErrors = new Set<string>();\n const prevErrors = new Set<string>();\n\n Object.keys(fieldErrors).forEach((field) => {\n errorFields.add(field);\n incomingErrors.add(field);\n });\n\n Object.keys(get().fieldErrors).forEach((field) => {\n errorFields.add(field);\n prevErrors.add(field);\n });\n\n const fieldsToUpdate = new Set<string>();\n const fieldsToDelete = new Set<string>();\n\n errorFields.forEach((field) => {\n // If an error has been cleared, remove it.\n if (!incomingErrors.has(field)) {\n fieldsToDelete.add(field);\n return;\n }\n\n // If an error has changed, we should update it.\n if (prevErrors.has(field) && incomingErrors.has(field)) {\n // Only update if the error has changed to avoid unnecessary rerenders\n if (fieldErrors[field] !== get().fieldErrors[field])\n fieldsToUpdate.add(field);\n return;\n }\n\n // If the error is always included, then we should update it.\n if (alwaysIncludeErrorsFromFields.includes(field)) {\n fieldsToUpdate.add(field);\n return;\n }\n\n // If the error is new, then only update if the field has been touched\n // or if the form has been submitted\n if (!prevErrors.has(field)) {\n const fieldTouched = get().touchedFields[field];\n const formHasBeenSubmitted = get().hasBeenSubmitted;\n if (fieldTouched || formHasBeenSubmitted) fieldsToUpdate.add(field);\n return;\n }\n });\n\n if (fieldsToDelete.size === 0 && fieldsToUpdate.size === 0) {\n return { ...validationResult, error: { fieldErrors: get().fieldErrors } };\n }\n\n set((state) => {\n fieldsToDelete.forEach((field) => {\n delete state.fieldErrors[field];\n });\n\n fieldsToUpdate.forEach((field) => {\n state.fieldErrors[field] = fieldErrors[field];\n });\n });\n\n return { ...validationResult, error: { fieldErrors: get().fieldErrors } };\n },\n\n submit: () => {\n const formElement = get().formElement;\n invariant(\n formElement,\n \"Cannot find reference to form. This is probably a bug in remix-validated-form.\"\n );\n\n requestSubmit(formElement);\n },\n\n getValues: () => new FormData(get().formElement ?? undefined),\n\n resetFormElement: () => get().formElement?.reset(),\n\n controlledFields: {\n values: {},\n refCounts: {},\n valueUpdatePromises: {},\n valueUpdateResolvers: {},\n\n register: (fieldName) => {\n set((state) => {\n const current = state.controlledFields.refCounts[fieldName] ?? 0;\n state.controlledFields.refCounts[fieldName] = current + 1;\n });\n },\n unregister: (fieldName) => {\n // For this helper in particular, we may run into a case where state is undefined.\n // When the whole form unmounts, the form state may be cleaned up before the fields are.\n if (get() === null || get() === undefined) return;\n set((state) => {\n const current = state.controlledFields.refCounts[fieldName] ?? 0;\n if (current > 1) {\n state.controlledFields.refCounts[fieldName] = current - 1;\n return;\n }\n\n const isNested = Object.keys(state.controlledFields.refCounts).some(\n (key) => fieldName.startsWith(key) && key !== fieldName\n );\n\n // When nested within a field array, we should leave resetting up to the field array\n if (!isNested) {\n setPath(\n state.controlledFields.values,\n fieldName,\n getPath(state.formProps?.defaultValues, fieldName)\n );\n setPath(\n state.currentDefaultValues,\n fieldName,\n getPath(state.formProps?.defaultValues, fieldName)\n );\n }\n\n delete state.controlledFields.refCounts[fieldName];\n });\n },\n getValue: (fieldName) => getPath(get().controlledFields.values, fieldName),\n setValue: (fieldName, value) => {\n set((state) => {\n setPath(state.controlledFields.values, fieldName, value);\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n kickoffValueUpdate: (fieldName) => {\n const clear = () =>\n set((state) => {\n delete state.controlledFields.valueUpdateResolvers[fieldName];\n delete state.controlledFields.valueUpdatePromises[fieldName];\n });\n set((state) => {\n const promise = new Promise<void>((resolve) => {\n state.controlledFields.valueUpdateResolvers[fieldName] = resolve;\n }).then(clear);\n state.controlledFields.valueUpdatePromises[fieldName] = promise;\n });\n },\n\n awaitValueUpdate: async (fieldName) => {\n await get().controlledFields.valueUpdatePromises[fieldName];\n },\n\n array: {\n push: (fieldName, item) => {\n set((state) => {\n arrayUtil\n .getArray(state.controlledFields.values, fieldName)\n .push(item);\n arrayUtil.getArray(state.currentDefaultValues, fieldName).push(item);\n // New item added to the end, no need to update touched or error\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n\n swap: (fieldName, indexA, indexB) => {\n set((state) => {\n arrayUtil.swap(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n indexA,\n indexB\n );\n arrayUtil.swap(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n indexA,\n indexB\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.swap(array, indexA, indexB)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.swap(array, indexA, indexB)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n\n move: (fieldName, from, to) => {\n set((state) => {\n arrayUtil.move(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n from,\n to\n );\n arrayUtil.move(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n from,\n to\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.move(array, from, to)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.move(array, from, to)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n insert: (fieldName, index, item) => {\n set((state) => {\n arrayUtil.insert(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n index,\n item\n );\n arrayUtil.insert(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n index,\n item\n );\n // Even though this is a new item, we need to push around other items.\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.insertEmpty(array, index)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.insertEmpty(array, index)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n remove: (fieldName, index) => {\n set((state) => {\n arrayUtil.remove(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n index\n );\n arrayUtil.remove(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n index\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.remove(array, index)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.remove(array, index)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n pop: (fieldName) => {\n set((state) => {\n arrayUtil.getArray(state.controlledFields.values, fieldName).pop();\n arrayUtil.getArray(state.currentDefaultValues, fieldName).pop();\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n array.pop()\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n array.pop()\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n unshift: (fieldName, value) => {\n set((state) => {\n arrayUtil\n .getArray(state.controlledFields.values, fieldName)\n .unshift(value);\n arrayUtil\n .getArray(state.currentDefaultValues, fieldName)\n .unshift(value);\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.insertEmpty(array, 0)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.insertEmpty(array, 0)\n );\n });\n },\n replace: (fieldName, index, item) => {\n set((state) => {\n arrayUtil.replace(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n index,\n item\n );\n arrayUtil.replace(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n index,\n item\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.replace(array, index, item)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.replace(array, index, item)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n },\n },\n});\n\nexport const useRootFormStore = create<FormStoreState>()(\n immer((set, get) => ({\n forms: {},\n form: (formId) => {\n return get().forms[formId] ?? defaultFormState;\n },\n cleanupForm: (formId: InternalFormId) => {\n set((state) => {\n delete state.forms[formId];\n });\n },\n registerForm: (formId: InternalFormId) => {\n if (get().forms[formId]) return;\n set((state) => {\n state.forms[formId] = createFormState(\n (setter) => set((state) => setter(state.forms[formId])),\n () => get().forms[formId]\n ) as WritableDraft<FormState>;\n });\n },\n }))\n);\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\") ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The destroy method will be unsupported in the future version. You should use unsubscribe function returned by subscribe. Everything will be garbage collected if store is garbage collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, subscribe, destroy };\n state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] default export is deprecated, instead import { createStore } ...\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport { useDebugValue } from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nfunction useStore(api, selector = api.getState, equalityFn) {\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n '[DEPRECATED] Passing a vanilla store will be unsupported in the future version. Please use `import { useStore } from \"zustand\"` to use the vanilla store in React.'\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] default export is deprecated, instead import { create } from'zustand'\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","const errors = {\n\t0: \"Illegal state\",\n\t1: \"Immer drafts cannot have computed properties\",\n\t2: \"This object has been frozen and should not be mutated\",\n\t3(data: any) {\n\t\treturn (\n\t\t\t\"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" +\n\t\t\tdata\n\t\t)\n\t},\n\t4: \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n\t5: \"Immer forbids circular references\",\n\t6: \"The first or second argument to `produce` must be a function\",\n\t7: \"The third argument to `produce` must be a function or undefined\",\n\t8: \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n\t9: \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n\t10: \"The given draft is already finalized\",\n\t11: \"Object.defineProperty() cannot be used on an Immer draft\",\n\t12: \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n\t13: \"Immer only supports deleting array indices\",\n\t14: \"Immer only supports setting array indices and the 'length' property\",\n\t15(path: string) {\n\t\treturn \"Cannot apply patch, path doesn't resolve: \" + path\n\t},\n\t16: 'Sets cannot have \"replace\" patches.',\n\t17(op: string) {\n\t\treturn \"Unsupported patch operation: \" + op\n\t},\n\t18(plugin: string) {\n\t\treturn `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`\n\t},\n\t20: \"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available\",\n\t21(thing: string) {\n\t\treturn `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`\n\t},\n\t22(thing: string) {\n\t\treturn `'current' expects a draft, got: ${thing}`\n\t},\n\t23(thing: string) {\n\t\treturn `'original' expects a draft, got: ${thing}`\n\t},\n\t24: \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n} as const\n\nexport function die(error: keyof typeof errors, ...args: any[]): never {\n\tif (__DEV__) {\n\t\tconst e = errors[error]\n\t\tconst msg = !e\n\t\t\t? \"unknown error nr: \" + error\n\t\t\t: typeof e === \"function\"\n\t\t\t? e.apply(null, args as any)\n\t\t\t: e\n\t\tthrow new Error(`[Immer] ${msg}`)\n\t}\n\tthrow new Error(\n\t\t`[Immer] minified error nr: ${error}${\n\t\t\targs.length ? \" \" + args.map(s => `'${s}'`).join(\",\") : \"\"\n\t\t}. Find the full error at: https://bit.ly/3cXEKWf`\n\t)\n}\n","import {\n\tDRAFT_STATE,\n\tDRAFTABLE,\n\thasSet,\n\tObjectish,\n\tDrafted,\n\tAnyObject,\n\tAnyMap,\n\tAnySet,\n\tImmerState,\n\thasMap,\n\tArchtype,\n\tdie\n} from \"../internal\"\n\n/** Returns true if the given value is an Immer draft */\n/*#__PURE__*/\nexport function isDraft(value: any): boolean {\n\treturn !!value && !!value[DRAFT_STATE]\n}\n\n/** Returns true if the given value can be drafted by Immer */\n/*#__PURE__*/\nexport function isDraftable(value: any): boolean {\n\tif (!value) return false\n\treturn (\n\t\tisPlainObject(value) ||\n\t\tArray.isArray(value) ||\n\t\t!!value[DRAFTABLE] ||\n\t\t!!value.constructor?.[DRAFTABLE] ||\n\t\tisMap(value) ||\n\t\tisSet(value)\n\t)\n}\n\nconst objectCtorString = Object.prototype.constructor.toString()\n/*#__PURE__*/\nexport function isPlainObject(value: any): boolean {\n\tif (!value || typeof value !== \"object\") return false\n\tconst proto = Object.getPrototypeOf(value)\n\tif (proto === null) {\n\t\treturn true\n\t}\n\tconst Ctor =\n\t\tObject.hasOwnProperty.call(proto, \"constructor\") && proto.constructor\n\n\tif (Ctor === Object) return true\n\n\treturn (\n\t\ttypeof Ctor == \"function\" &&\n\t\tFunction.toString.call(Ctor) === objectCtorString\n\t)\n}\n\n/** Get the underlying object that is represented by the given draft */\n/*#__PURE__*/\nexport function original<T>(value: T): T | undefined\nexport function original(value: Drafted<any>): any {\n\tif (!isDraft(value)) die(23, value)\n\treturn value[DRAFT_STATE].base_\n}\n\n/*#__PURE__*/\nexport const ownKeys: (target: AnyObject) => PropertyKey[] =\n\ttypeof Reflect !== \"undefined\" && Reflect.ownKeys\n\t\t? Reflect.ownKeys\n\t\t: typeof Object.getOwnPropertySymbols !== \"undefined\"\n\t\t? obj =>\n\t\t\t\tObject.getOwnPropertyNames(obj).concat(\n\t\t\t\t\tObject.getOwnPropertySymbols(obj) as any\n\t\t\t\t)\n\t\t: /* istanbul ignore next */ Object.getOwnPropertyNames\n\nexport const getOwnPropertyDescriptors =\n\tObject.getOwnPropertyDescriptors ||\n\tfunction getOwnPropertyDescriptors(target: any) {\n\t\t// Polyfill needed for Hermes and IE, see https://github.com/facebook/hermes/issues/274\n\t\tconst res: any = {}\n\t\townKeys(target).forEach(key => {\n\t\t\tres[key] = Object.getOwnPropertyDescriptor(target, key)\n\t\t})\n\t\treturn res\n\t}\n\nexport function each<T extends Objectish>(\n\tobj: T,\n\titer: (key: string | number, value: any, source: T) => void,\n\tenumerableOnly?: boolean\n): void\nexport function each(obj: any, iter: any, enumerableOnly = false) {\n\tif (getArchtype(obj) === Archtype.Object) {\n\t\t;(enumerableOnly ? Object.keys : ownKeys)(obj).forEach(key => {\n\t\t\tif (!enumerableOnly || typeof key !== \"symbol\") iter(key, obj[key], obj)\n\t\t})\n\t} else {\n\t\tobj.forEach((entry: any, index: any) => iter(index, entry, obj))\n\t}\n}\n\n/*#__PURE__*/\nexport function getArchtype(thing: any): Archtype {\n\t/* istanbul ignore next */\n\tconst state: undefined | ImmerState = thing[DRAFT_STATE]\n\treturn state\n\t\t? state.type_ > 3\n\t\t\t? state.type_ - 4 // cause Object and Array map back from 4 and 5\n\t\t\t: (state.type_ as any) // others are the same\n\t\t: Array.isArray(thing)\n\t\t? Archtype.Array\n\t\t: isMap(thing)\n\t\t? Archtype.Map\n\t\t: isSet(thing)\n\t\t? Archtype.Set\n\t\t: Archtype.Object\n}\n\n/*#__PURE__*/\nexport function has(thing: any, prop: PropertyKey): boolean {\n\treturn getArchtype(thing) === Archtype.Map\n\t\t? thing.has(prop)\n\t\t: Object.prototype.hasOwnProperty.call(thing, prop)\n}\n\n/*#__PURE__*/\nexport function get(thing: AnyMap | AnyObject, prop: PropertyKey): any {\n\t// @ts-ignore\n\treturn getArchtype(thing) === Archtype.Map ? thing.get(prop) : thing[prop]\n}\n\n/*#__PURE__*/\nexport function set(thing: any, propOrOldValue: PropertyKey, value: any) {\n\tconst t = getArchtype(thing)\n\tif (t === Archtype.Map) thing.set(propOrOldValue, value)\n\telse if (t === Archtype.Set) {\n\t\tthing.delete(propOrOldValue)\n\t\tthing.add(value)\n\t} else thing[propOrOldValue] = value\n}\n\n/*#__PURE__*/\nexport function is(x: any, y: any): boolean {\n\t// From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n\tif (x === y) {\n\t\treturn x !== 0 || 1 / x === 1 / y\n\t} else {\n\t\treturn x !== x && y !== y\n\t}\n}\n\n/*#__PURE__*/\nexport function isMap(target: any): target is AnyMap {\n\treturn hasMap && target instanceof Map\n}\n\n/*#__PURE__*/\nexport function isSet(target: any): target is AnySet {\n\treturn hasSet && target instanceof Set\n}\n/*#__PURE__*/\nexport function latest(state: ImmerState): any {\n\treturn state.copy_ || state.base_\n}\n\n/*#__PURE__*/\nexport function shallowCopy(base: any) {\n\tif (Array.isArray(base)) return Array.prototype.slice.call(base)\n\tconst descriptors = getOwnPropertyDescriptors(base)\n\tdelete descriptors[DRAFT_STATE as any]\n\tlet keys = ownKeys(descriptors)\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key: any = keys[i]\n\t\tconst desc = descriptors[key]\n\t\tif (desc.writable === false) {\n\t\t\tdesc.writable = true\n\t\t\tdesc.configurable = true\n\t\t}\n\t\t// like object.assign, we will read any _own_, get/set accessors. This helps in dealing\n\t\t// with libraries that trap values, like mobx or vue\n\t\t// unlike object.assign, non-enumerables will be copied as well\n\t\tif (desc.get || desc.set)\n\t\t\tdescriptors[key] = {\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true, // could live with !!desc.set as well here...\n\t\t\t\tenumerable: desc.enumerable,\n\t\t\t\tvalue: base[key]\n\t\t\t}\n\t}\n\treturn Object.create(Object.getPrototypeOf(base), descriptors)\n}\n\n/**\n * Freezes draftable objects. Returns the original object.\n * By default freezes shallowly, but if the second argument is `true` it will freeze recursively.\n *\n * @param obj\n * @param deep\n */\nexport function freeze<T>(obj: T, deep?: boolean): T\nexport function freeze<T>(obj: any, deep: boolean = false): T {\n\tif (isFrozen(obj) || isDraft(obj) || !isDraftable(obj)) return obj\n\tif (getArchtype(obj) > 1 /* Map or Set */) {\n\t\tobj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections as any\n\t}\n\tObject.freeze(obj)\n\tif (deep) each(obj, (key, value) => freeze(value, true), true)\n\treturn obj\n}\n\nfunction dontMutateFrozenCollections() {\n\tdie(2)\n}\n\nexport function isFrozen(obj: any): boolean {\n\tif (obj == null || typeof obj !== \"object\") return true\n\t// See #600, IE dies on non-objects in Object.isFrozen\n\treturn Object.isFrozen(obj)\n}\n","import {\n\tImmerState,\n\tPatch,\n\tImmerScope,\n\tDrafted,\n\tAnyObject,\n\tImmerBaseState,\n\tAnyMap,\n\tAnySet,\n\tProxyType,\n\tdie\n} from \"../internal\"\n\n/** Plugin utilities */\nconst plugins: {\n\tPatches?: {\n\t\tgeneratePatches_(\n\t\t\tstate: ImmerState,\n\t\t\tbasePath: PatchPath,\n\t\t\tpatches: Patch[],\n\t\t\tinversePatches: Patch[]\n\t\t): void\n\t\tgenerateReplacementPatches_(\n\t\t\tbase: any,\n\t\t\treplacement: any,\n\t\t\tpatches: Patch[],\n\t\t\tinversePatches: Patch[]\n\t\t): void\n\t\tapplyPatches_<T>(draft: T, patches: Patch[]): T\n\t}\n\tES5?: {\n\t\twillFinalizeES5_(scope: ImmerScope, result: any, isReplaced: boolean): void\n\t\tcreateES5Proxy_<T>(\n\t\t\tbase: T,\n\t\t\tparent?: ImmerState\n\t\t): Drafted<T, ES5ObjectState | ES5ArrayState>\n\t\thasChanges_(state: ES5ArrayState | ES5ObjectState): boolean\n\t}\n\tMapSet?: {\n\t\tproxyMap_<T extends AnyMap>(target: T, parent?: ImmerState): T\n\t\tproxySet_<T extends AnySet>(target: T, parent?: ImmerState): T\n\t}\n} = {}\n\ntype Plugins = typeof plugins\n\nexport function getPlugin<K extends keyof Plugins>(\n\tpluginKey: K\n): Exclude<Plugins[K], undefined> {\n\tconst plugin = plugins[pluginKey]\n\tif (!plugin) {\n\t\tdie(18, pluginKey)\n\t}\n\t// @ts-ignore\n\treturn plugin\n}\n\nexport function loadPlugin<K extends keyof Plugins>(\n\tpluginKey: K,\n\timplementation: Plugins[K]\n): void {\n\tif (!plugins[pluginKey]) plugins[pluginKey] = implementation\n}\n\n/** ES5 Plugin */\n\ninterface ES5BaseState extends ImmerBaseState {\n\tassigned_: {[key: string]: any}\n\tparent_?: ImmerState\n\trevoked_: boolean\n}\n\nexport interface ES5ObjectState extends ES5BaseState {\n\ttype_: ProxyType.ES5Object\n\tdraft_: Drafted<AnyObject, ES5ObjectState>\n\tbase_: AnyObject\n\tcopy_: AnyObject | null\n}\n\nexport interface ES5ArrayState extends ES5BaseState {\n\ttype_: ProxyType.ES5Array\n\tdraft_: Drafted<AnyObject, ES5ArrayState>\n\tbase_: any\n\tcopy_: any\n}\n\n/** Map / Set plugin */\n\nexport interface MapState extends ImmerBaseState {\n\ttype_: ProxyType.Map\n\tcopy_: AnyMap | undefined\n\tassigned_: Map<any, boolean> | undefined\n\tbase_: AnyMap\n\trevoked_: boolean\n\tdraft_: Drafted<AnyMap, MapState>\n}\n\nexport interface SetState extends ImmerBaseState {\n\ttype_: ProxyType.Set\n\tcopy_: AnySet | undefined\n\tbase_: AnySet\n\tdrafts_: Map<any, Drafted> // maps the original value to the draft value in the new set\n\trevoked_: boolean\n\tdraft_: Drafted<AnySet, SetState>\n}\n\n/** Patches plugin */\n\nexport type PatchPath = (string | number)[]\n","import {\n\tPatch,\n\tPatchListener,\n\tDrafted,\n\tImmer,\n\tDRAFT_STATE,\n\tImmerState,\n\tProxyType,\n\tgetPlugin\n} from \"../internal\"\nimport {die} from \"../utils/errors\"\n\n/** Each scope represents a `produce` call. */\n\nexport interface ImmerScope {\n\tpatches_?: Patch[]\n\tinversePatches_?: Patch[]\n\tcanAutoFreeze_: boolean\n\tdrafts_: any[]\n\tparent_?: ImmerScope\n\tpatchListener_?: PatchListener\n\timmer_: Immer\n\tunfinalizedDrafts_: number\n}\n\nlet currentScope: ImmerScope | undefined\n\nexport function getCurrentScope() {\n\tif (__DEV__ && !currentScope) die(0)\n\treturn currentScope!\n}\n\nfunction createScope(\n\tparent_: ImmerScope | undefined,\n\timmer_: Immer\n): ImmerScope {\n\treturn {\n\t\tdrafts_: [],\n\t\tparent_,\n\t\timmer_,\n\t\t// Whenever the modified draft contains a draft from another scope, we\n\t\t// need to prevent auto-freezing so the unowned draft can be finalized.\n\t\tcanAutoFreeze_: true,\n\t\tunfinalizedDrafts_: 0\n\t}\n}\n\nexport function usePatchesInScope(\n\tscope: ImmerScope,\n\tpatchListener?: PatchListener\n) {\n\tif (patchListener) {\n\t\tgetPlugin(\"Patches\") // assert we have the plugin\n\t\tscope.patches_ = []\n\t\tscope.inversePatches_ = []\n\t\tscope.patchListener_ = patchListener\n\t}\n}\n\nexport function revokeScope(scope: ImmerScope) {\n\tleaveScope(scope)\n\tscope.drafts_.forEach(revokeDraft)\n\t// @ts-ignore\n\tscope.drafts_ = null\n}\n\nexport function leaveScope(scope: ImmerScope) {\n\tif (scope === currentScope) {\n\t\tcurrentScope = scope.parent_\n\t}\n}\n\nexport function enterScope(immer: Immer) {\n\treturn (currentScope = createScope(currentScope, immer))\n}\n\nfunction revokeDraft(draft: Drafted) {\n\tconst state: ImmerState = draft[DRAFT_STATE]\n\tif (\n\t\tstate.type_ === ProxyType.ProxyObject ||\n\t\tstate.type_ === ProxyType.ProxyArray\n\t)\n\t\tstate.revoke_()\n\telse state.revoked_ = true\n}\n","import {\n\tImmerScope,\n\tDRAFT_STATE,\n\tisDraftable,\n\tNOTHING,\n\tPatchPath,\n\teach,\n\thas,\n\tfreeze,\n\tImmerState,\n\tisDraft,\n\tSetState,\n\tset,\n\tProxyType,\n\tgetPlugin,\n\tdie,\n\trevokeScope,\n\tisFrozen,\n\tshallowCopy\n} from \"../internal\"\n\nexport function processResult(result: any, scope: ImmerScope) {\n\tscope.unfinalizedDrafts_ = scope.drafts_.length\n\tconst baseDraft = scope.drafts_![0]\n\tconst isReplaced = result !== undefined && result !== baseDraft\n\tif (!scope.immer_.useProxies_)\n\t\tgetPlugin(\"ES5\").willFinalizeES5_(scope, result, isReplaced)\n\tif (isReplaced) {\n\t\tif (baseDraft[DRAFT_STATE].modified_) {\n\t\t\trevokeScope(scope)\n\t\t\tdie(4)\n\t\t}\n\t\tif (isDraftable(result)) {\n\t\t\t// Finalize the result in case it contains (or is) a subset of the draft.\n\t\t\tresult = finalize(scope, result)\n\t\t\tif (!scope.parent_) maybeFreeze(scope, result)\n\t\t}\n\t\tif (scope.patches_) {\n\t\t\tgetPlugin(\"Patches\").generateReplacementPatches_(\n\t\t\t\tbaseDraft[DRAFT_STATE].base_,\n\t\t\t\tresult,\n\t\t\t\tscope.patches_,\n\t\t\t\tscope.inversePatches_!\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Finalize the base draft.\n\t\tresult = finalize(scope, baseDraft, [])\n\t}\n\trevokeScope(scope)\n\tif (scope.patches_) {\n\t\tscope.patchListener_!(scope.patches_, scope.inversePatches_!)\n\t}\n\treturn result !== NOTHING ? result : undefined\n}\n\nfunction finalize(rootScope: ImmerScope, value: any, path?: PatchPath) {\n\t// Don't recurse in tho recursive data structures\n\tif (isFrozen(value)) return value\n\n\tconst state: ImmerState = value[DRAFT_STATE]\n\t// A plain object, might need freezing, might contain drafts\n\tif (!state) {\n\t\teach(\n\t\t\tvalue,\n\t\t\t(key, childValue) =>\n\t\t\t\tfinalizeProperty(rootScope, state, value, key, childValue, path),\n\t\t\ttrue // See #590, don't recurse into non-enumerable of non drafted objects\n\t\t)\n\t\treturn value\n\t}\n\t// Never finalize drafts owned by another scope.\n\tif (state.scope_ !== rootScope) return value\n\t// Unmodified draft, return the (frozen) original\n\tif (!state.modified_) {\n\t\tmaybeFreeze(rootScope, state.base_, true)\n\t\treturn state.base_\n\t}\n\t// Not finalized yet, let's do that now\n\tif (!state.finalized_) {\n\t\tstate.finalized_ = true\n\t\tstate.scope_.unfinalizedDrafts_--\n\t\tconst result =\n\t\t\t// For ES5, create a good copy from the draft first, with added keys and without deleted keys.\n\t\t\tstate.type_ === ProxyType.ES5Object || state.type_ === ProxyType.ES5Array\n\t\t\t\t? (state.copy_ = shallowCopy(state.draft_))\n\t\t\t\t: state.copy_\n\t\t// Finalize all children of the copy\n\t\t// For sets we clone before iterating, otherwise we can get in endless loop due to modifying during iteration, see #628\n\t\t// Although the original test case doesn't seem valid anyway, so if this in the way we can turn the next line\n\t\t// back to each(result, ....)\n\t\teach(\n\t\t\tstate.type_ === ProxyType.Set ? new Set(result) : result,\n\t\t\t(key, childValue) =>\n\t\t\t\tfinalizeProperty(rootScope, state, result, key, childValue, path)\n\t\t)\n\t\t// everything inside is frozen, we can freeze here\n\t\tmaybeFreeze(rootScope, result, false)\n\t\t// first time finalizing, let's create those patches\n\t\tif (path && rootScope.patches_) {\n\t\t\tgetPlugin(\"Patches\").generatePatches_(\n\t\t\t\tstate,\n\t\t\t\tpath,\n\t\t\t\trootScope.patches_,\n\t\t\t\trootScope.inversePatches_!\n\t\t\t)\n\t\t}\n\t}\n\treturn state.copy_\n}\n\nfunction finalizeProperty(\n\trootScope: ImmerScope,\n\tparentState: undefined | ImmerState,\n\ttargetObject: any,\n\tprop: string | number,\n\tchildValue: any,\n\trootPath?: PatchPath\n) {\n\tif (__DEV__ && childValue === targetObject) die(5)\n\tif (isDraft(childValue)) {\n\t\tconst path =\n\t\t\trootPath &&\n\t\t\tparentState &&\n\t\t\tparentState!.type_ !== ProxyType.Set && // Set objects are atomic since they have no keys.\n\t\t\t!has((parentState as Exclude<ImmerState, SetState>).assigned_!, prop) // Skip deep patches for assigned keys.\n\t\t\t\t? rootPath!.concat(prop)\n\t\t\t\t: undefined\n\t\t// Drafts owned by `scope` are finalized here.\n\t\tconst res = finalize(rootScope, childValue, path)\n\t\tset(targetObject, prop, res)\n\t\t// Drafts from another scope must prevented to be frozen\n\t\t// if we got a draft back from finalize, we're in a nested produce and shouldn't freeze\n\t\tif (isDraft(res)) {\n\t\t\trootScope.canAutoFreeze_ = false\n\t\t} else return\n\t}\n\t// Search new objects for unfinalized drafts. Frozen objects should never contain drafts.\n\tif (isDraftable(childValue) && !isFrozen(childValue)) {\n\t\tif (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n\t\t\t// optimization: if an object is not a draft, and we don't have to\n\t\t\t// deepfreeze everything, and we are sure that no drafts are left in the remaining object\n\t\t\t// cause we saw and finalized all drafts already; we can stop visiting the rest of the tree.\n\t\t\t// This benefits especially adding large data tree's without further processing.\n\t\t\t// See add-data.js perf test\n\t\t\treturn\n\t\t}\n\t\tfinalize(rootScope, childValue)\n\t\t// immer deep freezes plain objects, so if there is no parent state, we freeze as well\n\t\tif (!parentState || !parentState.scope_.parent_)\n\t\t\tmaybeFreeze(rootScope, childValue)\n\t}\n}\n\nfunction maybeFreeze(scope: ImmerScope, value: any, deep = false) {\n\tif (scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n\t\tfreeze(value, deep)\n\t}\n}\n","import {\n\teach,\n\thas,\n\tis,\n\tisDraftable,\n\tshallowCopy,\n\tlatest,\n\tImmerBaseState,\n\tImmerState,\n\tDrafted,\n\tAnyObject,\n\tAnyArray,\n\tObjectish,\n\tgetCurrentScope,\n\tDRAFT_STATE,\n\tdie,\n\tcreateProxy,\n\tProxyType\n} from \"../internal\"\n\ninterface ProxyBaseState extends ImmerBaseState {\n\tassigned_: {\n\t\t[property: string]: boolean\n\t}\n\tparent_?: ImmerState\n\trevoke_(): void\n}\n\nexport interface ProxyObjectState extends ProxyBaseState {\n\ttype_: ProxyType.ProxyObject\n\tbase_: any\n\tcopy_: any\n\tdraft_: Drafted<AnyObject, ProxyObjectState>\n}\n\nexport interface ProxyArrayState extends ProxyBaseState {\n\ttype_: ProxyType.ProxyArray\n\tbase_: AnyArray\n\tcopy_: AnyArray | null\n\tdraft_: Drafted<AnyArray, ProxyArrayState>\n}\n\ntype ProxyState = ProxyObjectState | ProxyArrayState\n\n/**\n * Returns a new draft of the `base` object.\n *\n * The second argument is the parent draft-state (used internally).\n */\nexport function createProxyProxy<T extends Objectish>(\n\tbase: T,\n\tparent?: ImmerState\n): Drafted<T, ProxyState> {\n\tconst isArray = Array.isArray(base)\n\tconst state: ProxyState = {\n\t\ttype_: isArray ? ProxyType.ProxyArray : (ProxyType.ProxyObject as any),\n\t\t// Track which produce call this is associated with.\n\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t// True for both shallow and deep changes.\n\t\tmodified_: false,\n\t\t// Used during finalization.\n\t\tfinalized_: false,\n\t\t// Track which properties have been assigned (true) or deleted (false).\n\t\tassigned_: {},\n\t\t// The parent draft state.\n\t\tparent_: parent,\n\t\t// The base state.\n\t\tbase_: base,\n\t\t// The base proxy.\n\t\tdraft_: null as any, // set below\n\t\t// The base copy with any updated values.\n\t\tcopy_: null,\n\t\t// Called by the `produce` function.\n\t\trevoke_: null as any,\n\t\tisManual_: false\n\t}\n\n\t// the traps must target something, a bit like the 'real' base.\n\t// but also, we need to be able to determine from the target what the relevant state is\n\t// (to avoid creating traps per instance to capture the state in closure,\n\t// and to avoid creating weird hidden properties as well)\n\t// So the trick is to use 'state' as the actual 'target'! (and make sure we intercept everything)\n\t// Note that in the case of an array, we put the state in an array to have better Reflect defaults ootb\n\tlet target: T = state as any\n\tlet traps: ProxyHandler<object | Array<any>> = objectTraps\n\tif (isArray) {\n\t\ttarget = [state] as any\n\t\ttraps = arrayTraps\n\t}\n\n\tconst {revoke, proxy} = Proxy.revocable(target, traps)\n\tstate.draft_ = proxy as any\n\tstate.revoke_ = revoke\n\treturn proxy as any\n}\n\n/**\n * Object drafts\n */\nexport const objectTraps: ProxyHandler<ProxyState> = {\n\tget(state, prop) {\n\t\tif (prop === DRAFT_STATE) return state\n\n\t\tconst source = latest(state)\n\t\tif (!has(source, prop)) {\n\t\t\t// non-existing or non-own property...\n\t\t\treturn readPropFromProto(state, source, prop)\n\t\t}\n\t\tconst value = source[prop]\n\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\treturn value\n\t\t}\n\t\t// Check for existing draft in modified state.\n\t\t// Assigned values are never drafted. This catches any drafts we created, too.\n\t\tif (value === peek(state.base_, prop)) {\n\t\t\tprepareCopy(state)\n\t\t\treturn (state.copy_![prop as any] = createProxy(\n\t\t\t\tstate.scope_.immer_,\n\t\t\t\tvalue,\n\t\t\t\tstate\n\t\t\t))\n\t\t}\n\t\treturn value\n\t},\n\thas(state, prop) {\n\t\treturn prop in latest(state)\n\t},\n\townKeys(state) {\n\t\treturn Reflect.ownKeys(latest(state))\n\t},\n\tset(\n\t\tstate: ProxyObjectState,\n\t\tprop: string /* strictly not, but helps TS */,\n\t\tvalue\n\t) {\n\t\tconst desc = getDescriptorFromProto(latest(state), prop)\n\t\tif (desc?.set) {\n\t\t\t// special case: if this write is captured by a setter, we have\n\t\t\t// to trigger it with the correct context\n\t\t\tdesc.set.call(state.draft_, value)\n\t\t\treturn true\n\t\t}\n\t\tif (!state.modified_) {\n\t\t\t// the last check is because we need to be able to distinguish setting a non-existing to undefined (which is a change)\n\t\t\t// from setting an existing property with value undefined to undefined (which is not a change)\n\t\t\tconst current = peek(latest(state), prop)\n\t\t\t// special case, if we assigning the original value to a draft, we can ignore the assignment\n\t\t\tconst currentState: ProxyObjectState = current?.[DRAFT_STATE]\n\t\t\tif (currentState && currentState.base_ === value) {\n\t\t\t\tstate.copy_![prop] = value\n\t\t\t\tstate.assigned_[prop] = false\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (is(value, current) && (value !== undefined || has(state.base_, prop)))\n\t\t\t\treturn true\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t}\n\n\t\tif (\n\t\t\tstate.copy_![prop] === value &&\n\t\t\t// special case: NaN\n\t\t\ttypeof value !== \"number\" &&\n\t\t\t// special case: handle new props with value 'undefined'\n\t\t\t(value !== undefined || prop in state.copy_)\n\t\t)\n\t\t\treturn true\n\n\t\t// @ts-ignore\n\t\tstate.copy_![prop] = value\n\t\tstate.assigned_[prop] = true\n\t\treturn true\n\t},\n\tdeleteProperty(state, prop: string) {\n\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\tif (peek(state.base_, prop) !== undefined || prop in state.base_) {\n\t\t\tstate.assigned_[prop] = false\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t} else {\n\t\t\t// if an originally not assigned property was deleted\n\t\t\tdelete state.assigned_[prop]\n\t\t}\n\t\t// @ts-ignore\n\t\tif (state.copy_) delete state.copy_[prop]\n\t\treturn true\n\t},\n\t// Note: We never coerce `desc.value` into an Immer draft, because we can't make\n\t// the same guarantee in ES5 mode.\n\tgetOwnPropertyDescriptor(state, prop) {\n\t\tconst owner = latest(state)\n\t\tconst desc = Reflect.getOwnPropertyDescriptor(owner, prop)\n\t\tif (!desc) return desc\n\t\treturn {\n\t\t\twritable: true,\n\t\t\tconfigurable: state.type_ !== ProxyType.ProxyArray || prop !== \"length\",\n\t\t\tenumerable: desc.enumerable,\n\t\t\tvalue: owner[prop]\n\t\t}\n\t},\n\tdefineProperty() {\n\t\tdie(11)\n\t},\n\tgetPrototypeOf(state) {\n\t\treturn Object.getPrototypeOf(state.base_)\n\t},\n\tsetPrototypeOf() {\n\t\tdie(12)\n\t}\n}\n\n/**\n * Array drafts\n */\n\nconst arrayTraps: ProxyHandler<[ProxyArrayState]> = {}\neach(objectTraps, (key, fn) => {\n\t// @ts-ignore\n\tarrayTraps[key] = function() {\n\t\targuments[0] = arguments[0][0]\n\t\treturn fn.apply(this, arguments)\n\t}\n})\narrayTraps.deleteProperty = function(state, prop) {\n\tif (__DEV__ && isNaN(parseInt(prop as any))) die(13)\n\t// @ts-ignore\n\treturn arrayTraps.set!.call(this, state, prop, undefined)\n}\narrayTraps.set = function(state, prop, value) {\n\tif (__DEV__ && prop !== \"length\" && isNaN(parseInt(prop as any))) die(14)\n\treturn objectTraps.set!.call(this, state[0], prop, value, state[0])\n}\n\n// Access a property without creating an Immer draft.\nfunction peek(draft: Drafted, prop: PropertyKey) {\n\tconst state = draft[DRAFT_STATE]\n\tconst source = state ? latest(state) : draft\n\treturn source[prop]\n}\n\nfunction readPropFromProto(state: ImmerState, source: any, prop: PropertyKey) {\n\tconst desc = getDescriptorFromProto(source, prop)\n\treturn desc\n\t\t? `value` in desc\n\t\t\t? desc.value\n\t\t\t: // This is a very special case, if the prop is a getter defined by the\n\t\t\t // prototype, we should invoke it with the draft as context!\n\t\t\t desc.get?.call(state.draft_)\n\t\t: undefined\n}\n\nfunction getDescriptorFromProto(\n\tsource: any,\n\tprop: PropertyKey\n): PropertyDescriptor | undefined {\n\t// 'in' checks proto!\n\tif (!(prop in source)) return undefined\n\tlet proto = Object.getPrototypeOf(source)\n\twhile (proto) {\n\t\tconst desc = Object.getOwnPropertyDescriptor(proto, prop)\n\t\tif (desc) return desc\n\t\tproto = Object.getPrototypeOf(proto)\n\t}\n\treturn undefined\n}\n\nexport function markChanged(state: ImmerState) {\n\tif (!state.modified_) {\n\t\tstate.modified_ = true\n\t\tif (state.parent_) {\n\t\t\tmarkChanged(state.parent_)\n\t\t}\n\t}\n}\n\nexport function prepareCopy(state: {base_: any; copy_: any}) {\n\tif (!state.copy_) {\n\t\tstate.copy_ = shallowCopy(state.base_)\n\t}\n}\n","import {\n\tIProduceWithPatches,\n\tIProduce,\n\tImmerState,\n\tDrafted,\n\tisDraftable,\n\tprocessResult,\n\tPatch,\n\tObjectish,\n\tDRAFT_STATE,\n\tDraft,\n\tPatchListener,\n\tisDraft,\n\tisMap,\n\tisSet,\n\tcreateProxyProxy,\n\tgetPlugin,\n\tdie,\n\thasProxies,\n\tenterScope,\n\trevokeScope,\n\tleaveScope,\n\tusePatchesInScope,\n\tgetCurrentScope,\n\tNOTHING,\n\tfreeze,\n\tcurrent\n} from \"../internal\"\n\ninterface ProducersFns {\n\tproduce: IProduce\n\tproduceWithPatches: IProduceWithPatches\n}\n\nexport class Immer implements ProducersFns {\n\tuseProxies_: boolean = hasProxies\n\n\tautoFreeze_: boolean = true\n\n\tconstructor(config?: {useProxies?: boolean; autoFreeze?: boolean}) {\n\t\tif (typeof config?.useProxies === \"boolean\")\n\t\t\tthis.setUseProxies(config!.useProxies)\n\t\tif (typeof config?.autoFreeze === \"boolean\")\n\t\t\tthis.setAutoFreeze(config!.autoFreeze)\n\t}\n\n\t/**\n\t * The `produce` function takes a value and a \"recipe function\" (whose\n\t * return value often depends on the base state). The recipe function is\n\t * free to mutate its first argument however it wants. All mutations are\n\t * only ever applied to a __copy__ of the base state.\n\t *\n\t * Pass only a function to create a \"curried producer\" which relieves you\n\t * from passing the recipe function every time.\n\t *\n\t * Only plain objects and arrays are made mutable. All other objects are\n\t * considered uncopyable.\n\t *\n\t * Note: This function is __bound__ to its `Immer` instance.\n\t *\n\t * @param {any} base - the initial state\n\t * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n\t * @param {Function} patchListener - optional function that will be called with all the patches produced here\n\t * @returns {any} a new state, or the initial state if nothing was modified\n\t */\n\tproduce: IProduce = (base: any, recipe?: any, patchListener?: any) => {\n\t\t// curried invocation\n\t\tif (typeof base === \"function\" && typeof recipe !== \"function\") {\n\t\t\tconst defaultBase = recipe\n\t\t\trecipe = base\n\n\t\t\tconst self = this\n\t\t\treturn function curriedProduce(\n\t\t\t\tthis: any,\n\t\t\t\tbase = defaultBase,\n\t\t\t\t...args: any[]\n\t\t\t) {\n\t\t\t\treturn self.produce(base, (draft: Drafted) => recipe.call(this, draft, ...args)) // prettier-ignore\n\t\t\t}\n\t\t}\n\n\t\tif (typeof recipe !== \"function\") die(6)\n\t\tif (patchListener !== undefined && typeof patchListener !== \"function\")\n\t\t\tdie(7)\n\n\t\tlet result\n\n\t\t// Only plain objects, arrays, and \"immerable classes\" are drafted.\n\t\tif (isDraftable(base)) {\n\t\t\tconst scope = enterScope(this)\n\t\t\tconst proxy = createProxy(this, base, undefined)\n\t\t\tlet hasError = true\n\t\t\ttry {\n\t\t\t\tresult = recipe(proxy)\n\t\t\t\thasError = false\n\t\t\t} finally {\n\t\t\t\t// finally instead of catch + rethrow better preserves original stack\n\t\t\t\tif (hasError) revokeScope(scope)\n\t\t\t\telse leaveScope(scope)\n\t\t\t}\n\t\t\tif (typeof Promise !== \"undefined\" && result instanceof Promise) {\n\t\t\t\treturn result.then(\n\t\t\t\t\tresult => {\n\t\t\t\t\t\tusePatchesInScope(scope, patchListener)\n\t\t\t\t\t\treturn processResult(result, scope)\n\t\t\t\t\t},\n\t\t\t\t\terror => {\n\t\t\t\t\t\trevokeScope(scope)\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t}\n\t\t\tusePatchesInScope(scope, patchListener)\n\t\t\treturn processResult(result, scope)\n\t\t} else if (!base || typeof base !== \"object\") {\n\t\t\tresult = recipe(base)\n\t\t\tif (result === undefined) result = base\n\t\t\tif (result === NOTHING) result = undefined\n\t\t\tif (this.autoFreeze_) freeze(result, true)\n\t\t\tif (patchListener) {\n\t\t\t\tconst p: Patch[] = []\n\t\t\t\tconst ip: Patch[] = []\n\t\t\t\tgetPlugin(\"Patches\").generateReplacementPatches_(base, result, p, ip)\n\t\t\t\tpatchListener(p, ip)\n\t\t\t}\n\t\t\treturn result\n\t\t} else die(21, base)\n\t}\n\n\tproduceWithPatches: IProduceWithPatches = (\n\t\tbase: any,\n\t\trecipe?: any,\n\t): any => {\n\t\t// curried invocation\n\t\tif (typeof base === \"function\") {\n\t\t\treturn (state: any, ...args: any[]) =>\n\t\t\t\tthis.produceWithPatches(state, (draft: any) => base(draft, ...args))\n\t\t}\n\n\t\tlet patches: Patch[], inversePatches: Patch[]\n\t\tconst result = this.produce(base, recipe, (p: Patch[], ip: Patch[]) => {\n\t\t\tpatches = p\n\t\t\tinversePatches = ip\n\t\t})\n\n\t\tif (typeof Promise !== \"undefined\" && result instanceof Promise) {\n\t\t\treturn result.then(nextState => [nextState, patches!, inversePatches!])\n\t\t}\n\t\treturn [result, patches!, inversePatches!]\n\t}\n\n\tcreateDraft<T extends Objectish>(base: T): Draft<T> {\n\t\tif (!isDraftable(base)) die(8)\n\t\tif (isDraft(base)) base = current(base)\n\t\tconst scope = enterScope(this)\n\t\tconst proxy = createProxy(this, base, undefined)\n\t\tproxy[DRAFT_STATE].isManual_ = true\n\t\tleaveScope(scope)\n\t\treturn proxy as any\n\t}\n\n\tfinishDraft<D extends Draft<any>>(\n\t\tdraft: D,\n\t\tpatchListener?: PatchListener\n\t): D extends Draft<infer T> ? T : never {\n\t\tconst state: ImmerState = draft && (draft as any)[DRAFT_STATE]\n\t\tif (__DEV__) {\n\t\t\tif (!state || !state.isManual_) die(9)\n\t\t\tif (state.finalized_) die(10)\n\t\t}\n\t\tconst {scope_: scope} = state\n\t\tusePatchesInScope(scope, patchListener)\n\t\treturn processResult(undefined, scope)\n\t}\n\n\t/**\n\t * Pass true to automatically freeze all copies created by Immer.\n\t *\n\t * By default, auto-freezing is enabled.\n\t */\n\tsetAutoFreeze(value: boolean) {\n\t\tthis.autoFreeze_ = value\n\t}\n\n\t/**\n\t * Pass true to use the ES2015 `Proxy` class when creating drafts, which is\n\t * always faster than using ES5 proxies.\n\t *\n\t * By default, feature detection is used, so calling this is rarely necessary.\n\t */\n\tsetUseProxies(value: boolean) {\n\t\tif (value && !hasProxies) {\n\t\t\tdie(20)\n\t\t}\n\t\tthis.useProxies_ = value\n\t}\n\n\tapplyPatches<T extends Objectish>(base: T, patches: Patch[]): T {\n\t\t// If a patch replaces the entire state, take that replacement as base\n\t\t// before applying patches\n\t\tlet i: number\n\t\tfor (i = patches.length - 1; i >= 0; i--) {\n\t\t\tconst patch = patches[i]\n\t\t\tif (patch.path.length === 0 && patch.op === \"replace\") {\n\t\t\t\tbase = patch.value\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// If there was a patch that replaced the entire state, start from the\n\t\t// patch after that.\n\t\tif (i > -1) {\n\t\t\tpatches = patches.slice(i + 1)\n\t\t}\n\n\t\tconst applyPatchesImpl = getPlugin(\"Patches\").applyPatches_\n\t\tif (isDraft(base)) {\n\t\t\t// N.B: never hits if some patch a replacement, patches are never drafts\n\t\t\treturn applyPatchesImpl(base, patches)\n\t\t}\n\t\t// Otherwise, produce a copy of the base state.\n\t\treturn this.produce(base, (draft: Drafted) =>\n\t\t\tapplyPatchesImpl(draft, patches)\n\t\t)\n\t}\n}\n\nexport function createProxy<T extends Objectish>(\n\timmer: Immer,\n\tvalue: T,\n\tparent?: ImmerState\n): Drafted<T, ImmerState> {\n\t// precondition: createProxy should be guarded by isDraftable, so we know we can safely draft\n\tconst draft: Drafted = isMap(value)\n\t\t? getPlugin(\"MapSet\").proxyMap_(value, parent)\n\t\t: isSet(value)\n\t\t? getPlugin(\"MapSet\").proxySet_(value, parent)\n\t\t: immer.useProxies_\n\t\t? createProxyProxy(value, parent)\n\t\t: getPlugin(\"ES5\").createES5Proxy_(value, parent)\n\n\tconst scope = parent ? parent.scope_ : getCurrentScope()\n\tscope.drafts_.push(draft)\n\treturn draft\n}\n","import {\n\tdie,\n\tisDraft,\n\tshallowCopy,\n\teach,\n\tDRAFT_STATE,\n\tget,\n\tset,\n\tImmerState,\n\tisDraftable,\n\tArchtype,\n\tgetArchtype,\n\tgetPlugin\n} from \"../internal\"\n\n/** Takes a snapshot of the current state of a draft and finalizes it (but without freezing). This is a great utility to print the current state during debugging (no Proxies in the way). The output of current can also be safely leaked outside the producer. */\nexport function current<T>(value: T): T\nexport function current(value: any): any {\n\tif (!isDraft(value)) die(22, value)\n\treturn currentImpl(value)\n}\n\nfunction currentImpl(value: any): any {\n\tif (!isDraftable(value)) return value\n\tconst state: ImmerState | undefined = value[DRAFT_STATE]\n\tlet copy: any\n\tconst archType = getArchtype(value)\n\tif (state) {\n\t\tif (\n\t\t\t!state.modified_ &&\n\t\t\t(state.type_ < 4 || !getPlugin(\"ES5\").hasChanges_(state as any))\n\t\t)\n\t\t\treturn state.base_\n\t\t// Optimization: avoid generating new drafts during copying\n\t\tstate.finalized_ = true\n\t\tcopy = copyHelper(value, archType)\n\t\tstate.finalized_ = false\n\t} else {\n\t\tcopy = copyHelper(value, archType)\n\t}\n\n\teach(copy, (key, childValue) => {\n\t\tif (state && get(state.base_, key) === childValue) return // no need to copy or search in something that didn't change\n\t\tset(copy, key, currentImpl(childValue))\n\t})\n\t// In the future, we might consider freezing here, based on the current settings\n\treturn archType === Archtype.Set ? new Set(copy) : copy\n}\n\nfunction copyHelper(value: any, archType: number): any {\n\t// creates a shallow copy, even if it is a map or set\n\tswitch (archType) {\n\t\tcase Archtype.Map:\n\t\t\treturn new Map(value)\n\t\tcase Archtype.Set:\n\t\t\t// Set will be cloned as array temporarily, so that we can replace individual items\n\t\t\treturn Array.from(value)\n\t}\n\treturn shallowCopy(value)\n}\n","import {\n\tImmerState,\n\tDrafted,\n\tES5ArrayState,\n\tES5ObjectState,\n\teach,\n\thas,\n\tisDraft,\n\tlatest,\n\tDRAFT_STATE,\n\tis,\n\tloadPlugin,\n\tImmerScope,\n\tProxyType,\n\tgetCurrentScope,\n\tdie,\n\tmarkChanged,\n\tobjectTraps,\n\townKeys,\n\tgetOwnPropertyDescriptors\n} from \"../internal\"\n\ntype ES5State = ES5ArrayState | ES5ObjectState\n\nexport function enableES5() {\n\tfunction willFinalizeES5_(\n\t\tscope: ImmerScope,\n\t\tresult: any,\n\t\tisReplaced: boolean\n\t) {\n\t\tif (!isReplaced) {\n\t\t\tif (scope.patches_) {\n\t\t\t\tmarkChangesRecursively(scope.drafts_![0])\n\t\t\t}\n\t\t\t// This is faster when we don't care about which attributes changed.\n\t\t\tmarkChangesSweep(scope.drafts_)\n\t\t}\n\t\t// When a child draft is returned, look for changes.\n\t\telse if (\n\t\t\tisDraft(result) &&\n\t\t\t(result[DRAFT_STATE] as ES5State).scope_ === scope\n\t\t) {\n\t\t\tmarkChangesSweep(scope.drafts_)\n\t\t}\n\t}\n\n\tfunction createES5Draft(isArray: boolean, base: any) {\n\t\tif (isArray) {\n\t\t\tconst draft = new Array(base.length)\n\t\t\tfor (let i = 0; i < base.length; i++)\n\t\t\t\tObject.defineProperty(draft, \"\" + i, proxyProperty(i, true))\n\t\t\treturn draft\n\t\t} else {\n\t\t\tconst descriptors = getOwnPropertyDescriptors(base)\n\t\t\tdelete descriptors[DRAFT_STATE as any]\n\t\t\tconst keys = ownKeys(descriptors)\n\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\tconst key: any = keys[i]\n\t\t\t\tdescriptors[key] = proxyProperty(\n\t\t\t\t\tkey,\n\t\t\t\t\tisArray || !!descriptors[key].enumerable\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn Object.create(Object.getPrototypeOf(base), descriptors)\n\t\t}\n\t}\n\n\tfunction createES5Proxy_<T>(\n\t\tbase: T,\n\t\tparent?: ImmerState\n\t): Drafted<T, ES5ObjectState | ES5ArrayState> {\n\t\tconst isArray = Array.isArray(base)\n\t\tconst draft = createES5Draft(isArray, base)\n\n\t\tconst state: ES5ObjectState | ES5ArrayState = {\n\t\t\ttype_: isArray ? ProxyType.ES5Array : (ProxyType.ES5Object as any),\n\t\t\tscope_: parent ? parent.scope_ : getCurrentScope(),\n\t\t\tmodified_: false,\n\t\t\tfinalized_: false,\n\t\t\tassigned_: {},\n\t\t\tparent_: parent,\n\t\t\t// base is the object we are drafting\n\t\t\tbase_: base,\n\t\t\t// draft is the draft object itself, that traps all reads and reads from either the base (if unmodified) or copy (if modified)\n\t\t\tdraft_: draft,\n\t\t\tcopy_: null,\n\t\t\trevoked_: false,\n\t\t\tisManual_: false\n\t\t}\n\n\t\tObject.defineProperty(draft, DRAFT_STATE, {\n\t\t\tvalue: state,\n\t\t\t// enumerable: false <- the default\n\t\t\twritable: true\n\t\t})\n\t\treturn draft\n\t}\n\n\t// property descriptors are recycled to make sure we don't create a get and set closure per property,\n\t// but share them all instead\n\tconst descriptors: {[prop: string]: PropertyDescriptor} = {}\n\n\tfunction proxyProperty(\n\t\tprop: string | number,\n\t\tenumerable: boolean\n\t): PropertyDescriptor {\n\t\tlet desc = descriptors[prop]\n\t\tif (desc) {\n\t\t\tdesc.enumerable = enumerable\n\t\t} else {\n\t\t\tdescriptors[prop] = desc = {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable,\n\t\t\t\tget(this: any) {\n\t\t\t\t\tconst state = this[DRAFT_STATE]\n\t\t\t\t\tif (__DEV__) assertUnrevoked(state)\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\treturn objectTraps.get(state, prop)\n\t\t\t\t},\n\t\t\t\tset(this: any, value) {\n\t\t\t\t\tconst state = this[DRAFT_STATE]\n\t\t\t\t\tif (__DEV__) assertUnrevoked(state)\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tobjectTraps.set(state, prop, value)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn desc\n\t}\n\n\t// This looks expensive, but only proxies are visited, and only objects without known changes are scanned.\n\tfunction markChangesSweep(drafts: Drafted<any, ImmerState>[]) {\n\t\t// The natural order of drafts in the `scope` array is based on when they\n\t\t// were accessed. By processing drafts in reverse natural order, we have a\n\t\t// better chance of processing leaf nodes first. When a leaf node is known to\n\t\t// have changed, we can avoid any traversal of its ancestor nodes.\n\t\tfor (let i = drafts.length - 1; i >= 0; i--) {\n\t\t\tconst state: ES5State = drafts[i][DRAFT_STATE]\n\t\t\tif (!state.modified_) {\n\t\t\t\tswitch (state.type_) {\n\t\t\t\t\tcase ProxyType.ES5Array:\n\t\t\t\t\t\tif (hasArrayChanges(state)) markChanged(state)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase ProxyType.ES5Object:\n\t\t\t\t\t\tif (hasObjectChanges(state)) markChanged(state)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction markChangesRecursively(object: any) {\n\t\tif (!object || typeof object !== \"object\") return\n\t\tconst state: ES5State | undefined = object[DRAFT_STATE]\n\t\tif (!state) return\n\t\tconst {base_, draft_, assigned_, type_} = state\n\t\tif (type_ === ProxyType.ES5Object) {\n\t\t\t// Look for added keys.\n\t\t\t// probably there is a faster way to detect changes, as sweep + recurse seems to do some\n\t\t\t// unnecessary work.\n\t\t\t// also: probably we can store the information we detect here, to speed up tree finalization!\n\t\t\teach(draft_, key => {\n\t\t\t\tif ((key as any) === DRAFT_STATE) return\n\t\t\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\t\t\tif ((base_ as any)[key] === undefined && !has(base_, key)) {\n\t\t\t\t\tassigned_[key] = true\n\t\t\t\t\tmarkChanged(state)\n\t\t\t\t} else if (!assigned_[key]) {\n\t\t\t\t\t// Only untouched properties trigger recursion.\n\t\t\t\t\tmarkChangesRecursively(draft_[key])\n\t\t\t\t}\n\t\t\t})\n\t\t\t// Look for removed keys.\n\t\t\teach(base_, key => {\n\t\t\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\t\t\tif (draft_[key] === undefined && !has(draft_, key)) {\n\t\t\t\t\tassigned_[key] = false\n\t\t\t\t\tmarkChanged(state)\n\t\t\t\t}\n\t\t\t})\n\t\t} else if (type_ === ProxyType.ES5Array) {\n\t\t\tif (hasArrayChanges(state as ES5ArrayState)) {\n\t\t\t\tmarkChanged(state)\n\t\t\t\tassigned_.length = true\n\t\t\t}\n\n\t\t\tif (draft_.length < base_.length) {\n\t\t\t\tfor (let i = draft_.length; i < base_.length; i++) assigned_[i] = false\n\t\t\t} else {\n\t\t\t\tfor (let i = base_.length; i < draft_.length; i++) assigned_[i] = true\n\t\t\t}\n\n\t\t\t// Minimum count is enough, the other parts has been processed.\n\t\t\tconst min = Math.min(draft_.length, base_.length)\n\n\t\t\tfor (let i = 0; i < min; i++) {\n\t\t\t\t// Only untouched indices trigger recursion.\n\t\t\t\tif (!draft_.hasOwnProperty(i)) {\n\t\t\t\t\tassigned_[i] = true\n\t\t\t\t}\n\t\t\t\tif (assigned_[i] === undefined) markChangesRecursively(draft_[i])\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction hasObjectChanges(state: ES5ObjectState) {\n\t\tconst {base_, draft_} = state\n\n\t\t// Search for added keys and changed keys. Start at the back, because\n\t\t// non-numeric keys are ordered by time of definition on the object.\n\t\tconst keys = ownKeys(draft_)\n\t\tfor (let i = keys.length - 1; i >= 0; i--) {\n\t\t\tconst key: any = keys[i]\n\t\t\tif (key === DRAFT_STATE) continue\n\t\t\tconst baseValue = base_[key]\n\t\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\t\tif (baseValue === undefined && !has(base_, key)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Once a base key is deleted, future changes go undetected, because its\n\t\t\t// descriptor is erased. This branch detects any missed changes.\n\t\t\telse {\n\t\t\t\tconst value = draft_[key]\n\t\t\t\tconst state: ImmerState = value && value[DRAFT_STATE]\n\t\t\t\tif (state ? state.base_ !== baseValue : !is(value, baseValue)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// At this point, no keys were added or changed.\n\t\t// Compare key count to determine if keys were deleted.\n\t\tconst baseIsDraft = !!base_[DRAFT_STATE as any]\n\t\treturn keys.length !== ownKeys(base_).length + (baseIsDraft ? 0 : 1) // + 1 to correct for DRAFT_STATE\n\t}\n\n\tfunction hasArrayChanges(state: ES5ArrayState) {\n\t\tconst {draft_} = state\n\t\tif (draft_.length !== state.base_.length) return true\n\t\t// See #116\n\t\t// If we first shorten the length, our array interceptors will be removed.\n\t\t// If after that new items are added, result in the same original length,\n\t\t// those last items will have no intercepting property.\n\t\t// So if there is no own descriptor on the last position, we know that items were removed and added\n\t\t// N.B.: splice, unshift, etc only shift values around, but not prop descriptors, so we only have to check\n\t\t// the last one\n\t\t// last descriptor can be not a trap, if the array was extended\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(\n\t\t\tdraft_,\n\t\t\tdraft_.length - 1\n\t\t)\n\t\t// descriptor can be null, but only for newly created sparse arrays, eg. new Array(10)\n\t\tif (descriptor && !descriptor.get) return true\n\t\t// if we miss a property, it has been deleted, so array probobaly changed\n\t\tfor (let i = 0; i < draft_.length; i++) {\n\t\t\tif (!draft_.hasOwnProperty(i)) return true\n\t\t}\n\t\t// For all other cases, we don't have to compare, as they would have been picked up by the index setters\n\t\treturn false\n\t}\n\n\tfunction hasChanges_(state: ES5State) {\n\t\treturn state.type_ === ProxyType.ES5Object\n\t\t\t? hasObjectChanges(state)\n\t\t\t: hasArrayChanges(state)\n\t}\n\n\tfunction assertUnrevoked(state: any /*ES5State | MapState | SetState*/) {\n\t\tif (state.revoked_) die(3, JSON.stringify(latest(state)))\n\t}\n\n\tloadPlugin(\"ES5\", {\n\t\tcreateES5Proxy_,\n\t\twillFinalizeES5_,\n\t\thasChanges_\n\t})\n}\n","import {immerable} from \"../immer\"\nimport {\n\tImmerState,\n\tPatch,\n\tSetState,\n\tES5ArrayState,\n\tProxyArrayState,\n\tMapState,\n\tES5ObjectState,\n\tProxyObjectState,\n\tPatchPath,\n\tget,\n\teach,\n\thas,\n\tgetArchtype,\n\tisSet,\n\tisMap,\n\tloadPlugin,\n\tProxyType,\n\tArchtype,\n\tdie,\n\tisDraft,\n\tisDraftable,\n\tNOTHING\n} from \"../internal\"\n\nexport function enablePatches() {\n\tconst REPLACE = \"replace\"\n\tconst ADD = \"add\"\n\tconst REMOVE = \"remove\"\n\n\tfunction generatePatches_(\n\t\tstate: ImmerState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t): void {\n\t\tswitch (state.type_) {\n\t\t\tcase ProxyType.ProxyObject:\n\t\t\tcase ProxyType.ES5Object:\n\t\t\tcase ProxyType.Map:\n\t\t\t\treturn generatePatchesFromAssigned(\n\t\t\t\t\tstate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches,\n\t\t\t\t\tinversePatches\n\t\t\t\t)\n\t\t\tcase ProxyType.ES5Array:\n\t\t\tcase ProxyType.ProxyArray:\n\t\t\t\treturn generateArrayPatches(state, basePath, patches, inversePatches)\n\t\t\tcase ProxyType.Set:\n\t\t\t\treturn generateSetPatches(\n\t\t\t\t\t(state as any) as SetState,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches,\n\t\t\t\t\tinversePatches\n\t\t\t\t)\n\t\t}\n\t}\n\n\tfunction generateArrayPatches(\n\t\tstate: ES5ArrayState | ProxyArrayState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tlet {base_, assigned_} = state\n\t\tlet copy_ = state.copy_!\n\n\t\t// Reduce complexity by ensuring `base` is never longer.\n\t\tif (copy_.length < base_.length) {\n\t\t\t// @ts-ignore\n\t\t\t;[base_, copy_] = [copy_, base_]\n\t\t\t;[patches, inversePatches] = [inversePatches, patches]\n\t\t}\n\n\t\t// Process replaced indices.\n\t\tfor (let i = 0; i < base_.length; i++) {\n\t\t\tif (assigned_[i] && copy_[i] !== base_[i]) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: REPLACE,\n\t\t\t\t\tpath,\n\t\t\t\t\t// Need to maybe clone it, as it can in fact be the original value\n\t\t\t\t\t// due to the base/copy inversion at the start of this function\n\t\t\t\t\tvalue: clonePatchValueIfNeeded(copy_[i])\n\t\t\t\t})\n\t\t\t\tinversePatches.push({\n\t\t\t\t\top: REPLACE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue: clonePatchValueIfNeeded(base_[i])\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// Process added indices.\n\t\tfor (let i = base_.length; i < copy_.length; i++) {\n\t\t\tconst path = basePath.concat([i])\n\t\t\tpatches.push({\n\t\t\t\top: ADD,\n\t\t\t\tpath,\n\t\t\t\t// Need to maybe clone it, as it can in fact be the original value\n\t\t\t\t// due to the base/copy inversion at the start of this function\n\t\t\t\tvalue: clonePatchValueIfNeeded(copy_[i])\n\t\t\t})\n\t\t}\n\t\tif (base_.length < copy_.length) {\n\t\t\tinversePatches.push({\n\t\t\t\top: REPLACE,\n\t\t\t\tpath: basePath.concat([\"length\"]),\n\t\t\t\tvalue: base_.length\n\t\t\t})\n\t\t}\n\t}\n\n\t// This is used for both Map objects and normal objects.\n\tfunction generatePatchesFromAssigned(\n\t\tstate: MapState | ES5ObjectState | ProxyObjectState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tconst {base_, copy_} = state\n\t\teach(state.assigned_!, (key, assignedValue) => {\n\t\t\tconst origValue = get(base_, key)\n\t\t\tconst value = get(copy_!, key)\n\t\t\tconst op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD\n\t\t\tif (origValue === value && op === REPLACE) return\n\t\t\tconst path = basePath.concat(key as any)\n\t\t\tpatches.push(op === REMOVE ? {op, path} : {op, path, value})\n\t\t\tinversePatches.push(\n\t\t\t\top === ADD\n\t\t\t\t\t? {op: REMOVE, path}\n\t\t\t\t\t: op === REMOVE\n\t\t\t\t\t? {op: ADD, path, value: clonePatchValueIfNeeded(origValue)}\n\t\t\t\t\t: {op: REPLACE, path, value: clonePatchValueIfNeeded(origValue)}\n\t\t\t)\n\t\t})\n\t}\n\n\tfunction generateSetPatches(\n\t\tstate: SetState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tlet {base_, copy_} = state\n\n\t\tlet i = 0\n\t\tbase_.forEach((value: any) => {\n\t\t\tif (!copy_!.has(value)) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: REMOVE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t\tinversePatches.unshift({\n\t\t\t\t\top: ADD,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t}\n\t\t\ti++\n\t\t})\n\t\ti = 0\n\t\tcopy_!.forEach((value: any) => {\n\t\t\tif (!base_.has(value)) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: ADD,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t\tinversePatches.unshift({\n\t\t\t\t\top: REMOVE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t}\n\t\t\ti++\n\t\t})\n\t}\n\n\tfunction generateReplacementPatches_(\n\t\tbaseValue: any,\n\t\treplacement: any,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t): void {\n\t\tpatches.push({\n\t\t\top: REPLACE,\n\t\t\tpath: [],\n\t\t\tvalue: replacement === NOTHING ? undefined : replacement\n\t\t})\n\t\tinversePatches.push({\n\t\t\top: REPLACE,\n\t\t\tpath: [],\n\t\t\tvalue: baseValue\n\t\t})\n\t}\n\n\tfunction applyPatches_<T>(draft: T, patches: Patch[]): T {\n\t\tpatches.forEach(patch => {\n\t\t\tconst {path, op} = patch\n\n\t\t\tlet base: any = draft\n\t\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\t\tconst parentType = getArchtype(base)\n\t\t\t\tconst p = \"\" + path[i]\n\t\t\t\t// See #738, avoid prototype pollution\n\t\t\t\tif (\n\t\t\t\t\t(parentType === Archtype.Object || parentType === Archtype.Array) &&\n\t\t\t\t\t(p === \"__proto__\" || p === \"constructor\")\n\t\t\t\t)\n\t\t\t\t\tdie(24)\n\t\t\t\tif (typeof base === \"function\" && p === \"prototype\") die(24)\n\t\t\t\tbase = get(base, p)\n\t\t\t\tif (typeof base !== \"object\") die(15, path.join(\"/\"))\n\t\t\t}\n\n\t\t\tconst type = getArchtype(base)\n\t\t\tconst value = deepClonePatchValue(patch.value) // used to clone patch to ensure original patch is not modified, see #411\n\t\t\tconst key = path[path.length - 1]\n\t\t\tswitch (op) {\n\t\t\t\tcase REPLACE:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase Archtype.Map:\n\t\t\t\t\t\t\treturn base.set(key, value)\n\t\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\t\tcase Archtype.Set:\n\t\t\t\t\t\t\tdie(16)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// if value is an object, then it's assigned by reference\n\t\t\t\t\t\t\t// in the following add or remove ops, the value field inside the patch will also be modifyed\n\t\t\t\t\t\t\t// so we use value from the cloned patch\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\treturn (base[key] = value)\n\t\t\t\t\t}\n\t\t\t\tcase ADD:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase Archtype.Array:\n\t\t\t\t\t\t\treturn key === \"-\"\n\t\t\t\t\t\t\t\t? base.push(value)\n\t\t\t\t\t\t\t\t: base.splice(key as any, 0, value)\n\t\t\t\t\t\tcase Archtype.Map:\n\t\t\t\t\t\t\treturn base.set(key, value)\n\t\t\t\t\t\tcase Archtype.Set:\n\t\t\t\t\t\t\treturn base.add(value)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn (base[key] = value)\n\t\t\t\t\t}\n\t\t\t\tcase REMOVE:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase Archtype.Array:\n\t\t\t\t\t\t\treturn base.splice(key as any, 1)\n\t\t\t\t\t\tcase Archtype.Map:\n\t\t\t\t\t\t\treturn base.delete(key)\n\t\t\t\t\t\tcase Archtype.Set:\n\t\t\t\t\t\t\treturn base.delete(patch.value)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn delete base[key]\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tdie(17, op)\n\t\t\t}\n\t\t})\n\n\t\treturn draft\n\t}\n\n\t// optimize: this is quite a performance hit, can we detect intelligently when it is needed?\n\t// E.g. auto-draft when new objects from outside are assigned and modified?\n\t// (See failing test when deepClone just returns obj)\n\tfunction deepClonePatchValue<T>(obj: T): T\n\tfunction deepClonePatchValue(obj: any) {\n\t\tif (!isDraftable(obj)) return obj\n\t\tif (Array.isArray(obj)) return obj.map(deepClonePatchValue)\n\t\tif (isMap(obj))\n\t\t\treturn new Map(\n\t\t\t\tArray.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n\t\t\t)\n\t\tif (isSet(obj)) return new Set(Array.from(obj).map(deepClonePatchValue))\n\t\tconst cloned = Object.create(Object.getPrototypeOf(obj))\n\t\tfor (const key in obj) cloned[key] = deepClonePatchValue(obj[key])\n\t\tif (has(obj, immerable)) cloned[immerable] = obj[immerable]\n\t\treturn cloned\n\t}\n\n\tfunction clonePatchValueIfNeeded<T>(obj: T): T {\n\t\tif (isDraft(obj)) {\n\t\t\treturn deepClonePatchValue(obj)\n\t\t} else return obj\n\t}\n\n\tloadPlugin(\"Patches\", {\n\t\tapplyPatches_,\n\t\tgeneratePatches_,\n\t\tgenerateReplacementPatches_\n\t})\n}\n","// types only!\nimport {\n\tImmerState,\n\tAnyMap,\n\tAnySet,\n\tMapState,\n\tSetState,\n\tDRAFT_STATE,\n\tgetCurrentScope,\n\tlatest,\n\titeratorSymbol,\n\tisDraftable,\n\tcreateProxy,\n\tloadPlugin,\n\tmarkChanged,\n\tProxyType,\n\tdie,\n\teach\n} from \"../internal\"\n\nexport function enableMapSet() {\n\t/* istanbul ignore next */\n\tvar extendStatics = function(d: any, b: any): any {\n\t\textendStatics =\n\t\t\tObject.setPrototypeOf ||\n\t\t\t({__proto__: []} instanceof Array &&\n\t\t\t\tfunction(d, b) {\n\t\t\t\t\td.__proto__ = b\n\t\t\t\t}) ||\n\t\t\tfunction(d, b) {\n\t\t\t\tfor (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]\n\t\t\t}\n\t\treturn extendStatics(d, b)\n\t}\n\n\t// Ugly hack to resolve #502 and inherit built in Map / Set\n\tfunction __extends(d: any, b: any): any {\n\t\textendStatics(d, b)\n\t\tfunction __(this: any): any {\n\t\t\tthis.constructor = d\n\t\t}\n\t\td.prototype =\n\t\t\t// @ts-ignore\n\t\t\t((__.prototype = b.prototype), new __())\n\t}\n\n\tconst DraftMap = (function(_super) {\n\t\t__extends(DraftMap, _super)\n\t\t// Create class manually, cause #502\n\t\tfunction DraftMap(this: any, target: AnyMap, parent?: ImmerState): any {\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ProxyType.Map,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tassigned_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this as any,\n\t\t\t\tisManual_: false,\n\t\t\t\trevoked_: false\n\t\t\t} as MapState\n\t\t\treturn this\n\t\t}\n\t\tconst p = DraftMap.prototype\n\n\t\tObject.defineProperty(p, \"size\", {\n\t\t\tget: function() {\n\t\t\t\treturn latest(this[DRAFT_STATE]).size\n\t\t\t}\n\t\t\t// enumerable: false,\n\t\t\t// configurable: true\n\t\t})\n\n\t\tp.has = function(key: any): boolean {\n\t\t\treturn latest(this[DRAFT_STATE]).has(key)\n\t\t}\n\n\t\tp.set = function(key: any, value: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!latest(state).has(key) || latest(state).get(key) !== value) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t\tstate.copy_!.set(key, value)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tp.delete = function(key: any): boolean {\n\t\t\tif (!this.has(key)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareMapCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\tif (state.base_.has(key)) {\n\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t} else {\n\t\t\t\tstate.assigned_!.delete(key)\n\t\t\t}\n\t\t\tstate.copy_!.delete(key)\n\t\t\treturn true\n\t\t}\n\n\t\tp.clear = function() {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_ = new Map()\n\t\t\t\teach(state.base_, key => {\n\t\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t\t})\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tp.forEach = function(\n\t\t\tcb: (value: any, key: any, self: any) => void,\n\t\t\tthisArg?: any\n\t\t) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tlatest(state).forEach((_value: any, key: any, _map: any) => {\n\t\t\t\tcb.call(thisArg, this.get(key), key, this)\n\t\t\t})\n\t\t}\n\n\t\tp.get = function(key: any): any {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tconst value = latest(state).get(key)\n\t\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif (value !== state.base_.get(key)) {\n\t\t\t\treturn value // either already drafted or reassigned\n\t\t\t}\n\t\t\t// despite what it looks, this creates a draft only once, see above condition\n\t\t\tconst draft = createProxy(state.scope_.immer_, value, state)\n\t\t\tprepareMapCopy(state)\n\t\t\tstate.copy_!.set(key, draft)\n\t\t\treturn draft\n\t\t}\n\n\t\tp.keys = function(): IterableIterator<any> {\n\t\t\treturn latest(this[DRAFT_STATE]).keys()\n\t\t}\n\n\t\tp.values = function(): IterableIterator<any> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn {\n\t\t\t\t[iteratorSymbol]: () => this.values(),\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} as any\n\t\t}\n\n\t\tp.entries = function(): IterableIterator<[any, any]> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn {\n\t\t\t\t[iteratorSymbol]: () => this.entries(),\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue: [r.value, value]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} as any\n\t\t}\n\n\t\tp[iteratorSymbol] = function() {\n\t\t\treturn this.entries()\n\t\t}\n\n\t\treturn DraftMap\n\t})(Map)\n\n\tfunction proxyMap_<T extends AnyMap>(target: T, parent?: ImmerState): T {\n\t\t// @ts-ignore\n\t\treturn new DraftMap(target, parent)\n\t}\n\n\tfunction prepareMapCopy(state: MapState) {\n\t\tif (!state.copy_) {\n\t\t\tstate.assigned_ = new Map()\n\t\t\tstate.copy_ = new Map(state.base_)\n\t\t}\n\t}\n\n\tconst DraftSet = (function(_super) {\n\t\t__extends(DraftSet, _super)\n\t\t// Create class manually, cause #502\n\t\tfunction DraftSet(this: any, target: AnySet, parent?: ImmerState) {\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ProxyType.Set,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this,\n\t\t\t\tdrafts_: new Map(),\n\t\t\t\trevoked_: false,\n\t\t\t\tisManual_: false\n\t\t\t} as SetState\n\t\t\treturn this\n\t\t}\n\t\tconst p = DraftSet.prototype\n\n\t\tObject.defineProperty(p, \"size\", {\n\t\t\tget: function() {\n\t\t\t\treturn latest(this[DRAFT_STATE]).size\n\t\t\t}\n\t\t\t// enumerable: true,\n\t\t})\n\n\t\tp.has = function(value: any): boolean {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\t// bit of trickery here, to be able to recognize both the value, and the draft of its value\n\t\t\tif (!state.copy_) {\n\t\t\t\treturn state.base_.has(value)\n\t\t\t}\n\t\t\tif (state.copy_.has(value)) return true\n\t\t\tif (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n\t\t\t\treturn true\n\t\t\treturn false\n\t\t}\n\n\t\tp.add = function(value: any): any {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!this.has(value)) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.add(value)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tp.delete = function(value: any): any {\n\t\t\tif (!this.has(value)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\treturn (\n\t\t\t\tstate.copy_!.delete(value) ||\n\t\t\t\t(state.drafts_.has(value)\n\t\t\t\t\t? state.copy_!.delete(state.drafts_.get(value))\n\t\t\t\t\t: /* istanbul ignore next */ false)\n\t\t\t)\n\t\t}\n\n\t\tp.clear = function() {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tp.values = function(): IterableIterator<any> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.values()\n\t\t}\n\n\t\tp.entries = function entries(): IterableIterator<[any, any]> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.entries()\n\t\t}\n\n\t\tp.keys = function(): IterableIterator<any> {\n\t\t\treturn this.values()\n\t\t}\n\n\t\tp[iteratorSymbol] = function() {\n\t\t\treturn this.values()\n\t\t}\n\n\t\tp.forEach = function forEach(cb: any, thisArg?: any) {\n\t\t\tconst iterator = this.values()\n\t\t\tlet result = iterator.next()\n\t\t\twhile (!result.done) {\n\t\t\t\tcb.call(thisArg, result.value, result.value, this)\n\t\t\t\tresult = iterator.next()\n\t\t\t}\n\t\t}\n\n\t\treturn DraftSet\n\t})(Set)\n\n\tfunction proxySet_<T extends AnySet>(target: T, parent?: ImmerState): T {\n\t\t// @ts-ignore\n\t\treturn new DraftSet(target, parent)\n\t}\n\n\tfunction prepareSetCopy(state: SetState) {\n\t\tif (!state.copy_) {\n\t\t\t// create drafts for all entries to preserve insertion order\n\t\t\tstate.copy_ = new Set()\n\t\t\tstate.base_.forEach(value => {\n\t\t\t\tif (isDraftable(value)) {\n\t\t\t\t\tconst draft = createProxy(state.scope_.immer_, value, state)\n\t\t\t\t\tstate.drafts_.set(value, draft)\n\t\t\t\t\tstate.copy_!.add(draft)\n\t\t\t\t} else {\n\t\t\t\t\tstate.copy_!.add(value)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction assertUnrevoked(state: any /*ES5State | MapState | SetState*/) {\n\t\tif (state.revoked_) die(3, JSON.stringify(latest(state)))\n\t}\n\n\tloadPlugin(\"MapSet\", {proxyMap_, proxySet_})\n}\n","import {enableES5} from \"./es5\"\nimport {enableMapSet} from \"./mapset\"\nimport {enablePatches} from \"./patches\"\n\nexport function enableAllPlugins() {\n\tenableES5()\n\tenableMapSet()\n\tenablePatches()\n}\n","import {\n\tIProduce,\n\tIProduceWithPatches,\n\tImmer,\n\tDraft,\n\tImmutable\n} from \"./internal\"\n\nexport {\n\tDraft,\n\tImmutable,\n\tPatch,\n\tPatchListener,\n\toriginal,\n\tcurrent,\n\tisDraft,\n\tisDraftable,\n\tNOTHING as nothing,\n\tDRAFTABLE as immerable,\n\tfreeze\n} from \"./internal\"\n\nconst immer = new Immer()\n\n/**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\nexport const produce: IProduce = immer.produce\nexport default produce\n\n/**\n * Like `produce`, but `produceWithPatches` always returns a tuple\n * [nextState, patches, inversePatches] (instead of just the next state)\n */\nexport const produceWithPatches: IProduceWithPatches = immer.produceWithPatches.bind(\n\timmer\n)\n\n/**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * Always freeze by default, even in production mode\n */\nexport const setAutoFreeze = immer.setAutoFreeze.bind(immer)\n\n/**\n * Pass true to use the ES2015 `Proxy` class when creating drafts, which is\n * always faster than using ES5 proxies.\n *\n * By default, feature detection is used, so calling this is rarely necessary.\n */\nexport const setUseProxies = immer.setUseProxies.bind(immer)\n\n/**\n * Apply an array of Immer patches to the first argument.\n *\n * This function is a producer, which means copy-on-write is in effect.\n */\nexport const applyPatches = immer.applyPatches.bind(immer)\n\n/**\n * Create an Immer draft from the given base state, which may be a draft itself.\n * The draft can be modified until you finalize it with the `finishDraft` function.\n */\nexport const createDraft = immer.createDraft.bind(immer)\n\n/**\n * Finalize an Immer draft from a `createDraft` call, returning the base state\n * (if no changes were made) or a modified copy. The draft must *not* be\n * mutated afterwards.\n *\n * Pass a function as the 2nd argument to generate Immer patches based on the\n * changes that were made.\n */\nexport const finishDraft = immer.finishDraft.bind(immer)\n\n/**\n * This function is actually a no-op, but can be used to cast an immutable type\n * to an draft type and make TypeScript happy\n *\n * @param value\n */\nexport function castDraft<T>(value: T): Draft<T> {\n\treturn value as any\n}\n\n/**\n * This function is actually a no-op, but can be used to cast a mutable type\n * to an immutable type and make TypeScript happy\n * @param value\n */\nexport function castImmutable<T>(value: T): Immutable<T> {\n\treturn value as any\n}\n\nexport {Immer}\n\nexport {enableES5} from \"./plugins/es5\"\nexport {enablePatches} from \"./plugins/patches\"\nexport {enableMapSet} from \"./plugins/mapset\"\nexport {enableAllPlugins} from \"./plugins/all\"\n","// Should be no imports here!\n\n// Some things that should be evaluated before all else...\n\n// We only want to know if non-polyfilled symbols are available\nconst hasSymbol =\n\ttypeof Symbol !== \"undefined\" && typeof Symbol(\"x\") === \"symbol\"\nexport const hasMap = typeof Map !== \"undefined\"\nexport const hasSet = typeof Set !== \"undefined\"\nexport const hasProxies =\n\ttypeof Proxy !== \"undefined\" &&\n\ttypeof Proxy.revocable !== \"undefined\" &&\n\ttypeof Reflect !== \"undefined\"\n\n/**\n * The sentinel value returned by producers to replace the draft with undefined.\n */\nexport const NOTHING: Nothing = hasSymbol\n\t? Symbol.for(\"immer-nothing\")\n\t: ({[\"immer-nothing\"]: true} as any)\n\n/**\n * To let Immer treat your class instances as plain immutable objects\n * (albeit with a custom prototype), you must define either an instance property\n * or a static property on each of your custom classes.\n *\n * Otherwise, your class instance will never be drafted, which means it won't be\n * safe to mutate in a produce callback.\n */\nexport const DRAFTABLE: unique symbol = hasSymbol\n\t? Symbol.for(\"immer-draftable\")\n\t: (\"__$immer_draftable\" as any)\n\nexport const DRAFT_STATE: unique symbol = hasSymbol\n\t? Symbol.for(\"immer-state\")\n\t: (\"__$immer_state\" as any)\n\n// Even a polyfilled Symbol might provide Symbol.iterator\nexport const iteratorSymbol: typeof Symbol.iterator =\n\t(typeof Symbol != \"undefined\" && Symbol.iterator) || (\"@@iterator\" as any)\n\n/** Use a class type for `nothing` so its type is unique */\nexport class Nothing {\n\t// This lets us do `Exclude<T, Nothing>`\n\t// @ts-ignore\n\tprivate _!: unique symbol\n}\n","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...a) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...a);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","/**\n * Ponyfill of the HTMLFormElement.requestSubmit() method.\n * Based on polyfill from: https://github.com/javan/form-request-submit-polyfill/blob/main/form-request-submit-polyfill.js\n */\nexport const requestSubmit = (\n element: HTMLFormElement,\n submitter?: HTMLElement\n) => {\n // In vitest, let's test the polyfill.\n // Cypress will test the native implementation by nature of using chrome.\n if (\n typeof Object.getPrototypeOf(element).requestSubmit === \"function\" &&\n !import.meta.vitest\n ) {\n element.requestSubmit(submitter);\n return;\n }\n\n if (submitter) {\n validateSubmitter(element, submitter);\n submitter.click();\n return;\n }\n\n const dummySubmitter = document.createElement(\"input\");\n dummySubmitter.type = \"submit\";\n dummySubmitter.hidden = true;\n element.appendChild(dummySubmitter);\n dummySubmitter.click();\n element.removeChild(dummySubmitter);\n};\n\nfunction validateSubmitter(element: HTMLFormElement, submitter: HTMLElement) {\n // Should be redundant, but here for completeness\n const isHtmlElement = submitter instanceof HTMLElement;\n if (!isHtmlElement) {\n raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n }\n\n const hasSubmitType =\n \"type\" in submitter && (submitter as HTMLInputElement).type === \"submit\";\n if (!hasSubmitType)\n raise(TypeError, \"The specified element is not a submit button\");\n\n const isForCorrectForm =\n \"form\" in submitter && (submitter as HTMLInputElement).form === element;\n if (!isForCorrectForm)\n raise(\n DOMException,\n \"The specified element is not owned by this form element\",\n \"NotFoundError\"\n );\n}\n\ninterface ErrorConstructor {\n new (message: string, name?: string): Error;\n}\n\nfunction raise(\n errorConstructor: ErrorConstructor,\n message: string,\n name?: string\n): never {\n throw new errorConstructor(\n \"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\",\n name\n );\n}\n\nif (import.meta.vitest) {\n const { it, expect } = import.meta.vitest;\n it(\"should validate the submitter\", () => {\n const form = document.createElement(\"form\");\n document.body.appendChild(form);\n\n const submitter = document.createElement(\"input\");\n expect(() => validateSubmitter(null as any, null as any)).toThrow();\n expect(() => validateSubmitter(form, null as any)).toThrow();\n expect(() => validateSubmitter(form, submitter)).toThrow();\n expect(() =>\n validateSubmitter(form, document.createElement(\"div\"))\n ).toThrow();\n\n submitter.type = \"submit\";\n expect(() => validateSubmitter(form, submitter)).toThrow();\n\n form.appendChild(submitter);\n expect(() => validateSubmitter(form, submitter)).not.toThrow();\n\n form.removeChild(submitter);\n expect(() => validateSubmitter(form, submitter)).toThrow();\n\n document.body.appendChild(submitter);\n form.id = \"test-form\";\n submitter.setAttribute(\"form\", \"test-form\");\n expect(() => validateSubmitter(form, submitter)).not.toThrow();\n\n const button = document.createElement(\"button\");\n button.type = \"submit\";\n form.appendChild(button);\n expect(() => validateSubmitter(form, button)).not.toThrow();\n });\n}\n","import { getPath, setPath } from \"set-get\";\nimport invariant from \"tiny-invariant\";\n\n////\n// All of these array helpers are written in a way that mutates the original array.\n// This is because we're working with immer.\n////\n\nexport const getArray = (values: any, field: string): unknown[] => {\n const value = getPath(values, field);\n if (value === undefined || value === null) {\n const newValue: unknown[] = [];\n setPath(values, field, newValue);\n return newValue;\n }\n invariant(\n Array.isArray(value),\n `FieldArray: defaultValue value for ${field} must be an array, null, or undefined`\n );\n return value;\n};\n\nexport const sparseCopy = <T>(array: T[]): T[] => array.slice();\n\nexport const swap = (array: unknown[], indexA: number, indexB: number) => {\n const itemA = array[indexA];\n const itemB = array[indexB];\n\n const hasItemA = indexA in array;\n const hasItemB = indexB in array;\n\n // If we're dealing with a sparse array (i.e. one of the indeces doesn't exist),\n // we should keep it sparse\n if (hasItemA) {\n array[indexB] = itemA;\n } else {\n delete array[indexB];\n }\n\n if (hasItemB) {\n array[indexA] = itemB;\n } else {\n delete array[indexA];\n }\n};\n\n// A splice that can handle sparse arrays\nfunction sparseSplice(\n array: unknown[],\n start: number,\n deleteCount?: number,\n item?: unknown\n) {\n // Inserting an item into an array won't behave as we need it to if the array isn't\n // at least as long as the start index. We can force the array to be long enough like this.\n if (array.length < start && item) {\n array.length = start;\n }\n\n // If we just pass item in, it'll be undefined and splice will delete the item.\n if (arguments.length === 4) return array.splice(start, deleteCount!, item);\n else if (arguments.length === 3) return array.splice(start, deleteCount);\n return array.splice(start);\n}\n\nexport const move = (array: unknown[], from: number, to: number) => {\n const [item] = sparseSplice(array, from, 1);\n sparseSplice(array, to, 0, item);\n};\n\nexport const insert = (array: unknown[], index: number, value: unknown) => {\n sparseSplice(array, index, 0, value);\n};\n\nexport const insertEmpty = (array: unknown[], index: number) => {\n const tail = sparseSplice(array, index);\n tail.forEach((item, i) => {\n sparseSplice(array, index + i + 1, 0, item);\n });\n};\n\nexport const remove = (array: unknown[], index: number) => {\n sparseSplice(array, index, 1);\n};\n\nexport const replace = (array: unknown[], index: number, value: unknown) => {\n sparseSplice(array, index, 1, value);\n};\n\n/**\n * The purpose of this helper is to make it easier to update `fieldErrors` and `touchedFields`.\n * We key those objects by full paths to the fields.\n * When we're doing array mutations, that makes it difficult to update those objects.\n */\nexport const mutateAsArray = (\n field: string,\n obj: Record<string, any>,\n mutate: (arr: any[]) => void\n) => {\n const beforeKeys = new Set<string>();\n const arr: any[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(field) && key !== field) {\n beforeKeys.add(key);\n setPath(arr, key.substring(field.length), value);\n }\n }\n\n mutate(arr);\n for (const key of beforeKeys) {\n delete obj[key];\n }\n\n const newKeys = getDeepArrayPaths(arr);\n for (const key of newKeys) {\n const val = getPath(arr, key);\n if (val !== undefined) {\n obj[`${field}${key}`] = val;\n }\n }\n};\n\nconst getDeepArrayPaths = (obj: any, basePath: string = \"\"): string[] => {\n // This only needs to handle arrays and plain objects\n // and we can assume the first call is always an array.\n\n if (Array.isArray(obj)) {\n return obj.flatMap((item, index) =>\n getDeepArrayPaths(item, `${basePath}[${index}]`)\n );\n }\n\n if (typeof obj === \"object\") {\n return Object.keys(obj).flatMap((key) =>\n getDeepArrayPaths(obj[key], `${basePath}.${key}`)\n );\n }\n\n return [basePath];\n};\n\nif (import.meta.vitest) {\n const { describe, expect, it } = import.meta.vitest;\n\n // Count the actual number of items in the array\n // instead of just getting the length.\n // This is useful for validating that sparse arrays are handled correctly.\n const countArrayItems = (arr: any[]) => {\n let count = 0;\n arr.forEach(() => count++);\n return count;\n };\n\n describe(\"getArray\", () => {\n it(\"shoud get a deeply nested array that can be mutated to update the nested value\", () => {\n const values = {\n d: [\n { foo: \"bar\", baz: [true, false] },\n { e: true, f: \"hi\" },\n ],\n };\n const result = getArray(values, \"d[0].baz\");\n const finalValues = {\n d: [\n { foo: \"bar\", baz: [true, false, true] },\n { e: true, f: \"hi\" },\n ],\n };\n\n expect(result).toEqual([true, false]);\n result.push(true);\n expect(values).toEqual(finalValues);\n });\n\n it(\"should return an empty array that can be mutated if result is null or undefined\", () => {\n const values = {};\n const result = getArray(values, \"a.foo[0].bar\");\n const finalValues = {\n a: { foo: [{ bar: [\"Bob ross\"] }] },\n };\n\n expect(result).toEqual([]);\n result.push(\"Bob ross\");\n expect(values).toEqual(finalValues);\n });\n\n it(\"should throw if the value is defined and not an array\", () => {\n const values = { foo: \"foo\" };\n expect(() => getArray(values, \"foo\")).toThrow();\n });\n });\n\n describe(\"swap\", () => {\n it(\"should swap two items\", () => {\n const array = [1, 2, 3];\n swap(array, 0, 1);\n expect(array).toEqual([2, 1, 3]);\n });\n\n it(\"should work for sparse arrays\", () => {\n // A bit of a sanity check for native array behavior\n const arr = [] as any[];\n arr[0] = true;\n swap(arr, 0, 2);\n\n expect(countArrayItems(arr)).toEqual(1);\n expect(0 in arr).toBe(false);\n expect(2 in arr).toBe(true);\n expect(arr[2]).toEqual(true);\n });\n });\n\n describe(\"move\", () => {\n it(\"should move an item to a new index\", () => {\n const array = [1, 2, 3];\n move(array, 0, 1);\n expect(array).toEqual([2, 1, 3]);\n });\n\n it(\"should work with sparse arrays\", () => {\n const array = [1];\n move(array, 0, 2);\n\n expect(countArrayItems(array)).toEqual(1);\n expect(array).toEqual([undefined, undefined, 1]);\n });\n });\n\n describe(\"insert\", () => {\n it(\"should insert an item at a new index\", () => {\n const array = [1, 2, 3];\n insert(array, 1, 4);\n expect(array).toEqual([1, 4, 2, 3]);\n });\n\n it(\"should be able to insert falsey values\", () => {\n const array = [1, 2, 3];\n insert(array, 1, null);\n expect(array).toEqual([1, null, 2, 3]);\n });\n\n it(\"should handle sparse arrays\", () => {\n const array: any[] = [];\n array[2] = true;\n insert(array, 0, true);\n\n expect(countArrayItems(array)).toEqual(2);\n expect(array).toEqual([true, undefined, undefined, true]);\n });\n });\n\n describe(\"insertEmpty\", () => {\n it(\"should insert an empty item at a given index\", () => {\n const array = [1, 2, 3];\n insertEmpty(array, 1);\n // eslint-disable-next-line no-sparse-arrays\n expect(array).toStrictEqual([1, , 2, 3]);\n expect(array).not.toStrictEqual([1, undefined, 2, 3]);\n });\n\n it(\"should work with already sparse arrays\", () => {\n // eslint-disable-next-line no-sparse-arrays\n const array = [, , 1, , 2, , 3];\n insertEmpty(array, 3);\n // eslint-disable-next-line no-sparse-arrays\n expect(array).toStrictEqual([, , 1, , , 2, , 3]);\n expect(array).not.toStrictEqual([\n undefined,\n undefined,\n 1,\n undefined,\n undefined,\n 2,\n undefined,\n 3,\n ]);\n });\n });\n\n describe(\"remove\", () => {\n it(\"should remove an item at a given index\", () => {\n const array = [1, 2, 3];\n remove(array, 1);\n expect(array).toEqual([1, 3]);\n });\n\n it(\"should handle sparse arrays\", () => {\n const array: any[] = [];\n array[2] = true;\n remove(array, 0);\n\n expect(countArrayItems(array)).toEqual(1);\n expect(array).toEqual([undefined, true]);\n });\n });\n\n describe(\"replace\", () => {\n it(\"should replace an item at a given index\", () => {\n const array = [1, 2, 3];\n replace(array, 1, 4);\n expect(array).toEqual([1, 4, 3]);\n });\n\n it(\"should handle sparse arrays\", () => {\n const array: any[] = [];\n array[2] = true;\n replace(array, 0, true);\n expect(countArrayItems(array)).toEqual(2);\n expect(array).toEqual([true, undefined, true]);\n });\n });\n\n describe(\"mutateAsArray\", () => {\n it(\"should handle swap\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[2]\": \"bar\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n swap(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0]\": \"bar\",\n \"myField[2]\": \"foo\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should swap sparse arrays\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n swap(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[2]\": \"foo\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should handle arrays with nested values\", () => {\n const values = {\n myField: \"something\",\n \"myField[0].title\": \"foo\",\n \"myField[0].note\": \"bar\",\n \"myField[2].title\": \"other\",\n \"myField[2].note\": \"other\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n swap(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0].title\": \"other\",\n \"myField[0].note\": \"other\",\n \"myField[2].title\": \"foo\",\n \"myField[2].note\": \"bar\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should handle move\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[1]\": \"bar\",\n \"myField[2]\": \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n move(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0]\": \"bar\",\n \"myField[1]\": \"baz\",\n \"myField[2]\": \"foo\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should not create keys for `undefined`\", () => {\n const values = {\n \"myField[0]\": \"foo\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n arr.unshift(undefined);\n });\n expect(Object.keys(values)).toHaveLength(1);\n expect(values).toEqual({\n \"myField[1]\": \"foo\",\n });\n });\n\n it(\"should handle remove\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[1]\": \"bar\",\n \"myField[2]\": \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n remove(arr, 1);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[1]\": \"baz\",\n \"otherField[0]\": \"something else\",\n });\n expect(\"myField[2]\" in values).toBe(false);\n });\n });\n\n describe(\"getDeepArrayPaths\", () => {\n it(\"should return all paths recursively\", () => {\n const obj = [\n true,\n true,\n [true, true],\n { foo: true, bar: { baz: true, test: [true] } },\n ];\n\n expect(getDeepArrayPaths(obj, \"myField\")).toEqual([\n \"myField[0]\",\n \"myField[1]\",\n \"myField[2][0]\",\n \"myField[2][1]\",\n \"myField[3].foo\",\n \"myField[3].bar.baz\",\n \"myField[3].bar.test[0]\",\n ]);\n });\n });\n}\n","import { FormState, useRootFormStore } from \"./createFormStore\";\nimport { InternalFormId } from \"./types\";\n\nexport const useFormStore = <T>(\n formId: InternalFormId,\n selector: (state: FormState) => T\n) => {\n return useRootFormStore((state) => selector(state.form(formId)));\n};\n","import { useCallback, useEffect } from \"react\";\nimport { InternalFormContextValue } from \"../formContext\";\nimport { useFieldDefaultValue } from \"../hooks\";\nimport { useFormStore } from \"./storeHooks\";\nimport { InternalFormId } from \"./types\";\n\nexport const useControlledFieldValue = (\n context: InternalFormContextValue,\n field: string\n) => {\n const value = useFormStore(context.formId, (state) =>\n state.controlledFields.getValue(field)\n );\n const isFormHydrated = useFormStore(\n context.formId,\n (state) => state.isHydrated\n );\n const defaultValue = useFieldDefaultValue(field, context);\n\n return isFormHydrated ? value : defaultValue;\n};\n\nexport const useRegisterControlledField = (\n context: InternalFormContextValue,\n field: string\n) => {\n const resolveUpdate = useFormStore(\n context.formId,\n (state) => state.controlledFields.valueUpdateResolvers[field]\n );\n useEffect(() => {\n resolveUpdate?.();\n }, [resolveUpdate]);\n\n const register = useFormStore(\n context.formId,\n (state) => state.controlledFields.register\n );\n const unregister = useFormStore(\n context.formId,\n (state) => state.controlledFields.unregister\n );\n useEffect(() => {\n register(field);\n return () => unregister(field);\n }, [context.formId, field, register, unregister]);\n};\n\nexport const useControllableValue = (\n context: InternalFormContextValue,\n field: string\n) => {\n useRegisterControlledField(context, field);\n\n const setControlledFieldValue = useFormStore(\n context.formId,\n (state) => state.controlledFields.setValue\n );\n const setValue = useCallback(\n (value: unknown) => setControlledFieldValue(field, value),\n [field, setControlledFieldValue]\n );\n\n const value = useControlledFieldValue(context, field);\n\n return [value, setValue] as const;\n};\n\nexport const useUpdateControllableValue = (formId: InternalFormId) => {\n const setValue = useFormStore(\n formId,\n (state) => state.controlledFields.setValue\n );\n return useCallback(\n (field: string, value: unknown) => setValue(field, value),\n [setValue]\n );\n};\n\nexport const useAwaitValue = (formId: InternalFormId) => {\n const awaitValue = useFormStore(\n formId,\n (state) => state.controlledFields.awaitValueUpdate\n );\n return useCallback((field: string) => awaitValue(field), [awaitValue]);\n};\n","import { json } from \"@remix-run/server-runtime\";\nimport {\n formDefaultValuesKey,\n FORM_DEFAULTS_FIELD,\n} from \"./internal/constants\";\nimport {\n ValidatorError,\n ValidationErrorResponseData,\n} from \"./validation/types\";\n\n/**\n * Takes the errors from a `Validator` and returns a `Response`.\n * When you return this from your action, `ValidatedForm` on the frontend will automatically\n * display the errors on the correct fields on the correct form.\n *\n * You can also provide a second argument to `validationError`\n * to specify how to repopulate the form when JS is disabled.\n *\n * @example\n * ```ts\n * const result = validator.validate(await request.formData());\n * if (result.error) return validationError(result.error, result.submittedData);\n * ```\n */\nexport function validationError(\n error: ValidatorError,\n repopulateFields?: unknown,\n init?: ResponseInit\n) {\n return json<ValidationErrorResponseData>(\n {\n fieldErrors: error.fieldErrors,\n subaction: error.subaction,\n repopulateFields,\n formId: error.formId,\n },\n { status: 422, ...init }\n );\n}\n\nexport type FormDefaults = {\n [formDefaultsKey: `${typeof FORM_DEFAULTS_FIELD}_${string}`]: any;\n};\n\n// FIXME: Remove after https://github.com/egoist/tsup/issues/813 is fixed\nexport type internal_FORM_DEFAULTS_FIELD = typeof FORM_DEFAULTS_FIELD;\n\nexport const setFormDefaults = <DataType = any>(\n formId: string,\n defaultValues: Partial<DataType>\n): FormDefaults => ({\n [formDefaultValuesKey(formId)]: defaultValues,\n});\n","import {\n FetcherWithComponents,\n Form as RemixForm,\n FormMethod,\n useSubmit,\n SubmitOptions,\n FormEncType,\n} from \"@remix-run/react\";\nimport React, {\n ComponentProps,\n FormEvent,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport * as R from \"remeda\";\nimport { useIsSubmitting, useIsValid } from \"./hooks\";\nimport { FORM_ID_FIELD } from \"./internal/constants\";\nimport {\n InternalFormContext,\n InternalFormContextValue,\n} from \"./internal/formContext\";\nimport {\n useDefaultValuesFromLoader,\n useErrorResponseForForm,\n useHasActiveFormSubmit,\n useSetFieldErrors,\n} from \"./internal/hooks\";\nimport { MultiValueMap, useMultiValueMap } from \"./internal/MultiValueMap\";\nimport {\n SyncedFormProps,\n useRootFormStore,\n} from \"./internal/state/createFormStore\";\nimport { useFormStore } from \"./internal/state/storeHooks\";\nimport { useSubmitComplete } from \"./internal/submissionCallbacks\";\nimport {\n mergeRefs,\n useDeepEqualsMemo,\n useIsomorphicLayoutEffect as useLayoutEffect,\n} from \"./internal/util\";\nimport { FieldErrors, Validator } from \"./validation/types\";\n\ntype DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\ntype SubactionData<\n DataType,\n Subaction extends string | undefined\n> = DataType & { subaction: Subaction };\n\n// Not all validation libraries support encoding a literal value in the schema type (e.g. yup).\n// This condition here allows us to provide strictness for users who are using a validation library that does support it,\n// but also allows us to support users who are using a validation library that doesn't support it.\ntype DataForSubaction<\n DataType,\n Subaction extends string | undefined\n> = Subaction extends string // Not all validation libraries support encoding a literal value in the schema type.\n ? SubactionData<DataType, Subaction> extends undefined\n ? DataType\n : SubactionData<DataType, Subaction>\n : DataType;\n\nexport type FormProps<DataType, Subaction extends string | undefined> = {\n /**\n * A `Validator` object that describes how to validate the form.\n */\n validator: Validator<DataType>;\n /**\n * A submit callback that gets called when the form is submitted\n * after all validations have been run.\n */\n onSubmit?: (\n data: DataForSubaction<DataType, Subaction>,\n event: React.FormEvent<HTMLFormElement>\n ) => void | Promise<void>;\n /**\n * Allows you to provide a `fetcher` from Remix's `useFetcher` hook.\n * The form will use the fetcher for loading states, action data, etc\n * instead of the default form action.\n */\n fetcher?: FetcherWithComponents<any>;\n /**\n * Accepts an object of default values for the form\n * that will automatically be propagated to the form fields via `useField`.\n */\n defaultValues?: DeepPartial<DataForSubaction<DataType, Subaction>>;\n /**\n * A ref to the form element.\n */\n formRef?: React.RefObject<HTMLFormElement>;\n /**\n * An optional sub-action to use for the form.\n * Setting a value here will cause the form to be submitted with an extra `subaction` value.\n * This can be useful when there are multiple forms on the screen handled by the same action.\n */\n subaction?: Subaction;\n /**\n * Reset the form to the default values after the form has been successfully submitted.\n * This is useful if you want to submit the same form multiple times,\n * and don't redirect in-between submissions.\n */\n resetAfterSubmit?: boolean;\n /**\n * Normally, the first invalid input will be focused when the validation fails on form submit.\n * Set this to `false` to disable this behavior.\n */\n disableFocusOnError?: boolean;\n} & Omit<ComponentProps<typeof RemixForm>, \"onSubmit\">;\n\nconst getDataFromForm = (el: HTMLFormElement) => new FormData(el);\n\nfunction nonNull<T>(value: T | null | undefined): value is T {\n return value !== null;\n}\n\nconst focusFirstInvalidInput = (\n fieldErrors: FieldErrors,\n customFocusHandlers: MultiValueMap<string, () => void>,\n formElement: HTMLFormElement\n) => {\n const namesInOrder = [...formElement.elements]\n .map((el) => {\n const input = el instanceof RadioNodeList ? el[0] : el;\n if (input instanceof HTMLElement && \"name\" in input)\n return (input as any).name;\n return null;\n })\n .filter(nonNull)\n .filter((name) => name in fieldErrors);\n const uniqueNamesInOrder = R.uniq(namesInOrder);\n\n for (const fieldName of uniqueNamesInOrder) {\n if (customFocusHandlers.has(fieldName)) {\n customFocusHandlers.getAll(fieldName).forEach((handler) => {\n handler();\n });\n break;\n }\n\n const elem = formElement.elements.namedItem(fieldName);\n if (!elem) continue;\n\n if (elem instanceof RadioNodeList) {\n const selectedRadio =\n [...elem]\n .filter(\n (item): item is HTMLInputElement => item instanceof HTMLInputElement\n )\n .find((item) => item.value === elem.value) ?? elem[0];\n if (selectedRadio && selectedRadio instanceof HTMLInputElement) {\n selectedRadio.focus();\n break;\n }\n }\n\n if (elem instanceof HTMLElement) {\n if (elem instanceof HTMLInputElement && elem.type === \"hidden\") {\n continue;\n }\n\n elem.focus();\n break;\n }\n }\n};\n\nconst useFormId = (providedId?: string): string | symbol => {\n // We can use a `Symbol` here because we only use it after hydration\n const [symbolId] = useState(() => Symbol(\"remix-validated-form-id\"));\n return providedId ?? symbolId;\n};\n\n/**\n * Use a component to access the state so we don't cause\n * any extra rerenders of the whole form.\n */\nconst FormResetter = ({\n resetAfterSubmit,\n formRef,\n}: {\n resetAfterSubmit: boolean;\n formRef: RefObject<HTMLFormElement>;\n}) => {\n const isSubmitting = useIsSubmitting();\n const isValid = useIsValid();\n useSubmitComplete(isSubmitting, () => {\n if (isValid && resetAfterSubmit) {\n formRef.current?.reset();\n }\n });\n return null;\n};\n\nfunction formEventProxy<T extends object>(event: T): T {\n let defaultPrevented = false;\n return new Proxy(event, {\n get: (target, prop) => {\n if (prop === \"preventDefault\") {\n return () => {\n defaultPrevented = true;\n };\n }\n\n if (prop === \"defaultPrevented\") {\n return defaultPrevented;\n }\n\n return target[prop as keyof T];\n },\n }) as T;\n}\n\ntype HTMLSubmitEvent = React.BaseSyntheticEvent<\n SubmitEvent,\n Event,\n HTMLFormElement\n>;\n\ntype HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement;\n\n/**\n * The primary form component of `remix-validated-form`.\n */\nexport function ValidatedForm<\n DataType extends { [fieldName: string]: any },\n Subaction extends string | undefined\n>({\n validator,\n onSubmit,\n children,\n fetcher,\n action,\n defaultValues: unMemoizedDefaults,\n formRef: formRefProp,\n onReset,\n subaction,\n resetAfterSubmit = false,\n disableFocusOnError,\n method,\n replace,\n id,\n preventScrollReset,\n relative,\n encType,\n ...rest\n}: FormProps<DataType, Subaction>) {\n const formId = useFormId(id);\n const providedDefaultValues = useDeepEqualsMemo(unMemoizedDefaults);\n const contextValue = useMemo<InternalFormContextValue>(\n () => ({\n formId,\n action,\n subaction,\n defaultValuesProp: providedDefaultValues,\n fetcher,\n }),\n [action, fetcher, formId, providedDefaultValues, subaction]\n );\n const backendError = useErrorResponseForForm(contextValue);\n const backendDefaultValues = useDefaultValuesFromLoader(contextValue);\n const hasActiveSubmission = useHasActiveFormSubmit(contextValue);\n const formRef = useRef<HTMLFormElement>(null);\n const Form = fetcher?.Form ?? RemixForm;\n\n const submit = useSubmit();\n const setFieldErrors = useSetFieldErrors(formId);\n const setFieldError = useFormStore(formId, (state) => state.setFieldError);\n const reset = useFormStore(formId, (state) => state.reset);\n const startSubmit = useFormStore(formId, (state) => state.startSubmit);\n const endSubmit = useFormStore(formId, (state) => state.endSubmit);\n const syncFormProps = useFormStore(formId, (state) => state.syncFormProps);\n const setFormElementInState = useFormStore(\n formId,\n (state) => state.setFormElement\n );\n const cleanupForm = useRootFormStore((state) => state.cleanupForm);\n const registerForm = useRootFormStore((state) => state.registerForm);\n\n const customFocusHandlers = useMultiValueMap<string, () => void>();\n const registerReceiveFocus: SyncedFormProps[\"registerReceiveFocus\"] =\n useCallback(\n (fieldName, handler) => {\n customFocusHandlers().add(fieldName, handler);\n return () => {\n customFocusHandlers().remove(fieldName, handler);\n };\n },\n [customFocusHandlers]\n );\n\n // TODO: all these hooks running at startup cause extra, unnecessary renders\n // There must be a nice way to avoid this.\n useLayoutEffect(() => {\n registerForm(formId);\n return () => cleanupForm(formId);\n }, [cleanupForm, formId, registerForm]);\n\n useLayoutEffect(() => {\n syncFormProps({\n action,\n defaultValues: providedDefaultValues ?? backendDefaultValues ?? {},\n subaction,\n registerReceiveFocus,\n validator,\n });\n }, [\n action,\n providedDefaultValues,\n registerReceiveFocus,\n subaction,\n syncFormProps,\n backendDefaultValues,\n validator,\n ]);\n\n useLayoutEffect(() => {\n setFormElementInState(formRef.current);\n }, [setFormElementInState]);\n\n useEffect(() => {\n setFieldErrors(backendError?.fieldErrors ?? {});\n if (!disableFocusOnError && backendError?.fieldErrors) {\n focusFirstInvalidInput(\n backendError.fieldErrors,\n customFocusHandlers(),\n formRef.current!\n );\n }\n }, [\n backendError?.fieldErrors,\n customFocusHandlers,\n disableFocusOnError,\n setFieldErrors,\n setFieldError,\n ]);\n\n useSubmitComplete(hasActiveSubmission, () => {\n endSubmit();\n });\n\n const handleSubmit = async (\n e: FormEvent<HTMLFormElement>,\n target: typeof e.currentTarget,\n nativeEvent: HTMLSubmitEvent[\"nativeEvent\"]\n ) => {\n startSubmit();\n const submitter = nativeEvent.submitter as HTMLFormSubmitter | null;\n const formMethod = (submitter?.formMethod as FormMethod) || method;\n const formData = getDataFromForm(target);\n if (submitter?.name) {\n formData.append(submitter.name, submitter.value);\n }\n\n const result = await validator.validate(formData);\n if (result.error) {\n setFieldErrors(result.error.fieldErrors);\n endSubmit();\n if (!disableFocusOnError) {\n focusFirstInvalidInput(\n result.error.fieldErrors,\n customFocusHandlers(),\n formRef.current!\n );\n }\n } else {\n setFieldErrors({});\n const eventProxy = formEventProxy(e);\n await onSubmit?.(result.data as any, eventProxy);\n if (eventProxy.defaultPrevented) {\n endSubmit();\n return;\n }\n\n const opts: SubmitOptions = {\n method: formMethod,\n replace,\n preventScrollReset,\n relative,\n action,\n encType: encType as FormEncType | undefined,\n };\n\n // We deviate from the Remix code here a bit because of our async submit.\n // In Remix's `FormImpl`, they use `event.currentTarget` to get the form,\n // but we already have the form in `formRef.current` so we can just use that.\n // If we use `event.currentTarget` here, it will break because `currentTarget`\n // will have changed since the start of the submission.\n if (fetcher) fetcher.submit(formData, opts);\n else submit(formData, opts);\n }\n };\n\n return (\n <Form\n ref={mergeRefs([formRef, formRefProp])}\n {...rest}\n id={id}\n action={action}\n method={method}\n encType={encType}\n replace={replace}\n preventScrollReset={preventScrollReset}\n relative={relative}\n onSubmit={(e) => {\n e.preventDefault();\n handleSubmit(\n e,\n e.currentTarget,\n (e as unknown as HTMLSubmitEvent).nativeEvent\n );\n }}\n onReset={(event) => {\n onReset?.(event);\n if (event.defaultPrevented) return;\n reset();\n }}\n >\n <InternalFormContext.Provider value={contextValue}>\n <>\n <FormResetter formRef={formRef} resetAfterSubmit={resetAfterSubmit} />\n {subaction && (\n <input type=\"hidden\" value={subaction} name=\"subaction\" />\n )}\n {id && <input type=\"hidden\" value={id} name={FORM_ID_FIELD} />}\n {children}\n </>\n </InternalFormContext.Provider>\n </Form>\n );\n}\n","import { useCallback, useRef } from \"react\";\n\nexport class MultiValueMap<Key, Value> {\n private dict: Map<Key, Value[]> = new Map();\n\n add = (key: Key, value: Value) => {\n if (this.dict.has(key)) {\n this.dict.get(key)!.push(value);\n } else {\n this.dict.set(key, [value]);\n }\n };\n\n delete = (key: Key) => {\n this.dict.delete(key);\n };\n\n remove = (key: Key, value: Value) => {\n if (!this.dict.has(key)) return;\n const array = this.dict.get(key)!;\n const index = array.indexOf(value);\n if (index !== -1) array.splice(index, 1);\n if (array.length === 0) this.dict.delete(key);\n };\n\n getAll = (key: Key): Value[] => {\n return this.dict.get(key) ?? [];\n };\n\n entries = (): IterableIterator<[Key, Value[]]> => this.dict.entries();\n\n values = (): IterableIterator<Value[]> => this.dict.values();\n\n has = (key: Key): boolean => this.dict.has(key);\n}\n\nexport const useMultiValueMap = <Key, Value>() => {\n const ref = useRef<MultiValueMap<Key, Value> | null>(null);\n return useCallback(() => {\n if (ref.current) return ref.current;\n ref.current = new MultiValueMap();\n return ref.current;\n }, []);\n};\n","import { useEffect, useRef } from \"react\";\n\nexport function useSubmitComplete(isSubmitting: boolean, callback: () => void) {\n const isPending = useRef(false);\n useEffect(() => {\n if (isSubmitting) {\n isPending.current = true;\n }\n\n if (!isSubmitting && isPending.current) {\n isPending.current = false;\n callback();\n }\n });\n}\n","import type React from \"react\";\nimport { useEffect, useLayoutEffect, useRef } from \"react\";\nimport * as R from \"remeda\";\n\nexport const omit = (obj: any, ...keys: string[]) => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const mergeRefs = <T = any>(\n refs: Array<React.MutableRefObject<T> | React.LegacyRef<T> | undefined>\n): React.RefCallback<T> => {\n return (value: T) => {\n refs.filter(Boolean).forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n};\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport const useDeepEqualsMemo = <T>(item: T): T => {\n const ref = useRef<T>(item);\n const areEqual = ref.current === item || R.equals(ref.current, item);\n useEffect(() => {\n if (!areEqual) {\n ref.current = item;\n }\n });\n return areEqual ? ref.current : item;\n};\n","import * as R from \"remeda\";\nimport { CreateValidatorArg, GenericObject, Validator } from \"..\";\nimport { FORM_ID_FIELD } from \"../internal/constants\";\nimport { objectFromPathEntries } from \"../internal/flatten\";\n\nconst preprocessFormData = (data: GenericObject | FormData): GenericObject => {\n // A slightly janky way of determining if the data is a FormData object\n // since node doesn't really have FormData\n if (\"entries\" in data && typeof data.entries === \"function\")\n return objectFromPathEntries([...data.entries()]);\n return objectFromPathEntries(Object.entries(data));\n};\n\nconst omitInternalFields = (data: GenericObject): GenericObject =>\n R.omit(data, [FORM_ID_FIELD]);\n\n/**\n * Used to create a validator for a form.\n * It provides built-in handling for unflattening nested objects and\n * extracting the values from FormData.\n */\nexport function createValidator<T>(\n validator: CreateValidatorArg<T>\n): Validator<T> {\n return {\n validate: async (value) => {\n const data = preprocessFormData(value);\n const result = await validator.validate(omitInternalFields(data));\n\n if (result.error) {\n return {\n data: undefined,\n error: {\n fieldErrors: result.error,\n subaction: data.subaction,\n formId: data[FORM_ID_FIELD],\n },\n submittedData: data,\n formId: data[FORM_ID_FIELD],\n };\n }\n\n return {\n data: result.data,\n error: undefined,\n submittedData: data,\n formId: data[FORM_ID_FIELD],\n };\n },\n validateField: (data: GenericObject | FormData, field: string) =>\n validator.validateField(preprocessFormData(data), field),\n };\n}\n","import { setPath } from \"set-get\";\nimport { MultiValueMap } from \"./MultiValueMap\";\n\nexport const objectFromPathEntries = (entries: [string, any][]) => {\n const map = new MultiValueMap<string, any>();\n entries.forEach(([key, value]) => map.add(key, value));\n return [...map.entries()].reduce(\n (acc, [key, value]) =>\n setPath(acc, key, value.length === 1 ? value[0] : value),\n {} as Record<string, any>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport {\n useInternalFormContext,\n useRegisterReceiveFocus,\n} from \"./internal/hooks\";\nimport { useFormHelpers, useFormState } from \"./unreleased/formStateHooks\";\nimport {\n FieldErrors,\n TouchedFields,\n ValidationResult,\n} from \"./validation/types\";\n\nexport type FormContextValue = {\n /**\n * All the errors in all the fields in the form.\n */\n fieldErrors: FieldErrors;\n /**\n * Clear the errors of the specified fields.\n */\n clearError: (...names: string[]) => void;\n /**\n * Validate the specified field.\n */\n validateField: (fieldName: string) => Promise<string | null>;\n /**\n * The `action` prop of the form.\n */\n action?: string;\n /**\n * The `subaction` prop of the form.\n */\n subaction?: string;\n /**\n * Whether or not the form is submitting.\n */\n isSubmitting: boolean;\n /**\n * Whether or not a submission has been attempted.\n * This is true once the form has been submitted, even if there were validation errors.\n * Resets to false when the form is reset.\n */\n hasBeenSubmitted: boolean;\n /**\n * Whether or not the form is valid.\n */\n isValid: boolean;\n /**\n * The default values of the form.\n */\n defaultValues?: { [fieldName: string]: any };\n /**\n * Register a custom focus handler to be used when\n * the field needs to receive focus due to a validation error.\n */\n registerReceiveFocus: (fieldName: string, handler: () => void) => () => void;\n /**\n * Any fields that have been touched by the user.\n */\n touchedFields: TouchedFields;\n /**\n * Change the touched state of the specified field.\n */\n setFieldTouched: (fieldName: string, touched: boolean) => void;\n /**\n * Validate the whole form and populate any errors.\n */\n validate: () => Promise<ValidationResult<unknown>>;\n /**\n * Clears all errors on the form.\n */\n clearAllErrors: () => void;\n /**\n * Resets the form.\n *\n * _Note_: The equivalent behavior can be achieved by calling formElement.reset()\n * or clicking a button element with `type=\"reset\"`.\n */\n reset: () => void;\n /**\n * Submits the form, running all validations first.\n *\n * _Note_: This is equivalent to clicking a button element with `type=\"submit\"` or calling formElement.submit().\n */\n submit: () => void;\n /**\n * Returns the current form values as FormData\n */\n getValues: () => FormData;\n};\n\n/**\n * Provides access to some of the internal state of the form.\n */\nexport const useFormContext = (formId?: string): FormContextValue => {\n // Try to access context so we get our error specific to this hook if it's not there\n const context = useInternalFormContext(formId, \"useFormContext\");\n const state = useFormState(formId);\n const {\n clearError: internalClearError,\n setTouched,\n validateField,\n clearAllErrors,\n validate,\n reset,\n submit,\n getValues,\n } = useFormHelpers(formId);\n\n const registerReceiveFocus = useRegisterReceiveFocus(context.formId);\n\n const clearError = useCallback(\n (...names: string[]) => {\n names.forEach((name) => {\n internalClearError(name);\n });\n },\n [internalClearError]\n );\n\n return useMemo(\n () => ({\n ...state,\n setFieldTouched: setTouched,\n validateField,\n clearError,\n registerReceiveFocus,\n clearAllErrors,\n validate,\n reset,\n submit,\n getValues,\n }),\n [\n clearAllErrors,\n clearError,\n registerReceiveFocus,\n reset,\n setTouched,\n state,\n submit,\n validate,\n validateField,\n getValues,\n ]\n );\n};\n","import { useMemo } from \"react\";\nimport {} from \"../internal/getInputProps\";\nimport {\n useInternalFormContext,\n useClearError,\n useSetTouched,\n useDefaultValuesForForm,\n useFieldErrorsForForm,\n useInternalIsSubmitting,\n useInternalHasBeenSubmitted,\n useTouchedFields,\n useInternalIsValid,\n useFieldErrors,\n useValidate,\n useSetFieldErrors,\n useResetFormElement,\n useSyncedDefaultValues,\n useFormActionProp,\n useFormSubactionProp,\n useSubmitForm,\n useFormValues,\n useSmartValidate,\n} from \"../internal/hooks\";\nimport {\n FieldErrors,\n TouchedFields,\n ValidationResult,\n} from \"../validation/types\";\n\nexport type FormState = {\n fieldErrors: FieldErrors;\n isSubmitting: boolean;\n hasBeenSubmitted: boolean;\n touchedFields: TouchedFields;\n defaultValues: { [fieldName: string]: any };\n action?: string;\n subaction?: string;\n isValid: boolean;\n};\n\n/**\n * Returns information about the form.\n *\n * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.\n */\nexport const useFormState = (formId?: string): FormState => {\n const formContext = useInternalFormContext(formId, \"useFormState\");\n const isSubmitting = useInternalIsSubmitting(formContext.formId);\n const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);\n const touchedFields = useTouchedFields(formContext.formId);\n const isValid = useInternalIsValid(formContext.formId);\n const action = useFormActionProp(formContext.formId);\n const subaction = useFormSubactionProp(formContext.formId);\n\n const syncedDefaultValues = useSyncedDefaultValues(formContext.formId);\n const defaultValuesToUse = useDefaultValuesForForm(formContext);\n const hydratedDefaultValues =\n defaultValuesToUse.hydrateTo(syncedDefaultValues);\n\n const fieldErrorsFromState = useFieldErrors(formContext.formId);\n const fieldErrorsToUse = useFieldErrorsForForm(formContext);\n const hydratedFieldErrors = fieldErrorsToUse.hydrateTo(fieldErrorsFromState);\n\n return useMemo(\n () => ({\n action,\n subaction,\n defaultValues: hydratedDefaultValues,\n fieldErrors: hydratedFieldErrors ?? {},\n hasBeenSubmitted,\n isSubmitting,\n touchedFields,\n isValid,\n }),\n [\n action,\n hasBeenSubmitted,\n hydratedDefaultValues,\n hydratedFieldErrors,\n isSubmitting,\n isValid,\n subaction,\n touchedFields,\n ]\n );\n};\n\nexport type FormHelpers = {\n /**\n * Clear the error of the specified field.\n */\n clearError: (fieldName: string) => void;\n /**\n * Validate the specified field.\n */\n validateField: (fieldName: string) => Promise<string | null>;\n /**\n * Change the touched state of the specified field.\n */\n setTouched: (fieldName: string, touched: boolean) => void;\n /**\n * Validate the whole form and populate any errors.\n */\n validate: () => Promise<ValidationResult<unknown>>;\n /**\n * Clears all errors on the form.\n */\n clearAllErrors: () => void;\n /**\n * Resets the form.\n *\n * _Note_: The equivalent behavior can be achieved by calling formElement.reset()\n * or clicking a button element with `type=\"reset\"`.\n */\n reset: () => void;\n /**\n * Submits the form, running all validations first.\n *\n * _Note_: This is equivalent to clicking a button element with `type=\"submit\"` or calling formElement.submit().\n */\n submit: () => void;\n /**\n * Returns the current form values as FormData\n */\n getValues: () => FormData;\n};\n\n/**\n * Returns helpers that can be used to update the form state.\n *\n * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.\n */\nexport const useFormHelpers = (formId?: string): FormHelpers => {\n const formContext = useInternalFormContext(formId, \"useFormHelpers\");\n const setTouched = useSetTouched(formContext);\n const validateField = useSmartValidate(formContext.formId);\n const validate = useValidate(formContext.formId);\n const clearError = useClearError(formContext);\n const setFieldErrors = useSetFieldErrors(formContext.formId);\n const reset = useResetFormElement(formContext.formId);\n const submit = useSubmitForm(formContext.formId);\n const getValues = useFormValues(formContext.formId);\n return useMemo(\n () => ({\n setTouched,\n validateField: async (fieldName: string) => {\n const res = await validateField({\n alwaysIncludeErrorsFromFields: [fieldName],\n });\n return res.error?.fieldErrors[fieldName] ?? null;\n },\n clearError,\n validate,\n clearAllErrors: () => setFieldErrors({}),\n reset,\n submit,\n getValues,\n }),\n [\n clearError,\n reset,\n setFieldErrors,\n setTouched,\n submit,\n validate,\n validateField,\n getValues,\n ]\n );\n};\n","import { nanoid } from \"nanoid\";\nimport React, { useMemo, useRef, useState } from \"react\";\nimport { useCallback } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { InternalFormContextValue } from \"../formContext\";\nimport {\n useFieldDefaultValue,\n useFieldError,\n useInternalFormContext,\n useInternalHasBeenSubmitted,\n useSmartValidate,\n} from \"../hooks\";\nimport * as arrayUtil from \"./arrayUtil\";\nimport { useRegisterControlledField } from \"./controlledFields\";\nimport { useFormStore } from \"./storeHooks\";\n\nexport type FieldArrayValidationBehavior = \"onChange\" | \"onSubmit\";\n\nexport type FieldArrayValidationBehaviorOptions = {\n initial: FieldArrayValidationBehavior;\n whenSubmitted: FieldArrayValidationBehavior;\n};\n\nexport type FieldArrayItem<T> = {\n /**\n * The default value of the item.\n * This does not update as the field is changed by the user.\n */\n defaultValue: T;\n /**\n * A unique key for the item.\n * Use this as the key prop when rendering the item.\n */\n key: string;\n};\n\nconst useInternalFieldArray = (\n context: InternalFormContextValue,\n field: string,\n validationBehavior?: Partial<FieldArrayValidationBehaviorOptions>\n) => {\n const value = useFieldDefaultValue(field, context);\n useRegisterControlledField(context, field);\n const hasBeenSubmitted = useInternalHasBeenSubmitted(context.formId);\n const validateField = useSmartValidate(context.formId);\n const error = useFieldError(field, context);\n\n const resolvedValidationBehavior: FieldArrayValidationBehaviorOptions = {\n initial: \"onSubmit\",\n whenSubmitted: \"onChange\",\n ...validationBehavior,\n };\n\n const behavior = hasBeenSubmitted\n ? resolvedValidationBehavior.whenSubmitted\n : resolvedValidationBehavior.initial;\n\n const maybeValidate = useCallback(() => {\n if (behavior === \"onChange\") {\n validateField({ alwaysIncludeErrorsFromFields: [field] });\n }\n }, [behavior, field, validateField]);\n\n invariant(\n value === undefined || value === null || Array.isArray(value),\n `FieldArray: defaultValue value for ${field} must be an array, null, or undefined`\n );\n\n const arr = useFormStore(\n context.formId,\n (state) => state.controlledFields.array\n );\n\n const arrayValue = useMemo<unknown[]>(() => value ?? [], [value]);\n const keyRef = useRef<string[]>([]);\n\n // If the lengths don't match up it means one of two things\n // 1. The array has been modified outside of this hook\n // 2. We're initializing the array\n if (keyRef.current.length !== arrayValue.length) {\n keyRef.current = arrayValue.map(() => nanoid());\n }\n\n const helpers = useMemo(\n () => ({\n push: (item: any) => {\n arr.push(field, item);\n keyRef.current.push(nanoid());\n maybeValidate();\n },\n swap: (indexA: number, indexB: number) => {\n arr.swap(field, indexA, indexB);\n arrayUtil.swap(keyRef.current, indexA, indexB);\n maybeValidate();\n },\n move: (from: number, to: number) => {\n arr.move(field, from, to);\n arrayUtil.move(keyRef.current, from, to);\n maybeValidate();\n },\n insert: (index: number, value: any) => {\n arr.insert(field, index, value);\n arrayUtil.insert(keyRef.current, index, nanoid());\n maybeValidate();\n },\n unshift: (value: any) => {\n arr.unshift(field, value);\n keyRef.current.unshift(nanoid());\n maybeValidate();\n },\n remove: (index: number) => {\n arr.remove(field, index);\n arrayUtil.remove(keyRef.current, index);\n maybeValidate();\n },\n pop: () => {\n arr.pop(field);\n keyRef.current.pop();\n maybeValidate();\n },\n replace: (index: number, value: any) => {\n arr.replace(field, index, value);\n keyRef.current[index] = nanoid();\n maybeValidate();\n },\n }),\n [arr, field, maybeValidate]\n );\n\n const valueWithKeys = useMemo(() => {\n const result: { defaultValue: any; key: string }[] = [];\n arrayValue.forEach((item, index) => {\n result[index] = {\n key: keyRef.current[index],\n defaultValue: item,\n };\n });\n return result;\n }, [arrayValue]);\n\n return [valueWithKeys, helpers, error] as const;\n};\n\nexport type FieldArrayHelpers<Item = any> = {\n push: (item: Item) => void;\n swap: (indexA: number, indexB: number) => void;\n move: (from: number, to: number) => void;\n insert: (index: number, value: Item) => void;\n unshift: (value: Item) => void;\n remove: (index: number) => void;\n pop: () => void;\n replace: (index: number, value: Item) => void;\n};\n\nexport type UseFieldArrayOptions = {\n formId?: string;\n validationBehavior?: Partial<FieldArrayValidationBehaviorOptions>;\n};\n\nexport function useFieldArray<Item = any>(\n name: string,\n { formId, validationBehavior }: UseFieldArrayOptions = {}\n) {\n const context = useInternalFormContext(formId, \"FieldArray\");\n\n return useInternalFieldArray(context, name, validationBehavior) as [\n items: FieldArrayItem<Item>[],\n helpers: FieldArrayHelpers,\n error: string | undefined\n ];\n}\n\nexport type FieldArrayProps<Item> = {\n name: string;\n children: (\n items: FieldArrayItem<Item>[],\n helpers: FieldArrayHelpers<Item>,\n error: string | undefined\n ) => React.ReactNode;\n formId?: string;\n validationBehavior?: FieldArrayValidationBehaviorOptions;\n};\n\nexport function FieldArray<Item = any>({\n name,\n children,\n formId,\n validationBehavior,\n}: FieldArrayProps<Item>) {\n const context = useInternalFormContext(formId, \"FieldArray\");\n const [value, helpers, error] = useInternalFieldArray(\n context,\n name,\n validationBehavior\n );\n return <>{children(value, helpers, error)}</>;\n}\n"],"mappings":"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","names":["h","a","b","k","l","n","p","q","d","f","c","g","r","t","u","React","x","y","useState","useEffect","useLayoutEffect","useDebugValue","error","h","n","p","a","b","q","r","t","u","v","w","l","g","c","f","d","k","e","React","x","y","useRef","useEffect","useMemo","useDebugValue","useSyncExternalStoreWithSelector","useEffect","_","i","invariant","fn","hydratedData","invariant","replace","import_meta","useSyncExternalStoreExports","die","error","args","e","errors","msg","apply","Error","length","map","s","join","isDraft","value","DRAFT_STATE","isDraftable","proto","Object","getPrototypeOf","Ctor","hasOwnProperty","call","constructor","Function","toString","objectCtorString","Array","isArray","DRAFTABLE","_value$constructor","isMap","isSet","each","obj","iter","enumerableOnly","getArchtype","Object","keys","ownKeys","forEach","key","entry","index","thing","state","DRAFT_STATE","type_","Array","isArray","isMap","isSet","has","prop","prototype","hasOwnProperty","call","get","set","propOrOldValue","value","t","delete","add","is","x","y","target","hasMap","Map","hasSet","Set","latest","copy_","base_","shallowCopy","base","slice","descriptors","getOwnPropertyDescriptors","i","length","desc","writable","configurable","enumerable","create","getPrototypeOf","freeze","deep","isFrozen","isDraft","isDraftable","clear","dontMutateFrozenCollections","die","getPlugin","pluginKey","plugin","plugins","getCurrentScope","process","currentScope","die","usePatchesInScope","scope","patchListener","getPlugin","patches_","inversePatches_","patchListener_","revokeScope","leaveScope","drafts_","forEach","revokeDraft","parent_","enterScope","immer","immer_","canAutoFreeze_","unfinalizedDrafts_","draft","state","DRAFT_STATE","type_","revoke_","revoked_","processResult","result","length","baseDraft","isReplaced","useProxies_","willFinalizeES5_","modified_","isDraftable","finalize","maybeFreeze","generateReplacementPatches_","base_","NOTHING","undefined","rootScope","value","path","isFrozen","each","key","childValue","finalizeProperty","scope_","finalized_","copy_","shallowCopy","draft_","Set","generatePatches_","parentState","targetObject","prop","rootPath","isDraft","res","has","assigned_","concat","set","autoFreeze_","deep","freeze","peek","latest","getDescriptorFromProto","source","proto","Object","getPrototypeOf","desc","getOwnPropertyDescriptor","markChanged","prepareCopy","createProxy","parent","isMap","proxyMap_","isSet","proxySet_","base","isArray","Array","isManual_","target","traps","objectTraps","arrayTraps","Proxy","revocable","revoke","proxy","createES5Proxy_","push","current","currentImpl","copy","archType","getArchtype","hasChanges_","copyHelper","get","Map","from","value","currentScope","hasSymbol","Symbol","hasMap","Map","hasSet","Set","hasProxies","Proxy","revocable","Reflect","NOTHING","for","DRAFTABLE","DRAFT_STATE","value","errors","data","path","op","plugin","thing","objectCtorString","Object","prototype","constructor","ownKeys","Reflect","getOwnPropertySymbols","obj","getOwnPropertyNames","concat","getOwnPropertyDescriptors","target","res","forEach","key","getOwnPropertyDescriptor","plugins","objectTraps","get","state","prop","DRAFT_STATE","source","latest","has","desc","getDescriptorFromProto","_desc$get","call","draft_","undefined","finalized_","isDraftable","peek","base_","prepareCopy","copy_","createProxy","scope_","immer_","set","modified_","current","currentState","assigned_","is","markChanged","deleteProperty","owner","writable","configurable","type_","enumerable","defineProperty","die","getPrototypeOf","setPrototypeOf","arrayTraps","each","fn","arguments","apply","this","process","isNaN","parseInt","Immer","config","hasProxies","base","recipe","patchListener","defaultBase","self","_this","args","produce","draft","_this2","result","scope","enterScope","proxy","hasError","revokeScope","leaveScope","Promise","then","usePatchesInScope","processResult","error","NOTHING","autoFreeze_","freeze","p","ip","getPlugin","generateReplacementPatches_","produceWithPatches","patches","inversePatches","nextState","useProxies","setUseProxies","autoFreeze","setAutoFreeze","createDraft","isDraft","isManual_","finishDraft","useProxies_","applyPatches","i","length","patch","slice","applyPatchesImpl","applyPatches_","immer","bind","get","replace","a","from","i","get","invariant","_a","from","state","match","invariant","touched","state","fieldErrors","useCallback","useCallback","value","useEffect","useCallback","useEffect","useMemo","useRef","R","useCallback","useEffect","useRef","useEffect","useRef","R","useEffect","useRef","replace","useMemo","useRef","useCallback","_a","useEffect","R","useCallback","useMemo","useMemo","useMemo","useCallback","useMemo","useMemo","useRef","useCallback","invariant","Fragment","jsx","useCallback","invariant","useMemo","useRef","from","value"]}
1
+ {"version":3,"sources":["../src/hooks.ts","../src/internal/getInputProps.ts","../src/internal/logic/getCheckboxChecked.ts","../src/internal/logic/getRadioChecked.ts","../src/internal/hooks.ts","../../set-get/src/stringToPathArray.ts","../../set-get/src/setPath.ts","../../set-get/src/getPath.ts","../src/internal/constants.ts","../src/internal/formContext.ts","../src/internal/hydratable.ts","../src/internal/state/createFormStore.ts","../src/internal/logic/requestSubmit.ts","../src/internal/state/arrayUtil.ts","../src/internal/state/storeHooks.ts","../src/internal/state/controlledFields.ts","../src/server.ts","../src/ValidatedForm.tsx","../src/internal/MultiValueMap.ts","../src/internal/submissionCallbacks.ts","../src/internal/util.ts","../src/validation/createValidator.ts","../src/internal/flatten.ts","../src/userFacingFormContext.ts","../src/unreleased/formStateHooks.ts","../src/internal/state/fieldArray.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport {\n createGetInputProps,\n GetInputProps,\n ValidationBehaviorOptions,\n} from \"./internal/getInputProps\";\nimport {\n useInternalFormContext,\n useFieldTouched,\n useFieldError,\n useFieldDefaultValue,\n useClearError,\n useInternalIsSubmitting,\n useInternalIsValid,\n useInternalHasBeenSubmitted,\n useRegisterReceiveFocus,\n useSmartValidate,\n} from \"./internal/hooks\";\nimport {\n useControllableValue,\n useUpdateControllableValue,\n} from \"./internal/state/controlledFields\";\n\n/**\n * Returns whether or not the parent form is currently being submitted.\n * This is different from Remix's `useNavigation()` in that it\n * is aware of what form it's in and when _that_ form is being submitted.\n *\n * @param formId\n */\nexport const useIsSubmitting = (formId?: string) => {\n const formContext = useInternalFormContext(formId, \"useIsSubmitting\");\n return useInternalIsSubmitting(formContext.formId);\n};\n\n/**\n * Returns whether or not the current form is valid.\n *\n * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.\n */\nexport const useIsValid = (formId?: string) => {\n const formContext = useInternalFormContext(formId, \"useIsValid\");\n return useInternalIsValid(formContext.formId);\n};\n\nexport type FieldProps = {\n /**\n * The validation error message if there is one.\n */\n error?: string;\n /**\n * Clears the error message.\n */\n clearError: () => void;\n /**\n * Validates the field.\n */\n validate: () => void;\n /**\n * The default value of the field, if there is one.\n */\n defaultValue?: any;\n /**\n * Whether or not the field has been touched.\n */\n touched: boolean;\n /**\n * Helper to set the touched state of the field.\n */\n setTouched: (touched: boolean) => void;\n /**\n * Helper to get all the props necessary for a regular input.\n */\n getInputProps: GetInputProps;\n};\n\n/**\n * Provides the data and helpers necessary to set up a field.\n */\nexport const useField = (\n name: string,\n options?: {\n /**\n * Allows you to configure a custom function that will be called\n * when the input needs to receive focus due to a validation error.\n * This is useful for custom components that use a hidden input.\n */\n handleReceiveFocus?: () => void;\n /**\n * Allows you to specify when a field gets validated (when using getInputProps)\n */\n validationBehavior?: Partial<ValidationBehaviorOptions>;\n /**\n * The formId of the form you want to use.\n * This is not necesary if the input is used inside a form.\n */\n formId?: string;\n }\n): FieldProps => {\n const { formId: providedFormId, handleReceiveFocus } = options ?? {};\n const formContext = useInternalFormContext(providedFormId, \"useField\");\n\n const defaultValue = useFieldDefaultValue(name, formContext);\n const [touched, setTouched] = useFieldTouched(name, formContext);\n const error = useFieldError(name, formContext);\n const clearError = useClearError(formContext);\n\n const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);\n const smartValidate = useSmartValidate(formContext.formId);\n const registerReceiveFocus = useRegisterReceiveFocus(formContext.formId);\n\n useEffect(() => {\n if (handleReceiveFocus)\n return registerReceiveFocus(name, handleReceiveFocus);\n }, [handleReceiveFocus, name, registerReceiveFocus]);\n\n const field = useMemo<FieldProps>(() => {\n const helpers = {\n error,\n clearError: () => clearError(name),\n validate: () => smartValidate({ alwaysIncludeErrorsFromFields: [name] }),\n defaultValue,\n touched,\n setTouched,\n };\n const getInputProps = createGetInputProps({\n ...helpers,\n name,\n hasBeenSubmitted,\n validationBehavior: options?.validationBehavior,\n });\n return {\n ...helpers,\n getInputProps,\n };\n }, [\n error,\n clearError,\n defaultValue,\n touched,\n setTouched,\n name,\n hasBeenSubmitted,\n options?.validationBehavior,\n smartValidate,\n ]);\n\n return field;\n};\n\nexport const useControlField = <T>(name: string, formId?: string) => {\n const context = useInternalFormContext(formId, \"useControlField\");\n const [value, setValue] = useControllableValue(context, name);\n return [value as T, setValue as (value: T) => void] as const;\n};\n\nexport const useUpdateControlledField = (formId?: string) => {\n const context = useInternalFormContext(formId, \"useControlField\");\n return useUpdateControllableValue(context.formId);\n};\n","import * as R from \"remeda\";\nimport { getCheckboxChecked } from \"./logic/getCheckboxChecked\";\nimport { getRadioChecked } from \"./logic/getRadioChecked\";\n\nexport type ValidationBehavior = \"onBlur\" | \"onChange\" | \"onSubmit\";\n\nexport type ValidationBehaviorOptions = {\n initial: ValidationBehavior;\n whenTouched: ValidationBehavior;\n whenSubmitted: ValidationBehavior;\n};\n\nexport type CreateGetInputPropsOptions = {\n clearError: () => void;\n validate: () => void;\n defaultValue?: any;\n touched: boolean;\n setTouched: (touched: boolean) => void;\n hasBeenSubmitted: boolean;\n validationBehavior?: Partial<ValidationBehaviorOptions>;\n name: string;\n};\n\ntype HandledProps = \"name\" | \"defaultValue\" | \"defaultChecked\";\ntype Callbacks = \"onChange\" | \"onBlur\";\n\ntype MinimalInputProps = {\n onChange?: ((...args: any[]) => void) | undefined;\n onBlur?: ((...args: any[]) => void) | undefined;\n defaultValue?: any;\n defaultChecked?: boolean | undefined;\n name?: string | undefined;\n type?: string | undefined;\n};\n\nexport type GetInputProps = <T extends MinimalInputProps>(\n props?: Omit<T, HandledProps | Callbacks> & Partial<Pick<T, Callbacks>>\n) => T;\n\nconst defaultValidationBehavior: ValidationBehaviorOptions = {\n initial: \"onBlur\",\n whenTouched: \"onChange\",\n whenSubmitted: \"onChange\",\n};\n\nexport const createGetInputProps = ({\n clearError,\n validate,\n defaultValue,\n touched,\n setTouched,\n hasBeenSubmitted,\n validationBehavior,\n name,\n}: CreateGetInputPropsOptions): GetInputProps => {\n const validationBehaviors = {\n ...defaultValidationBehavior,\n ...validationBehavior,\n };\n\n return <T extends MinimalInputProps>(props = {} as any) => {\n const behavior = hasBeenSubmitted\n ? validationBehaviors.whenSubmitted\n : touched\n ? validationBehaviors.whenTouched\n : validationBehaviors.initial;\n\n const inputProps: MinimalInputProps = {\n ...props,\n onChange: (...args: unknown[]) => {\n if (behavior === \"onChange\") validate();\n else clearError();\n return props?.onChange?.(...args);\n },\n onBlur: (...args: unknown[]) => {\n if (behavior === \"onBlur\") validate();\n setTouched(true);\n return props?.onBlur?.(...args);\n },\n name,\n };\n\n if (props.type === \"checkbox\") {\n inputProps.defaultChecked = getCheckboxChecked(props.value, defaultValue);\n } else if (props.type === \"radio\") {\n inputProps.defaultChecked = getRadioChecked(props.value, defaultValue);\n } else if (props.value === undefined) {\n // We should only set the defaultValue if the input is uncontrolled.\n inputProps.defaultValue = defaultValue;\n }\n\n return R.omitBy(inputProps, (value) => value === undefined) as T;\n };\n};\n","export const getCheckboxChecked = (\n checkboxValue: string | undefined = \"on\",\n newValue: unknown\n): boolean | undefined => {\n if (Array.isArray(newValue))\n return newValue.some((val) => val === true || val === checkboxValue);\n if (typeof newValue === \"boolean\") return newValue;\n if (typeof newValue === \"string\") return newValue === checkboxValue;\n return undefined;\n};\n","export const getRadioChecked = (\n radioValue: string | undefined = \"on\",\n newValue: unknown\n) => {\n if (typeof newValue === \"string\") return newValue === radioValue;\n return undefined;\n};\n\nif (import.meta.vitest) {\n const { it, expect } = import.meta.vitest;\n it(\"getRadioChecked\", () => {\n expect(getRadioChecked(\"on\", \"on\")).toBe(true);\n expect(getRadioChecked(\"on\", undefined)).toBe(undefined);\n expect(getRadioChecked(\"trueValue\", undefined)).toBe(undefined);\n expect(getRadioChecked(\"trueValue\", \"bob\")).toBe(false);\n expect(getRadioChecked(\"trueValue\", \"trueValue\")).toBe(true);\n });\n}\n","import { useActionData, useMatches, useNavigation } from \"@remix-run/react\";\nimport { useCallback, useContext } from \"react\";\nimport { getPath } from \"set-get\";\nimport invariant from \"tiny-invariant\";\nimport { FieldErrors, ValidationErrorResponseData } from \"..\";\nimport { formDefaultValuesKey } from \"./constants\";\nimport { InternalFormContext, InternalFormContextValue } from \"./formContext\";\nimport { Hydratable, hydratable } from \"./hydratable\";\nimport { useFormStore } from \"./state/storeHooks\";\nimport { InternalFormId } from \"./state/types\";\n\nexport const useInternalFormContext = (\n formId?: string | symbol,\n hookName?: string\n) => {\n const formContext = useContext(InternalFormContext);\n\n if (formId) return { formId };\n if (formContext) return formContext;\n\n throw new Error(\n `Unable to determine form for ${hookName}. Please use it inside a ValidatedForm or pass a 'formId'.`\n );\n};\n\nexport function useErrorResponseForForm({\n fetcher,\n subaction,\n formId,\n}: InternalFormContextValue): ValidationErrorResponseData | null {\n const actionData = useActionData<any>();\n if (fetcher) {\n if ((fetcher.data as any)?.fieldErrors) return fetcher.data as any;\n return null;\n }\n\n if (!actionData?.fieldErrors) return null;\n\n // If there's an explicit id, we should ignore data that has the wrong id\n if (typeof formId === \"string\" && actionData.formId)\n return actionData.formId === formId ? actionData : null;\n\n if (\n (!subaction && !actionData.subaction) ||\n actionData.subaction === subaction\n )\n return actionData;\n\n return null;\n}\n\nexport const useFieldErrorsForForm = (\n context: InternalFormContextValue\n): Hydratable<FieldErrors | undefined> => {\n const response = useErrorResponseForForm(context);\n const hydrated = useFormStore(context.formId, (state) => state.isHydrated);\n return hydratable.from(response?.fieldErrors, hydrated);\n};\n\nexport const useDefaultValuesFromLoader = ({\n formId,\n}: InternalFormContextValue) => {\n const matches = useMatches();\n if (typeof formId === \"string\") {\n const dataKey = formDefaultValuesKey(formId);\n // If multiple loaders declare the same default values,\n // we should use the data from the deepest route.\n const match = matches\n .reverse()\n .find(\n (match) =>\n match.data && typeof match.data === \"object\" && dataKey in match.data\n );\n return match?.data[dataKey];\n }\n\n return null;\n};\n\nexport const useDefaultValuesForForm = (\n context: InternalFormContextValue\n): Hydratable<{ [fieldName: string]: any }> => {\n const { formId, defaultValuesProp } = context;\n const hydrated = useFormStore(formId, (state) => state.isHydrated);\n const errorResponse = useErrorResponseForForm(context);\n const defaultValuesFromLoader = useDefaultValuesFromLoader(context);\n\n // Typical flow is:\n // - Default values only available from props or server\n // - Props have a higher priority than server\n // - State gets hydrated with default values\n // - After submit, we may need to use values from the error\n\n if (hydrated) return hydratable.hydratedData();\n if (errorResponse?.repopulateFields) {\n invariant(\n typeof errorResponse.repopulateFields === \"object\",\n \"repopulateFields returned something other than an object\"\n );\n return hydratable.serverData(errorResponse.repopulateFields);\n }\n if (defaultValuesProp) return hydratable.serverData(defaultValuesProp);\n\n return hydratable.serverData(defaultValuesFromLoader);\n};\n\nexport const useHasActiveFormSubmit = ({\n fetcher,\n}: InternalFormContextValue): boolean => {\n let navigation = useNavigation();\n const hasActiveSubmission = fetcher\n ? fetcher.state === \"submitting\"\n : navigation.state === \"submitting\" || navigation.state === \"loading\";\n return hasActiveSubmission;\n};\n\nexport const useFieldTouched = (\n field: string,\n { formId }: InternalFormContextValue\n) => {\n const touched = useFormStore(formId, (state) => state.touchedFields[field]);\n const setFieldTouched = useFormStore(formId, (state) => state.setTouched);\n const setTouched = useCallback(\n (touched: boolean) => setFieldTouched(field, touched),\n [field, setFieldTouched]\n );\n return [touched, setTouched] as const;\n};\n\nexport const useFieldError = (\n name: string,\n context: InternalFormContextValue\n) => {\n const fieldErrors = useFieldErrorsForForm(context);\n const state = useFormStore(\n context.formId,\n (state) => state.fieldErrors[name]\n );\n return fieldErrors.map((fieldErrors) => fieldErrors?.[name]).hydrateTo(state);\n};\n\nexport const useClearError = (context: InternalFormContextValue) => {\n const { formId } = context;\n return useFormStore(formId, (state) => state.clearFieldError);\n};\n\nexport const useCurrentDefaultValueForField = (\n formId: InternalFormId,\n field: string\n) =>\n useFormStore(formId, (state) => getPath(state.currentDefaultValues, field));\n\nexport const useFieldDefaultValue = (\n name: string,\n context: InternalFormContextValue\n) => {\n const defaultValues = useDefaultValuesForForm(context);\n const state = useCurrentDefaultValueForField(context.formId, name);\n\n return defaultValues.map((val) => getPath(val, name)).hydrateTo(state);\n};\n\nexport const useInternalIsSubmitting = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.isSubmitting);\n\nexport const useInternalIsValid = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.isValid());\n\nexport const useInternalHasBeenSubmitted = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.hasBeenSubmitted);\n\nexport const useSmartValidate = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.smartValidate);\n\nexport const useValidate = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.validate);\n\nconst noOpReceiver = () => () => {};\nexport const useRegisterReceiveFocus = (formId: InternalFormId) =>\n useFormStore(\n formId,\n (state) => state.formProps?.registerReceiveFocus ?? noOpReceiver\n );\n\nconst defaultDefaultValues = {};\nexport const useSyncedDefaultValues = (formId: InternalFormId) =>\n useFormStore(\n formId,\n (state) => state.formProps?.defaultValues ?? defaultDefaultValues\n );\n\nexport const useSetTouched = ({ formId }: InternalFormContextValue) =>\n useFormStore(formId, (state) => state.setTouched);\n\nexport const useTouchedFields = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.touchedFields);\n\nexport const useFieldErrors = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.fieldErrors);\n\nexport const useSetFieldErrors = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.setFieldErrors);\n\nexport const useResetFormElement = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.resetFormElement);\n\nexport const useSubmitForm = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.submit);\n\nexport const useFormActionProp = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.formProps?.action);\n\nexport const useFormSubactionProp = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.formProps?.subaction);\n\nexport const useFormValues = (formId: InternalFormId) =>\n useFormStore(formId, (state) => state.getValues);\n","export const stringToPathArray = <T extends string>(\n path: T\n): (string | number)[] => {\n if (path.length === 0) return [];\n\n const match =\n path.match(/^\\[(.+?)\\](.*)$/) || path.match(/^\\.?([^\\.\\[\\]]+)(.*)$/);\n if (match) {\n const [_, key, rest] = match;\n return [/^\\d+$/.test(key) ? Number(key) : key, ...stringToPathArray(rest)];\n }\n return [path];\n};\n","import { stringToPathArray } from \"./stringToPathArray\";\n\nexport function setPath<T>(object: T, path: string, defaultValue: any) {\n return _setPathNormalized(object, stringToPathArray(path), defaultValue);\n}\n\nfunction _setPathNormalized(\n object: any,\n path: (string | number)[],\n value: any\n): any {\n const leadingSegments = path.slice(0, -1);\n const lastSegment = path[path.length - 1];\n\n let obj = object;\n for (let i = 0; i < leadingSegments.length; i++) {\n const segment = leadingSegments[i];\n if (obj[segment] === undefined) {\n const nextSegment = leadingSegments[i + 1] ?? lastSegment;\n obj[segment] = typeof nextSegment === \"number\" ? [] : {};\n }\n obj = obj[segment];\n }\n obj[lastSegment] = value;\n return object;\n}\n","import get from \"lodash.get\";\n\nexport const getPath = (object: any, path: string) => {\n return get(object, path);\n};\n","export const FORM_ID_FIELD = \"__rvfInternalFormId\" as const;\nexport const FORM_DEFAULTS_FIELD = \"__rvfInternalFormDefaults\" as const;\nexport const formDefaultValuesKey = (formId: string) =>\n `${FORM_DEFAULTS_FIELD}_${formId}`;\n","import { FetcherWithComponents } from \"@remix-run/react\";\nimport { createContext } from \"react\";\n\nexport type InternalFormContextValue = {\n formId: string | symbol;\n action?: string;\n subaction?: string;\n defaultValuesProp?: { [fieldName: string]: any };\n fetcher?: FetcherWithComponents<unknown>;\n};\n\nexport const InternalFormContext =\n createContext<InternalFormContextValue | null>(null);\n","/**\n * The purpose of this type is to simplify the logic\n * around data that needs to come from the server initially,\n * but from the internal state after hydration.\n */\nexport type Hydratable<T> = {\n hydrateTo: (data: T) => T;\n map: <U>(fn: (data: T) => U) => Hydratable<U>;\n};\n\nconst serverData = <T>(data: T): Hydratable<T> => ({\n hydrateTo: () => data,\n map: (fn) => serverData(fn(data)),\n});\n\nconst hydratedData = <T>(): Hydratable<T> => ({\n hydrateTo: (hydratedData: T) => hydratedData,\n map: <U>() => hydratedData<U>(),\n});\n\nconst from = <T>(data: T, hydrated: boolean): Hydratable<T> =>\n hydrated ? hydratedData<T>() : serverData<T>(data);\n\nexport const hydratable = {\n serverData,\n hydratedData,\n from,\n};\n","import { WritableDraft } from \"immer/dist/internal\";\nimport { getPath, setPath } from \"set-get\";\nimport invariant from \"tiny-invariant\";\nimport { create, GetState } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport {\n FieldErrors,\n TouchedFields,\n ValidationResult,\n Validator,\n} from \"../../validation/types\";\nimport { requestSubmit } from \"../logic/requestSubmit\";\nimport * as arrayUtil from \"./arrayUtil\";\nimport { InternalFormId } from \"./types\";\n\nexport type SyncedFormProps = {\n formId?: string;\n action?: string;\n subaction?: string;\n defaultValues: { [fieldName: string]: any };\n registerReceiveFocus: (fieldName: string, handler: () => void) => () => void;\n validator: Validator<unknown>;\n};\n\nexport type SmartValidateOpts = {\n alwaysIncludeErrorsFromFields?: string[];\n};\n\nexport type FormStoreState = {\n forms: { [formId: InternalFormId]: FormState };\n form: (formId: InternalFormId) => FormState;\n registerForm: (formId: InternalFormId) => void;\n cleanupForm: (formId: InternalFormId) => void;\n};\n\nexport type FormState = {\n isHydrated: boolean;\n isSubmitting: boolean;\n hasBeenSubmitted: boolean;\n fieldErrors: FieldErrors;\n touchedFields: TouchedFields;\n formProps?: SyncedFormProps;\n formElement: HTMLFormElement | null;\n currentDefaultValues: Record<string, any>;\n\n isValid: () => boolean;\n startSubmit: () => void;\n endSubmit: () => void;\n setTouched: (field: string, touched: boolean) => void;\n setFieldError: (field: string, error: string) => void;\n setFieldErrors: (errors: FieldErrors) => void;\n clearFieldError: (field: string) => void;\n reset: () => void;\n syncFormProps: (props: SyncedFormProps) => void;\n setFormElement: (formElement: HTMLFormElement | null) => void;\n validate: () => Promise<ValidationResult<unknown>>;\n smartValidate: (\n opts?: SmartValidateOpts\n ) => Promise<ValidationResult<unknown>>;\n resetFormElement: () => void;\n submit: () => void;\n getValues: () => FormData;\n\n controlledFields: {\n values: { [fieldName: string]: any };\n refCounts: { [fieldName: string]: number };\n valueUpdatePromises: { [fieldName: string]: Promise<void> };\n valueUpdateResolvers: { [fieldName: string]: () => void };\n\n register: (fieldName: string) => void;\n unregister: (fieldName: string) => void;\n setValue: (fieldName: string, value: unknown) => void;\n kickoffValueUpdate: (fieldName: string) => void;\n getValue: (fieldName: string) => unknown;\n awaitValueUpdate: (fieldName: string) => Promise<void>;\n\n array: {\n push: (fieldName: string, value: unknown) => void;\n swap: (fieldName: string, indexA: number, indexB: number) => void;\n move: (fieldName: string, fromIndex: number, toIndex: number) => void;\n insert: (fieldName: string, index: number, value: unknown) => void;\n unshift: (fieldName: string, value: unknown) => void;\n remove: (fieldName: string, index: number) => void;\n pop: (fieldName: string) => void;\n replace: (fieldName: string, index: number, value: unknown) => void;\n };\n };\n};\n\nconst noOp = () => {};\nconst defaultFormState: FormState = {\n isHydrated: false,\n isSubmitting: false,\n hasBeenSubmitted: false,\n touchedFields: {},\n fieldErrors: {},\n formElement: null,\n isValid: () => true,\n startSubmit: noOp,\n endSubmit: noOp,\n setTouched: noOp,\n setFieldError: noOp,\n setFieldErrors: noOp,\n clearFieldError: noOp,\n currentDefaultValues: {},\n\n reset: () => noOp,\n syncFormProps: noOp,\n setFormElement: noOp,\n\n validate: async () => {\n throw new Error(\"Validate called before form was initialized.\");\n },\n\n smartValidate: async () => {\n throw new Error(\"Validate called before form was initialized.\");\n },\n\n submit: async () => {\n throw new Error(\"Submit called before form was initialized.\");\n },\n\n resetFormElement: noOp,\n getValues: () => new FormData(),\n\n controlledFields: {\n values: {},\n refCounts: {},\n valueUpdatePromises: {},\n valueUpdateResolvers: {},\n\n register: noOp,\n unregister: noOp,\n setValue: noOp,\n getValue: noOp,\n kickoffValueUpdate: noOp,\n awaitValueUpdate: async () => {\n throw new Error(\"AwaitValueUpdate called before form was initialized.\");\n },\n\n array: {\n push: noOp,\n swap: noOp,\n move: noOp,\n insert: noOp,\n unshift: noOp,\n remove: noOp,\n pop: noOp,\n replace: noOp,\n },\n },\n};\n\nconst createFormState = (\n set: (setter: (draft: WritableDraft<FormState>) => void) => void,\n get: GetState<FormState>\n): FormState => ({\n // It's not \"hydrated\" until the form props are synced\n isHydrated: false,\n isSubmitting: false,\n hasBeenSubmitted: false,\n touchedFields: {},\n fieldErrors: {},\n formElement: null,\n currentDefaultValues: {},\n\n isValid: () => Object.keys(get().fieldErrors).length === 0,\n startSubmit: () =>\n set((state) => {\n state.isSubmitting = true;\n state.hasBeenSubmitted = true;\n }),\n endSubmit: () =>\n set((state) => {\n state.isSubmitting = false;\n }),\n setTouched: (fieldName, touched) =>\n set((state) => {\n state.touchedFields[fieldName] = touched;\n }),\n setFieldError: (fieldName: string, error: string) =>\n set((state) => {\n state.fieldErrors[fieldName] = error;\n }),\n setFieldErrors: (errors: FieldErrors) =>\n set((state) => {\n state.fieldErrors = errors;\n }),\n clearFieldError: (fieldName: string) =>\n set((state) => {\n delete state.fieldErrors[fieldName];\n }),\n reset: () =>\n set((state) => {\n state.fieldErrors = {};\n state.touchedFields = {};\n state.hasBeenSubmitted = false;\n const nextDefaults = state.formProps?.defaultValues ?? {};\n state.controlledFields.values = nextDefaults;\n state.currentDefaultValues = nextDefaults;\n }),\n syncFormProps: (props: SyncedFormProps) =>\n set((state) => {\n if (!state.isHydrated) {\n state.controlledFields.values = props.defaultValues;\n state.currentDefaultValues = props.defaultValues;\n }\n\n state.formProps = props;\n state.isHydrated = true;\n }),\n setFormElement: (formElement: HTMLFormElement | null) => {\n // This gets called frequently, so we want to avoid calling set() every time\n // Or else we wind up with an infinite loop\n if (get().formElement === formElement) return;\n set((state) => {\n // weird type issue here\n // seems to be because formElement is a writable draft\n state.formElement = formElement as any;\n });\n },\n validate: async () => {\n const formElement = get().formElement;\n invariant(\n formElement,\n \"Cannot find reference to form. This is probably a bug in remix-validated-form.\"\n );\n\n const validator = get().formProps?.validator;\n invariant(\n validator,\n \"Cannot find validator. This is probably a bug in remix-validated-form.\"\n );\n\n const result = await validator.validate(new FormData(formElement));\n if (result.error) get().setFieldErrors(result.error.fieldErrors);\n return result;\n },\n\n smartValidate: async ({ alwaysIncludeErrorsFromFields = [] } = {}) => {\n const formElement = get().formElement;\n invariant(\n formElement,\n \"Cannot find reference to form. This is probably a bug in remix-validated-form.\"\n );\n\n const validator = get().formProps?.validator;\n invariant(\n validator,\n \"Cannot find validator. This is probably a bug in remix-validated-form.\"\n );\n\n await Promise.all(\n alwaysIncludeErrorsFromFields.map((field) =>\n get().controlledFields.awaitValueUpdate?.(field)\n )\n );\n\n const validationResult = await validator.validate(\n new FormData(formElement)\n );\n if (!validationResult.error) {\n // Only update the field errors if it hasn't changed\n const hadErrors = Object.keys(get().fieldErrors).length > 0;\n if (hadErrors) get().setFieldErrors({});\n return validationResult;\n }\n\n const {\n error: { fieldErrors },\n } = validationResult;\n const errorFields = new Set<string>();\n const incomingErrors = new Set<string>();\n const prevErrors = new Set<string>();\n\n Object.keys(fieldErrors).forEach((field) => {\n errorFields.add(field);\n incomingErrors.add(field);\n });\n\n Object.keys(get().fieldErrors).forEach((field) => {\n errorFields.add(field);\n prevErrors.add(field);\n });\n\n const fieldsToUpdate = new Set<string>();\n const fieldsToDelete = new Set<string>();\n\n errorFields.forEach((field) => {\n // If an error has been cleared, remove it.\n if (!incomingErrors.has(field)) {\n fieldsToDelete.add(field);\n return;\n }\n\n // If an error has changed, we should update it.\n if (prevErrors.has(field) && incomingErrors.has(field)) {\n // Only update if the error has changed to avoid unnecessary rerenders\n if (fieldErrors[field] !== get().fieldErrors[field])\n fieldsToUpdate.add(field);\n return;\n }\n\n // If the error is always included, then we should update it.\n if (alwaysIncludeErrorsFromFields.includes(field)) {\n fieldsToUpdate.add(field);\n return;\n }\n\n // If the error is new, then only update if the field has been touched\n // or if the form has been submitted\n if (!prevErrors.has(field)) {\n const fieldTouched = get().touchedFields[field];\n const formHasBeenSubmitted = get().hasBeenSubmitted;\n if (fieldTouched || formHasBeenSubmitted) fieldsToUpdate.add(field);\n return;\n }\n });\n\n if (fieldsToDelete.size === 0 && fieldsToUpdate.size === 0) {\n return { ...validationResult, error: { fieldErrors: get().fieldErrors } };\n }\n\n set((state) => {\n fieldsToDelete.forEach((field) => {\n delete state.fieldErrors[field];\n });\n\n fieldsToUpdate.forEach((field) => {\n state.fieldErrors[field] = fieldErrors[field];\n });\n });\n\n return { ...validationResult, error: { fieldErrors: get().fieldErrors } };\n },\n\n submit: () => {\n const formElement = get().formElement;\n invariant(\n formElement,\n \"Cannot find reference to form. This is probably a bug in remix-validated-form.\"\n );\n\n requestSubmit(formElement);\n },\n\n getValues: () => new FormData(get().formElement ?? undefined),\n\n resetFormElement: () => get().formElement?.reset(),\n\n controlledFields: {\n values: {},\n refCounts: {},\n valueUpdatePromises: {},\n valueUpdateResolvers: {},\n\n register: (fieldName) => {\n set((state) => {\n const current = state.controlledFields.refCounts[fieldName] ?? 0;\n state.controlledFields.refCounts[fieldName] = current + 1;\n });\n },\n unregister: (fieldName) => {\n // For this helper in particular, we may run into a case where state is undefined.\n // When the whole form unmounts, the form state may be cleaned up before the fields are.\n if (get() === null || get() === undefined) return;\n set((state) => {\n const current = state.controlledFields.refCounts[fieldName] ?? 0;\n if (current > 1) {\n state.controlledFields.refCounts[fieldName] = current - 1;\n return;\n }\n\n const isNested = Object.keys(state.controlledFields.refCounts).some(\n (key) => fieldName.startsWith(key) && key !== fieldName\n );\n\n // When nested within a field array, we should leave resetting up to the field array\n if (!isNested) {\n setPath(\n state.controlledFields.values,\n fieldName,\n getPath(state.formProps?.defaultValues, fieldName)\n );\n setPath(\n state.currentDefaultValues,\n fieldName,\n getPath(state.formProps?.defaultValues, fieldName)\n );\n }\n\n delete state.controlledFields.refCounts[fieldName];\n });\n },\n getValue: (fieldName) => getPath(get().controlledFields.values, fieldName),\n setValue: (fieldName, value) => {\n set((state) => {\n setPath(state.controlledFields.values, fieldName, value);\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n kickoffValueUpdate: (fieldName) => {\n const clear = () =>\n set((state) => {\n delete state.controlledFields.valueUpdateResolvers[fieldName];\n delete state.controlledFields.valueUpdatePromises[fieldName];\n });\n set((state) => {\n const promise = new Promise<void>((resolve) => {\n state.controlledFields.valueUpdateResolvers[fieldName] = resolve;\n }).then(clear);\n state.controlledFields.valueUpdatePromises[fieldName] = promise;\n });\n },\n\n awaitValueUpdate: async (fieldName) => {\n await get().controlledFields.valueUpdatePromises[fieldName];\n },\n\n array: {\n push: (fieldName, item) => {\n set((state) => {\n arrayUtil\n .getArray(state.controlledFields.values, fieldName)\n .push(item);\n arrayUtil.getArray(state.currentDefaultValues, fieldName).push(item);\n // New item added to the end, no need to update touched or error\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n\n swap: (fieldName, indexA, indexB) => {\n set((state) => {\n arrayUtil.swap(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n indexA,\n indexB\n );\n arrayUtil.swap(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n indexA,\n indexB\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.swap(array, indexA, indexB)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.swap(array, indexA, indexB)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n\n move: (fieldName, from, to) => {\n set((state) => {\n arrayUtil.move(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n from,\n to\n );\n arrayUtil.move(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n from,\n to\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.move(array, from, to)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.move(array, from, to)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n insert: (fieldName, index, item) => {\n set((state) => {\n arrayUtil.insert(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n index,\n item\n );\n arrayUtil.insert(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n index,\n item\n );\n // Even though this is a new item, we need to push around other items.\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.insertEmpty(array, index)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.insertEmpty(array, index)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n remove: (fieldName, index) => {\n set((state) => {\n arrayUtil.remove(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n index\n );\n arrayUtil.remove(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n index\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.remove(array, index)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.remove(array, index)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n pop: (fieldName) => {\n set((state) => {\n arrayUtil.getArray(state.controlledFields.values, fieldName).pop();\n arrayUtil.getArray(state.currentDefaultValues, fieldName).pop();\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n array.pop()\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n array.pop()\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n unshift: (fieldName, value) => {\n set((state) => {\n arrayUtil\n .getArray(state.controlledFields.values, fieldName)\n .unshift(value);\n arrayUtil\n .getArray(state.currentDefaultValues, fieldName)\n .unshift(value);\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.insertEmpty(array, 0)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.insertEmpty(array, 0)\n );\n });\n },\n replace: (fieldName, index, item) => {\n set((state) => {\n arrayUtil.replace(\n arrayUtil.getArray(state.controlledFields.values, fieldName),\n index,\n item\n );\n arrayUtil.replace(\n arrayUtil.getArray(state.currentDefaultValues, fieldName),\n index,\n item\n );\n arrayUtil.mutateAsArray(fieldName, state.touchedFields, (array) =>\n arrayUtil.replace(array, index, item)\n );\n arrayUtil.mutateAsArray(fieldName, state.fieldErrors, (array) =>\n arrayUtil.replace(array, index, item)\n );\n });\n get().controlledFields.kickoffValueUpdate(fieldName);\n },\n },\n },\n});\n\nexport const useRootFormStore = create<FormStoreState>()(\n immer((set, get) => ({\n forms: {},\n form: (formId) => {\n return get().forms[formId] ?? defaultFormState;\n },\n cleanupForm: (formId: InternalFormId) => {\n set((state) => {\n delete state.forms[formId];\n });\n },\n registerForm: (formId: InternalFormId) => {\n if (get().forms[formId]) return;\n set((state) => {\n state.forms[formId] = createFormState(\n (setter) => set((state) => setter(state.forms[formId])),\n () => get().forms[formId]\n ) as WritableDraft<FormState>;\n });\n },\n }))\n);\n","/**\n * Ponyfill of the HTMLFormElement.requestSubmit() method.\n * Based on polyfill from: https://github.com/javan/form-request-submit-polyfill/blob/main/form-request-submit-polyfill.js\n */\nexport const requestSubmit = (\n element: HTMLFormElement,\n submitter?: HTMLElement\n) => {\n // In vitest, let's test the polyfill.\n // Cypress will test the native implementation by nature of using chrome.\n if (\n typeof Object.getPrototypeOf(element).requestSubmit === \"function\" &&\n !import.meta.vitest\n ) {\n element.requestSubmit(submitter);\n return;\n }\n\n if (submitter) {\n validateSubmitter(element, submitter);\n submitter.click();\n return;\n }\n\n const dummySubmitter = document.createElement(\"input\");\n dummySubmitter.type = \"submit\";\n dummySubmitter.hidden = true;\n element.appendChild(dummySubmitter);\n dummySubmitter.click();\n element.removeChild(dummySubmitter);\n};\n\nfunction validateSubmitter(element: HTMLFormElement, submitter: HTMLElement) {\n // Should be redundant, but here for completeness\n const isHtmlElement = submitter instanceof HTMLElement;\n if (!isHtmlElement) {\n raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n }\n\n const hasSubmitType =\n \"type\" in submitter && (submitter as HTMLInputElement).type === \"submit\";\n if (!hasSubmitType)\n raise(TypeError, \"The specified element is not a submit button\");\n\n const isForCorrectForm =\n \"form\" in submitter && (submitter as HTMLInputElement).form === element;\n if (!isForCorrectForm)\n raise(\n DOMException,\n \"The specified element is not owned by this form element\",\n \"NotFoundError\"\n );\n}\n\ninterface ErrorConstructor {\n new (message: string, name?: string): Error;\n}\n\nfunction raise(\n errorConstructor: ErrorConstructor,\n message: string,\n name?: string\n): never {\n throw new errorConstructor(\n \"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\",\n name\n );\n}\n\nif (import.meta.vitest) {\n const { it, expect } = import.meta.vitest;\n it(\"should validate the submitter\", () => {\n const form = document.createElement(\"form\");\n document.body.appendChild(form);\n\n const submitter = document.createElement(\"input\");\n expect(() => validateSubmitter(null as any, null as any)).toThrow();\n expect(() => validateSubmitter(form, null as any)).toThrow();\n expect(() => validateSubmitter(form, submitter)).toThrow();\n expect(() =>\n validateSubmitter(form, document.createElement(\"div\"))\n ).toThrow();\n\n submitter.type = \"submit\";\n expect(() => validateSubmitter(form, submitter)).toThrow();\n\n form.appendChild(submitter);\n expect(() => validateSubmitter(form, submitter)).not.toThrow();\n\n form.removeChild(submitter);\n expect(() => validateSubmitter(form, submitter)).toThrow();\n\n document.body.appendChild(submitter);\n form.id = \"test-form\";\n submitter.setAttribute(\"form\", \"test-form\");\n expect(() => validateSubmitter(form, submitter)).not.toThrow();\n\n const button = document.createElement(\"button\");\n button.type = \"submit\";\n form.appendChild(button);\n expect(() => validateSubmitter(form, button)).not.toThrow();\n });\n}\n","import { getPath, setPath } from \"set-get\";\nimport invariant from \"tiny-invariant\";\n\n////\n// All of these array helpers are written in a way that mutates the original array.\n// This is because we're working with immer.\n////\n\nexport const getArray = (values: any, field: string): unknown[] => {\n const value = getPath(values, field);\n if (value === undefined || value === null) {\n const newValue: unknown[] = [];\n setPath(values, field, newValue);\n return newValue;\n }\n invariant(\n Array.isArray(value),\n `FieldArray: defaultValue value for ${field} must be an array, null, or undefined`\n );\n return value;\n};\n\nexport const sparseCopy = <T>(array: T[]): T[] => array.slice();\n\nexport const swap = (array: unknown[], indexA: number, indexB: number) => {\n const itemA = array[indexA];\n const itemB = array[indexB];\n\n const hasItemA = indexA in array;\n const hasItemB = indexB in array;\n\n // If we're dealing with a sparse array (i.e. one of the indeces doesn't exist),\n // we should keep it sparse\n if (hasItemA) {\n array[indexB] = itemA;\n } else {\n delete array[indexB];\n }\n\n if (hasItemB) {\n array[indexA] = itemB;\n } else {\n delete array[indexA];\n }\n};\n\n// A splice that can handle sparse arrays\nfunction sparseSplice(\n array: unknown[],\n start: number,\n deleteCount?: number,\n item?: unknown\n) {\n // Inserting an item into an array won't behave as we need it to if the array isn't\n // at least as long as the start index. We can force the array to be long enough like this.\n if (array.length < start && item) {\n array.length = start;\n }\n\n // If we just pass item in, it'll be undefined and splice will delete the item.\n if (arguments.length === 4) return array.splice(start, deleteCount!, item);\n else if (arguments.length === 3) return array.splice(start, deleteCount);\n return array.splice(start);\n}\n\nexport const move = (array: unknown[], from: number, to: number) => {\n const [item] = sparseSplice(array, from, 1);\n sparseSplice(array, to, 0, item);\n};\n\nexport const insert = (array: unknown[], index: number, value: unknown) => {\n sparseSplice(array, index, 0, value);\n};\n\nexport const insertEmpty = (array: unknown[], index: number) => {\n const tail = sparseSplice(array, index);\n tail.forEach((item, i) => {\n sparseSplice(array, index + i + 1, 0, item);\n });\n};\n\nexport const remove = (array: unknown[], index: number) => {\n sparseSplice(array, index, 1);\n};\n\nexport const replace = (array: unknown[], index: number, value: unknown) => {\n sparseSplice(array, index, 1, value);\n};\n\n/**\n * The purpose of this helper is to make it easier to update `fieldErrors` and `touchedFields`.\n * We key those objects by full paths to the fields.\n * When we're doing array mutations, that makes it difficult to update those objects.\n */\nexport const mutateAsArray = (\n field: string,\n obj: Record<string, any>,\n mutate: (arr: any[]) => void\n) => {\n const beforeKeys = new Set<string>();\n const arr: any[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(field) && key !== field) {\n beforeKeys.add(key);\n setPath(arr, key.substring(field.length), value);\n }\n }\n\n mutate(arr);\n for (const key of beforeKeys) {\n delete obj[key];\n }\n\n const newKeys = getDeepArrayPaths(arr);\n for (const key of newKeys) {\n const val = getPath(arr, key);\n if (val !== undefined) {\n obj[`${field}${key}`] = val;\n }\n }\n};\n\nconst getDeepArrayPaths = (obj: any, basePath: string = \"\"): string[] => {\n // This only needs to handle arrays and plain objects\n // and we can assume the first call is always an array.\n\n if (Array.isArray(obj)) {\n return obj.flatMap((item, index) =>\n getDeepArrayPaths(item, `${basePath}[${index}]`)\n );\n }\n\n if (typeof obj === \"object\") {\n return Object.keys(obj).flatMap((key) =>\n getDeepArrayPaths(obj[key], `${basePath}.${key}`)\n );\n }\n\n return [basePath];\n};\n\nif (import.meta.vitest) {\n const { describe, expect, it } = import.meta.vitest;\n\n // Count the actual number of items in the array\n // instead of just getting the length.\n // This is useful for validating that sparse arrays are handled correctly.\n const countArrayItems = (arr: any[]) => {\n let count = 0;\n arr.forEach(() => count++);\n return count;\n };\n\n describe(\"getArray\", () => {\n it(\"shoud get a deeply nested array that can be mutated to update the nested value\", () => {\n const values = {\n d: [\n { foo: \"bar\", baz: [true, false] },\n { e: true, f: \"hi\" },\n ],\n };\n const result = getArray(values, \"d[0].baz\");\n const finalValues = {\n d: [\n { foo: \"bar\", baz: [true, false, true] },\n { e: true, f: \"hi\" },\n ],\n };\n\n expect(result).toEqual([true, false]);\n result.push(true);\n expect(values).toEqual(finalValues);\n });\n\n it(\"should return an empty array that can be mutated if result is null or undefined\", () => {\n const values = {};\n const result = getArray(values, \"a.foo[0].bar\");\n const finalValues = {\n a: { foo: [{ bar: [\"Bob ross\"] }] },\n };\n\n expect(result).toEqual([]);\n result.push(\"Bob ross\");\n expect(values).toEqual(finalValues);\n });\n\n it(\"should throw if the value is defined and not an array\", () => {\n const values = { foo: \"foo\" };\n expect(() => getArray(values, \"foo\")).toThrow();\n });\n });\n\n describe(\"swap\", () => {\n it(\"should swap two items\", () => {\n const array = [1, 2, 3];\n swap(array, 0, 1);\n expect(array).toEqual([2, 1, 3]);\n });\n\n it(\"should work for sparse arrays\", () => {\n // A bit of a sanity check for native array behavior\n const arr = [] as any[];\n arr[0] = true;\n swap(arr, 0, 2);\n\n expect(countArrayItems(arr)).toEqual(1);\n expect(0 in arr).toBe(false);\n expect(2 in arr).toBe(true);\n expect(arr[2]).toEqual(true);\n });\n });\n\n describe(\"move\", () => {\n it(\"should move an item to a new index\", () => {\n const array = [1, 2, 3];\n move(array, 0, 1);\n expect(array).toEqual([2, 1, 3]);\n });\n\n it(\"should work with sparse arrays\", () => {\n const array = [1];\n move(array, 0, 2);\n\n expect(countArrayItems(array)).toEqual(1);\n expect(array).toEqual([undefined, undefined, 1]);\n });\n });\n\n describe(\"insert\", () => {\n it(\"should insert an item at a new index\", () => {\n const array = [1, 2, 3];\n insert(array, 1, 4);\n expect(array).toEqual([1, 4, 2, 3]);\n });\n\n it(\"should be able to insert falsey values\", () => {\n const array = [1, 2, 3];\n insert(array, 1, null);\n expect(array).toEqual([1, null, 2, 3]);\n });\n\n it(\"should handle sparse arrays\", () => {\n const array: any[] = [];\n array[2] = true;\n insert(array, 0, true);\n\n expect(countArrayItems(array)).toEqual(2);\n expect(array).toEqual([true, undefined, undefined, true]);\n });\n });\n\n describe(\"insertEmpty\", () => {\n it(\"should insert an empty item at a given index\", () => {\n const array = [1, 2, 3];\n insertEmpty(array, 1);\n // eslint-disable-next-line no-sparse-arrays\n expect(array).toStrictEqual([1, , 2, 3]);\n expect(array).not.toStrictEqual([1, undefined, 2, 3]);\n });\n\n it(\"should work with already sparse arrays\", () => {\n // eslint-disable-next-line no-sparse-arrays\n const array = [, , 1, , 2, , 3];\n insertEmpty(array, 3);\n // eslint-disable-next-line no-sparse-arrays\n expect(array).toStrictEqual([, , 1, , , 2, , 3]);\n expect(array).not.toStrictEqual([\n undefined,\n undefined,\n 1,\n undefined,\n undefined,\n 2,\n undefined,\n 3,\n ]);\n });\n });\n\n describe(\"remove\", () => {\n it(\"should remove an item at a given index\", () => {\n const array = [1, 2, 3];\n remove(array, 1);\n expect(array).toEqual([1, 3]);\n });\n\n it(\"should handle sparse arrays\", () => {\n const array: any[] = [];\n array[2] = true;\n remove(array, 0);\n\n expect(countArrayItems(array)).toEqual(1);\n expect(array).toEqual([undefined, true]);\n });\n });\n\n describe(\"replace\", () => {\n it(\"should replace an item at a given index\", () => {\n const array = [1, 2, 3];\n replace(array, 1, 4);\n expect(array).toEqual([1, 4, 3]);\n });\n\n it(\"should handle sparse arrays\", () => {\n const array: any[] = [];\n array[2] = true;\n replace(array, 0, true);\n expect(countArrayItems(array)).toEqual(2);\n expect(array).toEqual([true, undefined, true]);\n });\n });\n\n describe(\"mutateAsArray\", () => {\n it(\"should handle swap\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[2]\": \"bar\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n swap(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0]\": \"bar\",\n \"myField[2]\": \"foo\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should swap sparse arrays\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n swap(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[2]\": \"foo\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should handle arrays with nested values\", () => {\n const values = {\n myField: \"something\",\n \"myField[0].title\": \"foo\",\n \"myField[0].note\": \"bar\",\n \"myField[2].title\": \"other\",\n \"myField[2].note\": \"other\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n swap(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0].title\": \"other\",\n \"myField[0].note\": \"other\",\n \"myField[2].title\": \"foo\",\n \"myField[2].note\": \"bar\",\n otherField: \"baz\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should handle move\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[1]\": \"bar\",\n \"myField[2]\": \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n move(arr, 0, 2);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0]\": \"bar\",\n \"myField[1]\": \"baz\",\n \"myField[2]\": \"foo\",\n \"otherField[0]\": \"something else\",\n });\n });\n\n it(\"should not create keys for `undefined`\", () => {\n const values = {\n \"myField[0]\": \"foo\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n arr.unshift(undefined);\n });\n expect(Object.keys(values)).toHaveLength(1);\n expect(values).toEqual({\n \"myField[1]\": \"foo\",\n });\n });\n\n it(\"should handle remove\", () => {\n const values = {\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[1]\": \"bar\",\n \"myField[2]\": \"baz\",\n \"otherField[0]\": \"something else\",\n };\n mutateAsArray(\"myField\", values, (arr) => {\n remove(arr, 1);\n });\n expect(values).toEqual({\n myField: \"something\",\n \"myField[0]\": \"foo\",\n \"myField[1]\": \"baz\",\n \"otherField[0]\": \"something else\",\n });\n expect(\"myField[2]\" in values).toBe(false);\n });\n });\n\n describe(\"getDeepArrayPaths\", () => {\n it(\"should return all paths recursively\", () => {\n const obj = [\n true,\n true,\n [true, true],\n { foo: true, bar: { baz: true, test: [true] } },\n ];\n\n expect(getDeepArrayPaths(obj, \"myField\")).toEqual([\n \"myField[0]\",\n \"myField[1]\",\n \"myField[2][0]\",\n \"myField[2][1]\",\n \"myField[3].foo\",\n \"myField[3].bar.baz\",\n \"myField[3].bar.test[0]\",\n ]);\n });\n });\n}\n","import { FormState, useRootFormStore } from \"./createFormStore\";\nimport { InternalFormId } from \"./types\";\n\nexport const useFormStore = <T>(\n formId: InternalFormId,\n selector: (state: FormState) => T\n) => {\n return useRootFormStore((state) => selector(state.form(formId)));\n};\n","import { useCallback, useEffect } from \"react\";\nimport { InternalFormContextValue } from \"../formContext\";\nimport { useFieldDefaultValue } from \"../hooks\";\nimport { useFormStore } from \"./storeHooks\";\nimport { InternalFormId } from \"./types\";\n\nexport const useControlledFieldValue = (\n context: InternalFormContextValue,\n field: string\n) => {\n const value = useFormStore(context.formId, (state) =>\n state.controlledFields.getValue(field)\n );\n const isFormHydrated = useFormStore(\n context.formId,\n (state) => state.isHydrated\n );\n const defaultValue = useFieldDefaultValue(field, context);\n\n return isFormHydrated ? value : defaultValue;\n};\n\nexport const useRegisterControlledField = (\n context: InternalFormContextValue,\n field: string\n) => {\n const resolveUpdate = useFormStore(\n context.formId,\n (state) => state.controlledFields.valueUpdateResolvers[field]\n );\n useEffect(() => {\n resolveUpdate?.();\n }, [resolveUpdate]);\n\n const register = useFormStore(\n context.formId,\n (state) => state.controlledFields.register\n );\n const unregister = useFormStore(\n context.formId,\n (state) => state.controlledFields.unregister\n );\n useEffect(() => {\n register(field);\n return () => unregister(field);\n }, [context.formId, field, register, unregister]);\n};\n\nexport const useControllableValue = (\n context: InternalFormContextValue,\n field: string\n) => {\n useRegisterControlledField(context, field);\n\n const setControlledFieldValue = useFormStore(\n context.formId,\n (state) => state.controlledFields.setValue\n );\n const setValue = useCallback(\n (value: unknown) => setControlledFieldValue(field, value),\n [field, setControlledFieldValue]\n );\n\n const value = useControlledFieldValue(context, field);\n\n return [value, setValue] as const;\n};\n\nexport const useUpdateControllableValue = (formId: InternalFormId) => {\n const setValue = useFormStore(\n formId,\n (state) => state.controlledFields.setValue\n );\n return useCallback(\n (field: string, value: unknown) => setValue(field, value),\n [setValue]\n );\n};\n\nexport const useAwaitValue = (formId: InternalFormId) => {\n const awaitValue = useFormStore(\n formId,\n (state) => state.controlledFields.awaitValueUpdate\n );\n return useCallback((field: string) => awaitValue(field), [awaitValue]);\n};\n","import { json } from \"@remix-run/server-runtime\";\nimport {\n formDefaultValuesKey,\n FORM_DEFAULTS_FIELD,\n} from \"./internal/constants\";\nimport {\n ValidatorError,\n ValidationErrorResponseData,\n} from \"./validation/types\";\n\n/**\n * Takes the errors from a `Validator` and returns a `Response`.\n * When you return this from your action, `ValidatedForm` on the frontend will automatically\n * display the errors on the correct fields on the correct form.\n *\n * You can also provide a second argument to `validationError`\n * to specify how to repopulate the form when JS is disabled.\n *\n * @example\n * ```ts\n * const result = validator.validate(await request.formData());\n * if (result.error) return validationError(result.error, result.submittedData);\n * ```\n */\nexport function validationError(\n error: ValidatorError,\n repopulateFields?: unknown,\n init?: ResponseInit\n) {\n return json<ValidationErrorResponseData>(\n {\n fieldErrors: error.fieldErrors,\n subaction: error.subaction,\n repopulateFields,\n formId: error.formId,\n },\n { status: 422, ...init }\n );\n}\n\nexport type FormDefaults = {\n [formDefaultsKey: `${typeof FORM_DEFAULTS_FIELD}_${string}`]: any;\n};\n\n// FIXME: Remove after https://github.com/egoist/tsup/issues/813 is fixed\nexport type internal_FORM_DEFAULTS_FIELD = typeof FORM_DEFAULTS_FIELD;\n\nexport const setFormDefaults = <DataType = any>(\n formId: string,\n defaultValues: Partial<DataType>\n): FormDefaults => ({\n [formDefaultValuesKey(formId)]: defaultValues,\n});\n","import {\n FetcherWithComponents,\n Form as RemixForm,\n FormMethod,\n useSubmit,\n SubmitOptions,\n FormEncType,\n} from \"@remix-run/react\";\nimport React, {\n ComponentProps,\n FormEvent,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport * as R from \"remeda\";\nimport { useIsSubmitting, useIsValid } from \"./hooks\";\nimport { FORM_ID_FIELD } from \"./internal/constants\";\nimport {\n InternalFormContext,\n InternalFormContextValue,\n} from \"./internal/formContext\";\nimport {\n useDefaultValuesFromLoader,\n useErrorResponseForForm,\n useHasActiveFormSubmit,\n useSetFieldErrors,\n} from \"./internal/hooks\";\nimport { MultiValueMap, useMultiValueMap } from \"./internal/MultiValueMap\";\nimport {\n SyncedFormProps,\n useRootFormStore,\n} from \"./internal/state/createFormStore\";\nimport { useFormStore } from \"./internal/state/storeHooks\";\nimport { useSubmitComplete } from \"./internal/submissionCallbacks\";\nimport {\n mergeRefs,\n useDeepEqualsMemo,\n useIsomorphicLayoutEffect as useLayoutEffect,\n} from \"./internal/util\";\nimport { FieldErrors, Validator } from \"./validation/types\";\n\ntype DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\ntype SubactionData<\n DataType,\n Subaction extends string | undefined\n> = DataType & { subaction: Subaction };\n\n// Not all validation libraries support encoding a literal value in the schema type (e.g. yup).\n// This condition here allows us to provide strictness for users who are using a validation library that does support it,\n// but also allows us to support users who are using a validation library that doesn't support it.\ntype DataForSubaction<\n DataType,\n Subaction extends string | undefined\n> = Subaction extends string // Not all validation libraries support encoding a literal value in the schema type.\n ? SubactionData<DataType, Subaction> extends undefined\n ? DataType\n : SubactionData<DataType, Subaction>\n : DataType;\n\nexport type FormProps<DataType, Subaction extends string | undefined> = {\n /**\n * A `Validator` object that describes how to validate the form.\n */\n validator: Validator<DataType>;\n /**\n * A submit callback that gets called when the form is submitted\n * after all validations have been run.\n */\n onSubmit?: (\n data: DataForSubaction<DataType, Subaction>,\n event: React.FormEvent<HTMLFormElement>\n ) => void | Promise<void>;\n /**\n * Allows you to provide a `fetcher` from Remix's `useFetcher` hook.\n * The form will use the fetcher for loading states, action data, etc\n * instead of the default form action.\n */\n fetcher?: FetcherWithComponents<any>;\n /**\n * Accepts an object of default values for the form\n * that will automatically be propagated to the form fields via `useField`.\n */\n defaultValues?: DeepPartial<DataForSubaction<DataType, Subaction>>;\n /**\n * A ref to the form element.\n */\n formRef?: React.RefObject<HTMLFormElement>;\n /**\n * An optional sub-action to use for the form.\n * Setting a value here will cause the form to be submitted with an extra `subaction` value.\n * This can be useful when there are multiple forms on the screen handled by the same action.\n */\n subaction?: Subaction;\n /**\n * Reset the form to the default values after the form has been successfully submitted.\n * This is useful if you want to submit the same form multiple times,\n * and don't redirect in-between submissions.\n */\n resetAfterSubmit?: boolean;\n /**\n * Normally, the first invalid input will be focused when the validation fails on form submit.\n * Set this to `false` to disable this behavior.\n */\n disableFocusOnError?: boolean;\n} & Omit<ComponentProps<typeof RemixForm>, \"onSubmit\">;\n\nconst getDataFromForm = (el: HTMLFormElement) => new FormData(el);\n\nfunction nonNull<T>(value: T | null | undefined): value is T {\n return value !== null;\n}\n\nconst focusFirstInvalidInput = (\n fieldErrors: FieldErrors,\n customFocusHandlers: MultiValueMap<string, () => void>,\n formElement: HTMLFormElement\n) => {\n const namesInOrder = [...formElement.elements]\n .map((el) => {\n const input = el instanceof RadioNodeList ? el[0] : el;\n if (input instanceof HTMLElement && \"name\" in input)\n return (input as any).name;\n return null;\n })\n .filter(nonNull)\n .filter((name) => name in fieldErrors);\n const uniqueNamesInOrder = R.uniq(namesInOrder);\n\n for (const fieldName of uniqueNamesInOrder) {\n if (customFocusHandlers.has(fieldName)) {\n customFocusHandlers.getAll(fieldName).forEach((handler) => {\n handler();\n });\n break;\n }\n\n const elem = formElement.elements.namedItem(fieldName);\n if (!elem) continue;\n\n if (elem instanceof RadioNodeList) {\n const selectedRadio =\n [...elem]\n .filter(\n (item): item is HTMLInputElement => item instanceof HTMLInputElement\n )\n .find((item) => item.value === elem.value) ?? elem[0];\n if (selectedRadio && selectedRadio instanceof HTMLInputElement) {\n selectedRadio.focus();\n break;\n }\n }\n\n if (elem instanceof HTMLElement) {\n if (elem instanceof HTMLInputElement && elem.type === \"hidden\") {\n continue;\n }\n\n elem.focus();\n break;\n }\n }\n};\n\nconst useFormId = (providedId?: string): string | symbol => {\n // We can use a `Symbol` here because we only use it after hydration\n const [symbolId] = useState(() => Symbol(\"remix-validated-form-id\"));\n return providedId ?? symbolId;\n};\n\n/**\n * Use a component to access the state so we don't cause\n * any extra rerenders of the whole form.\n */\nconst FormResetter = ({\n resetAfterSubmit,\n formRef,\n}: {\n resetAfterSubmit: boolean;\n formRef: RefObject<HTMLFormElement>;\n}) => {\n const isSubmitting = useIsSubmitting();\n const isValid = useIsValid();\n useSubmitComplete(isSubmitting, () => {\n if (isValid && resetAfterSubmit) {\n formRef.current?.reset();\n }\n });\n return null;\n};\n\nfunction formEventProxy<T extends object>(event: T): T {\n let defaultPrevented = false;\n return new Proxy(event, {\n get: (target, prop) => {\n if (prop === \"preventDefault\") {\n return () => {\n defaultPrevented = true;\n };\n }\n\n if (prop === \"defaultPrevented\") {\n return defaultPrevented;\n }\n\n return target[prop as keyof T];\n },\n }) as T;\n}\n\ntype HTMLSubmitEvent = React.BaseSyntheticEvent<\n SubmitEvent,\n Event,\n HTMLFormElement\n>;\n\ntype HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement;\n\n/**\n * The primary form component of `remix-validated-form`.\n */\nexport function ValidatedForm<\n DataType extends { [fieldName: string]: any },\n Subaction extends string | undefined\n>({\n validator,\n onSubmit,\n children,\n fetcher,\n action,\n defaultValues: unMemoizedDefaults,\n formRef: formRefProp,\n onReset,\n subaction,\n resetAfterSubmit = false,\n disableFocusOnError,\n method,\n replace,\n id,\n preventScrollReset,\n relative,\n encType,\n ...rest\n}: FormProps<DataType, Subaction>) {\n const formId = useFormId(id);\n const providedDefaultValues = useDeepEqualsMemo(unMemoizedDefaults);\n const contextValue = useMemo<InternalFormContextValue>(\n () => ({\n formId,\n action,\n subaction,\n defaultValuesProp: providedDefaultValues,\n fetcher,\n }),\n [action, fetcher, formId, providedDefaultValues, subaction]\n );\n const backendError = useErrorResponseForForm(contextValue);\n const backendDefaultValues = useDefaultValuesFromLoader(contextValue);\n const hasActiveSubmission = useHasActiveFormSubmit(contextValue);\n const formRef = useRef<HTMLFormElement>(null);\n const Form = fetcher?.Form ?? RemixForm;\n\n const submit = useSubmit();\n const setFieldErrors = useSetFieldErrors(formId);\n const setFieldError = useFormStore(formId, (state) => state.setFieldError);\n const reset = useFormStore(formId, (state) => state.reset);\n const startSubmit = useFormStore(formId, (state) => state.startSubmit);\n const endSubmit = useFormStore(formId, (state) => state.endSubmit);\n const syncFormProps = useFormStore(formId, (state) => state.syncFormProps);\n const setFormElementInState = useFormStore(\n formId,\n (state) => state.setFormElement\n );\n const cleanupForm = useRootFormStore((state) => state.cleanupForm);\n const registerForm = useRootFormStore((state) => state.registerForm);\n\n const customFocusHandlers = useMultiValueMap<string, () => void>();\n const registerReceiveFocus: SyncedFormProps[\"registerReceiveFocus\"] =\n useCallback(\n (fieldName, handler) => {\n customFocusHandlers().add(fieldName, handler);\n return () => {\n customFocusHandlers().remove(fieldName, handler);\n };\n },\n [customFocusHandlers]\n );\n\n // TODO: all these hooks running at startup cause extra, unnecessary renders\n // There must be a nice way to avoid this.\n useLayoutEffect(() => {\n registerForm(formId);\n return () => cleanupForm(formId);\n }, [cleanupForm, formId, registerForm]);\n\n useLayoutEffect(() => {\n syncFormProps({\n action,\n defaultValues: providedDefaultValues ?? backendDefaultValues ?? {},\n subaction,\n registerReceiveFocus,\n validator,\n });\n }, [\n action,\n providedDefaultValues,\n registerReceiveFocus,\n subaction,\n syncFormProps,\n backendDefaultValues,\n validator,\n ]);\n\n useLayoutEffect(() => {\n setFormElementInState(formRef.current);\n }, [setFormElementInState]);\n\n useEffect(() => {\n setFieldErrors(backendError?.fieldErrors ?? {});\n if (!disableFocusOnError && backendError?.fieldErrors) {\n focusFirstInvalidInput(\n backendError.fieldErrors,\n customFocusHandlers(),\n formRef.current!\n );\n }\n }, [\n backendError?.fieldErrors,\n customFocusHandlers,\n disableFocusOnError,\n setFieldErrors,\n setFieldError,\n ]);\n\n useSubmitComplete(hasActiveSubmission, () => {\n endSubmit();\n });\n\n const handleSubmit = async (\n e: FormEvent<HTMLFormElement>,\n target: typeof e.currentTarget,\n nativeEvent: HTMLSubmitEvent[\"nativeEvent\"]\n ) => {\n startSubmit();\n const submitter = nativeEvent.submitter as HTMLFormSubmitter | null;\n const formMethod = (submitter?.formMethod as FormMethod) || method;\n const formData = getDataFromForm(target);\n if (submitter?.name) {\n formData.append(submitter.name, submitter.value);\n }\n\n const result = await validator.validate(formData);\n if (result.error) {\n setFieldErrors(result.error.fieldErrors);\n endSubmit();\n if (!disableFocusOnError) {\n focusFirstInvalidInput(\n result.error.fieldErrors,\n customFocusHandlers(),\n formRef.current!\n );\n }\n } else {\n setFieldErrors({});\n const eventProxy = formEventProxy(e);\n await onSubmit?.(result.data as any, eventProxy);\n if (eventProxy.defaultPrevented) {\n endSubmit();\n return;\n }\n\n const opts: SubmitOptions = {\n method: formMethod,\n replace,\n preventScrollReset,\n relative,\n action,\n encType: encType as FormEncType | undefined,\n };\n\n // We deviate from the Remix code here a bit because of our async submit.\n // In Remix's `FormImpl`, they use `event.currentTarget` to get the form,\n // but we already have the form in `formRef.current` so we can just use that.\n // If we use `event.currentTarget` here, it will break because `currentTarget`\n // will have changed since the start of the submission.\n if (fetcher) fetcher.submit(formData, opts);\n else submit(formData, opts);\n }\n };\n\n return (\n <Form\n ref={mergeRefs([formRef, formRefProp])}\n {...rest}\n id={id}\n action={action}\n method={method}\n encType={encType}\n replace={replace}\n preventScrollReset={preventScrollReset}\n relative={relative}\n onSubmit={(e) => {\n e.preventDefault();\n handleSubmit(\n e,\n e.currentTarget,\n (e as unknown as HTMLSubmitEvent).nativeEvent\n );\n }}\n onReset={(event) => {\n onReset?.(event);\n if (event.defaultPrevented) return;\n reset();\n }}\n >\n <InternalFormContext.Provider value={contextValue}>\n <>\n <FormResetter formRef={formRef} resetAfterSubmit={resetAfterSubmit} />\n {subaction && (\n <input type=\"hidden\" value={subaction} name=\"subaction\" />\n )}\n {id && <input type=\"hidden\" value={id} name={FORM_ID_FIELD} />}\n {children}\n </>\n </InternalFormContext.Provider>\n </Form>\n );\n}\n","import { useCallback, useRef } from \"react\";\n\nexport class MultiValueMap<Key, Value> {\n private dict: Map<Key, Value[]> = new Map();\n\n add = (key: Key, value: Value) => {\n if (this.dict.has(key)) {\n this.dict.get(key)!.push(value);\n } else {\n this.dict.set(key, [value]);\n }\n };\n\n delete = (key: Key) => {\n this.dict.delete(key);\n };\n\n remove = (key: Key, value: Value) => {\n if (!this.dict.has(key)) return;\n const array = this.dict.get(key)!;\n const index = array.indexOf(value);\n if (index !== -1) array.splice(index, 1);\n if (array.length === 0) this.dict.delete(key);\n };\n\n getAll = (key: Key): Value[] => {\n return this.dict.get(key) ?? [];\n };\n\n entries = (): IterableIterator<[Key, Value[]]> => this.dict.entries();\n\n values = (): IterableIterator<Value[]> => this.dict.values();\n\n has = (key: Key): boolean => this.dict.has(key);\n}\n\nexport const useMultiValueMap = <Key, Value>() => {\n const ref = useRef<MultiValueMap<Key, Value> | null>(null);\n return useCallback(() => {\n if (ref.current) return ref.current;\n ref.current = new MultiValueMap();\n return ref.current;\n }, []);\n};\n","import { useEffect, useRef } from \"react\";\n\nexport function useSubmitComplete(isSubmitting: boolean, callback: () => void) {\n const isPending = useRef(false);\n useEffect(() => {\n if (isSubmitting) {\n isPending.current = true;\n }\n\n if (!isSubmitting && isPending.current) {\n isPending.current = false;\n callback();\n }\n });\n}\n","import type React from \"react\";\nimport { useEffect, useLayoutEffect, useRef } from \"react\";\nimport * as R from \"remeda\";\n\nexport const omit = (obj: any, ...keys: string[]) => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const mergeRefs = <T = any>(\n refs: Array<React.MutableRefObject<T> | React.LegacyRef<T> | undefined>\n): React.RefCallback<T> => {\n return (value: T) => {\n refs.filter(Boolean).forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n};\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport const useDeepEqualsMemo = <T>(item: T): T => {\n const ref = useRef<T>(item);\n const areEqual = ref.current === item || R.equals(ref.current, item);\n useEffect(() => {\n if (!areEqual) {\n ref.current = item;\n }\n });\n return areEqual ? ref.current : item;\n};\n","import * as R from \"remeda\";\nimport { CreateValidatorArg, GenericObject, Validator } from \"..\";\nimport { FORM_ID_FIELD } from \"../internal/constants\";\nimport { objectFromPathEntries } from \"../internal/flatten\";\n\nconst preprocessFormData = (data: GenericObject | FormData): GenericObject => {\n // A slightly janky way of determining if the data is a FormData object\n // since node doesn't really have FormData\n if (\"entries\" in data && typeof data.entries === \"function\")\n return objectFromPathEntries([...data.entries()]);\n return objectFromPathEntries(Object.entries(data));\n};\n\nconst omitInternalFields = (data: GenericObject): GenericObject =>\n R.omit(data, [FORM_ID_FIELD]);\n\n/**\n * Used to create a validator for a form.\n * It provides built-in handling for unflattening nested objects and\n * extracting the values from FormData.\n */\nexport function createValidator<T>(\n validator: CreateValidatorArg<T>\n): Validator<T> {\n return {\n validate: async (value) => {\n const data = preprocessFormData(value);\n const result = await validator.validate(omitInternalFields(data));\n\n if (result.error) {\n return {\n data: undefined,\n error: {\n fieldErrors: result.error,\n subaction: data.subaction,\n formId: data[FORM_ID_FIELD],\n },\n submittedData: data,\n formId: data[FORM_ID_FIELD],\n };\n }\n\n return {\n data: result.data,\n error: undefined,\n submittedData: data,\n formId: data[FORM_ID_FIELD],\n };\n },\n validateField: (data: GenericObject | FormData, field: string) =>\n validator.validateField(preprocessFormData(data), field),\n };\n}\n","import { setPath } from \"set-get\";\nimport { MultiValueMap } from \"./MultiValueMap\";\n\nexport const objectFromPathEntries = (entries: [string, any][]) => {\n const map = new MultiValueMap<string, any>();\n entries.forEach(([key, value]) => map.add(key, value));\n return [...map.entries()].reduce(\n (acc, [key, value]) =>\n setPath(acc, key, value.length === 1 ? value[0] : value),\n {} as Record<string, any>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport {\n useInternalFormContext,\n useRegisterReceiveFocus,\n} from \"./internal/hooks\";\nimport { useFormHelpers, useFormState } from \"./unreleased/formStateHooks\";\nimport {\n FieldErrors,\n TouchedFields,\n ValidationResult,\n} from \"./validation/types\";\n\nexport type FormContextValue = {\n /**\n * All the errors in all the fields in the form.\n */\n fieldErrors: FieldErrors;\n /**\n * Clear the errors of the specified fields.\n */\n clearError: (...names: string[]) => void;\n /**\n * Validate the specified field.\n */\n validateField: (fieldName: string) => Promise<string | null>;\n /**\n * The `action` prop of the form.\n */\n action?: string;\n /**\n * The `subaction` prop of the form.\n */\n subaction?: string;\n /**\n * Whether or not the form is submitting.\n */\n isSubmitting: boolean;\n /**\n * Whether or not a submission has been attempted.\n * This is true once the form has been submitted, even if there were validation errors.\n * Resets to false when the form is reset.\n */\n hasBeenSubmitted: boolean;\n /**\n * Whether or not the form is valid.\n */\n isValid: boolean;\n /**\n * The default values of the form.\n */\n defaultValues?: { [fieldName: string]: any };\n /**\n * Register a custom focus handler to be used when\n * the field needs to receive focus due to a validation error.\n */\n registerReceiveFocus: (fieldName: string, handler: () => void) => () => void;\n /**\n * Any fields that have been touched by the user.\n */\n touchedFields: TouchedFields;\n /**\n * Change the touched state of the specified field.\n */\n setFieldTouched: (fieldName: string, touched: boolean) => void;\n /**\n * Validate the whole form and populate any errors.\n */\n validate: () => Promise<ValidationResult<unknown>>;\n /**\n * Clears all errors on the form.\n */\n clearAllErrors: () => void;\n /**\n * Resets the form.\n *\n * _Note_: The equivalent behavior can be achieved by calling formElement.reset()\n * or clicking a button element with `type=\"reset\"`.\n */\n reset: () => void;\n /**\n * Submits the form, running all validations first.\n *\n * _Note_: This is equivalent to clicking a button element with `type=\"submit\"` or calling formElement.submit().\n */\n submit: () => void;\n /**\n * Returns the current form values as FormData\n */\n getValues: () => FormData;\n};\n\n/**\n * Provides access to some of the internal state of the form.\n */\nexport const useFormContext = (formId?: string): FormContextValue => {\n // Try to access context so we get our error specific to this hook if it's not there\n const context = useInternalFormContext(formId, \"useFormContext\");\n const state = useFormState(formId);\n const {\n clearError: internalClearError,\n setTouched,\n validateField,\n clearAllErrors,\n validate,\n reset,\n submit,\n getValues,\n } = useFormHelpers(formId);\n\n const registerReceiveFocus = useRegisterReceiveFocus(context.formId);\n\n const clearError = useCallback(\n (...names: string[]) => {\n names.forEach((name) => {\n internalClearError(name);\n });\n },\n [internalClearError]\n );\n\n return useMemo(\n () => ({\n ...state,\n setFieldTouched: setTouched,\n validateField,\n clearError,\n registerReceiveFocus,\n clearAllErrors,\n validate,\n reset,\n submit,\n getValues,\n }),\n [\n clearAllErrors,\n clearError,\n registerReceiveFocus,\n reset,\n setTouched,\n state,\n submit,\n validate,\n validateField,\n getValues,\n ]\n );\n};\n","import { useMemo } from \"react\";\nimport {} from \"../internal/getInputProps\";\nimport {\n useInternalFormContext,\n useClearError,\n useSetTouched,\n useDefaultValuesForForm,\n useFieldErrorsForForm,\n useInternalIsSubmitting,\n useInternalHasBeenSubmitted,\n useTouchedFields,\n useInternalIsValid,\n useFieldErrors,\n useValidate,\n useSetFieldErrors,\n useResetFormElement,\n useSyncedDefaultValues,\n useFormActionProp,\n useFormSubactionProp,\n useSubmitForm,\n useFormValues,\n useSmartValidate,\n} from \"../internal/hooks\";\nimport {\n FieldErrors,\n TouchedFields,\n ValidationResult,\n} from \"../validation/types\";\n\nexport type FormState = {\n fieldErrors: FieldErrors;\n isSubmitting: boolean;\n hasBeenSubmitted: boolean;\n touchedFields: TouchedFields;\n defaultValues: { [fieldName: string]: any };\n action?: string;\n subaction?: string;\n isValid: boolean;\n};\n\n/**\n * Returns information about the form.\n *\n * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.\n */\nexport const useFormState = (formId?: string): FormState => {\n const formContext = useInternalFormContext(formId, \"useFormState\");\n const isSubmitting = useInternalIsSubmitting(formContext.formId);\n const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);\n const touchedFields = useTouchedFields(formContext.formId);\n const isValid = useInternalIsValid(formContext.formId);\n const action = useFormActionProp(formContext.formId);\n const subaction = useFormSubactionProp(formContext.formId);\n\n const syncedDefaultValues = useSyncedDefaultValues(formContext.formId);\n const defaultValuesToUse = useDefaultValuesForForm(formContext);\n const hydratedDefaultValues =\n defaultValuesToUse.hydrateTo(syncedDefaultValues);\n\n const fieldErrorsFromState = useFieldErrors(formContext.formId);\n const fieldErrorsToUse = useFieldErrorsForForm(formContext);\n const hydratedFieldErrors = fieldErrorsToUse.hydrateTo(fieldErrorsFromState);\n\n return useMemo(\n () => ({\n action,\n subaction,\n defaultValues: hydratedDefaultValues,\n fieldErrors: hydratedFieldErrors ?? {},\n hasBeenSubmitted,\n isSubmitting,\n touchedFields,\n isValid,\n }),\n [\n action,\n hasBeenSubmitted,\n hydratedDefaultValues,\n hydratedFieldErrors,\n isSubmitting,\n isValid,\n subaction,\n touchedFields,\n ]\n );\n};\n\nexport type FormHelpers = {\n /**\n * Clear the error of the specified field.\n */\n clearError: (fieldName: string) => void;\n /**\n * Validate the specified field.\n */\n validateField: (fieldName: string) => Promise<string | null>;\n /**\n * Change the touched state of the specified field.\n */\n setTouched: (fieldName: string, touched: boolean) => void;\n /**\n * Validate the whole form and populate any errors.\n */\n validate: () => Promise<ValidationResult<unknown>>;\n /**\n * Clears all errors on the form.\n */\n clearAllErrors: () => void;\n /**\n * Resets the form.\n *\n * _Note_: The equivalent behavior can be achieved by calling formElement.reset()\n * or clicking a button element with `type=\"reset\"`.\n */\n reset: () => void;\n /**\n * Submits the form, running all validations first.\n *\n * _Note_: This is equivalent to clicking a button element with `type=\"submit\"` or calling formElement.submit().\n */\n submit: () => void;\n /**\n * Returns the current form values as FormData\n */\n getValues: () => FormData;\n};\n\n/**\n * Returns helpers that can be used to update the form state.\n *\n * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.\n */\nexport const useFormHelpers = (formId?: string): FormHelpers => {\n const formContext = useInternalFormContext(formId, \"useFormHelpers\");\n const setTouched = useSetTouched(formContext);\n const validateField = useSmartValidate(formContext.formId);\n const validate = useValidate(formContext.formId);\n const clearError = useClearError(formContext);\n const setFieldErrors = useSetFieldErrors(formContext.formId);\n const reset = useResetFormElement(formContext.formId);\n const submit = useSubmitForm(formContext.formId);\n const getValues = useFormValues(formContext.formId);\n return useMemo(\n () => ({\n setTouched,\n validateField: async (fieldName: string) => {\n const res = await validateField({\n alwaysIncludeErrorsFromFields: [fieldName],\n });\n return res.error?.fieldErrors[fieldName] ?? null;\n },\n clearError,\n validate,\n clearAllErrors: () => setFieldErrors({}),\n reset,\n submit,\n getValues,\n }),\n [\n clearError,\n reset,\n setFieldErrors,\n setTouched,\n submit,\n validate,\n validateField,\n getValues,\n ]\n );\n};\n","import { nanoid } from \"nanoid\";\nimport React, { useMemo, useRef, useState } from \"react\";\nimport { useCallback } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { InternalFormContextValue } from \"../formContext\";\nimport {\n useFieldDefaultValue,\n useFieldError,\n useInternalFormContext,\n useInternalHasBeenSubmitted,\n useSmartValidate,\n} from \"../hooks\";\nimport * as arrayUtil from \"./arrayUtil\";\nimport { useRegisterControlledField } from \"./controlledFields\";\nimport { useFormStore } from \"./storeHooks\";\n\nexport type FieldArrayValidationBehavior = \"onChange\" | \"onSubmit\";\n\nexport type FieldArrayValidationBehaviorOptions = {\n initial: FieldArrayValidationBehavior;\n whenSubmitted: FieldArrayValidationBehavior;\n};\n\nexport type FieldArrayItem<T> = {\n /**\n * The default value of the item.\n * This does not update as the field is changed by the user.\n */\n defaultValue: T;\n /**\n * A unique key for the item.\n * Use this as the key prop when rendering the item.\n */\n key: string;\n};\n\nconst useInternalFieldArray = (\n context: InternalFormContextValue,\n field: string,\n validationBehavior?: Partial<FieldArrayValidationBehaviorOptions>\n) => {\n const value = useFieldDefaultValue(field, context);\n useRegisterControlledField(context, field);\n const hasBeenSubmitted = useInternalHasBeenSubmitted(context.formId);\n const validateField = useSmartValidate(context.formId);\n const error = useFieldError(field, context);\n\n const resolvedValidationBehavior: FieldArrayValidationBehaviorOptions = {\n initial: \"onSubmit\",\n whenSubmitted: \"onChange\",\n ...validationBehavior,\n };\n\n const behavior = hasBeenSubmitted\n ? resolvedValidationBehavior.whenSubmitted\n : resolvedValidationBehavior.initial;\n\n const maybeValidate = useCallback(() => {\n if (behavior === \"onChange\") {\n validateField({ alwaysIncludeErrorsFromFields: [field] });\n }\n }, [behavior, field, validateField]);\n\n invariant(\n value === undefined || value === null || Array.isArray(value),\n `FieldArray: defaultValue value for ${field} must be an array, null, or undefined`\n );\n\n const arr = useFormStore(\n context.formId,\n (state) => state.controlledFields.array\n );\n\n const arrayValue = useMemo<unknown[]>(() => value ?? [], [value]);\n const keyRef = useRef<string[]>([]);\n\n // If the lengths don't match up it means one of two things\n // 1. The array has been modified outside of this hook\n // 2. We're initializing the array\n if (keyRef.current.length !== arrayValue.length) {\n keyRef.current = arrayValue.map(() => nanoid());\n }\n\n const helpers = useMemo(\n () => ({\n push: (item: any) => {\n arr.push(field, item);\n keyRef.current.push(nanoid());\n maybeValidate();\n },\n swap: (indexA: number, indexB: number) => {\n arr.swap(field, indexA, indexB);\n arrayUtil.swap(keyRef.current, indexA, indexB);\n maybeValidate();\n },\n move: (from: number, to: number) => {\n arr.move(field, from, to);\n arrayUtil.move(keyRef.current, from, to);\n maybeValidate();\n },\n insert: (index: number, value: any) => {\n arr.insert(field, index, value);\n arrayUtil.insert(keyRef.current, index, nanoid());\n maybeValidate();\n },\n unshift: (value: any) => {\n arr.unshift(field, value);\n keyRef.current.unshift(nanoid());\n maybeValidate();\n },\n remove: (index: number) => {\n arr.remove(field, index);\n arrayUtil.remove(keyRef.current, index);\n maybeValidate();\n },\n pop: () => {\n arr.pop(field);\n keyRef.current.pop();\n maybeValidate();\n },\n replace: (index: number, value: any) => {\n arr.replace(field, index, value);\n keyRef.current[index] = nanoid();\n maybeValidate();\n },\n }),\n [arr, field, maybeValidate]\n );\n\n const valueWithKeys = useMemo(() => {\n const result: { defaultValue: any; key: string }[] = [];\n arrayValue.forEach((item, index) => {\n result[index] = {\n key: keyRef.current[index],\n defaultValue: item,\n };\n });\n return result;\n }, [arrayValue]);\n\n return [valueWithKeys, helpers, error] as const;\n};\n\nexport type FieldArrayHelpers<Item = any> = {\n push: (item: Item) => void;\n swap: (indexA: number, indexB: number) => void;\n move: (from: number, to: number) => void;\n insert: (index: number, value: Item) => void;\n unshift: (value: Item) => void;\n remove: (index: number) => void;\n pop: () => void;\n replace: (index: number, value: Item) => void;\n};\n\nexport type UseFieldArrayOptions = {\n formId?: string;\n validationBehavior?: Partial<FieldArrayValidationBehaviorOptions>;\n};\n\nexport function useFieldArray<Item = any>(\n name: string,\n { formId, validationBehavior }: UseFieldArrayOptions = {}\n) {\n const context = useInternalFormContext(formId, \"FieldArray\");\n\n return useInternalFieldArray(context, name, validationBehavior) as [\n items: FieldArrayItem<Item>[],\n helpers: FieldArrayHelpers,\n error: string | undefined\n ];\n}\n\nexport type FieldArrayProps<Item> = {\n name: string;\n children: (\n items: FieldArrayItem<Item>[],\n helpers: FieldArrayHelpers<Item>,\n error: string | undefined\n ) => React.ReactNode;\n formId?: string;\n validationBehavior?: FieldArrayValidationBehaviorOptions;\n};\n\nexport function FieldArray<Item = any>({\n name,\n children,\n formId,\n validationBehavior,\n}: FieldArrayProps<Item>) {\n const context = useInternalFormContext(formId, \"FieldArray\");\n const [value, helpers, error] = useInternalFieldArray(\n context,\n name,\n validationBehavior\n );\n return <>{children(value, helpers, error)}</>;\n}\n"],"mappings":"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","names":["useEffect","invariant","hydratedData","invariant","from","get","invariant","_a","from","state","match","invariant","touched","state","fieldErrors","useCallback","useCallback","value","useEffect","useCallback","useEffect","useMemo","useRef","R","useCallback","useEffect","useRef","useEffect","useRef","R","useEffect","useRef","replace","useMemo","useRef","useCallback","_a","useEffect","R","useCallback","useMemo","useMemo","useMemo","useCallback","useMemo","useMemo","useRef","useCallback","invariant","Fragment","jsx","useCallback","invariant","useMemo","useRef","from","value"]}