@vue/compat 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(!!(process.env.NODE_ENV !== "production") ? "iterate" : "");
396
- const MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== "production") ? "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
+ if (!!(process.env.NODE_ENV !== "production")) {
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
+ if (!!(process.env.NODE_ENV !== "production")) {
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(!!(process.env.NODE_ENV !== "production") ? "iterate" : "");
558
+ const MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== "production") ? "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 = !!(process.env.NODE_ENV !== "production") ? { effect: activeEffect, target, type, key } : void 0;
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 (!!(process.env.NODE_ENV !== "production") && activeEffect.onTrack) {
521
- activeEffect.onTrack(
522
- extend(
523
- {
524
- effect: activeEffect
525
- },
526
- debuggerEventExtraInfo
527
- )
528
- );
529
- }
567
+ depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
568
+ }
569
+ trackEffect(
570
+ activeEffect,
571
+ dep,
572
+ !!(process.env.NODE_ENV !== "production") ? {
573
+ target,
574
+ type,
575
+ key
576
+ } : void 0
577
+ );
530
578
  }
531
579
  }
532
580
  function trigger(target, type, key, newValue, oldValue, oldTarget) {
@@ -574,53 +622,24 @@ function trigger(target, type, key, newValue, oldValue, oldTarget) {
574
622
  break;
575
623
  }
576
624
  }
577
- const eventInfo = !!(process.env.NODE_ENV !== "production") ? { target, type, key, newValue, oldValue, oldTarget } : void 0;
578
- if (deps.length === 1) {
579
- if (deps[0]) {
580
- if (!!(process.env.NODE_ENV !== "production")) {
581
- triggerEffects(deps[0], eventInfo);
582
- } else {
583
- triggerEffects(deps[0]);
584
- }
585
- }
586
- } else {
587
- const effects = [];
588
- for (const dep of deps) {
589
- if (dep) {
590
- effects.push(...dep);
591
- }
592
- }
593
- if (!!(process.env.NODE_ENV !== "production")) {
594
- triggerEffects(createDep(effects), eventInfo);
595
- } else {
596
- triggerEffects(createDep(effects));
597
- }
598
- }
599
- }
600
- function triggerEffects(dep, debuggerEventExtraInfo) {
601
- const effects = isArray(dep) ? dep : [...dep];
602
- for (const effect2 of effects) {
603
- if (effect2.computed) {
604
- triggerEffect(effect2, debuggerEventExtraInfo);
605
- }
606
- }
607
- for (const effect2 of effects) {
608
- if (!effect2.computed) {
609
- triggerEffect(effect2, debuggerEventExtraInfo);
610
- }
611
- }
612
- }
613
- function triggerEffect(effect2, debuggerEventExtraInfo) {
614
- if (effect2 !== activeEffect || effect2.allowRecurse) {
615
- if (!!(process.env.NODE_ENV !== "production") && effect2.onTrigger) {
616
- effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));
617
- }
618
- if (effect2.scheduler) {
619
- effect2.scheduler();
620
- } else {
621
- effect2.run();
625
+ pauseScheduling();
626
+ for (const dep of deps) {
627
+ if (dep) {
628
+ triggerEffects(
629
+ dep,
630
+ 3,
631
+ !!(process.env.NODE_ENV !== "production") ? {
632
+ target,
633
+ type,
634
+ key,
635
+ newValue,
636
+ oldValue,
637
+ oldTarget
638
+ } : void 0
639
+ );
622
640
  }
623
641
  }
642
+ resetScheduling();
624
643
  }
