@vue/runtime-dom 3.5.17 → 3.6.0-alpha.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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @vue/runtime-dom v3.5.17
2
+ * @vue/runtime-dom v3.6.0-alpha.2
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -492,11 +492,11 @@ function patchStyle(el, prev, next) {
492
492
  }
493
493
  const semicolonRE = /[^\\];\s*$/;
494
494
  const importantRE = /\s*!important$/;
495
- function setStyle(style, name, val) {
496
- if (shared.isArray(val)) {
497
- val.forEach((v) => setStyle(style, name, v));
495
+ function setStyle(style, name, rawVal) {
496
+ if (shared.isArray(rawVal)) {
497
+ rawVal.forEach((v) => setStyle(style, name, v));
498
498
  } else {
499
- if (val == null) val = "";
499
+ const val = rawVal == null ? "" : String(rawVal);
500
500
  {
501
501
  if (semicolonRE.test(val)) {
502
502
  runtimeCore.warn(
@@ -569,8 +569,7 @@ function patchDOMProp(el, key, value, parentComponent, attrName) {
569
569
  return;
570
570
  }
571
571
  const tag = el.tagName;
572
- if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
573
- !tag.includes("-")) {
572
+ if (key === "value" && shared.canSetValueDirectly(tag)) {
574
573
  const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value;
575
574
  const newValue = value == null ? (
576
575
  // #11647: value should be set as empty string for null and undefined,
@@ -698,8 +697,6 @@ function patchStopImmediatePropagation(e, value) {
698
697
  }
699
698
  }
700
699
 
701
- const isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter
702
- key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;
703
700
  const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {
704
701
  const isSVG = namespace === "svg";
705
702
  if (key === "class") {
@@ -734,30 +731,15 @@ function shouldSetAsProp(el, key, value, isSVG) {
734
731
  if (key === "innerHTML" || key === "textContent") {
735
732
  return true;
736
733
  }
737
- if (key in el && isNativeOn(key) && shared.isFunction(value)) {
734
+ if (key in el && shared.isNativeOn(key) && shared.isFunction(value)) {
738
735
  return true;
739
736
  }
740
737
  return false;
741
738
  }
742
- if (key === "spellcheck" || key === "draggable" || key === "translate" || key === "autocorrect") {
739
+ if (shared.shouldSetAsAttr(el.tagName, key)) {
743
740
  return false;
744
741
  }
745
- if (key === "form") {
746
- return false;
747
- }
748
- if (key === "list" && el.tagName === "INPUT") {
749
- return false;
750
- }
751
- if (key === "type" && el.tagName === "TEXTAREA") {
752
- return false;
753
- }
754
- if (key === "width" || key === "height") {
755
- const tag = el.tagName;
756
- if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") {
757
- return false;
758
- }
759
- }
760
- if (isNativeOn(key) && shared.isString(value)) {
742
+ if (shared.isNativeOn(key) && shared.isString(value)) {
761
743
  return false;
762
744
  }
763
745
  return key in el;
@@ -1362,28 +1344,12 @@ const assignKey = Symbol("_assign");
1362
1344
  const vModelText = {
1363
1345
  created(el, { modifiers: { lazy, trim, number } }, vnode) {
1364
1346
  el[assignKey] = getModelAssigner(vnode);
1365
- const castToNumber = number || vnode.props && vnode.props.type === "number";
1366
- addEventListener(el, lazy ? "change" : "input", (e) => {
1367
- if (e.target.composing) return;
1368
- let domValue = el.value;
1369
- if (trim) {
1370
- domValue = domValue.trim();
1371
- }
1372
- if (castToNumber) {
1373
- domValue = shared.looseToNumber(domValue);
1374
- }
1375
- el[assignKey](domValue);
1376
- });
1377
- if (trim) {
1378
- addEventListener(el, "change", () => {
1379
- el.value = el.value.trim();
1380
- });
1381
- }
1382
- if (!lazy) {
1383
- addEventListener(el, "compositionstart", onCompositionStart);
1384
- addEventListener(el, "compositionend", onCompositionEnd);
1385
- addEventListener(el, "change", onCompositionEnd);
1386
- }
1347
+ vModelTextInit(
1348
+ el,
1349
+ trim,
1350
+ number || !!(vnode.props && vnode.props.type === "number"),
1351
+ lazy
1352
+ );
1387
1353
  },
1388
1354
  // set value on mounted so it's after min/max for type="range"
1389
1355
  mounted(el, { value }) {
@@ -1391,70 +1357,111 @@ const vModelText = {
1391
1357
  },
1392
1358
  beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {
1393
1359
  el[assignKey] = getModelAssigner(vnode);
1394
- if (el.composing) return;
1395
- const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? shared.looseToNumber(el.value) : el.value;
1396
- const newValue = value == null ? "" : value;
1397
- if (elValue === newValue) {
1360
+ vModelTextUpdate(el, oldValue, value, trim, number, lazy);
1361
+ }
1362
+ };
1363
+ const vModelTextInit = (el, trim, number, lazy, set) => {
1364
+ addEventListener(el, lazy ? "change" : "input", (e) => {
1365
+ if (e.target.composing) return;
1366
+ let domValue = el.value;
1367
+ if (trim) {
1368
+ domValue = domValue.trim();
1369
+ }
1370
+ if (number || el.type === "number") {
1371
+ domValue = shared.looseToNumber(domValue);
1372
+ }
1373
+ (0, el[assignKey])(domValue);
1374
+ });
1375
+ if (trim) {
1376
+ addEventListener(el, "change", () => {
1377
+ el.value = el.value.trim();
1378
+ });
1379
+ }
1380
+ if (!lazy) {
1381
+ addEventListener(el, "compositionstart", onCompositionStart);
1382
+ addEventListener(el, "compositionend", onCompositionEnd);
1383
+ addEventListener(el, "change", onCompositionEnd);
1384
+ }
1385
+ };
1386
+ const vModelTextUpdate = (el, oldValue, value, trim, number, lazy) => {
1387
+ if (el.composing) return;
1388
+ const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? shared.looseToNumber(el.value) : el.value;
1389
+ const newValue = value == null ? "" : value;
1390
+ if (elValue === newValue) {
1391
+ return;
1392
+ }
1393
+ if (document.activeElement === el && el.type !== "range") {
1394
+ if (lazy && value === oldValue) {
1398
1395
  return;
1399
1396
  }
1400
- if (document.activeElement === el && el.type !== "range") {
1401
- if (lazy && value === oldValue) {
1402
- return;
1403
- }
1404
- if (trim && el.value.trim() === newValue) {
1405
- return;
1406
- }
1397
+ if (trim && el.value.trim() === newValue) {
1398
+ return;
1407
1399
  }
1408
- el.value = newValue;
1409
1400
  }
1401
+ el.value = newValue;
1410
1402
  };
1411
1403
  const vModelCheckbox = {
1412
1404
  // #4096 array checkboxes need to be deep traversed
1413
1405
  deep: true,
1414
1406
  created(el, _, vnode) {
1415
1407
  el[assignKey] = getModelAssigner(vnode);
1416
- addEventListener(el, "change", () => {
1417
- const modelValue = el._modelValue;
1418
- const elementValue = getValue(el);
1419
- const checked = el.checked;
1420
- const assign = el[assignKey];
1421
- if (shared.isArray(modelValue)) {
1422
- const index = shared.looseIndexOf(modelValue, elementValue);
1423
- const found = index !== -1;
1424
- if (checked && !found) {
1425
- assign(modelValue.concat(elementValue));
1426
- } else if (!checked && found) {
1427
- const filtered = [...modelValue];
1428
- filtered.splice(index, 1);
1429
- assign(filtered);
1430
- }
1431
- } else if (shared.isSet(modelValue)) {
1432
- const cloned = new Set(modelValue);
1433
- if (checked) {
1434
- cloned.add(elementValue);
1435
- } else {
1436
- cloned.delete(elementValue);
1437
- }
1438
- assign(cloned);
1439
- } else {
1440
- assign(getCheckboxValue(el, checked));
1441
- }
1442
- });
1408
+ vModelCheckboxInit(el);
1443
1409
  },
1444
1410
  // set initial checked on mount to wait for true-value/false-value
1445
- mounted: setChecked,
1411
+ mounted(el, binding, vnode) {
1412
+ vModelCheckboxUpdate(
1413
+ el,
1414
+ binding.oldValue,
1415
+ binding.value,
1416
+ vnode.props.value
1417
+ );
1418
+ },
1446
1419
  beforeUpdate(el, binding, vnode) {
1447
1420
  el[assignKey] = getModelAssigner(vnode);
1448
- setChecked(el, binding, vnode);
1421
+ vModelCheckboxUpdate(
1422
+ el,
1423
+ binding.oldValue,
1424
+ binding.value,
1425
+ vnode.props.value
1426
+ );
1449
1427
  }
1450
1428
  };
1451
- function setChecked(el, { value, oldValue }, vnode) {
1429
+ const vModelCheckboxInit = (el, set) => {
1430
+ addEventListener(el, "change", () => {
1431
+ const assign = el[assignKey];
1432
+ const modelValue = el._modelValue;
1433
+ const elementValue = getValue(el);
1434
+ const checked = el.checked;
1435
+ if (shared.isArray(modelValue)) {
1436
+ const index = shared.looseIndexOf(modelValue, elementValue);
1437
+ const found = index !== -1;
1438
+ if (checked && !found) {
1439
+ assign(modelValue.concat(elementValue));
1440
+ } else if (!checked && found) {
1441
+ const filtered = [...modelValue];
1442
+ filtered.splice(index, 1);
1443
+ assign(filtered);
1444
+ }
1445
+ } else if (shared.isSet(modelValue)) {
1446
+ const cloned = new Set(modelValue);
1447
+ if (checked) {
1448
+ cloned.add(elementValue);
1449
+ } else {
1450
+ cloned.delete(elementValue);
1451
+ }
1452
+ assign(cloned);
1453
+ } else {
1454
+ assign(getCheckboxValue(el, checked));
1455
+ }
1456
+ });
1457
+ };
1458
+ const vModelCheckboxUpdate = (el, oldValue, value, rawValue = getValue(el)) => {
1452
1459
  el._modelValue = value;
1453
1460
  let checked;
1454
1461
  if (shared.isArray(value)) {
1455
- checked = shared.looseIndexOf(value, vnode.props.value) > -1;
1462
+ checked = shared.looseIndexOf(value, rawValue) > -1;
1456
1463
  } else if (shared.isSet(value)) {
1457
- checked = value.has(vnode.props.value);
1464
+ checked = value.has(rawValue);
1458
1465
  } else {
1459
1466
  if (value === oldValue) return;
1460
1467
  checked = shared.looseEqual(value, getCheckboxValue(el, true));
@@ -1462,7 +1469,7 @@ function setChecked(el, { value, oldValue }, vnode) {
1462
1469
  if (el.checked !== checked) {
1463
1470
  el.checked = checked;
1464
1471
  }
1465
- }
1472
+ };
1466
1473
  const vModelRadio = {
1467
1474
  created(el, { value }, vnode) {
1468
1475
  el.checked = shared.looseEqual(value, vnode.props.value);
@@ -1482,36 +1489,38 @@ const vModelSelect = {
1482
1489
  // <select multiple> value need to be deep traversed
1483
1490
  deep: true,
1484
1491
  created(el, { value, modifiers: { number } }, vnode) {
1485
- const isSetModel = shared.isSet(value);
1486
- addEventListener(el, "change", () => {
1487
- const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
1488
- (o) => number ? shared.looseToNumber(getValue(o)) : getValue(o)
1489
- );
1490
- el[assignKey](
1491
- el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
1492
- );
1493
- el._assigning = true;
1494
- runtimeCore.nextTick(() => {
1495
- el._assigning = false;
1496
- });
1497
- });
1492
+ vModelSelectInit(el, value, number);
1498
1493
  el[assignKey] = getModelAssigner(vnode);
1499
1494
  },
1500
1495
  // set value in mounted & updated because <select> relies on its children
1501
1496
  // <option>s.
1502
1497
  mounted(el, { value }) {
1503
- setSelected(el, value);
1498
+ vModelSetSelected(el, value);
1504
1499
  },
1505
1500
  beforeUpdate(el, _binding, vnode) {
1506
1501
  el[assignKey] = getModelAssigner(vnode);
1507
1502
  },
1508
1503
  updated(el, { value }) {
1509
- if (!el._assigning) {
1510
- setSelected(el, value);
1511
- }
1504
+ vModelSetSelected(el, value);
1512
1505
  }
1513
1506
  };
1514
- function setSelected(el, value) {
1507
+ const vModelSelectInit = (el, value, number, set) => {
1508
+ const isSetModel = shared.isSet(value);
1509
+ addEventListener(el, "change", () => {
1510
+ const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
1511
+ (o) => number ? shared.looseToNumber(getValue(o)) : getValue(o)
1512
+ );
1513
+ (0, el[assignKey])(
1514
+ el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
1515
+ );
1516
+ el._assigning = true;
1517
+ runtimeCore.nextTick(() => {
1518
+ el._assigning = false;
1519
+ });
1520
+ });
1521
+ };
1522
+ const vModelSetSelected = (el, value) => {
1523
+ if (el._assigning) return;
1515
1524
  const isMultiple = el.multiple;
1516
1525
  const isArrayValue = shared.isArray(value);
1517
1526
  if (isMultiple && !isArrayValue && !shared.isSet(value)) {
@@ -1542,13 +1551,20 @@ function setSelected(el, value) {
1542
1551
  if (!isMultiple && el.selectedIndex !== -1) {
1543
1552
  el.selectedIndex = -1;
1544
1553
  }
1545
- }
1554
+ };
1546
1555
  function getValue(el) {
1547
1556
  return "_value" in el ? el._value : el.value;
1548
1557
  }
1549
1558
  function getCheckboxValue(el, checked) {
1550
1559
  const key = checked ? "_trueValue" : "_falseValue";
1551
- return key in el ? el[key] : checked;
1560
+ if (key in el) {
1561
+ return el[key];
1562
+ }
1563
+ const attr = checked ? "true-value" : "false-value";
1564
+ if (el.hasAttribute(attr)) {
1565
+ return el.getAttribute(attr);
1566
+ }
1567
+ return checked;
1552
1568
  }
1553
1569
  const vModelDynamic = {
1554
1570
  created(el, binding, vnode) {