remix-validated-form 4.3.0 → 4.3.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.turbo/turbo-build.log +15 -9
  2. package/README.md +1 -0
  3. package/browser/internal/logic/getRadioChecked.js +10 -0
  4. package/browser/internal/reset.d.ts +0 -0
  5. package/browser/internal/reset.js +0 -0
  6. package/browser/unreleased/formStateHooks.d.ts +0 -0
  7. package/browser/unreleased/formStateHooks.js +0 -0
  8. package/dist/remix-validated-form.cjs.js +1 -0
  9. package/dist/remix-validated-form.es.js +3535 -0
  10. package/dist/remix-validated-form.umd.js +1 -0
  11. package/{build → dist/types}/ValidatedForm.d.ts +0 -0
  12. package/{build → dist/types}/hooks.d.ts +0 -0
  13. package/{build → dist/types}/index.d.ts +0 -0
  14. package/{build → dist/types}/internal/MultiValueMap.d.ts +0 -0
  15. package/{build → dist/types}/internal/constants.d.ts +0 -0
  16. package/{build → dist/types}/internal/flatten.d.ts +0 -0
  17. package/{build → dist/types}/internal/formContext.d.ts +0 -0
  18. package/{build → dist/types}/internal/getInputProps.d.ts +0 -0
  19. package/{build → dist/types}/internal/hooks.d.ts +0 -0
  20. package/{build → dist/types}/internal/hydratable.d.ts +0 -0
  21. package/{build → dist/types}/internal/logic/getCheckboxChecked.d.ts +0 -0
  22. package/{build → dist/types}/internal/logic/getRadioChecked.d.ts +0 -0
  23. package/{build → dist/types}/internal/reset.d.ts +0 -0
  24. package/{build → dist/types}/internal/state/atomUtils.d.ts +0 -0
  25. package/{build → dist/types}/internal/state/controlledFields.d.ts +0 -0
  26. package/{build → dist/types}/internal/state.d.ts +0 -0
  27. package/{build → dist/types}/internal/submissionCallbacks.d.ts +0 -0
  28. package/{build → dist/types}/internal/util.d.ts +0 -0
  29. package/{build → dist/types}/server.d.ts +0 -0
  30. package/{build → dist/types}/unreleased/formStateHooks.d.ts +0 -0
  31. package/{build → dist/types}/userFacingFormContext.d.ts +0 -0
  32. package/{build → dist/types}/validation/createValidator.d.ts +0 -0
  33. package/{build → dist/types}/validation/types.d.ts +0 -0
  34. package/package.json +8 -7
  35. package/src/internal/getInputProps.test.ts +251 -0
  36. package/src/internal/logic/getRadioChecked.ts +11 -0
  37. package/src/validation/validation.test.ts +304 -0
  38. package/tsconfig.json +4 -1
  39. package/vite.config.ts +7 -0
  40. package/.turbo/turbo-test.log +0 -11
  41. package/browser/components.d.ts +0 -7
  42. package/browser/components.js +0 -10
  43. package/browser/internal/SingleTypeMultiValueMap.d.ts +0 -9
  44. package/browser/internal/SingleTypeMultiValueMap.js +0 -41
  45. package/browser/internal/customState.d.ts +0 -105
  46. package/browser/internal/customState.js +0 -46
  47. package/browser/internal/hooks-valtio.d.ts +0 -18
  48. package/browser/internal/hooks-valtio.js +0 -110
  49. package/browser/internal/hooks-zustand.d.ts +0 -16
  50. package/browser/internal/hooks-zustand.js +0 -100
  51. package/browser/internal/immerMiddleware.d.ts +0 -6
  52. package/browser/internal/immerMiddleware.js +0 -7
  53. package/browser/internal/logic/elementUtils.d.ts +0 -3
  54. package/browser/internal/logic/elementUtils.js +0 -3
  55. package/browser/internal/logic/getCheckboxChecked copy.d.ts +0 -1
  56. package/browser/internal/logic/getCheckboxChecked copy.js +0 -9
  57. package/browser/internal/logic/setFieldValue.d.ts +0 -1
  58. package/browser/internal/logic/setFieldValue.js +0 -40
  59. package/browser/internal/logic/setInputValueInForm.d.ts +0 -1
  60. package/browser/internal/logic/setInputValueInForm.js +0 -77
  61. package/browser/internal/setFieldValue.d.ts +0 -20
  62. package/browser/internal/setFieldValue.js +0 -83
  63. package/browser/internal/setFormValues.d.ts +0 -2
  64. package/browser/internal/setFormValues.js +0 -26
  65. package/browser/internal/state/setFieldValue.d.ts +0 -0
  66. package/browser/internal/state/setFieldValue.js +0 -1
  67. package/browser/internal/state-valtio.d.ts +0 -62
  68. package/browser/internal/state-valtio.js +0 -69
  69. package/browser/internal/state-zustand.d.ts +0 -47
  70. package/browser/internal/state-zustand.js +0 -85
  71. package/browser/internal/test.d.ts +0 -0
  72. package/browser/internal/test.js +0 -15
  73. package/browser/internal/useMultiValueMap.d.ts +0 -1
  74. package/browser/internal/useMultiValueMap.js +0 -11
  75. package/browser/internal/watch.d.ts +0 -18
  76. package/browser/internal/watch.js +0 -122
  77. package/browser/lowLevelHooks.d.ts +0 -0
  78. package/browser/lowLevelHooks.js +0 -1
  79. package/browser/test-data/testFormData.d.ts +0 -15
  80. package/browser/test-data/testFormData.js +0 -46
  81. package/browser/types.d.ts +0 -1
  82. package/browser/types.js +0 -1
  83. package/browser/validation/validation.test.d.ts +0 -1
  84. package/browser/validation/validation.test.js +0 -274
  85. package/browser/validation/withYup.d.ts +0 -6
  86. package/browser/validation/withYup.js +0 -40
  87. package/browser/validation/withZod.d.ts +0 -6
  88. package/browser/validation/withZod.js +0 -50
  89. package/build/ValidatedForm.js +0 -261
  90. package/build/hooks.js +0 -91
  91. package/build/index.js +0 -18
  92. package/build/internal/MultiValueMap.js +0 -48
  93. package/build/internal/SingleTypeMultiValueMap.d.ts +0 -8
  94. package/build/internal/SingleTypeMultiValueMap.js +0 -45
  95. package/build/internal/constants.js +0 -7
  96. package/build/internal/flatten.js +0 -14
  97. package/build/internal/formContext.js +0 -5
  98. package/build/internal/getInputProps.js +0 -58
  99. package/build/internal/hooks-valtio.d.ts +0 -18
  100. package/build/internal/hooks-valtio.js +0 -128
  101. package/build/internal/hooks-zustand.d.ts +0 -16
  102. package/build/internal/hooks-zustand.js +0 -117
  103. package/build/internal/hooks.js +0 -128
  104. package/build/internal/hydratable.js +0 -17
  105. package/build/internal/immerMiddleware.d.ts +0 -6
  106. package/build/internal/immerMiddleware.js +0 -14
  107. package/build/internal/logic/elementUtils.d.ts +0 -3
  108. package/build/internal/logic/elementUtils.js +0 -9
  109. package/build/internal/logic/getCheckboxChecked.js +0 -13
  110. package/build/internal/logic/getRadioChecked.js +0 -9
  111. package/build/internal/logic/setFieldValue.d.ts +0 -1
  112. package/build/internal/logic/setFieldValue.js +0 -47
  113. package/build/internal/logic/setInputValueInForm.d.ts +0 -1
  114. package/build/internal/logic/setInputValueInForm.js +0 -84
  115. package/build/internal/reset.js +0 -19
  116. package/build/internal/setFormValues.d.ts +0 -2
  117. package/build/internal/setFormValues.js +0 -33
  118. package/build/internal/state/atomUtils.js +0 -13
  119. package/build/internal/state/controlledFields.js +0 -103
  120. package/build/internal/state-valtio.d.ts +0 -62
  121. package/build/internal/state-valtio.js +0 -83
  122. package/build/internal/state-zustand.d.ts +0 -47
  123. package/build/internal/state-zustand.js +0 -91
  124. package/build/internal/state.js +0 -71
  125. package/build/internal/submissionCallbacks.js +0 -17
  126. package/build/internal/test.d.ts +0 -1
  127. package/build/internal/test.js +0 -12
  128. package/build/internal/util.js +0 -41
  129. package/build/internal/watch.d.ts +0 -20
  130. package/build/internal/watch.js +0 -126
  131. package/build/server.js +0 -32
  132. package/build/types.d.ts +0 -1
  133. package/build/types.js +0 -2
  134. package/build/unreleased/formStateHooks.js +0 -59
  135. package/build/userFacingFormContext.js +0 -30
  136. package/build/validation/createValidator.js +0 -45
  137. package/build/validation/types.js +0 -2
