remix-validated-form 4.6.5 → 4.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/README.md +10 -9
  2. package/dist/index.cjs.js +1928 -0
  3. package/dist/index.cjs.js.map +1 -0
  4. package/dist/index.d.ts +337 -0
  5. package/dist/{remix-validated-form.es.js → index.esm.js} +573 -877
  6. package/dist/index.esm.js.map +1 -0
  7. package/package.json +12 -10
  8. package/src/ValidatedForm.tsx +17 -5
  9. package/src/hooks.ts +1 -1
  10. package/src/server.ts +1 -1
  11. package/tsup.config.ts +3 -0
  12. package/dist/remix-validated-form.cjs.js +0 -27
  13. package/dist/remix-validated-form.cjs.js.map +0 -1
  14. package/dist/remix-validated-form.es.js.map +0 -1
  15. package/dist/remix-validated-form.umd.js +0 -27
  16. package/dist/remix-validated-form.umd.js.map +0 -1
  17. package/dist/types/ValidatedForm.d.ts +0 -50
  18. package/dist/types/hooks.d.ts +0 -67
  19. package/dist/types/index.d.ts +0 -7
  20. package/dist/types/internal/MultiValueMap.d.ts +0 -11
  21. package/dist/types/internal/constants.d.ts +0 -3
  22. package/dist/types/internal/flatten.d.ts +0 -1
  23. package/dist/types/internal/formContext.d.ts +0 -12
  24. package/dist/types/internal/getInputProps.d.ts +0 -29
  25. package/dist/types/internal/hooks.d.ts +0 -35
  26. package/dist/types/internal/hydratable.d.ts +0 -14
  27. package/dist/types/internal/logic/getCheckboxChecked.d.ts +0 -1
  28. package/dist/types/internal/logic/getRadioChecked.d.ts +0 -1
  29. package/dist/types/internal/logic/requestSubmit.d.ts +0 -5
  30. package/dist/types/internal/state/arrayUtil.d.ts +0 -12
  31. package/dist/types/internal/state/controlledFields.d.ts +0 -7
  32. package/dist/types/internal/state/createFormStore.d.ts +0 -79
  33. package/dist/types/internal/state/fieldArray.d.ts +0 -28
  34. package/dist/types/internal/state/storeHooks.d.ts +0 -3
  35. package/dist/types/internal/state/types.d.ts +0 -1
  36. package/dist/types/internal/submissionCallbacks.d.ts +0 -1
  37. package/dist/types/internal/util.d.ts +0 -5
  38. package/dist/types/server.d.ts +0 -21
  39. package/dist/types/unreleased/formStateHooks.d.ts +0 -64
  40. package/dist/types/userFacingFormContext.d.ts +0 -85
  41. package/dist/types/validation/createValidator.d.ts +0 -7
  42. package/dist/types/validation/types.d.ts +0 -58
  43. package/vite.config.ts +0 -7
