reactivity.global.js 37 KB

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