@conform-to/dom 1.8.0 → 1.8.2
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.
- package/README.md +1 -1
- package/dist/dom.d.ts +4 -1
- package/dist/dom.js +66 -45
- package/dist/dom.mjs +64 -45
- package/dist/form.js +14 -8
- package/dist/form.mjs +15 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
╚══════╝ ╚═════╝ ╚═╝ ╚══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
Version 1.8.
|
|
10
|
+
Version 1.8.2 / License MIT / Copyright (c) 2024 Edmund Hung
|
|
11
11
|
|
|
12
12
|
A type-safe form validation library utilizing web fundamentals to progressively enhance HTML Forms with full support for server frameworks like Remix and Next.js.
|
|
13
13
|
|
package/dist/dom.d.ts
CHANGED
|
@@ -53,13 +53,16 @@ export declare function createGlobalFormsObserver(): {
|
|
|
53
53
|
export declare function change(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement, value: string | string[] | File | File[] | FileList | null): void;
|
|
54
54
|
export declare function focus(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): void;
|
|
55
55
|
export declare function blur(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): void;
|
|
56
|
-
export declare function
|
|
56
|
+
export declare function normalizeStringValues(value: unknown): string[] | undefined;
|
|
57
|
+
export declare function normalizeFileValues(value: unknown): FileList | undefined;
|
|
57
58
|
/**
|
|
58
59
|
* Updates the DOM element with the provided value and defaultValue.
|
|
60
|
+
* If the value or defaultValue is undefined, it will keep the current value instead
|
|
59
61
|
*/
|
|
60
62
|
export declare function updateField(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement, options: {
|
|
61
63
|
value?: unknown;
|
|
62
64
|
defaultValue?: unknown;
|
|
63
65
|
}): void;
|
|
66
|
+
export declare function isDirtyInput(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean;
|
|
64
67
|
export {};
|
|
65
68
|
//# sourceMappingURL=dom.d.ts.map
|
package/dist/dom.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
+
var formdata = require('./formdata.js');
|
|
5
6
|
var util = require('./util.js');
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -329,69 +330,68 @@ function blur(element) {
|
|
|
329
330
|
}));
|
|
330
331
|
element.dispatchEvent(new FocusEvent('blur'));
|
|
331
332
|
}
|
|
332
|
-
function
|
|
333
|
-
if (typeof value === 'undefined')
|
|
334
|
-
|
|
333
|
+
function normalizeStringValues(value) {
|
|
334
|
+
if (typeof value === 'undefined') return undefined;
|
|
335
|
+
if (value === null) return [];
|
|
336
|
+
if (typeof value === 'string') return [value];
|
|
337
|
+
if (Array.isArray(value) && value.every(v => typeof v === 'string')) {
|
|
338
|
+
return Array.from(value);
|
|
335
339
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
if (typeof value === '
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
if (
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
}
|
|
346
|
-
if (value.every(item => item instanceof File)) {
|
|
347
|
-
return [null, createFileList(value)];
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
if (value instanceof FileList) {
|
|
351
|
-
return [null, value];
|
|
352
|
-
}
|
|
353
|
-
if (value instanceof File) {
|
|
354
|
-
return [null, createFileList([value])];
|
|
340
|
+
throw new Error('Expected string or string[] value for string based input');
|
|
341
|
+
}
|
|
342
|
+
function normalizeFileValues(value) {
|
|
343
|
+
if (typeof value === 'undefined') return undefined;
|
|
344
|
+
if (value === null) return createFileList([]);
|
|
345
|
+
if (formdata.isGlobalInstance(value, 'File')) return createFileList([value]);
|
|
346
|
+
if (formdata.isGlobalInstance(value, 'FileList')) return value;
|
|
347
|
+
if (Array.isArray(value) && value.every(item => formdata.isGlobalInstance(item, 'File'))) {
|
|
348
|
+
return createFileList(value);
|
|
355
349
|
}
|
|
356
|
-
|
|
350
|
+
throw new Error('Expected File, FileList or File[] for file input');
|
|
357
351
|
}
|
|
358
352
|
|
|
359
353
|
/**
|
|
360
354
|
* Updates the DOM element with the provided value and defaultValue.
|
|
355
|
+
* If the value or defaultValue is undefined, it will keep the current value instead
|
|
361
356
|
*/
|
|
362
357
|
function updateField(element, options) {
|
|
363
358
|
var _value$;
|
|
364
|
-
var [value, file] = normalizeFieldValue(options.value);
|
|
365
|
-
var [defaultValue] = normalizeFieldValue(options.defaultValue);
|
|
366
359
|
if (isInputElement(element)) {
|
|
367
360
|
switch (element.type) {
|
|
368
361
|
case 'file':
|
|
369
362
|
{
|
|
370
|
-
|
|
363
|
+
var files = normalizeFileValues(options.value);
|
|
364
|
+
if (files) {
|
|
365
|
+
element.files = files;
|
|
366
|
+
}
|
|
371
367
|
return;
|
|
372
368
|
}
|
|
373
369
|
case 'checkbox':
|
|
374
370
|
case 'radio':
|
|
375
371
|
{
|
|
376
|
-
|
|
377
|
-
|
|
372
|
+
var _value = normalizeStringValues(options.value);
|
|
373
|
+
var _defaultValue = normalizeStringValues(options.defaultValue);
|
|
374
|
+
if (_value) {
|
|
375
|
+
var checked = _value.includes(element.value);
|
|
378
376
|
if (element.type === 'checkbox' ? checked !== element.checked : checked) {
|
|
379
377
|
// Simulate a click to update the checked state
|
|
380
378
|
element.click();
|
|
381
379
|
}
|
|
382
380
|
element.checked = checked;
|
|
383
381
|
}
|
|
384
|
-
if (
|
|
385
|
-
element.defaultChecked =
|
|
382
|
+
if (_defaultValue) {
|
|
383
|
+
element.defaultChecked = _defaultValue.includes(element.value);
|
|
386
384
|
}
|
|
387
385
|
return;
|
|
388
386
|
}
|
|
389
387
|
}
|
|
390
388
|
} else if (isSelectElement(element)) {
|
|
391
|
-
var
|
|
389
|
+
var _value2 = normalizeStringValues(options.value);
|
|
390
|
+
var _defaultValue2 = normalizeStringValues(options.defaultValue);
|
|
391
|
+
var shouldUnselect = _value2 && _value2.length === 0;
|
|
392
392
|
for (var option of element.options) {
|
|
393
|
-
if (
|
|
394
|
-
var index =
|
|
393
|
+
if (_value2) {
|
|
394
|
+
var index = _value2.indexOf(option.value);
|
|
395
395
|
var selected = index > -1;
|
|
396
396
|
|
|
397
397
|
// Update the selected state of the option
|
|
@@ -401,11 +401,11 @@ function updateField(element, options) {
|
|
|
401
401
|
|
|
402
402
|
// Remove the option from the value array
|
|
403
403
|
if (selected) {
|
|
404
|
-
|
|
404
|
+
_value2.splice(index, 1);
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
|
-
if (
|
|
408
|
-
var _index =
|
|
407
|
+
if (_defaultValue2) {
|
|
408
|
+
var _index = _defaultValue2.indexOf(option.value);
|
|
409
409
|
var _selected = _index > -1;
|
|
410
410
|
|
|
411
411
|
// Update the selected state of the option
|
|
@@ -415,15 +415,15 @@ function updateField(element, options) {
|
|
|
415
415
|
|
|
416
416
|
// Remove the option from the defaultValue array
|
|
417
417
|
if (_selected) {
|
|
418
|
-
|
|
418
|
+
_defaultValue2.splice(_index, 1);
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
421
|
}
|
|
422
422
|
|
|
423
423
|
// We have already removed all selected options from the value and defaultValue array at this point
|
|
424
|
-
var missingOptions = new Set([...(
|
|
424
|
+
var missingOptions = new Set([...(_value2 !== null && _value2 !== void 0 ? _value2 : []), ...(_defaultValue2 !== null && _defaultValue2 !== void 0 ? _defaultValue2 : [])]);
|
|
425
425
|
for (var optionValue of missingOptions) {
|
|
426
|
-
element.options.add(new Option(optionValue, optionValue,
|
|
426
|
+
element.options.add(new Option(optionValue, optionValue, _defaultValue2 === null || _defaultValue2 === void 0 ? void 0 : _defaultValue2.includes(optionValue), _value2 === null || _value2 === void 0 ? void 0 : _value2.includes(optionValue)));
|
|
427
427
|
}
|
|
428
428
|
|
|
429
429
|
// If the select element is not multiple and the value is an empty array, unset the selected index
|
|
@@ -433,6 +433,8 @@ function updateField(element, options) {
|
|
|
433
433
|
}
|
|
434
434
|
return;
|
|
435
435
|
}
|
|
436
|
+
var value = normalizeStringValues(options.value);
|
|
437
|
+
var defaultValue = normalizeStringValues(options.defaultValue);
|
|
436
438
|
var inputValue = (_value$ = value === null || value === void 0 ? void 0 : value[0]) !== null && _value$ !== void 0 ? _value$ : '';
|
|
437
439
|
if (element.value !== inputValue) {
|
|
438
440
|
/**
|
|
@@ -450,12 +452,10 @@ function updateField(element, options) {
|
|
|
450
452
|
} = Object.getOwnPropertyDescriptor(prototype, 'value') || {};
|
|
451
453
|
if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
|
|
452
454
|
prototypeValueSetter.call(element, inputValue);
|
|
455
|
+
} else if (valueSetter) {
|
|
456
|
+
valueSetter.call(element, inputValue);
|
|
453
457
|
} else {
|
|
454
|
-
|
|
455
|
-
valueSetter.call(element, inputValue);
|
|
456
|
-
} else {
|
|
457
|
-
throw new Error('The given element does not have a value setter');
|
|
458
|
-
}
|
|
458
|
+
throw new Error('The given element does not have a value setter');
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
461
|
if (defaultValue) {
|
|
@@ -463,6 +463,25 @@ function updateField(element, options) {
|
|
|
463
463
|
element.defaultValue = (_defaultValue$ = defaultValue[0]) !== null && _defaultValue$ !== void 0 ? _defaultValue$ : '';
|
|
464
464
|
}
|
|
465
465
|
}
|
|
466
|
+
function isDirtyInput(element) {
|
|
467
|
+
var _element$files$length, _element$files;
|
|
468
|
+
if (isInputElement(element)) {
|
|
469
|
+
switch (element.type) {
|
|
470
|
+
case 'checkbox':
|
|
471
|
+
case 'radio':
|
|
472
|
+
return element.checked !== element.defaultChecked;
|
|
473
|
+
case 'file':
|
|
474
|
+
return ((_element$files$length = (_element$files = element.files) === null || _element$files === void 0 ? void 0 : _element$files.length) !== null && _element$files$length !== void 0 ? _element$files$length : 0) > 0;
|
|
475
|
+
default:
|
|
476
|
+
return element.value !== element.defaultValue;
|
|
477
|
+
}
|
|
478
|
+
} else if (isSelectElement(element)) {
|
|
479
|
+
return Array.from(element.options).some(option => option.selected !== option.defaultSelected);
|
|
480
|
+
} else if (isTextAreaElement(element)) {
|
|
481
|
+
return element.value !== element.defaultValue;
|
|
482
|
+
}
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
466
485
|
|
|
467
486
|
exports.blur = blur;
|
|
468
487
|
exports.change = change;
|
|
@@ -472,10 +491,12 @@ exports.focus = focus;
|
|
|
472
491
|
exports.getFormAction = getFormAction;
|
|
473
492
|
exports.getFormEncType = getFormEncType;
|
|
474
493
|
exports.getFormMethod = getFormMethod;
|
|
494
|
+
exports.isDirtyInput = isDirtyInput;
|
|
475
495
|
exports.isFieldElement = isFieldElement;
|
|
476
496
|
exports.isInputElement = isInputElement;
|
|
477
497
|
exports.isSelectElement = isSelectElement;
|
|
478
498
|
exports.isTextAreaElement = isTextAreaElement;
|
|
479
|
-
exports.
|
|
499
|
+
exports.normalizeFileValues = normalizeFileValues;
|
|
500
|
+
exports.normalizeStringValues = normalizeStringValues;
|
|
480
501
|
exports.requestSubmit = requestSubmit;
|
|
481
502
|
exports.updateField = updateField;
|
package/dist/dom.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isGlobalInstance } from './formdata.mjs';
|
|
1
2
|
import { invariant } from './util.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -325,69 +326,68 @@ function blur(element) {
|
|
|
325
326
|
}));
|
|
326
327
|
element.dispatchEvent(new FocusEvent('blur'));
|
|
327
328
|
}
|
|
328
|
-
function
|
|
329
|
-
if (typeof value === 'undefined')
|
|
330
|
-
|
|
329
|
+
function normalizeStringValues(value) {
|
|
330
|
+
if (typeof value === 'undefined') return undefined;
|
|
331
|
+
if (value === null) return [];
|
|
332
|
+
if (typeof value === 'string') return [value];
|
|
333
|
+
if (Array.isArray(value) && value.every(v => typeof v === 'string')) {
|
|
334
|
+
return Array.from(value);
|
|
331
335
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
if (typeof value === '
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
if (
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
}
|
|
342
|
-
if (value.every(item => item instanceof File)) {
|
|
343
|
-
return [null, createFileList(value)];
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
if (value instanceof FileList) {
|
|
347
|
-
return [null, value];
|
|
348
|
-
}
|
|
349
|
-
if (value instanceof File) {
|
|
350
|
-
return [null, createFileList([value])];
|
|
336
|
+
throw new Error('Expected string or string[] value for string based input');
|
|
337
|
+
}
|
|
338
|
+
function normalizeFileValues(value) {
|
|
339
|
+
if (typeof value === 'undefined') return undefined;
|
|
340
|
+
if (value === null) return createFileList([]);
|
|
341
|
+
if (isGlobalInstance(value, 'File')) return createFileList([value]);
|
|
342
|
+
if (isGlobalInstance(value, 'FileList')) return value;
|
|
343
|
+
if (Array.isArray(value) && value.every(item => isGlobalInstance(item, 'File'))) {
|
|
344
|
+
return createFileList(value);
|
|
351
345
|
}
|
|
352
|
-
|
|
346
|
+
throw new Error('Expected File, FileList or File[] for file input');
|
|
353
347
|
}
|
|
354
348
|
|
|
355
349
|
/**
|
|
356
350
|
* Updates the DOM element with the provided value and defaultValue.
|
|
351
|
+
* If the value or defaultValue is undefined, it will keep the current value instead
|
|
357
352
|
*/
|
|
358
353
|
function updateField(element, options) {
|
|
359
354
|
var _value$;
|
|
360
|
-
var [value, file] = normalizeFieldValue(options.value);
|
|
361
|
-
var [defaultValue] = normalizeFieldValue(options.defaultValue);
|
|
362
355
|
if (isInputElement(element)) {
|
|
363
356
|
switch (element.type) {
|
|
364
357
|
case 'file':
|
|
365
358
|
{
|
|
366
|
-
|
|
359
|
+
var files = normalizeFileValues(options.value);
|
|
360
|
+
if (files) {
|
|
361
|
+
element.files = files;
|
|
362
|
+
}
|
|
367
363
|
return;
|
|
368
364
|
}
|
|
369
365
|
case 'checkbox':
|
|
370
366
|
case 'radio':
|
|
371
367
|
{
|
|
372
|
-
|
|
373
|
-
|
|
368
|
+
var _value = normalizeStringValues(options.value);
|
|
369
|
+
var _defaultValue = normalizeStringValues(options.defaultValue);
|
|
370
|
+
if (_value) {
|
|
371
|
+
var checked = _value.includes(element.value);
|
|
374
372
|
if (element.type === 'checkbox' ? checked !== element.checked : checked) {
|
|
375
373
|
// Simulate a click to update the checked state
|
|
376
374
|
element.click();
|
|
377
375
|
}
|
|
378
376
|
element.checked = checked;
|
|
379
377
|
}
|
|
380
|
-
if (
|
|
381
|
-
element.defaultChecked =
|
|
378
|
+
if (_defaultValue) {
|
|
379
|
+
element.defaultChecked = _defaultValue.includes(element.value);
|
|
382
380
|
}
|
|
383
381
|
return;
|
|
384
382
|
}
|
|
385
383
|
}
|
|
386
384
|
} else if (isSelectElement(element)) {
|
|
387
|
-
var
|
|
385
|
+
var _value2 = normalizeStringValues(options.value);
|
|
386
|
+
var _defaultValue2 = normalizeStringValues(options.defaultValue);
|
|
387
|
+
var shouldUnselect = _value2 && _value2.length === 0;
|
|
388
388
|
for (var option of element.options) {
|
|
389
|
-
if (
|
|
390
|
-
var index =
|
|
389
|
+
if (_value2) {
|
|
390
|
+
var index = _value2.indexOf(option.value);
|
|
391
391
|
var selected = index > -1;
|
|
392
392
|
|
|
393
393
|
// Update the selected state of the option
|
|
@@ -397,11 +397,11 @@ function updateField(element, options) {
|
|
|
397
397
|
|
|
398
398
|
// Remove the option from the value array
|
|
399
399
|
if (selected) {
|
|
400
|
-
|
|
400
|
+
_value2.splice(index, 1);
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
|
-
if (
|
|
404
|
-
var _index =
|
|
403
|
+
if (_defaultValue2) {
|
|
404
|
+
var _index = _defaultValue2.indexOf(option.value);
|
|
405
405
|
var _selected = _index > -1;
|
|
406
406
|
|
|
407
407
|
// Update the selected state of the option
|
|
@@ -411,15 +411,15 @@ function updateField(element, options) {
|
|
|
411
411
|
|
|
412
412
|
// Remove the option from the defaultValue array
|
|
413
413
|
if (_selected) {
|
|
414
|
-
|
|
414
|
+
_defaultValue2.splice(_index, 1);
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
417
|
}
|
|
418
418
|
|
|
419
419
|
// We have already removed all selected options from the value and defaultValue array at this point
|
|
420
|
-
var missingOptions = new Set([...(
|
|
420
|
+
var missingOptions = new Set([...(_value2 !== null && _value2 !== void 0 ? _value2 : []), ...(_defaultValue2 !== null && _defaultValue2 !== void 0 ? _defaultValue2 : [])]);
|
|
421
421
|
for (var optionValue of missingOptions) {
|
|
422
|
-
element.options.add(new Option(optionValue, optionValue,
|
|
422
|
+
element.options.add(new Option(optionValue, optionValue, _defaultValue2 === null || _defaultValue2 === void 0 ? void 0 : _defaultValue2.includes(optionValue), _value2 === null || _value2 === void 0 ? void 0 : _value2.includes(optionValue)));
|
|
423
423
|
}
|
|
424
424
|
|
|
425
425
|
// If the select element is not multiple and the value is an empty array, unset the selected index
|
|
@@ -429,6 +429,8 @@ function updateField(element, options) {
|
|
|
429
429
|
}
|
|
430
430
|
return;
|
|
431
431
|
}
|
|
432
|
+
var value = normalizeStringValues(options.value);
|
|
433
|
+
var defaultValue = normalizeStringValues(options.defaultValue);
|
|
432
434
|
var inputValue = (_value$ = value === null || value === void 0 ? void 0 : value[0]) !== null && _value$ !== void 0 ? _value$ : '';
|
|
433
435
|
if (element.value !== inputValue) {
|
|
434
436
|
/**
|
|
@@ -446,12 +448,10 @@ function updateField(element, options) {
|
|
|
446
448
|
} = Object.getOwnPropertyDescriptor(prototype, 'value') || {};
|
|
447
449
|
if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
|
|
448
450
|
prototypeValueSetter.call(element, inputValue);
|
|
451
|
+
} else if (valueSetter) {
|
|
452
|
+
valueSetter.call(element, inputValue);
|
|
449
453
|
} else {
|
|
450
|
-
|
|
451
|
-
valueSetter.call(element, inputValue);
|
|
452
|
-
} else {
|
|
453
|
-
throw new Error('The given element does not have a value setter');
|
|
454
|
-
}
|
|
454
|
+
throw new Error('The given element does not have a value setter');
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
457
|
if (defaultValue) {
|
|
@@ -459,5 +459,24 @@ function updateField(element, options) {
|
|
|
459
459
|
element.defaultValue = (_defaultValue$ = defaultValue[0]) !== null && _defaultValue$ !== void 0 ? _defaultValue$ : '';
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
|
+
function isDirtyInput(element) {
|
|
463
|
+
var _element$files$length, _element$files;
|
|
464
|
+
if (isInputElement(element)) {
|
|
465
|
+
switch (element.type) {
|
|
466
|
+
case 'checkbox':
|
|
467
|
+
case 'radio':
|
|
468
|
+
return element.checked !== element.defaultChecked;
|
|
469
|
+
case 'file':
|
|
470
|
+
return ((_element$files$length = (_element$files = element.files) === null || _element$files === void 0 ? void 0 : _element$files.length) !== null && _element$files$length !== void 0 ? _element$files$length : 0) > 0;
|
|
471
|
+
default:
|
|
472
|
+
return element.value !== element.defaultValue;
|
|
473
|
+
}
|
|
474
|
+
} else if (isSelectElement(element)) {
|
|
475
|
+
return Array.from(element.options).some(option => option.selected !== option.defaultSelected);
|
|
476
|
+
} else if (isTextAreaElement(element)) {
|
|
477
|
+
return element.value !== element.defaultValue;
|
|
478
|
+
}
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
462
481
|
|
|
463
|
-
export { blur, change, createFileList, createGlobalFormsObserver, focus, getFormAction, getFormEncType, getFormMethod, isFieldElement, isInputElement, isSelectElement, isTextAreaElement,
|
|
482
|
+
export { blur, change, createFileList, createGlobalFormsObserver, focus, getFormAction, getFormEncType, getFormMethod, isDirtyInput, isFieldElement, isInputElement, isSelectElement, isTextAreaElement, normalizeFileValues, normalizeStringValues, requestSubmit, updateField };
|
package/dist/form.js
CHANGED
|
@@ -582,12 +582,15 @@ function createFormContext(options) {
|
|
|
582
582
|
var paths = formdata.getChildPaths(parentPaths, element.name);
|
|
583
583
|
if (paths) {
|
|
584
584
|
var value = formdata.getValue(intent.payload.value, formdata.formatPaths(paths));
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
585
|
+
var inputValue = typeof value === 'string' || Array.isArray(value) && value.every(item => typeof item === 'string') ? value : undefined;
|
|
586
|
+
if (typeof inputValue !== 'undefined' || _name5 === '' && paths.length > 1) {
|
|
587
|
+
dom.updateField(element, {
|
|
588
|
+
value: inputValue !== null && inputValue !== void 0 ? inputValue : null
|
|
589
|
+
});
|
|
588
590
|
|
|
589
|
-
|
|
590
|
-
|
|
591
|
+
// Update the element attribute to notify useControl / useInputControl hook
|
|
592
|
+
element.dataset.conform = util.generateId();
|
|
593
|
+
}
|
|
591
594
|
}
|
|
592
595
|
}
|
|
593
596
|
}
|
|
@@ -599,10 +602,13 @@ function createFormContext(options) {
|
|
|
599
602
|
for (var _element of formElement.elements) {
|
|
600
603
|
if (dom.isFieldElement(_element) && _element.name && formdata.isPrefix(_element.name, prefix)) {
|
|
601
604
|
var _value2 = formdata.getValue(meta.defaultValue, _element.name);
|
|
602
|
-
var defaultValue = typeof _value2 === 'string' || Array.isArray(_value2) && _value2.every(item => typeof item === 'string') ? _value2 :
|
|
605
|
+
var defaultValue = typeof _value2 === 'string' || Array.isArray(_value2) && _value2.every(item => typeof item === 'string') ? _value2 : undefined;
|
|
606
|
+
if (typeof defaultValue === 'undefined' && !_element.dataset.conform && 'defaultValue' in _element && !dom.isDirtyInput(_element)) {
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
603
609
|
dom.updateField(_element, {
|
|
604
|
-
defaultValue,
|
|
605
|
-
value: defaultValue
|
|
610
|
+
defaultValue: defaultValue,
|
|
611
|
+
value: defaultValue !== null && defaultValue !== void 0 ? defaultValue : null
|
|
606
612
|
});
|
|
607
613
|
|
|
608
614
|
// Update the element attribute to notify useControl / useInputControl hook
|
package/dist/form.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { objectSpread2 as _objectSpread2 } from './_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
2
|
import { flatten, formatName, getValue, isPlainObject, isPrefix, setValue, normalize, getFormData, getPaths, getChildPaths, formatPaths } from './formdata.mjs';
|
|
3
|
-
import { getFormAction, getFormEncType, getFormMethod, isFieldElement, requestSubmit, updateField } from './dom.mjs';
|
|
3
|
+
import { getFormAction, getFormEncType, getFormMethod, isFieldElement, requestSubmit, isDirtyInput, updateField } from './dom.mjs';
|
|
4
4
|
import { generateId, clone, invariant } from './util.mjs';
|
|
5
5
|
import { serialize, setListState, setListValue, setState, INTENT, serializeIntent, root, getSubmissionContext } from './submission.mjs';
|
|
6
6
|
|
|
@@ -578,12 +578,15 @@ function createFormContext(options) {
|
|
|
578
578
|
var paths = getChildPaths(parentPaths, element.name);
|
|
579
579
|
if (paths) {
|
|
580
580
|
var value = getValue(intent.payload.value, formatPaths(paths));
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
581
|
+
var inputValue = typeof value === 'string' || Array.isArray(value) && value.every(item => typeof item === 'string') ? value : undefined;
|
|
582
|
+
if (typeof inputValue !== 'undefined' || _name5 === '' && paths.length > 1) {
|
|
583
|
+
updateField(element, {
|
|
584
|
+
value: inputValue !== null && inputValue !== void 0 ? inputValue : null
|
|
585
|
+
});
|
|
584
586
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
+
// Update the element attribute to notify useControl / useInputControl hook
|
|
588
|
+
element.dataset.conform = generateId();
|
|
589
|
+
}
|
|
587
590
|
}
|
|
588
591
|
}
|
|
589
592
|
}
|
|
@@ -595,10 +598,13 @@ function createFormContext(options) {
|
|
|
595
598
|
for (var _element of formElement.elements) {
|
|
596
599
|
if (isFieldElement(_element) && _element.name && isPrefix(_element.name, prefix)) {
|
|
597
600
|
var _value2 = getValue(meta.defaultValue, _element.name);
|
|
598
|
-
var defaultValue = typeof _value2 === 'string' || Array.isArray(_value2) && _value2.every(item => typeof item === 'string') ? _value2 :
|
|
601
|
+
var defaultValue = typeof _value2 === 'string' || Array.isArray(_value2) && _value2.every(item => typeof item === 'string') ? _value2 : undefined;
|
|
602
|
+
if (typeof defaultValue === 'undefined' && !_element.dataset.conform && 'defaultValue' in _element && !isDirtyInput(_element)) {
|
|
603
|
+
continue;
|
|
604
|
+
}
|
|
599
605
|
updateField(_element, {
|
|
600
|
-
defaultValue,
|
|
601
|
-
value: defaultValue
|
|
606
|
+
defaultValue: defaultValue,
|
|
607
|
+
value: defaultValue !== null && defaultValue !== void 0 ? defaultValue : null
|
|
602
608
|
});
|
|
603
609
|
|
|
604
610
|
// Update the element attribute to notify useControl / useInputControl hook
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "A set of opinionated helpers built on top of the Constraint Validation API",
|
|
4
4
|
"homepage": "https://conform.guide",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"version": "1.8.
|
|
6
|
+
"version": "1.8.2",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"module": "./dist/index.mjs",
|
|
9
9
|
"types": "./dist/index.d.ts",
|