reactivity.cjs.prod.js 38 KB

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