reactivity.cjs.js 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282
  1. /**
  2. * @vue/reactivity v3.4.23
  3. * (c) 2018-present Yuxi (Evan) You and Vue contributors
  4. * @license MIT
  5. **/
  6. 'use strict';
  7. Object.defineProperty(exports, '__esModule', { value: true });
  8. var shared = require('@vue/shared');
  9. function warn(msg, ...args) {
  10. console.warn(`[Vue warn] ${msg}`, ...args);
  11. }
  12. let activeEffectScope;
  13. class EffectScope {
  14. constructor(detached = false) {
  15. this.detached = detached;
  16. /**
  17. * @internal
  18. */
  19. this._active = true;
  20. /**
  21. * @internal
  22. */
  23. this.effects = [];
  24. /**
  25. * @internal
  26. */
  27. this.cleanups = [];
  28. this.parent = activeEffectScope;
  29. if (!detached && activeEffectScope) {
  30. this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
  31. this
  32. ) - 1;
  33. }
  34. }
  35. get active() {
  36. return this._active;
  37. }
  38. run(fn) {
  39. if (this._active) {
  40. const currentEffectScope = activeEffectScope;
  41. try {
  42. activeEffectScope = this;
  43. return fn();
  44. } finally {
  45. activeEffectScope = currentEffectScope;
  46. }
  47. } else {
  48. warn(`cannot run an inactive effect scope.`);
  49. }
  50. }
  51. /**
  52. * This should only be called on non-detached scopes
  53. * @internal
  54. */
  55. on() {
  56. activeEffectScope = this;
  57. }
  58. /**
  59. * This should only be called on non-detached scopes
  60. * @internal
  61. */
  62. off() {
  63. activeEffectScope = this.parent;
  64. }
  65. stop(fromParent) {
  66. if (this._active) {
  67. let i, l;
  68. for (i = 0, l = this.effects.length; i < l; i++) {
  69. this.effects[i].stop();
  70. }
  71. for (i = 0, l = this.cleanups.length; i < l; i++) {
  72. this.cleanups[i]();
  73. }
  74. if (this.scopes) {
  75. for (i = 0, l = this.scopes.length; i < l; i++) {
  76. this.scopes[i].stop(true);
  77. }
  78. }
  79. if (!this.detached && this.parent && !fromParent) {
  80. const last = this.parent.scopes.pop();
  81. if (last && last !== this) {
  82. this.parent.scopes[this.index] = last;
  83. last.index = this.index;
  84. }
  85. }
  86. this.parent = void 0;
  87. this._active = false;
  88. }
  89. }
  90. }
  91. function effectScope(detached) {
  92. return new EffectScope(detached);
  93. }
  94. function recordEffectScope(effect, scope = activeEffectScope) {
  95. if (scope && scope.active) {
  96. scope.effects.push(effect);
  97. }
  98. }
  99. function getCurrentScope() {
  100. return activeEffectScope;
  101. }
  102. function onScopeDispose(fn) {
  103. if (activeEffectScope) {
  104. activeEffectScope.cleanups.push(fn);
  105. } else {
  106. warn(
  107. `onScopeDispose() is called when there is no active effect scope to be associated with.`
  108. );
  109. }
  110. }
  111. let activeEffect;
  112. class ReactiveEffect {
  113. constructor(fn, trigger, scheduler, scope) {
  114. this.fn = fn;
  115. this.trigger = trigger;
  116. this.scheduler = scheduler;
  117. this.active = true;
  118. this.deps = [];
  119. /**
  120. * @internal
  121. */
  122. this._dirtyLevel = 4;
  123. /**
  124. * @internal
  125. */
  126. this._trackId = 0;
  127. /**
  128. * @internal
  129. */
  130. this._runnings = 0;
  131. /**
  132. * @internal
  133. */
  134. this._shouldSchedule = false;
  135. /**
  136. * @internal
  137. */
  138. this._depsLength = 0;
  139. recordEffectScope(this, scope);
  140. }
  141. get dirty() {
  142. if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {
  143. this._dirtyLevel = 1;
  144. pauseTracking();
  145. for (let i = 0; i < this._depsLength; i++) {
  146. const dep = this.deps[i];
  147. if (dep.computed) {
  148. triggerComputed(dep.computed);
  149. if (this._dirtyLevel >= 4) {
  150. break;
  151. }
  152. }
  153. }
  154. if (this._dirtyLevel === 1) {
  155. this._dirtyLevel = 0;
  156. }
  157. resetTracking();
  158. }
  159. return this._dirtyLevel >= 4;
  160. }
  161. set dirty(v) {
  162. this._dirtyLevel = v ? 4 : 0;
  163. }
  164. run() {
  165. this._dirtyLevel = 0;
  166. if (!this.active) {
  167. return this.fn();
  168. }
  169. let lastShouldTrack = shouldTrack;
  170. let lastEffect = activeEffect;
  171. try {
  172. shouldTrack = true;
  173. activeEffect = this;
  174. this._runnings++;
  175. preCleanupEffect(this);
  176. return this.fn();
  177. } finally {
  178. postCleanupEffect(this);
  179. this._runnings--;
  180. activeEffect = lastEffect;
  181. shouldTrack = lastShouldTrack;
  182. }
  183. }
  184. stop() {
  185. var _a;
  186. if (this.active) {
  187. preCleanupEffect(this);
  188. postCleanupEffect(this);
  189. (_a = this.onStop) == null ? void 0 : _a.call(this);
  190. this.active = false;
  191. }
  192. }
  193. }
  194. function triggerComputed(computed) {
  195. return computed.value;
  196. }
  197. function preCleanupEffect(effect2) {
  198. effect2._trackId++;
  199. effect2._depsLength = 0;
  200. }
  201. function postCleanupEffect(effect2) {
  202. if (effect2.deps.length > effect2._depsLength) {
  203. for (let i = effect2._depsLength; i < effect2.deps.length; i++) {
  204. cleanupDepEffect(effect2.deps[i], effect2);
  205. }
  206. effect2.deps.length = effect2._depsLength;
  207. }
  208. }
  209. function cleanupDepEffect(dep, effect2) {
  210. const trackId = dep.get(effect2);
  211. if (trackId !== void 0 && effect2._trackId !== trackId) {
  212. dep.delete(effect2);
  213. if (dep.size === 0) {
  214. dep.cleanup();
  215. }
  216. }
  217. }
  218. function effect(fn, options) {
  219. if (fn.effect instanceof ReactiveEffect) {
  220. fn = fn.effect.fn;
  221. }
  222. const _effect = new ReactiveEffect(fn, shared.NOOP, () => {
  223. if (_effect.dirty) {
  224. _effect.run();
  225. }
  226. });
  227. if (options) {
  228. shared.extend(_effect, options);
  229. if (options.scope)
  230. recordEffectScope(_effect, options.scope);
  231. }
  232. if (!options || !options.lazy) {
  233. _effect.run();
  234. }
  235. const runner = _effect.run.bind(_effect);
  236. runner.effect = _effect;
  237. return runner;
  238. }
  239. function stop(runner) {
  240. runner.effect.stop();
  241. }
  242. let shouldTrack = true;
  243. let pauseScheduleStack = 0;
  244. const trackStack = [];
  245. function pauseTracking() {
  246. trackStack.push(shouldTrack);
  247. shouldTrack = false;
  248. }
  249. function enableTracking() {
  250. trackStack.push(shouldTrack);
  251. shouldTrack = true;
  252. }
  253. function resetTracking() {
  254. const last = trackStack.pop();
  255. shouldTrack = last === void 0 ? true : last;
  256. }
  257. function pauseScheduling() {
  258. pauseScheduleStack++;
  259. }
  260. function resetScheduling() {
  261. pauseScheduleStack--;
  262. while (!pauseScheduleStack && queueEffectSchedulers.length) {
  263. queueEffectSchedulers.shift()();
  264. }
  265. }
  266. function trackEffect(effect2, dep, debuggerEventExtraInfo) {
  267. var _a;
  268. if (dep.get(effect2) !== effect2._trackId) {
  269. dep.set(effect2, effect2._trackId);
  270. const oldDep = effect2.deps[effect2._depsLength];
  271. if (oldDep !== dep) {
  272. if (oldDep) {
  273. cleanupDepEffect(oldDep, effect2);
  274. }
  275. effect2.deps[effect2._depsLength++] = dep;
  276. } else {
  277. effect2._depsLength++;
  278. }
  279. {
  280. (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, shared.extend({ effect: effect2 }, debuggerEventExtraInfo));
  281. }
  282. }
  283. }
  284. const queueEffectSchedulers = [];
  285. function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
  286. var _a;
  287. pauseScheduling();
  288. for (const effect2 of dep.keys()) {
  289. let tracking;
  290. if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
  291. effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);
  292. effect2._dirtyLevel = dirtyLevel;
  293. }
  294. if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
  295. {
  296. (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, shared.extend({ effect: effect2 }, debuggerEventExtraInfo));
  297. }
  298. effect2.trigger();
  299. if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {
  300. effect2._shouldSchedule = false;
  301. if (effect2.scheduler) {
  302. queueEffectSchedulers.push(effect2.scheduler);
  303. }
  304. }
  305. }
  306. }
  307. resetScheduling();
  308. }
  309. const createDep = (cleanup, computed) => {
  310. const dep = /* @__PURE__ */ new Map();
  311. dep.cleanup = cleanup;
  312. dep.computed = computed;
  313. return dep;
  314. };
  315. const targetMap = /* @__PURE__ */ new WeakMap();
  316. const ITERATE_KEY = Symbol("iterate" );
  317. const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate" );
  318. function track(target, type, key) {
  319. if (shouldTrack && activeEffect) {
  320. let depsMap = targetMap.get(target);
  321. if (!depsMap) {
  322. targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
  323. }
  324. let dep = depsMap.get(key);
  325. if (!dep) {
  326. depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
  327. }
  328. trackEffect(
  329. activeEffect,
  330. dep,
  331. {
  332. target,
  333. type,
  334. key
  335. }
  336. );
  337. }
  338. }
  339. function trigger(target, type, key, newValue, oldValue, oldTarget) {
  340. const depsMap = targetMap.get(target);
  341. if (!depsMap) {
  342. return;
  343. }
  344. let deps = [];
  345. if (type === "clear") {
  346. deps = [...depsMap.values()];
  347. } else if (key === "length" && shared.isArray(target)) {
  348. const newLength = Number(newValue);
  349. depsMap.forEach((dep, key2) => {
  350. if (key2 === "length" || !shared.isSymbol(key2) && key2 >= newLength) {
  351. deps.push(dep);
  352. }
  353. });
  354. } else {
  355. if (key !== void 0) {
  356. deps.push(depsMap.get(key));
  357. }
  358. switch (type) {
  359. case "add":
  360. if (!shared.isArray(target)) {
  361. deps.push(depsMap.get(ITERATE_KEY));
  362. if (shared.isMap(target)) {
  363. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  364. }
  365. } else if (shared.isIntegerKey(key)) {
  366. deps.push(depsMap.get("length"));
  367. }
  368. break;
  369. case "delete":
  370. if (!shared.isArray(target)) {
  371. deps.push(depsMap.get(ITERATE_KEY));
  372. if (shared.isMap(target)) {
  373. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  374. }
  375. }
  376. break;
  377. case "set":
  378. if (shared.isMap(target)) {
  379. deps.push(depsMap.get(ITERATE_KEY));
  380. }
  381. break;
  382. }
  383. }
  384. pauseScheduling();
  385. for (const dep of deps) {
  386. if (dep) {
  387. triggerEffects(
  388. dep,
  389. 4,
  390. {
  391. target,
  392. type,
  393. key,
  394. newValue,
  395. oldValue,
  396. oldTarget
  397. }
  398. );
  399. }
  400. }
  401. resetScheduling();
  402. }
  403. function getDepFromReactive(object, key) {
  404. var _a;
  405. return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);
  406. }
  407. const isNonTrackableKeys = /* @__PURE__ */ shared.makeMap(`__proto__,__v_isRef,__isVue`);
  408. const builtInSymbols = new Set(
  409. /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(shared.isSymbol)
  410. );
  411. const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
  412. function createArrayInstrumentations() {
  413. const instrumentations = {};
  414. ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
  415. instrumentations[key] = function(...args) {
  416. const arr = toRaw(this);
  417. for (let i = 0, l = this.length; i < l; i++) {
  418. track(arr, "get", i + "");
  419. }
  420. const res = arr[key](...args);
  421. if (res === -1 || res === false) {
  422. return arr[key](...args.map(toRaw));
  423. } else {
  424. return res;
  425. }
  426. };
  427. });
  428. ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
  429. instrumentations[key] = function(...args) {
  430. pauseTracking();
  431. pauseScheduling();
  432. const res = toRaw(this)[key].apply(this, args);
  433. resetScheduling();
  434. resetTracking();
  435. return res;
  436. };
  437. });
  438. return instrumentations;
  439. }
  440. function hasOwnProperty(key) {
  441. if (!shared.isSymbol(key))
  442. key = String(key);
  443. const obj = toRaw(this);
  444. track(obj, "has", key);
  445. return obj.hasOwnProperty(key);
  446. }
  447. class BaseReactiveHandler {
  448. constructor(_isReadonly = false, _isShallow = false) {
  449. this._isReadonly = _isReadonly;
  450. this._isShallow = _isShallow;
  451. }
  452. get(target, key, receiver) {
  453. const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;
  454. if (key === "__v_isReactive") {
  455. return !isReadonly2;
  456. } else if (key === "__v_isReadonly") {
  457. return isReadonly2;
  458. } else if (key === "__v_isShallow") {
  459. return isShallow2;
  460. } else if (key === "__v_raw") {
  461. if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype
  462. // this means the reciever is a user proxy of the reactive proxy
  463. Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {
  464. return target;
  465. }
  466. return;
  467. }
  468. const targetIsArray = shared.isArray(target);
  469. if (!isReadonly2) {
  470. if (targetIsArray && shared.hasOwn(arrayInstrumentations, key)) {
  471. return Reflect.get(arrayInstrumentations, key, receiver);
  472. }
  473. if (key === "hasOwnProperty") {
  474. return hasOwnProperty;
  475. }
  476. }
  477. const res = Reflect.get(target, key, receiver);
  478. if (shared.isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
  479. return res;
  480. }
  481. if (!isReadonly2) {
  482. track(target, "get", key);
  483. }
  484. if (isShallow2) {
  485. return res;
  486. }
  487. if (isRef(res)) {
  488. return targetIsArray && shared.isIntegerKey(key) ? res : res.value;
  489. }
  490. if (shared.isObject(res)) {
  491. return isReadonly2 ? readonly(res) : reactive(res);
  492. }
  493. return res;
  494. }
  495. }
  496. class MutableReactiveHandler extends BaseReactiveHandler {
  497. constructor(isShallow2 = false) {
  498. super(false, isShallow2);
  499. }
  500. set(target, key, value, receiver) {
  501. let oldValue = target[key];
  502. if (!this._isShallow) {
  503. const isOldValueReadonly = isReadonly(oldValue);
  504. if (!isShallow(value) && !isReadonly(value)) {
  505. oldValue = toRaw(oldValue);
  506. value = toRaw(value);
  507. }
  508. if (!shared.isArray(target) && isRef(oldValue) && !isRef(value)) {
  509. if (isOldValueReadonly) {
  510. return false;
  511. } else {
  512. oldValue.value = value;
  513. return true;
  514. }
  515. }
  516. }
  517. const hadKey = shared.isArray(target) && shared.isIntegerKey(key) ? Number(key) < target.length : shared.hasOwn(target, key);
  518. const result = Reflect.set(target, key, value, receiver);
  519. if (target === toRaw(receiver)) {
  520. if (!hadKey) {
  521. trigger(target, "add", key, value);
  522. } else if (shared.hasChanged(value, oldValue)) {
  523. trigger(target, "set", key, value, oldValue);
  524. }
  525. }
  526. return result;
  527. }
  528. deleteProperty(target, key) {
  529. const hadKey = shared.hasOwn(target, key);
  530. const oldValue = target[key];
  531. const result = Reflect.deleteProperty(target, key);
  532. if (result && hadKey) {
  533. trigger(target, "delete", key, void 0, oldValue);
  534. }
  535. return result;
  536. }
  537. has(target, key) {
  538. const result = Reflect.has(target, key);
  539. if (!shared.isSymbol(key) || !builtInSymbols.has(key)) {
  540. track(target, "has", key);
  541. }
  542. return result;
  543. }
  544. ownKeys(target) {
  545. track(
  546. target,
  547. "iterate",
  548. shared.isArray(target) ? "length" : ITERATE_KEY
  549. );
  550. return Reflect.ownKeys(target);
  551. }
  552. }
  553. class ReadonlyReactiveHandler extends BaseReactiveHandler {
  554. constructor(isShallow2 = false) {
  555. super(true, isShallow2);
  556. }
  557. set(target, key) {
  558. {
  559. warn(
  560. `Set operation on key "${String(key)}" failed: target is readonly.`,
  561. target
  562. );
  563. }
  564. return true;
  565. }
  566. deleteProperty(target, key) {
  567. {
  568. warn(
  569. `Delete operation on key "${String(key)}" failed: target is readonly.`,
  570. target
  571. );
  572. }
  573. return true;
  574. }
  575. }
  576. const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();
  577. const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();
  578. const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(
  579. true
  580. );
  581. const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);
  582. const toShallow = (value) => value;
  583. const getProto = (v) => Reflect.getPrototypeOf(v);
  584. function get(target, key, isReadonly = false, isShallow = false) {
  585. target = target["__v_raw"];
  586. const rawTarget = toRaw(target);
  587. const rawKey = toRaw(key);
  588. if (!isReadonly) {
  589. if (shared.hasChanged(key, rawKey)) {
  590. track(rawTarget, "get", key);
  591. }
  592. track(rawTarget, "get", rawKey);
  593. }
  594. const { has: has2 } = getProto(rawTarget);
  595. const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  596. if (has2.call(rawTarget, key)) {
  597. return wrap(target.get(key));
  598. } else if (has2.call(rawTarget, rawKey)) {
  599. return wrap(target.get(rawKey));
  600. } else if (target !== rawTarget) {
  601. target.get(key);
  602. }
  603. }
  604. function has(key, isReadonly = false) {
  605. const target = this["__v_raw"];
  606. const rawTarget = toRaw(target);
  607. const rawKey = toRaw(key);
  608. if (!isReadonly) {
  609. if (shared.hasChanged(key, rawKey)) {
  610. track(rawTarget, "has", key);
  611. }
  612. track(rawTarget, "has", rawKey);
  613. }
  614. return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
  615. }
  616. function size(target, isReadonly = false) {
  617. target = target["__v_raw"];
  618. !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY);
  619. return Reflect.get(target, "size", target);
  620. }
  621. function add(value) {
  622. value = toRaw(value);
  623. const target = toRaw(this);
  624. const proto = getProto(target);
  625. const hadKey = proto.has.call(target, value);
  626. if (!hadKey) {
  627. target.add(value);
  628. trigger(target, "add", value, value);
  629. }
  630. return this;
  631. }
  632. function set(key, value) {
  633. value = toRaw(value);
  634. const target = toRaw(this);
  635. const { has: has2, get: get2 } = getProto(target);
  636. let hadKey = has2.call(target, key);
  637. if (!hadKey) {
  638. key = toRaw(key);
  639. hadKey = has2.call(target, key);
  640. } else {
  641. checkIdentityKeys(target, has2, key);
  642. }
  643. const oldValue = get2.call(target, key);
  644. target.set(key, value);
  645. if (!hadKey) {
  646. trigger(target, "add", key, value);
  647. } else if (shared.hasChanged(value, oldValue)) {
  648. trigger(target, "set", key, value, oldValue);
  649. }
  650. return this;
  651. }
  652. function deleteEntry(key) {
  653. const target = toRaw(this);
  654. const { has: has2, get: get2 } = getProto(target);
  655. let hadKey = has2.call(target, key);
  656. if (!hadKey) {
  657. key = toRaw(key);
  658. hadKey = has2.call(target, key);
  659. } else {
  660. checkIdentityKeys(target, has2, key);
  661. }
  662. const oldValue = get2 ? get2.call(target, key) : void 0;
  663. const result = target.delete(key);
  664. if (hadKey) {
  665. trigger(target, "delete", key, void 0, oldValue);
  666. }
  667. return result;
  668. }
  669. function clear() {
  670. const target = toRaw(this);
  671. const hadItems = target.size !== 0;
  672. const oldTarget = shared.isMap(target) ? new Map(target) : new Set(target) ;
  673. const result = target.clear();
  674. if (hadItems) {
  675. trigger(target, "clear", void 0, void 0, oldTarget);
  676. }
  677. return result;
  678. }
  679. function createForEach(isReadonly, isShallow) {
  680. return function forEach(callback, thisArg) {
  681. const observed = this;
  682. const target = observed["__v_raw"];
  683. const rawTarget = toRaw(target);
  684. const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  685. !isReadonly && track(rawTarget, "iterate", ITERATE_KEY);
  686. return target.forEach((value, key) => {
  687. return callback.call(thisArg, wrap(value), wrap(key), observed);
  688. });
  689. };
  690. }
  691. function createIterableMethod(method, isReadonly, isShallow) {
  692. return function(...args) {
  693. const target = this["__v_raw"];
  694. const rawTarget = toRaw(target);
  695. const targetIsMap = shared.isMap(rawTarget);
  696. const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
  697. const isKeyOnly = method === "keys" && targetIsMap;
  698. const innerIterator = target[method](...args);
  699. const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  700. !isReadonly && track(
  701. rawTarget,
  702. "iterate",
  703. isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
  704. );
  705. return {
  706. // iterator protocol
  707. next() {
  708. const { value, done } = innerIterator.next();
  709. return done ? { value, done } : {
  710. value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
  711. done
  712. };
  713. },
  714. // iterable protocol
  715. [Symbol.iterator]() {
  716. return this;
  717. }
  718. };
  719. };
  720. }
  721. function createReadonlyMethod(type) {
  722. return function(...args) {
  723. {
  724. const key = args[0] ? `on key "${args[0]}" ` : ``;
  725. warn(
  726. `${shared.capitalize(type)} operation ${key}failed: target is readonly.`,
  727. toRaw(this)
  728. );
  729. }
  730. return type === "delete" ? false : type === "clear" ? void 0 : this;
  731. };
  732. }
  733. function createInstrumentations() {
  734. const mutableInstrumentations2 = {
  735. get(key) {
  736. return get(this, key);
  737. },
  738. get size() {
  739. return size(this);
  740. },
  741. has,
  742. add,
  743. set,
  744. delete: deleteEntry,
  745. clear,
  746. forEach: createForEach(false, false)
  747. };
  748. const shallowInstrumentations2 = {
  749. get(key) {
  750. return get(this, key, false, true);
  751. },
  752. get size() {
  753. return size(this);
  754. },
  755. has,
  756. add,
  757. set,
  758. delete: deleteEntry,
  759. clear,
  760. forEach: createForEach(false, true)
  761. };
  762. const readonlyInstrumentations2 = {
  763. get(key) {
  764. return get(this, key, true);
  765. },
  766. get size() {
  767. return size(this, true);
  768. },
  769. has(key) {
  770. return has.call(this, key, true);
  771. },
  772. add: createReadonlyMethod("add"),
  773. set: createReadonlyMethod("set"),
  774. delete: createReadonlyMethod("delete"),
  775. clear: createReadonlyMethod("clear"),
  776. forEach: createForEach(true, false)
  777. };
  778. const shallowReadonlyInstrumentations2 = {
  779. get(key) {
  780. return get(this, key, true, true);
  781. },
  782. get size() {
  783. return size(this, true);
  784. },
  785. has(key) {
  786. return has.call(this, key, true);
  787. },
  788. add: createReadonlyMethod("add"),
  789. set: createReadonlyMethod("set"),
  790. delete: createReadonlyMethod("delete"),
  791. clear: createReadonlyMethod("clear"),
  792. forEach: createForEach(true, true)
  793. };
  794. const iteratorMethods = [
  795. "keys",
  796. "values",
  797. "entries",
  798. Symbol.iterator
  799. ];
  800. iteratorMethods.forEach((method) => {
  801. mutableInstrumentations2[method] = createIterableMethod(method, false, false);
  802. readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
  803. shallowInstrumentations2[method] = createIterableMethod(method, false, true);
  804. shallowReadonlyInstrumentations2[method] = createIterableMethod(
  805. method,
  806. true,
  807. true
  808. );
  809. });
  810. return [
  811. mutableInstrumentations2,
  812. readonlyInstrumentations2,
  813. shallowInstrumentations2,
  814. shallowReadonlyInstrumentations2
  815. ];
  816. }
  817. const [
  818. mutableInstrumentations,
  819. readonlyInstrumentations,
  820. shallowInstrumentations,
  821. shallowReadonlyInstrumentations
  822. ] = /* @__PURE__ */ createInstrumentations();
  823. function createInstrumentationGetter(isReadonly, shallow) {
  824. const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
  825. return (target, key, receiver) => {
  826. if (key === "__v_isReactive") {
  827. return !isReadonly;
  828. } else if (key === "__v_isReadonly") {
  829. return isReadonly;
  830. } else if (key === "__v_raw") {
  831. return target;
  832. }
  833. return Reflect.get(
  834. shared.hasOwn(instrumentations, key) && key in target ? instrumentations : target,
  835. key,
  836. receiver
  837. );
  838. };
  839. }
  840. const mutableCollectionHandlers = {
  841. get: /* @__PURE__ */ createInstrumentationGetter(false, false)
  842. };
  843. const shallowCollectionHandlers = {
  844. get: /* @__PURE__ */ createInstrumentationGetter(false, true)
  845. };
  846. const readonlyCollectionHandlers = {
  847. get: /* @__PURE__ */ createInstrumentationGetter(true, false)
  848. };
  849. const shallowReadonlyCollectionHandlers = {
  850. get: /* @__PURE__ */ createInstrumentationGetter(true, true)
  851. };
  852. function checkIdentityKeys(target, has2, key) {
  853. const rawKey = toRaw(key);
  854. if (rawKey !== key && has2.call(target, rawKey)) {
  855. const type = shared.toRawType(target);
  856. warn(
  857. `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
  858. );
  859. }
  860. }
  861. const reactiveMap = /* @__PURE__ */ new WeakMap();
  862. const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
  863. const readonlyMap = /* @__PURE__ */ new WeakMap();
  864. const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
  865. function targetTypeMap(rawType) {
  866. switch (rawType) {
  867. case "Object":
  868. case "Array":
  869. return 1 /* COMMON */;
  870. case "Map":
  871. case "Set":
  872. case "WeakMap":
  873. case "WeakSet":
  874. return 2 /* COLLECTION */;
  875. default:
  876. return 0 /* INVALID */;
  877. }
  878. }
  879. function getTargetType(value) {
  880. return value["__v_skip"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(shared.toRawType(value));
  881. }
  882. function reactive(target) {
  883. if (isReadonly(target)) {
  884. return target;
  885. }
  886. return createReactiveObject(
  887. target,
  888. false,
  889. mutableHandlers,
  890. mutableCollectionHandlers,
  891. reactiveMap
  892. );
  893. }
  894. function shallowReactive(target) {
  895. return createReactiveObject(
  896. target,
  897. false,
  898. shallowReactiveHandlers,
  899. shallowCollectionHandlers,
  900. shallowReactiveMap
  901. );
  902. }
  903. function readonly(target) {
  904. return createReactiveObject(
  905. target,
  906. true,
  907. readonlyHandlers,
  908. readonlyCollectionHandlers,
  909. readonlyMap
  910. );
  911. }
  912. function shallowReadonly(target) {
  913. return createReactiveObject(
  914. target,
  915. true,
  916. shallowReadonlyHandlers,
  917. shallowReadonlyCollectionHandlers,
  918. shallowReadonlyMap
  919. );
  920. }
  921. function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
  922. if (!shared.isObject(target)) {
  923. {
  924. warn(`value cannot be made reactive: ${String(target)}`);
  925. }
  926. return target;
  927. }
  928. if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
  929. return target;
  930. }
  931. const existingProxy = proxyMap.get(target);
  932. if (existingProxy) {
  933. return existingProxy;
  934. }
  935. const targetType = getTargetType(target);
  936. if (targetType === 0 /* INVALID */) {
  937. return target;
  938. }
  939. const proxy = new Proxy(
  940. target,
  941. targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers
  942. );
  943. proxyMap.set(target, proxy);
  944. return proxy;
  945. }
  946. function isReactive(value) {
  947. if (isReadonly(value)) {
  948. return isReactive(value["__v_raw"]);
  949. }
  950. return !!(value && value["__v_isReactive"]);
  951. }
  952. function isReadonly(value) {
  953. return !!(value && value["__v_isReadonly"]);
  954. }
  955. function isShallow(value) {
  956. return !!(value && value["__v_isShallow"]);
  957. }
  958. function isProxy(value) {
  959. return value ? !!value["__v_raw"] : false;
  960. }
  961. function toRaw(observed) {
  962. const raw = observed && observed["__v_raw"];
  963. return raw ? toRaw(raw) : observed;
  964. }
  965. function markRaw(value) {
  966. if (Object.isExtensible(value)) {
  967. shared.def(value, "__v_skip", true);
  968. }
  969. return value;
  970. }
  971. const toReactive = (value) => shared.isObject(value) ? reactive(value) : value;
  972. const toReadonly = (value) => shared.isObject(value) ? readonly(value) : value;
  973. const COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;
  974. class ComputedRefImpl {
  975. constructor(getter, _setter, isReadonly, isSSR) {
  976. this.getter = getter;
  977. this._setter = _setter;
  978. this.dep = void 0;
  979. this.__v_isRef = true;
  980. this["__v_isReadonly"] = false;
  981. this.effect = new ReactiveEffect(
  982. () => getter(this._value),
  983. () => triggerRefValue(
  984. this,
  985. this.effect._dirtyLevel === 2 ? 2 : 3
  986. )
  987. );
  988. this.effect.computed = this;
  989. this.effect.active = this._cacheable = !isSSR;
  990. this["__v_isReadonly"] = isReadonly;
  991. }
  992. get value() {
  993. const self = toRaw(this);
  994. if ((!self._cacheable || self.effect.dirty) && shared.hasChanged(self._value, self._value = self.effect.run())) {
  995. triggerRefValue(self, 4);
  996. }
  997. trackRefValue(self);
  998. if (self.effect._dirtyLevel >= 2) {
  999. if (this._warnRecursive) {
  1000. warn(COMPUTED_SIDE_EFFECT_WARN, `
  1001. getter: `, this.getter);
  1002. }
  1003. triggerRefValue(self, 2);
  1004. }
  1005. return self._value;
  1006. }
  1007. set value(newValue) {
  1008. this._setter(newValue);
  1009. }
  1010. // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x
  1011. get _dirty() {
  1012. return this.effect.dirty;
  1013. }
  1014. set _dirty(v) {
  1015. this.effect.dirty = v;
  1016. }
  1017. // #endregion
  1018. }
  1019. function computed(getterOrOptions, debugOptions, isSSR = false) {
  1020. let getter;
  1021. let setter;
  1022. const onlyGetter = shared.isFunction(getterOrOptions);
  1023. if (onlyGetter) {
  1024. getter = getterOrOptions;
  1025. setter = () => {
  1026. warn("Write operation failed: computed value is readonly");
  1027. } ;
  1028. } else {
  1029. getter = getterOrOptions.get;
  1030. setter = getterOrOptions.set;
  1031. }
  1032. const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
  1033. if (debugOptions && !isSSR) {
  1034. cRef.effect.onTrack = debugOptions.onTrack;
  1035. cRef.effect.onTrigger = debugOptions.onTrigger;
  1036. }
  1037. return cRef;
  1038. }
  1039. function trackRefValue(ref2) {
  1040. var _a;
  1041. if (shouldTrack && activeEffect) {
  1042. ref2 = toRaw(ref2);
  1043. trackEffect(
  1044. activeEffect,
  1045. (_a = ref2.dep) != null ? _a : ref2.dep = createDep(
  1046. () => ref2.dep = void 0,
  1047. ref2 instanceof ComputedRefImpl ? ref2 : void 0
  1048. ),
  1049. {
  1050. target: ref2,
  1051. type: "get",
  1052. key: "value"
  1053. }
  1054. );
  1055. }
  1056. }
  1057. function triggerRefValue(ref2, dirtyLevel = 4, newVal) {
  1058. ref2 = toRaw(ref2);
  1059. const dep = ref2.dep;
  1060. if (dep) {
  1061. triggerEffects(
  1062. dep,
  1063. dirtyLevel,
  1064. {
  1065. target: ref2,
  1066. type: "set",
  1067. key: "value",
  1068. newValue: newVal
  1069. }
  1070. );
  1071. }
  1072. }
  1073. function isRef(r) {
  1074. return !!(r && r.__v_isRef === true);
  1075. }
  1076. function ref(value) {
  1077. return createRef(value, false);
  1078. }
  1079. function shallowRef(value) {
  1080. return createRef(value, true);
  1081. }
  1082. function createRef(rawValue, shallow) {
  1083. if (isRef(rawValue)) {
  1084. return rawValue;
  1085. }
  1086. return new RefImpl(rawValue, shallow);
  1087. }
  1088. class RefImpl {
  1089. constructor(value, __v_isShallow) {
  1090. this.__v_isShallow = __v_isShallow;
  1091. this.dep = void 0;
  1092. this.__v_isRef = true;
  1093. this._rawValue = __v_isShallow ? value : toRaw(value);
  1094. this._value = __v_isShallow ? value : toReactive(value);
  1095. }
  1096. get value() {
  1097. trackRefValue(this);
  1098. return this._value;
  1099. }
  1100. set value(newVal) {
  1101. const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
  1102. newVal = useDirectValue ? newVal : toRaw(newVal);
  1103. if (shared.hasChanged(newVal, this._rawValue)) {
  1104. this._rawValue = newVal;
  1105. this._value = useDirectValue ? newVal : toReactive(newVal);
  1106. triggerRefValue(this, 4, newVal);
  1107. }
  1108. }
  1109. }
  1110. function triggerRef(ref2) {
  1111. triggerRefValue(ref2, 4, ref2.value );
  1112. }
  1113. function unref(ref2) {
  1114. return isRef(ref2) ? ref2.value : ref2;
  1115. }
  1116. function toValue(source) {
  1117. return shared.isFunction(source) ? source() : unref(source);
  1118. }
  1119. const shallowUnwrapHandlers = {
  1120. get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
  1121. set: (target, key, value, receiver) => {
  1122. const oldValue = target[key];
  1123. if (isRef(oldValue) && !isRef(value)) {
  1124. oldValue.value = value;
  1125. return true;
  1126. } else {
  1127. return Reflect.set(target, key, value, receiver);
  1128. }
  1129. }
  1130. };
  1131. function proxyRefs(objectWithRefs) {
  1132. return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
  1133. }
  1134. class CustomRefImpl {
  1135. constructor(factory) {
  1136. this.dep = void 0;
  1137. this.__v_isRef = true;
  1138. const { get, set } = factory(
  1139. () => trackRefValue(this),
  1140. () => triggerRefValue(this)
  1141. );
  1142. this._get = get;
  1143. this._set = set;
  1144. }
  1145. get value() {
  1146. return this._get();
  1147. }
  1148. set value(newVal) {
  1149. this._set(newVal);
  1150. }
  1151. }
  1152. function customRef(factory) {
  1153. return new CustomRefImpl(factory);
  1154. }
  1155. function toRefs(object) {
  1156. if (!isProxy(object)) {
  1157. warn(`toRefs() expects a reactive object but received a plain one.`);
  1158. }
  1159. const ret = shared.isArray(object) ? new Array(object.length) : {};
  1160. for (const key in object) {
  1161. ret[key] = propertyToRef(object, key);
  1162. }
  1163. return ret;
  1164. }
  1165. class ObjectRefImpl {
  1166. constructor(_object, _key, _defaultValue) {
  1167. this._object = _object;
  1168. this._key = _key;
  1169. this._defaultValue = _defaultValue;
  1170. this.__v_isRef = true;
  1171. }
  1172. get value() {
  1173. const val = this._object[this._key];
  1174. return val === void 0 ? this._defaultValue : val;
  1175. }
  1176. set value(newVal) {
  1177. this._object[this._key] = newVal;
  1178. }
  1179. get dep() {
  1180. return getDepFromReactive(toRaw(this._object), this._key);
  1181. }
  1182. }
  1183. class GetterRefImpl {
  1184. constructor(_getter) {
  1185. this._getter = _getter;
  1186. this.__v_isRef = true;
  1187. this.__v_isReadonly = true;
  1188. }
  1189. get value() {
  1190. return this._getter();
  1191. }
  1192. }
  1193. function toRef(source, key, defaultValue) {
  1194. if (isRef(source)) {
  1195. return source;
  1196. } else if (shared.isFunction(source)) {
  1197. return new GetterRefImpl(source);
  1198. } else if (shared.isObject(source) && arguments.length > 1) {
  1199. return propertyToRef(source, key, defaultValue);
  1200. } else {
  1201. return ref(source);
  1202. }
  1203. }
  1204. function propertyToRef(source, key, defaultValue) {
  1205. const val = source[key];
  1206. return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
  1207. }
  1208. const deferredComputed = computed;
  1209. const TrackOpTypes = {
  1210. "GET": "get",
  1211. "HAS": "has",
  1212. "ITERATE": "iterate"
  1213. };
  1214. const TriggerOpTypes = {
  1215. "SET": "set",
  1216. "ADD": "add",
  1217. "DELETE": "delete",
  1218. "CLEAR": "clear"
  1219. };
  1220. const ReactiveFlags = {
  1221. "SKIP": "__v_skip",
  1222. "IS_REACTIVE": "__v_isReactive",
  1223. "IS_READONLY": "__v_isReadonly",
  1224. "IS_SHALLOW": "__v_isShallow",
  1225. "RAW": "__v_raw"
  1226. };
  1227. exports.EffectScope = EffectScope;
  1228. exports.ITERATE_KEY = ITERATE_KEY;
  1229. exports.ReactiveEffect = ReactiveEffect;
  1230. exports.ReactiveFlags = ReactiveFlags;
  1231. exports.TrackOpTypes = TrackOpTypes;
  1232. exports.TriggerOpTypes = TriggerOpTypes;
  1233. exports.computed = computed;
  1234. exports.customRef = customRef;
  1235. exports.deferredComputed = deferredComputed;
  1236. exports.effect = effect;
  1237. exports.effectScope = effectScope;
  1238. exports.enableTracking = enableTracking;
  1239. exports.getCurrentScope = getCurrentScope;
  1240. exports.isProxy = isProxy;
  1241. exports.isReactive = isReactive;
  1242. exports.isReadonly = isReadonly;
  1243. exports.isRef = isRef;
  1244. exports.isShallow = isShallow;
  1245. exports.markRaw = markRaw;
  1246. exports.onScopeDispose = onScopeDispose;
  1247. exports.pauseScheduling = pauseScheduling;
  1248. exports.pauseTracking = pauseTracking;
  1249. exports.proxyRefs = proxyRefs;
  1250. exports.reactive = reactive;
  1251. exports.readonly = readonly;
  1252. exports.ref = ref;
  1253. exports.resetScheduling = resetScheduling;
  1254. exports.resetTracking = resetTracking;
  1255. exports.shallowReactive = shallowReactive;
  1256. exports.shallowReadonly = shallowReadonly;
  1257. exports.shallowRef = shallowRef;
  1258. exports.stop = stop;
  1259. exports.toRaw = toRaw;
  1260. exports.toRef = toRef;
  1261. exports.toRefs = toRefs;
  1262. exports.toValue = toValue;
  1263. exports.track = track;
  1264. exports.trigger = trigger;
  1265. exports.triggerRef = triggerRef;
  1266. exports.unref = unref;