@conform-to/dom 1.8.1 → 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 CHANGED
@@ -7,7 +7,7 @@
7
7
  ╚══════╝ ╚═════╝ ╚═╝ ╚══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
8
8
  ```
9
9
 
10
- Version 1.8.1 / License MIT / Copyright (c) 2024 Edmund Hung
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
@@ -63,5 +63,6 @@ export declare function updateField(element: HTMLInputElement | HTMLSelectElemen
63
63
  value?: unknown;
64
64
  defaultValue?: unknown;
65
65
  }): void;
66
+ export declare function isDirtyInput(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean;
66
67
  export {};
67
68
  //# sourceMappingURL=dom.d.ts.map
package/dist/dom.js CHANGED
@@ -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,6 +491,7 @@ 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;
package/dist/dom.mjs CHANGED
@@ -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, normalizeFileValues, normalizeStringValues, requestSubmit, updateField };
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
- dom.updateField(element, {
586
- value: typeof value === 'string' || Array.isArray(value) && value.every(item => typeof item === 'string') ? value : null
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
- // Update the element attribute to notify useControl / useInputControl hook
590
- element.dataset.conform = util.generateId();
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 : null;
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
- updateField(element, {
582
- value: typeof value === 'string' || Array.isArray(value) && value.every(item => typeof item === 'string') ? value : null
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
- // Update the element attribute to notify useControl / useInputControl hook
586
- element.dataset.conform = generateId();
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 : null;
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.1",
6
+ "version": "1.8.2",
7
7
  "main": "./dist/index.js",
8
8
  "module": "./dist/index.mjs",
9
9
  "types": "./dist/index.d.ts",