625
644
  function getDepFromReactive(object, key) {
626
645
  var _a;
@@ -651,7 +670,9 @@ function createArrayInstrumentations() {
651
670
  ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
652
671
  instrumentations[key] = function(...args) {
653
672
  pauseTracking();
673
+ pauseScheduling();
654
674
  const res = toRaw(this)[key].apply(this, args);
675
+ resetScheduling();
655
676
  resetTracking();
656
677
  return res;
657
678
  };
@@ -1190,34 +1211,93 @@ function markRaw(value) {
1190
1211
  const toReactive = (value) => isObject(value) ? reactive(value) : value;
1191
1212
  const toReadonly = (value) => isObject(value) ? readonly(value) : value;
1192
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 = !!(process.env.NODE_ENV !== "production") ? () => {
1256
+ console.warn("Write operation failed: computed value is readonly");
1257
+ } : NOOP;
1258
+ } else {
1259
+ getter = getterOrOptions.get;
1260
+ setter = getterOrOptions.set;
1261
+ }
1262
+ const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
1263
+ if (!!(process.env.NODE_ENV !== "production") && debugOptions && !isSSR) {
1264
+ cRef.effect.onTrack = debugOptions.onTrack;
1265
+ cRef.effect.onTrigger = debugOptions.onTrigger;
1266
+ }
1267
+ return cRef;
1268
+ }
1269
+
1193
1270
  function trackRefValue(ref2) {
1194
1271
  if (shouldTrack && activeEffect) {
1195
1272
  ref2 = toRaw(ref2);
1196
- if (!!(process.env.NODE_ENV !== "production")) {
1197
- 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
+ !!(process.env.NODE_ENV !== "production") ? {
1198
1280
  target: ref2,
1199
1281
  type: "get",
1200
1282
  key: "value"
1201
- });
1202
- } else {
1203
- trackEffects(ref2.dep || (ref2.dep = createDep()));
1204
- }
1283
+ } : void 0
1284
+ );
1205
1285
  }
1206
1286
  }
