@tanstack/form-core 0.0.11 → 0.0.13

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 (76) hide show
  1. package/build/{cjs/FieldApi.js → lib/FieldApi.cjs} +80 -113
  2. package/build/lib/FieldApi.cjs.map +1 -0
  3. package/build/lib/FieldApi.d.ts +112 -0
  4. package/build/lib/FieldApi.d.ts.map +1 -0
  5. package/build/lib/FieldApi.js +305 -0
  6. package/build/lib/FieldApi.js.map +1 -0
  7. package/build/lib/FieldApi.legacy.cjs +307 -0
  8. package/build/lib/FieldApi.legacy.cjs.map +1 -0
  9. package/build/lib/FieldApi.legacy.js +305 -0
  10. package/build/lib/FieldApi.legacy.js.map +1 -0
  11. package/build/{cjs/FormApi.js → lib/FormApi.cjs} +66 -78
  12. package/build/lib/FormApi.cjs.map +1 -0
  13. package/build/{types → lib}/FormApi.d.ts +3 -2
  14. package/build/lib/FormApi.d.ts.map +1 -0
  15. package/build/lib/FormApi.js +246 -0
  16. package/build/lib/FormApi.js.map +1 -0
  17. package/build/lib/FormApi.legacy.cjs +248 -0
  18. package/build/lib/FormApi.legacy.cjs.map +1 -0
  19. package/build/lib/FormApi.legacy.js +246 -0
  20. package/build/lib/FormApi.legacy.js.map +1 -0
  21. package/build/{cjs/_virtual/_rollupPluginBabelHelpers.js → lib/_virtual/_rollupPluginBabelHelpers.cjs} +18 -45
  22. package/build/lib/_virtual/_rollupPluginBabelHelpers.cjs.map +1 -0
  23. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +56 -0
  24. package/build/{cjs → lib}/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  25. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.cjs +65 -0
  26. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.cjs.map +1 -0
  27. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.js +56 -0
  28. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.js.map +1 -0
  29. package/build/lib/index.cjs +14 -0
  30. package/build/lib/index.cjs.map +1 -0
  31. package/build/{types → lib}/index.d.ts +1 -0
  32. package/build/lib/index.d.ts.map +1 -0
  33. package/build/lib/index.js +4 -0
  34. package/build/{cjs → lib}/index.js.map +1 -1
  35. package/build/lib/index.legacy.cjs +14 -0
  36. package/build/lib/index.legacy.cjs.map +1 -0
  37. package/build/lib/index.legacy.js +4 -0
  38. package/build/lib/index.legacy.js.map +1 -0
  39. package/build/lib/tests/FieldApi.spec.d.ts +2 -0
  40. package/build/lib/tests/FieldApi.spec.d.ts.map +1 -0
  41. package/build/lib/tests/FieldApi.test-d.d.ts +2 -0
  42. package/build/lib/tests/FieldApi.test-d.d.ts.map +1 -0
  43. package/build/lib/tests/FormApi.spec.d.ts +2 -0
  44. package/build/lib/tests/FormApi.spec.d.ts.map +1 -0
  45. package/build/{cjs/utils.js → lib/utils.cjs} +18 -27
  46. package/build/lib/utils.cjs.map +1 -0
  47. package/build/{types → lib}/utils.d.ts +10 -0
  48. package/build/lib/utils.d.ts.map +1 -0
  49. package/build/lib/utils.js +77 -0
  50. package/build/lib/utils.js.map +1 -0
  51. package/build/lib/utils.legacy.cjs +81 -0
  52. package/build/lib/utils.legacy.cjs.map +1 -0
  53. package/build/lib/utils.legacy.js +77 -0
  54. package/build/lib/utils.legacy.js.map +1 -0
  55. package/package.json +22 -9
  56. package/src/FieldApi.ts +101 -46
  57. package/src/FormApi.ts +34 -14
  58. package/src/tests/FieldApi.spec.ts +169 -0
  59. package/src/tests/FieldApi.test-d.ts +41 -0
  60. package/src/tests/FormApi.spec.ts +216 -0
  61. package/src/utils.ts +10 -1
  62. package/build/cjs/FieldApi.js.map +0 -1
  63. package/build/cjs/FormApi.js.map +0 -1
  64. package/build/cjs/index.js +0 -26
  65. package/build/cjs/utils.js.map +0 -1
  66. package/build/esm/index.js +0 -716
  67. package/build/esm/index.js.map +0 -1
  68. package/build/stats-html.html +0 -2689
  69. package/build/stats-react.json +0 -196
  70. package/build/types/FieldApi.d.ts +0 -85
  71. package/build/types/tests/test.test.d.ts +0 -0
  72. package/build/umd/index.development.js +0 -779
  73. package/build/umd/index.development.js.map +0 -1
  74. package/build/umd/index.production.js +0 -22
  75. package/build/umd/index.production.js.map +0 -1
  76. package/src/tests/test.test.tsx +0 -5
