reactivity.cjs.js 34 KB

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