1207
- function triggerRefValue(ref2, newVal) {
1287
+ function triggerRefValue(ref2, dirtyLevel = 3, newVal) {
1208
1288
  ref2 = toRaw(ref2);
1209
1289
  const dep = ref2.dep;
1210
1290
  if (dep) {
1211
- if (!!(process.env.NODE_ENV !== "production")) {
1212
- triggerEffects(dep, {
1291
+ triggerEffects(
1292
+ dep,
1293
+ dirtyLevel,
1294
+ !!(process.env.NODE_ENV !== "production") ? {
1213
1295
  target: ref2,
1214
1296
  type: "set",
1215
1297
  key: "value",
1216
1298
  newValue: newVal
1217
- });
1218
- } else {
1219
- triggerEffects(dep);
1220
- }
1299
+ } : void 0
1300
+ );
1221
1301
  }
1222
1302
  }
1223
1303
  function isRef(r) {
@@ -1253,12 +1333,12 @@ class RefImpl {
1253
1333
  if (hasChanged(newVal, this._rawValue)) {
1254
1334
  this._rawValue = newVal;
1255
1335
  this._value = useDirectValue ? newVal : toReactive(newVal);
1256
- triggerRefValue(this, newVal);
1336
+ triggerRefValue(this, 3, newVal);
1257
1337
  }
1258
1338
  }
1259
1339
  }
1260
1340
  function triggerRef(ref2) {
1261
- triggerRefValue(ref2, !!(process.env.NODE_ENV !== "production") ? ref2.value : void 0);
1341
+ triggerRefValue(ref2, 3, !!(process.env.NODE_ENV !== "production") ? ref2.value : void 0);
1262
1342
  }
1263
1343
  function unref(ref2) {
1264
1344
  return isRef(ref2) ? ref2.value : ref2;
@@ -1356,57 +1436,6 @@ function propertyToRef(source, key, defaultValue) {
1356
1436
  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
1357
1437
  }
1358
1438
 
1359
- class ComputedRefImpl {
1360
- constructor(getter, _setter, isReadonly, isSSR) {
1361
- this._setter = _setter;
1362
- this.dep = void 0;
1363
- this.__v_isRef = true;
1364
- this["__v_isReadonly"] = false;
1365
- this._dirty = true;
1366
- this.effect = new ReactiveEffect(getter, () => {
1367
- if (!this._dirty) {
1368
- this._dirty = true;
1369
- triggerRefValue(this);
1370
- }
1371
- });
1372
- this.effect.computed = this;
1373
- this.effect.active = this._cacheable = !isSSR;
1374
- this["__v_isReadonly"] = isReadonly;
1375
- }
1376
- get value() {
1377
- const self = toRaw(this);
1378
- trackRefValue(self);
1379
- if (self._dirty || !self._cacheable) {
1380
- self._dirty = false;
1381
- self._value = self.effect.run();
1382
- }
1383
- return self._value;
1384
- }
1385
- set value(newValue) {
1386
- this._setter(newValue);
1387
- }
1388
- }
1389
- function computed$1(getterOrOptions, debugOptions, isSSR = false) {
1390
- let getter;
1391
- let setter;
1392
- const onlyGetter = isFunction(getterOrOptions);
1393
- if (onlyGetter) {
1394
- getter = getterOrOptions;
1395
- setter = !!(process.env.NODE_ENV !== "production") ? () => {
1396
- console.warn("Write operation failed: computed value is readonly");
1397
- } : NOOP;
1398
- } else {
1399
- getter = getterOrOptions.get;
1400
- setter = getterOrOptions.set;
1401
- }
1402
- const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
1403
- if (!!(process.env.NODE_ENV !== "production") && debugOptions && !isSSR) {
1404
- cRef.effect.onTrack = debugOptions.onTrack;
1405
- cRef.effect.onTrigger = debugOptions.onTrigger;
1406
- }
1407
- return cRef;
1408
- }
1409
-
1410
1439
  const stack = [];
1411
1440
  function pushWarningContext(vnode) {
1412
1441
  stack.push(vnode);
@@ -1525,7 +1554,7 @@ function assertNumber(val, type) {
1525
1554
  }
1526
1555
  }
1527
1556
 
1528
- const ErrorTypeStrings = {
1557
+ const ErrorTypeStrings$1 = {
1529
1558
  ["sp"]: "serverPrefetch hook",
1530
1559
  ["bc"]: "beforeCreate hook",
1531
1560
  ["c"]: "created hook",
@@ -1586,7 +1615,7 @@ function handleError(err, instance, type, throwInDev = true) {
1586
1615
  if (instance) {
1587
1616
  let cur = instance.parent;
1588
1617
  const exposedInstance = instance.proxy;
1589
- const errorInfo = !!(process.env.NODE_ENV !== "production") ? ErrorTypeStrings[type] : type;
1618
+ const errorInfo = !!(process.env.NODE_ENV !== "production") ? ErrorTypeStrings$1[type] : type;
1590
1619
  while (cur) {
1591
1620
  const errorCapturedHooks = cur.ec;
1592
1621
  if (errorCapturedHooks) {
@@ -1613,7 +1642,7 @@ function handleError(err, instance, type, throwInDev = true) {
1613
1642
  }
1614
1643
  function logError(err, type, contextVNode, throwInDev = true) {
1615
1644
  if (!!(process.env.NODE_ENV !== "production")) {
1616
- const info = ErrorTypeStrings[type];
1645
+ const info = ErrorTypeStrings$1[type];
1617
1646
  if (contextVNode) {
1618
1647
  pushWarningContext(contextVNode);
1619
1648
  }
@@ -1843,6 +1872,7 @@ function rerender(id, newRender) {
1843
1872
  }
1844
1873
  instance.renderCache = [];
1845
1874
  isHmrUpdating = true;
1875
+ instance.effect.dirty = true;
1846
1876
  instance.update();
1847
1877
  isHmrUpdating = false;
1848
1878
  });
@@ -1870,6 +1900,7 @@ function reload(id, newComp) {
1870
1900
  instance.ceReload(newComp.styles);
1871
1901
  hmrDirtyComponents.delete(oldComp);
1872
1902
  } else if (instance.parent) {
1903
+ instance.parent.effect.dirty = true;
1873
1904
  queueJob(instance.parent.update);
1874
1905
  } else if (instance.appContext.reload) {
1875
1906
  instance.appContext.reload();
@@ -3568,8 +3599,15 @@ function watch(source, cb, options) {
3568
3599
  }
3569
3600
  return doWatch(source, cb, options);
3570
3601
  }
3571
- function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
3602
+ function doWatch(source, cb, { immediate, deep, flush, once, onTrack, onTrigger } = EMPTY_OBJ) {
3572
3603
  var _a;
3604
+ if (cb && once) {
3605
+ const _cb = cb;
3606
+ cb = (...args) => {
3607
+ _cb(...args);
3608
+ unwatch();
3609
+ };
3610
+ }
3573
3611
  if (!!(process.env.NODE_ENV !== "production") && !cb) {
3574
3612
  if (immediate !== void 0) {
3575
3613
  warn(
@@ -3581,6 +3619,11 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3581
3619
  `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
3582
3620
  );
3583
3621
  }
3622
+ if (once !== void 0) {
3623
+ warn(
3624
+ `watch() "once" option is only respected when using the watch(source, callback, options?) signature.`
3625
+ );
3626
+ }
3584
3627
  }
3585
3628
  const warnInvalidSource = (s) => {
3586
3629
  warn(
@@ -3677,7 +3720,7 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3677
3720
  }
3678
3721
  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
3679
3722
  const job = () => {
3680
- if (!effect.active) {
3723
+ if (!effect.active || !effect.dirty) {
3681
3724
  return;
3682
3725
  }
3683
3726
  if (cb) {
@@ -3710,7 +3753,13 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3710
3753
  job.id = instance.uid;
3711
3754
  scheduler = () => queueJob(job);
3712
3755
  }
3713
- const effect = new ReactiveEffect(getter, scheduler);
3756
+ const effect = new ReactiveEffect(getter, NOOP, scheduler);
3757
+ const unwatch = () => {
3758
+ effect.stop();
3759
+ if (instance && instance.scope) {
3760
+ remove(instance.scope.effects, effect);
3761
+ }
3762
+ };
3714
3763
  if (!!(process.env.NODE_ENV !== "production")) {
3715
3764
  effect.onTrack = onTrack;
3716
3765
  effect.onTrigger = onTrigger;
@@ -3729,12 +3778,6 @@ function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EM
3729
3778
  } else {
3730
3779
  effect.run();
3731
3780
  }
3732
- const unwatch = () => {
3733
- effect.stop();
3734
- if (instance && instance.scope) {
3735
- remove(instance.scope.effects, effect);
3736
- }
3737
- };
3738
3781
  if (ssrCleanup)
3739
3782
  ssrCleanup.push(unwatch);
3740
3783
  return unwatch;
@@ -3971,6 +4014,7 @@ const BaseTransitionImpl = {
3971
4014
  leavingHooks.afterLeave = () => {
3972
4015
  state.isLeaving = false;
3973
4016
  if (instance.update.active !== false) {
4017
+ instance.effect.dirty = true;
3974
4018
  instance.update();
3975
4019
  }
3976
4020
  };
@@ -4309,6 +4353,7 @@ function defineAsyncComponent(source) {
4309
4353
  load().then(() => {
4310
4354
  loaded.value = true;
4311
4355
  if (instance.parent && isKeepAlive(instance.parent.vnode)) {
4356
+ instance.parent.effect.dirty = true;
4312
4357
  queueJob(instance.parent.update);
4313
4358
  }
4314
4359
  }).catch((err) => {
@@ -4612,7 +4657,7 @@ function injectHook(type, hook, target = currentInstance, prepend = false) {
4612
4657
  }
4613
4658
  return wrappedHook;
4614
4659
  } else if (!!(process.env.NODE_ENV !== "production")) {
4615
- const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ""));
4660
+ const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, ""));
4616
4661
  warn(
4617
4662
  `${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.` )
4618
4663
  );
@@ -5334,7 +5379,10 @@ const publicPropertiesMap = (
5334
5379
  $root: (i) => getPublicInstance(i.root),
5335
5380
  $emit: (i) => i.emit,
5336
5381
  $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,
5337
- $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),
5382
+ $forceUpdate: (i) => i.f || (i.f = () => {
5383
+ i.effect.dirty = true;
5384
+ queueJob(i.update);
5385
+ }),
5338
5386
  $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
5339
5387
  $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP
5340
5388
  })
@@ -6237,7 +6285,7 @@ function createCompatVue$1(createApp, createSingletonApp) {
6237
6285
  return vm;
6238
6286
  }
6239
6287
  }
6240
- Vue.version = `2.6.14-compat:${"3.3.7"}`;
6288
+ Vue.version = `2.6.14-compat:${"3.4.0-alpha.1"}`;
6241
6289
  Vue.config = singletonApp.config;
6242
6290
  Vue.use = (p, ...options) => {
6243
6291
  if (p && isFunction(p.install)) {
@@ -8680,6 +8728,7 @@ function baseCreateRenderer(options, createHydrationFns) {
8680
8728
  } else {
8681
8729
  instance.next = n2;
8682
8730
  invalidateJob(instance.update);
8731
+ instance.effect.dirty = true;
8683
8732
  instance.update();
8684
8733
  }
8685
8734
  } else {
@@ -8873,11 +8922,16 @@ function baseCreateRenderer(options, createHydrationFns) {
8873
8922
  };
8874
8923
  const effect = instance.effect = new ReactiveEffect(
8875
8924
  componentUpdateFn,
8925
+ NOOP,
8876
8926
  () => queueJob(update),
8877
8927
  instance.scope
8878
8928
  // track it in component's effect scope
8879
8929
  );
8880
- const update = instance.update = () => effect.run();
8930
+ const update = instance.update = () => {
8931
+ if (effect.dirty) {
8932
+ effect.run();
8933
+ }
8934
+ };
8881
8935
  update.id = instance.uid;
8882
8936
  toggleRecurse(instance, true);
8883
8937
  if (!!(process.env.NODE_ENV !== "production")) {
@@ -10877,7 +10931,8 @@ function isMemoSame(cached, memo) {
10877
10931
  return true;
10878
10932
  }
10879
10933
 
10880
- const version = "3.3.7";
10934
+ const version = "3.4.0-alpha.1";
10935
+ const ErrorTypeStrings = ErrorTypeStrings$1 ;
10881
10936
  const _ssrUtils = {
10882
10937
  createComponentInstance,
10883
10938
  setupComponent,
@@ -12569,6 +12624,7 @@ var runtimeDom = /*#__PURE__*/Object.freeze({
12569
12624
  BaseTransitionPropsValidators: BaseTransitionPropsValidators,
12570
12625
  Comment: Comment,
12571
12626
  EffectScope: EffectScope,
12627
+ ErrorTypeStrings: ErrorTypeStrings,
12572
12628
  Fragment: Fragment,
12573
12629
  KeepAlive: KeepAlive,
12574
12630
  ReactiveEffect: ReactiveEffect,
@@ -12759,4 +12815,4 @@ var Vue$1 = Vue;
12759
12815
 
12760
12816
  const { configureCompat } = Vue$1;
12761
12817
 
12762
- export { BaseTransition, BaseTransitionPropsValidators, Comment, EffectScope, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, Transition, TransitionGroup, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, computed, configureCompat, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, Vue$1 as default, 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 };
12818
+ export { BaseTransition, BaseTransitionPropsValidators, Comment, EffectScope, ErrorTypeStrings, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, Transition, TransitionGroup, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, computed, configureCompat, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, Vue$1 as default, 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 };