@@ -1,128 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useSetTouched = exports.useClearError = exports.useFieldDefaultValue = exports.useFieldError = exports.useFieldTouched = exports.useHasActiveFormSubmit = exports.useDefaultValuesForForm = exports.useDefaultValuesFromLoader = exports.useFieldErrorsForForm = exports.useErrorResponseForForm = exports.useInternalFormContext = exports.useFormAtomValue = exports.useFormAtom = exports.useFormUpdateAtom = void 0;
7
- const react_1 = require("@remix-run/react");
8
- const jotai_1 = require("jotai");
9
- const utils_1 = require("jotai/utils");
10
- const get_1 = __importDefault(require("lodash/get"));
11
- const react_2 = require("react");
12
- const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
13
- const constants_1 = require("./constants");
14
- const formContext_1 = require("./formContext");
15
- const hydratable_1 = require("./hydratable");
16
- const state_1 = require("./state");
17
- const useFormUpdateAtom = (atom) => (0, utils_1.useUpdateAtom)(atom, state_1.ATOM_SCOPE);
18
- exports.useFormUpdateAtom = useFormUpdateAtom;
19
- const useFormAtom = (anAtom) => (0, jotai_1.useAtom)(anAtom, state_1.ATOM_SCOPE);
20
- exports.useFormAtom = useFormAtom;
21
- const useFormAtomValue = (anAtom) => (0, utils_1.useAtomValue)(anAtom, state_1.ATOM_SCOPE);
22
- exports.useFormAtomValue = useFormAtomValue;
23
- const useInternalFormContext = (formId, hookName) => {
24
- const formContext = (0, react_2.useContext)(formContext_1.InternalFormContext);
25
- if (formId)
26
- return { formId };
27
- if (formContext)
28
- return formContext;
29
- throw new Error(`Unable to determine form for ${hookName}. Please use it inside a ValidatedForm or pass a 'formId'.`);
30
- };
31
- exports.useInternalFormContext = useInternalFormContext;
32
- function useErrorResponseForForm({ fetcher, subaction, formId, }) {
33
- var _a;
34
- const actionData = (0, react_1.useActionData)();
35
- if (fetcher) {
36
- if ((_a = fetcher.data) === null || _a === void 0 ? void 0 : _a.fieldErrors)
37
- return fetcher.data;
38
- return null;
39
- }
40
- if (!(actionData === null || actionData === void 0 ? void 0 : actionData.fieldErrors))
41
- return null;
42
- // If there's an explicit id, we should ignore data that has the wrong id
43
- if (typeof formId === "string" && actionData.formId)
44
- return actionData.formId === formId ? actionData : null;
45
- if ((!subaction && !actionData.subaction) ||
46
- actionData.subaction === subaction)
47
- return actionData;
48
- return null;
49
- }
50
- exports.useErrorResponseForForm = useErrorResponseForForm;
51
- const useFieldErrorsForForm = (context) => {
52
- const response = useErrorResponseForForm(context);
53
- const hydrated = (0, exports.useFormAtomValue)((0, state_1.isHydratedAtom)(context.formId));
54
- return hydratable_1.hydratable.from(response === null || response === void 0 ? void 0 : response.fieldErrors, hydrated);
55
- };
56
- exports.useFieldErrorsForForm = useFieldErrorsForForm;
57
- const useDefaultValuesFromLoader = ({ formId, }) => {
58
- const matches = (0, react_1.useMatches)();
59
- if (typeof formId === "string") {
60
- const dataKey = (0, constants_1.formDefaultValuesKey)(formId);
61
- // If multiple loaders declare the same default values,
62
- // we should use the data from the deepest route.
63
- const match = matches
64
- .reverse()
65
- .find((match) => match.data && dataKey in match.data);
66
- return match === null || match === void 0 ? void 0 : match.data[dataKey];
67
- }
68
- return null;
69
- };
70
- exports.useDefaultValuesFromLoader = useDefaultValuesFromLoader;
71
- const useDefaultValuesForForm = (context) => {
72
- const { formId, defaultValuesProp } = context;
73
- const hydrated = (0, exports.useFormAtomValue)((0, state_1.isHydratedAtom)(formId));
74
- const errorResponse = useErrorResponseForForm(context);
75
- const defaultValuesFromLoader = (0, exports.useDefaultValuesFromLoader)(context);
76
- // Typical flow is:
77
- // - Default values only available from props or server
78
- // - Props have a higher priority than server
79
- // - State gets hydrated with default values
80
- // - After submit, we may need to use values from the error
81
- if (hydrated)
82
- return hydratable_1.hydratable.hydratedData();
83
- if (errorResponse === null || errorResponse === void 0 ? void 0 : errorResponse.repopulateFields) {
84
- (0, tiny_invariant_1.default)(typeof errorResponse.repopulateFields === "object", "repopulateFields returned something other than an object");
85
- return hydratable_1.hydratable.serverData(errorResponse.repopulateFields);
86
- }
87
- if (defaultValuesProp)
88
- return hydratable_1.hydratable.serverData(defaultValuesProp);
89
- return hydratable_1.hydratable.serverData(defaultValuesFromLoader);
90
- };
91
- exports.useDefaultValuesForForm = useDefaultValuesForForm;
92
- const useHasActiveFormSubmit = ({ fetcher, }) => {
93
- const transition = (0, react_1.useTransition)();
94
- const hasActiveSubmission = fetcher
95
- ? fetcher.state === "submitting"
96
- : !!transition.submission;
97
- return hasActiveSubmission;
98
- };
99
- exports.useHasActiveFormSubmit = useHasActiveFormSubmit;
100
- const useFieldTouched = (field, { formId }) => (0, exports.useFormAtom)((0, state_1.fieldTouchedAtom)({ formId, field }));
101
- exports.useFieldTouched = useFieldTouched;
102
- const useFieldError = (name, context) => {
103
- const fieldErrors = (0, exports.useFieldErrorsForForm)(context);
104
- const [state, set] = (0, exports.useFormAtom)((0, state_1.fieldErrorAtom)({ formId: context.formId, field: name }));
105
- return [
106
- fieldErrors.map((fieldErrors) => fieldErrors === null || fieldErrors === void 0 ? void 0 : fieldErrors[name]).hydrateTo(state),
107
- set,
108
- ];
109
- };
110
- exports.useFieldError = useFieldError;
111
- const useFieldDefaultValue = (name, context) => {
112
- const defaultValues = (0, exports.useDefaultValuesForForm)(context);
113
- const { defaultValues: state } = (0, exports.useFormAtomValue)((0, state_1.formPropsAtom)(context.formId));
114
- return defaultValues
115
- .map((val) => (0, get_1.default)(val, name))
116
- .hydrateTo((0, get_1.default)(state, name));
117
- };
118
- exports.useFieldDefaultValue = useFieldDefaultValue;
119
- const useClearError = ({ formId }) => {
120
- const updateError = (0, exports.useFormUpdateAtom)((0, state_1.setFieldErrorAtom)(formId));
121
- return (0, react_2.useCallback)((name) => updateError({ field: name, error: undefined }), [updateError]);
122
- };
123
- exports.useClearError = useClearError;
124
- const useSetTouched = ({ formId }) => {
125
- const setTouched = (0, exports.useFormUpdateAtom)((0, state_1.setTouchedAtom)(formId));
126
- return (0, react_2.useCallback)((name, touched) => setTouched({ field: name, touched }), [setTouched]);
127
- };
128
- exports.useSetTouched = useSetTouched;
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hydratable = void 0;
4
- const serverData = (data) => ({
5
- hydrateTo: () => data,
6
- map: (fn) => serverData(fn(data)),
7
- });
8
- const hydratedData = () => ({
9
- hydrateTo: (hydratedData) => hydratedData,
10
- map: () => hydratedData(),
11
- });
12
- const from = (data, hydrated) => hydrated ? hydratedData() : serverData(data);
13
- exports.hydratable = {
14
- serverData,
15
- hydratedData,
16
- from,
17
- };
@@ -1,6 +0,0 @@
1
- import { Draft } from "immer";
2
- import { State, StateCreator } from "zustand";
3
- declare type TImmerConfigFn<T extends State> = (partial: ((draft: Draft<T>) => void) | T, replace?: boolean) => void;
4
- declare type TImmerConfig<T extends State> = StateCreator<T, TImmerConfigFn<T>>;
5
- export declare const immer: <T extends object>(config: TImmerConfig<T>) => StateCreator<T, import("zustand").SetState<T>, import("zustand").GetState<T>, import("zustand").StoreApi<T>>;
6
- export {};
@@ -1,14 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.immer = void 0;
7
- const immer_1 = __importDefault(require("immer"));
8
- const immer = (config) => (set, get, api) => config((partial, replace) => {
9
- const nextState = typeof partial === "function"
10
- ? (0, immer_1.default)(partial)
11
- : partial;
12
- return set(nextState, replace);
13
- }, get, api);
14
- exports.immer = immer;
@@ -1,3 +0,0 @@
1
- export declare const isMultiselect: (node: Node) => node is HTMLSelectElement;
2
- export declare const isCheckbox: (node: Node | RadioNodeList) => node is HTMLInputElement;
3
- export declare const isRadio: (node: Node) => node is HTMLInputElement;
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRadio = exports.isCheckbox = exports.isMultiselect = void 0;
4
- const isMultiselect = (node) => node instanceof HTMLSelectElement && node.multiple;
5
- exports.isMultiselect = isMultiselect;
6
- const isCheckbox = (node) => node instanceof HTMLInputElement && node.type === "checkbox";
7
- exports.isCheckbox = isCheckbox;
8
- const isRadio = (node) => node instanceof HTMLInputElement && node.type === "radio";
9
- exports.isRadio = isRadio;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCheckboxChecked = void 0;
4
- const getCheckboxChecked = (checkboxValue = "on", newValue) => {
5
- if (Array.isArray(newValue))
6
- return newValue.some((val) => val === true || val === checkboxValue);
7
- if (typeof newValue === "boolean")
8
- return newValue;
9
- if (typeof newValue === "string")
10
- return newValue === checkboxValue;
11
- return undefined;
12
- };
13
- exports.getCheckboxChecked = getCheckboxChecked;
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRadioChecked = void 0;
4
- const getRadioChecked = (radioValue = "on", newValue) => {
5
- if (typeof newValue === "string")
6
- return newValue === radioValue;
7
- return undefined;
8
- };
9
- exports.getRadioChecked = getRadioChecked;
@@ -1 +0,0 @@
1
- export declare const setFieldValue: (formElement: HTMLFormElement, name: string, value: unknown) => void;
@@ -1,47 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.setFieldValue = void 0;
7
- const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
8
- const getCheckboxChecked_1 = require("./getCheckboxChecked");
9
- const getRadioChecked_1 = require("./getRadioChecked");
10
- const setElementValue = (element, value, name) => {
11
- if (element instanceof HTMLSelectElement && element.multiple) {
12
- (0, tiny_invariant_1.default)(Array.isArray(value), "Must specify an array to set the value for a multi-select");
13
- for (const option of element.options) {
14
- option.selected = value.includes(option.value);
15
- }
16
- return;
17
- }
18
- if (element instanceof HTMLInputElement && element.type === "checkbox") {
19
- const newChecked = (0, getCheckboxChecked_1.getCheckboxChecked)(element.value, value);
20
- (0, tiny_invariant_1.default)(newChecked !== undefined, `Unable to determine if checkbox should be checked. Provided value was ${value} for checkbox ${name}.`);
21
- element.checked = newChecked;
22
- return;
23
- }
24
- if (element instanceof HTMLInputElement && element.type === "radio") {
25
- const newChecked = (0, getRadioChecked_1.getRadioChecked)(element.value, value);
26
- (0, tiny_invariant_1.default)(newChecked !== undefined, `Unable to determine if radio should be checked. Provided value was ${value} for radio ${name}.`);
27
- element.checked = newChecked;
28
- return;
29
- }
30
- (0, tiny_invariant_1.default)(typeof value === "string", `Invalid value for field "${name}" which is an ${element.constructor.name}. Expected string but received ${typeof value}`);
31
- const input = element;
32
- input.value = value;
33
- };
34
- const setFieldValue = (formElement, name, value) => {
35
- const controlElement = formElement.elements.namedItem(name);
36
- if (!controlElement)
37
- return;
38
- if (controlElement instanceof RadioNodeList) {
39
- for (const element of controlElement) {
40
- setElementValue(element, value, name);
41
- }
42
- }
43
- else {
44
- setElementValue(controlElement, value, name);
45
- }
46
- };
47
- exports.setFieldValue = setFieldValue;
@@ -1 +0,0 @@
1
- export declare const setInputValueInForm: (formElement: HTMLFormElement, name: string, value: unknown[]) => void;
@@ -1,84 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.setInputValueInForm = void 0;
7
- const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
8
- const elementUtils_1 = require("./elementUtils");
9
- const getCheckboxChecked_1 = require("./getCheckboxChecked");
10
- /**
11
- * Helper class to track the values being set on uncontrolled fields.
12
- * HTML is super permissive with inputs that all share the same `name`.
13
- */
14
- class Values {
15
- constructor(values) {
16
- this.hasSetRadioValue = false;
17
- this.remove = (value) => {
18
- const index = this.values.indexOf(value);
19
- const deleted = this.values.splice(index, 1);
20
- return deleted.length > 0;
21
- };
22
- this.bool = (value) => {
23
- if ((0, getCheckboxChecked_1.getCheckboxChecked)(value, this.values)) {
24
- this.remove(value) || this.remove(true);
25
- return true;
26
- }
27
- return false;
28
- };
29
- this.radio = (value) => {
30
- if (this.hasSetRadioValue)
31
- return false;
32
- const result = this.bool(value);
33
- if (result)
34
- this.hasSetRadioValue = true;
35
- return result;
36
- };
37
- this.str = () => { var _a; return String((_a = this.values.pop()) !== null && _a !== void 0 ? _a : ""); };
38
- this.allValues = () => this.values;
39
- this.warnIfLeftovers = (field) => {
40
- if (this.values.length > 0) {
41
- console.warn(`Could not determine how to use the value for the field ${field}. ` +
42
- `Leftover values were: ${this.values.join(", ")}.`);
43
- }
44
- };
45
- const unknownValues = Array.isArray(values) ? values : [values];
46
- this.values = unknownValues;
47
- }
48
- }
49
- const setElementValue = (element, values, field) => {
50
- if ((0, elementUtils_1.isMultiselect)(element)) {
51
- for (const option of element.options) {
52
- option.selected = values.bool(option.value);
53
- }
54
- return;
55
- }
56
- if ((0, elementUtils_1.isCheckbox)(element)) {
57
- element.checked = values.bool(element.value);
58
- return;
59
- }
60
- if ((0, elementUtils_1.isRadio)(element)) {
61
- element.checked = values.radio(element.value);
62
- return;
63
- }
64
- const input = element;
65
- (0, tiny_invariant_1.default)(input.type !== "hidden", `Cannot set value on hidden input if it is not a controlled field. Field being updated was ${field}.`);
66
- input.value = values.str();
67
- };
68
- const setInputValueInForm = (formElement, name, value) => {
69
- const controlElement = formElement.elements.namedItem(name);
70
- if (!controlElement)
71
- return;
72
- const values = new Values(value);
73
- if (controlElement instanceof RadioNodeList) {
74
- for (const element of controlElement) {
75
- setElementValue(element, values, name);
76
- }
77
- values.warnIfLeftovers(name);
78
- }
79
- else {
80
- setElementValue(controlElement, values, name);
81
- values.warnIfLeftovers(name);
82
- }
83
- };
84
- exports.setInputValueInForm = setInputValueInForm;
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.resetAtom = void 0;
7
- const jotai_1 = require("jotai");
8
- const utils_1 = require("jotai/utils");
9
- const get_1 = __importDefault(require("lodash/get"));
10
- const state_1 = require("./state");
11
- const controlledFields_1 = require("./state/controlledFields");
12
- exports.resetAtom = (0, utils_1.atomFamily)((formId) => (0, jotai_1.atom)(null, (get, set) => {
13
- set((0, state_1.fieldErrorsAtom)(formId), {});
14
- set((0, state_1.touchedFieldsAtom)(formId), {});
15
- set((0, state_1.hasBeenSubmittedAtom)(formId), false);
16
- const { defaultValues } = get((0, state_1.formPropsAtom)(formId));
17
- const controlledFields = get((0, controlledFields_1.controlledFieldsAtom)(formId));
18
- Object.entries(controlledFields).forEach(([name, atom]) => set(atom, (0, get_1.default)(defaultValues, name)));
19
- }));
@@ -1,2 +0,0 @@
1
- import { InternalFormId } from "./state/atomUtils";
2
- export declare const useSetFormValues: (formId: InternalFormId) => (arg: Record<string, unknown>) => Promise<void>;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useSetFormValues = void 0;
7
- const utils_1 = require("jotai/utils");
8
- const react_1 = require("react");
9
- const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
10
- const setInputValueInForm_1 = require("./logic/setInputValueInForm");
11
- const state_1 = require("./state");
12
- const controlledFields_1 = require("./state/controlledFields");
13
- const useSetFormValues = (formId) => (0, utils_1.useAtomCallback)((0, react_1.useCallback)(async (get, set, updatedValues) => {
14
- const form = get((0, state_1.formElementAtom)(formId));
15
- (0, tiny_invariant_1.default)(form, "Unable to access form element when setting field value. This is likely a bug in remix-validated-form.");
16
- const controlledFields = get((0, controlledFields_1.controlledFieldsAtom)(formId));
17
- const updatePromises = [];
18
- for (const [field, value] of Object.entries(updatedValues)) {
19
- const isControlled = !!controlledFields[field];
20
- if (isControlled) {
21
- updatePromises.push(set(controlledFields_1.setControlledFieldValueAtom, {
22
- field,
23
- formId,
24
- value,
25
- }));
26
- }
27
- else {
28
- (0, setInputValueInForm_1.setInputValueInForm)(form, field, Array.isArray(value) ? value : [value]);
29
- }
30
- }
31
- await Promise.all(updatePromises);
32
- }, [formId]), state_1.ATOM_SCOPE);
33
- exports.useSetFormValues = useSetFormValues;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.fieldAtomFamily = exports.formAtomFamily = void 0;
7
- const jotai_1 = require("jotai");
8
- const utils_1 = require("jotai/utils");
9
- const isEqual_1 = __importDefault(require("lodash/isEqual"));
10
- const formAtomFamily = (data) => (0, utils_1.atomFamily)((_) => (0, jotai_1.atom)(data));
11
- exports.formAtomFamily = formAtomFamily;
12
- const fieldAtomFamily = (func) => (0, utils_1.atomFamily)(func, isEqual_1.default);
13
- exports.fieldAtomFamily = fieldAtomFamily;
@@ -1,103 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useAwaitValue = exports.useUpdateControllableValue = exports.useControllableValue = exports.useControlledFieldValue = exports.setControlledFieldValueAtom = exports.resolveValueUpdateAtom = exports.valueUpdatePromiseAtom = exports.controlledFieldsAtom = void 0;
7
- const jotai_1 = require("jotai");
8
- const utils_1 = require("jotai/utils");
9
- const omit_1 = __importDefault(require("lodash/omit"));
10
- const react_1 = require("react");
11
- const hooks_1 = require("../hooks");
12
- const state_1 = require("../state");
13
- const atomUtils_1 = require("./atomUtils");
14
- exports.controlledFieldsAtom = (0, atomUtils_1.formAtomFamily)({});
15
- const refCountAtom = (0, atomUtils_1.fieldAtomFamily)(() => (0, jotai_1.atom)(0));
16
- const fieldValueAtom = (0, atomUtils_1.fieldAtomFamily)(() => (0, jotai_1.atom)(undefined));
17
- const fieldValueHydratedAtom = (0, atomUtils_1.fieldAtomFamily)(() => (0, jotai_1.atom)(false));
18
- exports.valueUpdatePromiseAtom = (0, atomUtils_1.fieldAtomFamily)(() => (0, jotai_1.atom)(undefined));
19
- exports.resolveValueUpdateAtom = (0, atomUtils_1.fieldAtomFamily)(() => (0, jotai_1.atom)(undefined));
20
- const registerAtom = (0, jotai_1.atom)(null, (get, set, { formId, field }) => {
21
- set(refCountAtom({ formId, field }), (prev) => prev + 1);
22
- const newRefCount = get(refCountAtom({ formId, field }));
23
- // We don't set hydrated here because it gets set when we know
24
- // we have the right default values
25
- if (newRefCount === 1) {
26
- set((0, exports.controlledFieldsAtom)(formId), (prev) => ({
27
- ...prev,
28
- [field]: fieldValueAtom({ formId, field }),
29
- }));
30
- }
31
- });
32
- const unregisterAtom = (0, jotai_1.atom)(null, (get, set, { formId, field }) => {
33
- set(refCountAtom({ formId, field }), (prev) => prev - 1);
34
- const newRefCount = get(refCountAtom({ formId, field }));
35
- if (newRefCount === 0) {
36
- set((0, exports.controlledFieldsAtom)(formId), (prev) => (0, omit_1.default)(prev, field));
37
- fieldValueAtom.remove({ formId, field });
38
- exports.resolveValueUpdateAtom.remove({ formId, field });
39
- fieldValueHydratedAtom.remove({ formId, field });
40
- }
41
- });
42
- exports.setControlledFieldValueAtom = (0, jotai_1.atom)(null, (_get, set, { formId, field, value, }) => {
43
- set(fieldValueAtom({ formId, field }), value);
44
- const resolveAtom = (0, exports.resolveValueUpdateAtom)({ formId, field });
45
- const promiseAtom = (0, exports.valueUpdatePromiseAtom)({ formId, field });
46
- const promise = new Promise((resolve) => set(resolveAtom, () => {
47
- resolve();
48
- set(resolveAtom, undefined);
49
- set(promiseAtom, undefined);
50
- }));
51
- set(promiseAtom, promise);
52
- });
53
- const useControlledFieldValue = (context, field) => {
54
- const fieldAtom = fieldValueAtom({ formId: context.formId, field });
55
- const [value, setValue] = (0, hooks_1.useFormAtom)(fieldAtom);
56
- const defaultValue = (0, hooks_1.useFieldDefaultValue)(field, context);
57
- const isHydrated = (0, hooks_1.useFormAtomValue)((0, state_1.isHydratedAtom)(context.formId));
58
- const [isFieldHydrated, setIsFieldHydrated] = (0, hooks_1.useFormAtom)(fieldValueHydratedAtom({ formId: context.formId, field }));
59
- (0, react_1.useEffect)(() => {
60
- if (isHydrated && !isFieldHydrated) {
61
- setValue(defaultValue);
62
- setIsFieldHydrated(true);
63
- }
64
- }, [
65
- defaultValue,
66
- field,
67
- context.formId,
68
- isFieldHydrated,
69
- isHydrated,
70
- setIsFieldHydrated,
71
- setValue,
72
- ]);
73
- return isFieldHydrated ? value : defaultValue;
74
- };
75
- exports.useControlledFieldValue = useControlledFieldValue;
76
- const useControllableValue = (context, field) => {
77
- const resolveUpdate = (0, hooks_1.useFormAtomValue)((0, exports.resolveValueUpdateAtom)({ formId: context.formId, field }));
78
- (0, react_1.useEffect)(() => {
79
- resolveUpdate === null || resolveUpdate === void 0 ? void 0 : resolveUpdate();
80
- }, [resolveUpdate]);
81
- const register = (0, hooks_1.useFormUpdateAtom)(registerAtom);
82
- const unregister = (0, hooks_1.useFormUpdateAtom)(unregisterAtom);
83
- (0, react_1.useEffect)(() => {
84
- register({ formId: context.formId, field });
85
- return () => unregister({ formId: context.formId, field });
86
- }, [context.formId, field, register, unregister]);
87
- const setControlledFieldValue = (0, hooks_1.useFormUpdateAtom)(exports.setControlledFieldValueAtom);
88
- const setValue = (0, react_1.useCallback)((value) => setControlledFieldValue({ formId: context.formId, field, value }), [field, context.formId, setControlledFieldValue]);
89
- const value = (0, exports.useControlledFieldValue)(context, field);
90
- return [value, setValue];
91
- };
92
- exports.useControllableValue = useControllableValue;
93
- const useUpdateControllableValue = (formId) => {
94
- const setControlledFieldValue = (0, hooks_1.useFormUpdateAtom)(exports.setControlledFieldValueAtom);
95
- return (0, react_1.useCallback)((field, value) => setControlledFieldValue({ formId, field, value }), [formId, setControlledFieldValue]);
96
- };
97
- exports.useUpdateControllableValue = useUpdateControllableValue;
98
- const useAwaitValue = (formId) => {
99
- return (0, utils_1.useAtomCallback)((0, react_1.useCallback)(async (get, _set, field) => {
100
- await get((0, exports.valueUpdatePromiseAtom)({ formId, field }));
101
- }, [formId]));
102
- };
103
- exports.useAwaitValue = useAwaitValue;
@@ -1,62 +0,0 @@
1
- import { FieldErrors, TouchedFields } from "..";
2
- export declare type InternalFormState = {
3
- hydrated: boolean;
4
- fieldErrors: FieldErrors;
5
- isSubmitting: boolean;
6
- hasBeenSubmitted: boolean;
7
- touchedFields: TouchedFields;
8
- action?: string;
9
- subaction?: string;
10
- defaultValues: {
11
- [fieldName: string]: any;
12
- };
13
- validateField: (fieldName: string) => Promise<string | null>;
14
- registerReceiveFocus: (fieldName: string, handler: () => void) => () => void;
15
- setFieldValue: (fieldName: string, value: unknown) => void;
16
- };
17
- declare type SyncFormArgs = {
18
- defaultValues?: {
19
- [fieldName: string]: any;
20
- };
21
- action?: string;
22
- subaction?: string;
23
- validateField: InternalFormState["validateField"];
24
- registerReceiveFocus: InternalFormState["registerReceiveFocus"];
25
- setFieldValueForForm: InternalFormState["setFieldValue"];
26
- };
27
- declare type StoreState = {
28
- forms: {
29
- [formId: string | symbol]: InternalFormState;
30
- };
31
- };
32
- export declare const state: StoreState;
33
- export declare const registerFormSlice: (formId: string | symbol, { registerReceiveFocus, setFieldValueForForm, validateField, action, defaultValues, subaction, }: SyncFormArgs) => void;
34
- export declare const unregisterFormSlice: (formId: string | symbol) => void;
35
- export declare const useFormData: (formId: string | symbol) => {
36
- readonly hydrated: boolean;
37
- readonly fieldErrors: {
38
- readonly [x: string]: string;
39
- };
40
- readonly isSubmitting: boolean;
41
- readonly hasBeenSubmitted: boolean;
42
- readonly touchedFields: {
43
- readonly [x: string]: boolean;
44
- };
45
- readonly action?: string | undefined;
46
- readonly subaction?: string | undefined;
47
- readonly defaultValues: {
48
- readonly [x: string]: any;
49
- };
50
- readonly validateField: (fieldName: string) => Promise<string | null>;
51
- readonly registerReceiveFocus: (fieldName: string, handler: () => void) => () => void;
52
- readonly setFieldValue: (fieldName: string, value: unknown) => void;
53
- };
54
- export declare const startSubmit: (formId: string | symbol) => void;
55
- export declare const endSubmit: (formId: string | symbol) => void;
56
- export declare const sync: (formId: string | symbol, { defaultValues, action, subaction, registerReceiveFocus, validateField, setFieldValueForForm, }: SyncFormArgs) => void;
57
- export declare const clearError: (formId: string | symbol, fieldName: string) => void;
58
- export declare const addError: (formId: string | symbol, fieldName: string, error: string) => void;
59
- export declare const setTouched: (formId: string | symbol, fieldName: string, touched: boolean) => void;
60
- export declare const reset: (formId: string | symbol) => void;
61
- export declare const setFieldErrors: (formId: string | symbol, fieldErrors: FieldErrors) => void;
62
- export {};