reactivity.cjs.prod.js 25 KB

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