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,83 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setFieldErrors = exports.reset = exports.setTouched = exports.addError = exports.clearError = exports.sync = exports.endSubmit = exports.startSubmit = exports.useFormData = exports.unregisterFormSlice = exports.registerFormSlice = exports.state = void 0;
4
- const valtio_1 = require("valtio");
5
- exports.state = (0, valtio_1.proxy)({ forms: {} });
6
- const registerFormSlice = (formId, { registerReceiveFocus, setFieldValueForForm, validateField, action, defaultValues, subaction, }) => {
7
- exports.state.forms[formId] = {
8
- hydrated: true,
9
- defaultValues: defaultValues !== null && defaultValues !== void 0 ? defaultValues : {},
10
- fieldErrors: {},
11
- hasBeenSubmitted: false,
12
- isSubmitting: false,
13
- touchedFields: {},
14
- registerReceiveFocus,
15
- setFieldValue: setFieldValueForForm,
16
- validateField,
17
- action,
18
- subaction,
19
- };
20
- };
21
- exports.registerFormSlice = registerFormSlice;
22
- const unregisterFormSlice = (formId) => {
23
- delete exports.state.forms[formId];
24
- };
25
- exports.unregisterFormSlice = unregisterFormSlice;
26
- const unhydratedFormState = {
27
- hydrated: false,
28
- fieldErrors: {},
29
- isSubmitting: false,
30
- hasBeenSubmitted: false,
31
- touchedFields: {},
32
- defaultValues: {},
33
- validateField: () => Promise.resolve(null),
34
- registerReceiveFocus: () => () => { },
35
- setFieldValue: () => { },
36
- };
37
- const useFormData = (formId) => {
38
- var _a;
39
- const snapshot = (0, valtio_1.useSnapshot)(exports.state);
40
- return (_a = snapshot.forms[formId]) !== null && _a !== void 0 ? _a : unhydratedFormState;
41
- };
42
- exports.useFormData = useFormData;
43
- const startSubmit = (formId) => {
44
- exports.state.forms[formId].isSubmitting = true;
45
- exports.state.forms[formId].hasBeenSubmitted = true;
46
- };
47
- exports.startSubmit = startSubmit;
48
- const endSubmit = (formId) => {
49
- exports.state.forms[formId].isSubmitting = false;
50
- };
51
- exports.endSubmit = endSubmit;
52
- const sync = (formId, { defaultValues, action, subaction, registerReceiveFocus, validateField, setFieldValueForForm, }) => {
53
- exports.state.forms[formId].defaultValues = defaultValues !== null && defaultValues !== void 0 ? defaultValues : {};
54
- exports.state.forms[formId].action = action;
55
- exports.state.forms[formId].subaction = subaction;
56
- exports.state.forms[formId].registerReceiveFocus = registerReceiveFocus;
57
- exports.state.forms[formId].validateField = validateField;
58
- exports.state.forms[formId].hydrated = true;
59
- exports.state.forms[formId].setFieldValue = setFieldValueForForm;
60
- };
61
- exports.sync = sync;
62
- const clearError = (formId, fieldName) => {
63
- delete exports.state.forms[formId].fieldErrors[fieldName];
64
- };
65
- exports.clearError = clearError;
66
- const addError = (formId, fieldName, error) => {
67
- exports.state.forms[formId].fieldErrors[fieldName] = error;
68
- };
69
- exports.addError = addError;
70
- const setTouched = (formId, fieldName, touched) => {
71
- exports.state.forms[formId].touchedFields[fieldName] = touched;
72
- };
73
- exports.setTouched = setTouched;
74
- const reset = (formId) => {
75
- exports.state.forms[formId].fieldErrors = {};
76
- exports.state.forms[formId].touchedFields = {};
77
- exports.state.forms[formId].hasBeenSubmitted = false;
78
- };
79
- exports.reset = reset;
80
- const setFieldErrors = (formId, fieldErrors) => {
81
- exports.state.forms[formId].fieldErrors = fieldErrors;
82
- };
83
- exports.setFieldErrors = setFieldErrors;
@@ -1,47 +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 Helpers = {
18
- startSubmit: () => void;
19
- endSubmit: () => void;
20
- sync: (args: SyncFormArgs) => void;
21
- clearError: (name: string) => void;
22
- addError: (name: string, error: string) => void;
23
- setTouched: (name: string, touched: boolean) => void;
24
- reset: () => void;
25
- setFieldErrors: (fieldErrors: FieldErrors) => void;
26
- register: (init: SyncFormArgs) => void;
27
- unregister: () => void;
28
- };
29
- declare type SyncFormArgs = {
30
- defaultValues?: {
31
- [fieldName: string]: any;
32
- };
33
- action?: string;
34
- subaction?: string;
35
- validateField: InternalFormState["validateField"];
36
- registerReceiveFocus: InternalFormState["registerReceiveFocus"];
37
- setFieldValueForForm: InternalFormState["setFieldValue"];
38
- };
39
- declare type StoreState = {
40
- forms: {
41
- [formId: string | symbol]: InternalFormState;
42
- };
43
- form: (formId: string | symbol) => InternalFormState;
44
- helpers: (formId: string | symbol) => Helpers;
45
- };
46
- export declare const useStore: import("zustand").UseBoundStore<StoreState, import("zustand").StoreApi<StoreState>>;
47
- export {};
@@ -1,91 +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.useStore = void 0;
7
- const zustand_1 = __importDefault(require("zustand"));
8
- const immerMiddleware_1 = require("./immerMiddleware");
9
- const unhydratedFormState = {
10
- hydrated: false,
11
- fieldErrors: {},
12
- isSubmitting: false,
13
- hasBeenSubmitted: false,
14
- touchedFields: {},
15
- defaultValues: {},
16
- validateField: () => Promise.resolve(null),
17
- registerReceiveFocus: () => () => { },
18
- setFieldValue: () => { },
19
- // clearError: () => {},
20
- // addError: () => {},
21
- // setTouched: () => {},
22
- // reset: () => {},
23
- // startSubmit: () => {},
24
- // endSubmit: () => {},
25
- // sync: () => {},
26
- // setFieldErrors: () => {},
27
- };
28
- exports.useStore = (0, zustand_1.default)((0, immerMiddleware_1.immer)((set, get) => ({
29
- forms: {},
30
- form: (formId) => { var _a; return (_a = get().forms[formId]) !== null && _a !== void 0 ? _a : unhydratedFormState; },
31
- helpers: (formId) => ({
32
- clearError: (name) => set((state) => {
33
- delete state.forms[formId].fieldErrors[name];
34
- }),
35
- addError: (name, error) => set((state) => {
36
- state.forms[formId].fieldErrors[name] = error;
37
- }),
38
- setTouched: (name, touched) => set((state) => {
39
- state.forms[formId].touchedFields[name] = touched;
40
- }),
41
- reset: () => set((state) => {
42
- state.forms[formId].fieldErrors = {};
43
- state.forms[formId].touchedFields = {};
44
- state.forms[formId].hasBeenSubmitted = false;
45
- }),
46
- startSubmit: () => set((state) => {
47
- state.forms[formId].hasBeenSubmitted = true;
48
- state.forms[formId].isSubmitting = true;
49
- }),
50
- endSubmit: () => set((state) => {
51
- state.forms[formId].isSubmitting = false;
52
- }),
53
- setFieldErrors: (fieldErrors) => {
54
- set((state) => {
55
- state.forms[formId].fieldErrors = fieldErrors;
56
- });
57
- },
58
- sync: ({ defaultValues, action, subaction, validateField, registerReceiveFocus, setFieldValueForForm, }) => set((state) => {
59
- state.forms[formId].defaultValues = defaultValues !== null && defaultValues !== void 0 ? defaultValues : {};
60
- state.forms[formId].action = action;
61
- state.forms[formId].subaction = subaction;
62
- state.forms[formId].registerReceiveFocus = registerReceiveFocus;
63
- state.forms[formId].validateField = validateField;
64
- state.forms[formId].hydrated = true;
65
- state.forms[formId].setFieldValue = setFieldValueForForm;
66
- }),
67
- unregister: () => {
68
- set((state) => {
69
- delete state.forms[formId];
70
- });
71
- },
72
- register: ({ defaultValues, action, subaction, validateField, registerReceiveFocus, setFieldValueForForm, }) => {
73
- set((state) => {
74
- state.forms[formId] = {
75
- defaultValues: defaultValues !== null && defaultValues !== void 0 ? defaultValues : {},
76
- setFieldValue: setFieldValueForForm,
77
- registerReceiveFocus,
78
- validateField,
79
- action,
80
- subaction,
81
- hydrated: true,
82
- fieldErrors: {},
83
- isSubmitting: false,
84
- hasBeenSubmitted: false,
85
- touchedFields: {},
86
- // helpers
87
- };
88
- });
89
- },
90
- }),
91
- })));
@@ -1,71 +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.fieldDefaultValueAtom = exports.fieldErrorAtom = exports.fieldTouchedAtom = exports.setFieldErrorAtom = exports.setTouchedAtom = exports.endSubmitAtom = exports.startSubmitAtom = exports.isValidAtom = exports.cleanupFormState = exports.formElementAtom = exports.formPropsAtom = exports.touchedFieldsAtom = exports.fieldErrorsAtom = exports.hasBeenSubmittedAtom = exports.isSubmittingAtom = exports.isHydratedAtom = exports.ATOM_SCOPE = 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 atomUtils_1 = require("./state/atomUtils");
11
- exports.ATOM_SCOPE = Symbol("remix-validated-form-scope");
12
- exports.isHydratedAtom = (0, atomUtils_1.formAtomFamily)(false);
13
- exports.isSubmittingAtom = (0, atomUtils_1.formAtomFamily)(false);
14
- exports.hasBeenSubmittedAtom = (0, atomUtils_1.formAtomFamily)(false);
15
- exports.fieldErrorsAtom = (0, atomUtils_1.formAtomFamily)({});
16
- exports.touchedFieldsAtom = (0, atomUtils_1.formAtomFamily)({});
17
- exports.formPropsAtom = (0, atomUtils_1.formAtomFamily)({
18
- validateField: () => Promise.resolve(null),
19
- registerReceiveFocus: () => () => { },
20
- defaultValues: {},
21
- });
22
- exports.formElementAtom = (0, atomUtils_1.formAtomFamily)(null);
23
- //// Everything below is derived from the above
24
- const cleanupFormState = (formId) => {
25
- [
26
- exports.isHydratedAtom,
27
- exports.isSubmittingAtom,
28
- exports.hasBeenSubmittedAtom,
29
- exports.fieldErrorsAtom,
30
- exports.touchedFieldsAtom,
31
- exports.formPropsAtom,
32
- ].forEach((formAtom) => formAtom.remove(formId));
33
- };
34
- exports.cleanupFormState = cleanupFormState;
35
- exports.isValidAtom = (0, utils_1.atomFamily)((formId) => (0, jotai_1.atom)((get) => Object.keys(get((0, exports.fieldErrorsAtom)(formId))).length === 0));
36
- exports.startSubmitAtom = (0, utils_1.atomFamily)((formId) => (0, jotai_1.atom)(null, (_get, set) => {
37
- set((0, exports.isSubmittingAtom)(formId), true);
38
- set((0, exports.hasBeenSubmittedAtom)(formId), true);
39
- }));
40
- exports.endSubmitAtom = (0, utils_1.atomFamily)((formId) => (0, jotai_1.atom)(null, (_get, set) => {
41
- set((0, exports.isSubmittingAtom)(formId), false);
42
- }));
43
- exports.setTouchedAtom = (0, utils_1.atomFamily)((formId) => (0, jotai_1.atom)(null, (get, set, { field, touched }) => {
44
- const prev = get((0, exports.touchedFieldsAtom)(formId));
45
- if (prev[field] !== touched) {
46
- set((0, exports.touchedFieldsAtom)(formId), {
47
- ...prev,
48
- [field]: touched,
49
- });
50
- }
51
- }));
52
- exports.setFieldErrorAtom = (0, utils_1.atomFamily)((formId) => (0, jotai_1.atom)(null, (get, set, { field, error }) => {
53
- const prev = get((0, exports.fieldErrorsAtom)(formId));
54
- if (error === undefined && field in prev) {
55
- set((0, exports.fieldErrorsAtom)(formId), (0, omit_1.default)(prev, field));
56
- }
57
- if (error !== undefined && prev[field] !== error) {
58
- set((0, exports.fieldErrorsAtom)(formId), {
59
- ...get((0, exports.fieldErrorsAtom)(formId)),
60
- [field]: error,
61
- });
62
- }
63
- }));
64
- //// Field specific
65
- exports.fieldTouchedAtom = (0, atomUtils_1.fieldAtomFamily)(({ formId, field }) => (0, jotai_1.atom)((get) => get((0, exports.touchedFieldsAtom)(formId))[field], (_get, set, touched) => {
66
- set((0, exports.setTouchedAtom)(formId), { field, touched });
67
- }));
68
- exports.fieldErrorAtom = (0, atomUtils_1.fieldAtomFamily)(({ formId, field }) => (0, jotai_1.atom)((get) => get((0, exports.fieldErrorsAtom)(formId))[field], (_get, set, error) => {
69
- set((0, exports.setFieldErrorAtom)(formId), { field, error });
70
- }));
71
- exports.fieldDefaultValueAtom = (0, atomUtils_1.fieldAtomFamily)(({ formId, field }) => (0, utils_1.selectAtom)((0, exports.formPropsAtom)(formId), (state) => state.defaultValues[field]));
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useSubmitComplete = void 0;
4
- const react_1 = require("react");
5
- function useSubmitComplete(isSubmitting, callback) {
6
- const isPending = (0, react_1.useRef)(false);
7
- (0, react_1.useEffect)(() => {
8
- if (isSubmitting) {
9
- isPending.current = true;
10
- }
11
- if (!isSubmitting && isPending.current) {
12
- isPending.current = false;
13
- callback();
14
- }
15
- });
16
- }
17
- exports.useSubmitComplete = useSubmitComplete;
@@ -1 +0,0 @@
1
- export {};
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const jsx_runtime_1 = require("react/jsx-runtime");
4
- const getInputProps_1 = require("./getInputProps");
5
- const CompRequired = (props) => null;
6
- const getProps = (0, getInputProps_1.createGetInputProps)({});
7
- (0, jsx_runtime_1.jsx)(CompRequired, { ...getProps({
8
- temp: 21,
9
- bob: "ross",
10
- onBlur: () => { },
11
- // onChange: () => {},
12
- }) }, void 0);
@@ -1,41 +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.useDeepEqualsMemo = exports.useIsomorphicLayoutEffect = exports.mergeRefs = exports.omit = void 0;
7
- const isEqual_1 = __importDefault(require("lodash/isEqual"));
8
- const react_1 = require("react");
9
- const omit = (obj, ...keys) => {
10
- const result = { ...obj };
11
- for (const key of keys) {
12
- delete result[key];
13
- }
14
- return result;
15
- };
16
- exports.omit = omit;
17
- const mergeRefs = (refs) => {
18
- return (value) => {
19
- refs.filter(Boolean).forEach((ref) => {
20
- if (typeof ref === "function") {
21
- ref(value);
22
- }
23
- else if (ref != null) {
24
- ref.current = value;
25
- }
26
- });
27
- };
28
- };
29
- exports.mergeRefs = mergeRefs;
30
- exports.useIsomorphicLayoutEffect = typeof window !== "undefined" ? react_1.useLayoutEffect : react_1.useEffect;
31
- const useDeepEqualsMemo = (item) => {
32
- const ref = (0, react_1.useRef)(item);
33
- const areEqual = ref.current === item || (0, isEqual_1.default)(ref.current, item);
34
- (0, react_1.useEffect)(() => {
35
- if (!areEqual) {
36
- ref.current = item;
37
- }
38
- });
39
- return areEqual ? ref.current : item;
40
- };
41
- exports.useDeepEqualsMemo = useDeepEqualsMemo;
@@ -1,20 +0,0 @@
1
- declare type ParseInfo = {
2
- value: unknown;
3
- type: string;
4
- isRepeated: boolean;
5
- checked?: boolean;
6
- };
7
- declare type BaseWatchOptions<T> = {
8
- formId?: string;
9
- parse?: (info: ParseInfo) => T;
10
- };
11
- declare type UseWatchType = {
12
- <T>(name: string, options?: BaseWatchOptions<T> & {
13
- repeatable?: false;
14
- }): T;
15
- <T>(name: string, options?: BaseWatchOptions<T> & {
16
- repeatable: true;
17
- }): T[];
18
- };
19
- export declare const useWatch: UseWatchType;
20
- export {};
@@ -1,126 +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.useWatch = void 0;
7
- const jotai_1 = require("jotai");
8
- const utils_1 = require("jotai/utils");
9
- const isNaN_1 = __importDefault(require("lodash/isNaN"));
10
- const react_1 = require("react");
11
- const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
12
- const hooks_1 = require("./hooks");
13
- const elementUtils_1 = require("./logic/elementUtils");
14
- const state_1 = require("./state");
15
- const atomUtils_1 = require("./state/atomUtils");
16
- const controlledFields_1 = require("./state/controlledFields");
17
- const emptyAtom = (0, jotai_1.atom)(undefined); // Always empty -- just used as a default value
18
- const watchControlledFieldAtom = (0, atomUtils_1.fieldAtomFamily)(({ field, formId }) => (0, utils_1.selectAtom)((0, controlledFields_1.controlledFieldsAtom)(formId), (fields) => {
19
- var _a;
20
- return ({
21
- present: field in fields,
22
- valueAtom: (_a = fields[field]) !== null && _a !== void 0 ? _a : emptyAtom,
23
- });
24
- }));
25
- const defaultParse = ({ value, type, isRepeated, checked, }) => {
26
- if (type === "number") {
27
- const result = Number(value);
28
- if ((0, isNaN_1.default)(result))
29
- throw new Error("Value is not a number");
30
- return result;
31
- }
32
- if (type === "checkbox" && !isRepeated) {
33
- return checked;
34
- }
35
- return value;
36
- };
37
- const getInputValues = (node, multipleInputs = false) => {
38
- if (!node)
39
- return [];
40
- if (node instanceof RadioNodeList) {
41
- return [...node].flatMap((el) => getInputValues(el, true));
42
- }
43
- if ((0, elementUtils_1.isMultiselect)(node)) {
44
- return [
45
- {
46
- type: "select",
47
- value: [...node.options]
48
- .filter((opt) => opt.selected)
49
- .map((opt) => opt.value),
50
- },
51
- ];
52
- }
53
- if ((0, elementUtils_1.isCheckbox)(node)) {
54
- if (node.checked || !multipleInputs)
55
- return [{ type: "checkbox", value: node.value, checked: node.checked }];
56
- return [];
57
- }
58
- if ((0, elementUtils_1.isRadio)(node)) {
59
- if (node.checked)
60
- return [{ type: "radio", value: node.value, checked: node.checked }];
61
- return [];
62
- }
63
- const input = node;
64
- return [{ type: input.type, value: input.value, checked: input.checked }];
65
- };
66
- const useWatch = (field, { formId, parse = defaultParse, repeatable = false, } = {}) => {
67
- const context = (0, hooks_1.useInternalFormContext)(formId, "useWatch");
68
- const defaultValue = (0, hooks_1.useFieldDefaultValue)(field, context);
69
- const hasSynced = (0, react_1.useRef)(false);
70
- const [inputValues, setValue] = (0, react_1.useState)([]);
71
- const formElement = (0, hooks_1.useFormAtomValue)((0, state_1.formElementAtom)(context.formId));
72
- const controlledField = (0, hooks_1.useFormAtomValue)(watchControlledFieldAtom({ formId: context.formId, field }));
73
- const controlledValue = (0, hooks_1.useFormAtomValue)(controlledField.valueAtom);
74
- const shouldSyncNativeInputValue = !controlledField.present && formElement;
75
- const syncFieldValue = (0, react_1.useCallback)(() => {
76
- (0, tiny_invariant_1.default)(formElement, `Unable to find form element for form. Watching field ${field}`);
77
- hasSynced.current = true;
78
- // We pull the values out using `form.elements` instead of `FormData`
79
- // so that we can access the `type` of the input.
80
- setValue(getInputValues(formElement.elements.namedItem(field)));
81
- }, [field, formElement]);
82
- // Should set the field values after the initial render
83
- (0, react_1.useEffect)(() => {
84
- if (shouldSyncNativeInputValue)
85
- syncFieldValue();
86
- }, [
87
- controlledField.present,
88
- formElement,
89
- shouldSyncNativeInputValue,
90
- syncFieldValue,
91
- ]);
92
- (0, react_1.useEffect)(() => {
93
- if (shouldSyncNativeInputValue) {
94
- const listener = async (event) => {
95
- if (!(event.target instanceof HTMLElement))
96
- return;
97
- const target = event.target;
98
- const { form: targetForm, name: targetName } = target;
99
- if (targetForm === formElement && targetName === field) {
100
- syncFieldValue();
101
- }
102
- };
103
- window.addEventListener("change", listener);
104
- window.addEventListener("input", listener);
105
- return () => {
106
- window.removeEventListener("change", listener);
107
- window.removeEventListener("input", listener);
108
- };
109
- }
110
- }, [field, formElement, shouldSyncNativeInputValue, syncFieldValue]);
111
- const parsedValue = (0, react_1.useMemo)(() => {
112
- const parsed = inputValues.map(({ type, value, checked }) => parse({
113
- value,
114
- type,
115
- isRepeated: inputValues.length > 1 || repeatable,
116
- checked,
117
- }));
118
- return parsed.length > 1 || repeatable ? parsed : parsed[0];
119
- }, [parse, repeatable, inputValues]);
120
- if (controlledField.present)
121
- return controlledValue;
122
- if (!hasSynced.current)
123
- return defaultValue !== null && defaultValue !== void 0 ? defaultValue : (repeatable ? [] : undefined);
124
- return parsedValue;
125
- };
126
- exports.useWatch = useWatch;
package/build/server.js DELETED
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setFormDefaults = exports.validationError = void 0;
4
- const server_runtime_1 = require("@remix-run/server-runtime");
5
- const constants_1 = require("./internal/constants");
6
- /**
7
- * Takes the errors from a `Validator` and returns a `Response`.
8
- * When you return this from your action, `ValidatedForm` on the frontend will automatically
9
- * display the errors on the correct fields on the correct form.
10
- *
11
- * You can also provide a second argument to `validationError`
12
- * to specify how to repopulate the form when JS is disabled.
13
- *
14
- * @example
15
- * ```ts
16
- * const result = validator.validate(await request.formData());
17
- * if (result.error) return validationError(result.error, result.submittedData);
18
- * ```
19
- */
20
- function validationError(error, repopulateFields, init) {
21
- return (0, server_runtime_1.json)({
22
- fieldErrors: error.fieldErrors,
23
- subaction: error.subaction,
24
- repopulateFields,
25
- formId: error.formId,
26
- }, { status: 422, ...init });
27
- }
28
- exports.validationError = validationError;
29
- const setFormDefaults = (formId, defaultValues) => ({
30
- [(0, constants_1.formDefaultValuesKey)(formId)]: defaultValues,
31
- });
32
- exports.setFormDefaults = setFormDefaults;
package/build/types.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare type ValidationState = "idle" | "validating" | "valid" | "invalid";
package/build/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useFormHelpers = exports.useFormState = void 0;
4
- const react_1 = require("react");
5
- const hooks_1 = require("../internal/hooks");
6
- const state_1 = require("../internal/state");
7
- /**
8
- * Returns information about the form.
9
- *
10
- * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.
11
- */
12
- const useFormState = (formId) => {
13
- const formContext = (0, hooks_1.useInternalFormContext)(formId, "useIsValid");
14
- const formProps = (0, hooks_1.useFormAtomValue)((0, state_1.formPropsAtom)(formContext.formId));
15
- const isSubmitting = (0, hooks_1.useFormAtomValue)((0, state_1.isSubmittingAtom)(formContext.formId));
16
- const hasBeenSubmitted = (0, hooks_1.useFormAtomValue)((0, state_1.hasBeenSubmittedAtom)(formContext.formId));
17
- const touchedFields = (0, hooks_1.useFormAtomValue)((0, state_1.touchedFieldsAtom)(formContext.formId));
18
- const isValid = (0, hooks_1.useFormAtomValue)((0, state_1.isValidAtom)(formContext.formId));
19
- const defaultValuesToUse = (0, hooks_1.useDefaultValuesForForm)(formContext);
20
- const hydratedDefaultValues = defaultValuesToUse.hydrateTo(formProps.defaultValues);
21
- const fieldErrorsFromState = (0, hooks_1.useFormAtomValue)((0, state_1.fieldErrorsAtom)(formContext.formId));
22
- const fieldErrorsToUse = (0, hooks_1.useFieldErrorsForForm)(formContext);
23
- const hydratedFieldErrors = fieldErrorsToUse.hydrateTo(fieldErrorsFromState);
24
- return (0, react_1.useMemo)(() => ({
25
- ...formProps,
26
- defaultValues: hydratedDefaultValues,
27
- fieldErrors: hydratedFieldErrors !== null && hydratedFieldErrors !== void 0 ? hydratedFieldErrors : {},
28
- hasBeenSubmitted,
29
- isSubmitting,
30
- touchedFields,
31
- isValid,
32
- }), [
33
- formProps,
34
- hasBeenSubmitted,
35
- hydratedDefaultValues,
36
- hydratedFieldErrors,
37
- isSubmitting,
38
- isValid,
39
- touchedFields,
40
- ]);
41
- };
42
- exports.useFormState = useFormState;
43
- /**
44
- * Returns helpers that can be used to update the form state.
45
- *
46
- * @param formId the id of the form. Only necessary if being used outside a ValidatedForm.
47
- */
48
- const useFormHelpers = (formId) => {
49
- const formContext = (0, hooks_1.useInternalFormContext)(formId, "useFormHelpers");
50
- const setTouched = (0, hooks_1.useSetTouched)(formContext);
51
- const { validateField } = (0, hooks_1.useFormAtomValue)((0, state_1.formPropsAtom)(formContext.formId));
52
- const clearError = (0, hooks_1.useClearError)(formContext);
53
- return (0, react_1.useMemo)(() => ({
54
- setTouched,
55
- validateField,
56
- clearError,
57
- }), [clearError, setTouched, validateField]);
58
- };
59
- exports.useFormHelpers = useFormHelpers;
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useFormContext = void 0;
4
- const react_1 = require("react");
5
- const hooks_1 = require("./internal/hooks");
6
- const state_1 = require("./internal/state");
7
- const formStateHooks_1 = require("./unreleased/formStateHooks");
8
- /**
9
- * Provides access to some of the internal state of the form.
10
- */
11
- const useFormContext = (formId) => {
12
- // Try to access context so we get our error specific to this hook if it's not there
13
- const context = (0, hooks_1.useInternalFormContext)(formId, "useFormContext");
14
- const state = (0, formStateHooks_1.useFormState)(formId);
15
- const { clearError: internalClearError, setTouched, validateField, } = (0, formStateHooks_1.useFormHelpers)(formId);
16
- const { registerReceiveFocus } = (0, hooks_1.useFormAtomValue)((0, state_1.formPropsAtom)(context.formId));
17
- const clearError = (0, react_1.useCallback)((...names) => {
18
- names.forEach((name) => {
19
- internalClearError(name);
20
- });
21
- }, [internalClearError]);
22
- return {
23
- ...state,
24
- setFieldTouched: setTouched,
25
- validateField,
26
- clearError,
27
- registerReceiveFocus,
28
- };
29
- };
30
- exports.useFormContext = useFormContext;