remix-validated-form 4.5.4 → 4.6.0-beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/browser/ValidatedForm.js +0 -3
  3. package/browser/index.d.ts +1 -0
  4. package/browser/index.js +1 -0
  5. package/browser/internal/hooks.d.ts +1 -0
  6. package/browser/internal/hooks.js +3 -4
  7. package/browser/internal/state/controlledFields.d.ts +1 -0
  8. package/browser/internal/state/controlledFields.js +17 -29
  9. package/browser/internal/state/createFormStore.d.ts +31 -1
  10. package/browser/internal/state/createFormStore.js +175 -8
  11. package/dist/remix-validated-form.cjs.js +4 -4
  12. package/dist/remix-validated-form.cjs.js.map +1 -1
  13. package/dist/remix-validated-form.es.js +336 -126
  14. package/dist/remix-validated-form.es.js.map +1 -1
  15. package/dist/remix-validated-form.umd.js +4 -4
  16. package/dist/remix-validated-form.umd.js.map +1 -1
  17. package/dist/types/index.d.ts +1 -0
  18. package/dist/types/internal/hooks.d.ts +1 -0
  19. package/dist/types/internal/state/arrayUtil.d.ts +12 -0
  20. package/dist/types/internal/state/controlledFields.d.ts +1 -0
  21. package/dist/types/internal/state/createFormStore.d.ts +31 -1
  22. package/dist/types/internal/state/fieldArray.d.ts +28 -0
  23. package/package.json +1 -1
  24. package/src/ValidatedForm.tsx +0 -3
  25. package/src/index.ts +6 -0
  26. package/src/internal/hooks.ts +9 -4
  27. package/src/internal/logic/nestedObjectToPathObject.ts +63 -0
  28. package/src/internal/state/arrayUtil.ts +399 -0
  29. package/src/internal/state/controlledFields.ts +39 -43
  30. package/src/internal/state/createFormStore.ts +286 -10
  31. package/src/internal/state/fieldArray.tsx +155 -0
  32. package/dist/types/internal/state/controlledFieldStore.d.ts +0 -26
  33. package/src/internal/state/controlledFieldStore.ts +0 -112
@@ -1,112 +0,0 @@
1
- import create from "zustand";
2
- import { immer } from "zustand/middleware/immer";
3
- import { InternalFormId } from "./types";
4
-
5
- export type FieldState = {
6
- refCount: number;
7
- value: unknown;
8
- defaultValue?: unknown;
9
- hydrated: boolean;
10
- valueUpdatePromise: Promise<void> | undefined;
11
- resolveValueUpdate: (() => void) | undefined;
12
- };
13
-
14
- export type ControlledFieldState = {
15
- forms: {
16
- [formId: InternalFormId]: {
17
- [fieldName: string]: FieldState | undefined;
18
- };
19
- };
20
- register: (formId: InternalFormId, fieldName: string) => void;
21
- unregister: (formId: InternalFormId, fieldName: string) => void;
22
- getField: (
23
- formId: InternalFormId,
24
- fieldName: string
25
- ) => FieldState | undefined;
26
- setValue: (formId: InternalFormId, fieldName: string, value: unknown) => void;
27
- hydrateWithDefault: (
28
- formId: InternalFormId,
29
- fieldName: string,
30
- defaultValue: unknown
31
- ) => void;
32
- awaitValueUpdate: (
33
- formId: InternalFormId,
34
- fieldName: string
35
- ) => Promise<void>;
36
- reset: (formId: InternalFormId) => void;
37
- };
38
-
39
- export const useControlledFieldStore = create<ControlledFieldState>()(
40
- immer((set, get) => ({
41
- forms: {},
42
-
43
- register: (formId, field) =>
44
- set((state) => {
45
- if (!state.forms[formId]) {
46
- state.forms[formId] = {};
47
- }
48
-
49
- if (state.forms[formId][field]) {
50
- state.forms[formId][field]!.refCount++;
51
- } else {
52
- state.forms[formId][field] = {
53
- refCount: 1,
54
- value: undefined,
55
- hydrated: false,
56
- valueUpdatePromise: undefined,
57
- resolveValueUpdate: undefined,
58
- };
59
- }
60
- }),
61
-
62
- unregister: (formId, field) =>
63
- set((state) => {
64
- const formState = state.forms?.[formId];
65
- const fieldState = formState?.[field];
66
- if (!fieldState) return;
67
-
68
- fieldState.refCount--;
69
- if (fieldState.refCount === 0) delete formState[field];
70
- }),
71
-
72
- getField: (formId, field) => {
73
- return get().forms?.[formId]?.[field];
74
- },
75
-
76
- setValue: (formId, field, value) =>
77
- set((state) => {
78
- const fieldState = state.forms?.[formId]?.[field];
79
- if (!fieldState) return;
80
-
81
- fieldState.value = value;
82
- const promise = new Promise<void>((resolve) => {
83
- fieldState.resolveValueUpdate = resolve;
84
- });
85
- fieldState.valueUpdatePromise = promise;
86
- }),
87
-
88
- hydrateWithDefault: (formId, field, defaultValue) =>
89
- set((state) => {
90
- const fieldState = state.forms[formId]?.[field];
91
- if (!fieldState) return;
92
-
93
- fieldState.value = defaultValue;
94
- fieldState.defaultValue = defaultValue;
95
- fieldState.hydrated = true;
96
- }),
97
-
98
- awaitValueUpdate: async (formId, field) => {
99
- await get().getField(formId, field)?.valueUpdatePromise;
100
- },
101
-
102
- reset: (formId) =>
103
- set((state) => {
104
- const formState = state.forms[formId];
105
- if (!formState) return;
106
- Object.values(formState).forEach((field) => {
107
- if (!field) return;
108
- field.value = field.defaultValue;
109
- });
110
- }),
111
- }))
112
- );