reactivity.cjs.prod.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var shared = require('@vue/shared');
  4. const targetMap = new WeakMap();
  5. const effectStack = [];
  6. let activeEffect;
  7. const ITERATE_KEY = Symbol('');
  8. const MAP_KEY_ITERATE_KEY = Symbol('');
  9. function isEffect(fn) {
  10. return fn && fn._isEffect === true;
  11. }
  12. function effect(fn, options = shared.EMPTY_OBJ) {
  13. if (isEffect(fn)) {
  14. fn = fn.raw;
  15. }
  16. const effect = createReactiveEffect(fn, options);
  17. if (!options.lazy) {
  18. effect();
  19. }
  20. return effect;
  21. }
  22. function stop(effect) {
  23. if (effect.active) {
  24. cleanup(effect);
  25. if (effect.options.onStop) {
  26. effect.options.onStop();
  27. }
  28. effect.active = false;
  29. }
  30. }
  31. let uid = 0;
  32. function createReactiveEffect(fn, options) {
  33. const effect = function reactiveEffect() {
  34. if (!effect.active) {
  35. return options.scheduler ? undefined : fn();
  36. }
  37. if (!effectStack.includes(effect)) {
  38. cleanup(effect);
  39. try {
  40. enableTracking();
  41. effectStack.push(effect);
  42. activeEffect = effect;
  43. return fn();
  44. }
  45. finally {
  46. effectStack.pop();
  47. resetTracking();
  48. activeEffect = effectStack[effectStack.length - 1];
  49. }
  50. }
  51. };
  52. effect.id = uid++;
  53. effect.allowRecurse = !!options.allowRecurse;
  54. effect._isEffect = true;
  55. effect.active = true;
  56. effect.raw = fn;
  57. effect.deps = [];
  58. effect.options = options;
  59. return effect;
  60. }
  61. function cleanup(effect) {
  62. const { deps } = effect;
  63. if (deps.length) {
  64. for (let i = 0; i < deps.length; i++) {
  65. deps[i].delete(effect);
  66. }
  67. deps.length = 0;
  68. }
  69. }
  70. let shouldTrack = true;
  71. const trackStack = [];
  72. function pauseTracking() {
  73. trackStack.push(shouldTrack);
  74. shouldTrack = false;
  75. }
  76. function enableTracking() {
  77. trackStack.push(shouldTrack);
  78. shouldTrack = true;
  79. }
  80. function resetTracking() {
  81. const last = trackStack.pop();
  82. shouldTrack = last === undefined ? true : last;
  83. }
  84. function track(target, type, key) {
  85. if (!shouldTrack || activeEffect === undefined) {
  86. return;
  87. }
  88. let depsMap = targetMap.get(target);
  89. if (!depsMap) {
  90. targetMap.set(target, (depsMap = new Map()));
  91. }
  92. let dep = depsMap.get(key);
  93. if (!dep) {
  94. depsMap.set(key, (dep = new Set()));
  95. }
  96. if (!dep.has(activeEffect)) {
  97. dep.add(activeEffect);
  98. activeEffect.deps.push(dep);
  99. }
  100. }
  101. function trigger(target, type, key, newValue, oldValue, oldTarget) {
  102. const depsMap = targetMap.get(target);
  103. if (!depsMap) {
  104. // never been tracked
  105. return;
  106. }
  107. const effects = new Set();
  108. const add = (effectsToAdd) => {
  109. if (effectsToAdd) {
  110. effectsToAdd.forEach(effect => {
  111. if (effect !== activeEffect || effect.allowRecurse) {
  112. effects.add(effect);
  113. }
  114. });
  115. }
  116. };
  117. if (type === "clear" /* CLEAR */) {
  118. // collection being cleared
  119. // trigger all effects for target
  120. depsMap.forEach(add);
  121. }
  122. else if (key === 'length' && shared.isArray(target)) {
  123. depsMap.forEach((dep, key) => {
  124. if (key === 'length' || key >= newValue) {
  125. add(dep);
  126. }
  127. });
  128. }
  129. else {
  130. // schedule runs for SET | ADD | DELETE
  131. if (key !== void 0) {
  132. add(depsMap.get(key));
  133. }
  134. // also run for iteration key on ADD | DELETE | Map.SET
  135. switch (type) {
  136. case "add" /* ADD */:
  137. if (!shared.isArray(target)) {
  138. add(depsMap.get(ITERATE_KEY));
  139. if (shared.isMap(target)) {
  140. add(depsMap.get(MAP_KEY_ITERATE_KEY));
  141. }
  142. }
  143. else if (shared.isIntegerKey(key)) {
  144. // new index added to array -> length changes
  145. add(depsMap.get('length'));
  146. }
  147. break;
  148. case "delete" /* DELETE */:
  149. if (!shared.isArray(target)) {
  150. add(depsMap.get(ITERATE_KEY));
  151. if (shared.isMap(target)) {
  152. add(depsMap.get(MAP_KEY_ITERATE_KEY));
  153. }
  154. }
  155. break;
  156. case "set" /* SET */:
  157. if (shared.isMap(target)) {
  158. add(depsMap.get(ITERATE_KEY));
  159. }
  160. break;
  161. }
  162. }
  163. const run = (effect) => {
  164. if (effect.options.scheduler) {
  165. effect.options.scheduler(effect);
  166. }
  167. else {
  168. effect();
  169. }
  170. };
  171. effects.forEach(run);
  172. }
  173. const isNonTrackableKeys = /*#__PURE__*/ shared.makeMap(`__proto__,__v_isRef,__isVue`);
  174. const builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol)
  175. .map(key => Symbol[key])
  176. .filter(shared.isSymbol));
  177. const get = /*#__PURE__*/ createGetter();
  178. const shallowGet = /*#__PURE__*/ createGetter(false, true);
  179. const readonlyGet = /*#__PURE__*/ createGetter(true);
  180. const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true);
  181. const arrayInstrumentations = {};
  182. ['includes', 'indexOf', 'lastIndexOf'].forEach(key => {
  183. const method = Array.prototype[key];
  184. arrayInstrumentations[key] = function (...args) {
  185. const arr = toRaw(this);
  186. for (let i = 0, l = this.length; i < l; i++) {
  187. track(arr, "get" /* GET */, i + '');
  188. }
  189. // we run the method using the original args first (which may be reactive)
  190. const res = method.apply(arr, args);
  191. if (res === -1 || res === false) {
  192. // if that didn't work, run it again using raw values.
  193. return method.apply(arr, args.map(toRaw));
  194. }
  195. else {
  196. return res;
  197. }
  198. };
  199. });
  200. ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(key => {
  201. const method = Array.prototype[key];
  202. arrayInstrumentations[key] = function (...args) {
  203. pauseTracking();
  204. const res = method.apply(this, args);
  205. resetTracking();
  206. return res;
  207. };
  208. });
  209. function createGetter(isReadonly = false, shallow = false) {
  210. return function get(target, key, receiver) {
  211. if (key === "__v_isReactive" /* IS_REACTIVE */) {
  212. return !isReadonly;
  213. }
  214. else if (key === "__v_isReadonly" /* IS_READONLY */) {
  215. return isReadonly;
  216. }
  217. else if (key === "__v_raw" /* RAW */ &&
  218. receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) {
  219. return target;
  220. }
  221. const targetIsArray = shared.isArray(target);
  222. if (!isReadonly && targetIsArray && shared.hasOwn(arrayInstrumentations, key)) {
  223. return Reflect.get(arrayInstrumentations, key, receiver);
  224. }
  225. const res = Reflect.get(target, key, receiver);
  226. if (shared.isSymbol(key)
  227. ? builtInSymbols.has(key)
  228. : isNonTrackableKeys(key)) {
  229. return res;
  230. }
  231. if (!isReadonly) {
  232. track(target, "get" /* GET */, key);
  233. }
  234. if (shallow) {
  235. return res;
  236. }
  237. if (isRef(res)) {
  238. // ref unwrapping - does not apply for Array + integer key.
  239. const shouldUnwrap = !targetIsArray || !shared.isIntegerKey(key);
  240. return shouldUnwrap ? res.value : res;
  241. }
  242. if (shared.isObject(res)) {
  243. // Convert returned value into a proxy as well. we do the isObject check
  244. // here to avoid invalid value warning. Also need to lazy access readonly
  245. // and reactive here to avoid circular dependency.
  246. return isReadonly ? readonly(res) : reactive(res);
  247. }
  248. return res;
  249. };
  250. }
  251. const set = /*#__PURE__*/ createSetter();
  252. const shallowSet = /*#__PURE__*/ createSetter(true);
  253. function createSetter(shallow = false) {
  254. return function set(target, key, value, receiver) {
  255. const oldValue = target[key];
  256. if (!shallow) {
  257. value = toRaw(value);
  258. if (!shared.isArray(target) && isRef(oldValue) && !isRef(value)) {
  259. oldValue.value = value;
  260. return true;
  261. }
  262. }
  263. const hadKey = shared.isArray(target) && shared.isIntegerKey(key)
  264. ? Number(key) < target.length
  265. : shared.hasOwn(target, key);
  266. const result = Reflect.set(target, key, value, receiver);
  267. // don't trigger if target is something up in the prototype chain of original
  268. if (target === toRaw(receiver)) {
  269. if (!hadKey) {
  270. trigger(target, "add" /* ADD */, key, value);
  271. }
  272. else if (shared.hasChanged(value, oldValue)) {
  273. trigger(target, "set" /* SET */, key, value);
  274. }
  275. }
  276. return result;
  277. };
  278. }
  279. function deleteProperty(target, key) {
  280. const hadKey = shared.hasOwn(target, key);
  281. target[key];
  282. const result = Reflect.deleteProperty(target, key);
  283. if (result && hadKey) {
  284. trigger(target, "delete" /* DELETE */, key, undefined);
  285. }
  286. return result;
  287. }
  288. function has(target, key) {
  289. const result = Reflect.has(target, key);
  290. if (!shared.isSymbol(key) || !builtInSymbols.has(key)) {
  291. track(target, "has" /* HAS */, key);
  292. }
  293. return result;
  294. }
  295. function ownKeys(target) {
  296. track(target, "iterate" /* ITERATE */, shared.isArray(target) ? 'length' : ITERATE_KEY);
  297. return Reflect.ownKeys(target);
  298. }
  299. const mutableHandlers = {
  300. get,
  301. set,
  302. deleteProperty,
  303. has,
  304. ownKeys
  305. };
  306. const readonlyHandlers = {
  307. get: readonlyGet,
  308. set(target, key) {
  309. return true;
  310. },
  311. deleteProperty(target, key) {
  312. return true;
  313. }
  314. };
  315. const shallowReactiveHandlers = shared.extend({}, mutableHandlers, {
  316. get: shallowGet,
  317. set: shallowSet
  318. });
  319. // Props handlers are special in the sense that it should not unwrap top-level
  320. // refs (in order to allow refs to be explicitly passed down), but should
  321. // retain the reactivity of the normal readonly object.
  322. const shallowReadonlyHandlers = shared.extend({}, readonlyHandlers, {
  323. get: shallowReadonlyGet
  324. });
  325. const toReactive = (value) => shared.isObject(value) ? reactive(value) : value;
  326. const toReadonly = (value) => shared.isObject(value) ? readonly(value) : value;
  327. const toShallow = (value) => value;
  328. const getProto = (v) => Reflect.getPrototypeOf(v);
  329. function get$1(target, key, isReadonly = false, isShallow = false) {
  330. // #1772: readonly(reactive(Map)) should return readonly + reactive version
  331. // of the value
  332. target = target["__v_raw" /* RAW */];
  333. const rawTarget = toRaw(target);
  334. const rawKey = toRaw(key);
  335. if (key !== rawKey) {
  336. !isReadonly && track(rawTarget, "get" /* GET */, key);
  337. }
  338. !isReadonly && track(rawTarget, "get" /* GET */, rawKey);
  339. const { has } = getProto(rawTarget);
  340. const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
  341. if (has.call(rawTarget, key)) {
  342. return wrap(target.get(key));
  343. }
  344. else if (has.call(rawTarget, rawKey)) {
  345. return wrap(target.get(rawKey));
  346. }
  347. }
  348. function has$1(key, isReadonly = false) {
  349. const target = this["__v_raw" /* RAW */];
  350. const rawTarget = toRaw(target);
  351. const rawKey = toRaw(key);
  352. if (key !== rawKey) {
  353. !isReadonly && track(rawTarget, "has" /* HAS */, key);
  354. }
  355. !isReadonly && track(rawTarget, "has" /* HAS */, rawKey);
  356. return key === rawKey
  357. ? target.has(key)
  358. : target.has(key) || target.has(rawKey);
  359. }
  360. function size(target, isReadonly = false) {
  361. target = target["__v_raw" /* RAW */];
  362. !isReadonly && track(toRaw(target), "iterate" /* ITERATE */, ITERATE_KEY);
  363. return Reflect.get(target, 'size', target);
  364. }
  365. function add(value) {
  366. value = toRaw(value);
  367. const target = toRaw(this);
  368. const proto = getProto(target);
  369. const hadKey = proto.has.call(target, value);
  370. target.add(value);
  371. if (!hadKey) {
  372. trigger(target, "add" /* ADD */, value, value);
  373. }
  374. return this;
  375. }
  376. function set$1(key, value) {
  377. value = toRaw(value);
  378. const target = toRaw(this);
  379. const { has, get } = getProto(target);
  380. let hadKey = has.call(target, key);
  381. if (!hadKey) {
  382. key = toRaw(key);
  383. hadKey = has.call(target, key);
  384. }
  385. const oldValue = get.call(target, key);
  386. target.set(key, value);
  387. if (!hadKey) {
  388. trigger(target, "add" /* ADD */, key, value);
  389. }
  390. else if (shared.hasChanged(value, oldValue)) {
  391. trigger(target, "set" /* SET */, key, value);
  392. }
  393. return this;
  394. }
  395. function deleteEntry(key) {
  396. const target = toRaw(this);
  397. const { has, get } = getProto(target);
  398. let hadKey = has.call(target, key);
  399. if (!hadKey) {
  400. key = toRaw(key);
  401. hadKey = has.call(target, key);
  402. }
  403. get ? get.call(target, key) : undefined;
  404. // forward the operation before queueing reactions
  405. const result = target.delete(key);
  406. if (hadKey) {
  407. trigger(target, "delete" /* DELETE */, key, undefined);
  408. }
  409. return result;
  410. }
  411. function clear() {
  412. const target = toRaw(this);
  413. const hadItems = target.size !== 0;
  414. // forward the operation before queueing reactions
  415. const result = target.clear();
  416. if (hadItems) {
  417. trigger(target, "clear" /* CLEAR */, undefined, undefined);
  418. }
  419. return result;
  420. }
  421. function createForEach(isReadonly, isShallow) {
  422. return function forEach(callback, thisArg) {
  423. const observed = this;
  424. const target = observed["__v_raw" /* RAW */];
  425. const rawTarget = toRaw(target);
  426. const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
  427. !isReadonly && track(rawTarget, "iterate" /* ITERATE */, ITERATE_KEY);
  428. return target.forEach((value, key) => {
  429. // important: make sure the callback is
  430. // 1. invoked with the reactive map as `this` and 3rd arg
  431. // 2. the value received should be a corresponding reactive/readonly.
  432. return callback.call(thisArg, wrap(value), wrap(key), observed);
  433. });
  434. };
  435. }
  436. function createIterableMethod(method, isReadonly, isShallow) {
  437. return function (...args) {
  438. const target = this["__v_raw" /* RAW */];
  439. const rawTarget = toRaw(target);
  440. const targetIsMap = shared.isMap(rawTarget);
  441. const isPair = method === 'entries' || (method === Symbol.iterator && targetIsMap);
  442. const isKeyOnly = method === 'keys' && targetIsMap;
  443. const innerIterator = target[method](...args);
  444. const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
  445. !isReadonly &&
  446. track(rawTarget, "iterate" /* ITERATE */, isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
  447. // return a wrapped iterator which returns observed versions of the
  448. // values emitted from the real iterator
  449. return {
  450. // iterator protocol
  451. next() {
  452. const { value, done } = innerIterator.next();
  453. return done
  454. ? { value, done }
  455. : {
  456. value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
  457. done
  458. };
  459. },
  460. // iterable protocol
  461. [Symbol.iterator]() {
  462. return this;
  463. }
  464. };
  465. };
  466. }
  467. function createReadonlyMethod(type) {
  468. return function (...args) {
  469. return type === "delete" /* DELETE */ ? false : this;
  470. };
  471. }
  472. const mutableInstrumentations = {
  473. get(key) {
  474. return get$1(this, key);
  475. },
  476. get size() {
  477. return size(this);
  478. },
  479. has: has$1,
  480. add,
  481. set: set$1,
  482. delete: deleteEntry,
  483. clear,
  484. forEach: createForEach(false, false)
  485. };
  486. const shallowInstrumentations = {
  487. get(key) {
  488. return get$1(this, key, false, true);
  489. },
  490. get size() {
  491. return size(this);
  492. },
  493. has: has$1,
  494. add,
  495. set: set$1,
  496. delete: deleteEntry,
  497. clear,
  498. forEach: createForEach(false, true)
  499. };
  500. const readonlyInstrumentations = {
  501. get(key) {
  502. return get$1(this, key, true);
  503. },
  504. get size() {
  505. return size(this, true);
  506. },
  507. has(key) {
  508. return has$1.call(this, key, true);
  509. },
  510. add: createReadonlyMethod("add" /* ADD */),
  511. set: createReadonlyMethod("set" /* SET */),
  512. delete: createReadonlyMethod("delete" /* DELETE */),
  513. clear: createReadonlyMethod("clear" /* CLEAR */),
  514. forEach: createForEach(true, false)
  515. };
  516. const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
  517. iteratorMethods.forEach(method => {
  518. mutableInstrumentations[method] = createIterableMethod(method, false, false);
  519. readonlyInstrumentations[method] = createIterableMethod(method, true, false);
  520. shallowInstrumentations[method] = createIterableMethod(method, false, true);
  521. });
  522. function createInstrumentationGetter(isReadonly, shallow) {
  523. const instrumentations = shallow
  524. ? shallowInstrumentations
  525. : isReadonly
  526. ? readonlyInstrumentations
  527. : mutableInstrumentations;
  528. return (target, key, receiver) => {
  529. if (key === "__v_isReactive" /* IS_REACTIVE */) {
  530. return !isReadonly;
  531. }
  532. else if (key === "__v_isReadonly" /* IS_READONLY */) {
  533. return isReadonly;
  534. }
  535. else if (key === "__v_raw" /* RAW */) {
  536. return target;
  537. }
  538. return Reflect.get(shared.hasOwn(instrumentations, key) && key in target
  539. ? instrumentations
  540. : target, key, receiver);
  541. };
  542. }
  543. const mutableCollectionHandlers = {
  544. get: createInstrumentationGetter(false, false)
  545. };
  546. const shallowCollectionHandlers = {
  547. get: createInstrumentationGetter(false, true)
  548. };
  549. const readonlyCollectionHandlers = {
  550. get: createInstrumentationGetter(true, false)
  551. };
  552. const reactiveMap = new WeakMap();
  553. const readonlyMap = new WeakMap();
  554. function targetTypeMap(rawType) {
  555. switch (rawType) {
  556. case 'Object':
  557. case 'Array':
  558. return 1 /* COMMON */;
  559. case 'Map':
  560. case 'Set':
  561. case 'WeakMap':
  562. case 'WeakSet':
  563. return 2 /* COLLECTION */;
  564. default:
  565. return 0 /* INVALID */;
  566. }
  567. }
  568. function getTargetType(value) {
  569. return value["__v_skip" /* SKIP */] || !Object.isExtensible(value)
  570. ? 0 /* INVALID */
  571. : targetTypeMap(shared.toRawType(value));
  572. }
  573. function reactive(target) {
  574. // if trying to observe a readonly proxy, return the readonly version.
  575. if (target && target["__v_isReadonly" /* IS_READONLY */]) {
  576. return target;
  577. }
  578. return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers);
  579. }
  580. /**
  581. * Return a shallowly-reactive copy of the original object, where only the root
  582. * level properties are reactive. It also does not auto-unwrap refs (even at the
  583. * root level).
  584. */
  585. function shallowReactive(target) {
  586. return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers);
  587. }
  588. /**
  589. * Creates a readonly copy of the original object. Note the returned copy is not
  590. * made reactive, but `readonly` can be called on an already reactive object.
  591. */
  592. function readonly(target) {
  593. return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers);
  594. }
  595. /**
  596. * Returns a reactive-copy of the original object, where only the root level
  597. * properties are readonly, and does NOT unwrap refs nor recursively convert
  598. * returned properties.
  599. * This is used for creating the props proxy object for stateful components.
  600. */
  601. function shallowReadonly(target) {
  602. return createReactiveObject(target, true, shallowReadonlyHandlers, readonlyCollectionHandlers);
  603. }
  604. function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers) {
  605. if (!shared.isObject(target)) {
  606. return target;
  607. }
  608. // target is already a Proxy, return it.
  609. // exception: calling readonly() on a reactive object
  610. if (target["__v_raw" /* RAW */] &&
  611. !(isReadonly && target["__v_isReactive" /* IS_REACTIVE */])) {
  612. return target;
  613. }
  614. // target already has corresponding Proxy
  615. const proxyMap = isReadonly ? readonlyMap : reactiveMap;
  616. const existingProxy = proxyMap.get(target);
  617. if (existingProxy) {
  618. return existingProxy;
  619. }
  620. // only a whitelist of value types can be observed.
  621. const targetType = getTargetType(target);
  622. if (targetType === 0 /* INVALID */) {
  623. return target;
  624. }
  625. const proxy = new Proxy(target, targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers);
  626. proxyMap.set(target, proxy);
  627. return proxy;
  628. }
  629. function isReactive(value) {
  630. if (isReadonly(value)) {
  631. return isReactive(value["__v_raw" /* RAW */]);
  632. }
  633. return !!(value && value["__v_isReactive" /* IS_REACTIVE */]);
  634. }
  635. function isReadonly(value) {
  636. return !!(value && value["__v_isReadonly" /* IS_READONLY */]);
  637. }
  638. function isProxy(value) {
  639. return isReactive(value) || isReadonly(value);
  640. }
  641. function toRaw(observed) {
  642. return ((observed && toRaw(observed["__v_raw" /* RAW */])) || observed);
  643. }
  644. function markRaw(value) {
  645. shared.def(value, "__v_skip" /* SKIP */, true);
  646. return value;
  647. }
  648. const convert = (val) => shared.isObject(val) ? reactive(val) : val;
  649. function isRef(r) {
  650. return Boolean(r && r.__v_isRef === true);
  651. }
  652. function ref(value) {
  653. return createRef(value);
  654. }
  655. function shallowRef(value) {
  656. return createRef(value, true);
  657. }
  658. class RefImpl {
  659. constructor(_rawValue, _shallow = false) {
  660. this._rawValue = _rawValue;
  661. this._shallow = _shallow;
  662. this.__v_isRef = true;
  663. this._value = _shallow ? _rawValue : convert(_rawValue);
  664. }
  665. get value() {
  666. track(toRaw(this), "get" /* GET */, 'value');
  667. return this._value;
  668. }
  669. set value(newVal) {
  670. if (shared.hasChanged(toRaw(newVal), this._rawValue)) {
  671. this._rawValue = newVal;
  672. this._value = this._shallow ? newVal : convert(newVal);
  673. trigger(toRaw(this), "set" /* SET */, 'value', newVal);
  674. }
  675. }
  676. }
  677. function createRef(rawValue, shallow = false) {
  678. if (isRef(rawValue)) {
  679. return rawValue;
  680. }
  681. return new RefImpl(rawValue, shallow);
  682. }
  683. function triggerRef(ref) {
  684. trigger(toRaw(ref), "set" /* SET */, 'value', void 0);
  685. }
  686. function unref(ref) {
  687. return isRef(ref) ? ref.value : ref;
  688. }
  689. const shallowUnwrapHandlers = {
  690. get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
  691. set: (target, key, value, receiver) => {
  692. const oldValue = target[key];
  693. if (isRef(oldValue) && !isRef(value)) {
  694. oldValue.value = value;
  695. return true;
  696. }
  697. else {
  698. return Reflect.set(target, key, value, receiver);
  699. }
  700. }
  701. };
  702. function proxyRefs(objectWithRefs) {
  703. return isReactive(objectWithRefs)
  704. ? objectWithRefs
  705. : new Proxy(objectWithRefs, shallowUnwrapHandlers);
  706. }
  707. class CustomRefImpl {
  708. constructor(factory) {
  709. this.__v_isRef = true;
  710. const { get, set } = factory(() => track(this, "get" /* GET */, 'value'), () => trigger(this, "set" /* SET */, 'value'));
  711. this._get = get;
  712. this._set = set;
  713. }
  714. get value() {
  715. return this._get();
  716. }
  717. set value(newVal) {
  718. this._set(newVal);
  719. }
  720. }
  721. function customRef(factory) {
  722. return new CustomRefImpl(factory);
  723. }
  724. function toRefs(object) {
  725. const ret = shared.isArray(object) ? new Array(object.length) : {};
  726. for (const key in object) {
  727. ret[key] = toRef(object, key);
  728. }
  729. return ret;
  730. }
  731. class ObjectRefImpl {
  732. constructor(_object, _key) {
  733. this._object = _object;
  734. this._key = _key;
  735. this.__v_isRef = true;
  736. }
  737. get value() {
  738. return this._object[this._key];
  739. }
  740. set value(newVal) {
  741. this._object[this._key] = newVal;
  742. }
  743. }
  744. function toRef(object, key) {
  745. return isRef(object[key])
  746. ? object[key]
  747. : new ObjectRefImpl(object, key);
  748. }
  749. class ComputedRefImpl {
  750. constructor(getter, _setter, isReadonly) {
  751. this._setter = _setter;
  752. this._dirty = true;
  753. this.__v_isRef = true;
  754. this.effect = effect(getter, {
  755. lazy: true,
  756. scheduler: () => {
  757. if (!this._dirty) {
  758. this._dirty = true;
  759. trigger(toRaw(this), "set" /* SET */, 'value');
  760. }
  761. }
  762. });
  763. this["__v_isReadonly" /* IS_READONLY */] = isReadonly;
  764. }
  765. get value() {
  766. if (this._dirty) {
  767. this._value = this.effect();
  768. this._dirty = false;
  769. }
  770. track(toRaw(this), "get" /* GET */, 'value');
  771. return this._value;
  772. }
  773. set value(newValue) {
  774. this._setter(newValue);
  775. }
  776. }
  777. function computed(getterOrOptions) {
  778. let getter;
  779. let setter;
  780. if (shared.isFunction(getterOrOptions)) {
  781. getter = getterOrOptions;
  782. setter = shared.NOOP;
  783. }
  784. else {
  785. getter = getterOrOptions.get;
  786. setter = getterOrOptions.set;
  787. }
  788. return new ComputedRefImpl(getter, setter, shared.isFunction(getterOrOptions) || !getterOrOptions.set);
  789. }
  790. exports.ITERATE_KEY = ITERATE_KEY;
  791. exports.computed = computed;
  792. exports.customRef = customRef;
  793. exports.effect = effect;
  794. exports.enableTracking = enableTracking;
  795. exports.isProxy = isProxy;
  796. exports.isReactive = isReactive;
  797. exports.isReadonly = isReadonly;
  798. exports.isRef = isRef;
  799. exports.markRaw = markRaw;
  800. exports.pauseTracking = pauseTracking;
  801. exports.proxyRefs = proxyRefs;
  802. exports.reactive = reactive;
  803. exports.readonly = readonly;
  804. exports.ref = ref;
  805. exports.resetTracking = resetTracking;
  806. exports.shallowReactive = shallowReactive;
  807. exports.shallowReadonly = shallowReadonly;
  808. exports.shallowRef = shallowRef;
  809. exports.stop = stop;
  810. exports.toRaw = toRaw;
  811. exports.toRef = toRef;
  812. exports.toRefs = toRefs;
  813. exports.track = track;
  814. exports.trigger = trigger;
  815. exports.triggerRef = triggerRef;
  816. exports.unref = unref;