PageRenderTime 33ms CodeModel.GetById 5ms RepoModel.GetById 0ms app.codeStats 1ms

/js/ui/vue3/vue/dev/src/vue-dev.js

https://gitlab.com/alexprowars/bitrix
JavaScript | 1528 lines | 1364 code | 22 blank | 142 comment | 256 complexity | 4d7bbb18ef359cb1b15ed2375256544e MD5 | raw file
  1. /*!
  2. * Vue.js v3.2.31
  3. * (c) 2014-2021 Evan You
  4. * Released under the MIT License.
  5. *
  6. * @source: https://unpkg.com/vue@3.2.31/dist/vue.esm-browser.js
  7. */
  8. import {BitrixVue} from "./bitrixvue";
  9. BitrixVue.developerMode = true;
  10. BitrixVue.createApp = ((rootComponent, rootProps) => createApp(rootComponent, rootProps).use(BitrixVue));
  11. export {BitrixVue};
  12. import {DevTools} from "./devtools";
  13. const DevToolsConnector = new DevTools;
  14. export {DevToolsConnector}
  15. // origin-start
  16. /**
  17. * Make a map and return a function for checking if a key
  18. * is in that map.
  19. * IMPORTANT: all calls of this function must be prefixed with
  20. * \/\*#\_\_PURE\_\_\*\/
  21. * So that rollup can tree-shake them if necessary.
  22. */
  23. function makeMap(str, expectsLowerCase) {
  24. const map = Object.create(null);
  25. const list = str.split(',');
  26. for (let i = 0; i < list.length; i++) {
  27. map[list[i]] = true;
  28. }
  29. return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];
  30. }
  31. /**
  32. * dev only flag -> name mapping
  33. */
  34. const PatchFlagNames = {
  35. [1 /* TEXT */]: `TEXT`,
  36. [2 /* CLASS */]: `CLASS`,
  37. [4 /* STYLE */]: `STYLE`,
  38. [8 /* PROPS */]: `PROPS`,
  39. [16 /* FULL_PROPS */]: `FULL_PROPS`,
  40. [32 /* HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,
  41. [64 /* STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,
  42. [128 /* KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,
  43. [256 /* UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,
  44. [512 /* NEED_PATCH */]: `NEED_PATCH`,
  45. [1024 /* DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,
  46. [2048 /* DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,
  47. [-1 /* HOISTED */]: `HOISTED`,
  48. [-2 /* BAIL */]: `BAIL`
  49. };
  50. /**
  51. * Dev only
  52. */
  53. const slotFlagsText = {
  54. [1 /* STABLE */]: 'STABLE',
  55. [2 /* DYNAMIC */]: 'DYNAMIC',
  56. [3 /* FORWARDED */]: 'FORWARDED'
  57. };
  58. const GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +
  59. 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +
  60. 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';
  61. const isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);
  62. const range = 2;
  63. function generateCodeFrame(source, start = 0, end = source.length) {
  64. // Split the content into individual lines but capture the newline sequence
  65. // that separated each line. This is important because the actual sequence is
  66. // needed to properly take into account the full line length for offset
  67. // comparison
  68. let lines = source.split(/(\r?\n)/);
  69. // Separate the lines and newline sequences into separate arrays for easier referencing
  70. const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);
  71. lines = lines.filter((_, idx) => idx % 2 === 0);
  72. let count = 0;
  73. const res = [];
  74. for (let i = 0; i < lines.length; i++) {
  75. count +=
  76. lines[i].length +
  77. ((newlineSequences[i] && newlineSequences[i].length) || 0);
  78. if (count >= start) {
  79. for (let j = i - range; j <= i + range || end > count; j++) {
  80. if (j < 0 || j >= lines.length)
  81. continue;
  82. const line = j + 1;
  83. res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);
  84. const lineLength = lines[j].length;
  85. const newLineSeqLength = (newlineSequences[j] && newlineSequences[j].length) || 0;
  86. if (j === i) {
  87. // push underline
  88. const pad = start - (count - (lineLength + newLineSeqLength));
  89. const length = Math.max(1, end > count ? lineLength - pad : end - start);
  90. res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
  91. }
  92. else if (j > i) {
  93. if (end > count) {
  94. const length = Math.max(Math.min(end - count, lineLength), 1);
  95. res.push(` | ` + '^'.repeat(length));
  96. }
  97. count += lineLength + newLineSeqLength;
  98. }
  99. }
  100. break;
  101. }
  102. }
  103. return res.join('\n');
  104. }
  105. /**
  106. * On the client we only need to offer special cases for boolean attributes that
  107. * have different names from their corresponding dom properties:
  108. * - itemscope -> N/A
  109. * - allowfullscreen -> allowFullscreen
  110. * - formnovalidate -> formNoValidate
  111. * - ismap -> isMap
  112. * - nomodule -> noModule
  113. * - novalidate -> noValidate
  114. * - readonly -> readOnly
  115. */
  116. const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
  117. const isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);
  118. /**
  119. * Boolean attributes should be included if the value is truthy or ''.
  120. * e.g. `<select multiple>` compiles to `{ multiple: '' }`
  121. */
  122. function includeBooleanAttr(value) {
  123. return !!value || value === '';
  124. }
  125. function normalizeStyle(value) {
  126. if (isArray(value)) {
  127. const res = {};
  128. for (let i = 0; i < value.length; i++) {
  129. const item = value[i];
  130. const normalized = isString(item)
  131. ? parseStringStyle(item)
  132. : normalizeStyle(item);
  133. if (normalized) {
  134. for (const key in normalized) {
  135. res[key] = normalized[key];
  136. }
  137. }
  138. }
  139. return res;
  140. }
  141. else if (isString(value)) {
  142. return value;
  143. }
  144. else if (isObject(value)) {
  145. return value;
  146. }
  147. }
  148. const listDelimiterRE = /;(?![^(]*\))/g;
  149. const propertyDelimiterRE = /:(.+)/;
  150. function parseStringStyle(cssText) {
  151. const ret = {};
  152. cssText.split(listDelimiterRE).forEach(item => {
  153. if (item) {
  154. const tmp = item.split(propertyDelimiterRE);
  155. tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
  156. }
  157. });
  158. return ret;
  159. }
  160. function normalizeClass(value) {
  161. let res = '';
  162. if (isString(value)) {
  163. res = value;
  164. }
  165. else if (isArray(value)) {
  166. for (let i = 0; i < value.length; i++) {
  167. const normalized = normalizeClass(value[i]);
  168. if (normalized) {
  169. res += normalized + ' ';
  170. }
  171. }
  172. }
  173. else if (isObject(value)) {
  174. for (const name in value) {
  175. if (value[name]) {
  176. res += name + ' ';
  177. }
  178. }
  179. }
  180. return res.trim();
  181. }
  182. function normalizeProps(props) {
  183. if (!props)
  184. return null;
  185. let { class: klass, style } = props;
  186. if (klass && !isString(klass)) {
  187. props.class = normalizeClass(klass);
  188. }
  189. if (style) {
  190. props.style = normalizeStyle(style);
  191. }
  192. return props;
  193. }
  194. // These tag configs are shared between compiler-dom and runtime-dom, so they
  195. // https://developer.mozilla.org/en-US/docs/Web/HTML/Element
  196. const HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +
  197. 'header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +
  198. 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +
  199. 'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +
  200. 'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +
  201. 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +
  202. 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +
  203. 'option,output,progress,select,textarea,details,dialog,menu,' +
  204. 'summary,template,blockquote,iframe,tfoot';
  205. // https://developer.mozilla.org/en-US/docs/Web/SVG/Element
  206. const SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +
  207. 'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +
  208. 'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +
  209. 'feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +
  210. 'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +
  211. 'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +
  212. 'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +
  213. 'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +
  214. 'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +
  215. 'text,textPath,title,tspan,unknown,use,view';
  216. const VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';
  217. /**
  218. * Compiler only.
  219. * Do NOT use in runtime code paths unless behind `true` flag.
  220. */
  221. const isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);
  222. /**
  223. * Compiler only.
  224. * Do NOT use in runtime code paths unless behind `true` flag.
  225. */
  226. const isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);
  227. /**
  228. * Compiler only.
  229. * Do NOT use in runtime code paths unless behind `true` flag.
  230. */
  231. const isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);
  232. function looseCompareArrays(a, b) {
  233. if (a.length !== b.length)
  234. return false;
  235. let equal = true;
  236. for (let i = 0; equal && i < a.length; i++) {
  237. equal = looseEqual(a[i], b[i]);
  238. }
  239. return equal;
  240. }
  241. function looseEqual(a, b) {
  242. if (a === b)
  243. return true;
  244. let aValidType = isDate(a);
  245. let bValidType = isDate(b);
  246. if (aValidType || bValidType) {
  247. return aValidType && bValidType ? a.getTime() === b.getTime() : false;
  248. }
  249. aValidType = isArray(a);
  250. bValidType = isArray(b);
  251. if (aValidType || bValidType) {
  252. return aValidType && bValidType ? looseCompareArrays(a, b) : false;
  253. }
  254. aValidType = isObject(a);
  255. bValidType = isObject(b);
  256. if (aValidType || bValidType) {
  257. /* istanbul ignore if: this if will probably never be called */
  258. if (!aValidType || !bValidType) {
  259. return false;
  260. }
  261. const aKeysCount = Object.keys(a).length;
  262. const bKeysCount = Object.keys(b).length;
  263. if (aKeysCount !== bKeysCount) {
  264. return false;
  265. }
  266. for (const key in a) {
  267. const aHasKey = a.hasOwnProperty(key);
  268. const bHasKey = b.hasOwnProperty(key);
  269. if ((aHasKey && !bHasKey) ||
  270. (!aHasKey && bHasKey) ||
  271. !looseEqual(a[key], b[key])) {
  272. return false;
  273. }
  274. }
  275. }
  276. return String(a) === String(b);
  277. }
  278. function looseIndexOf(arr, val) {
  279. return arr.findIndex(item => looseEqual(item, val));
  280. }
  281. /**
  282. * For converting {{ interpolation }} values to displayed strings.
  283. * @private
  284. */
  285. const toDisplayString = (val) => {
  286. return isString(val)
  287. ? val
  288. : val == null
  289. ? ''
  290. : isArray(val) ||
  291. (isObject(val) &&
  292. (val.toString === objectToString || !isFunction(val.toString)))
  293. ? JSON.stringify(val, replacer, 2)
  294. : String(val);
  295. };
  296. const replacer = (_key, val) => {
  297. // can't use isRef here since @vue/shared has no deps
  298. if (val && val.__v_isRef) {
  299. return replacer(_key, val.value);
  300. }
  301. else if (isMap(val)) {
  302. return {
  303. [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => {
  304. entries[`${key} =>`] = val;
  305. return entries;
  306. }, {})
  307. };
  308. }
  309. else if (isSet(val)) {
  310. return {
  311. [`Set(${val.size})`]: [...val.values()]
  312. };
  313. }
  314. else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
  315. return String(val);
  316. }
  317. return val;
  318. };
  319. const EMPTY_OBJ = Object.freeze({})
  320. ;
  321. const EMPTY_ARR = Object.freeze([]) ;
  322. const NOOP = () => { };
  323. /**
  324. * Always return false.
  325. */
  326. const NO = () => false;
  327. const onRE = /^on[^a-z]/;
  328. const isOn = (key) => onRE.test(key);
  329. const isModelListener = (key) => key.startsWith('onUpdate:');
  330. const extend = Object.assign;
  331. const remove = (arr, el) => {
  332. const i = arr.indexOf(el);
  333. if (i > -1) {
  334. arr.splice(i, 1);
  335. }
  336. };
  337. const hasOwnProperty = Object.prototype.hasOwnProperty;
  338. const hasOwn = (val, key) => hasOwnProperty.call(val, key);
  339. const isArray = Array.isArray;
  340. const isMap = (val) => toTypeString(val) === '[object Map]';
  341. const isSet = (val) => toTypeString(val) === '[object Set]';
  342. const isDate = (val) => val instanceof Date;
  343. const isFunction = (val) => typeof val === 'function';
  344. const isString = (val) => typeof val === 'string';
  345. const isSymbol = (val) => typeof val === 'symbol';
  346. const isObject = (val) => val !== null && typeof val === 'object';
  347. const isPromise = (val) => {
  348. return isObject(val) && isFunction(val.then) && isFunction(val.catch);
  349. };
  350. const objectToString = Object.prototype.toString;
  351. const toTypeString = (value) => objectToString.call(value);
  352. const toRawType = (value) => {
  353. // extract "RawType" from strings like "[object RawType]"
  354. return toTypeString(value).slice(8, -1);
  355. };
  356. const isPlainObject = (val) => toTypeString(val) === '[object Object]';
  357. const isIntegerKey = (key) => isString(key) &&
  358. key !== 'NaN' &&
  359. key[0] !== '-' &&
  360. '' + parseInt(key, 10) === key;
  361. const isReservedProp = /*#__PURE__*/ makeMap(
  362. // the leading comma is intentional so empty string "" is also included
  363. ',key,ref,ref_for,ref_key,' +
  364. 'onVnodeBeforeMount,onVnodeMounted,' +
  365. 'onVnodeBeforeUpdate,onVnodeUpdated,' +
  366. 'onVnodeBeforeUnmount,onVnodeUnmounted');
  367. const isBuiltInDirective = /*#__PURE__*/ makeMap('bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo');
  368. const cacheStringFunction = (fn) => {
  369. const cache = Object.create(null);
  370. return ((str) => {
  371. const hit = cache[str];
  372. return hit || (cache[str] = fn(str));
  373. });
  374. };
  375. const camelizeRE = /-(\w)/g;
  376. /**
  377. * @private
  378. */
  379. const camelize = cacheStringFunction((str) => {
  380. return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
  381. });
  382. const hyphenateRE = /\B([A-Z])/g;
  383. /**
  384. * @private
  385. */
  386. const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());
  387. /**
  388. * @private
  389. */
  390. const capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));
  391. /**
  392. * @private
  393. */
  394. const toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);
  395. // compare whether a value has changed, accounting for NaN.
  396. const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
  397. const invokeArrayFns = (fns, arg) => {
  398. for (let i = 0; i < fns.length; i++) {
  399. fns[i](arg);
  400. }
  401. };
  402. const def = (obj, key, value) => {
  403. Object.defineProperty(obj, key, {
  404. configurable: true,
  405. enumerable: false,
  406. value
  407. });
  408. };
  409. const toNumber = (val) => {
  410. const n = parseFloat(val);
  411. return isNaN(n) ? val : n;
  412. };
  413. let _globalThis;
  414. const getGlobalThis = () => {
  415. return (_globalThis ||
  416. (_globalThis =
  417. typeof globalThis !== 'undefined'
  418. ? globalThis
  419. : typeof self !== 'undefined'
  420. ? self
  421. : typeof window !== 'undefined'
  422. ? window
  423. : typeof global !== 'undefined'
  424. ? global
  425. : {}));
  426. };
  427. function warn(msg, ...args) {
  428. console.warn(`[Vue warn] ${msg}`, ...args);
  429. }
  430. let activeEffectScope;
  431. class EffectScope {
  432. constructor(detached = false) {
  433. this.active = true;
  434. this.effects = [];
  435. this.cleanups = [];
  436. if (!detached && activeEffectScope) {
  437. this.parent = activeEffectScope;
  438. this.index =
  439. (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1;
  440. }
  441. }
  442. run(fn) {
  443. if (this.active) {
  444. try {
  445. activeEffectScope = this;
  446. return fn();
  447. }
  448. finally {
  449. activeEffectScope = this.parent;
  450. }
  451. }
  452. else {
  453. warn(`cannot run an inactive effect scope.`);
  454. }
  455. }
  456. on() {
  457. activeEffectScope = this;
  458. }
  459. off() {
  460. activeEffectScope = this.parent;
  461. }
  462. stop(fromParent) {
  463. if (this.active) {
  464. let i, l;
  465. for (i = 0, l = this.effects.length; i < l; i++) {
  466. this.effects[i].stop();
  467. }
  468. for (i = 0, l = this.cleanups.length; i < l; i++) {
  469. this.cleanups[i]();
  470. }
  471. if (this.scopes) {
  472. for (i = 0, l = this.scopes.length; i < l; i++) {
  473. this.scopes[i].stop(true);
  474. }
  475. }
  476. // nested scope, dereference from parent to avoid memory leaks
  477. if (this.parent && !fromParent) {
  478. // optimized O(1) removal
  479. const last = this.parent.scopes.pop();
  480. if (last && last !== this) {
  481. this.parent.scopes[this.index] = last;
  482. last.index = this.index;
  483. }
  484. }
  485. this.active = false;
  486. }
  487. }
  488. }
  489. function effectScope(detached) {
  490. return new EffectScope(detached);
  491. }
  492. function recordEffectScope(effect, scope = activeEffectScope) {
  493. if (scope && scope.active) {
  494. scope.effects.push(effect);
  495. }
  496. }
  497. function getCurrentScope() {
  498. return activeEffectScope;
  499. }
  500. function onScopeDispose(fn) {
  501. if (activeEffectScope) {
  502. activeEffectScope.cleanups.push(fn);
  503. }
  504. else {
  505. warn(`onScopeDispose() is called when there is no active effect scope` +
  506. ` to be associated with.`);
  507. }
  508. }
  509. const createDep = (effects) => {
  510. const dep = new Set(effects);
  511. dep.w = 0;
  512. dep.n = 0;
  513. return dep;
  514. };
  515. const wasTracked = (dep) => (dep.w & trackOpBit) > 0;
  516. const newTracked = (dep) => (dep.n & trackOpBit) > 0;
  517. const initDepMarkers = ({ deps }) => {
  518. if (deps.length) {
  519. for (let i = 0; i < deps.length; i++) {
  520. deps[i].w |= trackOpBit; // set was tracked
  521. }
  522. }
  523. };
  524. const finalizeDepMarkers = (effect) => {
  525. const { deps } = effect;
  526. if (deps.length) {
  527. let ptr = 0;
  528. for (let i = 0; i < deps.length; i++) {
  529. const dep = deps[i];
  530. if (wasTracked(dep) && !newTracked(dep)) {
  531. dep.delete(effect);
  532. }
  533. else {
  534. deps[ptr++] = dep;
  535. }
  536. // clear bits
  537. dep.w &= ~trackOpBit;
  538. dep.n &= ~trackOpBit;
  539. }
  540. deps.length = ptr;
  541. }
  542. };
  543. const targetMap = new WeakMap();
  544. // The number of effects currently being tracked recursively.
  545. let effectTrackDepth = 0;
  546. let trackOpBit = 1;
  547. /**
  548. * The bitwise track markers support at most 30 levels of recursion.
  549. * This value is chosen to enable modern JS engines to use a SMI on all platforms.
  550. * When recursion depth is greater, fall back to using a full cleanup.
  551. */
  552. const maxMarkerBits = 30;
  553. let activeEffect;
  554. const ITERATE_KEY = Symbol('iterate' );
  555. const MAP_KEY_ITERATE_KEY = Symbol('Map key iterate' );
  556. class ReactiveEffect {
  557. constructor(fn, scheduler = null, scope) {
  558. this.fn = fn;
  559. this.scheduler = scheduler;
  560. this.active = true;
  561. this.deps = [];
  562. this.parent = undefined;
  563. recordEffectScope(this, scope);
  564. }
  565. run() {
  566. if (!this.active) {
  567. return this.fn();
  568. }
  569. let parent = activeEffect;
  570. let lastShouldTrack = shouldTrack;
  571. while (parent) {
  572. if (parent === this) {
  573. return;
  574. }
  575. parent = parent.parent;
  576. }
  577. try {
  578. this.parent = activeEffect;
  579. activeEffect = this;
  580. shouldTrack = true;
  581. trackOpBit = 1 << ++effectTrackDepth;
  582. if (effectTrackDepth <= maxMarkerBits) {
  583. initDepMarkers(this);
  584. }
  585. else {
  586. cleanupEffect(this);
  587. }
  588. return this.fn();
  589. }
  590. finally {
  591. if (effectTrackDepth <= maxMarkerBits) {
  592. finalizeDepMarkers(this);
  593. }
  594. trackOpBit = 1 << --effectTrackDepth;
  595. activeEffect = this.parent;
  596. shouldTrack = lastShouldTrack;
  597. this.parent = undefined;
  598. }
  599. }
  600. stop() {
  601. if (this.active) {
  602. cleanupEffect(this);
  603. if (this.onStop) {
  604. this.onStop();
  605. }
  606. this.active = false;
  607. }
  608. }
  609. }
  610. function cleanupEffect(effect) {
  611. const { deps } = effect;
  612. if (deps.length) {
  613. for (let i = 0; i < deps.length; i++) {
  614. deps[i].delete(effect);
  615. }
  616. deps.length = 0;
  617. }
  618. }
  619. function effect(fn, options) {
  620. if (fn.effect) {
  621. fn = fn.effect.fn;
  622. }
  623. const _effect = new ReactiveEffect(fn);
  624. if (options) {
  625. extend(_effect, options);
  626. if (options.scope)
  627. recordEffectScope(_effect, options.scope);
  628. }
  629. if (!options || !options.lazy) {
  630. _effect.run();
  631. }
  632. const runner = _effect.run.bind(_effect);
  633. runner.effect = _effect;
  634. return runner;
  635. }
  636. function stop(runner) {
  637. runner.effect.stop();
  638. }
  639. let shouldTrack = true;
  640. const trackStack = [];
  641. function pauseTracking() {
  642. trackStack.push(shouldTrack);
  643. shouldTrack = false;
  644. }
  645. function resetTracking() {
  646. const last = trackStack.pop();
  647. shouldTrack = last === undefined ? true : last;
  648. }
  649. function track(target, type, key) {
  650. if (shouldTrack && activeEffect) {
  651. let depsMap = targetMap.get(target);
  652. if (!depsMap) {
  653. targetMap.set(target, (depsMap = new Map()));
  654. }
  655. let dep = depsMap.get(key);
  656. if (!dep) {
  657. depsMap.set(key, (dep = createDep()));
  658. }
  659. const eventInfo = { effect: activeEffect, target, type, key }
  660. ;
  661. trackEffects(dep, eventInfo);
  662. }
  663. }
  664. function trackEffects(dep, debuggerEventExtraInfo) {
  665. let shouldTrack = false;
  666. if (effectTrackDepth <= maxMarkerBits) {
  667. if (!newTracked(dep)) {
  668. dep.n |= trackOpBit; // set newly tracked
  669. shouldTrack = !wasTracked(dep);
  670. }
  671. }
  672. else {
  673. // Full cleanup mode.
  674. shouldTrack = !dep.has(activeEffect);
  675. }
  676. if (shouldTrack) {
  677. dep.add(activeEffect);
  678. activeEffect.deps.push(dep);
  679. if (activeEffect.onTrack) {
  680. activeEffect.onTrack(Object.assign({
  681. effect: activeEffect
  682. }, debuggerEventExtraInfo));
  683. }
  684. }
  685. }
  686. function trigger(target, type, key, newValue, oldValue, oldTarget) {
  687. const depsMap = targetMap.get(target);
  688. if (!depsMap) {
  689. // never been tracked
  690. return;
  691. }
  692. let deps = [];
  693. if (type === "clear" /* CLEAR */) {
  694. // collection being cleared
  695. // trigger all effects for target
  696. deps = [...depsMap.values()];
  697. }
  698. else if (key === 'length' && isArray(target)) {
  699. depsMap.forEach((dep, key) => {
  700. if (key === 'length' || key >= newValue) {
  701. deps.push(dep);
  702. }
  703. });
  704. }
  705. else {
  706. // schedule runs for SET | ADD | DELETE
  707. if (key !== void 0) {
  708. deps.push(depsMap.get(key));
  709. }
  710. // also run for iteration key on ADD | DELETE | Map.SET
  711. switch (type) {
  712. case "add" /* ADD */:
  713. if (!isArray(target)) {
  714. deps.push(depsMap.get(ITERATE_KEY));
  715. if (isMap(target)) {
  716. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  717. }
  718. }
  719. else if (isIntegerKey(key)) {
  720. // new index added to array -> length changes
  721. deps.push(depsMap.get('length'));
  722. }
  723. break;
  724. case "delete" /* DELETE */:
  725. if (!isArray(target)) {
  726. deps.push(depsMap.get(ITERATE_KEY));
  727. if (isMap(target)) {
  728. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  729. }
  730. }
  731. break;
  732. case "set" /* SET */:
  733. if (isMap(target)) {
  734. deps.push(depsMap.get(ITERATE_KEY));
  735. }
  736. break;
  737. }
  738. }
  739. const eventInfo = { target, type, key, newValue, oldValue, oldTarget }
  740. ;
  741. if (deps.length === 1) {
  742. if (deps[0]) {
  743. {
  744. triggerEffects(deps[0], eventInfo);
  745. }
  746. }
  747. }
  748. else {
  749. const effects = [];
  750. for (const dep of deps) {
  751. if (dep) {
  752. effects.push(...dep);
  753. }
  754. }
  755. {
  756. triggerEffects(createDep(effects), eventInfo);
  757. }
  758. }
  759. }
  760. function triggerEffects(dep, debuggerEventExtraInfo) {
  761. // spread into array for stabilization
  762. for (const effect of isArray(dep) ? dep : [...dep]) {
  763. if (effect !== activeEffect || effect.allowRecurse) {
  764. if (effect.onTrigger) {
  765. effect.onTrigger(extend({ effect }, debuggerEventExtraInfo));
  766. }
  767. if (effect.scheduler) {
  768. effect.scheduler();
  769. }
  770. else {
  771. effect.run();
  772. }
  773. }
  774. }
  775. }
  776. const isNonTrackableKeys = /*#__PURE__*/ makeMap(`__proto__,__v_isRef,__isVue`);
  777. const builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol)
  778. .map(key => Symbol[key])
  779. .filter(isSymbol));
  780. const get = /*#__PURE__*/ createGetter();
  781. const shallowGet = /*#__PURE__*/ createGetter(false, true);
  782. const readonlyGet = /*#__PURE__*/ createGetter(true);
  783. const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true);
  784. const arrayInstrumentations = /*#__PURE__*/ createArrayInstrumentations();
  785. function createArrayInstrumentations() {
  786. const instrumentations = {};
  787. ['includes', 'indexOf', 'lastIndexOf'].forEach(key => {
  788. instrumentations[key] = function (...args) {
  789. const arr = toRaw(this);
  790. for (let i = 0, l = this.length; i < l; i++) {
  791. track(arr, "get" /* GET */, i + '');
  792. }
  793. // we run the method using the original args first (which may be reactive)
  794. const res = arr[key](...args);
  795. if (res === -1 || res === false) {
  796. // if that didn't work, run it again using raw values.
  797. return arr[key](...args.map(toRaw));
  798. }
  799. else {
  800. return res;
  801. }
  802. };
  803. });
  804. ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(key => {
  805. instrumentations[key] = function (...args) {
  806. pauseTracking();
  807. const res = toRaw(this)[key].apply(this, args);
  808. resetTracking();
  809. return res;
  810. };
  811. });
  812. return instrumentations;
  813. }
  814. function createGetter(isReadonly = false, shallow = false) {
  815. return function get(target, key, receiver) {
  816. if (key === "__v_isReactive" /* IS_REACTIVE */) {
  817. return !isReadonly;
  818. }
  819. else if (key === "__v_isReadonly" /* IS_READONLY */) {
  820. return isReadonly;
  821. }
  822. else if (key === "__v_isShallow" /* IS_SHALLOW */) {
  823. return shallow;
  824. }
  825. else if (key === "__v_raw" /* RAW */ &&
  826. receiver ===
  827. (isReadonly
  828. ? shallow
  829. ? shallowReadonlyMap
  830. : readonlyMap
  831. : shallow
  832. ? shallowReactiveMap
  833. : reactiveMap).get(target)) {
  834. return target;
  835. }
  836. const targetIsArray = isArray(target);
  837. if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
  838. return Reflect.get(arrayInstrumentations, key, receiver);
  839. }
  840. const res = Reflect.get(target, key, receiver);
  841. if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
  842. return res;
  843. }
  844. if (!isReadonly) {
  845. track(target, "get" /* GET */, key);
  846. }
  847. if (shallow) {
  848. return res;
  849. }
  850. if (isRef(res)) {
  851. // ref unwrapping - does not apply for Array + integer key.
  852. const shouldUnwrap = !targetIsArray || !isIntegerKey(key);
  853. return shouldUnwrap ? res.value : res;
  854. }
  855. if (isObject(res)) {
  856. // Convert returned value into a proxy as well. we do the isObject check
  857. // here to avoid invalid value warning. Also need to lazy access readonly
  858. // and reactive here to avoid circular dependency.
  859. return isReadonly ? readonly(res) : reactive(res);
  860. }
  861. return res;
  862. };
  863. }
  864. const set = /*#__PURE__*/ createSetter();
  865. const shallowSet = /*#__PURE__*/ createSetter(true);
  866. function createSetter(shallow = false) {
  867. return function set(target, key, value, receiver) {
  868. let oldValue = target[key];
  869. if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
  870. return false;
  871. }
  872. if (!shallow && !isReadonly(value)) {
  873. if (!isShallow(value)) {
  874. value = toRaw(value);
  875. oldValue = toRaw(oldValue);
  876. }
  877. if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
  878. oldValue.value = value;
  879. return true;
  880. }
  881. }
  882. const hadKey = isArray(target) && isIntegerKey(key)
  883. ? Number(key) < target.length
  884. : hasOwn(target, key);
  885. const result = Reflect.set(target, key, value, receiver);
  886. // don't trigger if target is something up in the prototype chain of original
  887. if (target === toRaw(receiver)) {
  888. if (!hadKey) {
  889. trigger(target, "add" /* ADD */, key, value);
  890. }
  891. else if (hasChanged(value, oldValue)) {
  892. trigger(target, "set" /* SET */, key, value, oldValue);
  893. }
  894. }
  895. return result;
  896. };
  897. }
  898. function deleteProperty(target, key) {
  899. const hadKey = hasOwn(target, key);
  900. const oldValue = target[key];
  901. const result = Reflect.deleteProperty(target, key);
  902. if (result && hadKey) {
  903. trigger(target, "delete" /* DELETE */, key, undefined, oldValue);
  904. }
  905. return result;
  906. }
  907. function has(target, key) {
  908. const result = Reflect.has(target, key);
  909. if (!isSymbol(key) || !builtInSymbols.has(key)) {
  910. track(target, "has" /* HAS */, key);
  911. }
  912. return result;
  913. }
  914. function ownKeys(target) {
  915. track(target, "iterate" /* ITERATE */, isArray(target) ? 'length' : ITERATE_KEY);
  916. return Reflect.ownKeys(target);
  917. }
  918. const mutableHandlers = {
  919. get,
  920. set,
  921. deleteProperty,
  922. has,
  923. ownKeys
  924. };
  925. const readonlyHandlers = {
  926. get: readonlyGet,
  927. set(target, key) {
  928. {
  929. console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
  930. }
  931. return true;
  932. },
  933. deleteProperty(target, key) {
  934. {
  935. console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
  936. }
  937. return true;
  938. }
  939. };
  940. const shallowReactiveHandlers = /*#__PURE__*/ extend({}, mutableHandlers, {
  941. get: shallowGet,
  942. set: shallowSet
  943. });
  944. // Props handlers are special in the sense that it should not unwrap top-level
  945. // refs (in order to allow refs to be explicitly passed down), but should
  946. // retain the reactivity of the normal readonly object.
  947. const shallowReadonlyHandlers = /*#__PURE__*/ extend({}, readonlyHandlers, {
  948. get: shallowReadonlyGet
  949. });
  950. const toShallow = (value) => value;
  951. const getProto = (v) => Reflect.getPrototypeOf(v);
  952. function get$1(target, key, isReadonly = false, isShallow = false) {
  953. // #1772: readonly(reactive(Map)) should return readonly + reactive version
  954. // of the value
  955. target = target["__v_raw" /* RAW */];
  956. const rawTarget = toRaw(target);
  957. const rawKey = toRaw(key);
  958. if (key !== rawKey) {
  959. !isReadonly && track(rawTarget, "get" /* GET */, key);
  960. }
  961. !isReadonly && track(rawTarget, "get" /* GET */, rawKey);
  962. const { has } = getProto(rawTarget);
  963. const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  964. if (has.call(rawTarget, key)) {
  965. return wrap(target.get(key));
  966. }
  967. else if (has.call(rawTarget, rawKey)) {
  968. return wrap(target.get(rawKey));
  969. }
  970. else if (target !== rawTarget) {
  971. // #3602 readonly(reactive(Map))
  972. // ensure that the nested reactive `Map` can do tracking for itself
  973. target.get(key);
  974. }
  975. }
  976. function has$1(key, isReadonly = false) {
  977. const target = this["__v_raw" /* RAW */];
  978. const rawTarget = toRaw(target);
  979. const rawKey = toRaw(key);
  980. if (key !== rawKey) {
  981. !isReadonly && track(rawTarget, "has" /* HAS */, key);
  982. }
  983. !isReadonly && track(rawTarget, "has" /* HAS */, rawKey);
  984. return key === rawKey
  985. ? target.has(key)
  986. : target.has(key) || target.has(rawKey);
  987. }
  988. function size(target, isReadonly = false) {
  989. target = target["__v_raw" /* RAW */];
  990. !isReadonly && track(toRaw(target), "iterate" /* ITERATE */, ITERATE_KEY);
  991. return Reflect.get(target, 'size', target);
  992. }
  993. function add(value) {
  994. value = toRaw(value);
  995. const target = toRaw(this);
  996. const proto = getProto(target);
  997. const hadKey = proto.has.call(target, value);
  998. if (!hadKey) {
  999. target.add(value);
  1000. trigger(target, "add" /* ADD */, value, value);
  1001. }
  1002. return this;
  1003. }
  1004. function set$1(key, value) {
  1005. value = toRaw(value);
  1006. const target = toRaw(this);
  1007. const { has, get } = getProto(target);
  1008. let hadKey = has.call(target, key);
  1009. if (!hadKey) {
  1010. key = toRaw(key);
  1011. hadKey = has.call(target, key);
  1012. }
  1013. else {
  1014. checkIdentityKeys(target, has, key);
  1015. }
  1016. const oldValue = get.call(target, key);
  1017. target.set(key, value);
  1018. if (!hadKey) {
  1019. trigger(target, "add" /* ADD */, key, value);
  1020. }
  1021. else if (hasChanged(value, oldValue)) {
  1022. trigger(target, "set" /* SET */, key, value, oldValue);
  1023. }
  1024. return this;
  1025. }
  1026. function deleteEntry(key) {
  1027. const target = toRaw(this);
  1028. const { has, get } = getProto(target);
  1029. let hadKey = has.call(target, key);
  1030. if (!hadKey) {
  1031. key = toRaw(key);
  1032. hadKey = has.call(target, key);
  1033. }
  1034. else {
  1035. checkIdentityKeys(target, has, key);
  1036. }
  1037. const oldValue = get ? get.call(target, key) : undefined;
  1038. // forward the operation before queueing reactions
  1039. const result = target.delete(key);
  1040. if (hadKey) {
  1041. trigger(target, "delete" /* DELETE */, key, undefined, oldValue);
  1042. }
  1043. return result;
  1044. }
  1045. function clear() {
  1046. const target = toRaw(this);
  1047. const hadItems = target.size !== 0;
  1048. const oldTarget = isMap(target)
  1049. ? new Map(target)
  1050. : new Set(target)
  1051. ;
  1052. // forward the operation before queueing reactions
  1053. const result = target.clear();
  1054. if (hadItems) {
  1055. trigger(target, "clear" /* CLEAR */, undefined, undefined, oldTarget);
  1056. }
  1057. return result;
  1058. }
  1059. function createForEach(isReadonly, isShallow) {
  1060. return function forEach(callback, thisArg) {
  1061. const observed = this;
  1062. const target = observed["__v_raw" /* RAW */];
  1063. const rawTarget = toRaw(target);
  1064. const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  1065. !isReadonly && track(rawTarget, "iterate" /* ITERATE */, ITERATE_KEY);
  1066. return target.forEach((value, key) => {
  1067. // important: make sure the callback is
  1068. // 1. invoked with the reactive map as `this` and 3rd arg
  1069. // 2. the value received should be a corresponding reactive/readonly.
  1070. return callback.call(thisArg, wrap(value), wrap(key), observed);
  1071. });
  1072. };
  1073. }
  1074. function createIterableMethod(method, isReadonly, isShallow) {
  1075. return function (...args) {
  1076. const target = this["__v_raw" /* RAW */];
  1077. const rawTarget = toRaw(target);
  1078. const targetIsMap = isMap(rawTarget);
  1079. const isPair = method === 'entries' || (method === Symbol.iterator && targetIsMap);
  1080. const isKeyOnly = method === 'keys' && targetIsMap;
  1081. const innerIterator = target[method](...args);
  1082. const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  1083. !isReadonly &&
  1084. track(rawTarget, "iterate" /* ITERATE */, isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
  1085. // return a wrapped iterator which returns observed versions of the
  1086. // values emitted from the real iterator
  1087. return {
  1088. // iterator protocol
  1089. next() {
  1090. const { value, done } = innerIterator.next();
  1091. return done
  1092. ? { value, done }
  1093. : {
  1094. value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
  1095. done
  1096. };
  1097. },
  1098. // iterable protocol
  1099. [Symbol.iterator]() {
  1100. return this;
  1101. }
  1102. };
  1103. };
  1104. }
  1105. function createReadonlyMethod(type) {
  1106. return function (...args) {
  1107. {
  1108. const key = args[0] ? `on key "${args[0]}" ` : ``;
  1109. console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this));
  1110. }
  1111. return type === "delete" /* DELETE */ ? false : this;
  1112. };
  1113. }
  1114. function createInstrumentations() {
  1115. const mutableInstrumentations = {
  1116. get(key) {
  1117. return get$1(this, key);
  1118. },
  1119. get size() {
  1120. return size(this);
  1121. },
  1122. has: has$1,
  1123. add,
  1124. set: set$1,
  1125. delete: deleteEntry,
  1126. clear,
  1127. forEach: createForEach(false, false)
  1128. };
  1129. const shallowInstrumentations = {
  1130. get(key) {
  1131. return get$1(this, key, false, true);
  1132. },
  1133. get size() {
  1134. return size(this);
  1135. },
  1136. has: has$1,
  1137. add,
  1138. set: set$1,
  1139. delete: deleteEntry,
  1140. clear,
  1141. forEach: createForEach(false, true)
  1142. };
  1143. const readonlyInstrumentations = {
  1144. get(key) {
  1145. return get$1(this, key, true);
  1146. },
  1147. get size() {
  1148. return size(this, true);
  1149. },
  1150. has(key) {
  1151. return has$1.call(this, key, true);
  1152. },
  1153. add: createReadonlyMethod("add" /* ADD */),
  1154. set: createReadonlyMethod("set" /* SET */),
  1155. delete: createReadonlyMethod("delete" /* DELETE */),
  1156. clear: createReadonlyMethod("clear" /* CLEAR */),
  1157. forEach: createForEach(true, false)
  1158. };
  1159. const shallowReadonlyInstrumentations = {
  1160. get(key) {
  1161. return get$1(this, key, true, true);
  1162. },
  1163. get size() {
  1164. return size(this, true);
  1165. },
  1166. has(key) {
  1167. return has$1.call(this, key, true);
  1168. },
  1169. add: createReadonlyMethod("add" /* ADD */),
  1170. set: createReadonlyMethod("set" /* SET */),
  1171. delete: createReadonlyMethod("delete" /* DELETE */),
  1172. clear: createReadonlyMethod("clear" /* CLEAR */),
  1173. forEach: createForEach(true, true)
  1174. };
  1175. const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
  1176. iteratorMethods.forEach(method => {
  1177. mutableInstrumentations[method] = createIterableMethod(method, false, false);
  1178. readonlyInstrumentations[method] = createIterableMethod(method, true, false);
  1179. shallowInstrumentations[method] = createIterableMethod(method, false, true);
  1180. shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true);
  1181. });
  1182. return [
  1183. mutableInstrumentations,
  1184. readonlyInstrumentations,
  1185. shallowInstrumentations,
  1186. shallowReadonlyInstrumentations
  1187. ];
  1188. }
  1189. const [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* #__PURE__*/ createInstrumentations();
  1190. function createInstrumentationGetter(isReadonly, shallow) {
  1191. const instrumentations = shallow
  1192. ? isReadonly
  1193. ? shallowReadonlyInstrumentations
  1194. : shallowInstrumentations
  1195. : isReadonly
  1196. ? readonlyInstrumentations
  1197. : mutableInstrumentations;
  1198. return (target, key, receiver) => {
  1199. if (key === "__v_isReactive" /* IS_REACTIVE */) {
  1200. return !isReadonly;
  1201. }
  1202. else if (key === "__v_isReadonly" /* IS_READONLY */) {
  1203. return isReadonly;
  1204. }
  1205. else if (key === "__v_raw" /* RAW */) {
  1206. return target;
  1207. }
  1208. return Reflect.get(hasOwn(instrumentations, key) && key in target
  1209. ? instrumentations
  1210. : target, key, receiver);
  1211. };
  1212. }
  1213. const mutableCollectionHandlers = {
  1214. get: /*#__PURE__*/ createInstrumentationGetter(false, false)
  1215. };
  1216. const shallowCollectionHandlers = {
  1217. get: /*#__PURE__*/ createInstrumentationGetter(false, true)
  1218. };
  1219. const readonlyCollectionHandlers = {
  1220. get: /*#__PURE__*/ createInstrumentationGetter(true, false)
  1221. };
  1222. const shallowReadonlyCollectionHandlers = {
  1223. get: /*#__PURE__*/ createInstrumentationGetter(true, true)
  1224. };
  1225. function checkIdentityKeys(target, has, key) {
  1226. const rawKey = toRaw(key);
  1227. if (rawKey !== key && has.call(target, rawKey)) {
  1228. const type = toRawType(target);
  1229. console.warn(`Reactive ${type} contains both the raw and reactive ` +
  1230. `versions of the same object${type === `Map` ? ` as keys` : ``}, ` +
  1231. `which can lead to inconsistencies. ` +
  1232. `Avoid differentiating between the raw and reactive versions ` +
  1233. `of an object and only use the reactive version if possible.`);
  1234. }
  1235. }
  1236. const reactiveMap = new WeakMap();
  1237. const shallowReactiveMap = new WeakMap();
  1238. const readonlyMap = new WeakMap();
  1239. const shallowReadonlyMap = new WeakMap();
  1240. function targetTypeMap(rawType) {
  1241. switch (rawType) {
  1242. case 'Object':
  1243. case 'Array':
  1244. return 1 /* COMMON */;
  1245. case 'Map':
  1246. case 'Set':
  1247. case 'WeakMap':
  1248. case 'WeakSet':
  1249. return 2 /* COLLECTION */;
  1250. default:
  1251. return 0 /* INVALID */;
  1252. }
  1253. }
  1254. function getTargetType(value) {
  1255. return value["__v_skip" /* SKIP */] || !Object.isExtensible(value)
  1256. ? 0 /* INVALID */
  1257. : targetTypeMap(toRawType(value));
  1258. }
  1259. function reactive(target) {
  1260. // if trying to observe a readonly proxy, return the readonly version.
  1261. if (isReadonly(target)) {
  1262. return target;
  1263. }
  1264. return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
  1265. }
  1266. /**
  1267. * Return a shallowly-reactive copy of the original object, where only the root
  1268. * level properties are reactive. It also does not auto-unwrap refs (even at the
  1269. * root level).
  1270. */
  1271. function shallowReactive(target) {
  1272. return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);
  1273. }
  1274. /**
  1275. * Creates a readonly copy of the original object. Note the returned copy is not
  1276. * made reactive, but `readonly` can be called on an already reactive object.
  1277. */
  1278. function readonly(target) {
  1279. return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
  1280. }
  1281. /**
  1282. * Returns a reactive-copy of the original object, where only the root level
  1283. * properties are readonly, and does NOT unwrap refs nor recursively convert
  1284. * returned properties.
  1285. * This is used for creating the props proxy object for stateful components.
  1286. */
  1287. function shallowReadonly(target) {
  1288. return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap);
  1289. }
  1290. function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {
  1291. if (!isObject(target)) {
  1292. {
  1293. console.warn(`value cannot be made reactive: ${String(target)}`);
  1294. }
  1295. return target;
  1296. }
  1297. // target is already a Proxy, return it.
  1298. // exception: calling readonly() on a reactive object
  1299. if (target["__v_raw" /* RAW */] &&
  1300. !(isReadonly && target["__v_isReactive" /* IS_REACTIVE */])) {
  1301. return target;
  1302. }
  1303. // target already has corresponding Proxy
  1304. const existingProxy = proxyMap.get(target);
  1305. if (existingProxy) {
  1306. return existingProxy;
  1307. }
  1308. // only a whitelist of value types can be observed.
  1309. const targetType = getTargetType(target);
  1310. if (targetType === 0 /* INVALID */) {
  1311. return target;
  1312. }
  1313. const proxy = new Proxy(target, targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers);
  1314. proxyMap.set(target, proxy);
  1315. return proxy;
  1316. }
  1317. function isReactive(value) {
  1318. if (isReadonly(value)) {
  1319. return isReactive(value["__v_raw" /* RAW */]);
  1320. }
  1321. return !!(value && value["__v_isReactive" /* IS_REACTIVE */]);
  1322. }
  1323. function isReadonly(value) {
  1324. return !!(value && value["__v_isReadonly" /* IS_READONLY */]);
  1325. }
  1326. function isShallow(value) {
  1327. return !!(value && value["__v_isShallow" /* IS_SHALLOW */]);
  1328. }
  1329. function isProxy(value) {
  1330. return isReactive(value) || isReadonly(value);
  1331. }
  1332. function toRaw(observed) {
  1333. const raw = observed && observed["__v_raw" /* RAW */];
  1334. return raw ? toRaw(raw) : observed;
  1335. }
  1336. function markRaw(value) {
  1337. def(value, "__v_skip" /* SKIP */, true);
  1338. return value;
  1339. }
  1340. const toReactive = (value) => isObject(value) ? reactive(value) : value;
  1341. const toReadonly = (value) => isObject(value) ? readonly(value) : value;
  1342. function trackRefValue(ref) {
  1343. if (shouldTrack && activeEffect) {
  1344. ref = toRaw(ref);
  1345. {
  1346. trackEffects(ref.dep || (ref.dep = createDep()), {
  1347. target: ref,
  1348. type: "get" /* GET */,
  1349. key: 'value'
  1350. });
  1351. }
  1352. }
  1353. }
  1354. function triggerRefValue(ref, newVal) {
  1355. ref = toRaw(ref);
  1356. if (ref.dep) {
  1357. {
  1358. triggerEffects(ref.dep, {
  1359. target: ref,
  1360. type: "set" /* SET */,
  1361. key: 'value',
  1362. newValue: newVal
  1363. });
  1364. }
  1365. }
  1366. }
  1367. function isRef(r) {
  1368. return !!(r && r.__v_isRef === true);
  1369. }
  1370. function ref(value) {
  1371. return createRef(value, false);
  1372. }
  1373. function shallowRef(value) {
  1374. return createRef(value, true);
  1375. }
  1376. function createRef(rawValue, shallow) {
  1377. if (isRef(rawValue)) {
  1378. return rawValue;
  1379. }
  1380. return new RefImpl(rawValue, shallow);
  1381. }
  1382. class RefImpl {
  1383. constructor(value, __v_isShallow) {
  1384. this.__v_isShallow = __v_isShallow;
  1385. this.dep = undefined;
  1386. this.__v_isRef = true;
  1387. this._rawValue = __v_isShallow ? value : toRaw(value);
  1388. this._value = __v_isShallow ? value : toReactive(value);
  1389. }
  1390. get value() {
  1391. trackRefValue(this);
  1392. return this._value;
  1393. }
  1394. set value(newVal) {
  1395. newVal = this.__v_isShallow ? newVal : toRaw(newVal);
  1396. if (hasChanged(newVal, this._rawValue)) {
  1397. this._rawValue = newVal;
  1398. this._value = this.__v_isShallow ? newVal : toReactive(newVal);
  1399. triggerRefValue(this, newVal);
  1400. }
  1401. }
  1402. }
  1403. function triggerRef(ref) {
  1404. triggerRefValue(ref, ref.value );
  1405. }
  1406. function unref(ref) {
  1407. return isRef(ref) ? ref.value : ref;
  1408. }
  1409. const shallowUnwrapHandlers = {
  1410. get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
  1411. set: (target, key, value, receiver) => {
  1412. const oldValue = target[key];
  1413. if (isRef(oldValue) && !isRef(value)) {
  1414. oldValue.value = value;
  1415. return true;
  1416. }
  1417. else {
  1418. return Reflect.set(target, key, value, receiver);
  1419. }
  1420. }
  1421. };
  1422. function proxyRefs(objectWithRefs) {
  1423. return isReactive(objectWithRefs)
  1424. ? objectWithRefs
  1425. : new Proxy(objectWithRefs, shallowUnwrapHandlers);
  1426. }
  1427. class CustomRefImpl {
  1428. constructor(factory) {
  1429. this.dep = undefined;
  1430. this.__v_isRef = true;
  1431. const { get, set } = factory(() => trackRefValue(this), () => triggerRefValue(this));
  1432. this._get = get;
  1433. this._set = set;
  1434. }
  1435. get value() {
  1436. return this._get();
  1437. }
  1438. set value(newVal) {
  1439. this._set(newVal);
  1440. }
  1441. }
  1442. function customRef(factory) {
  1443. return new CustomRefImpl(factory);
  1444. }
  1445. function toRefs(object) {
  1446. if (!isProxy(object)) {
  1447. console.warn(`toRefs() expects a reactive object but received a plain one.`);
  1448. }
  1449. const ret = isArray(object) ? new Array(object.length) : {};
  1450. for (const key in object) {
  1451. ret[key] = toRef(object, key);
  1452. }
  1453. return ret;
  1454. }
  1455. class ObjectRefImpl {
  1456. constructor(_object, _key, _defaultValue) {
  1457. this._object = _object;
  1458. this._key = _key;
  1459. this._defaultValue = _defaultValue;
  1460. this.__v_isRef = true;
  1461. }
  1462. get value() {
  1463. const val = this._object[this._key];
  1464. return val === undefined ? this._defaultValue : val;
  1465. }
  1466. set value(newVal) {
  1467. this._object[this._key] = newVal;
  1468. }
  1469. }
  1470. function toRef(object, key, defaultValue) {
  1471. const val = object[key];
  1472. return isRef(val)
  1473. ? val
  1474. : new ObjectRefImpl(object, key, defaultValue);
  1475. }
  1476. class ComputedRefImpl {
  1477. constructor(getter, _setter, isReadonly, isSSR) {
  1478. this._setter = _setter;
  1479. this.dep = undefined;
  1480. this.__v_isRef = true;
  1481. this._dirty = true;
  1482. this.effect = new ReactiveEffect(getter, () => {
  1483. if (!this._dirty) {
  1484. this._dirty = true;
  1485. triggerRefValue(this);
  1486. }
  1487. });
  1488. this.effect.computed = this;
  1489. this.effect.active = this._cacheable = !isSSR;
  1490. this["__v_isReadonly" /* IS_READONLY */] = isReadonly;
  1491. }
  1492. get value() {
  1493. // the computed ref may get wrapped by other proxies e.g. readonly() #3376
  1494. const self = toRaw(this);
  1495. trackRefValue(self);
  1496. if (self._dirty || !self._cacheable) {
  1497. self._dirty = false;
  1498. self._value = self.effect.run();
  1499. }
  1500. return self._value;
  1501. }
  1502. set value(newValue) {
  1503. this._setter(newValue);
  1504. }
  1505. }
  1506. function computed(getterOrOptions, debugOp