reactivity.cjs.prod.js 39 KB

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