@vue/runtime-dom 3.3.6 → 3.4.0-alpha.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.
@@ -354,117 +354,120 @@ function onScopeDispose(fn) {
354
354
  }
355
355
  }
356
356
 
357
- const createDep = (effects) => {
358
- const dep = new Set(effects);
359
- dep.w = 0;
360
- dep.n = 0;
361
- return dep;
362
- };
363
- const wasTracked = (dep) => (dep.w & trackOpBit) > 0;
364
- const newTracked = (dep) => (dep.n & trackOpBit) > 0;
365
- const initDepMarkers = ({ deps }) => {
366
- if (deps.length) {
367
- for (let i = 0; i < deps.length; i++) {
368
- deps[i].w |= trackOpBit;
369
- }
370
- }
371
- };
372
- const finalizeDepMarkers = (effect) => {
373
- const { deps } = effect;
374
- if (deps.length) {
375
- let ptr = 0;
376
- for (let i = 0; i < deps.length; i++) {
377
- const dep = deps[i];
378
- if (wasTracked(dep) && !newTracked(dep)) {
379
- dep.delete(effect);
380
- } else {
381
- deps[ptr++] = dep;
382
- }
383
- dep.w &= ~trackOpBit;
384
- dep.n &= ~trackOpBit;
385
- }
386
- deps.length = ptr;
387
- }
388
- };
389
-
390
- const targetMap = /* @__PURE__ */ new WeakMap();
391
- let effectTrackDepth = 0;
392
- let trackOpBit = 1;
393
- const maxMarkerBits = 30;
394
357
  let activeEffect;
