@conform-to/dom 1.8.0 → 1.8.1

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.0 / License MIT / Copyright (c) 2024 Edmund Hung
10
+ Version 1.8.1 / 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,9 +53,11 @@ 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 normalizeFieldValue(value: unknown): [string[] | null, FileList | null];
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;
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 normalizeFieldValue(value) {
333
- if (typeof value === 'undefined') {
334
- return [null, null];
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
- if (value === null) {
337
- return [[], createFileList([])];
338
- }
339
- if (typeof value === 'string') {
340
- return [[value], null];
341
- }
342
- if (Array.isArray(value)) {
343
- if (value.every(item => typeof item === 'string')) {
344
- return [Array.from(value), null];
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
- return [null, null];
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
- element.files = file;
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
- if (value) {
377
- var checked = value.includes(element.value);
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 (defaultValue) {
385
- element.defaultChecked = defaultValue.includes(element.value);
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 shouldUnselect = value && value.length === 0;
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 (value) {
394
- var index = value.indexOf(option.value);
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
- value.splice(index, 1);
404
+ _value2.splice(index, 1);
405
405
  }
406
406
  }
407
- if (defaultValue) {
408
- var _index = defaultValue.indexOf(option.value);
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
- defaultValue.splice(_index, 1);
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([...(value !== null && value !== void 0 ? value : []), ...(defaultValue !== null && defaultValue !== void 0 ? defaultValue : [])]);
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, defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.includes(optionValue), value === null || value === void 0 ? void 0 : value.includes(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
- if (valueSetter) {
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) {
@@ -476,6 +476,7 @@ exports.isFieldElement = isFieldElement;
476
476
  exports.isInputElement = isInputElement;
477
477
  exports.isSelectElement = isSelectElement;
478
478
  exports.isTextAreaElement = isTextAreaElement;
479
- exports.normalizeFieldValue = normalizeFieldValue;
479
+ exports.normalizeFileValues = normalizeFileValues;
480
+ exports.normalizeStringValues = normalizeStringValues;
480
481
  exports.requestSubmit = requestSubmit;
481
482
  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 normalizeFieldValue(value) {
329
- if (typeof value === 'undefined') {
330
- return [null, null];
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
- if (value === null) {
333
- return [[], createFileList([])];
334
- }
335
- if (typeof value === 'string') {
336
- return [[value], null];
337
- }
338
- if (Array.isArray(value)) {
339
- if (value.every(item => typeof item === 'string')) {
340
- return [Array.from(value), null];
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
- return [null, null];
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
- element.files = file;
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
- if (value) {
373
- var checked = value.includes(element.value);
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 (defaultValue) {
381
- element.defaultChecked = defaultValue.includes(element.value);
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 shouldUnselect = value && value.length === 0;
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 (value) {
390
- var index = value.indexOf(option.value);
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
- value.splice(index, 1);
400
+ _value2.splice(index, 1);
401
401
  }
402
402
  }
403
- if (defaultValue) {
404
- var _index = defaultValue.indexOf(option.value);
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
- defaultValue.splice(_index, 1);
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([...(value !== null && value !== void 0 ? value : []), ...(defaultValue !== null && defaultValue !== void 0 ? defaultValue : [])]);
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, defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.includes(optionValue), value === null || value === void 0 ? void 0 : value.includes(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
- if (valueSetter) {
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) {
@@ -460,4 +460,4 @@ function updateField(element, options) {
460
460
  }
461
461
  }
462
462
 
463
- export { blur, change, createFileList, createGlobalFormsObserver, focus, getFormAction, getFormEncType, getFormMethod, isFieldElement, isInputElement, isSelectElement, isTextAreaElement, normalizeFieldValue, requestSubmit, updateField };
463
+ export { blur, change, createFileList, createGlobalFormsObserver, focus, getFormAction, getFormEncType, getFormMethod, isFieldElement, isInputElement, isSelectElement, isTextAreaElement, normalizeFileValues, normalizeStringValues, requestSubmit, updateField };
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.0",
6
+ "version": "1.8.1",
7
7
  "main": "./dist/index.js",
8
8
  "module": "./dist/index.mjs",
9
9
  "types": "./dist/index.d.ts",