reactivity.esm-bundler.js 34 KB

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