@vue/runtime-dom 3.2.30 → 3.2.33

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.
@@ -351,8 +351,17 @@ var VueRuntimeDOM = (function (exports) {
351
351
  let activeEffectScope;
352
352
  class EffectScope {
353
353
  constructor(detached = false) {
354
+ /**
355
+ * @internal
356
+ */
354
357
  this.active = true;
358
+ /**
359
+ * @internal
360
+ */
355
361
  this.effects = [];
362
+ /**
363
+ * @internal
364
+ */
356
365
  this.cleanups = [];
357
366
  if (!detached && activeEffectScope) {
358
367
  this.parent = activeEffectScope;
@@ -362,21 +371,30 @@ var VueRuntimeDOM = (function (exports) {
362
371
  }
363
372
  run(fn) {
364
373
  if (this.active) {
374
+ const currentEffectScope = activeEffectScope;
365
375
  try {
366
376
  activeEffectScope = this;
367
377
  return fn();
368
378
  }
369
379
  finally {
370
- activeEffectScope = this.parent;
380
+ activeEffectScope = currentEffectScope;
371
381
  }
372
382
  }
373
383
  else {
374
384
  warn(`cannot run an inactive effect scope.`);
375
385
  }
376
386
  }
387
+ /**
388
+ * This should only be called on non-detached scopes
389
+ * @internal
390
+ */
377
391
  on() {
378
392
  activeEffectScope = this;
379
393
  }
394
+ /**
395
+ * This should only be called on non-detached scopes
396
+ * @internal
397
+ */
380
398
  off() {
381
399
  activeEffectScope = this.parent;
382
400
  }
@@ -518,10 +536,17 @@ var VueRuntimeDOM = (function (exports) {
518
536
  activeEffect = this.parent;
519
537
  shouldTrack = lastShouldTrack;
520
538
  this.parent = undefined;
539
+ if (this.deferStop) {
540
+ this.stop();
541
+ }
521
542
  }
522
543
  }
523
544
  stop() {
524
- if (this.active) {
545
+ // stopped while running itself - defer the cleanup
546
+ if (activeEffect === this) {
547
+ this.deferStop = true;
548
+ }
549
+ else if (this.active) {
525
550
  cleanupEffect(this);
526
551
  if (this.onStop) {
527
552
  this.onStop();
@@ -600,9 +625,7 @@ var VueRuntimeDOM = (function (exports) {
600
625
  dep.add(activeEffect);
601
626
  activeEffect.deps.push(dep);
602
627
  if (activeEffect.onTrack) {
603
- activeEffect.onTrack(Object.assign({
604
- effect: activeEffect
605
- }, debuggerEventExtraInfo));
628
+ activeEffect.onTrack(Object.assign({ effect: activeEffect }, debuggerEventExtraInfo));
606
629
  }
607
630
  }
608
631
  }
@@ -698,7 +721,9 @@ var VueRuntimeDOM = (function (exports) {
698
721
  }
699
722
 
700
723
  const isNonTrackableKeys = /*#__PURE__*/ makeMap(`__proto__,__v_isRef,__isVue`);
701
- const builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol)
724
+ const builtInSymbols = new Set(
725
+ /*#__PURE__*/
726
+ Object.getOwnPropertyNames(Symbol)
702
727
  .map(key => Symbol[key])
703
728
  .filter(isSymbol));
704
729
  const get = /*#__PURE__*/ createGetter();
@@ -850,13 +875,13 @@ var VueRuntimeDOM = (function (exports) {
850
875
  get: readonlyGet,
851
876
  set(target, key) {
852
877
  {
853
- console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
878
+ warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
854
879
  }
855
880
  return true;
856
881
  },
857
882
  deleteProperty(target, key) {
858
883
  {
859
- console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
884
+ warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
860
885
  }
861
886
  return true;
862
887
  }
@@ -1684,7 +1709,7 @@ var VueRuntimeDOM = (function (exports) {
1684
1709
  const pendingPostFlushCbs = [];
1685
1710
  let activePostFlushCbs = null;
1686
1711
  let postFlushIndex = 0;
1687
- const resolvedPromise = Promise.resolve();
1712
+ const resolvedPromise = /*#__PURE__*/ Promise.resolve();
1688
1713
  let currentFlushPromise = null;
1689
1714
  let currentPreFlushParentJob = null;
1690
1715
  const RECURSION_LIMIT = 100;
@@ -2099,6 +2124,8 @@ var VueRuntimeDOM = (function (exports) {
2099
2124
  }
2100
2125
 
2101
2126
  function emit$1(instance, event, ...rawArgs) {
2127
+ if (instance.isUnmounted)
2128
+ return;
2102
2129
  const props = instance.vnode.props || EMPTY_OBJ;
2103
2130
  {
2104
2131
  const { emitsOptions, propsOptions: [propsOptions] } = instance;
@@ -3086,12 +3113,10 @@ var VueRuntimeDOM = (function (exports) {
3086
3113
  return doWatch(effect, null, options);
3087
3114
  }
3088
3115
  function watchPostEffect(effect, options) {
3089
- return doWatch(effect, null, (Object.assign(options || {}, { flush: 'post' })
3090
- ));
3116
+ return doWatch(effect, null, (Object.assign(Object.assign({}, options), { flush: 'post' }) ));
3091
3117
  }
3092
3118
  function watchSyncEffect(effect, options) {
3093
- return doWatch(effect, null, (Object.assign(options || {}, { flush: 'sync' })
3094
- ));
3119
+ return doWatch(effect, null, (Object.assign(Object.assign({}, options), { flush: 'sync' }) ));
3095
3120
  }
3096
3121
  // initial value for watchers to trigger on undefined initial values
3097
3122
  const INITIAL_WATCHER_VALUE = {};
@@ -3377,10 +3402,22 @@ var VueRuntimeDOM = (function (exports) {
3377
3402
  if (!children || !children.length) {
3378
3403
  return;
3379
3404
  }
3380
- // warn multiple elements
3405
+ let child = children[0];
3381
3406
  if (children.length > 1) {
3382
- warn$1('<transition> can only be used on a single element or component. Use ' +
3383
- '<transition-group> for lists.');
3407
+ let hasFound = false;
3408
+ // locate first non-comment child
3409
+ for (const c of children) {
3410
+ if (c.type !== Comment) {
3411
+ if (hasFound) {
3412
+ // warn more than one non-comment child
3413
+ warn$1('<transition> can only be used on a single element or component. ' +
3414
+ 'Use <transition-group> for lists.');
3415
+ break;
3416
+ }
3417
+ child = c;
3418
+ hasFound = true;
3419
+ }
3420
+ }
3384
3421
  }
3385
3422
  // there's no need to track reactivity for these props so use the raw
3386
3423
  // props for a bit better perf
@@ -3388,11 +3425,11 @@ var VueRuntimeDOM = (function (exports) {
3388
3425
  const { mode } = rawProps;
3389
3426
  // check mode
3390
3427
  if (mode &&
3391
- mode !== 'in-out' && mode !== 'out-in' && mode !== 'default') {
3428
+ mode !== 'in-out' &&
3429
+ mode !== 'out-in' &&
3430
+ mode !== 'default') {
3392
3431
  warn$1(`invalid <transition> mode: ${mode}`);
3393
3432
  }
3394
- // at this point children has a guaranteed length of 1.
3395
- const child = children[0];
3396
3433
  if (state.isLeaving) {
3397
3434
  return emptyPlaceholder(child);
3398
3435
  }
@@ -3615,20 +3652,24 @@ var VueRuntimeDOM = (function (exports) {
3615
3652
  vnode.transition = hooks;
3616
3653
  }
3617
3654
  }
3618
- function getTransitionRawChildren(children, keepComment = false) {
3655
+ function getTransitionRawChildren(children, keepComment = false, parentKey) {
3619
3656
  let ret = [];
3620
3657
  let keyedFragmentCount = 0;
3621
3658
  for (let i = 0; i < children.length; i++) {
3622
- const child = children[i];
3659
+ let child = children[i];
3660
+ // #5360 inherit parent key in case of <template v-for>
3661
+ const key = parentKey == null
3662
+ ? child.key
3663
+ : String(parentKey) + String(child.key != null ? child.key : i);
3623
3664
  // handle fragment children case, e.g. v-for
3624
3665
  if (child.type === Fragment) {
3625
3666
  if (child.patchFlag & 128 /* KEYED_FRAGMENT */)
3626
3667
  keyedFragmentCount++;
3627
- ret = ret.concat(getTransitionRawChildren(child.children, keepComment));
3668
+ ret = ret.concat(getTransitionRawChildren(child.children, keepComment, key));
3628
3669
  }
3629
3670
  // comment placeholders should be skipped, e.g. v-if
3630
3671
  else if (keepComment || child.type !== Comment) {
3631
- ret.push(child);
3672
+ ret.push(key != null ? cloneVNode(child, { key }) : child);
3632
3673
  }
3633
3674
  }
3634
3675
  // #1126 if a transition children list contains multiple sub fragments, these
@@ -4594,6 +4635,10 @@ var VueRuntimeDOM = (function (exports) {
4594
4635
  const propsToUpdate = instance.vnode.dynamicProps;
4595
4636
  for (let i = 0; i < propsToUpdate.length; i++) {
4596
4637
  let key = propsToUpdate[i];
4638
+ // skip if the prop key is a declared emit event listener
4639
+ if (isEmitListener(instance.emitsOptions, key)) {
4640
+ continue;
4641
+ }
4597
4642
  // PROPS flag guarantees rawProps to be non-null
4598
4643
  const value = rawProps[key];
4599
4644
  if (options) {
@@ -5118,7 +5163,8 @@ var VueRuntimeDOM = (function (exports) {
5118
5163
  warn$1(`withDirectives can only be used inside render functions.`);
5119
5164
  return vnode;
5120
5165
  }
5121
- const instance = internalInstance.proxy;
5166
+ const instance = getExposeProxy(internalInstance) ||
5167
+ internalInstance.proxy;
5122
5168
  const bindings = vnode.dirs || (vnode.dirs = []);
5123
5169
  for (let i = 0; i < directives.length; i++) {
5124
5170
  let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
@@ -5190,6 +5236,9 @@ var VueRuntimeDOM = (function (exports) {
5190
5236
  let uid = 0;
5191
5237
  function createAppAPI(render, hydrate) {
5192
5238
  return function createApp(rootComponent, rootProps = null) {
5239
+ if (!isFunction(rootComponent)) {
5240
+ rootComponent = Object.assign({}, rootComponent);
5241
+ }
5193
5242
  if (rootProps != null && !isObject(rootProps)) {
5194
5243
  warn$1(`root props passed to app.mount() must be an object.`);
5195
5244
  rootProps = null;
@@ -5386,6 +5435,9 @@ var VueRuntimeDOM = (function (exports) {
5386
5435
  if (!isArray(existing)) {
5387
5436
  if (_isString) {
5388
5437
  refs[ref] = [refValue];
5438
+ if (hasOwn(setupState, ref)) {
5439
+ setupState[ref] = refs[ref];
5440
+ }
5389
5441
  }
5390
5442
  else {
5391
5443
  ref.value = [refValue];
@@ -5584,7 +5636,8 @@ var VueRuntimeDOM = (function (exports) {
5584
5636
  // e.g. <option :value="obj">, <input type="checkbox" :true-value="1">
5585
5637
  const forcePatchValue = (type === 'input' && dirs) || type === 'option';
5586
5638
  // skip props & children if this is hoisted static nodes
5587
- if (forcePatchValue || patchFlag !== -1 /* HOISTED */) {
5639
+ // #5405 in dev, always hydrate children for HMR
5640
+ {
5588
5641
  if (dirs) {
5589
5642
  invokeDirectiveHook(vnode, null, parentComponent, 'created');
5590
5643
  }
@@ -5757,7 +5810,7 @@ var VueRuntimeDOM = (function (exports) {
5757
5810
  perf.mark(`vue-${type}-${instance.uid}`);
5758
5811
  }
5759
5812
  {
5760
- devtoolsPerfStart(instance, type, supported ? perf.now() : Date.now());
5813
+ devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
5761
5814
  }
5762
5815
  }
5763
5816
  function endMeasure(instance, type) {
@@ -5770,7 +5823,7 @@ var VueRuntimeDOM = (function (exports) {
5770
5823
  perf.clearMarks(endTag);
5771
5824
  }
5772
5825
  {
5773
- devtoolsPerfEnd(instance, type, supported ? perf.now() : Date.now());
5826
+ devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
5774
5827
  }
5775
5828
  }
5776
5829
  function isSupported() {
@@ -6898,7 +6951,22 @@ var VueRuntimeDOM = (function (exports) {
6898
6951
  const remove = vnode => {
6899
6952
  const { type, el, anchor, transition } = vnode;
6900
6953
  if (type === Fragment) {
6901
- removeFragment(el, anchor);
6954
+ if (vnode.patchFlag > 0 &&
6955
+ vnode.patchFlag & 2048 /* DEV_ROOT_FRAGMENT */ &&
6956
+ transition &&
6957
+ !transition.persisted) {
6958
+ vnode.children.forEach(child => {
6959
+ if (child.type === Comment) {
6960
+ hostRemove(child.el);
6961
+ }
6962
+ else {
6963
+ remove(child);
6964
+ }
6965
+ });
6966
+ }
6967
+ else {
6968
+ removeFragment(el, anchor);
6969
+ }
6902
6970
  return;
6903
6971
  }
6904
6972
  if (type === Static) {
@@ -7917,7 +7985,10 @@ var VueRuntimeDOM = (function (exports) {
7917
7985
  // this is not a user-facing function, so the fallback is always generated by
7918
7986
  // the compiler and guaranteed to be a function returning an array
7919
7987
  fallback, noSlotted) {
7920
- if (currentRenderingInstance.isCE) {
7988
+ if (currentRenderingInstance.isCE ||
7989
+ (currentRenderingInstance.parent &&
7990
+ isAsyncWrapper(currentRenderingInstance.parent) &&
7991
+ currentRenderingInstance.parent.isCE)) {
7921
7992
  return createVNode('slot', name === 'default' ? null : { name }, fallback && fallback());
7922
7993
  }
7923
7994
  let slot = slots[name];
@@ -7990,7 +8061,10 @@ var VueRuntimeDOM = (function (exports) {
7990
8061
  return getExposeProxy(i) || i.proxy;
7991
8062
  return getPublicInstance(i.parent);
7992
8063
  };
7993
- const publicPropertiesMap = extend(Object.create(null), {
8064
+ const publicPropertiesMap =
8065
+ // Move PURE marker to new line to workaround compiler discarding it
8066
+ // due to type annotation
8067
+ /*#__PURE__*/ extend(Object.create(null), {
7994
8068
  $: i => i,
7995
8069
  $el: i => i.vnode.el,
7996
8070
  $data: i => i.data,
@@ -8118,9 +8192,11 @@ var VueRuntimeDOM = (function (exports) {
8118
8192
  const { data, setupState, ctx } = instance;
8119
8193
  if (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) {
8120
8194
  setupState[key] = value;
8195
+ return true;
8121
8196
  }
8122
8197
  else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
8123
8198
  data[key] = value;
8199
+ return true;
8124
8200
  }
8125
8201
  else if (hasOwn(instance.props, key)) {
8126
8202
  warn$1(`Attempting to mutate prop "${key}". Props are readonly.`, instance);
@@ -8154,6 +8230,16 @@ var VueRuntimeDOM = (function (exports) {
8154
8230
  hasOwn(ctx, key) ||
8155
8231
  hasOwn(publicPropertiesMap, key) ||
8156
8232
  hasOwn(appContext.config.globalProperties, key));
8233
+ },
8234
+ defineProperty(target, key, descriptor) {
8235
+ if (descriptor.get != null) {
8236
+ // invalidate key cache of a getter based property #5417
8237
+ target._.accessCache[key] = 0;
8238
+ }
8239
+ else if (hasOwn(descriptor, 'value')) {
8240
+ this.set(target, key, descriptor.value, null);
8241
+ }
8242
+ return Reflect.defineProperty(target, key, descriptor);
8157
8243
  }
8158
8244
  };
8159
8245
  {
@@ -8356,6 +8442,7 @@ var VueRuntimeDOM = (function (exports) {
8356
8442
  return setupResult;
8357
8443
  }
8358
8444
  function setupStatefulComponent(instance, isSSR) {
8445
+ var _a;
8359
8446
  const Component = instance.type;
8360
8447
  {
8361
8448
  if (Component.name) {
@@ -8413,6 +8500,13 @@ var VueRuntimeDOM = (function (exports) {
8413
8500
  // async setup returned Promise.
8414
8501
  // bail here and wait for re-entry.
8415
8502
  instance.asyncDep = setupResult;
8503
+ if (!instance.suspense) {
8504
+ const name = (_a = Component.name) !== null && _a !== void 0 ? _a : 'Anonymous';
8505
+ warn$1(`Component <${name}>: setup function returned a promise, but no ` +
8506
+ `<Suspense> boundary was found in the parent component tree. ` +
8507
+ `A component with async setup() must be nested in a <Suspense> ` +
8508
+ `in order to be rendered.`);
8509
+ }
8416
8510
  }
8417
8511
  }
8418
8512
  else {
@@ -9024,7 +9118,7 @@ var VueRuntimeDOM = (function (exports) {
9024
9118
  }
9025
9119
 
9026
9120
  // Core API ------------------------------------------------------------------
9027
- const version = "3.2.30";
9121
+ const version = "3.2.33";
9028
9122
  /**
9029
9123
  * SSR utils for \@vue/server-renderer. Only exposed in cjs builds.
9030
9124
  * @internal
@@ -9041,7 +9135,7 @@ var VueRuntimeDOM = (function (exports) {
9041
9135
 
9042
9136
  const svgNS = 'http://www.w3.org/2000/svg';
9043
9137
  const doc = (typeof document !== 'undefined' ? document : null);
9044
- const templateContainer = doc && doc.createElement('template');
9138
+ const templateContainer = doc && /*#__PURE__*/ doc.createElement('template');
9045
9139
  const nodeOps = {
9046
9140
  insert: (child, parent, anchor) => {
9047
9141
  parent.insertBefore(child, anchor || null);
@@ -9192,6 +9286,8 @@ var VueRuntimeDOM = (function (exports) {
9192
9286
  val.forEach(v => setStyle(style, name, v));
9193
9287
  }
9194
9288
  else {
9289
+ if (val == null)
9290
+ val = '';
9195
9291
  if (name.startsWith('--')) {
9196
9292
  // custom property definition
9197
9293
  style.setProperty(name, val);
@@ -9286,31 +9382,28 @@ var VueRuntimeDOM = (function (exports) {
9286
9382
  }
9287
9383
  return;
9288
9384
  }
9385
+ let needRemove = false;
9289
9386
  if (value === '' || value == null) {
9290
9387
  const type = typeof el[key];
9291
9388
  if (type === 'boolean') {
9292
9389
  // e.g. <select multiple> compiles to { multiple: '' }
9293
- el[key] = includeBooleanAttr(value);
9294
- return;
9390
+ value = includeBooleanAttr(value);
9295
9391
  }
9296
9392
  else if (value == null && type === 'string') {
9297
9393
  // e.g. <div :id="null">
9298
- el[key] = '';
9299
- el.removeAttribute(key);
9300
- return;
9394
+ value = '';
9395
+ needRemove = true;
9301
9396
  }
9302
9397
  else if (type === 'number') {
9303
9398
  // e.g. <img :width="null">
9304
9399
  // the value of some IDL attr must be greater than 0, e.g. input.size = 0 -> error
9305
- try {
9306
- el[key] = 0;
9307
- }
9308
- catch (_a) { }
9309
- el.removeAttribute(key);
9310
- return;
9400
+ value = 0;
9401
+ needRemove = true;
9311
9402
  }
9312
9403
  }
9313
- // some properties perform value validation and throw
9404
+ // some properties perform value validation and throw,
9405
+ // some properties has getter, no setter, will error in 'use strict'
9406
+ // eg. <select :type="null"></select> <select :willValidate="null"></select>
9314
9407
  try {
9315
9408
  el[key] = value;
9316
9409
  }
@@ -9320,31 +9413,35 @@ var VueRuntimeDOM = (function (exports) {
9320
9413
  `value ${value} is invalid.`, e);
9321
9414
  }
9322
9415
  }
9416
+ needRemove && el.removeAttribute(key);
9323
9417
  }
9324
9418
 
9325
9419
  // Async edge case fix requires storing an event listener's attach timestamp.
9326
- let _getNow = Date.now;
9327
- let skipTimestampCheck = false;
9328
- if (typeof window !== 'undefined') {
9329
- // Determine what event timestamp the browser is using. Annoyingly, the
9330
- // timestamp can either be hi-res (relative to page load) or low-res
9331
- // (relative to UNIX epoch), so in order to compare time we have to use the
9332
- // same timestamp type when saving the flush timestamp.
9333
- if (_getNow() > document.createEvent('Event').timeStamp) {
9334
- // if the low-res timestamp which is bigger than the event timestamp
9335
- // (which is evaluated AFTER) it means the event is using a hi-res timestamp,
9336
- // and we need to use the hi-res version for event listeners as well.
9337
- _getNow = () => performance.now();
9338
- }
9339
- // #3485: Firefox <= 53 has incorrect Event.timeStamp implementation
9340
- // and does not fire microtasks in between event propagation, so safe to exclude.
9341
- const ffMatch = navigator.userAgent.match(/firefox\/(\d+)/i);
9342
- skipTimestampCheck = !!(ffMatch && Number(ffMatch[1]) <= 53);
9343
- }
9420
+ const [_getNow, skipTimestampCheck] = /*#__PURE__*/ (() => {
9421
+ let _getNow = Date.now;
9422
+ let skipTimestampCheck = false;
9423
+ if (typeof window !== 'undefined') {
9424
+ // Determine what event timestamp the browser is using. Annoyingly, the
9425
+ // timestamp can either be hi-res (relative to page load) or low-res
9426
+ // (relative to UNIX epoch), so in order to compare time we have to use the
9427
+ // same timestamp type when saving the flush timestamp.
9428
+ if (Date.now() > document.createEvent('Event').timeStamp) {
9429
+ // if the low-res timestamp which is bigger than the event timestamp
9430
+ // (which is evaluated AFTER) it means the event is using a hi-res timestamp,
9431
+ // and we need to use the hi-res version for event listeners as well.
9432
+ _getNow = () => performance.now();
9433
+ }
9434
+ // #3485: Firefox <= 53 has incorrect Event.timeStamp implementation
9435
+ // and does not fire microtasks in between event propagation, so safe to exclude.
9436
+ const ffMatch = navigator.userAgent.match(/firefox\/(\d+)/i);
9437
+ skipTimestampCheck = !!(ffMatch && Number(ffMatch[1]) <= 53);
9438
+ }
9439
+ return [_getNow, skipTimestampCheck];
9440
+ })();
9344
9441
  // To avoid the overhead of repeatedly calling performance.now(), we cache
9345
9442
  // and use the same timestamp for all event listeners attached in the same tick.
9346
9443
  let cachedNow = 0;
9347
- const p = Promise.resolve();
9444
+ const p = /*#__PURE__*/ Promise.resolve();
9348
9445
  const reset = () => {
9349
9446
  cachedNow = 0;
9350
9447
  };
@@ -9469,13 +9566,13 @@ var VueRuntimeDOM = (function (exports) {
9469
9566
  }
9470
9567
  return false;
9471
9568
  }
9472
- // spellcheck and draggable are numerated attrs, however their
9473
- // corresponding DOM properties are actually booleans - this leads to
9474
- // setting it with a string "false" value leading it to be coerced to
9475
- // `true`, so we need to always treat them as attributes.
9569
+ // these are enumerated attrs, however their corresponding DOM properties
9570
+ // are actually booleans - this leads to setting it with a string "false"
9571
+ // value leading it to be coerced to `true`, so we need to always treat
9572
+ // them as attributes.
9476
9573
  // Note that `contentEditable` doesn't have this problem: its DOM
9477
9574
  // property is also enumerated string values.
9478
- if (key === 'spellcheck' || key === 'draggable') {
9575
+ if (key === 'spellcheck' || key === 'draggable' || key === 'translate') {
9479
9576
  return false;
9480
9577
  }
9481
9578
  // #1787, #2840 form property on form elements is readonly and must be set as
@@ -10530,7 +10627,7 @@ var VueRuntimeDOM = (function (exports) {
10530
10627
  el.style.display = value ? el._vod : 'none';
10531
10628
  }
10532
10629
 
10533
- const rendererOptions = extend({ patchProp }, nodeOps);
10630
+ const rendererOptions = /*#__PURE__*/ extend({ patchProp }, nodeOps);
10534
10631
  // lazy create the renderer - this makes core renderer logic tree-shakable
10535
10632
  // in case the user only imports reactivity utilities from Vue.
10536
10633
  let renderer;