@vue/runtime-dom 3.3.7 → 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) {
@@ -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
  }
@@ -1829,6 +1866,7 @@ function rerender(id, newRender) {
1829
1866
  }
1830
1867
  instance.renderCache = [];
1831
1868
  isHmrUpdating = true;
1869
+ instance.effect.dirty = true;
1832
1870
  instance.update();
1833
1871
  isHmrUpdating = false;
1834
1872
  });
@@ -1856,6 +1894,7 @@ function reload(id, newComp) {
1856
1894
  instance.ceReload(newComp.styles);
1857
1895
  hmrDirtyComponents.delete(oldComp);
1858
1896
  } else if (instance.parent) {
1897
+ instance.parent.effect.dirty = true;
1859
1898
  queueJob(instance.parent.update);
1860
1899
  } else if (instance.appContext.reload) {
1861
1900
  instance.appContext.reload();
@@ -3040,8 +3079,15 @@ function watch(source, cb, options) {
3040
3079
  }
3041
3080
  return doWatch(source, cb, options);
3042
3081
  }
3043
- function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
3082
+ function doWatch(source, cb, { immediate, deep, flush, once, onTrack, onTrigger } = EMPTY_OBJ) {
3044
3083
  var _a;
3084
+ if (cb && once) {
3085
+ const _cb = cb;
3086
+ cb = (...args) => {
3087
+ _cb(...args);
3088
+ unwatch();
3089
+ };
3090
+ }
3045
3091
  if (!cb) {
3046
3092
  if (immediate !== void 0) {
3047
3093
  warn(
@@ -3053,6 +3099,11 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3053
3099
  `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
3054
3100
  );
3055
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
+ }
3056
3107
  }
3057
3108
  const warnInvalidSource = (s) => {
3058
3109
  warn(
@@ -3120,7 +3171,7 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3120
3171
  };
3121
3172
  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
3122
3173
  const job = () => {
3123
- if (!effect.active) {
3174
+ if (!effect.active || !effect.dirty) {
3124
3175
  return;
3125
3176
  }
3126
3177
  if (cb) {
@@ -3153,7 +3204,13 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3153
3204
  job.id = instance.uid;
3154
3205
  scheduler = () => queueJob(job);
3155
3206
  }
3156
- 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
+ };
3157
3214
  {
3158
3215
  effect.onTrack = onTrack;
3159
3216
  effect.onTrigger = onTrigger;
@@ -3172,12 +3229,6 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3172
3229
  } else {
3173
3230
  effect.run();
3174
3231
  }
3175
- const unwatch = () => {
3176
- effect.stop();
3177
- if (instance && instance.scope) {
3178
- remove(instance.scope.effects, effect);
3179
- }
3180
- };
3181
3232
  return unwatch;
3182
3233
  }
3183
3234
  function instanceWatch(source, value, options) {
@@ -3407,6 +3458,7 @@ const BaseTransitionImpl = {
3407
3458
  leavingHooks.afterLeave = () => {
3408
3459
  state.isLeaving = false;
3409
3460
  if (instance.update.active !== false) {
3461
+ instance.effect.dirty = true;
3410
3462
  instance.update();
3411
3463
  }
3412
3464
  };
@@ -3742,6 +3794,7 @@ function defineAsyncComponent(source) {
3742
3794
  load().then(() => {
3743
3795
  loaded.value = true;
3744
3796
  if (instance.parent && isKeepAlive(instance.parent.vnode)) {
3797
+ instance.parent.effect.dirty = true;
3745
3798
  queueJob(instance.parent.update);
3746
3799
  }
3747
3800
  }).catch((err) => {
@@ -4036,7 +4089,7 @@ function injectHook(type, hook, target = currentInstance, prepend = false) {
4036
4089
  }
4037
4090
  return wrappedHook;
4038
4091
  } else {
4039
- const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ""));
4092
+ const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, ""));
4040
4093
  warn(
4041
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.` )
4042
4095
  );
@@ -4258,7 +4311,10 @@ const publicPropertiesMap = (
4258
4311
  $root: (i) => getPublicInstance(i.root),
4259
4312
  $emit: (i) => i.emit,
4260
4313
  $options: (i) => resolveMergedOptions(i) ,
4261
- $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
+ }),
4262
4318
  $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
4263
4319
  $watch: (i) => instanceWatch.bind(i)
4264
4320
  })
@@ -7009,6 +7065,7 @@ function baseCreateRenderer(options, createHydrationFns) {
7009
7065
  } else {
7010
7066
  instance.next = n2;
7011
7067
  invalidateJob(instance.update);
7068
+ instance.effect.dirty = true;
7012
7069
  instance.update();
7013
7070
  }
7014
7071
  } else {
@@ -7178,11 +7235,16 @@ function baseCreateRenderer(options, createHydrationFns) {
7178
7235
  };
7179
7236
  const effect = instance.effect = new ReactiveEffect(
7180
7237
  componentUpdateFn,
7238
+ NOOP,
7181
7239
  () => queueJob(update),
7182
7240
  instance.scope
7183
7241
  // track it in component's effect scope
7184
7242
  );
7185
- const update = instance.update = () => effect.run();
7243
+ const update = instance.update = () => {
7244
+ if (effect.dirty) {
7245
+ effect.run();
7246
+ }
7247
+ };
7186
7248
  update.id = instance.uid;
7187
7249
  toggleRecurse(instance, true);
7188
7250
  {
@@ -9072,7 +9134,8 @@ function isMemoSame(cached, memo) {
9072
9134
  return true;
9073
9135
  }
9074
9136
 
9075
- const version = "3.3.7";
9137
+ const version = "3.4.0-alpha.1";
9138
+ const ErrorTypeStrings = ErrorTypeStrings$1 ;
9076
9139
  const ssrUtils = null;
9077
9140
  const resolveFilter = null;
9078
9141
  const compatUtils = null;
@@ -10558,4 +10621,4 @@ function normalizeContainer(container) {
10558
10621
  }
10559
10622
  const initDirectivesForSSR = NOOP;
10560
10623
 
10561
- 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 };