reactivity.cjs.js 42 KB

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