@@ -1,177 +1,11 @@
1
- import React, { createContext, useDebugValue, useContext, useCallback, useEffect, useMemo, useRef, useLayoutEffect, useState } from "react";
2
- import { useActionData, useMatches, useTransition, Form, useSubmit } from "@remix-run/react";
3
- var __spreadArray = globalThis && globalThis.__spreadArray || function(to, from2, pack) {
4
- if (pack || arguments.length === 2)
5
- for (var i2 = 0, l2 = from2.length, ar; i2 < l2; i2++) {
6
- if (ar || !(i2 in from2)) {
7
- if (!ar)
8
- ar = Array.prototype.slice.call(from2, 0, i2);
9
- ar[i2] = from2[i2];
10
- }
11
- }
12
- return to.concat(ar || Array.prototype.slice.call(from2));
13
- };
14
- function purry(fn2, args, lazy) {
15
- var diff = fn2.length - args.length;
16
- var arrayArgs = Array.from(args);
17
- if (diff === 0) {
18
- return fn2.apply(void 0, arrayArgs);
19
- }
20
- if (diff === 1) {
21
- var ret = function(data) {
22
- return fn2.apply(void 0, __spreadArray([data], arrayArgs, false));
23
- };
24
- if (lazy || fn2.lazy) {
25
- ret.lazy = lazy || fn2.lazy;
26
- ret.lazyArgs = args;
27
- }
28
- return ret;
29
- }
30
- throw new Error("Wrong number of arguments");
31
- }
32
- function _reduceLazy(array, lazy, indexed) {
33
- return array.reduce(function(acc, item, index) {
34
- var result = indexed ? lazy(item, index, array) : lazy(item);
35
- if (result.hasMany === true) {
36
- acc.push.apply(acc, result.next);
37
- } else if (result.hasNext === true) {
38
- acc.push(result.next);
39
- }
40
- return acc;
41
- }, []);
42
- }
43
- var isArray = Array.isArray;
44
- var keyList = Object.keys;
45
- var hasProp = Object.prototype.hasOwnProperty;
46
- function equals() {
47
- return purry(_equals, arguments);
48
- }
49
- function _equals(a2, b2) {
50
- if (a2 === b2) {
51
- return true;
52
- }
53
- if (a2 && b2 && typeof a2 === "object" && typeof b2 === "object") {
54
- var arrA = isArray(a2);
55
- var arrB = isArray(b2);
56
- var i2 = void 0;
57
- var length = void 0;
58
- var key = void 0;
59
- if (arrA && arrB) {
60
- length = a2.length;
61
- if (length !== b2.length) {
62
- return false;
63
- }
64
- for (i2 = length; i2-- !== 0; ) {
65
- if (!equals(a2[i2], b2[i2])) {
66
- return false;
67
- }
68
- }
69
- return true;
70
- }
71
- if (arrA !== arrB) {
72
- return false;
73
- }
74
- var dateA = a2 instanceof Date;
75
- var dateB = b2 instanceof Date;
76
- if (dateA !== dateB) {
77
- return false;
78
- }
79
- if (dateA && dateB) {
80
- return a2.getTime() === b2.getTime();
81
- }
82
- var regexpA = a2 instanceof RegExp;
83
- var regexpB = b2 instanceof RegExp;
84
- if (regexpA !== regexpB) {
85
- return false;
86
- }
87
- if (regexpA && regexpB) {
88
- return a2.toString() === b2.toString();
89
- }
90
- var keys = keyList(a2);
91
- length = keys.length;
92
- if (length !== keyList(b2).length) {
93
- return false;
94
- }
95
- for (i2 = length; i2-- !== 0; ) {
96
- if (!hasProp.call(b2, keys[i2])) {
97
- return false;
98
- }
99
- }
100
- for (i2 = length; i2-- !== 0; ) {
101
- key = keys[i2];
102
- if (!equals(a2[key], b2[key])) {
103
- return false;
104
- }
105
- }
106
- return true;
107
- }
108
- return a2 !== a2 && b2 !== b2;
109
- }
110
- function omit() {
111
- return purry(_omit, arguments);
112
- }
113
- function _omit(object, names) {
114
- var set = new Set(names);
115
- return Object.entries(object).reduce(function(acc, _a) {
116
- var name = _a[0], value = _a[1];
117
- if (!set.has(name)) {
118
- acc[name] = value;
119
- }
120
- return acc;
121
- }, {});
122
- }
123
- function omitBy() {
124
- return purry(_omitBy, arguments);
125
- }
126
- function _omitBy(object, fn2) {
127
- return Object.keys(object).reduce(function(acc, key) {
128
- if (!fn2(object[key], key)) {
129
- acc[key] = object[key];
130
- }
131
- return acc;
132
- }, {});
133
- }
134
- function pathOr() {
135
- return purry(_pathOr, arguments);
136
- }
137
- function _pathOr(object, path, defaultValue) {
138
- var current = object;
139
- for (var _i = 0, path_1 = path; _i < path_1.length; _i++) {
140
- var prop = path_1[_i];
141
- if (current == null || current[prop] == null) {
142
- return defaultValue;
143
- }
144
- current = current[prop];
145
- }
146
- return current;
147
- }
148
- function uniq() {
149
- return purry(_uniq, arguments, uniq.lazy);
150
- }
151
- function _uniq(array) {
152
- return _reduceLazy(array, uniq.lazy());
153
- }
154
- (function(uniq2) {
155
- function lazy() {
156
- var set = /* @__PURE__ */ new Set();
157
- return function(value) {
158
- if (set.has(value)) {
159
- return {
160
- done: false,
161
- hasNext: false
162
- };
163
- }
164
- set.add(value);
165
- return {
166
- done: false,
167
- hasNext: true,
168
- next: value
169
- };
170
- };
171
- }
172
- uniq2.lazy = lazy;
173
- })(uniq || (uniq = {}));
174
- const getCheckboxChecked = (checkboxValue = "on", newValue) => {
1
+ // src/hooks.ts
2
+ import { useEffect as useEffect2, useMemo } from "react";
3
+
4
+ // src/internal/getInputProps.ts
5
+ import * as R from "remeda";
6
+
7
+ // src/internal/logic/getCheckboxChecked.ts
8
+ var getCheckboxChecked = (checkboxValue = "on", newValue) => {
175
9
  if (Array.isArray(newValue))
176
10
  return newValue.some((val) => val === true || val === checkboxValue);
177
11
  if (typeof newValue === "boolean")
@@ -180,17 +14,31 @@ const getCheckboxChecked = (checkboxValue = "on", newValue) => {
180
14
  return newValue === checkboxValue;
181
15
  return void 0;
182
16
  };
183
- const getRadioChecked = (radioValue = "on", newValue) => {
17
+
18
+ // src/internal/logic/getRadioChecked.ts
19
+ var getRadioChecked = (radioValue = "on", newValue) => {
184
20
  if (typeof newValue === "string")
185
21
  return newValue === radioValue;
186
22
  return void 0;
187
23
  };
188
- const defaultValidationBehavior = {
24
+ if (void 0) {
25
+ const { it, expect } = void 0;
26
+ it("getRadioChecked", () => {
27
+ expect(getRadioChecked("on", "on")).toBe(true);
28
+ expect(getRadioChecked("on", void 0)).toBe(void 0);
29
+ expect(getRadioChecked("trueValue", void 0)).toBe(void 0);
30
+ expect(getRadioChecked("trueValue", "bob")).toBe(false);
31
+ expect(getRadioChecked("trueValue", "trueValue")).toBe(true);
32
+ });
33
+ }
34
+
35
+ // src/internal/getInputProps.ts
36
+ var defaultValidationBehavior = {
189
37
  initial: "onBlur",
190
38
  whenTouched: "onChange",
191
39
  whenSubmitted: "onChange"
192
40
  };
193
- const createGetInputProps = ({
41
+ var createGetInputProps = ({
194
42
  clearError,
195
43
  validate,
196
44
  defaultValue,
@@ -232,19 +80,27 @@ const createGetInputProps = ({
232
80
  } else if (props.value === void 0) {
233
81
  inputProps.defaultValue = defaultValue;
234
82
  }
235
- return omitBy(inputProps, (value) => value === void 0);
83
+ return R.omitBy(inputProps, (value) => value === void 0);
236
84
  };
237
85
  };
238
- const stringToPathArray = (path) => {
86
+
87
+ // src/internal/hooks.ts
88
+ import { useActionData, useMatches, useTransition } from "@remix-run/react";
89
+ import { useCallback, useContext } from "react";
90
+
91
+ // ../set-get/src/stringToPathArray.ts
92
+ var stringToPathArray = (path) => {
239
93
  if (path.length === 0)
240
94
  return [];
241
95
  const match = path.match(/^\[(.+?)\](.*)$/) || path.match(/^\.?([^\.\[\]]+)(.*)$/);
242
96
  if (match) {
243
- const [_2, key, rest] = match;
97
+ const [_, key, rest] = match;
244
98
  return [/^\d+$/.test(key) ? Number(key) : key, ...stringToPathArray(rest)];
245
99
  }
246
100
  return [path];
247
101
  };
102
+
103
+ // ../set-get/src/setPath.ts
248
104
  function setPath(object, path, defaultValue) {
249
105
  return _setPathNormalized(object, stringToPathArray(path), defaultValue);
250
106
  }
@@ -253,10 +109,10 @@ function _setPathNormalized(object, path, value) {
253
109
  const leadingSegments = path.slice(0, -1);
254
110
  const lastSegment = path[path.length - 1];
255
111
  let obj = object;
256
- for (let i2 = 0; i2 < leadingSegments.length; i2++) {
257
- const segment = leadingSegments[i2];
112
+ for (let i = 0; i < leadingSegments.length; i++) {
113
+ const segment = leadingSegments[i];
258
114
  if (obj[segment] === void 0) {
259
- const nextSegment = (_a = leadingSegments[i2 + 1]) != null ? _a : lastSegment;
115
+ const nextSegment = (_a = leadingSegments[i + 1]) != null ? _a : lastSegment;
260
116
  obj[segment] = typeof nextSegment === "number" ? [] : {};
261
117
  }
262
118
  obj = obj[segment];
@@ -264,546 +120,46 @@ function _setPathNormalized(object, path, value) {
264
120
  obj[lastSegment] = value;
265
121
  return object;
266
122
  }
267
- const getPath = (object, path) => pathOr(object, stringToPathArray(path), void 0);
268
- var isProduction = true;
269
- var prefix = "Invariant failed";
270
- function invariant(condition, message) {
271
- if (condition) {
272
- return;
273
- }
274
- if (isProduction) {
275
- throw new Error(prefix);
276
- }
277
- var provided = typeof message === "function" ? message() : message;
278
- var value = provided ? "".concat(prefix, ": ").concat(provided) : prefix;
279
- throw new Error(value);
280
- }
281
- const FORM_ID_FIELD = "__rvfInternalFormId";
282
- const FORM_DEFAULTS_FIELD = "__rvfInternalFormDefaults";
283
- const formDefaultValuesKey = (formId) => `${FORM_DEFAULTS_FIELD}_${formId}`;
284
- const InternalFormContext = createContext(null);
285
- const serverData = (data) => ({
123
+
124
+ // ../set-get/src/getPath.ts
125
+ import * as R2 from "remeda";
126
+ var getPath = (object, path) => R2.pathOr(object, stringToPathArray(path), void 0);
127
+
128
+ // src/internal/hooks.ts
129
+ import invariant3 from "tiny-invariant";
130
+
131
+ // src/internal/constants.ts
132
+ var FORM_ID_FIELD = "__rvfInternalFormId";
133
+ var FORM_DEFAULTS_FIELD = "__rvfInternalFormDefaults";
134
+ var formDefaultValuesKey = (formId) => `${FORM_DEFAULTS_FIELD}_${formId}`;
135
+
136
+ // src/internal/formContext.ts
137
+ import { createContext } from "react";
138
+ var InternalFormContext = createContext(null);
139
+
140
+ // src/internal/hydratable.ts
141
+ var serverData = (data) => ({
286
142
  hydrateTo: () => data,
287
- map: (fn2) => serverData(fn2(data))
143
+ map: (fn) => serverData(fn(data))
288
144
  });
289
- const hydratedData = () => ({
145
+ var hydratedData = () => ({
290
146
  hydrateTo: (hydratedData2) => hydratedData2,
291
147
  map: () => hydratedData()
292
148
  });
293
- const from = (data, hydrated) => hydrated ? hydratedData() : serverData(data);
294
- const hydratable = {
149
+ var from = (data, hydrated) => hydrated ? hydratedData() : serverData(data);
150
+ var hydratable = {
295
151
  serverData,
296
152
  hydratedData,
297
153
  from
298
154
  };
299
- const createStoreImpl = (createState) => {
300
- let state;
301
- const listeners = /* @__PURE__ */ new Set();
302
- const setState = (partial, replace2) => {
303
- const nextState = typeof partial === "function" ? partial(state) : partial;
304
- if (!Object.is(nextState, state)) {
305
- const previousState = state;
306
- state = (replace2 != null ? replace2 : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
307
- listeners.forEach((listener) => listener(state, previousState));
308
- }
309
- };
310
- const getState = () => state;
311
- const subscribe = (listener) => {
312
- listeners.add(listener);
313
- return () => listeners.delete(listener);
314
- };
315
- const destroy = () => listeners.clear();
316
- const api = { setState, getState, subscribe, destroy };
317
- state = createState(setState, getState, api);
318
- return api;
319
- };
320
- const createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
321
- var withSelector = { exports: {} };
322
- var withSelector_production_min = {};
323
- var shim = { exports: {} };
324
- var useSyncExternalStoreShim_production_min = {};
325
- /**
326
- * @license React
327
- * use-sync-external-store-shim.production.min.js
328
- *
329
- * Copyright (c) Facebook, Inc. and its affiliates.
330
- *
331
- * This source code is licensed under the MIT license found in the
332
- * LICENSE file in the root directory of this source tree.
333
- */
334
- var e = React;
335
- function h$2(a2, b2) {
336
- return a2 === b2 && (0 !== a2 || 1 / a2 === 1 / b2) || a2 !== a2 && b2 !== b2;
337
- }
338
- var k$1 = "function" === typeof Object.is ? Object.is : h$2, l$1 = e.useState, m = e.useEffect, n$2 = e.useLayoutEffect, p$2 = e.useDebugValue;
339
- function q$2(a2, b2) {
340
- var d2 = b2(), f2 = l$1({ inst: { value: d2, getSnapshot: b2 } }), c2 = f2[0].inst, g2 = f2[1];
341
- n$2(function() {
342
- c2.value = d2;
343
- c2.getSnapshot = b2;
344
- r$2(c2) && g2({ inst: c2 });
345
- }, [a2, d2, b2]);
346
- m(function() {
347
- r$2(c2) && g2({ inst: c2 });
348
- return a2(function() {
349
- r$2(c2) && g2({ inst: c2 });
350
- });
351
- }, [a2]);
352
- p$2(d2);
353
- return d2;
354
- }
355
- function r$2(a2) {
356
- var b2 = a2.getSnapshot;
357
- a2 = a2.value;
358
- try {
359
- var d2 = b2();
360
- return !k$1(a2, d2);
361
- } catch (f2) {
362
- return true;
363
- }
364
- }
365
- function t$2(a2, b2) {
366
- return b2();
367
- }
368
- var u$2 = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? t$2 : q$2;
369
- useSyncExternalStoreShim_production_min.useSyncExternalStore = void 0 !== e.useSyncExternalStore ? e.useSyncExternalStore : u$2;
370
- {
371
- shim.exports = useSyncExternalStoreShim_production_min;
372
- }
373
- /**
374
- * @license React
375
- * use-sync-external-store-shim/with-selector.production.min.js
376
- *
377
- * Copyright (c) Facebook, Inc. and its affiliates.
378
- *
379
- * This source code is licensed under the MIT license found in the
380
- * LICENSE file in the root directory of this source tree.
381
- */
382
- var h$1 = React, n$1 = shim.exports;
383
- function p$1(a2, b2) {
384
- return a2 === b2 && (0 !== a2 || 1 / a2 === 1 / b2) || a2 !== a2 && b2 !== b2;
385
- }
386
- var q$1 = "function" === typeof Object.is ? Object.is : p$1, r$1 = n$1.useSyncExternalStore, t$1 = h$1.useRef, u$1 = h$1.useEffect, v$1 = h$1.useMemo, w$1 = h$1.useDebugValue;
387
- withSelector_production_min.useSyncExternalStoreWithSelector = function(a2, b2, e2, l2, g2) {
388
- var c2 = t$1(null);
389
- if (null === c2.current) {
390
- var f2 = { hasValue: false, value: null };
391
- c2.current = f2;
392
- } else
393
- f2 = c2.current;
394
- c2 = v$1(function() {
395
- function a3(a4) {
396
- if (!c3) {
397
- c3 = true;
398
- d3 = a4;
399
- a4 = l2(a4);
400
- if (void 0 !== g2 && f2.hasValue) {
401
- var b3 = f2.value;
402
- if (g2(b3, a4))
403
- return k2 = b3;
404
- }
405
- return k2 = a4;
406
- }
407
- b3 = k2;
408
- if (q$1(d3, a4))
409
- return b3;
410
- var e3 = l2(a4);
411
- if (void 0 !== g2 && g2(b3, e3))
412
- return b3;
413
- d3 = a4;
414
- return k2 = e3;
415
- }
416
- var c3 = false, d3, k2, m2 = void 0 === e2 ? null : e2;
417
- return [function() {
418
- return a3(b2());
419
- }, null === m2 ? void 0 : function() {
420
- return a3(m2());
421
- }];
422
- }, [b2, e2, l2, g2]);
423
- var d2 = r$1(a2, c2[0], c2[1]);
424
- u$1(function() {
425
- f2.hasValue = true;
426
- f2.value = d2;
427
- }, [d2]);
428
- w$1(d2);
429
- return d2;
430
- };
431
- {
432
- withSelector.exports = withSelector_production_min;
433
- }
434
- var useSyncExternalStoreExports = withSelector.exports;
435
- const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
436
- function useStore(api, selector = api.getState, equalityFn) {
437
- const slice = useSyncExternalStoreWithSelector(
438
- api.subscribe,
439
- api.getState,
440
- api.getServerState || api.getState,
441
- selector,
442
- equalityFn
443
- );
444
- useDebugValue(slice);
445
- return slice;
446
- }
447
- const createImpl = (createState) => {
448
- const api = typeof createState === "function" ? createStore(createState) : createState;
449
- const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
450
- Object.assign(useBoundStore, api);
451
- return useBoundStore;
452
- };
453
- const create = (createState) => createState ? createImpl(createState) : createImpl;
454
- function n(n2) {
455
- for (var r2 = arguments.length, t2 = Array(r2 > 1 ? r2 - 1 : 0), e2 = 1; e2 < r2; e2++)
456
- t2[e2 - 1] = arguments[e2];
457
- throw Error("[Immer] minified error nr: " + n2 + (t2.length ? " " + t2.map(function(n3) {
458
- return "'" + n3 + "'";
459
- }).join(",") : "") + ". Find the full error at: https://bit.ly/3cXEKWf");
460
- }
461
- function r(n2) {
462
- return !!n2 && !!n2[Q];
463
- }
464
- function t(n2) {
465
- var r2;
466
- return !!n2 && (function(n3) {
467
- if (!n3 || "object" != typeof n3)
468
- return false;
469
- var r3 = Object.getPrototypeOf(n3);
470
- if (null === r3)
471
- return true;
472
- var t2 = Object.hasOwnProperty.call(r3, "constructor") && r3.constructor;
473
- return t2 === Object || "function" == typeof t2 && Function.toString.call(t2) === Z;
474
- }(n2) || Array.isArray(n2) || !!n2[L] || !!(null === (r2 = n2.constructor) || void 0 === r2 ? void 0 : r2[L]) || s(n2) || v(n2));
475
- }
476
- function i(n2, r2, t2) {
477
- void 0 === t2 && (t2 = false), 0 === o(n2) ? (t2 ? Object.keys : nn)(n2).forEach(function(e2) {
478
- t2 && "symbol" == typeof e2 || r2(e2, n2[e2], n2);
479
- }) : n2.forEach(function(t3, e2) {
480
- return r2(e2, t3, n2);
481
- });
482
- }
483
- function o(n2) {
484
- var r2 = n2[Q];
485
- return r2 ? r2.i > 3 ? r2.i - 4 : r2.i : Array.isArray(n2) ? 1 : s(n2) ? 2 : v(n2) ? 3 : 0;
486
- }
487
- function u(n2, r2) {
488
- return 2 === o(n2) ? n2.has(r2) : Object.prototype.hasOwnProperty.call(n2, r2);
489
- }
490
- function a(n2, r2) {
491
- return 2 === o(n2) ? n2.get(r2) : n2[r2];
492
- }
493
- function f(n2, r2, t2) {
494
- var e2 = o(n2);
495
- 2 === e2 ? n2.set(r2, t2) : 3 === e2 ? (n2.delete(r2), n2.add(t2)) : n2[r2] = t2;
496
- }
497
- function c(n2, r2) {
498
- return n2 === r2 ? 0 !== n2 || 1 / n2 == 1 / r2 : n2 != n2 && r2 != r2;
499
- }
500
- function s(n2) {
501
- return X && n2 instanceof Map;
502
- }
503
- function v(n2) {
504
- return q && n2 instanceof Set;
505
- }
506
- function p(n2) {
507
- return n2.o || n2.t;
508
- }
509
- function l(n2) {
510
- if (Array.isArray(n2))
511
- return Array.prototype.slice.call(n2);
512
- var r2 = rn(n2);
513
- delete r2[Q];
514
- for (var t2 = nn(r2), e2 = 0; e2 < t2.length; e2++) {
515
- var i2 = t2[e2], o2 = r2[i2];
516
- false === o2.writable && (o2.writable = true, o2.configurable = true), (o2.get || o2.set) && (r2[i2] = { configurable: true, writable: true, enumerable: o2.enumerable, value: n2[i2] });
517
- }
518
- return Object.create(Object.getPrototypeOf(n2), r2);
519
- }
520
- function d(n2, e2) {
521
- return void 0 === e2 && (e2 = false), y(n2) || r(n2) || !t(n2) ? n2 : (o(n2) > 1 && (n2.set = n2.add = n2.clear = n2.delete = h), Object.freeze(n2), e2 && i(n2, function(n3, r2) {
522
- return d(r2, true);
523
- }, true), n2);
524
- }
525
- function h() {
526
- n(2);
527
- }
528
- function y(n2) {
529
- return null == n2 || "object" != typeof n2 || Object.isFrozen(n2);
530
- }
531
- function b(r2) {
532
- var t2 = tn[r2];
533
- return t2 || n(18, r2), t2;
534
- }
535
- function _() {
536
- return U;
537
- }
538
- function j(n2, r2) {
539
- r2 && (b("Patches"), n2.u = [], n2.s = [], n2.v = r2);
540
- }
541
- function O(n2) {
542
- g(n2), n2.p.forEach(S), n2.p = null;
543
- }
544
- function g(n2) {
545
- n2 === U && (U = n2.l);
546
- }
547
- function w(n2) {
548
- return U = { p: [], l: U, h: n2, m: true, _: 0 };
549
- }
550
- function S(n2) {
551
- var r2 = n2[Q];
552
- 0 === r2.i || 1 === r2.i ? r2.j() : r2.O = true;
553
- }
554
- function P(r2, e2) {
555
- e2._ = e2.p.length;
556
- var i2 = e2.p[0], o2 = void 0 !== r2 && r2 !== i2;
557
- return e2.h.g || b("ES5").S(e2, r2, o2), o2 ? (i2[Q].P && (O(e2), n(4)), t(r2) && (r2 = M(e2, r2), e2.l || x(e2, r2)), e2.u && b("Patches").M(i2[Q].t, r2, e2.u, e2.s)) : r2 = M(e2, i2, []), O(e2), e2.u && e2.v(e2.u, e2.s), r2 !== H ? r2 : void 0;
558
- }
559
- function M(n2, r2, t2) {
560
- if (y(r2))
561
- return r2;
562
- var e2 = r2[Q];
563
- if (!e2)
564
- return i(r2, function(i2, o3) {
565
- return A(n2, e2, r2, i2, o3, t2);
566
- }, true), r2;
567
- if (e2.A !== n2)
568
- return r2;
569
- if (!e2.P)
570
- return x(n2, e2.t, true), e2.t;
571
- if (!e2.I) {
572
- e2.I = true, e2.A._--;
573
- var o2 = 4 === e2.i || 5 === e2.i ? e2.o = l(e2.k) : e2.o;
574
- i(3 === e2.i ? new Set(o2) : o2, function(r3, i2) {
575
- return A(n2, e2, o2, r3, i2, t2);
576
- }), x(n2, o2, false), t2 && n2.u && b("Patches").R(e2, t2, n2.u, n2.s);
577
- }
578
- return e2.o;
579
- }
580
- function A(e2, i2, o2, a2, c2, s2) {
581
- if (r(c2)) {
582
- var v2 = M(e2, c2, s2 && i2 && 3 !== i2.i && !u(i2.D, a2) ? s2.concat(a2) : void 0);
583
- if (f(o2, a2, v2), !r(v2))
584
- return;
585
- e2.m = false;
586
- }
587
- if (t(c2) && !y(c2)) {
588
- if (!e2.h.F && e2._ < 1)
589
- return;
590
- M(e2, c2), i2 && i2.A.l || x(e2, c2);
591
- }
592
- }
593
- function x(n2, r2, t2) {
594
- void 0 === t2 && (t2 = false), n2.h.F && n2.m && d(r2, t2);
595
- }
596
- function z(n2, r2) {
597
- var t2 = n2[Q];
598
- return (t2 ? p(t2) : n2)[r2];
599
- }
600
- function I(n2, r2) {
601
- if (r2 in n2)
602
- for (var t2 = Object.getPrototypeOf(n2); t2; ) {
603
- var e2 = Object.getOwnPropertyDescriptor(t2, r2);
604
- if (e2)
605
- return e2;
606
- t2 = Object.getPrototypeOf(t2);
607
- }
608
- }
609
- function k(n2) {
610
- n2.P || (n2.P = true, n2.l && k(n2.l));
611
- }
612
- function E(n2) {
613
- n2.o || (n2.o = l(n2.t));
614
- }
615
- function R(n2, r2, t2) {
616
- var e2 = s(r2) ? b("MapSet").N(r2, t2) : v(r2) ? b("MapSet").T(r2, t2) : n2.g ? function(n3, r3) {
617
- var t3 = Array.isArray(n3), e3 = { i: t3 ? 1 : 0, A: r3 ? r3.A : _(), P: false, I: false, D: {}, l: r3, t: n3, k: null, o: null, j: null, C: false }, i2 = e3, o2 = en;
618
- t3 && (i2 = [e3], o2 = on);
619
- var u2 = Proxy.revocable(i2, o2), a2 = u2.revoke, f2 = u2.proxy;
620
- return e3.k = f2, e3.j = a2, f2;
621
- }(r2, t2) : b("ES5").J(r2, t2);
622
- return (t2 ? t2.A : _()).p.push(e2), e2;
623
- }
624
- function D(e2) {
625
- return r(e2) || n(22, e2), function n2(r2) {
626
- if (!t(r2))
627
- return r2;
628
- var e3, u2 = r2[Q], c2 = o(r2);
629
- if (u2) {
630
- if (!u2.P && (u2.i < 4 || !b("ES5").K(u2)))
631
- return u2.t;
632
- u2.I = true, e3 = F(r2, c2), u2.I = false;
633
- } else
634
- e3 = F(r2, c2);
635
- return i(e3, function(r3, t2) {
636
- u2 && a(u2.t, r3) === t2 || f(e3, r3, n2(t2));
637
- }), 3 === c2 ? new Set(e3) : e3;
638
- }(e2);
639
- }
640
- function F(n2, r2) {
641
- switch (r2) {
642
- case 2:
643
- return new Map(n2);
644
- case 3:
645
- return Array.from(n2);
646
- }
647
- return l(n2);
648
- }
649
- var G, U, W = "undefined" != typeof Symbol && "symbol" == typeof Symbol("x"), X = "undefined" != typeof Map, q = "undefined" != typeof Set, B = "undefined" != typeof Proxy && void 0 !== Proxy.revocable && "undefined" != typeof Reflect, H = W ? Symbol.for("immer-nothing") : ((G = {})["immer-nothing"] = true, G), L = W ? Symbol.for("immer-draftable") : "__$immer_draftable", Q = W ? Symbol.for("immer-state") : "__$immer_state", Z = "" + Object.prototype.constructor, nn = "undefined" != typeof Reflect && Reflect.ownKeys ? Reflect.ownKeys : void 0 !== Object.getOwnPropertySymbols ? function(n2) {
650
- return Object.getOwnPropertyNames(n2).concat(Object.getOwnPropertySymbols(n2));
651
- } : Object.getOwnPropertyNames, rn = Object.getOwnPropertyDescriptors || function(n2) {
652
- var r2 = {};
653
- return nn(n2).forEach(function(t2) {
654
- r2[t2] = Object.getOwnPropertyDescriptor(n2, t2);
655
- }), r2;
656
- }, tn = {}, en = { get: function(n2, r2) {
657
- if (r2 === Q)
658
- return n2;
659
- var e2 = p(n2);
660
- if (!u(e2, r2))
661
- return function(n3, r3, t2) {
662
- var e3, i3 = I(r3, t2);
663
- return i3 ? "value" in i3 ? i3.value : null === (e3 = i3.get) || void 0 === e3 ? void 0 : e3.call(n3.k) : void 0;
664
- }(n2, e2, r2);
665
- var i2 = e2[r2];
666
- return n2.I || !t(i2) ? i2 : i2 === z(n2.t, r2) ? (E(n2), n2.o[r2] = R(n2.A.h, i2, n2)) : i2;
667
- }, has: function(n2, r2) {
668
- return r2 in p(n2);
669
- }, ownKeys: function(n2) {
670
- return Reflect.ownKeys(p(n2));
671
- }, set: function(n2, r2, t2) {
672
- var e2 = I(p(n2), r2);
673
- if (null == e2 ? void 0 : e2.set)
674
- return e2.set.call(n2.k, t2), true;
675
- if (!n2.P) {
676
- var i2 = z(p(n2), r2), o2 = null == i2 ? void 0 : i2[Q];
677
- if (o2 && o2.t === t2)
678
- return n2.o[r2] = t2, n2.D[r2] = false, true;
679
- if (c(t2, i2) && (void 0 !== t2 || u(n2.t, r2)))
680
- return true;
681
- E(n2), k(n2);
682
- }
683
- return n2.o[r2] === t2 && "number" != typeof t2 && (void 0 !== t2 || r2 in n2.o) || (n2.o[r2] = t2, n2.D[r2] = true, true);
684
- }, deleteProperty: function(n2, r2) {
685
- return void 0 !== z(n2.t, r2) || r2 in n2.t ? (n2.D[r2] = false, E(n2), k(n2)) : delete n2.D[r2], n2.o && delete n2.o[r2], true;
686
- }, getOwnPropertyDescriptor: function(n2, r2) {
687
- var t2 = p(n2), e2 = Reflect.getOwnPropertyDescriptor(t2, r2);
688
- return e2 ? { writable: true, configurable: 1 !== n2.i || "length" !== r2, enumerable: e2.enumerable, value: t2[r2] } : e2;
689
- }, defineProperty: function() {
690
- n(11);
691
- }, getPrototypeOf: function(n2) {
692
- return Object.getPrototypeOf(n2.t);
693
- }, setPrototypeOf: function() {
694
- n(12);
695
- } }, on = {};
696
- i(en, function(n2, r2) {
697
- on[n2] = function() {
698
- return arguments[0] = arguments[0][0], r2.apply(this, arguments);
699
- };
700
- }), on.deleteProperty = function(r2, t2) {
701
- return on.set.call(this, r2, t2, void 0);
702
- }, on.set = function(r2, t2, e2) {
703
- return en.set.call(this, r2[0], t2, e2, r2[0]);
704
- };
705
- var un = function() {
706
- function e2(r2) {
707
- var e3 = this;
708
- this.g = B, this.F = true, this.produce = function(r3, i3, o2) {
709
- if ("function" == typeof r3 && "function" != typeof i3) {
710
- var u2 = i3;
711
- i3 = r3;
712
- var a2 = e3;
713
- return function(n2) {
714
- var r4 = this;
715
- void 0 === n2 && (n2 = u2);
716
- for (var t2 = arguments.length, e4 = Array(t2 > 1 ? t2 - 1 : 0), o3 = 1; o3 < t2; o3++)
717
- e4[o3 - 1] = arguments[o3];
718
- return a2.produce(n2, function(n3) {
719
- var t3;
720
- return (t3 = i3).call.apply(t3, [r4, n3].concat(e4));
721
- });
722
- };
723
- }
724
- var f2;
725
- if ("function" != typeof i3 && n(6), void 0 !== o2 && "function" != typeof o2 && n(7), t(r3)) {
726
- var c2 = w(e3), s2 = R(e3, r3, void 0), v2 = true;
727
- try {
728
- f2 = i3(s2), v2 = false;
729
- } finally {
730
- v2 ? O(c2) : g(c2);
731
- }
732
- return "undefined" != typeof Promise && f2 instanceof Promise ? f2.then(function(n2) {
733
- return j(c2, o2), P(n2, c2);
734
- }, function(n2) {
735
- throw O(c2), n2;
736
- }) : (j(c2, o2), P(f2, c2));
737
- }
738
- if (!r3 || "object" != typeof r3) {
739
- if (void 0 === (f2 = i3(r3)) && (f2 = r3), f2 === H && (f2 = void 0), e3.F && d(f2, true), o2) {
740
- var p2 = [], l2 = [];
741
- b("Patches").M(r3, f2, p2, l2), o2(p2, l2);
742
- }
743
- return f2;
744
- }
745
- n(21, r3);
746
- }, this.produceWithPatches = function(n2, r3) {
747
- if ("function" == typeof n2)
748
- return function(r4) {
749
- for (var t3 = arguments.length, i4 = Array(t3 > 1 ? t3 - 1 : 0), o3 = 1; o3 < t3; o3++)
750
- i4[o3 - 1] = arguments[o3];
751
- return e3.produceWithPatches(r4, function(r5) {
752
- return n2.apply(void 0, [r5].concat(i4));
753
- });
754
- };
755
- var t2, i3, o2 = e3.produce(n2, r3, function(n3, r4) {
756
- t2 = n3, i3 = r4;
757
- });
758
- return "undefined" != typeof Promise && o2 instanceof Promise ? o2.then(function(n3) {
759
- return [n3, t2, i3];
760
- }) : [o2, t2, i3];
761
- }, "boolean" == typeof (null == r2 ? void 0 : r2.useProxies) && this.setUseProxies(r2.useProxies), "boolean" == typeof (null == r2 ? void 0 : r2.autoFreeze) && this.setAutoFreeze(r2.autoFreeze);
762
- }
763
- var i2 = e2.prototype;
764
- return i2.createDraft = function(e3) {
765
- t(e3) || n(8), r(e3) && (e3 = D(e3));
766
- var i3 = w(this), o2 = R(this, e3, void 0);
767
- return o2[Q].C = true, g(i3), o2;
768
- }, i2.finishDraft = function(r2, t2) {
769
- var e3 = r2 && r2[Q];
770
- var i3 = e3.A;
771
- return j(i3, t2), P(void 0, i3);
772
- }, i2.setAutoFreeze = function(n2) {
773
- this.F = n2;
774
- }, i2.setUseProxies = function(r2) {
775
- r2 && !B && n(20), this.g = r2;
776
- }, i2.applyPatches = function(n2, t2) {
777
- var e3;
778
- for (e3 = t2.length - 1; e3 >= 0; e3--) {
779
- var i3 = t2[e3];
780
- if (0 === i3.path.length && "replace" === i3.op) {
781
- n2 = i3.value;
782
- break;
783
- }
784
- }
785
- e3 > -1 && (t2 = t2.slice(e3 + 1));
786
- var o2 = b("Patches").$;
787
- return r(n2) ? o2(n2, t2) : this.produce(n2, function(n3) {
788
- return o2(n3, t2);
789
- });
790
- }, e2;
791
- }(), an = new un(), fn = an.produce;
792
- an.produceWithPatches.bind(an);
793
- an.setAutoFreeze.bind(an);
794
- an.setUseProxies.bind(an);
795
- an.applyPatches.bind(an);
796
- an.createDraft.bind(an);
797
- an.finishDraft.bind(an);
798
- const immerImpl = (initializer) => (set, get, store) => {
799
- store.setState = (updater, replace2, ...a2) => {
800
- const nextState = typeof updater === "function" ? fn(updater) : updater;
801
- return set(nextState, replace2, ...a2);
802
- };
803
- return initializer(store.setState, get, store);
804
- };
805
- const immer = immerImpl;
806
- const requestSubmit = (element, submitter) => {
155
+
156
+ // src/internal/state/createFormStore.ts
157
+ import invariant2 from "tiny-invariant";
158
+ import create from "zustand";
159
+ import { immer } from "zustand/middleware/immer";
160
+
161
+ // src/internal/logic/requestSubmit.ts
162
+ var requestSubmit = (element, submitter) => {
807
163
  if (typeof Object.getPrototypeOf(element).requestSubmit === "function" && true) {
808
164
  element.requestSubmit(submitter);
809
165
  return;
@@ -842,7 +198,38 @@ function raise(errorConstructor, message, name) {
842
198
  name
843
199
  );
844
200
  }
845
- const getArray = (values, field) => {
201
+ if (void 0) {
202
+ const { it, expect } = void 0;
203
+ it("should validate the submitter", () => {
204
+ const form = document.createElement("form");
205
+ document.body.appendChild(form);
206
+ const submitter = document.createElement("input");
207
+ expect(() => validateSubmitter(null, null)).toThrow();
208
+ expect(() => validateSubmitter(form, null)).toThrow();
209
+ expect(() => validateSubmitter(form, submitter)).toThrow();
210
+ expect(
211
+ () => validateSubmitter(form, document.createElement("div"))
212
+ ).toThrow();
213
+ submitter.type = "submit";
214
+ expect(() => validateSubmitter(form, submitter)).toThrow();
215
+ form.appendChild(submitter);
216
+ expect(() => validateSubmitter(form, submitter)).not.toThrow();
217
+ form.removeChild(submitter);
218
+ expect(() => validateSubmitter(form, submitter)).toThrow();
219
+ document.body.appendChild(submitter);
220
+ form.id = "test-form";
221
+ submitter.setAttribute("form", "test-form");
222
+ expect(() => validateSubmitter(form, submitter)).not.toThrow();
223
+ const button = document.createElement("button");
224
+ button.type = "submit";
225
+ form.appendChild(button);
226
+ expect(() => validateSubmitter(form, button)).not.toThrow();
227
+ });
228
+ }
229
+
230
+ // src/internal/state/arrayUtil.ts
231
+ import invariant from "tiny-invariant";
232
+ var getArray = (values, field) => {
846
233
  const value = getPath(values, field);
847
234
  if (value === void 0 || value === null) {
848
235
  const newValue = [];
@@ -855,7 +242,7 @@ const getArray = (values, field) => {
855
242
  );
856
243
  return value;
857
244
  };
858
- const swap = (array, indexA, indexB) => {
245
+ var swap = (array, indexA, indexB) => {
859
246
  const itemA = array[indexA];
860
247
  const itemB = array[indexB];
861
248
  const hasItemA = indexA in array;
@@ -879,20 +266,20 @@ function sparseSplice(array, start, deleteCount, item) {
879
266
  return array.splice(start, deleteCount, item);
880
267
  return array.splice(start, deleteCount);
881
268
  }
882
- const move = (array, from2, to) => {
269
+ var move = (array, from2, to) => {
883
270
  const [item] = sparseSplice(array, from2, 1);
884
271
  sparseSplice(array, to, 0, item);
885
272
  };
886
- const insert = (array, index, value) => {
273
+ var insert = (array, index, value) => {
887
274
  sparseSplice(array, index, 0, value);
888
275
  };
889
- const remove = (array, index) => {
276
+ var remove = (array, index) => {
890
277
  sparseSplice(array, index, 1);
891
278
  };
892
- const replace = (array, index, value) => {
279
+ var replace = (array, index, value) => {
893
280
  sparseSplice(array, index, 1, value);
894
281
  };
895
- const mutateAsArray = (field, obj, mutate) => {
282
+ var mutateAsArray = (field, obj, mutate) => {
896
283
  const beforeKeys = /* @__PURE__ */ new Set();
897
284
  const arr = [];
898
285
  for (const [key, value] of Object.entries(obj)) {
@@ -913,7 +300,7 @@ const mutateAsArray = (field, obj, mutate) => {
913
300
  }
914
301
  }
915
302
  };
916
- const getDeepArrayPaths = (obj, basePath = "") => {
303
+ var getDeepArrayPaths = (obj, basePath = "") => {
917
304
  if (Array.isArray(obj)) {
918
305
  return obj.flatMap(
919
306
  (item, index) => getDeepArrayPaths(item, `${basePath}[${index}]`)
@@ -926,9 +313,259 @@ const getDeepArrayPaths = (obj, basePath = "") => {
926
313
  }
927
314
  return [basePath];
928
315
  };
929
- const noOp = () => {
316
+ if (void 0) {
317
+ const { describe, expect, it } = void 0;
318
+ const countArrayItems = (arr) => {
319
+ let count = 0;
320
+ arr.forEach(() => count++);
321
+ return count;
322
+ };
323
+ describe("getArray", () => {
324
+ it("shoud get a deeply nested array that can be mutated to update the nested value", () => {
325
+ const values = {
326
+ d: [
327
+ { foo: "bar", baz: [true, false] },
328
+ { e: true, f: "hi" }
329
+ ]
330
+ };
331
+ const result = getArray(values, "d[0].baz");
332
+ const finalValues = {
333
+ d: [
334
+ { foo: "bar", baz: [true, false, true] },
335
+ { e: true, f: "hi" }
336
+ ]
337
+ };
338
+ expect(result).toEqual([true, false]);
339
+ result.push(true);
340
+ expect(values).toEqual(finalValues);
341
+ });
342
+ it("should return an empty array that can be mutated if result is null or undefined", () => {
343
+ const values = {};
344
+ const result = getArray(values, "a.foo[0].bar");
345
+ const finalValues = {
346
+ a: { foo: [{ bar: ["Bob ross"] }] }
347
+ };
348
+ expect(result).toEqual([]);
349
+ result.push("Bob ross");
350
+ expect(values).toEqual(finalValues);
351
+ });
352
+ it("should throw if the value is defined and not an array", () => {
353
+ const values = { foo: "foo" };
354
+ expect(() => getArray(values, "foo")).toThrow();
355
+ });
356
+ });
357
+ describe("swap", () => {
358
+ it("should swap two items", () => {
359
+ const array = [1, 2, 3];
360
+ swap(array, 0, 1);
361
+ expect(array).toEqual([2, 1, 3]);
362
+ });
363
+ it("should work for sparse arrays", () => {
364
+ const arr = [];
365
+ arr[0] = true;
366
+ swap(arr, 0, 2);
367
+ expect(countArrayItems(arr)).toEqual(1);
368
+ expect(0 in arr).toBe(false);
369
+ expect(2 in arr).toBe(true);
370
+ expect(arr[2]).toEqual(true);
371
+ });
372
+ });
373
+ describe("move", () => {
374
+ it("should move an item to a new index", () => {
375
+ const array = [1, 2, 3];
376
+ move(array, 0, 1);
377
+ expect(array).toEqual([2, 1, 3]);
378
+ });
379
+ it("should work with sparse arrays", () => {
380
+ const array = [1];
381
+ move(array, 0, 2);
382
+ expect(countArrayItems(array)).toEqual(1);
383
+ expect(array).toEqual([void 0, void 0, 1]);
384
+ });
385
+ });
386
+ describe("insert", () => {
387
+ it("should insert an item at a new index", () => {
388
+ const array = [1, 2, 3];
389
+ insert(array, 1, 4);
390
+ expect(array).toEqual([1, 4, 2, 3]);
391
+ });
392
+ it("should be able to insert falsey values", () => {
393
+ const array = [1, 2, 3];
394
+ insert(array, 1, null);
395
+ expect(array).toEqual([1, null, 2, 3]);
396
+ });
397
+ it("should handle sparse arrays", () => {
398
+ const array = [];
399
+ array[2] = true;
400
+ insert(array, 0, true);
401
+ expect(countArrayItems(array)).toEqual(2);
402
+ expect(array).toEqual([true, void 0, void 0, true]);
403
+ });
404
+ });
405
+ describe("remove", () => {
406
+ it("should remove an item at a given index", () => {
407
+ const array = [1, 2, 3];
408
+ remove(array, 1);
409
+ expect(array).toEqual([1, 3]);
410
+ });
411
+ it("should handle sparse arrays", () => {
412
+ const array = [];
413
+ array[2] = true;
414
+ remove(array, 0);
415
+ expect(countArrayItems(array)).toEqual(1);
416
+ expect(array).toEqual([void 0, true]);
417
+ });
418
+ });
419
+ describe("replace", () => {
420
+ it("should replace an item at a given index", () => {
421
+ const array = [1, 2, 3];
422
+ replace(array, 1, 4);
423
+ expect(array).toEqual([1, 4, 3]);
424
+ });
425
+ it("should handle sparse arrays", () => {
426
+ const array = [];
427
+ array[2] = true;
428
+ replace(array, 0, true);
429
+ expect(countArrayItems(array)).toEqual(2);
430
+ expect(array).toEqual([true, void 0, true]);
431
+ });
432
+ });
433
+ describe("mutateAsArray", () => {
434
+ it("should handle swap", () => {
435
+ const values = {
436
+ myField: "something",
437
+ "myField[0]": "foo",
438
+ "myField[2]": "bar",
439
+ otherField: "baz",
440
+ "otherField[0]": "something else"
441
+ };
442
+ mutateAsArray("myField", values, (arr) => {
443
+ swap(arr, 0, 2);
444
+ });
445
+ expect(values).toEqual({
446
+ myField: "something",
447
+ "myField[0]": "bar",
448
+ "myField[2]": "foo",
449
+ otherField: "baz",
450
+ "otherField[0]": "something else"
451
+ });
452
+ });
453
+ it("should swap sparse arrays", () => {
454
+ const values = {
455
+ myField: "something",
456
+ "myField[0]": "foo",
457
+ otherField: "baz",
458
+ "otherField[0]": "something else"
459
+ };
460
+ mutateAsArray("myField", values, (arr) => {
461
+ swap(arr, 0, 2);
462
+ });
463
+ expect(values).toEqual({
464
+ myField: "something",
465
+ "myField[2]": "foo",
466
+ otherField: "baz",
467
+ "otherField[0]": "something else"
468
+ });
469
+ });
470
+ it("should handle arrays with nested values", () => {
471
+ const values = {
472
+ myField: "something",
473
+ "myField[0].title": "foo",
474
+ "myField[0].note": "bar",
475
+ "myField[2].title": "other",
476
+ "myField[2].note": "other",
477
+ otherField: "baz",
478
+ "otherField[0]": "something else"
479
+ };
480
+ mutateAsArray("myField", values, (arr) => {
481
+ swap(arr, 0, 2);
482
+ });
483
+ expect(values).toEqual({
484
+ myField: "something",
485
+ "myField[0].title": "other",
486
+ "myField[0].note": "other",
487
+ "myField[2].title": "foo",
488
+ "myField[2].note": "bar",
489
+ otherField: "baz",
490
+ "otherField[0]": "something else"
491
+ });
492
+ });
493
+ it("should handle move", () => {
494
+ const values = {
495
+ myField: "something",
496
+ "myField[0]": "foo",
497
+ "myField[1]": "bar",
498
+ "myField[2]": "baz",
499
+ "otherField[0]": "something else"
500
+ };
501
+ mutateAsArray("myField", values, (arr) => {
502
+ move(arr, 0, 2);
503
+ });
504
+ expect(values).toEqual({
505
+ myField: "something",
506
+ "myField[0]": "bar",
507
+ "myField[1]": "baz",
508
+ "myField[2]": "foo",
509
+ "otherField[0]": "something else"
510
+ });
511
+ });
512
+ it("should not create keys for `undefined`", () => {
513
+ const values = {
514
+ "myField[0]": "foo"
515
+ };
516
+ mutateAsArray("myField", values, (arr) => {
517
+ arr.unshift(void 0);
518
+ });
519
+ expect(Object.keys(values)).toHaveLength(1);
520
+ expect(values).toEqual({
521
+ "myField[1]": "foo"
522
+ });
523
+ });
524
+ it("should handle remove", () => {
525
+ const values = {
526
+ myField: "something",
527
+ "myField[0]": "foo",
528
+ "myField[1]": "bar",
529
+ "myField[2]": "baz",
530
+ "otherField[0]": "something else"
531
+ };
532
+ mutateAsArray("myField", values, (arr) => {
533
+ remove(arr, 1);
534
+ });
535
+ expect(values).toEqual({
536
+ myField: "something",
537
+ "myField[0]": "foo",
538
+ "myField[1]": "baz",
539
+ "otherField[0]": "something else"
540
+ });
541
+ expect("myField[2]" in values).toBe(false);
542
+ });
543
+ });
544
+ describe("getDeepArrayPaths", () => {
545
+ it("should return all paths recursively", () => {
546
+ const obj = [
547
+ true,
548
+ true,
549
+ [true, true],
550
+ { foo: true, bar: { baz: true, test: [true] } }
551
+ ];
552
+ expect(getDeepArrayPaths(obj, "myField")).toEqual([
553
+ "myField[0]",
554
+ "myField[1]",
555
+ "myField[2][0]",
556
+ "myField[2][1]",
557
+ "myField[3].foo",
558
+ "myField[3].bar.baz",
559
+ "myField[3].bar.test[0]"
560
+ ]);
561
+ });
562
+ });
563
+ }
564
+
565
+ // src/internal/state/createFormStore.ts
566
+ var noOp = () => {
930
567
  };
931
- const defaultFormState = {
568
+ var defaultFormState = {
932
569
  isHydrated: false,
933
570
  isSubmitting: false,
934
571
  hasBeenSubmitted: false,
@@ -980,7 +617,7 @@ const defaultFormState = {
980
617
  }
981
618
  }
982
619
  };
983
- const createFormState = (set, get) => ({
620
+ var createFormState = (set, get) => ({
984
621
  isHydrated: false,
985
622
  isSubmitting: false,
986
623
  hasBeenSubmitted: false,
@@ -1035,12 +672,12 @@ const createFormState = (set, get) => ({
1035
672
  validateField: async (field) => {
1036
673
  var _a, _b, _c;
1037
674
  const formElement = get().formElement;
1038
- invariant(
675
+ invariant2(
1039
676
  formElement,
1040
677
  "Cannot find reference to form. This is probably a bug in remix-validated-form."
1041
678
  );
1042
679
  const validator = (_a = get().formProps) == null ? void 0 : _a.validator;
1043
- invariant(
680
+ invariant2(
1044
681
  validator,
1045
682
  "Cannot validator. This is probably a bug in remix-validated-form."
1046
683
  );
@@ -1060,12 +697,12 @@ const createFormState = (set, get) => ({
1060
697
  validate: async () => {
1061
698
  var _a;
1062
699
  const formElement = get().formElement;
1063
- invariant(
700
+ invariant2(
1064
701
  formElement,
1065
702
  "Cannot find reference to form. This is probably a bug in remix-validated-form."
1066
703
  );
1067
704
  const validator = (_a = get().formProps) == null ? void 0 : _a.validator;
1068
- invariant(
705
+ invariant2(
1069
706
  validator,
1070
707
  "Cannot validator. This is probably a bug in remix-validated-form."
1071
708
  );
@@ -1076,7 +713,7 @@ const createFormState = (set, get) => ({
1076
713
  },
1077
714
  submit: () => {
1078
715
  const formElement = get().formElement;
1079
- invariant(
716
+ invariant2(
1080
717
  formElement,
1081
718
  "Cannot find reference to form. This is probably a bug in remix-validated-form."
1082
719
  );
@@ -1319,7 +956,7 @@ const createFormState = (set, get) => ({
1319
956
  }
1320
957
  }
1321
958
  });
1322
- const useRootFormStore = create()(
959
+ var useRootFormStore = create()(
1323
960
  immer((set, get) => ({
1324
961
  forms: {},
1325
962
  form: (formId) => {
@@ -1343,10 +980,14 @@ const useRootFormStore = create()(
1343
980
  }
1344
981
  }))
1345
982
  );
1346
- const useFormStore = (formId, selector) => {
983
+
984
+ // src/internal/state/storeHooks.ts
985
+ var useFormStore = (formId, selector) => {
1347
986
  return useRootFormStore((state) => selector(state.form(formId)));
1348
987
  };
1349
- const useInternalFormContext = (formId, hookName) => {
988
+
989
+ // src/internal/hooks.ts
990
+ var useInternalFormContext = (formId, hookName) => {
1350
991
  const formContext = useContext(InternalFormContext);
1351
992
  if (formId)
1352
993
  return { formId };
@@ -1376,12 +1017,12 @@ function useErrorResponseForForm({
1376
1017
  return actionData;
1377
1018
  return null;
1378
1019
  }
1379
- const useFieldErrorsForForm = (context) => {
1020
+ var useFieldErrorsForForm = (context) => {
1380
1021
  const response = useErrorResponseForForm(context);
1381
1022
  const hydrated = useFormStore(context.formId, (state) => state.isHydrated);
1382
1023
  return hydratable.from(response == null ? void 0 : response.fieldErrors, hydrated);
1383
1024
  };
1384
- const useDefaultValuesFromLoader = ({
1025
+ var useDefaultValuesFromLoader = ({
1385
1026
  formId
1386
1027
  }) => {
1387
1028
  const matches = useMatches();
@@ -1392,7 +1033,7 @@ const useDefaultValuesFromLoader = ({
1392
1033
  }
1393
1034
  return null;
1394
1035
  };
1395
- const useDefaultValuesForForm = (context) => {
1036
+ var useDefaultValuesForForm = (context) => {
1396
1037
  const { formId, defaultValuesProp } = context;
1397
1038
  const hydrated = useFormStore(formId, (state) => state.isHydrated);
1398
1039
  const errorResponse = useErrorResponseForForm(context);
@@ -1400,7 +1041,7 @@ const useDefaultValuesForForm = (context) => {
1400
1041
  if (hydrated)
1401
1042
  return hydratable.hydratedData();
1402
1043
  if (errorResponse == null ? void 0 : errorResponse.repopulateFields) {
1403
- invariant(
1044
+ invariant3(
1404
1045
  typeof errorResponse.repopulateFields === "object",
1405
1046
  "repopulateFields returned something other than an object"
1406
1047
  );
@@ -1410,14 +1051,14 @@ const useDefaultValuesForForm = (context) => {
1410
1051
  return hydratable.serverData(defaultValuesProp);
1411
1052
  return hydratable.serverData(defaultValuesFromLoader);
1412
1053
  };
1413
- const useHasActiveFormSubmit = ({
1054
+ var useHasActiveFormSubmit = ({
1414
1055
  fetcher
1415
1056
  }) => {
1416
1057
  const transition = useTransition();
1417
1058
  const hasActiveSubmission = fetcher ? fetcher.state === "submitting" : !!transition.submission;
1418
1059
  return hasActiveSubmission;
1419
1060
  };
1420
- const useFieldTouched = (field, { formId }) => {
1061
+ var useFieldTouched = (field, { formId }) => {
1421
1062
  const touched = useFormStore(formId, (state) => state.touchedFields[field]);
1422
1063
  const setFieldTouched = useFormStore(formId, (state) => state.setTouched);
1423
1064
  const setTouched = useCallback(
@@ -1426,7 +1067,7 @@ const useFieldTouched = (field, { formId }) => {
1426
1067
  );
1427
1068
  return [touched, setTouched];
1428
1069
  };
1429
- const useFieldError = (name, context) => {
1070
+ var useFieldError = (name, context) => {
1430
1071
  const fieldErrors = useFieldErrorsForForm(context);
1431
1072
  const state = useFormStore(
1432
1073
  context.formId,
@@ -1434,54 +1075,57 @@ const useFieldError = (name, context) => {
1434
1075
  );
1435
1076
  return fieldErrors.map((fieldErrors2) => fieldErrors2 == null ? void 0 : fieldErrors2[name]).hydrateTo(state);
1436
1077
  };
1437
- const useClearError = (context) => {
1078
+ var useClearError = (context) => {
1438
1079
  const { formId } = context;
1439
1080
  return useFormStore(formId, (state) => state.clearFieldError);
1440
1081
  };
1441
- const useCurrentDefaultValueForField = (formId, field) => useFormStore(formId, (state) => getPath(state.currentDefaultValues, field));
1442
- const useFieldDefaultValue = (name, context) => {
1082
+ var useCurrentDefaultValueForField = (formId, field) => useFormStore(formId, (state) => getPath(state.currentDefaultValues, field));
1083
+ var useFieldDefaultValue = (name, context) => {
1443
1084
  const defaultValues = useDefaultValuesForForm(context);
1444
1085
  const state = useCurrentDefaultValueForField(context.formId, name);
1445
1086
  return defaultValues.map((val) => getPath(val, name)).hydrateTo(state);
1446
1087
  };
1447
- const useInternalIsSubmitting = (formId) => useFormStore(formId, (state) => state.isSubmitting);
1448
- const useInternalIsValid = (formId) => useFormStore(formId, (state) => state.isValid());
1449
- const useInternalHasBeenSubmitted = (formId) => useFormStore(formId, (state) => state.hasBeenSubmitted);
1450
- const useValidateField = (formId) => useFormStore(formId, (state) => state.validateField);
1451
- const useValidate = (formId) => useFormStore(formId, (state) => state.validate);
1452
- const noOpReceiver = () => () => {
1088
+ var useInternalIsSubmitting = (formId) => useFormStore(formId, (state) => state.isSubmitting);
1089
+ var useInternalIsValid = (formId) => useFormStore(formId, (state) => state.isValid());
1090
+ var useInternalHasBeenSubmitted = (formId) => useFormStore(formId, (state) => state.hasBeenSubmitted);
1091
+ var useValidateField = (formId) => useFormStore(formId, (state) => state.validateField);
1092
+ var useValidate = (formId) => useFormStore(formId, (state) => state.validate);
1093
+ var noOpReceiver = () => () => {
1453
1094
  };
1454
- const useRegisterReceiveFocus = (formId) => useFormStore(
1095
+ var useRegisterReceiveFocus = (formId) => useFormStore(
1455
1096
  formId,
1456
1097
  (state) => {
1457
1098
  var _a, _b;
1458
1099
  return (_b = (_a = state.formProps) == null ? void 0 : _a.registerReceiveFocus) != null ? _b : noOpReceiver;
1459
1100
  }
1460
1101
  );
1461
- const defaultDefaultValues = {};
1462
- const useSyncedDefaultValues = (formId) => useFormStore(
1102
+ var defaultDefaultValues = {};
1103
+ var useSyncedDefaultValues = (formId) => useFormStore(
1463
1104
  formId,
1464
1105
  (state) => {
1465
1106
  var _a, _b;
1466
1107
  return (_b = (_a = state.formProps) == null ? void 0 : _a.defaultValues) != null ? _b : defaultDefaultValues;
1467
1108
  }
1468
1109
  );
1469
- const useSetTouched = ({ formId }) => useFormStore(formId, (state) => state.setTouched);
1470
- const useTouchedFields = (formId) => useFormStore(formId, (state) => state.touchedFields);
1471
- const useFieldErrors = (formId) => useFormStore(formId, (state) => state.fieldErrors);
1472
- const useSetFieldErrors = (formId) => useFormStore(formId, (state) => state.setFieldErrors);
1473
- const useResetFormElement = (formId) => useFormStore(formId, (state) => state.resetFormElement);
1474
- const useSubmitForm = (formId) => useFormStore(formId, (state) => state.submit);
1475
- const useFormActionProp = (formId) => useFormStore(formId, (state) => {
1110
+ var useSetTouched = ({ formId }) => useFormStore(formId, (state) => state.setTouched);
1111
+ var useTouchedFields = (formId) => useFormStore(formId, (state) => state.touchedFields);
1112
+ var useFieldErrors = (formId) => useFormStore(formId, (state) => state.fieldErrors);
1113
+ var useSetFieldErrors = (formId) => useFormStore(formId, (state) => state.setFieldErrors);
1114
+ var useResetFormElement = (formId) => useFormStore(formId, (state) => state.resetFormElement);
1115
+ var useSubmitForm = (formId) => useFormStore(formId, (state) => state.submit);
1116
+ var useFormActionProp = (formId) => useFormStore(formId, (state) => {
1476
1117
  var _a;
1477
1118
  return (_a = state.formProps) == null ? void 0 : _a.action;
1478
1119
  });
1479
- const useFormSubactionProp = (formId) => useFormStore(formId, (state) => {
1120
+ var useFormSubactionProp = (formId) => useFormStore(formId, (state) => {
1480
1121
  var _a;
1481
1122
  return (_a = state.formProps) == null ? void 0 : _a.subaction;
1482
1123
  });
1483
- const useFormValues = (formId) => useFormStore(formId, (state) => state.getValues);
1484
- const useControlledFieldValue = (context, field) => {
1124
+ var useFormValues = (formId) => useFormStore(formId, (state) => state.getValues);
1125
+
1126
+ // src/internal/state/controlledFields.ts
1127
+ import { useCallback as useCallback2, useEffect } from "react";
1128
+ var useControlledFieldValue = (context, field) => {
1485
1129
  const value = useFormStore(
1486
1130
  context.formId,
1487
1131
  (state) => state.controlledFields.getValue(field)
@@ -1493,7 +1137,7 @@ const useControlledFieldValue = (context, field) => {
1493
1137
  const defaultValue = useFieldDefaultValue(field, context);
1494
1138
  return isFormHydrated ? value : defaultValue;
1495
1139
  };
1496
- const useRegisterControlledField = (context, field) => {
1140
+ var useRegisterControlledField = (context, field) => {
1497
1141
  const resolveUpdate = useFormStore(
1498
1142
  context.formId,
1499
1143
  (state) => state.controlledFields.valueUpdateResolvers[field]
@@ -1514,38 +1158,40 @@ const useRegisterControlledField = (context, field) => {
1514
1158
  return () => unregister(field);
1515
1159
  }, [context.formId, field, register, unregister]);
1516
1160
  };
1517
- const useControllableValue = (context, field) => {
1161
+ var useControllableValue = (context, field) => {
1518
1162
  useRegisterControlledField(context, field);
1519
1163
  const setControlledFieldValue = useFormStore(
1520
1164
  context.formId,
1521
1165
  (state) => state.controlledFields.setValue
1522
1166
  );
1523
- const setValue = useCallback(
1167
+ const setValue = useCallback2(
1524
1168
  (value2) => setControlledFieldValue(field, value2),
1525
1169
  [field, setControlledFieldValue]
1526
1170
  );
1527
1171
  const value = useControlledFieldValue(context, field);
1528
1172
  return [value, setValue];
1529
1173
  };
1530
- const useUpdateControllableValue = (formId) => {
1174
+ var useUpdateControllableValue = (formId) => {
1531
1175
  const setValue = useFormStore(
1532
1176
  formId,
1533
1177
  (state) => state.controlledFields.setValue
1534
1178
  );
1535
- return useCallback(
1179
+ return useCallback2(
1536
1180
  (field, value) => setValue(field, value),
1537
1181
  [setValue]
1538
1182
  );
1539
1183
  };
1540
- const useIsSubmitting = (formId) => {
1184
+
1185
+ // src/hooks.ts
1186
+ var useIsSubmitting = (formId) => {
1541
1187
  const formContext = useInternalFormContext(formId, "useIsSubmitting");
1542
1188
  return useInternalIsSubmitting(formContext.formId);
1543
1189
  };
1544
- const useIsValid = (formId) => {
1190
+ var useIsValid = (formId) => {
1545
1191
  const formContext = useInternalFormContext(formId, "useIsValid");
1546
1192
  return useInternalIsValid(formContext.formId);
1547
1193
  };
1548
- const useField = (name, options) => {
1194
+ var useField = (name, options) => {
1549
1195
  const { formId: providedFormId, handleReceiveFocus } = options != null ? options : {};
1550
1196
  const formContext = useInternalFormContext(providedFormId, "useField");
1551
1197
  const defaultValue = useFieldDefaultValue(name, formContext);
@@ -1555,7 +1201,7 @@ const useField = (name, options) => {
1555
1201
  const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);
1556
1202
  const validateField = useValidateField(formContext.formId);
1557
1203
  const registerReceiveFocus = useRegisterReceiveFocus(formContext.formId);
1558
- useEffect(() => {
1204
+ useEffect2(() => {
1559
1205
  if (handleReceiveFocus)
1560
1206
  return registerReceiveFocus(name, handleReceiveFocus);
1561
1207
  }, [handleReceiveFocus, name, registerReceiveFocus]);
@@ -1593,38 +1239,18 @@ const useField = (name, options) => {
1593
1239
  ]);
1594
1240
  return field;
1595
1241
  };
1596
- const useControlField = (name, formId) => {
1242
+ var useControlField = (name, formId) => {
1597
1243
  const context = useInternalFormContext(formId, "useControlField");
1598
1244
  const [value, setValue] = useControllableValue(context, name);
1599
1245
  return [value, setValue];
1600
1246
  };
1601
- const useUpdateControlledField = (formId) => {
1247
+ var useUpdateControlledField = (formId) => {
1602
1248
  const context = useInternalFormContext(formId, "useControlField");
1603
1249
  return useUpdateControllableValue(context.formId);
1604
1250
  };
1605
- /**
1606
- * @remix-run/server-runtime v1.7.6
1607
- *
1608
- * Copyright (c) Remix Software Inc.
1609
- *
1610
- * This source code is licensed under the MIT license found in the
1611
- * LICENSE.md file in the root directory of this source tree.
1612
- *
1613
- * @license MIT
1614
- */
1615
- const json = (data, init = {}) => {
1616
- let responseInit = typeof init === "number" ? {
1617
- status: init
1618
- } : init;
1619
- let headers = new Headers(responseInit.headers);
1620
- if (!headers.has("Content-Type")) {
1621
- headers.set("Content-Type", "application/json; charset=utf-8");
1622
- }
1623
- return new Response(JSON.stringify(data), {
1624
- ...responseInit,
1625
- headers
1626
- });
1627
- };
1251
+
1252
+ // src/server.ts
1253
+ import { json } from "@remix-run/server-runtime";
1628
1254
  function validationError(error, repopulateFields, init) {
1629
1255
  return json(
1630
1256
  {
@@ -1636,10 +1262,27 @@ function validationError(error, repopulateFields, init) {
1636
1262
  { status: 422, ...init }
1637
1263
  );
1638
1264
  }
1639
- const setFormDefaults = (formId, defaultValues) => ({
1265
+ var setFormDefaults = (formId, defaultValues) => ({
1640
1266
  [formDefaultValuesKey(formId)]: defaultValues
1641
1267
  });
1642
- class MultiValueMap {
1268
+
1269
+ // src/ValidatedForm.tsx
1270
+ import {
1271
+ Form as RemixForm,
1272
+ useSubmit
1273
+ } from "@remix-run/react";
1274
+ import {
1275
+ useCallback as useCallback4,
1276
+ useEffect as useEffect5,
1277
+ useMemo as useMemo2,
1278
+ useRef as useRef4,
1279
+ useState
1280
+ } from "react";
1281
+ import * as R4 from "remeda";
1282
+
1283
+ // src/internal/MultiValueMap.ts
1284
+ import { useCallback as useCallback3, useRef } from "react";
1285
+ var MultiValueMap = class {
1643
1286
  constructor() {
1644
1287
  this.dict = /* @__PURE__ */ new Map();
1645
1288
  this.add = (key, value) => {
@@ -1670,19 +1313,22 @@ class MultiValueMap {
1670
1313
  this.values = () => this.dict.values();
1671
1314
  this.has = (key) => this.dict.has(key);
1672
1315
  }
1673
- }
1674
- const useMultiValueMap = () => {
1316
+ };
1317
+ var useMultiValueMap = () => {
1675
1318
  const ref = useRef(null);
1676
- return useCallback(() => {
1319
+ return useCallback3(() => {
1677
1320
  if (ref.current)
1678
1321
  return ref.current;
1679
1322
  ref.current = new MultiValueMap();
1680
1323
  return ref.current;
1681
1324
  }, []);
1682
1325
  };
1326
+
1327
+ // src/internal/submissionCallbacks.ts
1328
+ import { useEffect as useEffect3, useRef as useRef2 } from "react";
1683
1329
  function useSubmitComplete(isSubmitting, callback) {
1684
- const isPending = useRef(false);
1685
- useEffect(() => {
1330
+ const isPending = useRef2(false);
1331
+ useEffect3(() => {
1686
1332
  if (isSubmitting) {
1687
1333
  isPending.current = true;
1688
1334
  }
@@ -1692,7 +1338,11 @@ function useSubmitComplete(isSubmitting, callback) {
1692
1338
  }
1693
1339
  });
1694
1340
  }
1695
- const mergeRefs = (refs) => {
1341
+
1342
+ // src/internal/util.ts
1343
+ import { useEffect as useEffect4, useLayoutEffect, useRef as useRef3 } from "react";
1344
+ import * as R3 from "remeda";
1345
+ var mergeRefs = (refs) => {
1696
1346
  return (value) => {
1697
1347
  refs.filter(Boolean).forEach((ref) => {
1698
1348
  if (typeof ref === "function") {
@@ -1703,22 +1353,25 @@ const mergeRefs = (refs) => {
1703
1353
  });
1704
1354
  };
1705
1355
  };
1706
- const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
1707
- const useDeepEqualsMemo = (item) => {
1708
- const ref = useRef(item);
1709
- const areEqual = ref.current === item || equals(ref.current, item);
1710
- useEffect(() => {
1356
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect4;
1357
+ var useDeepEqualsMemo = (item) => {
1358
+ const ref = useRef3(item);
1359
+ const areEqual = ref.current === item || R3.equals(ref.current, item);
1360
+ useEffect4(() => {
1711
1361
  if (!areEqual) {
1712
1362
  ref.current = item;
1713
1363
  }
1714
1364
  });
1715
1365
  return areEqual ? ref.current : item;
1716
1366
  };
1717
- const getDataFromForm = (el) => new FormData(el);
1367
+
1368
+ // src/ValidatedForm.tsx
1369
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
1370
+ var getDataFromForm = (el) => new FormData(el);
1718
1371
  function nonNull(value) {
1719
1372
  return value !== null;
1720
1373
  }
1721
- const focusFirstInvalidInput = (fieldErrors, customFocusHandlers, formElement) => {
1374
+ var focusFirstInvalidInput = (fieldErrors, customFocusHandlers, formElement) => {
1722
1375
  var _a;
1723
1376
  const namesInOrder = [...formElement.elements].map((el) => {
1724
1377
  const input = el instanceof RadioNodeList ? el[0] : el;
@@ -1726,7 +1379,7 @@ const focusFirstInvalidInput = (fieldErrors, customFocusHandlers, formElement) =
1726
1379
  return input.name;
1727
1380
  return null;
1728
1381
  }).filter(nonNull).filter((name) => name in fieldErrors);
1729
- const uniqueNamesInOrder = uniq(namesInOrder);
1382
+ const uniqueNamesInOrder = R4.uniq(namesInOrder);
1730
1383
  for (const fieldName of uniqueNamesInOrder) {
1731
1384
  if (customFocusHandlers.has(fieldName)) {
1732
1385
  customFocusHandlers.getAll(fieldName).forEach((handler) => {
@@ -1755,11 +1408,11 @@ const focusFirstInvalidInput = (fieldErrors, customFocusHandlers, formElement) =
1755
1408
  }
1756
1409
  }
1757
1410
  };
1758
- const useFormId = (providedId) => {
1411
+ var useFormId = (providedId) => {
1759
1412
  const [symbolId] = useState(() => Symbol("remix-validated-form-id"));
1760
1413
  return providedId != null ? providedId : symbolId;
1761
1414
  };
1762
- const FormResetter = ({
1415
+ var FormResetter = ({
1763
1416
  resetAfterSubmit,
1764
1417
  formRef
1765
1418
  }) => {
@@ -1809,7 +1462,7 @@ function ValidatedForm({
1809
1462
  var _a;
1810
1463
  const formId = useFormId(id);
1811
1464
  const providedDefaultValues = useDeepEqualsMemo(unMemoizedDefaults);
1812
- const contextValue = useMemo(
1465
+ const contextValue = useMemo2(
1813
1466
  () => ({
1814
1467
  formId,
1815
1468
  action,
@@ -1822,8 +1475,8 @@ function ValidatedForm({
1822
1475
  const backendError = useErrorResponseForForm(contextValue);
1823
1476
  const backendDefaultValues = useDefaultValuesFromLoader(contextValue);
1824
1477
  const hasActiveSubmission = useHasActiveFormSubmit(contextValue);
1825
- const formRef = useRef(null);
1826
- const Form$1 = (_a = fetcher == null ? void 0 : fetcher.Form) != null ? _a : Form;
1478
+ const formRef = useRef4(null);
1479
+ const Form = (_a = fetcher == null ? void 0 : fetcher.Form) != null ? _a : RemixForm;
1827
1480
  const submit = useSubmit();
1828
1481
  const setFieldErrors = useSetFieldErrors(formId);
1829
1482
  const setFieldError = useFormStore(formId, (state) => state.setFieldError);
@@ -1838,7 +1491,7 @@ function ValidatedForm({
1838
1491
  const cleanupForm = useRootFormStore((state) => state.cleanupForm);
1839
1492
  const registerForm = useRootFormStore((state) => state.registerForm);
1840
1493
  const customFocusHandlers = useMultiValueMap();
1841
- const registerReceiveFocus = useCallback(
1494
+ const registerReceiveFocus = useCallback4(
1842
1495
  (fieldName, handler) => {
1843
1496
  customFocusHandlers().add(fieldName, handler);
1844
1497
  return () => {
@@ -1872,17 +1525,30 @@ function ValidatedForm({
1872
1525
  useIsomorphicLayoutEffect(() => {
1873
1526
  setFormElementInState(formRef.current);
1874
1527
  }, [setFormElementInState]);
1875
- useEffect(() => {
1528
+ useEffect5(() => {
1876
1529
  var _a2;
1877
1530
  setFieldErrors((_a2 = backendError == null ? void 0 : backendError.fieldErrors) != null ? _a2 : {});
1878
- }, [backendError == null ? void 0 : backendError.fieldErrors, setFieldErrors, setFieldError]);
1531
+ if (!disableFocusOnError && (backendError == null ? void 0 : backendError.fieldErrors)) {
1532
+ focusFirstInvalidInput(
1533
+ backendError.fieldErrors,
1534
+ customFocusHandlers(),
1535
+ formRef.current
1536
+ );
1537
+ }
1538
+ }, [
1539
+ backendError == null ? void 0 : backendError.fieldErrors,
1540
+ customFocusHandlers,
1541
+ disableFocusOnError,
1542
+ setFieldErrors,
1543
+ setFieldError
1544
+ ]);
1879
1545
  useSubmitComplete(hasActiveSubmission, () => {
1880
1546
  endSubmit();
1881
1547
  });
1882
- const handleSubmit = async (e2, target, nativeEvent) => {
1548
+ const handleSubmit = async (e, target, nativeEvent) => {
1883
1549
  startSubmit();
1884
1550
  const submitter = nativeEvent.submitter;
1885
- const formDataToValidate = getDataFromForm(e2.currentTarget);
1551
+ const formDataToValidate = getDataFromForm(e.currentTarget);
1886
1552
  if (submitter == null ? void 0 : submitter.name) {
1887
1553
  formDataToValidate.append(submitter.name, submitter.value);
1888
1554
  }
@@ -1899,14 +1565,14 @@ function ValidatedForm({
1899
1565
  }
1900
1566
  } else {
1901
1567
  setFieldErrors({});
1902
- const eventProxy = formEventProxy(e2);
1568
+ const eventProxy = formEventProxy(e);
1903
1569
  await (onSubmit == null ? void 0 : onSubmit(result.data, eventProxy));
1904
1570
  if (eventProxy.defaultPrevented) {
1905
1571
  endSubmit();
1906
1572
  return;
1907
1573
  }
1908
1574
  if (fetcher)
1909
- fetcher.submit(submitter || e2.currentTarget);
1575
+ fetcher.submit(submitter || e.currentTarget);
1910
1576
  else
1911
1577
  submit(submitter || target, {
1912
1578
  replace: replace2,
@@ -1914,43 +1580,44 @@ function ValidatedForm({
1914
1580
  });
1915
1581
  }
1916
1582
  };
1917
- return /* @__PURE__ */ React.createElement(Form$1, {
1918
- ref: mergeRefs([formRef, formRefProp]),
1919
- ...rest,
1920
- id,
1921
- action,
1922
- method,
1923
- replace: replace2,
1924
- onSubmit: (e2) => {
1925
- e2.preventDefault();
1926
- handleSubmit(
1927
- e2,
1928
- e2.currentTarget,
1929
- e2.nativeEvent
1930
- );
1931
- },
1932
- onReset: (event) => {
1933
- onReset == null ? void 0 : onReset(event);
1934
- if (event.defaultPrevented)
1935
- return;
1936
- reset();
1583
+ return /* @__PURE__ */ jsx(
1584
+ Form,
1585
+ {
1586
+ ref: mergeRefs([formRef, formRefProp]),
1587
+ ...rest,
1588
+ id,
1589
+ action,
1590
+ method,
1591
+ replace: replace2,
1592
+ onSubmit: (e) => {
1593
+ e.preventDefault();
1594
+ handleSubmit(
1595
+ e,
1596
+ e.currentTarget,
1597
+ e.nativeEvent
1598
+ );
1599
+ },
1600
+ onReset: (event) => {
1601
+ onReset == null ? void 0 : onReset(event);
1602
+ if (event.defaultPrevented)
1603
+ return;
1604
+ reset();
1605
+ },
1606
+ children: /* @__PURE__ */ jsx(InternalFormContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs(Fragment, { children: [
1607
+ /* @__PURE__ */ jsx(FormResetter, { formRef, resetAfterSubmit }),
1608
+ subaction && /* @__PURE__ */ jsx("input", { type: "hidden", value: subaction, name: "subaction" }),
1609
+ id && /* @__PURE__ */ jsx("input", { type: "hidden", value: id, name: FORM_ID_FIELD }),
1610
+ children
1611
+ ] }) })
1937
1612
  }
1938
- }, /* @__PURE__ */ React.createElement(InternalFormContext.Provider, {
1939
- value: contextValue
1940
- }, /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(FormResetter, {
1941
- formRef,
1942
- resetAfterSubmit
1943
- }), subaction && /* @__PURE__ */ React.createElement("input", {
1944
- type: "hidden",
1945
- value: subaction,
1946
- name: "subaction"
1947
- }), id && /* @__PURE__ */ React.createElement("input", {
1948
- type: "hidden",
1949
- value: id,
1950
- name: FORM_ID_FIELD
1951
- }), children)));
1613
+ );
1952
1614
  }
1953
- const objectFromPathEntries = (entries) => {
1615
+
1616
+ // src/validation/createValidator.ts
1617
+ import * as R5 from "remeda";
1618
+
1619
+ // src/internal/flatten.ts
1620
+ var objectFromPathEntries = (entries) => {
1954
1621
  const map = new MultiValueMap();
1955
1622
  entries.forEach(([key, value]) => map.add(key, value));
1956
1623
  return [...map.entries()].reduce(
@@ -1958,12 +1625,14 @@ const objectFromPathEntries = (entries) => {
1958
1625
  {}
1959
1626
  );
1960
1627
  };
1961
- const preprocessFormData = (data) => {
1628
+
1629
+ // src/validation/createValidator.ts
1630
+ var preprocessFormData = (data) => {
1962
1631
  if ("entries" in data && typeof data.entries === "function")
1963
1632
  return objectFromPathEntries([...data.entries()]);
1964
1633
  return objectFromPathEntries(Object.entries(data));
1965
1634
  };
1966
- const omitInternalFields = (data) => omit(data, [FORM_ID_FIELD]);
1635
+ var omitInternalFields = (data) => R5.omit(data, [FORM_ID_FIELD]);
1967
1636
  function createValidator(validator) {
1968
1637
  return {
1969
1638
  validate: async (value) => {
@@ -1991,7 +1660,13 @@ function createValidator(validator) {
1991
1660
  validateField: (data, field) => validator.validateField(preprocessFormData(data), field)
1992
1661
  };
1993
1662
  }
1994
- const useFormState = (formId) => {
1663
+
1664
+ // src/userFacingFormContext.ts
1665
+ import { useCallback as useCallback5, useMemo as useMemo4 } from "react";
1666
+
1667
+ // src/unreleased/formStateHooks.ts
1668
+ import { useMemo as useMemo3 } from "react";
1669
+ var useFormState = (formId) => {
1995
1670
  const formContext = useInternalFormContext(formId, "useFormState");
1996
1671
  const isSubmitting = useInternalIsSubmitting(formContext.formId);
1997
1672
  const hasBeenSubmitted = useInternalHasBeenSubmitted(formContext.formId);
@@ -2005,7 +1680,7 @@ const useFormState = (formId) => {
2005
1680
  const fieldErrorsFromState = useFieldErrors(formContext.formId);
2006
1681
  const fieldErrorsToUse = useFieldErrorsForForm(formContext);
2007
1682
  const hydratedFieldErrors = fieldErrorsToUse.hydrateTo(fieldErrorsFromState);
2008
- return useMemo(
1683
+ return useMemo3(
2009
1684
  () => ({
2010
1685
  action,
2011
1686
  subaction,
@@ -2028,7 +1703,7 @@ const useFormState = (formId) => {
2028
1703
  ]
2029
1704
  );
2030
1705
  };
2031
- const useFormHelpers = (formId) => {
1706
+ var useFormHelpers = (formId) => {
2032
1707
  const formContext = useInternalFormContext(formId, "useFormHelpers");
2033
1708
  const setTouched = useSetTouched(formContext);
2034
1709
  const validateField = useValidateField(formContext.formId);
@@ -2038,7 +1713,7 @@ const useFormHelpers = (formId) => {
2038
1713
  const reset = useResetFormElement(formContext.formId);
2039
1714
  const submit = useSubmitForm(formContext.formId);
2040
1715
  const getValues = useFormValues(formContext.formId);
2041
- return useMemo(
1716
+ return useMemo3(
2042
1717
  () => ({
2043
1718
  setTouched,
2044
1719
  validateField,
@@ -2061,7 +1736,9 @@ const useFormHelpers = (formId) => {
2061
1736
  ]
2062
1737
  );
2063
1738
  };
2064
- const useFormContext = (formId) => {
1739
+
1740
+ // src/userFacingFormContext.ts
1741
+ var useFormContext = (formId) => {
2065
1742
  const context = useInternalFormContext(formId, "useFormContext");
2066
1743
  const state = useFormState(formId);
2067
1744
  const {
@@ -2075,7 +1752,7 @@ const useFormContext = (formId) => {
2075
1752
  getValues
2076
1753
  } = useFormHelpers(formId);
2077
1754
  const registerReceiveFocus = useRegisterReceiveFocus(context.formId);
2078
- const clearError = useCallback(
1755
+ const clearError = useCallback5(
2079
1756
  (...names) => {
2080
1757
  names.forEach((name) => {
2081
1758
  internalClearError(name);
@@ -2083,7 +1760,7 @@ const useFormContext = (formId) => {
2083
1760
  },
2084
1761
  [internalClearError]
2085
1762
  );
2086
- return useMemo(
1763
+ return useMemo4(
2087
1764
  () => ({
2088
1765
  ...state,
2089
1766
  setFieldTouched: setTouched,
@@ -2110,7 +1787,13 @@ const useFormContext = (formId) => {
2110
1787
  ]
2111
1788
  );
2112
1789
  };
2113
- const useInternalFieldArray = (context, field, validationBehavior) => {
1790
+
1791
+ // src/internal/state/fieldArray.tsx
1792
+ import { useMemo as useMemo5 } from "react";
1793
+ import { useCallback as useCallback6 } from "react";
1794
+ import invariant4 from "tiny-invariant";
1795
+ import { Fragment as Fragment2, jsx as jsx2 } from "react/jsx-runtime";
1796
+ var useInternalFieldArray = (context, field, validationBehavior) => {
2114
1797
  const value = useFieldDefaultValue(field, context);
2115
1798
  useRegisterControlledField(context, field);
2116
1799
  const hasBeenSubmitted = useInternalHasBeenSubmitted(context.formId);
@@ -2122,12 +1805,12 @@ const useInternalFieldArray = (context, field, validationBehavior) => {
2122
1805
  ...validationBehavior
2123
1806
  };
2124
1807
  const behavior = hasBeenSubmitted ? resolvedValidationBehavior.whenSubmitted : resolvedValidationBehavior.initial;
2125
- const maybeValidate = useCallback(() => {
1808
+ const maybeValidate = useCallback6(() => {
2126
1809
  if (behavior === "onChange") {
2127
1810
  validateField(field);
2128
1811
  }
2129
1812
  }, [behavior, field, validateField]);
2130
- invariant(
1813
+ invariant4(
2131
1814
  value === void 0 || value === null || Array.isArray(value),
2132
1815
  `FieldArray: defaultValue value for ${field} must be an array, null, or undefined`
2133
1816
  );
@@ -2135,7 +1818,7 @@ const useInternalFieldArray = (context, field, validationBehavior) => {
2135
1818
  context.formId,
2136
1819
  (state) => state.controlledFields.array
2137
1820
  );
2138
- const helpers = useMemo(
1821
+ const helpers = useMemo5(
2139
1822
  () => ({
2140
1823
  push: (item) => {
2141
1824
  arr.push(field, item);
@@ -2172,14 +1855,14 @@ const useInternalFieldArray = (context, field, validationBehavior) => {
2172
1855
  }),
2173
1856
  [arr, field, maybeValidate]
2174
1857
  );
2175
- const arrayValue = useMemo(() => value != null ? value : [], [value]);
1858
+ const arrayValue = useMemo5(() => value != null ? value : [], [value]);
2176
1859
  return [arrayValue, helpers, error];
2177
1860
  };
2178
1861
  function useFieldArray(name, { formId, validationBehavior } = {}) {
2179
1862
  const context = useInternalFormContext(formId, "FieldArray");
2180
1863
  return useInternalFieldArray(context, name, validationBehavior);
2181
1864
  }
2182
- const FieldArray = ({
1865
+ var FieldArray = ({
2183
1866
  name,
2184
1867
  children,
2185
1868
  formId,
@@ -2191,7 +1874,20 @@ const FieldArray = ({
2191
1874
  name,
2192
1875
  validationBehavior
2193
1876
  );
2194
- return /* @__PURE__ */ React.createElement(React.Fragment, null, children(value, helpers, error));
1877
+ return /* @__PURE__ */ jsx2(Fragment2, { children: children(value, helpers, error) });
1878
+ };
1879
+ export {
1880
+ FieldArray,
1881
+ ValidatedForm,
1882
+ createValidator,
1883
+ setFormDefaults,
1884
+ useControlField,
1885
+ useField,
1886
+ useFieldArray,
1887
+ useFormContext,
1888
+ useIsSubmitting,
1889
+ useIsValid,
1890
+ useUpdateControlledField,
1891
+ validationError
2195
1892
  };
2196
- export { FieldArray, ValidatedForm, createValidator, setFormDefaults, useControlField, useField, useFieldArray, useFormContext, useIsSubmitting, useIsValid, useUpdateControlledField, validationError };
2197
- //# sourceMappingURL=remix-validated-form.es.js.map
1893
+ //# sourceMappingURL=index.esm.js.map