@tanstack/form-core 0.1.3 → 0.2.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 (107) hide show
  1. package/build/legacy/FieldApi.cjs +256 -0
  2. package/build/legacy/FieldApi.cjs.map +1 -0
  3. package/build/legacy/FieldApi.d.cts +3 -0
  4. package/build/legacy/FieldApi.d.ts +3 -0
  5. package/build/legacy/FieldApi.js +223 -0
  6. package/build/legacy/FieldApi.js.map +1 -0
  7. package/build/legacy/FormApi.cjs +255 -0
  8. package/build/legacy/FormApi.cjs.map +1 -0
  9. package/build/legacy/FormApi.d.cts +3 -0
  10. package/build/legacy/FormApi.d.ts +3 -0
  11. package/build/legacy/FormApi.js +232 -0
  12. package/build/legacy/FormApi.js.map +1 -0
  13. package/build/legacy/chunk-4QZDOMDG.js +19 -0
  14. package/build/legacy/chunk-4QZDOMDG.js.map +1 -0
  15. package/build/legacy/index.cjs +29 -0
  16. package/build/legacy/index.cjs.map +1 -0
  17. package/build/legacy/index.d.cts +171 -0
  18. package/build/legacy/index.d.ts +171 -0
  19. package/build/legacy/index.js +5 -0
  20. package/build/legacy/index.js.map +1 -0
  21. package/build/legacy/utils.cjs +98 -0
  22. package/build/legacy/utils.cjs.map +1 -0
  23. package/build/legacy/utils.d.cts +32 -0
  24. package/build/legacy/utils.d.ts +32 -0
  25. package/build/legacy/utils.js +73 -0
  26. package/build/legacy/utils.js.map +1 -0
  27. package/build/modern/FieldApi.cjs +238 -0
  28. package/build/modern/FieldApi.cjs.map +1 -0
  29. package/build/modern/FieldApi.d.cts +3 -0
  30. package/build/modern/FieldApi.d.ts +3 -0
  31. package/build/modern/FieldApi.js +213 -0
  32. package/build/modern/FieldApi.js.map +1 -0
  33. package/build/modern/FormApi.cjs +249 -0
  34. package/build/modern/FormApi.cjs.map +1 -0
  35. package/build/modern/FormApi.d.cts +3 -0
  36. package/build/modern/FormApi.d.ts +3 -0
  37. package/build/modern/FormApi.js +224 -0
  38. package/build/modern/FormApi.js.map +1 -0
  39. package/build/modern/index.cjs +29 -0
  40. package/build/modern/index.cjs.map +1 -0
  41. package/build/modern/index.d.cts +171 -0
  42. package/build/modern/index.d.ts +171 -0
  43. package/build/modern/index.js +5 -0
  44. package/build/modern/index.js.map +1 -0
  45. package/build/modern/utils.cjs +98 -0
  46. package/build/modern/utils.cjs.map +1 -0
  47. package/build/modern/utils.d.cts +32 -0
  48. package/build/modern/utils.d.ts +32 -0
  49. package/build/modern/utils.js +71 -0
  50. package/build/modern/utils.js.map +1 -0
  51. package/package.json +23 -12
  52. package/build/lib/FieldApi.cjs +0 -293
  53. package/build/lib/FieldApi.cjs.map +0 -1
  54. package/build/lib/FieldApi.d.ts +0 -95
  55. package/build/lib/FieldApi.d.ts.map +0 -1
  56. package/build/lib/FieldApi.js +0 -291
  57. package/build/lib/FieldApi.js.map +0 -1
  58. package/build/lib/FieldApi.legacy.cjs +0 -293
  59. package/build/lib/FieldApi.legacy.cjs.map +0 -1
  60. package/build/lib/FieldApi.legacy.js +0 -291
  61. package/build/lib/FieldApi.legacy.js.map +0 -1
  62. package/build/lib/FormApi.cjs +0 -239
  63. package/build/lib/FormApi.cjs.map +0 -1
  64. package/build/lib/FormApi.d.ts +0 -78
  65. package/build/lib/FormApi.d.ts.map +0 -1
  66. package/build/lib/FormApi.js +0 -237
  67. package/build/lib/FormApi.js.map +0 -1
  68. package/build/lib/FormApi.legacy.cjs +0 -239
  69. package/build/lib/FormApi.legacy.cjs.map +0 -1
  70. package/build/lib/FormApi.legacy.js +0 -237
  71. package/build/lib/FormApi.legacy.js.map +0 -1
  72. package/build/lib/_virtual/_rollupPluginBabelHelpers.cjs +0 -65
  73. package/build/lib/_virtual/_rollupPluginBabelHelpers.cjs.map +0 -1
  74. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +0 -56
  75. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  76. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.cjs +0 -65
  77. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.cjs.map +0 -1
  78. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.js +0 -56
  79. package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.js.map +0 -1
  80. package/build/lib/index.cjs +0 -14
  81. package/build/lib/index.cjs.map +0 -1
  82. package/build/lib/index.d.ts +0 -4
  83. package/build/lib/index.d.ts.map +0 -1
  84. package/build/lib/index.js +0 -4
  85. package/build/lib/index.js.map +0 -1
  86. package/build/lib/index.legacy.cjs +0 -14
  87. package/build/lib/index.legacy.cjs.map +0 -1
  88. package/build/lib/index.legacy.js +0 -4
  89. package/build/lib/index.legacy.js.map +0 -1
  90. package/build/lib/tests/FieldApi.spec.d.ts +0 -2
  91. package/build/lib/tests/FieldApi.spec.d.ts.map +0 -1
  92. package/build/lib/tests/FieldApi.test-d.d.ts +0 -2
  93. package/build/lib/tests/FieldApi.test-d.d.ts.map +0 -1
  94. package/build/lib/tests/FormApi.spec.d.ts +0 -2
  95. package/build/lib/tests/FormApi.spec.d.ts.map +0 -1
  96. package/build/lib/tests/utils.d.ts +0 -2
  97. package/build/lib/tests/utils.d.ts.map +0 -1
  98. package/build/lib/utils.cjs +0 -81
  99. package/build/lib/utils.cjs.map +0 -1
  100. package/build/lib/utils.d.ts +0 -32
  101. package/build/lib/utils.d.ts.map +0 -1
  102. package/build/lib/utils.js +0 -77
  103. package/build/lib/utils.js.map +0 -1
  104. package/build/lib/utils.legacy.cjs +0 -81
  105. package/build/lib/utils.legacy.cjs.map +0 -1
  106. package/build/lib/utils.legacy.js +0 -77
  107. package/build/lib/utils.legacy.js.map +0 -1
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/FormApi.ts
21
+ var FormApi_exports = {};
22
+ __export(FormApi_exports, {
23
+ FormApi: () => FormApi
24
+ });
25
+ module.exports = __toCommonJS(FormApi_exports);
26
+ var import_store = require("@tanstack/store");
27
+ var import_utils = require("./utils.cjs");
28
+ function getDefaultFormState(defaultState) {
29
+ return {
30
+ values: defaultState.values ?? {},
31
+ fieldMeta: defaultState.fieldMeta ?? {},
32
+ canSubmit: defaultState.canSubmit ?? true,
33
+ isFieldsValid: defaultState.isFieldsValid ?? false,
34
+ isFieldsValidating: defaultState.isFieldsValidating ?? false,
35
+ isFormValid: defaultState.isFormValid ?? false,
36
+ isFormValidating: defaultState.isFormValidating ?? false,
37
+ isSubmitted: defaultState.isSubmitted ?? false,
38
+ isSubmitting: defaultState.isSubmitting ?? false,
39
+ isTouched: defaultState.isTouched ?? false,
40
+ isValid: defaultState.isValid ?? false,
41
+ isValidating: defaultState.isValidating ?? false,
42
+ submissionAttempts: defaultState.submissionAttempts ?? 0,
43
+ formValidationCount: defaultState.formValidationCount ?? 0
44
+ };
45
+ }
46
+ var FormApi = class {
47
+ constructor(opts) {
48
+ // // This carries the context for nested fields
49
+ this.options = {};
50
+ this.fieldInfo = {};
51
+ this.validationMeta = {};
52
+ this.update = (options) => {
53
+ if (!options)
54
+ return;
55
+ this.store.batch(() => {
56
+ const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues && !this.state.isTouched;
57
+ const shouldUpdateState = options.defaultState !== this.options.defaultState && !this.state.isTouched;
58
+ this.store.setState(
59
+ () => getDefaultFormState(
60
+ Object.assign(
61
+ {},
62
+ this.state,
63
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
64
+ shouldUpdateState ? options.defaultState : {},
65
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
66
+ shouldUpdateValues ? {
67
+ values: options.defaultValues
68
+ } : {}
69
+ )
70
+ )
71
+ );
72
+ });
73
+ this.options = options;
74
+ };
75
+ this.reset = () => this.store.setState(
76
+ () => {
77
+ var _a;
78
+ return getDefaultFormState({
79
+ ...this.options.defaultState,
80
+ values: this.options.defaultValues ?? ((_a = this.options.defaultState) == null ? void 0 : _a.values)
81
+ });
82
+ }
83
+ );
84
+ this.validateAllFields = async (cause) => {
85
+ const fieldValidationPromises = [];
86
+ this.store.batch(() => {
87
+ void Object.values(this.fieldInfo).forEach(
88
+ (field) => {
89
+ Object.values(field.instances).forEach((instance) => {
90
+ if (!instance.state.meta.isTouched) {
91
+ instance.setMeta((prev) => ({ ...prev, isTouched: true }));
92
+ fieldValidationPromises.push(
93
+ Promise.resolve().then(() => instance.validate(cause))
94
+ );
95
+ }
96
+ });
97
+ }
98
+ );
99
+ });
100
+ return Promise.all(fieldValidationPromises);
101
+ };
102
+ this.handleSubmit = async () => {
103
+ var _a, _b, _c, _d, _e, _f;
104
+ this.store.setState((old) => ({
105
+ ...old,
106
+ // Submission attempts mark the form as not submitted
107
+ isSubmitted: false,
108
+ // Count submission attempts
109
+ submissionAttempts: old.submissionAttempts + 1
110
+ }));
111
+ if (!this.state.canSubmit)
112
+ return;
113
+ this.store.setState((d) => ({ ...d, isSubmitting: true }));
114
+ const done = () => {
115
+ this.store.setState((prev) => ({ ...prev, isSubmitting: false }));
116
+ };
117
+ await this.validateAllFields("submit");
118
+ if (!this.state.isFieldsValid) {
119
+ done();
120
+ (_b = (_a = this.options).onSubmitInvalid) == null ? void 0 : _b.call(_a, this.state.values, this);
121
+ return;
122
+ }
123
+ if (!this.state.isValid) {
124
+ done();
125
+ (_d = (_c = this.options).onSubmitInvalid) == null ? void 0 : _d.call(_c, this.state.values, this);
126
+ return;
127
+ }
128
+ try {
129
+ await ((_f = (_e = this.options).onSubmit) == null ? void 0 : _f.call(_e, this.state.values, this));
130
+ this.store.batch(() => {
131
+ this.store.setState((prev) => ({ ...prev, isSubmitted: true }));
132
+ done();
133
+ });
134
+ } catch (err) {
135
+ done();
136
+ throw err;
137
+ }
138
+ };
139
+ this.getFieldValue = (field) => (0, import_utils.getBy)(this.state.values, field);
140
+ this.getFieldMeta = (field) => {
141
+ return this.state.fieldMeta[field];
142
+ };
143
+ this.getFieldInfo = (field) => {
144
+ var _a;
145
+ return (_a = this.fieldInfo)[field] || (_a[field] = {
146
+ instances: {}
147
+ });
148
+ };
149
+ this.setFieldMeta = (field, updater) => {
150
+ this.store.setState((prev) => {
151
+ return {
152
+ ...prev,
153
+ fieldMeta: {
154
+ ...prev.fieldMeta,
155
+ [field]: (0, import_utils.functionalUpdate)(updater, prev.fieldMeta[field])
156
+ }
157
+ };
158
+ });
159
+ };
160
+ this.setFieldValue = (field, updater, opts) => {
161
+ const touch = opts == null ? void 0 : opts.touch;
162
+ this.store.batch(() => {
163
+ if (touch) {
164
+ this.setFieldMeta(field, (prev) => ({
165
+ ...prev,
166
+ isTouched: true
167
+ }));
168
+ }
169
+ this.store.setState((prev) => {
170
+ return {
171
+ ...prev,
172
+ values: (0, import_utils.setBy)(prev.values, field, updater)
173
+ };
174
+ });
175
+ });
176
+ };
177
+ this.pushFieldValue = (field, value, opts) => {
178
+ return this.setFieldValue(
179
+ field,
180
+ (prev) => [...Array.isArray(prev) ? prev : [], value],
181
+ opts
182
+ );
183
+ };
184
+ this.insertFieldValue = (field, index, value, opts) => {
185
+ this.setFieldValue(
186
+ field,
187
+ (prev) => {
188
+ return prev.map(
189
+ (d, i) => i === index ? value : d
190
+ );
191
+ },
192
+ opts
193
+ );
194
+ };
195
+ this.removeFieldValue = (field, index, opts) => {
196
+ this.setFieldValue(
197
+ field,
198
+ (prev) => {
199
+ return prev.filter(
200
+ (_d, i) => i !== index
201
+ );
202
+ },
203
+ opts
204
+ );
205
+ };
206
+ this.swapFieldValues = (field, index1, index2) => {
207
+ this.setFieldValue(field, (prev) => {
208
+ const prev1 = prev[index1];
209
+ const prev2 = prev[index2];
210
+ return (0, import_utils.setBy)((0, import_utils.setBy)(prev, `${index1}`, prev2), `${index2}`, prev1);
211
+ });
212
+ };
213
+ var _a;
214
+ this.store = new import_store.Store(
215
+ getDefaultFormState({
216
+ ...opts == null ? void 0 : opts.defaultState,
217
+ values: (opts == null ? void 0 : opts.defaultValues) ?? ((_a = opts == null ? void 0 : opts.defaultState) == null ? void 0 : _a.values),
218
+ isFormValid: true
219
+ }),
220
+ {
221
+ onUpdate: () => {
222
+ let { state } = this.store;
223
+ const fieldMetaValues = Object.values(state.fieldMeta);
224
+ const isFieldsValidating = fieldMetaValues.some(
225
+ (field) => field == null ? void 0 : field.isValidating
226
+ );
227
+ const isFieldsValid = !fieldMetaValues.some((field) => field == null ? void 0 : field.error);
228
+ const isTouched = fieldMetaValues.some((field) => field == null ? void 0 : field.isTouched);
229
+ const isValidating = isFieldsValidating || state.isFormValidating;
230
+ const isFormValid = !state.formError;
231
+ const isValid = isFieldsValid && isFormValid;
232
+ const canSubmit = state.submissionAttempts === 0 && !isTouched || !isValidating && !state.isSubmitting && isValid;
233
+ state = {
234
+ ...state,
235
+ isFieldsValidating,
236
+ isFieldsValid,
237
+ isFormValid,
238
+ isValid,
239
+ canSubmit,
240
+ isTouched
241
+ };
242
+ this.store.state = state;
243
+ this.state = state;
244
+ }
245
+ }
246
+ );
247
+ this.state = this.store.state;
248
+ this.update(opts || {});
249
+ }
250
+ };
251
+ // Annotate the CommonJS export names for ESM import in node:
252
+ 0 && (module.exports = {
253
+ FormApi
254
+ });
255
+ //# sourceMappingURL=FormApi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"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 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: defaultState.values ?? ({} as never),\n fieldMeta: defaultState.fieldMeta ?? ({} as never),\n canSubmit: defaultState.canSubmit ?? true,\n isFieldsValid: defaultState.isFieldsValid ?? false,\n isFieldsValidating: defaultState.isFieldsValidating ?? false,\n isFormValid: defaultState.isFormValid ?? false,\n isFormValidating: defaultState.isFormValidating ?? false,\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isTouched: defaultState.isTouched ?? false,\n isValid: defaultState.isValid ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n formValidationCount: defaultState.formValidationCount ?? 0,\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 !this.state.isTouched\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState &&\n !this.state.isTouched\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state,\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 handleSubmit = async () => {\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 // Submission 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 | undefined => {\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"],"mappings":"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","names":[]}
@@ -0,0 +1,3 @@
1
+ import '@tanstack/store';
2
+ import './utils.cjs';
3
+ export { FieldInfo, FormApi, FormOptions, FormState, ValidationError, ValidationMeta } from './index.cjs';
@@ -0,0 +1,3 @@
1
+ import '@tanstack/store';
2
+ import './utils.js';
3
+ export { FieldInfo, FormApi, FormOptions, FormState, ValidationError, ValidationMeta } from './index.js';
@@ -0,0 +1,232 @@
1
+ import "./chunk-4QZDOMDG.js";
2
+
3
+ // src/FormApi.ts
4
+ import { Store } from "@tanstack/store";
5
+ import { functionalUpdate, getBy, setBy } from "./utils.js";
6
+ function getDefaultFormState(defaultState) {
7
+ return {
8
+ values: defaultState.values ?? {},
9
+ fieldMeta: defaultState.fieldMeta ?? {},
10
+ canSubmit: defaultState.canSubmit ?? true,
11
+ isFieldsValid: defaultState.isFieldsValid ?? false,
12
+ isFieldsValidating: defaultState.isFieldsValidating ?? false,
13
+ isFormValid: defaultState.isFormValid ?? false,
14
+ isFormValidating: defaultState.isFormValidating ?? false,
15
+ isSubmitted: defaultState.isSubmitted ?? false,
16
+ isSubmitting: defaultState.isSubmitting ?? false,
17
+ isTouched: defaultState.isTouched ?? false,
18
+ isValid: defaultState.isValid ?? false,
19
+ isValidating: defaultState.isValidating ?? false,
20
+ submissionAttempts: defaultState.submissionAttempts ?? 0,
21
+ formValidationCount: defaultState.formValidationCount ?? 0
22
+ };
23
+ }
24
+ var FormApi = class {
25
+ constructor(opts) {
26
+ // // This carries the context for nested fields
27
+ this.options = {};
28
+ this.fieldInfo = {};
29
+ this.validationMeta = {};
30
+ this.update = (options) => {
31
+ if (!options)
32
+ return;
33
+ this.store.batch(() => {
34
+ const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues && !this.state.isTouched;
35
+ const shouldUpdateState = options.defaultState !== this.options.defaultState && !this.state.isTouched;
36
+ this.store.setState(
37
+ () => getDefaultFormState(
38
+ Object.assign(
39
+ {},
40
+ this.state,
41
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
42
+ shouldUpdateState ? options.defaultState : {},
43
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
44
+ shouldUpdateValues ? {
45
+ values: options.defaultValues
46
+ } : {}
47
+ )
48
+ )
49
+ );
50
+ });
51
+ this.options = options;
52
+ };
53
+ this.reset = () => this.store.setState(
54
+ () => {
55
+ var _a;
56
+ return getDefaultFormState({
57
+ ...this.options.defaultState,
58
+ values: this.options.defaultValues ?? ((_a = this.options.defaultState) == null ? void 0 : _a.values)
59
+ });
60
+ }
61
+ );
62
+ this.validateAllFields = async (cause) => {
63
+ const fieldValidationPromises = [];
64
+ this.store.batch(() => {
65
+ void Object.values(this.fieldInfo).forEach(
66
+ (field) => {
67
+ Object.values(field.instances).forEach((instance) => {
68
+ if (!instance.state.meta.isTouched) {
69
+ instance.setMeta((prev) => ({ ...prev, isTouched: true }));
70
+ fieldValidationPromises.push(
71
+ Promise.resolve().then(() => instance.validate(cause))
72
+ );
73
+ }
74
+ });
75
+ }
76
+ );
77
+ });
78
+ return Promise.all(fieldValidationPromises);
79
+ };
80
+ this.handleSubmit = async () => {
81
+ var _a, _b, _c, _d, _e, _f;
82
+ this.store.setState((old) => ({
83
+ ...old,
84
+ // Submission attempts mark the form as not submitted
85
+ isSubmitted: false,
86
+ // Count submission attempts
87
+ submissionAttempts: old.submissionAttempts + 1
88
+ }));
89
+ if (!this.state.canSubmit)
90
+ return;
91
+ this.store.setState((d) => ({ ...d, isSubmitting: true }));
92
+ const done = () => {
93
+ this.store.setState((prev) => ({ ...prev, isSubmitting: false }));
94
+ };
95
+ await this.validateAllFields("submit");
96
+ if (!this.state.isFieldsValid) {
97
+ done();
98
+ (_b = (_a = this.options).onSubmitInvalid) == null ? void 0 : _b.call(_a, this.state.values, this);
99
+ return;
100
+ }
101
+ if (!this.state.isValid) {
102
+ done();
103
+ (_d = (_c = this.options).onSubmitInvalid) == null ? void 0 : _d.call(_c, this.state.values, this);
104
+ return;
105
+ }
106
+ try {
107
+ await ((_f = (_e = this.options).onSubmit) == null ? void 0 : _f.call(_e, this.state.values, this));
108
+ this.store.batch(() => {
109
+ this.store.setState((prev) => ({ ...prev, isSubmitted: true }));
110
+ done();
111
+ });
112
+ } catch (err) {
113
+ done();
114
+ throw err;
115
+ }
116
+ };
117
+ this.getFieldValue = (field) => getBy(this.state.values, field);
118
+ this.getFieldMeta = (field) => {
119
+ return this.state.fieldMeta[field];
120
+ };
121
+ this.getFieldInfo = (field) => {
122
+ var _a;
123
+ return (_a = this.fieldInfo)[field] || (_a[field] = {
124
+ instances: {}
125
+ });
126
+ };
127
+ this.setFieldMeta = (field, updater) => {
128
+ this.store.setState((prev) => {
129
+ return {
130
+ ...prev,
131
+ fieldMeta: {
132
+ ...prev.fieldMeta,
133
+ [field]: functionalUpdate(updater, prev.fieldMeta[field])
134
+ }
135
+ };
136
+ });
137
+ };
138
+ this.setFieldValue = (field, updater, opts) => {
139
+ const touch = opts == null ? void 0 : opts.touch;
140
+ this.store.batch(() => {
141
+ if (touch) {
142
+ this.setFieldMeta(field, (prev) => ({
143
+ ...prev,
144
+ isTouched: true
145
+ }));
146
+ }
147
+ this.store.setState((prev) => {
148
+ return {
149
+ ...prev,
150
+ values: setBy(prev.values, field, updater)
151
+ };
152
+ });
153
+ });
154
+ };
155
+ this.pushFieldValue = (field, value, opts) => {
156
+ return this.setFieldValue(
157
+ field,
158
+ (prev) => [...Array.isArray(prev) ? prev : [], value],
159
+ opts
160
+ );
161
+ };
162
+ this.insertFieldValue = (field, index, value, opts) => {
163
+ this.setFieldValue(
164
+ field,
165
+ (prev) => {
166
+ return prev.map(
167
+ (d, i) => i === index ? value : d
168
+ );
169
+ },
170
+ opts
171
+ );
172
+ };
173
+ this.removeFieldValue = (field, index, opts) => {
174
+ this.setFieldValue(
175
+ field,
176
+ (prev) => {
177
+ return prev.filter(
178
+ (_d, i) => i !== index
179
+ );
180
+ },
181
+ opts
182
+ );
183
+ };
184
+ this.swapFieldValues = (field, index1, index2) => {
185
+ this.setFieldValue(field, (prev) => {
186
+ const prev1 = prev[index1];
187
+ const prev2 = prev[index2];
188
+ return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1);
189
+ });
190
+ };
191
+ var _a;
192
+ this.store = new Store(
193
+ getDefaultFormState({
194
+ ...opts == null ? void 0 : opts.defaultState,
195
+ values: (opts == null ? void 0 : opts.defaultValues) ?? ((_a = opts == null ? void 0 : opts.defaultState) == null ? void 0 : _a.values),
196
+ isFormValid: true
197
+ }),
198
+ {
199
+ onUpdate: () => {
200
+ let { state } = this.store;
201
+ const fieldMetaValues = Object.values(state.fieldMeta);
202
+ const isFieldsValidating = fieldMetaValues.some(
203
+ (field) => field == null ? void 0 : field.isValidating
204
+ );
205
+ const isFieldsValid = !fieldMetaValues.some((field) => field == null ? void 0 : field.error);
206
+ const isTouched = fieldMetaValues.some((field) => field == null ? void 0 : field.isTouched);
207
+ const isValidating = isFieldsValidating || state.isFormValidating;
208
+ const isFormValid = !state.formError;
209
+ const isValid = isFieldsValid && isFormValid;
210
+ const canSubmit = state.submissionAttempts === 0 && !isTouched || !isValidating && !state.isSubmitting && isValid;
211
+ state = {
212
+ ...state,
213
+ isFieldsValidating,
214
+ isFieldsValid,
215
+ isFormValid,
216
+ isValid,
217
+ canSubmit,
218
+ isTouched
219
+ };
220
+ this.store.state = state;
221
+ this.state = state;
222
+ }
223
+ }
224
+ );
225
+ this.state = this.store.state;
226
+ this.update(opts || {});
227
+ }
228
+ };
229
+ export {
230
+ FormApi
231
+ };
232
+ //# sourceMappingURL=FormApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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 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: defaultState.values ?? ({} as never),\n fieldMeta: defaultState.fieldMeta ?? ({} as never),\n canSubmit: defaultState.canSubmit ?? true,\n isFieldsValid: defaultState.isFieldsValid ?? false,\n isFieldsValidating: defaultState.isFieldsValidating ?? false,\n isFormValid: defaultState.isFormValid ?? false,\n isFormValidating: defaultState.isFormValidating ?? false,\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isTouched: defaultState.isTouched ?? false,\n isValid: defaultState.isValid ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n formValidationCount: defaultState.formValidationCount ?? 0,\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 !this.state.isTouched\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState &&\n !this.state.isTouched\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state,\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 handleSubmit = async () => {\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 // Submission 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 | undefined => {\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"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ var __accessCheck = (obj, member, msg) => {
2
+ if (!member.has(obj))
3
+ throw TypeError("Cannot " + msg);
4
+ };
5
+ var __privateGet = (obj, member, getter) => {
6
+ __accessCheck(obj, member, "read from private field");
7
+ return getter ? getter.call(obj) : member.get(obj);
8
+ };
9
+ var __privateAdd = (obj, member, value) => {
10
+ if (member.has(obj))
11
+ throw TypeError("Cannot add the same private member more than once");
12
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
13
+ };
14
+
15
+ export {
16
+ __privateGet,
17
+ __privateAdd
18
+ };
19
+ //# sourceMappingURL=chunk-4QZDOMDG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+
17
+ // src/index.ts
18
+ var src_exports = {};
19
+ module.exports = __toCommonJS(src_exports);
20
+ __reExport(src_exports, require("./FormApi.cjs"), module.exports);
21
+ __reExport(src_exports, require("./FieldApi.cjs"), module.exports);
22
+ __reExport(src_exports, require("./utils.cjs"), module.exports);
23
+ // Annotate the CommonJS export names for ESM import in node:
24
+ 0 && (module.exports = {
25
+ ...require("./FormApi.cjs"),
26
+ ...require("./FieldApi.cjs"),
27
+ ...require("./utils.cjs")
28
+ });
29
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from './FormApi'\nexport * from './FieldApi'\nexport * from './utils'\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wBAAc,0BAAd;AACA,wBAAc,2BADd;AAEA,wBAAc,wBAFd;","names":[]}