@@ -1,20 +1,8 @@
1
- /**
2
- * form-core
3
- *
4
- * Copyright (c) TanStack
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE.md file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */
11
1
  'use strict';
12
2
 
13
- Object.defineProperty(exports, '__esModule', { value: true });
14
-
15
- var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.js');
3
+ var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.cjs');
16
4
  var store = require('@tanstack/store');
17
- var utils = require('./utils.js');
5
+ var utils = require('./utils.cjs');
18
6
 
19
7
  function getDefaultFormState(defaultState) {
20
8
  return {
@@ -35,44 +23,45 @@ function getDefaultFormState(defaultState) {
35
23
  ...defaultState
36
24
  };
37
25
  }
38
-
39
26
  class FormApi {
40
- // // This carries the context for nested fields
41
- // Do not use __state directly, as it is not reactive.
42
- // Please use form.useStore() utility to subscribe to state
43
27
  constructor(_opts) {
44
28
  var _opts$defaultValues, _opts$defaultState;
45
-
29
+ // // This carries the context for nested fields
46
30
  _rollupPluginBabelHelpers.defineProperty(this, "options", {});
47
-
48
31
  _rollupPluginBabelHelpers.defineProperty(this, "store", void 0);
49
-
32
+ // Do not use __state directly, as it is not reactive.
33
+ // Please use form.useStore() utility to subscribe to state
50
34
  _rollupPluginBabelHelpers.defineProperty(this, "state", void 0);
51
-
52
35
  _rollupPluginBabelHelpers.defineProperty(this, "fieldInfo", {});
53
-
54
36
  _rollupPluginBabelHelpers.defineProperty(this, "fieldName", void 0);
55
-
56
37
  _rollupPluginBabelHelpers.defineProperty(this, "validationMeta", {});
57
-
58
38
  _rollupPluginBabelHelpers.defineProperty(this, "update", options => {
59
39
  if (!options) return;
60
40
  this.store.batch(() => {
61
- if (options.defaultState && options.defaultState !== this.options.defaultState) {
62
- this.store.setState(prev => ({ ...prev,
63
- ...options.defaultState
64
- }));
65
- }
41
+ const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues;
42
+ const shouldUpdateState = options.defaultState !== this.options.defaultState;
66
43
 
67
- if (options.defaultValues !== this.options.defaultValues) {
68
- this.store.setState(() => getDefaultFormState(options.defaultValues));
44
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
45
+ if (!shouldUpdateValues || !shouldUpdateValues) {
46
+ return;
69
47
  }
48
+ this.store.setState(() => getDefaultFormState(Object.assign({},
49
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
50
+ shouldUpdateState ? options.defaultState : {},
51
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
52
+ shouldUpdateValues ? {
53
+ values: options.defaultValues
54
+ } : {})));
70
55
  });
71
56
  this.options = options;
72
57
  });
73
-
74
- _rollupPluginBabelHelpers.defineProperty(this, "reset", () => this.store.setState(() => getDefaultFormState(this.options.defaultValues)));
75
-
58
+ _rollupPluginBabelHelpers.defineProperty(this, "reset", () => this.store.setState(() => {
59
+ var _this$options$default, _this$options$default2;
60
+ return getDefaultFormState({
61
+ ...this.options.defaultState,
62
+ values: (_this$options$default = this.options.defaultValues) != null ? _this$options$default : (_this$options$default2 = this.options.defaultState) == null ? void 0 : _this$options$default2.values
63
+ });
64
+ }));
76
65
  _rollupPluginBabelHelpers.defineProperty(this, "validateAllFields", async cause => {
77
66
  const fieldValidationPromises = [];
78
67
  this.store.batch(() => {
@@ -81,10 +70,11 @@ class FormApi {
81
70
  // If any fields are not touched
82
71
  if (!instance.state.meta.isTouched) {
83
72
  // Mark them as touched
84
- instance.setMeta(prev => ({ ...prev,
73
+ instance.setMeta(prev => ({
74
+ ...prev,
85
75
  isTouched: true
86
- })); // Validate the field
87
-
76
+ }));
77
+ // Validate the field
88
78
  fieldValidationPromises.push(Promise.resolve().then(() => instance.validate(cause)));
89
79
  }
90
80
  });
@@ -92,60 +82,64 @@ class FormApi {
92
82
  });
93
83
  return Promise.all(fieldValidationPromises);
94
84
  });
95
-
85
+ // validateForm = async () => {}
96
86
  _rollupPluginBabelHelpers.defineProperty(this, "handleSubmit", async e => {
97
87
  e.preventDefault();
98
- e.stopPropagation(); // Check to see that the form and all fields have been touched
88
+ e.stopPropagation();
89
+
90
+ // Check to see that the form and all fields have been touched
99
91
  // If they have not, touch them all and run validation
100
92
  // Run form validation
101
93
  // Submit the form
102
94
 
103
- this.store.setState(old => ({ ...old,
95
+ this.store.setState(old => ({
96
+ ...old,
104
97
  // Submittion attempts mark the form as not submitted
105
98
  isSubmitted: false,
106
99
  // Count submission attempts
107
100
  submissionAttempts: old.submissionAttempts + 1
108
- })); // Don't let invalid forms submit
101
+ }));
109
102
 
103
+ // Don't let invalid forms submit
110
104
  if (!this.state.canSubmit) return;
111
- this.store.setState(d => ({ ...d,
105
+ this.store.setState(d => ({
106
+ ...d,
112
107
  isSubmitting: true
113
108
  }));
114
-
115
109
  const done = () => {
116
- this.store.setState(prev => ({ ...prev,
110
+ this.store.setState(prev => ({
111
+ ...prev,
117
112
  isSubmitting: false
118
113
  }));
119
- }; // Validate all fields
114
+ };
120
115
 
116
+ // Validate all fields
117
+ await this.validateAllFields('submit');
121
118
 
122
- await this.validateAllFields('submit'); // Fields are invalid, do not submit
123
-
119
+ // Fields are invalid, do not submit
124
120
  if (!this.state.isFieldsValid) {
125
121
  var _this$options$onSubmi, _this$options;
126
-
127
122
  done();
128
123
  (_this$options$onSubmi = (_this$options = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi.call(_this$options, this.state.values, this);
129
124
  return;
130
- } // Run validation for the form
131
- // await this.validateForm()
125
+ }
132
126
 
127
+ // Run validation for the form
128
+ // await this.validateForm()
133
129
 
134
130
  if (!this.state.isValid) {
135
131
  var _this$options$onSubmi2, _this$options2;
136
-
137
132
  done();
138
133
  (_this$options$onSubmi2 = (_this$options2 = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi2.call(_this$options2, this.state.values, this);
139
134
  return;
140
135
  }
141
-
142
136
  try {
143
137
  var _this$options$onSubmi3, _this$options3;
144
-
145
138
  // Run the submit code
146
139
  await ((_this$options$onSubmi3 = (_this$options3 = this.options).onSubmit) == null ? void 0 : _this$options$onSubmi3.call(_this$options3, this.state.values, this));
147
140
  this.store.batch(() => {
148
- this.store.setState(prev => ({ ...prev,
141
+ this.store.setState(prev => ({
142
+ ...prev,
149
143
  isSubmitted: true
150
144
  }));
151
145
  done();
@@ -155,81 +149,75 @@ class FormApi {
155
149
  throw err;
156
150
  }
157
151
  });
158
-
159
152
  _rollupPluginBabelHelpers.defineProperty(this, "getFieldValue", field => utils.getBy(this.state.values, field));
160
-
161
153
  _rollupPluginBabelHelpers.defineProperty(this, "getFieldMeta", field => {
162
154
  return this.state.fieldMeta[field];
163
155
  });
164
-
165
156
  _rollupPluginBabelHelpers.defineProperty(this, "getFieldInfo", field => {
166
157
  var _this$fieldInfo;
167
-
158
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
168
159
  return (_this$fieldInfo = this.fieldInfo)[field] || (_this$fieldInfo[field] = {
169
160
  instances: {}
170
161
  });
171
162
  });
172
-
173
163
  _rollupPluginBabelHelpers.defineProperty(this, "setFieldMeta", (field, updater) => {
174
164
  this.store.setState(prev => {
175
- return { ...prev,
176
- fieldMeta: { ...prev.fieldMeta,
165
+ return {
166
+ ...prev,
167
+ fieldMeta: {
168
+ ...prev.fieldMeta,
177
169
  [field]: utils.functionalUpdate(updater, prev.fieldMeta[field])
178
170
  }
179
171
  };
180
172
  });
181
173
  });
182
-
183
174
  _rollupPluginBabelHelpers.defineProperty(this, "setFieldValue", (field, updater, opts) => {
184
175
  const touch = opts == null ? void 0 : opts.touch;
185
176
  this.store.batch(() => {
186
177
  if (touch) {
187
- this.setFieldMeta(field, prev => ({ ...prev,
178
+ this.setFieldMeta(field, prev => ({
179
+ ...prev,
188
180
  isTouched: true
189
181
  }));
190
182
  }
191
-
192
183
  this.store.setState(prev => {
193
- return { ...prev,
184
+ return {
185
+ ...prev,
194
186
  values: utils.setBy(prev.values, field, updater)
195
187
  };
196
188
  });
197
189
  });
198
190
  });
199
-
200
191
  _rollupPluginBabelHelpers.defineProperty(this, "pushFieldValue", (field, value, opts) => {
201
192
  return this.setFieldValue(field, prev => [...(Array.isArray(prev) ? prev : []), value], opts);
202
193
  });
203
-
204
194
  _rollupPluginBabelHelpers.defineProperty(this, "insertFieldValue", (field, index, value, opts) => {
205
195
  this.setFieldValue(field, prev => {
206
196
  return prev.map((d, i) => i === index ? value : d);
207
197
  }, opts);
208
198
  });
209
-
210
199
  _rollupPluginBabelHelpers.defineProperty(this, "removeFieldValue", (field, index, opts) => {
211
200
  this.setFieldValue(field, prev => {
212
201
  return prev.filter((_d, i) => i !== index);
213
202
  }, opts);
214
203
  });
215
-
216
204
  _rollupPluginBabelHelpers.defineProperty(this, "swapFieldValues", (field, index1, index2) => {
217
205
  this.setFieldValue(field, prev => {
218
206
  const prev1 = prev[index1];
219
207
  const prev2 = prev[index2];
220
- return utils.setBy(utils.setBy(prev, [index1], prev2), [index2], prev1);
208
+ return utils.setBy(utils.setBy(prev, "" + index1, prev2), "" + index2, prev1);
221
209
  });
222
210
  });
223
-
224
- this.store = new store.Store(getDefaultFormState({ ...(_opts == null ? void 0 : _opts.defaultState),
211
+ this.store = new store.Store(getDefaultFormState({
212
+ ...(_opts == null ? void 0 : _opts.defaultState),
225
213
  values: (_opts$defaultValues = _opts == null ? void 0 : _opts.defaultValues) != null ? _opts$defaultValues : _opts == null ? void 0 : (_opts$defaultState = _opts.defaultState) == null ? void 0 : _opts$defaultState.values,
226
214
  isFormValid: true
227
215
  }), {
228
216
  onUpdate: () => {
229
217
  let {
230
218
  state
231
- } = this.store; // Computed state
232
-
219
+ } = this.store;
220
+ // Computed state
233
221
  const fieldMetaValues = Object.values(state.fieldMeta);
234
222
  const isFieldsValidating = fieldMetaValues.some(field => field == null ? void 0 : field.isValidating);
235
223
  const isFieldsValid = !fieldMetaValues.some(field => field == null ? void 0 : field.error);
@@ -238,7 +226,8 @@ class FormApi {
238
226
  const isFormValid = !state.formError;
239
227
  const isValid = isFieldsValid && isFormValid;
240
228
  const canSubmit = state.submissionAttempts === 0 && !isTouched || !isValidating && !state.isSubmitting && isValid;
241
- state = { ...state,
229
+ state = {
230
+ ...state,
242
231
  isFieldsValidating,
243
232
  isFieldsValid,
244
233
  isFormValid,
@@ -253,8 +242,7 @@ class FormApi {
253
242
  this.state = this.store.state;
254
243
  this.update(_opts || {});
255
244
  }
256
-
257
245
  }
258
246
 
259
247
  exports.FormApi = FormApi;
260
- //# sourceMappingURL=FormApi.js.map
248
+ //# sourceMappingURL=FormApi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormApi.cjs","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta, ValidationCause } from './FieldApi'\n\nexport interface Register {\n // FormSubmitEvent\n}\n\nexport type FormSubmitEvent = Register extends {\n FormSubmitEvent: infer E\n}\n ? E\n : Event\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n asyncDebounceMs?: number\n onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onMountAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onMountAsyncDebounceMs?: number\n onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onChangeAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onChangeAsyncDebounceMs?: number\n onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onBlurAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onBlurAsyncDebounceMs?: number\n onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>\n onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationAsyncCount?: number\n validationPromise?: Promise<ValidationError>\n validationResolve?: (error: ValidationError) => void\n validationReject?: (error: unknown) => void\n}\n\nexport type ValidationError = undefined | false | null | string\n\nexport type FormState<TData> = {\n values: TData\n // Form Validation\n isFormValidating: boolean\n formValidationCount: number\n isFormValid: boolean\n formError?: ValidationError\n // Fields\n fieldMeta: Record<DeepKeys<TData>, FieldMeta>\n isFieldsValidating: boolean\n isFieldsValid: boolean\n isSubmitting: boolean\n // General\n isTouched: boolean\n isSubmitted: boolean\n isValidating: boolean\n isValid: boolean\n canSubmit: boolean\n submissionAttempts: number\n}\n\nfunction getDefaultFormState<TData>(\n defaultState: Partial<FormState<TData>>,\n): FormState<TData> {\n return {\n values: {} as any,\n fieldMeta: {} as any,\n canSubmit: true,\n isFieldsValid: false,\n isFieldsValidating: false,\n isFormValid: false,\n isFormValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isTouched: false,\n isValid: false,\n isValidating: false,\n submissionAttempts: 0,\n formValidationCount: 0,\n ...defaultState,\n }\n}\n\nexport class FormApi<TFormData> {\n // // This carries the context for nested fields\n options: FormOptions<TFormData> = {}\n store!: Store<FormState<TFormData>>\n // Do not use __state directly, as it is not reactive.\n // Please use form.useStore() utility to subscribe to state\n state!: FormState<TFormData>\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n fieldName?: string\n validationMeta: ValidationMeta = {}\n\n constructor(opts?: FormOptions<TFormData>) {\n this.store = new Store<FormState<TFormData>>(\n getDefaultFormState({\n ...opts?.defaultState,\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n {\n onUpdate: () => {\n let { state } = this.store\n // Computed state\n const fieldMetaValues = Object.values(state.fieldMeta) as (\n | FieldMeta\n | undefined\n )[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field?.isValidating,\n )\n\n const isFieldsValid = !fieldMetaValues.some((field) => field?.error)\n\n const isTouched = fieldMetaValues.some((field) => field?.isTouched)\n\n const isValidating = isFieldsValidating || state.isFormValidating\n const isFormValid = !state.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (state.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !state.isSubmitting && isValid)\n\n state = {\n ...state,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n this.store.state = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options?: FormOptions<TFormData>) => {\n if (!options) return\n\n this.store.batch(() => {\n const shouldUpdateValues =\n options.defaultValues &&\n options.defaultValues !== this.options.defaultValues\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!shouldUpdateValues || !shouldUpdateValues) {\n return\n }\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateState ? options.defaultState : {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n ),\n ),\n )\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() =>\n getDefaultFormState({\n ...this.options.defaultState,\n values: this.options.defaultValues ?? this.options.defaultState?.values,\n }),\n )\n\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError>[] = [] as any\n\n this.store.batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n Object.values(field.instances).forEach((instance) => {\n // If any fields are not touched\n if (!instance.state.meta.isTouched) {\n // Mark them as touched\n instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n // Validate the field\n fieldValidationPromises.push(\n Promise.resolve().then(() => instance.validate(cause)),\n )\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n // validateForm = async () => {}\n\n handleSubmit = async (e: FormSubmitEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Check to see that the form and all fields have been touched\n // If they have not, touch them all and run validation\n // Run form validation\n // Submit the form\n\n this.store.setState((old) => ({\n ...old,\n // Submittion attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n }))\n\n // Don't let invalid forms submit\n if (!this.state.canSubmit) return\n\n this.store.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.store.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n // Validate all fields\n await this.validateAllFields('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onSubmitInvalid?.(this.state.values, this)\n return\n }\n\n // Run validation for the form\n // await this.validateForm()\n\n if (!this.state.isValid) {\n done()\n this.options.onSubmitInvalid?.(this.state.values, this)\n return\n }\n\n try {\n // Run the submit code\n await this.options.onSubmit?.(this.state.values, this)\n\n this.store.batch(() => {\n this.store.setState((prev) => ({ ...prev, isSubmitted: true }))\n done()\n })\n } catch (err) {\n done()\n throw err\n }\n }\n\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldMeta => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instances: {},\n })\n }\n\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<FieldMeta>,\n ) => {\n this.store.setState((prev) => {\n return {\n ...prev,\n fieldMeta: {\n ...prev.fieldMeta,\n [field]: functionalUpdate(updater, prev.fieldMeta[field]),\n },\n }\n })\n }\n\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: { touch?: boolean },\n ) => {\n const touch = opts?.touch\n\n this.store.batch(() => {\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>[number],\n opts?: { touch?: boolean },\n ) => {\n return this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n opts,\n )\n }\n\n insertFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField>[number],\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n opts,\n )\n }\n\n removeFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n opts,\n )\n }\n\n swapFieldValues = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index1: number,\n index2: number,\n ) => {\n this.setFieldValue(field, (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n })\n }\n}\n"],"names":["getDefaultFormState","defaultState","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","_opts$defaultValues","_opts$defaultState","_defineProperty","options","store","batch","shouldUpdateValues","defaultValues","shouldUpdateState","setState","Object","assign","_this$options$default","_this$options$default2","cause","fieldValidationPromises","fieldInfo","forEach","field","instances","instance","state","meta","setMeta","prev","push","Promise","resolve","then","validate","all","e","preventDefault","stopPropagation","old","d","done","validateAllFields","_this$options$onSubmi","_this$options","onSubmitInvalid","call","_this$options$onSubmi2","_this$options2","_this$options$onSubmi3","_this$options3","onSubmit","err","getBy","_this$fieldInfo","updater","functionalUpdate","touch","setFieldMeta","setBy","value","setFieldValue","Array","isArray","index","map","i","filter","_d","index1","index2","prev1","prev2","Store","onUpdate","fieldMetaValues","some","error","formError","update"],"mappings":"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"}
@@ -69,10 +69,10 @@ export declare class FormApi<TFormData> {
69
69
  setFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<DeepValue<TFormData, TField>>, opts?: {
70
70
  touch?: boolean;
71
71
  }) => void;
72
- pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField>, opts?: {
72
+ pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField>[number], opts?: {
73
73
  touch?: boolean;
74
74
  }) => void;
75
- insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField>, opts?: {
75
+ insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField>[number], opts?: {
76
76
  touch?: boolean;
77
77
  }) => void;
78
78
  removeFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, opts?: {
@@ -80,3 +80,4 @@ export declare class FormApi<TFormData> {
80
80
  }) => void;
81
81
  swapFieldValues: <TField extends DeepKeys<TFormData>>(field: TField, index1: number, index2: number) => void;
82
82
  }
83
+ //# sourceMappingURL=FormApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormApi.d.ts","sourceRoot":"","sources":["../../src/FormApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ import { defineProperty as _defineProperty } from './_virtual/_rollupPluginBabelHelpers.js';
2
+ import { Store } from '@tanstack/store';
3
+ import { getBy, functionalUpdate, setBy } from './utils.js';
4
+
5
+ function getDefaultFormState(defaultState) {
6
+ return {
7
+ values: {},
8
+ fieldMeta: {},
9
+ canSubmit: true,
10
+ isFieldsValid: false,
11
+ isFieldsValidating: false,
12
+ isFormValid: false,
13
+ isFormValidating: false,
14
+ isSubmitted: false,
15
+ isSubmitting: false,
16
+ isTouched: false,
17
+ isValid: false,
18
+ isValidating: false,
19
+ submissionAttempts: 0,
20
+ formValidationCount: 0,
21
+ ...defaultState
22
+ };
23
+ }
24
+ class FormApi {
25
+ constructor(_opts) {
26
+ var _opts$defaultValues, _opts$defaultState;
27
+ // // This carries the context for nested fields
28
+ _defineProperty(this, "options", {});
29
+ _defineProperty(this, "store", void 0);
30
+ // Do not use __state directly, as it is not reactive.
31
+ // Please use form.useStore() utility to subscribe to state
32
+ _defineProperty(this, "state", void 0);
33
+ _defineProperty(this, "fieldInfo", {});
34
+ _defineProperty(this, "fieldName", void 0);
35
+ _defineProperty(this, "validationMeta", {});
36
+ _defineProperty(this, "update", options => {
37
+ if (!options) return;
38
+ this.store.batch(() => {
39
+ const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues;
40
+ const shouldUpdateState = options.defaultState !== this.options.defaultState;
41
+
42
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
43
+ if (!shouldUpdateValues || !shouldUpdateValues) {
44
+ return;
45
+ }
46
+ this.store.setState(() => getDefaultFormState(Object.assign({},
47
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
48
+ shouldUpdateState ? options.defaultState : {},
49
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
50
+ shouldUpdateValues ? {
51
+ values: options.defaultValues
52
+ } : {})));
53
+ });
54
+ this.options = options;
55
+ });
56
+ _defineProperty(this, "reset", () => this.store.setState(() => {
57
+ var _this$options$default, _this$options$default2;
58
+ return getDefaultFormState({
59
+ ...this.options.defaultState,
60
+ values: (_this$options$default = this.options.defaultValues) != null ? _this$options$default : (_this$options$default2 = this.options.defaultState) == null ? void 0 : _this$options$default2.values
61
+ });
62
+ }));
63
+ _defineProperty(this, "validateAllFields", async cause => {
64
+ const fieldValidationPromises = [];
65
+ this.store.batch(() => {
66
+ void Object.values(this.fieldInfo).forEach(field => {
67
+ Object.values(field.instances).forEach(instance => {
68
+ // If any fields are not touched
69
+ if (!instance.state.meta.isTouched) {
70
+ // Mark them as touched
71
+ instance.setMeta(prev => ({
72
+ ...prev,
73
+ isTouched: true
74
+ }));
75
+ // Validate the field
76
+ fieldValidationPromises.push(Promise.resolve().then(() => instance.validate(cause)));
77
+ }
78
+ });
79
+ });
80
+ });
81
+ return Promise.all(fieldValidationPromises);
82
+ });
83
+ // validateForm = async () => {}
84
+ _defineProperty(this, "handleSubmit", async e => {
85
+ e.preventDefault();
86
+ e.stopPropagation();
87
+
88
+ // Check to see that the form and all fields have been touched
89
+ // If they have not, touch them all and run validation
90
+ // Run form validation
91
+ // Submit the form
92
+
93
+ this.store.setState(old => ({
94
+ ...old,
95
+ // Submittion attempts mark the form as not submitted
96
+ isSubmitted: false,
97
+ // Count submission attempts
98
+ submissionAttempts: old.submissionAttempts + 1
99
+ }));
100
+
101
+ // Don't let invalid forms submit
102
+ if (!this.state.canSubmit) return;
103
+ this.store.setState(d => ({
104
+ ...d,
105
+ isSubmitting: true
106
+ }));
107
+ const done = () => {
108
+ this.store.setState(prev => ({
109
+ ...prev,
110
+ isSubmitting: false
111
+ }));
112
+ };
113
+
114
+ // Validate all fields
115
+ await this.validateAllFields('submit');
116
+
117
+ // Fields are invalid, do not submit
118
+ if (!this.state.isFieldsValid) {
119
+ var _this$options$onSubmi, _this$options;
120
+ done();
121
+ (_this$options$onSubmi = (_this$options = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi.call(_this$options, this.state.values, this);
122
+ return;
123
+ }
124
+
125
+ // Run validation for the form
126
+ // await this.validateForm()
127
+
128
+ if (!this.state.isValid) {
129
+ var _this$options$onSubmi2, _this$options2;
130
+ done();
131
+ (_this$options$onSubmi2 = (_this$options2 = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi2.call(_this$options2, this.state.values, this);
132
+ return;
133
+ }
134
+ try {
135
+ var _this$options$onSubmi3, _this$options3;
136
+ // Run the submit code
137
+ await ((_this$options$onSubmi3 = (_this$options3 = this.options).onSubmit) == null ? void 0 : _this$options$onSubmi3.call(_this$options3, this.state.values, this));
138
+ this.store.batch(() => {
139
+ this.store.setState(prev => ({
140
+ ...prev,
141
+ isSubmitted: true
142
+ }));
143
+ done();
144
+ });
145
+ } catch (err) {
146
+ done();
147
+ throw err;
148
+ }
149
+ });
150
+ _defineProperty(this, "getFieldValue", field => getBy(this.state.values, field));
151
+ _defineProperty(this, "getFieldMeta", field => {
152
+ return this.state.fieldMeta[field];
153
+ });
154
+ _defineProperty(this, "getFieldInfo", field => {
155
+ var _this$fieldInfo;
156
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
157
+ return (_this$fieldInfo = this.fieldInfo)[field] || (_this$fieldInfo[field] = {
158
+ instances: {}
159
+ });
160
+ });
161
+ _defineProperty(this, "setFieldMeta", (field, updater) => {
162
+ this.store.setState(prev => {
163
+ return {
164
+ ...prev,
165
+ fieldMeta: {
166
+ ...prev.fieldMeta,
167
+ [field]: functionalUpdate(updater, prev.fieldMeta[field])
168
+ }
169
+ };
170
+ });
171
+ });
172
+ _defineProperty(this, "setFieldValue", (field, updater, opts) => {
173
+ const touch = opts == null ? void 0 : opts.touch;
174
+ this.store.batch(() => {
175
+ if (touch) {
176
+ this.setFieldMeta(field, prev => ({
177
+ ...prev,
178
+ isTouched: true
179
+ }));
180
+ }
181
+ this.store.setState(prev => {
182
+ return {
183
+ ...prev,
184
+ values: setBy(prev.values, field, updater)
185
+ };
186
+ });
187
+ });
188
+ });
189
+ _defineProperty(this, "pushFieldValue", (field, value, opts) => {
190
+ return this.setFieldValue(field, prev => [...(Array.isArray(prev) ? prev : []), value], opts);
191
+ });
192
+ _defineProperty(this, "insertFieldValue", (field, index, value, opts) => {
193
+ this.setFieldValue(field, prev => {
194
+ return prev.map((d, i) => i === index ? value : d);
195
+ }, opts);
196
+ });
197
+ _defineProperty(this, "removeFieldValue", (field, index, opts) => {
198
+ this.setFieldValue(field, prev => {
199
+ return prev.filter((_d, i) => i !== index);
200
+ }, opts);
201
+ });
202
+ _defineProperty(this, "swapFieldValues", (field, index1, index2) => {
203
+ this.setFieldValue(field, prev => {
204
+ const prev1 = prev[index1];
205
+ const prev2 = prev[index2];
206
+ return setBy(setBy(prev, "" + index1, prev2), "" + index2, prev1);
207
+ });
208
+ });
209
+ this.store = new Store(getDefaultFormState({
210
+ ...(_opts == null ? void 0 : _opts.defaultState),
211
+ values: (_opts$defaultValues = _opts == null ? void 0 : _opts.defaultValues) != null ? _opts$defaultValues : _opts == null ? void 0 : (_opts$defaultState = _opts.defaultState) == null ? void 0 : _opts$defaultState.values,
212
+ isFormValid: true
213
+ }), {
214
+ onUpdate: () => {
215
+ let {
216
+ state
217
+ } = this.store;
218
+ // Computed state
219
+ const fieldMetaValues = Object.values(state.fieldMeta);
220
+ const isFieldsValidating = fieldMetaValues.some(field => field == null ? void 0 : field.isValidating);
221
+ const isFieldsValid = !fieldMetaValues.some(field => field == null ? void 0 : field.error);
222
+ const isTouched = fieldMetaValues.some(field => field == null ? void 0 : field.isTouched);
223
+ const isValidating = isFieldsValidating || state.isFormValidating;
224
+ const isFormValid = !state.formError;
225
+ const isValid = isFieldsValid && isFormValid;
226
+ const canSubmit = state.submissionAttempts === 0 && !isTouched || !isValidating && !state.isSubmitting && isValid;
227
+ state = {
228
+ ...state,
229
+ isFieldsValidating,
230
+ isFieldsValid,
231
+ isFormValid,
232
+ isValid,
233
+ canSubmit,
234
+ isTouched
235
+ };
236
+ this.store.state = state;
237
+ this.state = state;
238
+ }
239
+ });
240
+ this.state = this.store.state;
241
+ this.update(_opts || {});
242
+ }
243
+ }
244
+
245
+ export { FormApi };
246
+ //# sourceMappingURL=FormApi.js.map