395
- const ITERATE_KEY = Symbol("iterate" );
396
- const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate" );
397
358
  class ReactiveEffect {
398
- constructor(fn, scheduler = null, scope) {
359
+ constructor(fn, trigger, scheduler, scope) {
399
360
  this.fn = fn;
361
+ this.trigger = trigger;
400
362
  this.scheduler = scheduler;
401
363
  this.active = true;
402
364
  this.deps = [];
403
- this.parent = void 0;
365
+ /**
366
+ * @internal
367
+ */
368
+ this._dirtyLevel = 3;
369
+ /**
370
+ * @internal
371
+ */
372
+ this._trackId = 0;
373
+ /**
374
+ * @internal
375
+ */
376
+ this._runnings = 0;
377
+ /**
378
+ * @internal
379
+ */
380
+ this._queryings = 0;
381
+ /**
382
+ * @internal
383
+ */
384
+ this._depsLength = 0;
404
385
  recordEffectScope(this, scope);
405
386
  }
387
+ get dirty() {
388
+ if (this._dirtyLevel === 1) {
389
+ this._dirtyLevel = 0;
390
+ this._queryings++;
391
+ pauseTracking();
392
+ for (const dep of this.deps) {
393
+ if (dep.computed) {
394
+ triggerComputed(dep.computed);
395
+ if (this._dirtyLevel >= 2) {
396
+ break;
397
+ }
398
+ }
399
+ }
400
+ resetTracking();
401
+ this._queryings--;
402
+ }
403
+ return this._dirtyLevel >= 2;
404
+ }
405
+ set dirty(v) {
406
+ this._dirtyLevel = v ? 3 : 0;
407
+ }
406
408
  run() {
409
+ this._dirtyLevel = 0;
407
410
  if (!this.active) {
408
411
  return this.fn();
409
412
  }
410
- let parent = activeEffect;
411
413
  let lastShouldTrack = shouldTrack;
412
- while (parent) {
413
- if (parent === this) {
414
- return;
415
- }
416
- parent = parent.parent;
417
- }
414
+ let lastEffect = activeEffect;
418
415
  try {
419
- this.parent = activeEffect;
420
- activeEffect = this;
421
416
  shouldTrack = true;
422
- trackOpBit = 1 << ++effectTrackDepth;
423
- if (effectTrackDepth <= maxMarkerBits) {
424
- initDepMarkers(this);
425
- } else {
426
- cleanupEffect(this);
427
- }
417
+ activeEffect = this;
418
+ this._runnings++;
419
+ preCleanupEffect(this);
428
420
  return this.fn();
429
421
  } finally {
430
- if (effectTrackDepth <= maxMarkerBits) {
431
- finalizeDepMarkers(this);
432
- }
433
- trackOpBit = 1 << --effectTrackDepth;
434
- activeEffect = this.parent;
422
+ postCleanupEffect(this);
423
+ this._runnings--;
424
+ activeEffect = lastEffect;
435
425
  shouldTrack = lastShouldTrack;
436
- this.parent = void 0;
437
- if (this.deferStop) {
438
- this.stop();
439
- }
440
426
  }
441
427
  }
442
428
  stop() {
443
- if (activeEffect === this) {
444
- this.deferStop = true;
445
- } else if (this.active) {
446
- cleanupEffect(this);
447
- if (this.onStop) {
448
- this.onStop();
449
- }
429
+ var _a;
430
+ if (this.active) {
431
+ preCleanupEffect(this);
432
+ postCleanupEffect(this);
433
+ (_a = this.onStop) == null ? void 0 : _a.call(this);
450
434
  this.active = false;
451
435
  }
452
436
  }
453
437
  }
454
- function cleanupEffect(effect2) {
455
- const { deps } = effect2;
456
- if (deps.length) {
457
- for (let i = 0; i < deps.length; i++) {
458
- deps[i].delete(effect2);
438
+ function triggerComputed(computed) {
439
+ return computed.value;
440
+ }
441
+ function preCleanupEffect(effect2) {
442
+ effect2._trackId++;
443
+ effect2._depsLength = 0;
444
+ }
445
+ function postCleanupEffect(effect2) {
446
+ if (effect2.deps && effect2.deps.length > effect2._depsLength) {
447
+ for (let i = effect2._depsLength; i < effect2.deps.length; i++) {
448
+ cleanupDepEffect(effect2.deps[i], effect2);
449
+ }
450
+ effect2.deps.length = effect2._depsLength;
451
+ }
452
+ }
453
+ function cleanupDepEffect(dep, effect2) {
454
+ const trackId = dep.get(effect2);
455
+ if (trackId !== void 0 && effect2._trackId !== trackId) {
456
+ dep.delete(effect2);
457
+ if (dep.size === 0) {
458
+ dep.cleanup();
459
459
  }
460
- deps.length = 0;
461
460
  }
462
461
  }
463
462
  function effect(fn, options) {
464
463
  if (fn.effect instanceof ReactiveEffect) {
465
464
  fn = fn.effect.fn;
466
465
  }
467
- const _effect = new ReactiveEffect(fn);
466
+ const _effect = new ReactiveEffect(fn, NOOP, () => {
467
+ if (_effect.dirty) {
468
+ _effect.run();
469
+ }
470
+ });
468
471
  if (options) {
469
472
  extend(_effect, options);
470
473
  if (options.scope)
@@ -481,6 +484,7 @@ function stop(runner) {
481
484
  runner.effect.stop();
482
485
  }
483
486
  let shouldTrack = true;
487
+ let pauseScheduleStack = 0;
484
488
  const trackStack = [];
485
489
  function pauseTracking() {
486
490
  trackStack.push(shouldTrack);
@@ -490,6 +494,68 @@ function resetTracking() {
490
494
  const last = trackStack.pop();
491
495
  shouldTrack = last === void 0 ? true : last;
492
496
  }
497
+ function pauseScheduling() {
498
+ pauseScheduleStack++;
499
+ }
500
+ function resetScheduling() {
501
+ pauseScheduleStack--;
502
+ while (!pauseScheduleStack && queueEffectSchedulers.length) {
503
+ queueEffectSchedulers.shift()();
504
+ }
505
+ }
506
+ function trackEffect(effect2, dep, debuggerEventExtraInfo) {
507
+ var _a;
508
+ if (dep.get(effect2) !== effect2._trackId) {
509
+ dep.set(effect2, effect2._trackId);
510
+ const oldDep = effect2.deps[effect2._depsLength];
511
+ if (oldDep !== dep) {
512
+ if (oldDep) {
513
+ cleanupDepEffect(oldDep, effect2);
514
+ }
515
+ effect2.deps[effect2._depsLength++] = dep;
516
+ } else {
517
+ effect2._depsLength++;
518
+ }
519
+ {
520
+ (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
521
+ }
522
+ }
523
+ }
524
+ const queueEffectSchedulers = [];
525
+ function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
526
+ var _a;
527
+ pauseScheduling();
528
+ for (const effect2 of dep.keys()) {
529
+ if (!effect2.allowRecurse && effect2._runnings) {
530
+ continue;
531
+ }
532
+ if (effect2._dirtyLevel < dirtyLevel && (!effect2._runnings || dirtyLevel !== 2)) {
533
+ const lastDirtyLevel = effect2._dirtyLevel;
534
+ effect2._dirtyLevel = dirtyLevel;
535
+ if (lastDirtyLevel === 0 && (!effect2._queryings || dirtyLevel !== 2)) {
536
+ {
537
+ (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
538
+ }
539
+ effect2.trigger();
540
+ if (effect2.scheduler) {
541
+ queueEffectSchedulers.push(effect2.scheduler);
542
+ }
543
+ }
544
+ }
545
+ }
546
+ resetScheduling();
547
+ }
548
+
549
+ const createDep = (cleanup, computed) => {
550
+ const dep = /* @__PURE__ */ new Map();
551
+ dep.cleanup = cleanup;
552
+ dep.computed = computed;
553
+ return dep;
554
+ };
555
+
556
+ const targetMap = /* @__PURE__ */ new WeakMap();
557
+ const ITERATE_KEY = Symbol("iterate" );
558
+ const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate" );
493
559
  function track(target, type, key) {
494
560
  if (shouldTrack && activeEffect) {
495
561
  let depsMap = targetMap.get(target);
@@ -498,35 +564,17 @@ function track(target, type, key) {
498
564
  }
499
565
  let dep = depsMap.get(key);
500
566
  if (!dep) {
501
- depsMap.set(key, dep = createDep());
502
- }
503
- const eventInfo = { effect: activeEffect, target, type, key } ;
504
- trackEffects(dep, eventInfo);
505
- }
506
- }
507
- function trackEffects(dep, debuggerEventExtraInfo) {
508
- let shouldTrack2 = false;
509
- if (effectTrackDepth <= maxMarkerBits) {
510
- if (!newTracked(dep)) {
511
- dep.n |= trackOpBit;
512
- shouldTrack2 = !wasTracked(dep);
513
- }
514
- } else {
515
- shouldTrack2 = !dep.has(activeEffect);
516
- }
517
- if (shouldTrack2) {
518
- dep.add(activeEffect);
519
- activeEffect.deps.push(dep);
520
- if (activeEffect.onTrack) {
521
- activeEffect.onTrack(
522
- extend(
523
- {
524
- effect: activeEffect
525
- },
526
- debuggerEventExtraInfo
527
- )
528
- );
567
+ depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
529
568
  }
569
+ trackEffect(
570
+ activeEffect,
571
+ dep,
572
+ {
573
+ target,
574
+ type,
575
+ key
576
+ }
577
+ );
530
578
  }
531
579
  }
532
580
  function trigger(target, type, key, newValue, oldValue, oldTarget) {
@@ -540,7 +588,7 @@ function trigger(target, type, key, newValue, oldValue, oldTarget) {
540
588
  } else if (key === "length" && isArray(target)) {
541
589
  const newLength = Number(newValue);
542
590
  depsMap.forEach((dep, key2) => {
543
- if (key2 === "length" || key2 >= newLength) {
591
+ if (key2 === "length" || !isSymbol(key2) && key2 >= newLength) {
544
592
  deps.push(dep);
545
593
  }
546
594
  });
@@ -574,49 +622,24 @@ function trigger(target, type, key, newValue, oldValue, oldTarget) {
574
622
  break;
575
623
  }
576
624
  }
577
- const eventInfo = { target, type, key, newValue, oldValue, oldTarget } ;
578
- if (deps.length === 1) {
579
- if (deps[0]) {
580
- {
581
- triggerEffects(deps[0], eventInfo);
582
- }
583
- }
584
- } else {
585
- const effects = [];
586
- for (const dep of deps) {
587
- if (dep) {
588
- effects.push(...dep);
589
- }
590
- }
591
- {
592
- triggerEffects(createDep(effects), eventInfo);
593
- }
594
- }
595
- }
596
- function triggerEffects(dep, debuggerEventExtraInfo) {
597
- const effects = isArray(dep) ? dep : [...dep];
598
- for (const effect2 of effects) {
599
- if (effect2.computed) {
600
- triggerEffect(effect2, debuggerEventExtraInfo);
601
- }
602
- }
603
- for (const effect2 of effects) {
604
- if (!effect2.computed) {
605
- triggerEffect(effect2, debuggerEventExtraInfo);
606
- }
607
- }
608
- }
609
- function triggerEffect(effect2, debuggerEventExtraInfo) {
610
- if (effect2 !== activeEffect || effect2.allowRecurse) {
611
- if (effect2.onTrigger) {
612
- effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));
613
- }
614
- if (effect2.scheduler) {
615
- effect2.scheduler();
616
- } else {
617
- effect2.run();
625
+ pauseScheduling();
626
+ for (const dep of deps) {
627
+ if (dep) {
628
+ triggerEffects(
629
+ dep,
630
+ 3,
631
+ {
632
+ target,
633
+ type,
634
+ key,
635
+ newValue,
636
+ oldValue,
637
+ oldTarget
638
+ }
639
+ );
618
640
  }
619
641
  }
642
+ resetScheduling();
620
643
  }
621
644
  function getDepFromReactive(object, key) {
622
645
  var _a;
@@ -647,7 +670,9 @@ function createArrayInstrumentations() {
647
670
  ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
648
671
  instrumentations[key] = function(...args) {
649
672
  pauseTracking();
673
+ pauseScheduling();
650
674
  const res = toRaw(this)[key].apply(this, args);
675
+ resetScheduling();
651
676
  resetTracking();
652
677
  return res;
653
678
  };
@@ -1186,30 +1211,93 @@ function markRaw(value) {
1186
1211
  const toReactive = (value) => isObject(value) ? reactive(value) : value;
1187
1212
  const toReadonly = (value) => isObject(value) ? readonly(value) : value;
1188
1213
 
1214
+ class ComputedRefImpl {
1215
+ constructor(getter, _setter, isReadonly, isSSR) {
1216
+ this._setter = _setter;
1217
+ this.dep = void 0;
1218
+ this.__v_isRef = true;
1219
+ this["__v_isReadonly"] = false;
1220
+ this.effect = new ReactiveEffect(getter, () => {
1221
+ triggerRefValue(this, 1);
1222
+ });
1223
+ this.effect.computed = this;
1224
+ this.effect.active = this._cacheable = !isSSR;
1225
+ this["__v_isReadonly"] = isReadonly;
1226
+ }
1227
+ get value() {
1228
+ const self = toRaw(this);
1229
+ trackRefValue(self);
1230
+ if (!self._cacheable || self.effect.dirty) {
1231
+ if (hasChanged(self._value, self._value = self.effect.run())) {
1232
+ triggerRefValue(self, 2);
1233
+ }
1234
+ }
1235
+ return self._value;
1236
+ }
1237
+ set value(newValue) {
1238
+ this._setter(newValue);
1239
+ }
1240
+ // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x
1241
+ get _dirty() {
1242
+ return this.effect.dirty;
1243
+ }
1244
+ set _dirty(v) {
1245
+ this.effect.dirty = v;
1246
+ }
1247
+ // #endregion
1248
+ }
1249
+ function computed$1(getterOrOptions, debugOptions, isSSR = false) {
1250
+ let getter;
1251
+ let setter;
1252
+ const onlyGetter = isFunction(getterOrOptions);
1253
+ if (onlyGetter) {
1254
+ getter = getterOrOptions;
1255
+ setter = () => {
1256
+ console.warn("Write operation failed: computed value is readonly");
1257
+ } ;
1258
+ } else {
1259
+ getter = getterOrOptions.get;
1260
+ setter = getterOrOptions.set;
1261
+ }
1262
+ const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
1263
+ if (debugOptions && !isSSR) {
1264
+ cRef.effect.onTrack = debugOptions.onTrack;
1265
+ cRef.effect.onTrigger = debugOptions.onTrigger;
1266
+ }
1267
+ return cRef;
1268
+ }
1269
+
1189
1270
  function trackRefValue(ref2) {
1190
1271
  if (shouldTrack && activeEffect) {
1191
1272
  ref2 = toRaw(ref2);
1192
- {
1193
- trackEffects(ref2.dep || (ref2.dep = createDep()), {
1273
+ trackEffect(
1274
+ activeEffect,
1275
+ ref2.dep || (ref2.dep = createDep(
1276
+ () => ref2.dep = void 0,
1277
+ ref2 instanceof ComputedRefImpl ? ref2 : void 0
1278
+ )),
1279
+ {
1194
1280
  target: ref2,
1195
1281
  type: "get",
1196
1282
  key: "value"
1197
- });
1198
- }
1283
+ }
1284
+ );
1199
1285
  }
1200
1286
  }
1201
- function triggerRefValue(ref2, newVal) {
1287
+ function triggerRefValue(ref2, dirtyLevel = 3, newVal) {
1202
1288
  ref2 = toRaw(ref2);
1203
1289
  const dep = ref2.dep;
1204
1290
  if (dep) {
1205
- {
1206
- triggerEffects(dep, {
1291
+ triggerEffects(
1292
+ dep,
1293
+ dirtyLevel,
1294
+ {
1207
1295
  target: ref2,
1208
1296
  type: "set",
1209
1297
  key: "value",
1210
1298
  newValue: newVal
1211
- });
1212
- }
1299
+ }
1300
+ );
1213
1301
  }
1214
1302
  }
1215
1303
  function isRef(r) {
@@ -1245,12 +1333,12 @@ class RefImpl {
1245
1333
  if (hasChanged(newVal, this._rawValue)) {
1246
1334
  this._rawValue = newVal;
1247
1335
  this._value = useDirectValue ? newVal : toReactive(newVal);
1248
- triggerRefValue(this, newVal);
1336
+ triggerRefValue(this, 3, newVal);
1249
1337
  }
1250
1338
  }
1251
1339
  }
1252
1340
  function triggerRef(ref2) {
1253
- triggerRefValue(ref2, ref2.value );
1341
+ triggerRefValue(ref2, 3, ref2.value );
1254
1342
  }
1255
1343
  function unref(ref2) {
1256
1344
  return isRef(ref2) ? ref2.value : ref2;
@@ -1348,57 +1436,6 @@ function propertyToRef(source, key, defaultValue) {
1348
1436
  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
1349
1437
  }
1350
1438
 
1351
- class ComputedRefImpl {
1352
- constructor(getter, _setter, isReadonly, isSSR) {
1353
- this._setter = _setter;
1354
- this.dep = void 0;
1355
- this.__v_isRef = true;
1356
- this["__v_isReadonly"] = false;
1357
- this._dirty = true;
1358
- this.effect = new ReactiveEffect(getter, () => {
1359
- if (!this._dirty) {
1360
- this._dirty = true;
1361
- triggerRefValue(this);
1362
- }
1363
- });
1364
- this.effect.computed = this;
1365
- this.effect.active = this._cacheable = !isSSR;
1366
- this["__v_isReadonly"] = isReadonly;
1367
- }
1368
- get value() {
1369
- const self = toRaw(this);
1370
- trackRefValue(self);
1371
- if (self._dirty || !self._cacheable) {
1372
- self._dirty = false;
1373
- self._value = self.effect.run();
1374
- }
1375
- return self._value;
1376
- }
1377
- set value(newValue) {
1378
- this._setter(newValue);
1379
- }
1380
- }
1381
- function computed$1(getterOrOptions, debugOptions, isSSR = false) {
1382
- let getter;
1383
- let setter;
1384
- const onlyGetter = isFunction(getterOrOptions);
1385
- if (onlyGetter) {
1386
- getter = getterOrOptions;
1387
- setter = () => {
1388
- console.warn("Write operation failed: computed value is readonly");
1389
- } ;
1390
- } else {
1391
- getter = getterOrOptions.get;
1392
- setter = getterOrOptions.set;
1393
- }
1394
- const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
1395
- if (debugOptions && !isSSR) {
1396
- cRef.effect.onTrack = debugOptions.onTrack;
1397
- cRef.effect.onTrigger = debugOptions.onTrigger;
1398
- }
1399
- return cRef;
1400
- }
1401
-
1402
1439
  const stack = [];
1403
1440
  function pushWarningContext(vnode) {
1404
1441
  stack.push(vnode);
@@ -1513,7 +1550,7 @@ function assertNumber(val, type) {
1513
1550
  }
1514
1551
  }
1515
1552
 
1516
- const ErrorTypeStrings = {
1553
+ const ErrorTypeStrings$1 = {
1517
1554
  ["sp"]: "serverPrefetch hook",
1518
1555
  ["bc"]: "beforeCreate hook",
1519
1556
  ["c"]: "created hook",
@@ -1574,7 +1611,7 @@ function handleError(err, instance, type, throwInDev = true) {
1574
1611
  if (instance) {
1575
1612
  let cur = instance.parent;
1576
1613
  const exposedInstance = instance.proxy;
1577
- const errorInfo = ErrorTypeStrings[type] ;
1614
+ const errorInfo = ErrorTypeStrings$1[type] ;
1578
1615
  while (cur) {
1579
1616
  const errorCapturedHooks = cur.ec;
1580
1617
  if (errorCapturedHooks) {
@@ -1601,7 +1638,7 @@ function handleError(err, instance, type, throwInDev = true) {
1601
1638
  }
1602
1639
  function logError(err, type, contextVNode, throwInDev = true) {
1603
1640
  {
1604
- const info = ErrorTypeStrings[type];
1641
+ const info = ErrorTypeStrings$1[type];
1605
1642
  if (contextVNode) {
1606
1643
  pushWarningContext(contextVNode);
1607
1644
  }
@@ -1636,8 +1673,13 @@ function findInsertionIndex(id) {
1636
1673
  let end = queue.length;
1637
1674
  while (start < end) {
1638
1675
  const middle = start + end >>> 1;
1639
- const middleJobId = getId(queue[middle]);
1640
- middleJobId < id ? start = middle + 1 : end = middle;
1676
+ const middleJob = queue[middle];
1677
+ const middleJobId = getId(middleJob);
1678
+ if (middleJobId < id || middleJobId === id && middleJob.pre) {
1679
+ start = middle + 1;
1680
+ } else {
1681
+ end = middle;
1682
+ }
1641
1683
  }
1642
1684
  return start;
1643
1685
  }
@@ -1824,6 +1866,7 @@ function rerender(id, newRender) {
1824
1866
  }
1825
1867
  instance.renderCache = [];
1826
1868
  isHmrUpdating = true;
1869
+ instance.effect.dirty = true;
1827
1870
  instance.update();
1828
1871
  isHmrUpdating = false;
1829
1872
  });
@@ -1851,6 +1894,7 @@ function reload(id, newComp) {
1851
1894
  instance.ceReload(newComp.styles);
1852
1895
  hmrDirtyComponents.delete(oldComp);
1853
1896
  } else if (instance.parent) {
1897
+ instance.parent.effect.dirty = true;
1854
1898
  queueJob(instance.parent.update);
1855
1899
  } else if (instance.appContext.reload) {
1856
1900
  instance.appContext.reload();
@@ -2752,14 +2796,16 @@ function createSuspenseBoundary(vnode, parentSuspense, parentComponent, containe
2752
2796
  parentComponent: parentComponent2,
2753
2797
  container: container2
2754
2798
  } = suspense;
2799
+ let delayEnter = false;
2755
2800
  if (suspense.isHydrating) {
2756
2801
  suspense.isHydrating = false;
2757
2802
  } else if (!resume) {
2758
- const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
2803
+ delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
2759
2804
  if (delayEnter) {
2760
2805
  activeBranch.transition.afterLeave = () => {
2761
2806
  if (pendingId === suspense.pendingId) {
2762
2807
  move(pendingBranch, container2, anchor2, 0);
2808
+ queuePostFlushCb(effects);
2763
2809
  }
2764
2810
  };
2765
2811
  }
@@ -2785,7 +2831,7 @@ function createSuspenseBoundary(vnode, parentSuspense, parentComponent, containe
2785
2831
  }
2786
2832
  parent = parent.parent;
2787
2833
  }
2788
- if (!hasUnresolvedAncestor) {
2834
+ if (!hasUnresolvedAncestor && !delayEnter) {
2789
2835
  queuePostFlushCb(effects);
2790
2836
  }
2791
2837
  suspense.effects = [];
@@ -3033,8 +3079,15 @@ function watch(source, cb, options) {
3033
3079
  }
3034
3080
  return doWatch(source, cb, options);
3035
3081
  }
3036
- function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
3082
+ function doWatch(source, cb, { immediate, deep, flush, once, onTrack, onTrigger } = EMPTY_OBJ) {
3037
3083
  var _a;
3084
+ if (cb && once) {
3085
+ const _cb = cb;
3086
+ cb = (...args) => {
3087
+ _cb(...args);
3088
+ unwatch();
3089
+ };
3090
+ }
3038
3091
  if (!cb) {
3039
3092
  if (immediate !== void 0) {
3040
3093
  warn(
@@ -3046,6 +3099,11 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3046
3099
  `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
3047
3100
  );
3048
3101
  }
3102
+ if (once !== void 0) {
3103
+ warn(
3104
+ `watch() "once" option is only respected when using the watch(source, callback, options?) signature.`
3105
+ );
3106
+ }
3049
3107
  }
3050
3108
  const warnInvalidSource = (s) => {
3051
3109
  warn(
@@ -3113,7 +3171,7 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3113
3171
  };
3114
3172
  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
3115
3173
  const job = () => {
3116
- if (!effect.active) {
3174
+ if (!effect.active || !effect.dirty) {
3117
3175
  return;
3118
3176
  }
3119
3177
  if (cb) {
@@ -3146,7 +3204,13 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3146
3204
  job.id = instance.uid;
3147
3205
  scheduler = () => queueJob(job);
3148
3206
  }
3149
- const effect = new ReactiveEffect(getter, scheduler);
3207
+ const effect = new ReactiveEffect(getter, NOOP, scheduler);
3208
+ const unwatch = () => {
3209
+ effect.stop();
3210
+ if (instance && instance.scope) {
3211
+ remove(instance.scope.effects, effect);
3212
+ }
3213
+ };
3150
3214
  {
3151
3215
  effect.onTrack = onTrack;
3152
3216
  effect.onTrigger = onTrigger;
@@ -3165,12 +3229,6 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3165
3229
  } else {
3166
3230
  effect.run();
3167
3231
  }
3168
- const unwatch = () => {
3169
- effect.stop();
3170
- if (instance && instance.scope) {
3171
- remove(instance.scope.effects, effect);
3172
- }
3173
- };
3174
3232
  return unwatch;
3175
3233
  }
3176
3234
  function instanceWatch(source, value, options) {
@@ -3400,6 +3458,7 @@ const BaseTransitionImpl = {
3400
3458
  leavingHooks.afterLeave = () => {
3401
3459
  state.isLeaving = false;
3402
3460
  if (instance.update.active !== false) {
3461
+ instance.effect.dirty = true;
3403
3462
  instance.update();
3404
3463
  }
3405
3464
  };
@@ -3735,6 +3794,7 @@ function defineAsyncComponent(source) {
3735
3794
  load().then(() => {
3736
3795
  loaded.value = true;
3737
3796
  if (instance.parent && isKeepAlive(instance.parent.vnode)) {
3797
+ instance.parent.effect.dirty = true;
3738
3798
  queueJob(instance.parent.update);
3739
3799
  }
3740
3800
  }).catch((err) => {
@@ -4029,7 +4089,7 @@ function injectHook(type, hook, target = currentInstance, prepend = false) {
4029
4089
  }
4030
4090
  return wrappedHook;
4031
4091
  } else {
4032
- const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ""));
4092
+ const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, ""));
4033
4093
  warn(
4034
4094
  `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )
4035
4095
  );
@@ -4251,7 +4311,10 @@ const publicPropertiesMap = (
4251
4311
  $root: (i) => getPublicInstance(i.root),
4252
4312
  $emit: (i) => i.emit,
4253
4313
  $options: (i) => resolveMergedOptions(i) ,
4254
- $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),
4314
+ $forceUpdate: (i) => i.f || (i.f = () => {
4315
+ i.effect.dirty = true;
4316
+ queueJob(i.update);
4317
+ }),
4255
4318
  $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
4256
4319
  $watch: (i) => instanceWatch.bind(i)
4257
4320
  })
@@ -5927,7 +5990,14 @@ function createHydrationFunctions(rendererInternals) {
5927
5990
  break;
5928
5991
  case Comment:
5929
5992
  if (domType !== 8 /* COMMENT */ || isFragmentStart) {
5930
- nextNode = onMismatch();
5993
+ if (node.tagName.toLowerCase() === "template") {
5994
+ const content = vnode.el.content.firstChild;
5995
+ replaceNode(content, node, parentComponent);
5996
+ vnode.el = node = content;
5997
+ nextNode = nextSibling(node);
5998
+ } else {
5999
+ nextNode = onMismatch();
6000
+ }
5931
6001
  } else {
5932
6002
  nextNode = nextSibling(node);
5933
6003
  }
@@ -5969,7 +6039,7 @@ function createHydrationFunctions(rendererInternals) {
5969
6039
  break;
5970
6040
  default:
5971
6041
  if (shapeFlag & 1) {
5972
- if (domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) {
6042
+ if ((domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {
5973
6043
  nextNode = onMismatch();
5974
6044
  } else {
5975
6045
  nextNode = hydrateElement(
@@ -5984,6 +6054,13 @@ function createHydrationFunctions(rendererInternals) {
5984
6054
  } else if (shapeFlag & 6) {
5985
6055
  vnode.slotScopeIds = slotScopeIds;
5986
6056
  const container = parentNode(node);
6057
+ if (isFragmentStart) {
6058
+ nextNode = locateClosingAnchor(node);
6059
+ } else if (isComment(node) && node.data === "teleport start") {
6060
+ nextNode = locateClosingAnchor(node, node.data, "teleport end");
6061
+ } else {
6062
+ nextNode = nextSibling(node);
6063
+ }
5987
6064
  mountComponent(
5988
6065
  vnode,
5989
6066
  container,
@@ -5993,10 +6070,6 @@ function createHydrationFunctions(rendererInternals) {
5993
6070
  isSVGContainer(container),
5994
6071
  optimized
5995
6072
  );
5996
- nextNode = isFragmentStart ? locateClosingAsyncAnchor(node) : nextSibling(node);
5997
- if (nextNode && isComment(nextNode) && nextNode.data === "teleport end") {
5998
- nextNode = nextSibling(nextNode);
5999
- }
6000
6073
  if (isAsyncWrapper(vnode)) {
6001
6074
  let subTree;
6002
6075
  if (isFragmentStart) {
@@ -6046,7 +6119,7 @@ function createHydrationFunctions(rendererInternals) {
6046
6119
  };
6047
6120
  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
6048
6121
  optimized = optimized || !!vnode.dynamicChildren;
6049
- const { type, props, patchFlag, shapeFlag, dirs } = vnode;
6122
+ const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;
6050
6123
  const forcePatchValue = type === "input" && dirs || type === "option";
6051
6124
  {
6052
6125
  if (dirs) {
@@ -6083,12 +6156,23 @@ function createHydrationFunctions(rendererInternals) {
6083
6156
  if (vnodeHooks = props && props.onVnodeBeforeMount) {
6084
6157
  invokeVNodeHook(vnodeHooks, parentComponent, vnode);
6085
6158
  }
6159
+ let needCallTransitionHooks = false;
6160
+ if (isTemplateNode(el)) {
6161
+ needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;
6162
+ const content = el.content.firstChild;
6163
+ if (needCallTransitionHooks) {
6164
+ transition.beforeEnter(content);
6165
+ }
6166
+ replaceNode(content, el, parentComponent);
6167
+ vnode.el = el = content;
6168
+ }
6086
6169
  if (dirs) {
6087
6170
  invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
6088
6171
  }
6089
- if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
6172
+ if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {
6090
6173
  queueEffectWithSuspense(() => {
6091
6174
  vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
6175
+ needCallTransitionHooks && transition.enter(el);
6092
6176
  dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
6093
6177
  }, parentSuspense);
6094
6178
  }
@@ -6206,7 +6290,7 @@ function createHydrationFunctions(rendererInternals) {
6206
6290
  );
6207
6291
  vnode.el = null;
6208
6292
  if (isFragment) {
6209
- const end = locateClosingAsyncAnchor(node);
6293
+ const end = locateClosingAnchor(node);
6210
6294
  while (true) {
6211
6295
  const next2 = nextSibling(node);
6212
6296
  if (next2 && next2 !== end) {
@@ -6231,14 +6315,14 @@ function createHydrationFunctions(rendererInternals) {
6231
6315
  );
6232
6316
  return next;
6233
6317
  };
6234
- const locateClosingAsyncAnchor = (node) => {
6318
+ const locateClosingAnchor = (node, open = "[", close = "]") => {
6235
6319
  let match = 0;
6236
6320
  while (node) {
6237
6321
  node = nextSibling(node);
6238
6322
  if (node && isComment(node)) {
6239
- if (node.data === "[")
6323
+ if (node.data === open)
6240
6324
  match++;
6241
- if (node.data === "]") {
6325
+ if (node.data === close) {
6242
6326
  if (match === 0) {
6243
6327
  return nextSibling(node);
6244
6328
  } else {
@@ -6249,6 +6333,23 @@ function createHydrationFunctions(rendererInternals) {
6249
6333
  }
6250
6334
  return node;
6251
6335
  };
6336
+ const replaceNode = (newNode, oldNode, parentComponent) => {
6337
+ const parentNode2 = oldNode.parentNode;
6338
+ if (parentNode2) {
6339
+ parentNode2.replaceChild(newNode, oldNode);
6340
+ }
6341
+ let parent = parentComponent;
6342
+ while (parent) {
6343
+ if (parent.vnode.el === oldNode) {
6344
+ parent.vnode.el = newNode;
6345
+ parent.subTree.el = newNode;
6346
+ }
6347
+ parent = parent.parent;
6348
+ }
6349
+ };
6350
+ const isTemplateNode = (node) => {
6351
+ return node.nodeType === 1 /* ELEMENT */ && node.tagName.toLowerCase() === "template";
6352
+ };
6252
6353
  return [hydrate, hydrateNode];
6253
6354
  }
6254
6355
 
@@ -6576,7 +6677,7 @@ function baseCreateRenderer(options, createHydrationFns) {
6576
6677
  if (dirs) {
6577
6678
  invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
6578
6679
  }
6579
- const needCallTransitionHooks = (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
6680
+ const needCallTransitionHooks = needTransition(parentSuspense, transition);
6580
6681
  if (needCallTransitionHooks) {
6581
6682
  transition.beforeEnter(el);
6582
6683
  }
@@ -6964,6 +7065,7 @@ function baseCreateRenderer(options, createHydrationFns) {
6964
7065
  } else {
6965
7066
  instance.next = n2;
6966
7067
  invalidateJob(instance.update);
7068
+ instance.effect.dirty = true;
6967
7069
  instance.update();
6968
7070
  }
6969
7071
  } else {
@@ -7133,11 +7235,16 @@ function baseCreateRenderer(options, createHydrationFns) {
7133
7235
  };
7134
7236
  const effect = instance.effect = new ReactiveEffect(
7135
7237
  componentUpdateFn,
7238
+ NOOP,
7136
7239
  () => queueJob(update),
7137
7240
  instance.scope
7138
7241
  // track it in component's effect scope
7139
7242
  );
7140
- const update = instance.update = () => effect.run();
7243
+ const update = instance.update = () => {
7244
+ if (effect.dirty) {
7245
+ effect.run();
7246
+ }
7247
+ };
7141
7248
  update.id = instance.uid;
7142
7249
  toggleRecurse(instance, true);
7143
7250
  {
@@ -7468,8 +7575,8 @@ function baseCreateRenderer(options, createHydrationFns) {
7468
7575
  moveStaticNode(vnode, container, anchor);
7469
7576
  return;
7470
7577
  }
7471
- const needTransition = moveType !== 2 && shapeFlag & 1 && transition;
7472
- if (needTransition) {
7578
+ const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;
7579
+ if (needTransition2) {
7473
7580
  if (moveType === 0) {
7474
7581
  transition.beforeEnter(el);
7475
7582
  hostInsert(el, container, anchor);
@@ -7689,6 +7796,9 @@ function baseCreateRenderer(options, createHydrationFns) {
7689
7796
  function toggleRecurse({ effect, update }, allowed) {
7690
7797
  effect.allowRecurse = update.allowRecurse = allowed;
7691
7798
  }
7799
+ function needTransition(parentSuspense, transition) {
7800
+ return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
7801
+ }
7692
7802
  function traverseStaticChildren(n1, n2, shallow = false) {
7693
7803
  const ch1 = n1.children;
7694
7804
  const ch2 = n2.children;
@@ -9024,7 +9134,8 @@ function isMemoSame(cached, memo) {
9024
9134
  return true;
9025
9135
  }
9026
9136
 
9027
- const version = "3.3.6";
9137
+ const version = "3.4.0-alpha.1";
9138
+ const ErrorTypeStrings = ErrorTypeStrings$1 ;
9028
9139
  const ssrUtils = null;
9029
9140
  const resolveFilter = null;
9030
9141
  const compatUtils = null;
@@ -10510,4 +10621,4 @@ function normalizeContainer(container) {
10510
10621
  }
10511
10622
  const initDirectivesForSSR = NOOP;
10512
10623
 
10513
- export { BaseTransition, BaseTransitionPropsValidators, Comment, EffectScope, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, Transition, TransitionGroup, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, computed, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, defineAsyncComponent, defineComponent, defineCustomElement, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSSRCustomElement, defineSlots, devtools, effect, effectScope, getCurrentInstance, getCurrentScope, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrate, initCustomFormatter, initDirectivesForSSR, inject, isMemoSame, isProxy, isReactive, isReadonly, isRef, isRuntimeOnly, isShallow, isVNode, markRaw, mergeDefaults, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onScopeDispose, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, proxyRefs, pushScopeId, queuePostFlushCb, reactive, readonly, ref, registerRuntimeCompiler, render, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, shallowReactive, shallowReadonly, shallowRef, ssrContextKey, ssrUtils, stop, toDisplayString, toHandlerKey, toHandlers, toRaw, toRef, toRefs, toValue, transformVNodeArgs, triggerRef, unref, useAttrs, useCssModule, useCssVars, useModel, useSSRContext, useSlots, useTransitionState, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withKeys, withMemo, withModifiers, withScopeId };
10624
+ export { BaseTransition, BaseTransitionPropsValidators, Comment, EffectScope, ErrorTypeStrings, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, Transition, TransitionGroup, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, computed, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, defineAsyncComponent, defineComponent, defineCustomElement, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSSRCustomElement, defineSlots, devtools, effect, effectScope, getCurrentInstance, getCurrentScope, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrate, initCustomFormatter, initDirectivesForSSR, inject, isMemoSame, isProxy, isReactive, isReadonly, isRef, isRuntimeOnly, isShallow, isVNode, markRaw, mergeDefaults, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onScopeDispose, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, proxyRefs, pushScopeId, queuePostFlushCb, reactive, readonly, ref, registerRuntimeCompiler, render, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, shallowReactive, shallowReadonly, shallowRef, ssrContextKey, ssrUtils, stop, toDisplayString, toHandlerKey, toHandlers, toRaw, toRef, toRefs, toValue, transformVNodeArgs, triggerRef, unref, useAttrs, useCssModule, useCssVars, useModel, useSSRContext, useSlots, useTransitionState, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withKeys, withMemo, withModifiers, withScopeId };