@feng3d/reactivity 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +158 -158
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +10 -5
- package/dist/index.umd.cjs.map +1 -1
- package/lib/computed.d.ts +8 -6
- package/lib/computed.d.ts.map +1 -1
- package/lib/property.d.ts.map +1 -1
- package/lib/reactive.d.ts +10 -2
- package/lib/reactive.d.ts.map +1 -1
- package/package.json +66 -66
- package/src/Reactivity.ts +126 -126
- package/src/arrayInstrumentations.ts +448 -448
- package/src/baseHandlers.ts +220 -220
- package/src/batch.ts +91 -91
- package/src/collectionHandlers.ts +298 -298
- package/src/computed.ts +204 -201
- package/src/effect.ts +108 -108
- package/src/index.ts +8 -8
- package/src/property.ts +225 -223
- package/src/reactive.ts +139 -130
- package/src/ref.ts +88 -88
- package/src/shared/constants.ts +41 -41
- package/src/shared/general.ts +109 -109
- package/tsconfig.json +19 -19
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/Reactivity.ts","../src/batch.ts","../src/computed.ts","../src/effect.ts","../src/shared/constants.ts","../src/shared/general.ts","../src/property.ts","../src/arrayInstrumentations.ts","../src/ref.ts","../src/baseHandlers.ts","../src/collectionHandlers.ts","../src/reactive.ts"],"sourcesContent":["import { type ComputedReactivity } from './computed';\r\n\r\n/**\r\n * 反应式节点。\r\n *\r\n * 拥有节点值以及被捕捉与触发的能力。\r\n *\r\n * 用于被 computed effect 等构建的节点所继承。\r\n */\r\nexport class Reactivity<T = any>\r\n{\r\n /**\r\n * 获取当前节点值。\r\n *\r\n * 取值时将会建立与父节点的依赖关系。\r\n */\r\n get value(): T\r\n {\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n /**\r\n * @private\r\n */\r\n _value: T;\r\n\r\n /**\r\n * 父反应节点。\r\n *\r\n * 记录了哪些节点调用了当前节点。\r\n *\r\n * 当前节点失效时,会通知并移除所有父节点。\r\n *\r\n * @private\r\n */\r\n _parents = new Map<ComputedReactivity, number>();\r\n\r\n /**\r\n * 捕捉。\r\n *\r\n * 建立与父节点的依赖关系。\r\n */\r\n track()\r\n {\r\n if (!_shouldTrack) return;\r\n\r\n // 连接父节点和子节点。\r\n const parent = Reactivity.activeReactivity;\r\n if (parent)\r\n {\r\n this._parents.set(parent, parent._version);\r\n }\r\n }\r\n\r\n /**\r\n * 触发。\r\n *\r\n * 冒泡到所有父节点,设置失效子节点字典。\r\n */\r\n trigger()\r\n {\r\n // 冒泡到所有父节点,设置失效子节点字典。\r\n this._parents.forEach((version, parent) =>\r\n {\r\n if (parent._version !== version) return;\r\n\r\n parent.trigger();\r\n // 失效时添加子节点到父节点中。\r\n parent._children.set(this, this._value);\r\n });\r\n\r\n //\r\n this._parents.clear();\r\n }\r\n\r\n /**\r\n * 当前正在执行的反应式节点。\r\n *\r\n * @internal\r\n */\r\n static activeReactivity: ComputedReactivity;\r\n}\r\n\r\n/**\r\n * 反应式节点链。\r\n */\r\nexport type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };\r\n\r\n/**\r\n * 强制跟踪。\r\n *\r\n * @param fn 强制跟踪的函数。\r\n */\r\nexport function forceTrack<T>(fn: () => T): T\r\n{\r\n const preShouldTrack = _shouldTrack;\r\n _shouldTrack = true;\r\n const result = fn();\r\n _shouldTrack = preShouldTrack;\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 不跟踪。\r\n *\r\n * @param fn 不跟踪的函数。\r\n */\r\nexport function noTrack<T>(fn: () => T): T\r\n{\r\n const preShouldTrack = _shouldTrack;\r\n _shouldTrack = false;\r\n const result = fn();\r\n _shouldTrack = preShouldTrack;\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 是否应该跟踪的标志\r\n * 控制是否进行依赖跟踪\r\n *\r\n * @private\r\n */\r\nlet _shouldTrack = true;\r\n","import { ComputedReactivity } from './computed';\r\nimport { Reactivity } from './Reactivity';\r\n\r\n/**\r\n * 合批处理。\r\n *\r\n * @param dep 要处理的依赖。\r\n * @param isRunning 添加时是否是正在运行。\r\n */\r\nexport function batch(dep: ComputedReactivity, isRunning: boolean): void\r\n{\r\n if (isRunning)\r\n {\r\n _isRunedDeps.push(dep);\r\n }\r\n else\r\n {\r\n _needEffectDeps.push(dep);\r\n }\r\n}\r\n\r\n/**\r\n * 批次执行多次修改反应式对象,可以减少不必要的反应式触发。\r\n *\r\n * ```ts\r\n * batchRun(() => {\r\n * // 修改反应式对象\r\n * reactiveObj.a = 1;\r\n * reactiveObj.b = 2;\r\n * })\r\n * ```\r\n *\r\n * @param fn 要执行的函数,在此函数中多次修改反应式对象。\r\n */\r\nexport function batchRun<T>(fn: () => T): T\r\n{\r\n _batchDepth++;\r\n\r\n const result = fn();\r\n\r\n if (--_batchDepth > 0)\r\n {\r\n return;\r\n }\r\n\r\n // 处理已经运行过的依赖,\r\n if (_isRunedDeps.length > 0)\r\n {\r\n _isRunedDeps.forEach((dep) =>\r\n {\r\n // 此时依赖以及子依赖都已经运行过了,只需修复与子节点关系。\r\n __DEV__ && console.assert(dep._isDirty === false, 'dep.dirty === false');\r\n\r\n // 修复与子节点关系\r\n dep._children.forEach((version, node) =>\r\n {\r\n node._parents.set(dep, dep._version);\r\n });\r\n dep._children.clear();\r\n });\r\n _isRunedDeps.length = 0;\r\n }\r\n\r\n // 批次处理\r\n if (_needEffectDeps.length > 0)\r\n {\r\n _needEffectDeps.forEach((dep) =>\r\n {\r\n // 独立执行回调\r\n const pre = Reactivity.activeReactivity;\r\n Reactivity.activeReactivity = null;\r\n\r\n dep.runIfDirty();\r\n\r\n Reactivity.activeReactivity = pre;\r\n });\r\n _needEffectDeps.length = 0;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nlet _batchDepth = 0;\r\n/**\r\n * 正在运行的依赖。\r\n */\r\nconst _needEffectDeps: ComputedReactivity[] = [];\r\n/**\r\n * 已经运行过的依赖,只需要修复与子节点关系。\r\n */\r\nconst _isRunedDeps: ComputedReactivity[] = [];\r\n","import { batch } from './batch';\r\nimport { Reactivity, ReactivityLink, forceTrack } from './Reactivity';\r\nimport { hasChanged } from './shared/general';\r\n\r\n/**\r\n * 创建计算反应式对象。\r\n *\r\n * 首次获取值将会执行函数,后续获取值且在依赖发生变化的情况下将会重新计算。\r\n *\r\n * @param func 检测的可能包含响应式的函数。\r\n * @returns 包含 value 属性的对象,用于获取计算结果。\r\n */\r\nexport function computed<T>(func: (oldValue?: T) => T): Computed<T>\r\n{\r\n return new ComputedReactivity(func) as any;\r\n}\r\n\r\n/**\r\n * 计算反应式对象。\r\n */\r\nexport interface Computed<T = any>\r\n{\r\n readonly value: T\r\n [ComputedSymbol]: true\r\n}\r\ndeclare const ComputedSymbol: unique symbol;\r\n\r\nexport interface ComputedReactivity<T = any> extends Computed<T> { }\r\n\r\n/**\r\n * 计算反应式节点。\r\n *\r\n * 当使用 computed 函数时,会创建一个 ComputedDep 对象。\r\n *\r\n * 首次获取值将会执行函数,后续获取值且在依赖发生变化的情况下将会重新计算。\r\n */\r\nexport class ComputedReactivity<T = any> extends Reactivity<T>\r\n{\r\n /**\r\n * @internal\r\n */\r\n readonly __v_isRef = true;\r\n\r\n /**\r\n * 监听的函数。\r\n */\r\n protected _func: (oldValue?: T) => T;\r\n\r\n /**\r\n * 失效子节点。\r\n *\r\n * @private\r\n */\r\n _children = new Map<Reactivity, any>();\r\n\r\n /**\r\n * 是否脏,是否需要重新计算。\r\n *\r\n * 用于在没有值发生变化时,避免重复计算。\r\n *\r\n * @private\r\n */\r\n _isDirty = true;\r\n\r\n /**\r\n * 版本号。\r\n *\r\n * 重新计算后自动递增。用于判断子节点中的父节点引用是否过期。\r\n *\r\n * @private\r\n */\r\n _version = -1;\r\n\r\n /**\r\n * 创建计算依赖。\r\n * @param func 检测的可能包含响应式的函数。\r\n */\r\n constructor(func: (oldValue?: T) => T)\r\n {\r\n super();\r\n this._func = func;\r\n }\r\n\r\n /**\r\n * 捕捉。\r\n *\r\n * 建立与父节点的依赖关系。\r\n */\r\n track()\r\n {\r\n this.runIfDirty();\r\n\r\n super.track();\r\n }\r\n\r\n /**\r\n * 触发。\r\n *\r\n * 冒泡到所有父节点,设置失效子节点字典。\r\n *\r\n * 把触发节点添加到失效子节点字典队列中。\r\n */\r\n trigger(): void\r\n {\r\n // 正在运行时被触发,需要在运行结束后修复父子节点关系。\r\n if (Reactivity.activeReactivity === this)\r\n {\r\n batch(this, Reactivity.activeReactivity === this);\r\n }\r\n\r\n super.trigger();\r\n }\r\n\r\n /**\r\n * 执行当前节点。\r\n */\r\n run()\r\n {\r\n // 不受嵌套的 effect 影响。\r\n forceTrack(() =>\r\n {\r\n // 保存当前节点作为父节点。\r\n const parentReactiveNode = Reactivity.activeReactivity;\r\n // 设置当前节点为活跃节点。\r\n Reactivity.activeReactivity = this as any;\r\n\r\n this._version++;\r\n this._value = this._func(this._value);\r\n\r\n // 执行完毕后恢复父节点。\r\n Reactivity.activeReactivity = parentReactiveNode;\r\n });\r\n }\r\n\r\n /**\r\n * 检查当前节点是否脏。\r\n *\r\n * 如果脏,则执行计算。\r\n */\r\n runIfDirty()\r\n {\r\n // 检查是否存在失效子节点字典。\r\n this._isDirty = this._isDirty || this.isChildrenChanged();\r\n\r\n // 标记为脏的情况下,执行计算。\r\n if (this._isDirty)\r\n {\r\n // 立即去除脏标记,避免循环多重计算。\r\n this._isDirty = false;\r\n\r\n //\r\n this.run();\r\n }\r\n }\r\n\r\n /**\r\n * 判断子节点是否发生变化。\r\n */\r\n protected isChildrenChanged()\r\n {\r\n if (this._children.size === 0) return false;\r\n\r\n // 检查是否存在子节点发生变化。\r\n let isChanged = false;\r\n\r\n // 避免在检查过程建立依赖关系。\r\n const preReactiveNode = Reactivity.activeReactivity;\r\n Reactivity.activeReactivity = null;\r\n\r\n // 检查子节点是否发生变化。\r\n this._children.forEach((value, node) =>\r\n {\r\n if (isChanged) return;\r\n if (node.value !== value)\r\n {\r\n // 子节点变化,需要重新计算。\r\n isChanged = true;\r\n\r\n return;\r\n }\r\n });\r\n\r\n // 恢复父节点。\r\n Reactivity.activeReactivity = preReactiveNode;\r\n\r\n if (!isChanged)\r\n {\r\n // 修复与子节点关系\r\n this._children.forEach((version, node) =>\r\n {\r\n node._parents.set(this, this._version);\r\n });\r\n }\r\n\r\n // 清空子节点。\r\n this._children.clear();\r\n\r\n return isChanged;\r\n }\r\n}\r\n\r\n","import { batch, batchRun } from './batch';\r\nimport { ComputedReactivity } from './computed';\r\nimport { Reactivity } from './Reactivity';\r\n\r\n/**\r\n * 创建效果反应式节点。\r\n *\r\n * 将会维持反应式效果,当被作用的函数所引用的响应式对象发生变化时,会立即执行 fn 函数。\r\n *\r\n * @param fn 要执行的函数\r\n * @returns 暂停和恢复副作用的函数\r\n *\r\n * 注:\r\n * 1. 与 `@vue/reactivity` 中的 effect 不同,此函数返回的是一个 Effect 对象,而不是一个函数。\r\n * 2. 不希望用户直接执行,而是通过反应式自动触发。\r\n * 3. 真有需求,可以使用 effect(func).run(true) 来代替 @vue/reactivity 中的 effect(func)() 。\r\n *\r\n */\r\nexport function effect<T = any>(fn: () => T): Effect\r\n{\r\n return new EffectReactivity(fn);\r\n}\r\n\r\n/**\r\n * 效果反应式节点。\r\n */\r\nexport class EffectReactivity<T = any> extends ComputedReactivity<T> implements Effect\r\n{\r\n /**\r\n * 是否为启用, 默认为 true。\r\n *\r\n * 启用时,会立即执行函数。\r\n */\r\n private _isEnable = true;\r\n\r\n constructor(func: (oldValue?: T) => T)\r\n {\r\n super(func);\r\n this.runIfDirty();\r\n }\r\n\r\n pause()\r\n {\r\n this._isEnable = false;\r\n }\r\n\r\n resume()\r\n {\r\n if (this._isEnable) return;\r\n this._isEnable = true;\r\n if (EffectReactivity.pausedQueueEffects.has(this))\r\n {\r\n EffectReactivity.pausedQueueEffects.delete(this);\r\n this.trigger();\r\n }\r\n }\r\n\r\n trigger()\r\n {\r\n batchRun(() =>\r\n {\r\n super.trigger();\r\n\r\n if (this._isEnable)\r\n {\r\n // 合批时需要判断是否已经运行的依赖。\r\n batch(this, Reactivity.activeReactivity === this);\r\n }\r\n else\r\n {\r\n EffectReactivity.pausedQueueEffects.add(this);\r\n }\r\n });\r\n }\r\n private static pausedQueueEffects = new WeakSet<EffectReactivity>();\r\n\r\n /**\r\n * 执行当前节点。\r\n *\r\n * 当暂停时将会直接执行被包装的函数。\r\n */\r\n run(): void\r\n {\r\n if (this._isEnable)\r\n {\r\n super.run();\r\n }\r\n else\r\n {\r\n this._func(this._value);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 维持反应式效果。\r\n */\r\nexport interface Effect\r\n{\r\n /**\r\n * 暂停。\r\n */\r\n pause: () => void;\r\n /**\r\n * 恢复。\r\n */\r\n resume: () => void;\r\n}\r\n","/**\r\n * 响应式标志枚举,用于标识响应式对象的特殊属性或状态\r\n */\r\nexport enum ReactiveFlags\r\n{\r\n IS_REACTIVE = '__v_isReactive', // 标识对象是否为响应式对象\r\n RAW = '__v_raw', // 获取对象的原始非响应式版本\r\n IS_REF = '__v_isRef', // 标识对象是否为 ref 对象\r\n}\r\n\r\nexport enum TargetType\r\n{\r\n INVALID = 0,\r\n COMMON = 1,\r\n COLLECTION = 2,\r\n}\r\n\r\n/**\r\n * 跟踪操作类型枚举,用于标识在响应式系统中对对象属性进行的操作类型\r\n */\r\nexport enum TrackOpTypes\r\n{\r\n GET = 'get', // 获取属性值\r\n HAS = 'has', // 检查属性是否存在\r\n ITERATE = 'iterate', // 遍历对象属性\r\n}\r\n\r\n/**\r\n * 触发操作类型枚举,用于标识在响应式系统中对对象属性进行的修改操作类型\r\n */\r\nexport enum TriggerOpTypes\r\n{\r\n SET = 'set', // 设置属性值\r\n ADD = 'add', // 添加新属性\r\n DELETE = 'delete', // 删除属性\r\n CLEAR = 'clear', // 清空对象属性\r\n}\r\n\r\nexport const ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Object iterate' : '');\r\nexport const MAP_KEY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Map keys iterate' : '');\r\nexport const ARRAY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Array iterate' : '');\r\n","/* eslint-disable no-var */\r\nimport { ReactiveFlags, TargetType } from './constants';\r\n\r\nexport { };\r\ndeclare global\r\n{\r\n /**\r\n * 是否为开发模式。\r\n */\r\n var __DEV__: boolean;\r\n}\r\nglobalThis.__DEV__ ??= true;\r\n\r\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object';\r\n// 判断是否为数组\r\nexport const isArray: typeof Array.isArray = Array.isArray;\r\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol';\r\nexport const isString = (val: unknown): val is string => typeof val === 'string';\r\nexport const isIntegerKey = (key: unknown): boolean =>\r\n isString(key)\r\n && key !== 'NaN'\r\n && key[0] !== '-'\r\n && `${parseInt(key as any, 10)}` === key;\r\nexport const isMap = (val: unknown): val is Map<any, any> =>\r\n toTypeString(val) === '[object Map]';\r\n\r\n// 判断对象是否拥有指定属性\r\nexport const hasOwn = (\r\n val: object,\r\n key: string | symbol,\r\n): key is keyof typeof val => Object.prototype.hasOwnProperty.call(val, key);\r\n\r\n// 比较两个值是否发生变化,考虑 NaN 的情况\r\nexport const hasChanged = (value: any, oldValue: any): boolean =>\r\n !Object.is(value, oldValue);\r\n\r\nfunction targetTypeMap(rawType: string)\r\n{\r\n switch (rawType)\r\n {\r\n case 'Object':\r\n case 'Array':\r\n return TargetType.COMMON;\r\n case 'Map':\r\n case 'Set':\r\n case 'WeakMap':\r\n case 'WeakSet':\r\n return TargetType.COLLECTION;\r\n default:\r\n return TargetType.COMMON;\r\n }\r\n}\r\n\r\nexport function getTargetType(value: Target)\r\n{\r\n if (!Object.isExtensible(value)) return TargetType.INVALID;\r\n\r\n return targetTypeMap(toRawType(value));\r\n}\r\n\r\nconst toTypeString = (value: unknown): string => Object.prototype.toString.call(value);\r\n\r\n// 获取值的原始类型\r\nexport const toRawType = (value: unknown): string =>\r\n\r\n // 从类似 \"[object RawType]\" 的字符串中提取 \"RawType\"\r\n toTypeString(value).slice(8, -1);\r\n\r\nexport interface Target\r\n{\r\n [ReactiveFlags.IS_REACTIVE]?: boolean\r\n [ReactiveFlags.RAW]?: any\r\n}\r\n\r\n/**\r\n * 将一个响应式对象转换为原始对象。\r\n * @param observed 响应式对象。\r\n * @returns 原始对象。\r\n */\r\nexport function toRaw<T>(observed: T): T\r\n{\r\n const raw = observed && (observed as Target)[ReactiveFlags.RAW];\r\n\r\n return raw ? toRaw(raw) : observed;\r\n}\r\n\r\nexport function warn(msg: string, ...args: any[]): void\r\n{\r\n console.warn(`[Vue warn] ${msg}`, ...args);\r\n}\r\n\r\n/**\r\n * 创建一个映射,并返回一个用于检查键是否存在于该映射中的函数。\r\n * 重要提示:所有调用此函数的地方都必须以 \\/\\*#\\_\\_PURE\\_\\_\\*\\/ 作为前缀,\r\n * 以便在必要时 Rollup 可以进行 tree-shaking。\r\n */\r\n\r\n/* ! #__NO_SIDE_EFFECTS__ */\r\nexport function makeMap(str: string): (key: string) => boolean\r\n{\r\n // 创建一个空对象作为映射,使用 Object.create(null) 避免原型链上的属性干扰\r\n const map = Object.create(null);\r\n\r\n // 将输入的字符串按逗号分隔,遍历每个键并将其添加到映射中,值为 1\r\n for (const key of str.split(',')) map[key] = 1;\r\n\r\n // 返回一个函数,该函数接受一个键值,并检查该键是否存在于映射中\r\n return (val) => val in map;\r\n}\r\n","import { batchRun } from './batch';\r\nimport { Reactivity } from './Reactivity';\r\nimport { ARRAY_ITERATE_KEY, ITERATE_KEY, MAP_KEY_ITERATE_KEY, TrackOpTypes, TriggerOpTypes } from './shared/constants';\r\nimport { isArray, isIntegerKey, isMap, isSymbol } from './shared/general';\r\n\r\n/**\r\n * 反应式属性。\r\n *\r\n * @param target 对象。\r\n * @param key 属性\r\n * @returns 反应式属性。\r\n */\r\nfunction property<T, K extends keyof T>(target: T, key: K)\r\n{\r\n let depsMap = PropertyReactivity._targetMap.get(target);\r\n if (!depsMap)\r\n {\r\n depsMap = new Map();\r\n PropertyReactivity._targetMap.set(target, depsMap);\r\n }\r\n\r\n //\r\n let dep = depsMap.get(key);\r\n if (!dep)\r\n {\r\n dep = new PropertyReactivity(target, key);\r\n depsMap.set(key, dep);\r\n }\r\n\r\n return dep;\r\n}\r\n\r\n/**\r\n * 属性反应式节点。\r\n */\r\nexport class PropertyReactivity<T, K extends keyof T> extends Reactivity<T>\r\n{\r\n /**\r\n * 获取当前节点值。\r\n *\r\n * 取值时将会建立与父节点的依赖关系。\r\n */\r\n get value(): T\r\n {\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n set value(v)\r\n {\r\n // 处理特殊字段,这些字段\r\n if (this._key === 'length')\r\n {\r\n v = this._target['length'];\r\n }\r\n else if (isSymbol(this._key))\r\n {\r\n v = ~~this._value + 1 as any;\r\n }\r\n if (v === this._value) return;\r\n // 触发属性的变化。\r\n this.trigger();\r\n this._value = v;\r\n }\r\n\r\n private _target: T;\r\n private _key: K;\r\n\r\n constructor(target: T, key: K)\r\n {\r\n super();\r\n this._target = target;\r\n this._key = key;\r\n if (target instanceof Map\r\n || target instanceof WeakMap\r\n )\r\n {\r\n this._value = (target as any as WeakMap<any, any>).get(key);\r\n }\r\n else if (target instanceof Set\r\n || target instanceof WeakSet\r\n )\r\n {\r\n this._value = (target as any as WeakSet<any>).has(key) as any;\r\n }\r\n else\r\n {\r\n this._value = (target as any)[key as any];\r\n }\r\n }\r\n\r\n triggerIfChanged()\r\n {\r\n\r\n }\r\n\r\n /**\r\n * 追踪属性的变化。\r\n *\r\n * 当属性被访问时,将会追踪属性的变化。\r\n *\r\n * @param target 目标对象。\r\n * @param key 属性名。\r\n * @returns\r\n */\r\n static track(target: object, type: TrackOpTypes, key: unknown): void\r\n {\r\n const dep = property(target as any, key as any);\r\n\r\n // 取值,建立依赖关系。\r\n dep.track();\r\n }\r\n /**\r\n * @private\r\n */\r\n static _targetMap: WeakMap<any, Map<any, PropertyReactivity<any, any>>> = new WeakMap();\r\n\r\n /**\r\n * 触发属性的变化。\r\n *\r\n * @param target 目标对象。\r\n * @param type 操作类型。\r\n * @param key 属性名。\r\n * @param newValue 新值。\r\n * @param oldValue 旧值。\r\n * @returns\r\n */\r\n static trigger(target: object, type: TriggerOpTypes, key?: unknown, newValue?: unknown, oldValue?: unknown): void\r\n {\r\n const depsMap = this._targetMap.get(target);\r\n if (!depsMap) return;\r\n\r\n const run = (dep: PropertyReactivity<any, any> | undefined) =>\r\n {\r\n if (dep)\r\n {\r\n // 触发属性的变化。\r\n dep.value = newValue;\r\n }\r\n };\r\n\r\n batchRun(() =>\r\n {\r\n if (type === TriggerOpTypes.CLEAR)\r\n {\r\n // collection being cleared\r\n // trigger all effects for target\r\n depsMap.forEach(run);\r\n }\r\n else\r\n {\r\n const targetIsArray = isArray(target);\r\n const isArrayIndex = targetIsArray && isIntegerKey(key);\r\n\r\n if (targetIsArray && key === 'length')\r\n {\r\n const newLength = Number(newValue);\r\n depsMap.forEach((dep, key) =>\r\n {\r\n if (\r\n key === 'length'\r\n || key === ARRAY_ITERATE_KEY\r\n || (!isSymbol(key) && key >= newLength)\r\n )\r\n {\r\n run(dep);\r\n }\r\n });\r\n }\r\n else\r\n {\r\n // schedule runs for SET | ADD | DELETE\r\n if (key !== undefined || depsMap.has(undefined))\r\n {\r\n run(depsMap.get(key));\r\n }\r\n\r\n // schedule ARRAY_ITERATE for any numeric key change (length is handled above)\r\n if (isArrayIndex)\r\n {\r\n run(depsMap.get(ARRAY_ITERATE_KEY));\r\n }\r\n\r\n // also run for iteration key on ADD | DELETE | Map.SET\r\n switch (type)\r\n {\r\n case TriggerOpTypes.ADD:\r\n if (!targetIsArray)\r\n {\r\n run(depsMap.get(ITERATE_KEY));\r\n if (isMap(target))\r\n {\r\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\r\n }\r\n }\r\n else if (isArrayIndex)\r\n {\r\n // new index added to array -> length changes\r\n run(depsMap.get('length'));\r\n }\r\n break;\r\n case TriggerOpTypes.DELETE:\r\n if (!targetIsArray)\r\n {\r\n run(depsMap.get(ITERATE_KEY));\r\n if (isMap(target))\r\n {\r\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\r\n }\r\n }\r\n break;\r\n case TriggerOpTypes.SET:\r\n if (isMap(target))\r\n {\r\n run(depsMap.get(ITERATE_KEY));\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","/* eslint-disable prefer-rest-params */\r\n\r\nimport { batchRun } from './batch';\r\nimport { noTrack } from './Reactivity';\r\nimport { PropertyReactivity } from './property';\r\nimport { isProxy, toReactive } from './reactive';\r\nimport { ARRAY_ITERATE_KEY, TrackOpTypes } from './shared/constants';\r\nimport { isArray, toRaw } from './shared/general';\r\n\r\nexport const arrayInstrumentations: Record<string | symbol, Function> = <any>{\r\n __proto__: null,\r\n\r\n /**\r\n * 返回一个迭代器,用于遍历数组的响应式值\r\n */\r\n [Symbol.iterator]()\r\n {\r\n return iterator(this, Symbol.iterator, toReactive);\r\n },\r\n\r\n /**\r\n * 连接数组并返回新数组,处理响应式数组\r\n */\r\n concat(...args: unknown[])\r\n {\r\n return reactiveReadArray(this).concat(\r\n ...args.map((x) => (isArray(x) ? reactiveReadArray(x) : x)),\r\n );\r\n },\r\n\r\n /**\r\n * 返回一个迭代器,用于遍历数组的键值对,并将值转换为响应式\r\n */\r\n entries()\r\n {\r\n return iterator(this, 'entries', (value: [number, unknown]) =>\r\n {\r\n value[1] = toReactive(value[1]);\r\n\r\n return value;\r\n });\r\n },\r\n\r\n /**\r\n * 测试数组中的所有元素是否都通过了指定函数的测试\r\n */\r\n every(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'every', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 创建一个新数组,包含通过指定函数测试的所有元素\r\n */\r\n filter(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'filter', fn, thisArg, (v) => v.map(toReactive), arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的第一个元素\r\n */\r\n find(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'find', fn, thisArg, toReactive, arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的第一个元素的索引\r\n */\r\n findIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'findIndex', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的最后一个元素\r\n */\r\n findLast(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'findLast', fn, thisArg, toReactive, arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的最后一个元素的索引\r\n */\r\n findLastIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'findLastIndex', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\r\n\r\n /**\r\n * 对数组中的每个元素执行指定函数\r\n */\r\n forEach(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'forEach', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 判断数组是否包含指定元素,处理响应式值\r\n */\r\n includes(...args: unknown[])\r\n {\r\n return searchProxy(this, 'includes', args);\r\n },\r\n\r\n /**\r\n * 返回数组中指定元素第一次出现的索引,处理响应式值\r\n */\r\n indexOf(...args: unknown[])\r\n {\r\n return searchProxy(this, 'indexOf', args);\r\n },\r\n\r\n /**\r\n * 将数组的所有元素连接成一个字符串\r\n */\r\n join(separator?: string)\r\n {\r\n return reactiveReadArray(this).join(separator);\r\n },\r\n\r\n // keys() iterator only reads `length`, no optimisation required\r\n\r\n /**\r\n * 返回数组中指定元素最后一次出现的索引,处理响应式值\r\n */\r\n lastIndexOf(...args: unknown[])\r\n {\r\n return searchProxy(this, 'lastIndexOf', args);\r\n },\r\n\r\n /**\r\n * 创建一个新数组,包含对原数组每个元素调用指定函数的结果\r\n */\r\n map(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'map', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 移除数组的最后一个元素并返回该元素,避免跟踪长度变化\r\n */\r\n pop()\r\n {\r\n return noTracking(this, 'pop');\r\n },\r\n\r\n /**\r\n * 向数组末尾添加一个或多个元素,并返回新的长度,避免跟踪长度变化\r\n */\r\n push(...args: unknown[])\r\n {\r\n return noTracking(this, 'push', args);\r\n },\r\n\r\n /**\r\n * 对数组中的每个元素执行累加器函数,并返回最终结果\r\n */\r\n reduce(fn: (\r\n acc: unknown,\r\n item: unknown,\r\n index: number,\r\n array: unknown[],\r\n ) => unknown,\r\n ...args: unknown[]\r\n )\r\n {\r\n return reduce(this, 'reduce', fn, args);\r\n },\r\n\r\n /**\r\n * 从右到左对数组中的每个元素执行累加器函数,并返回最终结果\r\n */\r\n reduceRight(\r\n fn: (\r\n acc: unknown,\r\n item: unknown,\r\n index: number,\r\n array: unknown[],\r\n ) => unknown,\r\n ...args: unknown[]\r\n )\r\n {\r\n return reduce(this, 'reduceRight', fn, args);\r\n },\r\n\r\n /**\r\n * 移除数组的第一个元素并返回该元素,避免跟踪长度变化\r\n */\r\n shift()\r\n {\r\n return noTracking(this, 'shift');\r\n },\r\n\r\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\r\n\r\n /**\r\n * 测试数组中的某些元素是否通过了指定函数的测试\r\n */\r\n some(\r\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'some', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 通过删除或替换现有元素或添加新元素来修改数组,避免跟踪长度变化\r\n */\r\n splice(...args: unknown[])\r\n {\r\n return noTracking(this, 'splice', args);\r\n },\r\n\r\n /**\r\n * 返回一个新数组,包含原数组的反转副本\r\n */\r\n toReversed()\r\n {\r\n // @ts-expect-error user code may run in es2016+\r\n return reactiveReadArray(this).toReversed();\r\n },\r\n\r\n /**\r\n * 返回一个新数组,包含原数组的排序副本\r\n */\r\n toSorted(comparer?: (a: unknown, b: unknown) => number)\r\n {\r\n // @ts-expect-error user code may run in es2016+\r\n return reactiveReadArray(this).toSorted(comparer);\r\n },\r\n\r\n /**\r\n * 返回一个新数组,包含原数组的切片副本\r\n */\r\n toSpliced(...args: unknown[])\r\n {\r\n // @ts-expect-error user code may run in es2016+\r\n return (reactiveReadArray(this).toSpliced as any)(...args);\r\n },\r\n\r\n /**\r\n * 向数组开头添加一个或多个元素,并返回新的长度,避免跟踪长度变化\r\n */\r\n unshift(...args: unknown[])\r\n {\r\n return noTracking(this, 'unshift', args);\r\n },\r\n\r\n /**\r\n * 返回一个迭代器,用于遍历数组的响应式值\r\n */\r\n values()\r\n {\r\n return iterator(this, 'values', toReactive);\r\n },\r\n};\r\n\r\n// instrument iterators to take ARRAY_ITERATE dependency\r\nfunction iterator(\r\n self: unknown[],\r\n method: keyof Array<unknown>,\r\n wrapValue: (value: any) => unknown,\r\n)\r\n{\r\n // note that taking ARRAY_ITERATE dependency here is not strictly equivalent\r\n // to calling iterate on the proxified array.\r\n // creating the iterator does not access any array property:\r\n // it is only when .next() is called that length and indexes are accessed.\r\n // pushed to the extreme, an iterator could be created in one effect scope,\r\n // partially iterated in another, then iterated more in yet another.\r\n // given that JS iterator can only be read once, this doesn't seem like\r\n // a plausible use-case, so this tracking simplification seems ok.\r\n const arr = shallowReadArray(self);\r\n const iter = (arr[method] as any)() as IterableIterator<unknown> & {\r\n _next: IterableIterator<unknown>['next']\r\n };\r\n if (arr !== self)\r\n {\r\n iter._next = iter.next;\r\n iter.next = () =>\r\n {\r\n const result = iter._next();\r\n if (result.value)\r\n {\r\n result.value = wrapValue(result.value);\r\n }\r\n\r\n return result;\r\n };\r\n }\r\n\r\n return iter;\r\n}\r\n\r\n/**\r\n * 跟踪数组的迭代操作并返回原始数组\r\n */\r\nfunction shallowReadArray<T>(arr: T[]): T[]\r\n{\r\n PropertyReactivity.track((arr = toRaw(arr)), TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\r\n\r\n return arr;\r\n}\r\n\r\nfunction reactiveReadArray<T>(array: T[]): T[]\r\n{\r\n const raw = toRaw(array);\r\n if (raw === array) return raw;\r\n PropertyReactivity.track(raw, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\r\n\r\n return raw.map(toReactive);\r\n}\r\n\r\n// in the codebase we enforce es2016, but user code may run in environments\r\n// higher than that\r\ntype ArrayMethods = keyof Array<any> | 'findLast' | 'findLastIndex';\r\n\r\n// instrument functions that read (potentially) all items\r\n// to take ARRAY_ITERATE dependency\r\nfunction apply(\r\n self: unknown[],\r\n method: ArrayMethods,\r\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n wrappedRetFn?: (result: any) => unknown,\r\n args?: IArguments,\r\n)\r\n{\r\n const arr = shallowReadArray(self);\r\n const needsWrap = arr !== self;\r\n const methodFn = arr[method];\r\n\r\n // #11759\r\n // If the method being called is from a user-extended Array, the arguments will be unknown\r\n // (unknown order and unknown parameter types). In this case, we skip the shallowReadArray\r\n // handling and directly call apply with self.\r\n if (methodFn !== Array.prototype[method as any])\r\n {\r\n const result = methodFn.apply(self, args);\r\n\r\n return needsWrap ? toReactive(result) : result;\r\n }\r\n\r\n let wrappedFn = fn;\r\n if (arr !== self)\r\n {\r\n if (needsWrap)\r\n {\r\n wrappedFn = function (this: unknown, item, index)\r\n {\r\n return fn.call(this, toReactive(item), index, self);\r\n };\r\n }\r\n else if (fn.length > 2)\r\n {\r\n wrappedFn = function (this: unknown, item, index)\r\n {\r\n return fn.call(this, item, index, self);\r\n };\r\n }\r\n }\r\n const result = methodFn.call(arr, wrappedFn, thisArg);\r\n\r\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\r\n}\r\n\r\n// instrument reduce and reduceRight to take ARRAY_ITERATE dependency\r\nfunction reduce(\r\n self: unknown[],\r\n method: keyof Array<any>,\r\n fn: (acc: unknown, item: unknown, index: number, array: unknown[]) => unknown,\r\n args: unknown[],\r\n)\r\n{\r\n const arr = shallowReadArray(self);\r\n let wrappedFn = fn;\r\n if (arr !== self)\r\n {\r\n wrappedFn = function (this: unknown, acc, item, index)\r\n {\r\n return fn.call(this, acc, toReactive(item), index, self);\r\n };\r\n }\r\n\r\n return (arr[method] as any)(wrappedFn, ...args);\r\n}\r\n\r\n// instrument identity-sensitive methods to account for reactive proxies\r\nfunction searchProxy(\r\n self: unknown[],\r\n method: keyof Array<any>,\r\n args: unknown[],\r\n)\r\n{\r\n const arr = toRaw(self) as any;\r\n PropertyReactivity.track(arr, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\r\n // we run the method using the original args first (which may be reactive)\r\n const res = arr[method](...args);\r\n\r\n // if that didn't work, run it again using raw values.\r\n if ((res === -1 || res === false) && isProxy(args[0]))\r\n {\r\n args[0] = toRaw(args[0]);\r\n\r\n return arr[method](...args);\r\n }\r\n\r\n return res;\r\n}\r\n\r\n// instrument length-altering mutation methods to avoid length being tracked\r\n// which leads to infinite loops in some cases (#2137)\r\nfunction noTracking(\r\n self: unknown[],\r\n method: keyof Array<any>,\r\n args: unknown[] = [],\r\n)\r\n{\r\n const res = batchRun(() =>\r\n noTrack(() =>\r\n (toRaw(self) as any)[method].apply(self, args)\r\n )\r\n );\r\n\r\n return res;\r\n}\r\n","import { batchRun } from './batch';\r\nimport { Reactivity } from './Reactivity';\r\nimport { toReactive } from './reactive';\r\nimport { ReactiveFlags } from './shared/constants';\r\nimport { hasChanged, toRaw } from './shared/general';\r\n\r\n/**\r\n * 创建一个引用,该引用的值可以被响应式系统追踪和更新。\r\n *\r\n * @param value 引用的值。\r\n * @returns 包含 value 属性的对象,用于获取和设置引用的值。\r\n */\r\nexport function ref<T>(value?: T): Ref<T>\r\n{\r\n if (isRef(value))\r\n {\r\n return value as any;\r\n }\r\n\r\n return new RefReactivity<T>(value) as any;\r\n}\r\n\r\n/**\r\n * 判断一个对象是否为引用。\r\n * @param r 引用。\r\n */\r\nexport function isRef<T>(r: Ref<T> | unknown): r is Ref<T>;\r\nexport function isRef(r: any): r is Ref\r\n{\r\n return r ? r[ReactiveFlags.IS_REF] === true : false;\r\n}\r\n\r\nexport interface RefReactivity<T = any> extends Ref<T> { }\r\n\r\n/**\r\n * 引用反应式节点。\r\n *\r\n * 当使用 ref 函数时,会创建一个 RefReactivity 对象。\r\n */\r\nexport class RefReactivity<T = any> extends Reactivity<T> implements Ref<T>\r\n{\r\n public readonly [ReactiveFlags.IS_REF] = true;\r\n\r\n get value()\r\n {\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n\r\n set value(v: T)\r\n {\r\n const oldValue = this._rawValue;\r\n const newValue = toRaw(v);\r\n\r\n if (!hasChanged(oldValue, newValue)) return;\r\n\r\n batchRun(() =>\r\n {\r\n this.trigger();\r\n\r\n this._rawValue = newValue;\r\n this._value = toReactive(newValue);\r\n });\r\n }\r\n\r\n /**\r\n * 原始值。\r\n *\r\n * 用于比较值是否发生变化。\r\n */\r\n private _rawValue: T;\r\n\r\n constructor(value: T)\r\n {\r\n super();\r\n this._rawValue = toRaw(value);\r\n this._value = toReactive(value);\r\n }\r\n}\r\n\r\nexport interface Ref<T = any, S = T>\r\n{\r\n get value(): T\r\n set value(_: S)\r\n [RefSymbol]: true\r\n}\r\ndeclare const RefSymbol: unique symbol;\r\n","import { arrayInstrumentations } from './arrayInstrumentations';\r\nimport { reactive, reactiveMap } from './reactive';\r\nimport { isRef } from './ref';\r\nimport { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\r\nimport { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';\r\nimport { PropertyReactivity } from './property';\r\n\r\n/**\r\n * 基础响应式处理器。\r\n */\r\nclass BaseReactiveHandler implements ProxyHandler<Target>\r\n{\r\n /**\r\n * 获取对象的属性值。\r\n *\r\n * @param target 对象本身\r\n * @param key 属性名\r\n * @param receiver 代理对象\r\n * @returns\r\n */\r\n get(target: Target, key: string | symbol, receiver: object): any\r\n {\r\n //\r\n if (key === ReactiveFlags.IS_REACTIVE) // 判断是否为响应式对象\r\n {\r\n return true;\r\n }\r\n else if (key === ReactiveFlags.RAW) // 获取原始对象\r\n {\r\n if (\r\n receiver\r\n === reactiveMap.get(target)\r\n // receiver is not the reactive proxy, but has the same prototype\r\n // this means the receiver is a user proxy of the reactive proxy\r\n || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)\r\n )\r\n {\r\n return target;\r\n }\r\n // early return undefined\r\n\r\n return;\r\n }\r\n\r\n const targetIsArray = isArray(target);\r\n\r\n let fn: Function | undefined;\r\n if (targetIsArray && (fn = arrayInstrumentations[key]))\r\n {\r\n return fn;\r\n }\r\n if (key === 'hasOwnProperty')\r\n {\r\n return hasOwnProperty;\r\n }\r\n\r\n const res = Reflect.get(\r\n target,\r\n key,\r\n isRef(target) ? target : receiver,\r\n );\r\n\r\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))\r\n {\r\n return res;\r\n }\r\n\r\n //\r\n PropertyReactivity.track(target, TrackOpTypes.GET, key as any);\r\n\r\n // 如果是 ref,则返回 ref.value\r\n if (isRef(res))\r\n {\r\n return targetIsArray && isIntegerKey(key) ? res : res.value;\r\n }\r\n\r\n // 如果是对象,则递归响应式化\r\n if (isObject(res))\r\n {\r\n return reactive(res);\r\n }\r\n\r\n return res;\r\n }\r\n}\r\n\r\n/**\r\n * 可变响应式处理器。\r\n */\r\nclass MutableReactiveHandler extends BaseReactiveHandler\r\n{\r\n /**\r\n * 设置对象的属性值。\r\n * @param target 被代理的对象。\r\n * @param key 属性名。\r\n * @param value 新值。\r\n * @param receiver 代理对象。\r\n * @returns 设置是否成功。\r\n */\r\n set(\r\n target: Record<string | symbol, unknown>,\r\n key: string | symbol,\r\n value: unknown,\r\n receiver: object,\r\n ): boolean\r\n {\r\n let oldValue = target[key];\r\n\r\n oldValue = toRaw(oldValue);\r\n value = toRaw(value);\r\n\r\n if (!isArray(target) && isRef(oldValue) && !isRef(value))\r\n {\r\n oldValue.value = value;\r\n\r\n return true;\r\n }\r\n\r\n const hadKey\r\n = isArray(target) && isIntegerKey(key)\r\n ? Number(key) < target.length\r\n : hasOwn(target, key);\r\n const result = Reflect.set(\r\n target,\r\n key,\r\n value,\r\n isRef(target) ? target : receiver,\r\n );\r\n //\r\n __DEV__ && console.assert(target === toRaw(receiver));\r\n\r\n // 如果目标在原始原型链中,则不要触发\r\n if (target === toRaw(receiver))\r\n {\r\n if (!hadKey)\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\r\n }\r\n else if (hasChanged(value, oldValue))\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 删除对象的属性。\r\n *\r\n * @param target 被代理的对象。\r\n * @param key 属性名。\r\n * @returns 删除是否成功。\r\n */\r\n deleteProperty(\r\n target: Record<string | symbol, unknown>,\r\n key: string | symbol,\r\n ): boolean\r\n {\r\n const hadKey = hasOwn(target, key);\r\n const oldValue = target[key];\r\n const result = Reflect.deleteProperty(target, key);\r\n if (result && hadKey)\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n has(target: Record<string | symbol, unknown>, key: string | symbol): boolean\r\n {\r\n const result = Reflect.has(target, key);\r\n if (!isSymbol(key) || !builtInSymbols.has(key))\r\n {\r\n PropertyReactivity.track(target, TrackOpTypes.HAS, key);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]\r\n {\r\n PropertyReactivity.track(\r\n target,\r\n TrackOpTypes.ITERATE,\r\n isArray(target) ? 'length' : ITERATE_KEY,\r\n );\r\n\r\n return Reflect.ownKeys(target);\r\n }\r\n}\r\n\r\n/**\r\n * 可变响应式处理器。\r\n */\r\nexport const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();\r\n\r\nfunction hasOwnProperty(this: object, key: unknown)\r\n{\r\n // #10455 hasOwnProperty may be called with non-string values\r\n if (!isSymbol(key)) key = String(key);\r\n const obj = toRaw(this);\r\n PropertyReactivity.track(obj, TrackOpTypes.HAS, key);\r\n\r\n return obj.hasOwnProperty(key as string);\r\n}\r\n\r\nconst builtInSymbols = new Set(\r\n /* @__PURE__*/\r\n Object.getOwnPropertyNames(Symbol)\r\n // ios10.x Object.getOwnPropertyNames(Symbol) can enumerate 'arguments' and 'caller'\r\n // but accessing them on Symbol leads to TypeError because Symbol is a strict mode\r\n // function\r\n .filter((key) => key !== 'arguments' && key !== 'caller')\r\n .map((key) => Symbol[key as keyof SymbolConstructor])\r\n .filter(isSymbol),\r\n);\r\n\r\nconst isNonTrackableKeys = /* @__PURE__*/ makeMap(`__proto__,__v_isRef,__isVue`);\r\n","import { toReactive } from './reactive';\r\nimport { ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\r\nimport { hasChanged, hasOwn, isMap, Target, toRaw, toRawType, warn } from './shared/general';\r\nimport { PropertyReactivity } from './property';\r\n\r\nexport const mutableCollectionHandlers: ProxyHandler<CollectionTypes> = {\r\n get: createInstrumentationGetter(),\r\n};\r\n\r\nfunction createInstrumentationGetter()\r\n{\r\n const instrumentations = createInstrumentations();\r\n\r\n return (\r\n target: CollectionTypes,\r\n key: string | symbol,\r\n receiver: CollectionTypes,\r\n ) =>\r\n {\r\n if (key === ReactiveFlags.IS_REACTIVE)\r\n {\r\n return true;\r\n }\r\n else if (key === ReactiveFlags.RAW)\r\n {\r\n return target;\r\n }\r\n\r\n return Reflect.get(\r\n hasOwn(instrumentations, key) && key in target\r\n ? instrumentations\r\n : target,\r\n key,\r\n receiver,\r\n );\r\n };\r\n}\r\n\r\ntype Instrumentations = Record<string | symbol, Function | number>;\r\n\r\nfunction createInstrumentations(): Instrumentations\r\n{\r\n const instrumentations: Instrumentations = {\r\n get(this: MapTypes, key: unknown)\r\n {\r\n // #1772: readonly(reactive(Map)) should return readonly + reactive version\r\n // of the value\r\n const target = this[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const rawKey = toRaw(key);\r\n\r\n if (hasChanged(key, rawKey))\r\n {\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, key);\r\n }\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, rawKey);\r\n\r\n const { has } = getProto(rawTarget);\r\n const wrap = toReactive;\r\n if (has.call(rawTarget, key))\r\n {\r\n return wrap(target.get(key));\r\n }\r\n else if (has.call(rawTarget, rawKey))\r\n {\r\n return wrap(target.get(rawKey));\r\n }\r\n else if (target !== rawTarget)\r\n {\r\n // #3602 readonly(reactive(Map))\r\n // ensure that the nested reactive `Map` can do tracking for itself\r\n target.get(key);\r\n }\r\n },\r\n get size()\r\n {\r\n const target = (this as unknown as IterableCollections)[ReactiveFlags.RAW];\r\n PropertyReactivity.track(toRaw(target), TrackOpTypes.ITERATE, ITERATE_KEY);\r\n\r\n return Reflect.get(target, 'size', target);\r\n },\r\n has(this: CollectionTypes, key: unknown): boolean\r\n {\r\n const target = this[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const rawKey = toRaw(key);\r\n\r\n if (hasChanged(key, rawKey))\r\n {\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, key);\r\n }\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, rawKey);\r\n\r\n return key === rawKey\r\n ? target.has(key)\r\n : target.has(key) || target.has(rawKey);\r\n },\r\n forEach(this: IterableCollections, callback: Function, thisArg?: unknown)\r\n {\r\n const observed = this;\r\n const target = observed[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const wrap = toReactive;\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.ITERATE, ITERATE_KEY);\r\n\r\n return target.forEach((value: unknown, key: unknown) =>\r\n\r\n // important: make sure the callback is\r\n // 1. invoked with the reactive map as `this` and 3rd arg\r\n // 2. the value received should be a corresponding reactive/readonly.\r\n callback.call(thisArg, wrap(value), wrap(key), observed)\r\n );\r\n },\r\n\r\n add(this: SetTypes, value: unknown)\r\n {\r\n value = toRaw(value);\r\n const target = toRaw(this);\r\n const proto = getProto(target);\r\n const hadKey = proto.has.call(target, value);\r\n if (!hadKey)\r\n {\r\n target.add(value);\r\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, value, value);\r\n }\r\n\r\n return this;\r\n },\r\n set(this: MapTypes, key: unknown, value: unknown)\r\n {\r\n value = toRaw(value);\r\n const target = toRaw(this);\r\n const { has, get } = getProto(target);\r\n\r\n let hadKey = has.call(target, key);\r\n if (!hadKey)\r\n {\r\n key = toRaw(key);\r\n hadKey = has.call(target, key);\r\n }\r\n else if (__DEV__)\r\n {\r\n checkIdentityKeys(target, has, key);\r\n }\r\n\r\n const oldValue = get.call(target, key);\r\n target.set(key, value);\r\n if (!hadKey)\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\r\n }\r\n else if (hasChanged(value, oldValue))\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\r\n }\r\n\r\n return this;\r\n },\r\n delete(this: CollectionTypes, key: unknown)\r\n {\r\n const target = toRaw(this);\r\n const { has, get } = getProto(target);\r\n let hadKey = has.call(target, key);\r\n if (!hadKey)\r\n {\r\n key = toRaw(key);\r\n hadKey = has.call(target, key);\r\n }\r\n else if (__DEV__)\r\n {\r\n checkIdentityKeys(target, has, key);\r\n }\r\n\r\n const oldValue = get ? get.call(target, key) : undefined;\r\n // forward the operation before queueing reactions\r\n const result = target.delete(key);\r\n if (hadKey)\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\r\n }\r\n\r\n return result;\r\n },\r\n clear(this: IterableCollections)\r\n {\r\n const target = toRaw(this);\r\n const hadItems = target.size !== 0;\r\n const oldTarget = __DEV__\r\n ? isMap(target)\r\n ? new Map(target)\r\n : new Set(target)\r\n : undefined;\r\n // forward the operation before queueing reactions\r\n const result = target.clear();\r\n if (hadItems)\r\n {\r\n PropertyReactivity.trigger(\r\n target,\r\n TriggerOpTypes.CLEAR,\r\n undefined,\r\n undefined,\r\n oldTarget,\r\n );\r\n }\r\n\r\n return result;\r\n },\r\n };\r\n\r\n const iteratorMethods = [\r\n 'keys',\r\n 'values',\r\n 'entries',\r\n Symbol.iterator,\r\n ] as const;\r\n\r\n iteratorMethods.forEach((method) =>\r\n {\r\n instrumentations[method] = createIterableMethod(method);\r\n });\r\n\r\n return instrumentations;\r\n}\r\n\r\nfunction createIterableMethod(method: string | symbol)\r\n{\r\n return function (\r\n this: IterableCollections,\r\n ...args: unknown[]\r\n ): Iterable<unknown> & Iterator<unknown>\r\n {\r\n const target = this[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const targetIsMap = isMap(rawTarget);\r\n const isPair\r\n = method === 'entries' || (method === Symbol.iterator && targetIsMap);\r\n const isKeyOnly = method === 'keys' && targetIsMap;\r\n const innerIterator = target[method](...args);\r\n const wrap = toReactive;\r\n\r\n PropertyReactivity.track(\r\n rawTarget,\r\n TrackOpTypes.ITERATE,\r\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY,\r\n );\r\n\r\n // return a wrapped iterator which returns observed versions of the\r\n // values emitted from the real iterator\r\n return {\r\n // iterator protocol\r\n next()\r\n {\r\n const { value, done } = innerIterator.next();\r\n\r\n return done\r\n ? { value, done }\r\n : {\r\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\r\n done,\r\n };\r\n },\r\n // iterable protocol\r\n [Symbol.iterator]()\r\n {\r\n return this;\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction checkIdentityKeys(\r\n target: CollectionTypes,\r\n has: (key: unknown) => boolean,\r\n key: unknown,\r\n)\r\n{\r\n const rawKey = toRaw(key);\r\n if (rawKey !== key && has.call(target, rawKey))\r\n {\r\n const type = toRawType(target);\r\n warn(\r\n `Reactive ${type} contains both the raw and reactive `\r\n + `versions of the same object${type === `Map` ? ` as keys` : ``}, `\r\n + `which can lead to inconsistencies. `\r\n + `Avoid differentiating between the raw and reactive versions `\r\n + `of an object and only use the reactive version if possible.`,\r\n );\r\n }\r\n}\r\n\r\nconst getProto = <T extends CollectionTypes>(v: T): any => Reflect.getPrototypeOf(v);\r\n\r\ntype CollectionTypes = IterableCollections | WeakCollections;\r\n\r\ntype IterableCollections = (Map<any, any> | Set<any>) & Target;\r\ntype WeakCollections = (WeakMap<any, any> | WeakSet<any>) & Target;\r\ntype MapTypes = (Map<any, any> | WeakMap<any, any>) & Target;\r\ntype SetTypes = (Set<any> | WeakSet<any>) & Target;\r\n","import { mutableHandlers } from './baseHandlers';\r\nimport { mutableCollectionHandlers } from './collectionHandlers';\r\nimport { Computed } from './computed';\r\nimport { Ref } from './ref';\r\nimport { ReactiveFlags, TargetType } from './shared/constants';\r\nimport { getTargetType, isObject, Target } from './shared/general';\r\n\r\n/**\r\n * 创建或者获取响应式对象的代理对象。\r\n *\r\n * @param target 被响应式的对象。\r\n * @returns 响应式代理对象。\r\n *\r\n * 注意:\r\n *\r\n * 扩大被反应式的对象的类型范围,只有`Object.isExtensible`不通过的对象不被响应化。Float32Array等都允许被响应化。\r\n */\r\nexport function reactive<T extends object>(target: T): Reactive<T>\r\n{\r\n if (!isObject(target))\r\n {\r\n return target;\r\n }\r\n\r\n if (target[ReactiveFlags.RAW])\r\n {\r\n return target as any;\r\n }\r\n\r\n // only specific value types can be observed.\r\n const targetType = getTargetType(target);\r\n if (targetType === TargetType.INVALID)\r\n {\r\n return target as any;\r\n }\r\n\r\n // target already has corresponding Proxy\r\n const existingProxy = reactiveMap.get(target);\r\n if (existingProxy)\r\n {\r\n return existingProxy;\r\n }\r\n\r\n const proxy = new Proxy<T>(\r\n target,\r\n targetType === TargetType.COLLECTION ? mutableCollectionHandlers : mutableHandlers as any,\r\n ) as T;\r\n reactiveMap.set(target, proxy);\r\n\r\n return proxy as any;\r\n}\r\nexport const reactiveMap = new WeakMap<Target, any>();\r\n\r\n/**\r\n * 判断一个对象是否为响应式对象。\r\n *\r\n * @param value 对象。\r\n * @returns\r\n */\r\nexport function isReactive(value: unknown): boolean\r\n{\r\n return !!(value && (value as Target)[ReactiveFlags.IS_REACTIVE]);\r\n}\r\n\r\n/**\r\n * 转换为响应式对象。\r\n *\r\n * @param value 对象。\r\n * @returns\r\n */\r\nexport const toReactive = <T>(value: T): T =>\r\n{\r\n if (isObject(value))\r\n {\r\n return reactive(value as any) as any;\r\n }\r\n\r\n return value;\r\n};\r\n\r\n/**\r\n * 判断一个对象是否为代理对象。\r\n *\r\n * @param value 对象。\r\n * @returns\r\n */\r\nexport function isProxy(value: any): boolean\r\n{\r\n return value ? !!value[ReactiveFlags.RAW] : false;\r\n}\r\n\r\nexport type Reactive<T> = UnwrapRefSimple<T>;\r\n\r\n/**\r\n * 原始类型\r\n */\r\ntype Primitive = string | number | boolean | bigint | symbol | undefined | null;\r\n/**\r\n * 内置类型\r\n */\r\nexport type Builtin = Primitive | Function | Date | Error | RegExp;\r\n\r\n/**\r\n * 用于扩展不被 unwrap 的类型。\r\n *\r\n * ``` ts\r\n * declare module '@vue/reactivity' {\r\n * export interface RefUnwrapBailTypes {\r\n * runtimeDOMBailTypes: Node | Window\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport interface RefUnwrapBailTypes { }\r\n\r\n/**\r\n * 解包类型。\r\n */\r\nexport type UnwrapRefSimple<T> =\r\n T extends\r\n | Builtin\r\n | Ref\r\n | RefUnwrapBailTypes[keyof RefUnwrapBailTypes]\r\n ? T :\r\n T extends Ref<infer TT> ? TT :\r\n T extends Computed<infer TT> ? TT :\r\n T extends object ? {\r\n [K in keyof T]: UnwrapRefSimple<T[K]>\r\n } :\r\n T;\r\n"],"names":["_EffectReactivity","ReactiveFlags","TargetType","TrackOpTypes","TriggerOpTypes","key","self","result"],"mappings":";;;;EASO,MAAM,WACb;AAAA,IADO,cAAA;AA2BH,WAAA,+BAAe;IAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IApB/C,IAAI,QACJ;AACI,WAAK,MAAM;AAEX,aAAO,KAAK;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsBA,QACA;AACI,UAAI,CAAC;AAAc;AAGnB,YAAM,SAAS,WAAW;AAC1B,UAAI,QACJ;AACI,aAAK,SAAS,IAAI,QAAQ,OAAO,QAAQ;AAAA,MAC7C;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,UACA;AAEI,WAAK,SAAS,QAAQ,CAAC,SAAS,WAChC;AACI,YAAI,OAAO,aAAa;AAAS;AAEjC,eAAO,QAAQ;AAEf,eAAO,UAAU,IAAI,MAAM,KAAK,MAAM;AAAA,MAAA,CACzC;AAGD,WAAK,SAAS;IAClB;AAAA,EAQJ;AAYO,WAAS,WAAc,IAC9B;AACI,UAAM,iBAAiB;AACR,mBAAA;AACf,UAAM,SAAS;AACA,mBAAA;AAER,WAAA;AAAA,EACX;AAOO,WAAS,QAAW,IAC3B;AACI,UAAM,iBAAiB;AACR,mBAAA;AACf,UAAM,SAAS;AACA,mBAAA;AAER,WAAA;AAAA,EACX;AAQA,MAAI,eAAe;ACpHH,WAAA,MAAM,KAAyB,WAC/C;AACI,QAAI,WACJ;AACI,mBAAa,KAAK,GAAG;AAAA,IAAA,OAGzB;AACI,sBAAgB,KAAK,GAAG;AAAA,IAC5B;AAAA,EACJ;AAeO,WAAS,SAAY,IAC5B;AACI;AAEA,UAAM,SAAS;AAEX,QAAA,EAAE,cAAc,GACpB;AACI;AAAA,IACJ;AAGI,QAAA,aAAa,SAAS,GAC1B;AACiB,mBAAA,QAAQ,CAAC,QACtB;AAKI,YAAI,UAAU,QAAQ,CAAC,SAAS,SAChC;AACI,eAAK,SAAS,IAAI,KAAK,IAAI,QAAQ;AAAA,QAAA,CACtC;AACD,YAAI,UAAU;MAAM,CACvB;AACD,mBAAa,SAAS;AAAA,IAC1B;AAGI,QAAA,gBAAgB,SAAS,GAC7B;AACoB,sBAAA,QAAQ,CAAC,QACzB;AAEI,cAAM,MAAM,WAAW;AACvB,mBAAW,mBAAmB;AAE9B,YAAI,WAAW;AAEf,mBAAW,mBAAmB;AAAA,MAAA,CACjC;AACD,sBAAgB,SAAS;AAAA,IAC7B;AAEO,WAAA;AAAA,EACX;AAEA,MAAI,cAAc;AAIlB,QAAM,kBAAwC,CAAA;AAI9C,QAAM,eAAqC,CAAC;AC9ErC,WAAS,SAAY,MAC5B;AACW,WAAA,IAAI,mBAAmB,IAAI;AAAA,EACtC;AAAA,EAqBO,MAAM,2BAAoC,WACjD;AAAA;AAAA;AAAA;AAAA;AAAA,IAwCI,YAAY,MACZ;AACU;AAtCV,WAAS,YAAY;AAYrB,WAAA,gCAAgB;AASL,WAAA,WAAA;AASA,WAAA,WAAA;AASP,WAAK,QAAQ;AAAA,IACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,QACA;AACI,WAAK,WAAW;AAEhB,YAAM,MAAM;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,UACA;AAEQ,UAAA,WAAW,qBAAqB,MACpC;AACU,cAAA,MAAM,WAAW,qBAAqB,IAAI;AAAA,MACpD;AAEA,YAAM,QAAQ;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA,IAKA,MACA;AAEI,iBAAW,MACX;AAEI,cAAM,qBAAqB,WAAW;AAEtC,mBAAW,mBAAmB;AAEzB,aAAA;AACL,aAAK,SAAS,KAAK,MAAM,KAAK,MAAM;AAGpC,mBAAW,mBAAmB;AAAA,MAAA,CACjC;AAAA,IACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,aACA;AAEI,WAAK,WAAW,KAAK,YAAY,KAAK,kBAAkB;AAGxD,UAAI,KAAK,UACT;AAEI,aAAK,WAAW;AAGhB,aAAK,IAAI;AAAA,MACb;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA,IAKU,oBACV;AACQ,UAAA,KAAK,UAAU,SAAS;AAAU,eAAA;AAGtC,UAAI,YAAY;AAGhB,YAAM,kBAAkB,WAAW;AACnC,iBAAW,mBAAmB;AAG9B,WAAK,UAAU,QAAQ,CAAC,OAAO,SAC/B;AACQ,YAAA;AAAW;AACX,YAAA,KAAK,UAAU,OACnB;AAEgB,sBAAA;AAEZ;AAAA,QACJ;AAAA,MAAA,CACH;AAGD,iBAAW,mBAAmB;AAE9B,UAAI,CAAC,WACL;AAEI,aAAK,UAAU,QAAQ,CAAC,SAAS,SACjC;AACI,eAAK,SAAS,IAAI,MAAM,KAAK,QAAQ;AAAA,QAAA,CACxC;AAAA,MACL;AAGA,WAAK,UAAU;AAER,aAAA;AAAA,IACX;AAAA,EACJ;ACrLO,WAAS,OAAgB,IAChC;AACW,WAAA,IAAI,iBAAiB,EAAE;AAAA,EAClC;AAKO,QAAM,oBAAN,MAAMA,2BAAkC,mBAC/C;AAAA,IAQI,YAAY,MACZ;AACI,YAAM,IAAI;AAJd,WAAQ,YAAY;AAKhB,WAAK,WAAW;AAAA,IACpB;AAAA,IAEA,QACA;AACI,WAAK,YAAY;AAAA,IACrB;AAAA,IAEA,SACA;AACI,UAAI,KAAK;AAAW;AACpB,WAAK,YAAY;AACjB,UAAIA,mBAAiB,mBAAmB,IAAI,IAAI,GAChD;AACqB,QAAAA,mBAAA,mBAAmB,OAAO,IAAI;AAC/C,aAAK,QAAQ;AAAA,MACjB;AAAA,IACJ;AAAA,IAEA,UACA;AACI,eAAS,MACT;AACI,cAAM,QAAQ;AAEd,YAAI,KAAK,WACT;AAEU,gBAAA,MAAM,WAAW,qBAAqB,IAAI;AAAA,QAAA,OAGpD;AACqB,UAAAA,mBAAA,mBAAmB,IAAI,IAAI;AAAA,QAChD;AAAA,MAAA,CACH;AAAA,IACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MACA;AACI,UAAI,KAAK,WACT;AACI,cAAM,IAAI;AAAA,MAAA,OAGd;AACS,aAAA,MAAM,KAAK,MAAM;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ;AAlEa,oBAgDM,yCAAyB;AAhDrC,MAAM,mBAAN;ACvBK,MAAA,kCAAAC,mBAAL;AAEHA,mBAAA,aAAc,IAAA;AACdA,mBAAA,KAAM,IAAA;AACNA,mBAAA,QAAS,IAAA;AAJDA,WAAAA;AAAAA,EAAA,GAAA,iBAAA,CAAA,CAAA;AAOA,MAAA,+BAAAC,gBAAL;AAEHA,gBAAAA,YAAA,aAAU,CAAV,IAAA;AACAA,gBAAAA,YAAA,YAAS,CAAT,IAAA;AACAA,gBAAAA,YAAA,gBAAa,CAAb,IAAA;AAJQA,WAAAA;AAAAA,EAAA,GAAA,cAAA,CAAA,CAAA;AAUA,MAAA,iCAAAC,kBAAL;AAEHA,kBAAA,KAAM,IAAA;AACNA,kBAAA,KAAM,IAAA;AACNA,kBAAA,SAAU,IAAA;AAJFA,WAAAA;AAAAA,EAAA,GAAA,gBAAA,CAAA,CAAA;AAUA,MAAA,mCAAAC,oBAAL;AAEHA,oBAAA,KAAM,IAAA;AACNA,oBAAA,KAAM,IAAA;AACNA,oBAAA,QAAS,IAAA;AACTA,oBAAA,OAAQ,IAAA;AALAA,WAAAA;AAAAA,EAAA,GAAA,kBAAA,CAAA,CAAA;AAQL,QAAM,cAA6B,OAAoC,EAAE;AACzE,QAAM,sBAAqC,OAAsC,EAAE;AACnF,QAAM,oBAAmC,OAAmC,EAAE;AC7BrF,aAAW,YAAX,WAAW,UAAY;AAEhB,QAAM,WAAW,CAAC,QAA0C,QAAQ,QAAQ,OAAO,QAAQ;AAE3F,QAAM,UAAgC,MAAM;AAC5C,QAAM,WAAW,CAAC,QAAgC,OAAO,QAAQ;AACjE,QAAM,WAAW,CAAC,QAAgC,OAAO,QAAQ;AACjE,QAAM,eAAe,CAAC,QACzB,SAAS,GAAG,KACT,QAAQ,SACR,IAAI,CAAC,MAAM,OACX,GAAG,SAAS,KAAY,EAAE,CAAC,OAAO;AAClC,QAAM,QAAQ,CAAC,QAClB,aAAa,GAAG,MAAM;AAGb,QAAA,SAAS,CAClB,KACA,QAC0B,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG;AAG9D,QAAA,aAAa,CAAC,OAAY,aACnC,CAAC,OAAO,GAAG,OAAO,QAAQ;AAE9B,WAAS,cAAc,SACvB;AACI,YAAQ,SACR;AAAA,MACI,KAAK;AAAA,MACL,KAAK;AACD,eAAO,WAAW;AAAA,MACtB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,WAAW;AAAA,MACtB;AACI,eAAO,WAAW;AAAA,IAC1B;AAAA,EACJ;AAEO,WAAS,cAAc,OAC9B;AACQ,QAAA,CAAC,OAAO,aAAa,KAAK;AAAG,aAAO,WAAW;AAE5C,WAAA,cAAc,UAAU,KAAK,CAAC;AAAA,EACzC;AAEA,QAAM,eAAe,CAAC,UAA2B,OAAO,UAAU,SAAS,KAAK,KAAK;AAG9E,QAAM,YAAY,CAAC;AAAA;AAAA,IAGtB,aAAa,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA;AAa5B,WAAS,MAAS,UACzB;AACI,UAAM,MAAM,YAAa,SAAoB,cAAc,GAAG;AAEvD,WAAA,MAAM,MAAM,GAAG,IAAI;AAAA,EAC9B;AAAA;AAcO,WAAS,QAAQ,KACxB;AAEU,UAAA,MAAa,uBAAA,OAAO,IAAI;AAGnB,eAAA,OAAO,IAAI,MAAM,GAAG;AAAG,UAAI,GAAG,IAAI;AAGtC,WAAA,CAAC,QAAQ,OAAO;AAAA,EAC3B;AChGA,WAAS,SAA+B,QAAW,KACnD;AACI,QAAI,UAAU,mBAAmB,WAAW,IAAI,MAAM;AACtD,QAAI,CAAC,SACL;AACI,oCAAc;AACK,yBAAA,WAAW,IAAI,QAAQ,OAAO;AAAA,IACrD;AAGI,QAAA,MAAM,QAAQ,IAAI,GAAG;AACzB,QAAI,CAAC,KACL;AACU,YAAA,IAAI,mBAAmB,QAAQ,GAAG;AAChC,cAAA,IAAI,KAAK,GAAG;AAAA,IACxB;AAEO,WAAA;AAAA,EACX;AAAA,EAKO,MAAM,2BAAiD,WAC9D;AAAA,IAgCI,YAAY,QAAW,KACvB;AACU;AACN,WAAK,UAAU;AACf,WAAK,OAAO;AACR,UAAA,kBAAkB,OACf,kBAAkB,SAEzB;AACS,aAAA,SAAU,OAAoC,IAAI,GAAG;AAAA,MAErD,WAAA,kBAAkB,OACpB,kBAAkB,SAEzB;AACS,aAAA,SAAU,OAA+B,IAAI,GAAG;AAAA,MAAA,OAGzD;AACS,aAAA,SAAU,OAAe,GAAU;AAAA,MAC5C;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA/CA,IAAI,QACJ;AACI,WAAK,MAAM;AAEX,aAAO,KAAK;AAAA,IAChB;AAAA,IACA,IAAI,MAAM,GACV;AAEQ,UAAA,KAAK,SAAS,UAClB;AACQ,YAAA,KAAK,QAAQ,QAAQ;AAAA,MAEpB,WAAA,SAAS,KAAK,IAAI,GAC3B;AACQ,YAAA,CAAC,CAAC,KAAK,SAAS;AAAA,MACxB;AACA,UAAI,MAAM,KAAK;AAAQ;AAEvB,WAAK,QAAQ;AACb,WAAK,SAAS;AAAA,IAClB;AAAA,IA4BA,mBACA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,OAAO,MAAM,QAAgB,MAAoB,KACjD;AACU,YAAA,MAAM,SAAS,QAAe,GAAU;AAG9C,UAAI,MAAM;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBA,OAAO,QAAQ,QAAgB,MAAsB,KAAe,UAAoB,UACxF;AACI,YAAM,UAAU,KAAK,WAAW,IAAI,MAAM;AAC1C,UAAI,CAAC;AAAS;AAER,YAAA,MAAM,CAAC,QACb;AACI,YAAI,KACJ;AAEI,cAAI,QAAQ;AAAA,QAChB;AAAA,MAAA;AAGJ,eAAS,MACT;AACQ,YAAA,SAAS,eAAe,OAC5B;AAGI,kBAAQ,QAAQ,GAAG;AAAA,QAAA,OAGvB;AACU,gBAAA,gBAAgB,QAAQ,MAAM;AAC9B,gBAAA,eAAe,iBAAiB,aAAa,GAAG;AAElD,cAAA,iBAAiB,QAAQ,UAC7B;AACU,kBAAA,YAAY,OAAO,QAAQ;AACzB,oBAAA,QAAQ,CAAC,KAAKC,SACtB;AAEQA,kBAAAA,SAAQ,YACLA,SAAQ,qBACP,CAAC,SAASA,IAAG,KAAKA,QAAO,WAEjC;AACI,oBAAI,GAAG;AAAA,cACX;AAAA,YAAA,CACH;AAAA,UAAA,OAGL;AAEI,gBAAI,QAAQ,UAAa,QAAQ,IAAI,MAAS,GAC9C;AACQ,kBAAA,QAAQ,IAAI,GAAG,CAAC;AAAA,YACxB;AAGA,gBAAI,cACJ;AACQ,kBAAA,QAAQ,IAAI,iBAAiB,CAAC;AAAA,YACtC;AAGA,oBAAQ,MACR;AAAA,cACI,KAAK,eAAe;AAChB,oBAAI,CAAC,eACL;AACQ,sBAAA,QAAQ,IAAI,WAAW,CAAC;AACxB,sBAAA,MAAM,MAAM,GAChB;AACQ,wBAAA,QAAQ,IAAI,mBAAmB,CAAC;AAAA,kBACxC;AAAA,2BAEK,cACT;AAEQ,sBAAA,QAAQ,IAAI,QAAQ,CAAC;AAAA,gBAC7B;AACA;AAAA,cACJ,KAAK,eAAe;AAChB,oBAAI,CAAC,eACL;AACQ,sBAAA,QAAQ,IAAI,WAAW,CAAC;AACxB,sBAAA,MAAM,MAAM,GAChB;AACQ,wBAAA,QAAQ,IAAI,mBAAmB,CAAC;AAAA,kBACxC;AAAA,gBACJ;AACA;AAAA,cACJ,KAAK,eAAe;AACZ,oBAAA,MAAM,MAAM,GAChB;AACQ,sBAAA,QAAQ,IAAI,WAAW,CAAC;AAAA,gBAChC;AACA;AAAA,YACR;AAAA,UACJ;AAAA,QACJ;AAAA,MAAA,CACH;AAAA,IACL;AAAA,EACJ;AA3La,qBAgFF,iCAAuE,QAAQ;AC1GnF,QAAM,wBAAgE;AAAA,IACzE,WAAW;AAAA;AAAA;AAAA;AAAA,IAKX,CAAC,OAAO,QAAQ,IAChB;AACI,aAAO,SAAS,MAAM,OAAO,UAAU,UAAU;AAAA,IACrD;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,MACV;AACW,aAAA,kBAAkB,IAAI,EAAE;AAAA,QAC3B,GAAG,KAAK,IAAI,CAAC,MAAO,QAAQ,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAE;AAAA,MAAA;AAAA,IAElE;AAAA;AAAA;AAAA;AAAA,IAKA,UACA;AACI,aAAO,SAAS,MAAM,WAAW,CAAC,UAClC;AACI,cAAM,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC;AAEvB,eAAA;AAAA,MAAA,CACV;AAAA,IACL;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,IACF,SAEJ;AACI,aAAO,MAAM,MAAM,SAAS,IAAI,SAAS,QAAW,SAAS;AAAA,IACjE;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,IACH,SAEJ;AACW,aAAA,MAAM,MAAM,UAAU,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,UAAU,GAAG,SAAS;AAAA,IACjF;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,IACD,SAEJ;AACI,aAAO,MAAM,MAAM,QAAQ,IAAI,SAAS,YAAY,SAAS;AAAA,IACjE;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,IACN,SAEJ;AACI,aAAO,MAAM,MAAM,aAAa,IAAI,SAAS,QAAW,SAAS;AAAA,IACrE;AAAA;AAAA;AAAA;AAAA,IAKA,SAAS,IACL,SAEJ;AACI,aAAO,MAAM,MAAM,YAAY,IAAI,SAAS,YAAY,SAAS;AAAA,IACrE;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,IACV,SAEJ;AACI,aAAO,MAAM,MAAM,iBAAiB,IAAI,SAAS,QAAW,SAAS;AAAA,IACzE;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,QAAQ,IACJ,SAEJ;AACI,aAAO,MAAM,MAAM,WAAW,IAAI,SAAS,QAAW,SAAS;AAAA,IACnE;AAAA;AAAA;AAAA;AAAA,IAKA,YAAY,MACZ;AACW,aAAA,YAAY,MAAM,YAAY,IAAI;AAAA,IAC7C;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,MACX;AACW,aAAA,YAAY,MAAM,WAAW,IAAI;AAAA,IAC5C;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,WACL;AACI,aAAO,kBAAkB,IAAI,EAAE,KAAK,SAAS;AAAA,IACjD;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,eAAe,MACf;AACW,aAAA,YAAY,MAAM,eAAe,IAAI;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,IACA,SAEJ;AACI,aAAO,MAAM,MAAM,OAAO,IAAI,SAAS,QAAW,SAAS;AAAA,IAC/D;AAAA;AAAA;AAAA;AAAA,IAKA,MACA;AACW,aAAA,WAAW,MAAM,KAAK;AAAA,IACjC;AAAA;AAAA;AAAA;AAAA,IAKA,QAAQ,MACR;AACW,aAAA,WAAW,MAAM,QAAQ,IAAI;AAAA,IACxC;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,OAMA,MAEP;AACI,aAAO,OAAO,MAAM,UAAU,IAAI,IAAI;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA,IAKA,YACI,OAMG,MAEP;AACI,aAAO,OAAO,MAAM,eAAe,IAAI,IAAI;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA,IAKA,QACA;AACW,aAAA,WAAW,MAAM,OAAO;AAAA,IACnC;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,KACI,IACA,SAEJ;AACI,aAAO,MAAM,MAAM,QAAQ,IAAI,SAAS,QAAW,SAAS;AAAA,IAChE;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,MACV;AACW,aAAA,WAAW,MAAM,UAAU,IAAI;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA,IAKA,aACA;AAEW,aAAA,kBAAkB,IAAI,EAAE;IACnC;AAAA;AAAA;AAAA;AAAA,IAKA,SAAS,UACT;AAEI,aAAO,kBAAkB,IAAI,EAAE,SAAS,QAAQ;AAAA,IACpD;AAAA;AAAA;AAAA;AAAA,IAKA,aAAa,MACb;AAEI,aAAQ,kBAAkB,IAAI,EAAE,UAAkB,GAAG,IAAI;AAAA,IAC7D;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,MACX;AACW,aAAA,WAAW,MAAM,WAAW,IAAI;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA,IAKA,SACA;AACW,aAAA,SAAS,MAAM,UAAU,UAAU;AAAA,IAC9C;AAAA,EACJ;AAGA,WAAS,SACLC,OACA,QACA,WAEJ;AASU,UAAA,MAAM,iBAAiBA,KAAI;AAC3B,UAAA,OAAQ,IAAI,MAAM;AAGxB,QAAI,QAAQA,OACZ;AACI,WAAK,QAAQ,KAAK;AAClB,WAAK,OAAO,MACZ;AACU,cAAA,SAAS,KAAK;AACpB,YAAI,OAAO,OACX;AACW,iBAAA,QAAQ,UAAU,OAAO,KAAK;AAAA,QACzC;AAEO,eAAA;AAAA,MAAA;AAAA,IAEf;AAEO,WAAA;AAAA,EACX;AAKA,WAAS,iBAAoB,KAC7B;AACI,uBAAmB,MAAO,MAAM,MAAM,GAAG,GAAI,aAAa,SAAS,iBAAiB;AAE7E,WAAA;AAAA,EACX;AAEA,WAAS,kBAAqB,OAC9B;AACU,UAAA,MAAM,MAAM,KAAK;AACvB,QAAI,QAAQ;AAAc,aAAA;AAC1B,uBAAmB,MAAM,KAAK,aAAa,SAAS,iBAAiB;AAE9D,WAAA,IAAI,IAAI,UAAU;AAAA,EAC7B;AAQA,WAAS,MACLA,OACA,QACA,IACA,SACA,cACA,MAEJ;AACU,UAAA,MAAM,iBAAiBA,KAAI;AACjC,UAAM,YAAY,QAAQA;AACpB,UAAA,WAAW,IAAI,MAAM;AAM3B,QAAI,aAAa,MAAM,UAAU,MAAa,GAC9C;AACI,YAAMC,UAAS,SAAS,MAAMD,OAAM,IAAI;AAEjC,aAAA,YAAY,WAAWC,OAAM,IAAIA;AAAAA,IAC5C;AAEA,QAAI,YAAY;AAChB,QAAI,QAAQD,OACZ;AACI,UAAI,WACJ;AACgB,oBAAA,SAAyB,MAAM,OAC3C;AACI,iBAAO,GAAG,KAAK,MAAM,WAAW,IAAI,GAAG,OAAOA,KAAI;AAAA,QAAA;AAAA,MACtD,WAEK,GAAG,SAAS,GACrB;AACgB,oBAAA,SAAyB,MAAM,OAC3C;AACI,iBAAO,GAAG,KAAK,MAAM,MAAM,OAAOA,KAAI;AAAA,QAAA;AAAA,MAE9C;AAAA,IACJ;AACA,UAAM,SAAS,SAAS,KAAK,KAAK,WAAW,OAAO;AAEpD,WAAO,aAAa,eAAe,aAAa,MAAM,IAAI;AAAA,EAC9D;AAGA,WAAS,OACLA,OACA,QACA,IACA,MAEJ;AACU,UAAA,MAAM,iBAAiBA,KAAI;AACjC,QAAI,YAAY;AAChB,QAAI,QAAQA,OACZ;AACgB,kBAAA,SAAyB,KAAK,MAAM,OAChD;AACW,eAAA,GAAG,KAAK,MAAM,KAAK,WAAW,IAAI,GAAG,OAAOA,KAAI;AAAA,MAAA;AAAA,IAE/D;AAEA,WAAQ,IAAI,MAAM,EAAU,WAAW,GAAG,IAAI;AAAA,EAClD;AAGA,WAAS,YACLA,OACA,QACA,MAEJ;AACU,UAAA,MAAM,MAAMA,KAAI;AACtB,uBAAmB,MAAM,KAAK,aAAa,SAAS,iBAAiB;AAErE,UAAM,MAAM,IAAI,MAAM,EAAE,GAAG,IAAI;AAG1B,SAAA,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,GACpD;AACI,WAAK,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;AAEvB,aAAO,IAAI,MAAM,EAAE,GAAG,IAAI;AAAA,IAC9B;AAEO,WAAA;AAAA,EACX;AAIA,WAAS,WACLA,OACA,QACA,OAAkB,CAAA,GAEtB;AACI,UAAM,MAAM;AAAA,MAAS,MACjB;AAAA,QAAQ,MACH,MAAMA,KAAI,EAAU,MAAM,EAAE,MAAMA,OAAM,IAAI;AAAA,MACjD;AAAA,IAAA;AAGG,WAAA;AAAA,EACX;AC/bA,MAAA;AAYO,WAAS,IAAO,OACvB;AACQ,QAAA,MAAM,KAAK,GACf;AACW,aAAA;AAAA,IACX;AAEO,WAAA,IAAI,cAAiB,KAAK;AAAA,EACrC;AAOO,WAAS,MAAM,GACtB;AACI,WAAO,IAAI,EAAE,cAAc,MAAM,MAAM,OAAO;AAAA,EAClD;AAAA,EASO,MAAM,sBAA+B,WAC5C;AAAA,IAiCI,YAAY,OACZ;AACU;AAlCV,WAAiB,EAAwB,IAAA;AAmChC,WAAA,YAAY,MAAM,KAAK;AACvB,WAAA,SAAS,WAAW,KAAK;AAAA,IAClC;AAAA,IAnCA,IAAI,QACJ;AACI,WAAK,MAAM;AAEX,aAAO,KAAK;AAAA,IAChB;AAAA,IAEA,IAAI,MAAM,GACV;AACI,YAAM,WAAW,KAAK;AAChB,YAAA,WAAW,MAAM,CAAC;AAEpB,UAAA,CAAC,WAAW,UAAU,QAAQ;AAAG;AAErC,eAAS,MACT;AACI,aAAK,QAAQ;AAEb,aAAK,YAAY;AACZ,aAAA,SAAS,WAAW,QAAQ;AAAA,MAAA,CACpC;AAAA,IACL;AAAA,EAeJ;AAtCqB,OAAc,cAAA;AAAA,EC/BnC,MAAM,oBACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASI,IAAI,QAAgB,KAAsB,UAC1C;AAEQ,UAAA,QAAQ,cAAc,aAC1B;AACW,eAAA;AAAA,MAAA,WAEF,QAAQ,cAAc,KAC/B;AACI,YACI,aACI,YAAY,IAAI,MAAM,KAGvB,OAAO,eAAe,MAAM,MAAM,OAAO,eAAe,QAAQ,GAEvE;AACW,iBAAA;AAAA,QACX;AAGA;AAAA,MACJ;AAEM,YAAA,gBAAgB,QAAQ,MAAM;AAEhC,UAAA;AACJ,UAAI,kBAAkB,KAAK,sBAAsB,GAAG,IACpD;AACW,eAAA;AAAA,MACX;AACA,UAAI,QAAQ,kBACZ;AACW,eAAA;AAAA,MACX;AAEA,YAAM,MAAM,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,QACA,MAAM,MAAM,IAAI,SAAS;AAAA,MAAA;AAGzB,UAAA,SAAS,GAAG,IAAI,eAAe,IAAI,GAAG,IAAI,mBAAmB,GAAG,GACpE;AACW,eAAA;AAAA,MACX;AAGA,yBAAmB,MAAM,QAAQ,aAAa,KAAK,GAAU;AAGzD,UAAA,MAAM,GAAG,GACb;AACI,eAAO,iBAAiB,aAAa,GAAG,IAAI,MAAM,IAAI;AAAA,MAC1D;AAGI,UAAA,SAAS,GAAG,GAChB;AACI,eAAO,SAAS,GAAG;AAAA,MACvB;AAEO,aAAA;AAAA,IACX;AAAA,EACJ;AAAA,EAKA,MAAM,+BAA+B,oBACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASI,IACI,QACA,KACA,OACA,UAEJ;AACQ,UAAA,WAAW,OAAO,GAAG;AAEzB,iBAAW,MAAM,QAAQ;AACzB,cAAQ,MAAM,KAAK;AAEf,UAAA,CAAC,QAAQ,MAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,GACvD;AACI,iBAAS,QAAQ;AAEV,eAAA;AAAA,MACX;AAEA,YAAM,SACA,QAAQ,MAAM,KAAK,aAAa,GAAG,IAC/B,OAAO,GAAG,IAAI,OAAO,SACrB,OAAO,QAAQ,GAAG;AAC5B,YAAM,SAAS,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,MAAM,IAAI,SAAS;AAAA,MAAA;AAMzB,UAAA,WAAW,MAAM,QAAQ,GAC7B;AACI,YAAI,CAAC,QACL;AACI,6BAAmB,QAAQ,QAAQ,eAAe,KAAK,KAAK,KAAK;AAAA,QAE5D,WAAA,WAAW,OAAO,QAAQ,GACnC;AACI,6BAAmB,QAAQ,QAAQ,eAAe,KAAK,KAAK,OAAO,QAAQ;AAAA,QAC/E;AAAA,MACJ;AAEO,aAAA;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,eACI,QACA,KAEJ;AACU,YAAA,SAAS,OAAO,QAAQ,GAAG;AAC3B,YAAA,WAAW,OAAO,GAAG;AAC3B,YAAM,SAAS,QAAQ,eAAe,QAAQ,GAAG;AACjD,UAAI,UAAU,QACd;AACI,2BAAmB,QAAQ,QAAQ,eAAe,QAAQ,KAAK,QAAW,QAAQ;AAAA,MACtF;AAEO,aAAA;AAAA,IACX;AAAA,IAEA,IAAI,QAA0C,KAC9C;AACI,YAAM,SAAS,QAAQ,IAAI,QAAQ,GAAG;AAClC,UAAA,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe,IAAI,GAAG,GAC7C;AACI,2BAAmB,MAAM,QAAQ,aAAa,KAAK,GAAG;AAAA,MAC1D;AAEO,aAAA;AAAA,IACX;AAAA,IAEA,QAAQ,QACR;AACuB,yBAAA;AAAA,QACf;AAAA,QACA,aAAa;AAAA,QACb,QAAQ,MAAM,IAAI,WAAW;AAAA,MAAA;AAG1B,aAAA,QAAQ,QAAQ,MAAM;AAAA,IACjC;AAAA,EACJ;AAKa,QAAA,kBAAwC,IAAI;AAEzD,WAAS,eAA6B,KACtC;AAEQ,QAAA,CAAC,SAAS,GAAG;AAAG,YAAM,OAAO,GAAG;AAC9B,UAAA,MAAM,MAAM,IAAI;AACtB,uBAAmB,MAAM,KAAK,aAAa,KAAK,GAAG;AAE5C,WAAA,IAAI,eAAe,GAAa;AAAA,EAC3C;AAEA,QAAM,iBAAiB,IAAI;AAAA,IAEvB,uBAAO,oBAAoB,MAAM,EAI5B,OAAO,CAAC,QAAQ,QAAQ,eAAe,QAAQ,QAAQ,EACvD,IAAI,CAAC,QAAQ,OAAO,GAA8B,CAAC,EACnD,OAAO,QAAQ;AAAA,EACxB;AAEA,QAAM,6CAA4C,6BAA6B;ACtNxE,QAAM,4BAA2D;AAAA,IACpE,KAAK,4BAA4B;AAAA,EACrC;AAEA,WAAS,8BACT;AACI,UAAM,mBAAmB;AAElB,WAAA,CACH,QACA,KACA,aAEJ;AACQ,UAAA,QAAQ,cAAc,aAC1B;AACW,eAAA;AAAA,MAAA,WAEF,QAAQ,cAAc,KAC/B;AACW,eAAA;AAAA,MACX;AAEA,aAAO,QAAQ;AAAA,QACX,OAAO,kBAAkB,GAAG,KAAK,OAAO,SAClC,mBACA;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAAA,IACJ;AAAA,EAER;AAIA,WAAS,yBACT;AACI,UAAM,mBAAqC;AAAA,MACvC,IAAoB,KACpB;AAGU,cAAA,SAAS,KAAK,cAAc,GAAG;AAC/B,cAAA,YAAY,MAAM,MAAM;AACxB,cAAA,SAAS,MAAM,GAAG;AAEpB,YAAA,WAAW,KAAK,MAAM,GAC1B;AACI,6BAAmB,MAAM,WAAW,aAAa,KAAK,GAAG;AAAA,QAC7D;AACA,2BAAmB,MAAM,WAAW,aAAa,KAAK,MAAM;AAE5D,cAAM,EAAE,IAAA,IAAQ,SAAS,SAAS;AAClC,cAAM,OAAO;AACb,YAAI,IAAI,KAAK,WAAW,GAAG,GAC3B;AACI,iBAAO,KAAK,OAAO,IAAI,GAAG,CAAC;AAAA,QAEtB,WAAA,IAAI,KAAK,WAAW,MAAM,GACnC;AACI,iBAAO,KAAK,OAAO,IAAI,MAAM,CAAC;AAAA,QAAA,WAEzB,WAAW,WACpB;AAGI,iBAAO,IAAI,GAAG;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,IAAI,OACJ;AACU,cAAA,SAAU,KAAwC,cAAc,GAAG;AACzE,2BAAmB,MAAM,MAAM,MAAM,GAAG,aAAa,SAAS,WAAW;AAEzE,eAAO,QAAQ,IAAI,QAAQ,QAAQ,MAAM;AAAA,MAC7C;AAAA,MACA,IAA2B,KAC3B;AACU,cAAA,SAAS,KAAK,cAAc,GAAG;AAC/B,cAAA,YAAY,MAAM,MAAM;AACxB,cAAA,SAAS,MAAM,GAAG;AAEpB,YAAA,WAAW,KAAK,MAAM,GAC1B;AACI,6BAAmB,MAAM,WAAW,aAAa,KAAK,GAAG;AAAA,QAC7D;AACA,2BAAmB,MAAM,WAAW,aAAa,KAAK,MAAM;AAE5D,eAAO,QAAQ,SACT,OAAO,IAAI,GAAG,IACd,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM;AAAA,MAC9C;AAAA,MACA,QAAmC,UAAoB,SACvD;AACI,cAAM,WAAW;AACX,cAAA,SAAS,SAAS,cAAc,GAAG;AACnC,cAAA,YAAY,MAAM,MAAM;AAC9B,cAAM,OAAO;AACb,2BAAmB,MAAM,WAAW,aAAa,SAAS,WAAW;AAErE,eAAO,OAAO;AAAA,UAAQ,CAAC,OAAgB;AAAA;AAAA;AAAA;AAAA,YAKnC,SAAS,KAAK,SAAS,KAAK,KAAK,GAAG,KAAK,GAAG,GAAG,QAAQ;AAAA;AAAA,QAAA;AAAA,MAE/D;AAAA,MAEA,IAAoB,OACpB;AACI,gBAAQ,MAAM,KAAK;AACb,cAAA,SAAS,MAAM,IAAI;AACnB,cAAA,QAAQ,SAAS,MAAM;AAC7B,cAAM,SAAS,MAAM,IAAI,KAAK,QAAQ,KAAK;AAC3C,YAAI,CAAC,QACL;AACI,iBAAO,IAAI,KAAK;AAChB,6BAAmB,QAAQ,QAAQ,eAAe,KAAK,OAAO,KAAK;AAAA,QACvE;AAEO,eAAA;AAAA,MACX;AAAA,MACA,IAAoB,KAAc,OAClC;AACI,gBAAQ,MAAM,KAAK;AACb,cAAA,SAAS,MAAM,IAAI;AACzB,cAAM,EAAE,KAAK,IAAI,IAAI,SAAS,MAAM;AAEpC,YAAI,SAAS,IAAI,KAAK,QAAQ,GAAG;AACjC,YAAI,CAAC,QACL;AACI,gBAAM,MAAM,GAAG;AACN,mBAAA,IAAI,KAAK,QAAQ,GAAG;AAAA,QAKjC;AAEA,cAAM,WAAW,IAAI,KAAK,QAAQ,GAAG;AAC9B,eAAA,IAAI,KAAK,KAAK;AACrB,YAAI,CAAC,QACL;AACI,6BAAmB,QAAQ,QAAQ,eAAe,KAAK,KAAK,KAAK;AAAA,QAE5D,WAAA,WAAW,OAAO,QAAQ,GACnC;AACI,6BAAmB,QAAQ,QAAQ,eAAe,KAAK,KAAK,OAAO,QAAQ;AAAA,QAC/E;AAEO,eAAA;AAAA,MACX;AAAA,MACA,OAA8B,KAC9B;AACU,cAAA,SAAS,MAAM,IAAI;AACzB,cAAM,EAAE,KAAK,IAAI,IAAI,SAAS,MAAM;AACpC,YAAI,SAAS,IAAI,KAAK,QAAQ,GAAG;AACjC,YAAI,CAAC,QACL;AACI,gBAAM,MAAM,GAAG;AACN,mBAAA,IAAI,KAAK,QAAQ,GAAG;AAAA,QAKjC;AAEA,cAAM,WAAW,MAAM,IAAI,KAAK,QAAQ,GAAG,IAAI;AAEzC,cAAA,SAAS,OAAO,OAAO,GAAG;AAChC,YAAI,QACJ;AACI,6BAAmB,QAAQ,QAAQ,eAAe,QAAQ,KAAK,QAAW,QAAQ;AAAA,QACtF;AAEO,eAAA;AAAA,MACX;AAAA,MACA,QACA;AACU,cAAA,SAAS,MAAM,IAAI;AACnB,cAAA,WAAW,OAAO,SAAS;AACjC,cAAM,YAIA;AAEA,cAAA,SAAS,OAAO;AACtB,YAAI,UACJ;AACuB,6BAAA;AAAA,YACf;AAAA,YACA,eAAe;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAER;AAEO,eAAA;AAAA,MACX;AAAA,IAAA;AAGJ,UAAM,kBAAkB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IAAA;AAGK,oBAAA,QAAQ,CAAC,WACzB;AACqB,uBAAA,MAAM,IAAI,qBAAqB,MAAM;AAAA,IAAA,CACzD;AAEM,WAAA;AAAA,EACX;AAEA,WAAS,qBAAqB,QAC9B;AACI,WAAO,YAEA,MAEP;AACU,YAAA,SAAS,KAAK,cAAc,GAAG;AAC/B,YAAA,YAAY,MAAM,MAAM;AACxB,YAAA,cAAc,MAAM,SAAS;AACnC,YAAM,SACA,WAAW,aAAc,WAAW,OAAO,YAAY;AACvD,YAAA,YAAY,WAAW,UAAU;AACvC,YAAM,gBAAgB,OAAO,MAAM,EAAE,GAAG,IAAI;AAC5C,YAAM,OAAO;AAEM,yBAAA;AAAA,QACf;AAAA,QACA,aAAa;AAAA,QACb,YAAY,sBAAsB;AAAA,MAAA;AAK/B,aAAA;AAAA;AAAA,QAEH,OACA;AACI,gBAAM,EAAE,OAAO,KAAK,IAAI,cAAc,KAAK;AAE3C,iBAAO,OACD,EAAE,OAAO,SACT;AAAA,YACE,OAAO,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK;AAAA,YAC7D;AAAA,UAAA;AAAA,QAEZ;AAAA;AAAA,QAEA,CAAC,OAAO,QAAQ,IAChB;AACW,iBAAA;AAAA,QACX;AAAA,MAAA;AAAA,IACJ;AAAA,EAER;AAsBA,QAAM,WAAW,CAA4B,MAAc,QAAQ,eAAe,CAAC;ACjR5E,WAAS,SAA2B,QAC3C;AACQ,QAAA,CAAC,SAAS,MAAM,GACpB;AACW,aAAA;AAAA,IACX;AAEI,QAAA,OAAO,cAAc,GAAG,GAC5B;AACW,aAAA;AAAA,IACX;AAGM,UAAA,aAAa,cAAc,MAAM;AACnC,QAAA,eAAe,WAAW,SAC9B;AACW,aAAA;AAAA,IACX;AAGM,UAAA,gBAAgB,YAAY,IAAI,MAAM;AAC5C,QAAI,eACJ;AACW,aAAA;AAAA,IACX;AAEA,UAAM,QAAQ,IAAI;AAAA,MACd;AAAA,MACA,eAAe,WAAW,aAAa,4BAA4B;AAAA,IAAA;AAE3D,gBAAA,IAAI,QAAQ,KAAK;AAEtB,WAAA;AAAA,EACX;AACa,QAAA,kCAAkB;AAQxB,WAAS,WAAW,OAC3B;AACI,WAAO,CAAC,EAAE,SAAU,MAAiB,cAAc,WAAW;AAAA,EAClE;AAQa,QAAA,aAAa,CAAI,UAC9B;AACQ,QAAA,SAAS,KAAK,GAClB;AACI,aAAO,SAAS,KAAY;AAAA,IAChC;AAEO,WAAA;AAAA,EACX;AAQO,WAAS,QAAQ,OACxB;AACI,WAAO,QAAQ,CAAC,CAAC,MAAM,cAAc,GAAG,IAAI;AAAA,EAChD;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/Reactivity.ts","../src/batch.ts","../src/computed.ts","../src/effect.ts","../src/shared/constants.ts","../src/shared/general.ts","../src/property.ts","../src/arrayInstrumentations.ts","../src/ref.ts","../src/baseHandlers.ts","../src/collectionHandlers.ts","../src/reactive.ts"],"sourcesContent":["import { type ComputedReactivity } from './computed';\n\n/**\n * 反应式节点。\n *\n * 拥有节点值以及被捕捉与触发的能力。\n *\n * 用于被 computed effect 等构建的节点所继承。\n */\nexport class Reactivity<T = any>\n{\n /**\n * 获取当前节点值。\n *\n * 取值时将会建立与父节点的依赖关系。\n */\n get value(): T\n {\n this.track();\n\n return this._value;\n }\n /**\n * @private\n */\n _value: T;\n\n /**\n * 父反应节点。\n *\n * 记录了哪些节点调用了当前节点。\n *\n * 当前节点失效时,会通知并移除所有父节点。\n *\n * @private\n */\n _parents = new Map<ComputedReactivity, number>();\n\n /**\n * 捕捉。\n *\n * 建立与父节点的依赖关系。\n */\n track()\n {\n if (!Reactivity.activeReactivity || !_shouldTrack) return;\n\n // 连接父节点和子节点。\n const parent = Reactivity.activeReactivity;\n if (parent)\n {\n this._parents.set(parent, parent._version);\n }\n }\n\n /**\n * 触发。\n *\n * 冒泡到所有父节点,设置失效子节点字典。\n */\n trigger()\n {\n // 冒泡到所有父节点,设置失效子节点字典。\n this._parents.forEach((version, parent) =>\n {\n if (parent._version !== version) return;\n\n parent.trigger();\n // 失效时添加子节点到父节点中。\n parent._children.set(this, this._value);\n });\n\n //\n this._parents.clear();\n }\n\n /**\n * 当前正在执行的反应式节点。\n *\n * @internal\n */\n static activeReactivity: ComputedReactivity;\n}\n\n/**\n * 反应式节点链。\n */\nexport type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };\n\n/**\n * 强制跟踪。\n *\n * @param fn 强制跟踪的函数。\n */\nexport function forceTrack<T>(fn: () => T): T\n{\n const preShouldTrack = _shouldTrack;\n _shouldTrack = true;\n const result = fn();\n _shouldTrack = preShouldTrack;\n\n return result;\n}\n\n/**\n * 不跟踪。\n *\n * @param fn 不跟踪的函数。\n */\nexport function noTrack<T>(fn: () => T): T\n{\n const preShouldTrack = _shouldTrack;\n _shouldTrack = false;\n const result = fn();\n _shouldTrack = preShouldTrack;\n\n return result;\n}\n\n/**\n * 是否应该跟踪的标志\n * 控制是否进行依赖跟踪\n *\n * @private\n */\nlet _shouldTrack = true;\n","import { ComputedReactivity } from './computed';\nimport { Reactivity } from './Reactivity';\n\n/**\n * 合批处理。\n *\n * @param dep 要处理的依赖。\n * @param isRunning 添加时是否是正在运行。\n */\nexport function batch(dep: ComputedReactivity, isRunning: boolean): void\n{\n if (isRunning)\n {\n _isRunedDeps.push(dep);\n }\n else\n {\n _needEffectDeps.push(dep);\n }\n}\n\n/**\n * 批次执行多次修改反应式对象,可以减少不必要的反应式触发。\n *\n * ```ts\n * batchRun(() => {\n * // 修改反应式对象\n * reactiveObj.a = 1;\n * reactiveObj.b = 2;\n * })\n * ```\n *\n * @param fn 要执行的函数,在此函数中多次修改反应式对象。\n */\nexport function batchRun<T>(fn: () => T): T\n{\n _batchDepth++;\n\n const result = fn();\n\n if (--_batchDepth > 0)\n {\n return;\n }\n\n // 处理已经运行过的依赖,\n if (_isRunedDeps.length > 0)\n {\n _isRunedDeps.forEach((dep) =>\n {\n // 此时依赖以及子依赖都已经运行过了,只需修复与子节点关系。\n __DEV__ && console.assert(dep._isDirty === false, 'dep.dirty === false');\n\n // 修复与子节点关系\n dep._children.forEach((version, node) =>\n {\n node._parents.set(dep, dep._version);\n });\n dep._children.clear();\n });\n _isRunedDeps.length = 0;\n }\n\n // 批次处理\n if (_needEffectDeps.length > 0)\n {\n _needEffectDeps.forEach((dep) =>\n {\n // 独立执行回调\n const pre = Reactivity.activeReactivity;\n Reactivity.activeReactivity = null;\n\n dep.runIfDirty();\n\n Reactivity.activeReactivity = pre;\n });\n _needEffectDeps.length = 0;\n }\n\n return result;\n}\n\nlet _batchDepth = 0;\n/**\n * 正在运行的依赖。\n */\nconst _needEffectDeps: ComputedReactivity[] = [];\n/**\n * 已经运行过的依赖,只需要修复与子节点关系。\n */\nconst _isRunedDeps: ComputedReactivity[] = [];\n","import { batch } from './batch';\nimport { Reactivity, forceTrack } from './Reactivity';\n\n/**\n * 创建计算反应式对象。\n *\n * 首次获取值将会执行函数,后续获取值且在依赖发生变化的情况下将会重新计算。\n *\n * @param func 检测的可能包含响应式的函数。\n * @returns 包含 value 属性的对象,用于获取计算结果。\n */\nexport function computed<T>(func: (oldValue?: T) => T): Computed<T>\n{\n return new ComputedReactivity(func) as any;\n}\n\n/**\n * 计算反应式对象。\n */\nexport interface Computed<T = any>\n{\n readonly value: T\n [ComputedSymbol]: true\n}\ndeclare const ComputedSymbol: unique symbol;\n\nexport interface ComputedReactivity<T = any> extends Computed<T> { }\n\n/**\n * 计算反应式节点。\n *\n * 当使用 computed 函数时,会创建一个 ComputedDep 对象。\n *\n * 首次获取值将会执行函数,后续获取值且在依赖发生变化的情况下将会重新计算。\n */\nexport class ComputedReactivity<T = any> extends Reactivity<T>\n{\n /**\n * @internal\n */\n readonly __v_isRef = true;\n\n /**\n * 监听的函数。\n */\n protected _func: (oldValue?: T) => T;\n\n /**\n * 失效子节点。\n *\n * @private\n */\n _children = new Map<Reactivity, any>();\n\n /**\n * 是否脏,是否需要重新计算。\n *\n * 用于在没有值发生变化时,避免重复计算。\n *\n * @private\n */\n _isDirty = true;\n\n /**\n * 版本号。\n *\n * 重新计算后自动递增。用于判断子节点中的父节点引用是否过期。\n *\n * @private\n */\n _version = -1;\n\n /**\n * 获取值。\n *\n * 取值时将会建立与父节点的依赖关系。\n *\n * 同时会检查子节点是否发生变化,如果发生变化,则重新计算。\n */\n get value(): T\n {\n this.runIfDirty();\n\n this.track();\n\n return this._value;\n }\n\n /**\n * 创建计算依赖。\n * @param func 检测的可能包含响应式的函数。\n */\n constructor(func: (oldValue?: T) => T)\n {\n super();\n this._func = func;\n }\n\n /**\n * 触发。\n *\n * 冒泡到所有父节点,设置失效子节点字典。\n *\n * 把触发节点添加到失效子节点字典队列中。\n */\n trigger(): void\n {\n // 正在运行时被触发,需要在运行结束后修复父子节点关系。\n if (Reactivity.activeReactivity === this)\n {\n batch(this, Reactivity.activeReactivity === this);\n }\n\n super.trigger();\n }\n\n /**\n * 执行当前节点。\n */\n run()\n {\n // 不受嵌套的 effect 影响。\n forceTrack(() =>\n {\n // 保存当前节点作为父节点。\n const parentReactiveNode = Reactivity.activeReactivity;\n // 设置当前节点为活跃节点。\n Reactivity.activeReactivity = this as any;\n\n this._version++;\n this._value = this._func(this._value);\n\n // 执行完毕后恢复父节点。\n Reactivity.activeReactivity = parentReactiveNode;\n });\n }\n\n /**\n * 检查当前节点是否脏。\n *\n * 如果脏,则执行计算。\n */\n runIfDirty()\n {\n // 检查是否存在失效子节点字典。\n this._isDirty = this._isDirty || this.isChildrenChanged();\n\n // 标记为脏的情况下,执行计算。\n if (this._isDirty)\n {\n // 立即去除脏标记,避免循环多重计算。\n this._isDirty = false;\n\n //\n this.run();\n }\n }\n\n /**\n * 判断子节点是否发生变化。\n */\n protected isChildrenChanged()\n {\n if (this._children.size === 0) return false;\n\n // 检查是否存在子节点发生变化。\n let isChanged = false;\n\n // 避免在检查过程建立依赖关系。\n const preReactiveNode = Reactivity.activeReactivity;\n Reactivity.activeReactivity = null;\n\n // 检查子节点是否发生变化。\n this._children.forEach((value, node) =>\n {\n if (isChanged) return;\n if (node.value !== value)\n {\n // 子节点变化,需要重新计算。\n isChanged = true;\n\n return;\n }\n });\n\n // 恢复父节点。\n Reactivity.activeReactivity = preReactiveNode;\n\n if (!isChanged)\n {\n // 修复与子节点关系\n this._children.forEach((version, node) =>\n {\n node._parents.set(this, this._version);\n });\n }\n\n // 清空子节点。\n this._children.clear();\n\n return isChanged;\n }\n}\n\n","import { batch, batchRun } from './batch';\nimport { ComputedReactivity } from './computed';\nimport { Reactivity } from './Reactivity';\n\n/**\n * 创建效果反应式节点。\n *\n * 将会维持反应式效果,当被作用的函数所引用的响应式对象发生变化时,会立即执行 fn 函数。\n *\n * @param fn 要执行的函数\n * @returns 暂停和恢复副作用的函数\n *\n * 注:\n * 1. 与 `@vue/reactivity` 中的 effect 不同,此函数返回的是一个 Effect 对象,而不是一个函数。\n * 2. 不希望用户直接执行,而是通过反应式自动触发。\n * 3. 真有需求,可以使用 effect(func).run(true) 来代替 @vue/reactivity 中的 effect(func)() 。\n *\n */\nexport function effect<T = any>(fn: () => T): Effect\n{\n return new EffectReactivity(fn);\n}\n\n/**\n * 效果反应式节点。\n */\nexport class EffectReactivity<T = any> extends ComputedReactivity<T> implements Effect\n{\n /**\n * 是否为启用, 默认为 true。\n *\n * 启用时,会立即执行函数。\n */\n private _isEnable = true;\n\n constructor(func: (oldValue?: T) => T)\n {\n super(func);\n this.runIfDirty();\n }\n\n pause()\n {\n this._isEnable = false;\n }\n\n resume()\n {\n if (this._isEnable) return;\n this._isEnable = true;\n if (EffectReactivity.pausedQueueEffects.has(this))\n {\n EffectReactivity.pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n\n trigger()\n {\n batchRun(() =>\n {\n super.trigger();\n\n if (this._isEnable)\n {\n // 合批时需要判断是否已经运行的依赖。\n batch(this, Reactivity.activeReactivity === this);\n }\n else\n {\n EffectReactivity.pausedQueueEffects.add(this);\n }\n });\n }\n private static pausedQueueEffects = new WeakSet<EffectReactivity>();\n\n /**\n * 执行当前节点。\n *\n * 当暂停时将会直接执行被包装的函数。\n */\n run(): void\n {\n if (this._isEnable)\n {\n super.run();\n }\n else\n {\n this._func(this._value);\n }\n }\n}\n\n/**\n * 维持反应式效果。\n */\nexport interface Effect\n{\n /**\n * 暂停。\n */\n pause: () => void;\n /**\n * 恢复。\n */\n resume: () => void;\n}\n","/**\n * 响应式标志枚举,用于标识响应式对象的特殊属性或状态\n */\nexport enum ReactiveFlags\n{\n IS_REACTIVE = '__v_isReactive', // 标识对象是否为响应式对象\n RAW = '__v_raw', // 获取对象的原始非响应式版本\n IS_REF = '__v_isRef', // 标识对象是否为 ref 对象\n}\n\nexport enum TargetType\n{\n INVALID = 0,\n COMMON = 1,\n COLLECTION = 2,\n}\n\n/**\n * 跟踪操作类型枚举,用于标识在响应式系统中对对象属性进行的操作类型\n */\nexport enum TrackOpTypes\n{\n GET = 'get', // 获取属性值\n HAS = 'has', // 检查属性是否存在\n ITERATE = 'iterate', // 遍历对象属性\n}\n\n/**\n * 触发操作类型枚举,用于标识在响应式系统中对对象属性进行的修改操作类型\n */\nexport enum TriggerOpTypes\n{\n SET = 'set', // 设置属性值\n ADD = 'add', // 添加新属性\n DELETE = 'delete', // 删除属性\n CLEAR = 'clear', // 清空对象属性\n}\n\nexport const ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Object iterate' : '');\nexport const MAP_KEY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Map keys iterate' : '');\nexport const ARRAY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Array iterate' : '');\n","/* eslint-disable no-var */\nimport { ReactiveFlags, TargetType } from './constants';\n\nexport { };\ndeclare global\n{\n /**\n * 是否为开发模式。\n */\n var __DEV__: boolean;\n}\nglobalThis.__DEV__ ??= true;\n\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object';\n// 判断是否为数组\nexport const isArray: typeof Array.isArray = Array.isArray;\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol';\nexport const isString = (val: unknown): val is string => typeof val === 'string';\nexport const isIntegerKey = (key: unknown): boolean =>\n isString(key)\n && key !== 'NaN'\n && key[0] !== '-'\n && `${parseInt(key as any, 10)}` === key;\nexport const isMap = (val: unknown): val is Map<any, any> =>\n toTypeString(val) === '[object Map]';\n\n// 判断对象是否拥有指定属性\nexport const hasOwn = (\n val: object,\n key: string | symbol,\n): key is keyof typeof val => Object.prototype.hasOwnProperty.call(val, key);\n\n// 比较两个值是否发生变化,考虑 NaN 的情况\nexport const hasChanged = (value: any, oldValue: any): boolean =>\n !Object.is(value, oldValue);\n\nfunction targetTypeMap(rawType: string)\n{\n switch (rawType)\n {\n case 'Object':\n case 'Array':\n return TargetType.COMMON;\n case 'Map':\n case 'Set':\n case 'WeakMap':\n case 'WeakSet':\n return TargetType.COLLECTION;\n default:\n return TargetType.COMMON;\n }\n}\n\nexport function getTargetType(value: Target)\n{\n if (!Object.isExtensible(value)) return TargetType.INVALID;\n\n return targetTypeMap(toRawType(value));\n}\n\nconst toTypeString = (value: unknown): string => Object.prototype.toString.call(value);\n\n// 获取值的原始类型\nexport const toRawType = (value: unknown): string =>\n\n // 从类似 \"[object RawType]\" 的字符串中提取 \"RawType\"\n toTypeString(value).slice(8, -1);\n\nexport interface Target\n{\n [ReactiveFlags.IS_REACTIVE]?: boolean\n [ReactiveFlags.RAW]?: any\n}\n\n/**\n * 将一个响应式对象转换为原始对象。\n * @param observed 响应式对象。\n * @returns 原始对象。\n */\nexport function toRaw<T>(observed: T): T\n{\n const raw = observed && (observed as Target)[ReactiveFlags.RAW];\n\n return raw ? toRaw(raw) : observed;\n}\n\nexport function warn(msg: string, ...args: any[]): void\n{\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\n/**\n * 创建一个映射,并返回一个用于检查键是否存在于该映射中的函数。\n * 重要提示:所有调用此函数的地方都必须以 \\/\\*#\\_\\_PURE\\_\\_\\*\\/ 作为前缀,\n * 以便在必要时 Rollup 可以进行 tree-shaking。\n */\n\n/* ! #__NO_SIDE_EFFECTS__ */\nexport function makeMap(str: string): (key: string) => boolean\n{\n // 创建一个空对象作为映射,使用 Object.create(null) 避免原型链上的属性干扰\n const map = Object.create(null);\n\n // 将输入的字符串按逗号分隔,遍历每个键并将其添加到映射中,值为 1\n for (const key of str.split(',')) map[key] = 1;\n\n // 返回一个函数,该函数接受一个键值,并检查该键是否存在于映射中\n return (val) => val in map;\n}\n","import { batchRun } from './batch';\nimport { Reactivity } from './Reactivity';\nimport { ARRAY_ITERATE_KEY, ITERATE_KEY, MAP_KEY_ITERATE_KEY, TrackOpTypes, TriggerOpTypes } from './shared/constants';\nimport { isArray, isIntegerKey, isMap, isSymbol } from './shared/general';\n\n/**\n * 反应式属性。\n *\n * @param target 对象。\n * @param key 属性\n * @returns 反应式属性。\n */\nfunction property<T, K extends keyof T>(target: T, key: K)\n{\n let depsMap = PropertyReactivity._targetMap.get(target);\n if (!depsMap)\n {\n depsMap = new Map();\n PropertyReactivity._targetMap.set(target, depsMap);\n }\n\n //\n let dep = depsMap.get(key);\n if (!dep)\n {\n dep = new PropertyReactivity(target, key);\n depsMap.set(key, dep);\n }\n\n return dep;\n}\n\n/**\n * 属性反应式节点。\n */\nexport class PropertyReactivity<T, K extends keyof T> extends Reactivity<T>\n{\n /**\n * 获取当前节点值。\n *\n * 取值时将会建立与父节点的依赖关系。\n */\n get value(): T\n {\n this.track();\n\n return this._value;\n }\n set value(v)\n {\n // 处理特殊字段,这些字段\n if (this._key === 'length')\n {\n v = this._target['length'];\n }\n else if (isSymbol(this._key))\n {\n v = ~~this._value + 1 as any;\n }\n if (v === this._value) return;\n // 触发属性的变化。\n this.trigger();\n this._value = v;\n }\n\n private _target: T;\n private _key: K;\n\n constructor(target: T, key: K)\n {\n super();\n this._target = target;\n this._key = key;\n if (target instanceof Map\n || target instanceof WeakMap\n )\n {\n this._value = (target as any as WeakMap<any, any>).get(key);\n }\n else if (target instanceof Set\n || target instanceof WeakSet\n )\n {\n this._value = (target as any as WeakSet<any>).has(key) as any;\n }\n else\n {\n this._value = (target as any)[key as any];\n }\n }\n\n triggerIfChanged()\n {\n\n }\n\n /**\n * 追踪属性的变化。\n *\n * 当属性被访问时,将会追踪属性的变化。\n *\n * @param target 目标对象。\n * @param key 属性名。\n * @returns\n */\n static track(target: object, type: TrackOpTypes, key: unknown): void\n {\n if (!Reactivity.activeReactivity) return;\n\n const dep = property(target as any, key as any);\n\n // 取值,建立依赖关系。\n dep.track();\n }\n /**\n * @private\n */\n static _targetMap: WeakMap<any, Map<any, PropertyReactivity<any, any>>> = new WeakMap();\n\n /**\n * 触发属性的变化。\n *\n * @param target 目标对象。\n * @param type 操作类型。\n * @param key 属性名。\n * @param newValue 新值。\n * @param oldValue 旧值。\n * @returns\n */\n static trigger(target: object, type: TriggerOpTypes, key?: unknown, newValue?: unknown, oldValue?: unknown): void\n {\n const depsMap = this._targetMap.get(target);\n if (!depsMap) return;\n\n const run = (dep: PropertyReactivity<any, any> | undefined) =>\n {\n if (dep)\n {\n // 触发属性的变化。\n dep.value = newValue;\n }\n };\n\n batchRun(() =>\n {\n if (type === TriggerOpTypes.CLEAR)\n {\n // collection being cleared\n // trigger all effects for target\n depsMap.forEach(run);\n }\n else\n {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n\n if (targetIsArray && key === 'length')\n {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key) =>\n {\n if (\n key === 'length'\n || key === ARRAY_ITERATE_KEY\n || (!isSymbol(key) && key >= newLength)\n )\n {\n run(dep);\n }\n });\n }\n else\n {\n // schedule runs for SET | ADD | DELETE\n if (key !== undefined || depsMap.has(undefined))\n {\n run(depsMap.get(key));\n }\n\n // schedule ARRAY_ITERATE for any numeric key change (length is handled above)\n if (isArrayIndex)\n {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n\n // also run for iteration key on ADD | DELETE | Map.SET\n switch (type)\n {\n case TriggerOpTypes.ADD:\n if (!targetIsArray)\n {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target))\n {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n else if (isArrayIndex)\n {\n // new index added to array -> length changes\n run(depsMap.get('length'));\n }\n break;\n case TriggerOpTypes.DELETE:\n if (!targetIsArray)\n {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target))\n {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case TriggerOpTypes.SET:\n if (isMap(target))\n {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n });\n }\n}\n","/* eslint-disable prefer-rest-params */\n\nimport { batchRun } from './batch';\nimport { noTrack } from './Reactivity';\nimport { PropertyReactivity } from './property';\nimport { isProxy, toReactive } from './reactive';\nimport { ARRAY_ITERATE_KEY, TrackOpTypes } from './shared/constants';\nimport { isArray, toRaw } from './shared/general';\n\nexport const arrayInstrumentations: Record<string | symbol, Function> = <any>{\n __proto__: null,\n\n /**\n * 返回一个迭代器,用于遍历数组的响应式值\n */\n [Symbol.iterator]()\n {\n return iterator(this, Symbol.iterator, toReactive);\n },\n\n /**\n * 连接数组并返回新数组,处理响应式数组\n */\n concat(...args: unknown[])\n {\n return reactiveReadArray(this).concat(\n ...args.map((x) => (isArray(x) ? reactiveReadArray(x) : x)),\n );\n },\n\n /**\n * 返回一个迭代器,用于遍历数组的键值对,并将值转换为响应式\n */\n entries()\n {\n return iterator(this, 'entries', (value: [number, unknown]) =>\n {\n value[1] = toReactive(value[1]);\n\n return value;\n });\n },\n\n /**\n * 测试数组中的所有元素是否都通过了指定函数的测试\n */\n every(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'every', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 创建一个新数组,包含通过指定函数测试的所有元素\n */\n filter(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'filter', fn, thisArg, (v) => v.map(toReactive), arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的第一个元素\n */\n find(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'find', fn, thisArg, toReactive, arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的第一个元素的索引\n */\n findIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'findIndex', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的最后一个元素\n */\n findLast(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'findLast', fn, thisArg, toReactive, arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的最后一个元素的索引\n */\n findLastIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'findLastIndex', fn, thisArg, undefined, arguments);\n },\n\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n\n /**\n * 对数组中的每个元素执行指定函数\n */\n forEach(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'forEach', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 判断数组是否包含指定元素,处理响应式值\n */\n includes(...args: unknown[])\n {\n return searchProxy(this, 'includes', args);\n },\n\n /**\n * 返回数组中指定元素第一次出现的索引,处理响应式值\n */\n indexOf(...args: unknown[])\n {\n return searchProxy(this, 'indexOf', args);\n },\n\n /**\n * 将数组的所有元素连接成一个字符串\n */\n join(separator?: string)\n {\n return reactiveReadArray(this).join(separator);\n },\n\n // keys() iterator only reads `length`, no optimisation required\n\n /**\n * 返回数组中指定元素最后一次出现的索引,处理响应式值\n */\n lastIndexOf(...args: unknown[])\n {\n return searchProxy(this, 'lastIndexOf', args);\n },\n\n /**\n * 创建一个新数组,包含对原数组每个元素调用指定函数的结果\n */\n map(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'map', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 移除数组的最后一个元素并返回该元素,避免跟踪长度变化\n */\n pop()\n {\n return noTracking(this, 'pop');\n },\n\n /**\n * 向数组末尾添加一个或多个元素,并返回新的长度,避免跟踪长度变化\n */\n push(...args: unknown[])\n {\n return noTracking(this, 'push', args);\n },\n\n /**\n * 对数组中的每个元素执行累加器函数,并返回最终结果\n */\n reduce(fn: (\n acc: unknown,\n item: unknown,\n index: number,\n array: unknown[],\n ) => unknown,\n ...args: unknown[]\n )\n {\n return reduce(this, 'reduce', fn, args);\n },\n\n /**\n * 从右到左对数组中的每个元素执行累加器函数,并返回最终结果\n */\n reduceRight(\n fn: (\n acc: unknown,\n item: unknown,\n index: number,\n array: unknown[],\n ) => unknown,\n ...args: unknown[]\n )\n {\n return reduce(this, 'reduceRight', fn, args);\n },\n\n /**\n * 移除数组的第一个元素并返回该元素,避免跟踪长度变化\n */\n shift()\n {\n return noTracking(this, 'shift');\n },\n\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n\n /**\n * 测试数组中的某些元素是否通过了指定函数的测试\n */\n some(\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'some', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 通过删除或替换现有元素或添加新元素来修改数组,避免跟踪长度变化\n */\n splice(...args: unknown[])\n {\n return noTracking(this, 'splice', args);\n },\n\n /**\n * 返回一个新数组,包含原数组的反转副本\n */\n toReversed()\n {\n // @ts-expect-error user code may run in es2016+\n return reactiveReadArray(this).toReversed();\n },\n\n /**\n * 返回一个新数组,包含原数组的排序副本\n */\n toSorted(comparer?: (a: unknown, b: unknown) => number)\n {\n // @ts-expect-error user code may run in es2016+\n return reactiveReadArray(this).toSorted(comparer);\n },\n\n /**\n * 返回一个新数组,包含原数组的切片副本\n */\n toSpliced(...args: unknown[])\n {\n // @ts-expect-error user code may run in es2016+\n return (reactiveReadArray(this).toSpliced as any)(...args);\n },\n\n /**\n * 向数组开头添加一个或多个元素,并返回新的长度,避免跟踪长度变化\n */\n unshift(...args: unknown[])\n {\n return noTracking(this, 'unshift', args);\n },\n\n /**\n * 返回一个迭代器,用于遍历数组的响应式值\n */\n values()\n {\n return iterator(this, 'values', toReactive);\n },\n};\n\n// instrument iterators to take ARRAY_ITERATE dependency\nfunction iterator(\n self: unknown[],\n method: keyof Array<unknown>,\n wrapValue: (value: any) => unknown,\n)\n{\n // note that taking ARRAY_ITERATE dependency here is not strictly equivalent\n // to calling iterate on the proxified array.\n // creating the iterator does not access any array property:\n // it is only when .next() is called that length and indexes are accessed.\n // pushed to the extreme, an iterator could be created in one effect scope,\n // partially iterated in another, then iterated more in yet another.\n // given that JS iterator can only be read once, this doesn't seem like\n // a plausible use-case, so this tracking simplification seems ok.\n const arr = shallowReadArray(self);\n const iter = (arr[method] as any)() as IterableIterator<unknown> & {\n _next: IterableIterator<unknown>['next']\n };\n if (arr !== self)\n {\n iter._next = iter.next;\n iter.next = () =>\n {\n const result = iter._next();\n if (result.value)\n {\n result.value = wrapValue(result.value);\n }\n\n return result;\n };\n }\n\n return iter;\n}\n\n/**\n * 跟踪数组的迭代操作并返回原始数组\n */\nfunction shallowReadArray<T>(arr: T[]): T[]\n{\n PropertyReactivity.track((arr = toRaw(arr)), TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\n\n return arr;\n}\n\nfunction reactiveReadArray<T>(array: T[]): T[]\n{\n const raw = toRaw(array);\n if (raw === array) return raw;\n PropertyReactivity.track(raw, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\n\n return raw.map(toReactive);\n}\n\n// in the codebase we enforce es2016, but user code may run in environments\n// higher than that\ntype ArrayMethods = keyof Array<any> | 'findLast' | 'findLastIndex';\n\n// instrument functions that read (potentially) all items\n// to take ARRAY_ITERATE dependency\nfunction apply(\n self: unknown[],\n method: ArrayMethods,\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n wrappedRetFn?: (result: any) => unknown,\n args?: IArguments,\n)\n{\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self;\n const methodFn = arr[method];\n\n // #11759\n // If the method being called is from a user-extended Array, the arguments will be unknown\n // (unknown order and unknown parameter types). In this case, we skip the shallowReadArray\n // handling and directly call apply with self.\n if (methodFn !== Array.prototype[method as any])\n {\n const result = methodFn.apply(self, args);\n\n return needsWrap ? toReactive(result) : result;\n }\n\n let wrappedFn = fn;\n if (arr !== self)\n {\n if (needsWrap)\n {\n wrappedFn = function (this: unknown, item, index)\n {\n return fn.call(this, toReactive(item), index, self);\n };\n }\n else if (fn.length > 2)\n {\n wrappedFn = function (this: unknown, item, index)\n {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\n\n// instrument reduce and reduceRight to take ARRAY_ITERATE dependency\nfunction reduce(\n self: unknown[],\n method: keyof Array<any>,\n fn: (acc: unknown, item: unknown, index: number, array: unknown[]) => unknown,\n args: unknown[],\n)\n{\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self)\n {\n wrappedFn = function (this: unknown, acc, item, index)\n {\n return fn.call(this, acc, toReactive(item), index, self);\n };\n }\n\n return (arr[method] as any)(wrappedFn, ...args);\n}\n\n// instrument identity-sensitive methods to account for reactive proxies\nfunction searchProxy(\n self: unknown[],\n method: keyof Array<any>,\n args: unknown[],\n)\n{\n const arr = toRaw(self) as any;\n PropertyReactivity.track(arr, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\n // we run the method using the original args first (which may be reactive)\n const res = arr[method](...args);\n\n // if that didn't work, run it again using raw values.\n if ((res === -1 || res === false) && isProxy(args[0]))\n {\n args[0] = toRaw(args[0]);\n\n return arr[method](...args);\n }\n\n return res;\n}\n\n// instrument length-altering mutation methods to avoid length being tracked\n// which leads to infinite loops in some cases (#2137)\nfunction noTracking(\n self: unknown[],\n method: keyof Array<any>,\n args: unknown[] = [],\n)\n{\n const res = batchRun(() =>\n noTrack(() =>\n (toRaw(self) as any)[method].apply(self, args)\n )\n );\n\n return res;\n}\n","import { batchRun } from './batch';\nimport { Reactivity } from './Reactivity';\nimport { toReactive } from './reactive';\nimport { ReactiveFlags } from './shared/constants';\nimport { hasChanged, toRaw } from './shared/general';\n\n/**\n * 创建一个引用,该引用的值可以被响应式系统追踪和更新。\n *\n * @param value 引用的值。\n * @returns 包含 value 属性的对象,用于获取和设置引用的值。\n */\nexport function ref<T>(value?: T): Ref<T>\n{\n if (isRef(value))\n {\n return value as any;\n }\n\n return new RefReactivity<T>(value) as any;\n}\n\n/**\n * 判断一个对象是否为引用。\n * @param r 引用。\n */\nexport function isRef<T>(r: Ref<T> | unknown): r is Ref<T>;\nexport function isRef(r: any): r is Ref\n{\n return r ? r[ReactiveFlags.IS_REF] === true : false;\n}\n\nexport interface RefReactivity<T = any> extends Ref<T> { }\n\n/**\n * 引用反应式节点。\n *\n * 当使用 ref 函数时,会创建一个 RefReactivity 对象。\n */\nexport class RefReactivity<T = any> extends Reactivity<T> implements Ref<T>\n{\n public readonly [ReactiveFlags.IS_REF] = true;\n\n get value()\n {\n this.track();\n\n return this._value;\n }\n\n set value(v: T)\n {\n const oldValue = this._rawValue;\n const newValue = toRaw(v);\n\n if (!hasChanged(oldValue, newValue)) return;\n\n batchRun(() =>\n {\n this.trigger();\n\n this._rawValue = newValue;\n this._value = toReactive(newValue);\n });\n }\n\n /**\n * 原始值。\n *\n * 用于比较值是否发生变化。\n */\n private _rawValue: T;\n\n constructor(value: T)\n {\n super();\n this._rawValue = toRaw(value);\n this._value = toReactive(value);\n }\n}\n\nexport interface Ref<T = any, S = T>\n{\n get value(): T\n set value(_: S)\n [RefSymbol]: true\n}\ndeclare const RefSymbol: unique symbol;\n","import { arrayInstrumentations } from './arrayInstrumentations';\nimport { reactive, reactiveMap } from './reactive';\nimport { isRef } from './ref';\nimport { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\nimport { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';\nimport { PropertyReactivity } from './property';\n\n/**\n * 基础响应式处理器。\n */\nclass BaseReactiveHandler implements ProxyHandler<Target>\n{\n /**\n * 获取对象的属性值。\n *\n * @param target 对象本身\n * @param key 属性名\n * @param receiver 代理对象\n * @returns\n */\n get(target: Target, key: string | symbol, receiver: object): any\n {\n //\n if (key === ReactiveFlags.IS_REACTIVE) // 判断是否为响应式对象\n {\n return true;\n }\n else if (key === ReactiveFlags.RAW) // 获取原始对象\n {\n if (\n receiver\n === reactiveMap.get(target)\n // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)\n )\n {\n return target;\n }\n // early return undefined\n\n return;\n }\n\n const targetIsArray = isArray(target);\n\n let fn: Function | undefined;\n if (targetIsArray && (fn = arrayInstrumentations[key]))\n {\n return fn;\n }\n if (key === 'hasOwnProperty')\n {\n return hasOwnProperty;\n }\n\n const res = Reflect.get(\n target,\n key,\n isRef(target) ? target : receiver,\n );\n\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))\n {\n return res;\n }\n\n //\n PropertyReactivity.track(target, TrackOpTypes.GET, key as any);\n\n // 如果是 ref,则返回 ref.value\n if (isRef(res))\n {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n\n // 如果是对象,则递归响应式化\n if (isObject(res))\n {\n return reactive(res);\n }\n\n return res;\n }\n}\n\n/**\n * 可变响应式处理器。\n */\nclass MutableReactiveHandler extends BaseReactiveHandler\n{\n /**\n * 设置对象的属性值。\n * @param target 被代理的对象。\n * @param key 属性名。\n * @param value 新值。\n * @param receiver 代理对象。\n * @returns 设置是否成功。\n */\n set(\n target: Record<string | symbol, unknown>,\n key: string | symbol,\n value: unknown,\n receiver: object,\n ): boolean\n {\n let oldValue = target[key];\n\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n\n if (!isArray(target) && isRef(oldValue) && !isRef(value))\n {\n oldValue.value = value;\n\n return true;\n }\n\n const hadKey\n = isArray(target) && isIntegerKey(key)\n ? Number(key) < target.length\n : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver,\n );\n //\n __DEV__ && console.assert(target === toRaw(receiver));\n\n // 如果目标在原始原型链中,则不要触发\n if (target === toRaw(receiver))\n {\n if (!hadKey)\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\n }\n else if (hasChanged(value, oldValue))\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\n }\n }\n\n return result;\n }\n\n /**\n * 删除对象的属性。\n *\n * @param target 被代理的对象。\n * @param key 属性名。\n * @returns 删除是否成功。\n */\n deleteProperty(\n target: Record<string | symbol, unknown>,\n key: string | symbol,\n ): boolean\n {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey)\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\n }\n\n return result;\n }\n\n has(target: Record<string | symbol, unknown>, key: string | symbol): boolean\n {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key))\n {\n PropertyReactivity.track(target, TrackOpTypes.HAS, key);\n }\n\n return result;\n }\n\n ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]\n {\n PropertyReactivity.track(\n target,\n TrackOpTypes.ITERATE,\n isArray(target) ? 'length' : ITERATE_KEY,\n );\n\n return Reflect.ownKeys(target);\n }\n}\n\n/**\n * 可变响应式处理器。\n */\nexport const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();\n\nfunction hasOwnProperty(this: object, key: unknown)\n{\n // #10455 hasOwnProperty may be called with non-string values\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n PropertyReactivity.track(obj, TrackOpTypes.HAS, key);\n\n return obj.hasOwnProperty(key as string);\n}\n\nconst builtInSymbols = new Set(\n /* @__PURE__*/\n Object.getOwnPropertyNames(Symbol)\n // ios10.x Object.getOwnPropertyNames(Symbol) can enumerate 'arguments' and 'caller'\n // but accessing them on Symbol leads to TypeError because Symbol is a strict mode\n // function\n .filter((key) => key !== 'arguments' && key !== 'caller')\n .map((key) => Symbol[key as keyof SymbolConstructor])\n .filter(isSymbol),\n);\n\nconst isNonTrackableKeys = /* @__PURE__*/ makeMap(`__proto__,__v_isRef,__isVue`);\n","import { toReactive } from './reactive';\nimport { ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\nimport { hasChanged, hasOwn, isMap, Target, toRaw, toRawType, warn } from './shared/general';\nimport { PropertyReactivity } from './property';\n\nexport const mutableCollectionHandlers: ProxyHandler<CollectionTypes> = {\n get: createInstrumentationGetter(),\n};\n\nfunction createInstrumentationGetter()\n{\n const instrumentations = createInstrumentations();\n\n return (\n target: CollectionTypes,\n key: string | symbol,\n receiver: CollectionTypes,\n ) =>\n {\n if (key === ReactiveFlags.IS_REACTIVE)\n {\n return true;\n }\n else if (key === ReactiveFlags.RAW)\n {\n return target;\n }\n\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target\n ? instrumentations\n : target,\n key,\n receiver,\n );\n };\n}\n\ntype Instrumentations = Record<string | symbol, Function | number>;\n\nfunction createInstrumentations(): Instrumentations\n{\n const instrumentations: Instrumentations = {\n get(this: MapTypes, key: unknown)\n {\n // #1772: readonly(reactive(Map)) should return readonly + reactive version\n // of the value\n const target = this[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n\n if (hasChanged(key, rawKey))\n {\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, key);\n }\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, rawKey);\n\n const { has } = getProto(rawTarget);\n const wrap = toReactive;\n if (has.call(rawTarget, key))\n {\n return wrap(target.get(key));\n }\n else if (has.call(rawTarget, rawKey))\n {\n return wrap(target.get(rawKey));\n }\n else if (target !== rawTarget)\n {\n // #3602 readonly(reactive(Map))\n // ensure that the nested reactive `Map` can do tracking for itself\n target.get(key);\n }\n },\n get size()\n {\n const target = (this as unknown as IterableCollections)[ReactiveFlags.RAW];\n PropertyReactivity.track(toRaw(target), TrackOpTypes.ITERATE, ITERATE_KEY);\n\n return Reflect.get(target, 'size', target);\n },\n has(this: CollectionTypes, key: unknown): boolean\n {\n const target = this[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n\n if (hasChanged(key, rawKey))\n {\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, key);\n }\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, rawKey);\n\n return key === rawKey\n ? target.has(key)\n : target.has(key) || target.has(rawKey);\n },\n forEach(this: IterableCollections, callback: Function, thisArg?: unknown)\n {\n const observed = this;\n const target = observed[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const wrap = toReactive;\n PropertyReactivity.track(rawTarget, TrackOpTypes.ITERATE, ITERATE_KEY);\n\n return target.forEach((value: unknown, key: unknown) =>\n\n // important: make sure the callback is\n // 1. invoked with the reactive map as `this` and 3rd arg\n // 2. the value received should be a corresponding reactive/readonly.\n callback.call(thisArg, wrap(value), wrap(key), observed)\n );\n },\n\n add(this: SetTypes, value: unknown)\n {\n value = toRaw(value);\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey)\n {\n target.add(value);\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, value, value);\n }\n\n return this;\n },\n set(this: MapTypes, key: unknown, value: unknown)\n {\n value = toRaw(value);\n const target = toRaw(this);\n const { has, get } = getProto(target);\n\n let hadKey = has.call(target, key);\n if (!hadKey)\n {\n key = toRaw(key);\n hadKey = has.call(target, key);\n }\n else if (__DEV__)\n {\n checkIdentityKeys(target, has, key);\n }\n\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey)\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\n }\n else if (hasChanged(value, oldValue))\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\n }\n\n return this;\n },\n delete(this: CollectionTypes, key: unknown)\n {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey)\n {\n key = toRaw(key);\n hadKey = has.call(target, key);\n }\n else if (__DEV__)\n {\n checkIdentityKeys(target, has, key);\n }\n\n const oldValue = get ? get.call(target, key) : undefined;\n // forward the operation before queueing reactions\n const result = target.delete(key);\n if (hadKey)\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\n }\n\n return result;\n },\n clear(this: IterableCollections)\n {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = __DEV__\n ? isMap(target)\n ? new Map(target)\n : new Set(target)\n : undefined;\n // forward the operation before queueing reactions\n const result = target.clear();\n if (hadItems)\n {\n PropertyReactivity.trigger(\n target,\n TriggerOpTypes.CLEAR,\n undefined,\n undefined,\n oldTarget,\n );\n }\n\n return result;\n },\n };\n\n const iteratorMethods = [\n 'keys',\n 'values',\n 'entries',\n Symbol.iterator,\n ] as const;\n\n iteratorMethods.forEach((method) =>\n {\n instrumentations[method] = createIterableMethod(method);\n });\n\n return instrumentations;\n}\n\nfunction createIterableMethod(method: string | symbol)\n{\n return function (\n this: IterableCollections,\n ...args: unknown[]\n ): Iterable<unknown> & Iterator<unknown>\n {\n const target = this[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair\n = method === 'entries' || (method === Symbol.iterator && targetIsMap);\n const isKeyOnly = method === 'keys' && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = toReactive;\n\n PropertyReactivity.track(\n rawTarget,\n TrackOpTypes.ITERATE,\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY,\n );\n\n // return a wrapped iterator which returns observed versions of the\n // values emitted from the real iterator\n return {\n // iterator protocol\n next()\n {\n const { value, done } = innerIterator.next();\n\n return done\n ? { value, done }\n : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done,\n };\n },\n // iterable protocol\n [Symbol.iterator]()\n {\n return this;\n },\n };\n };\n}\n\nfunction checkIdentityKeys(\n target: CollectionTypes,\n has: (key: unknown) => boolean,\n key: unknown,\n)\n{\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey))\n {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive `\n + `versions of the same object${type === `Map` ? ` as keys` : ``}, `\n + `which can lead to inconsistencies. `\n + `Avoid differentiating between the raw and reactive versions `\n + `of an object and only use the reactive version if possible.`,\n );\n }\n}\n\nconst getProto = <T extends CollectionTypes>(v: T): any => Reflect.getPrototypeOf(v);\n\ntype CollectionTypes = IterableCollections | WeakCollections;\n\ntype IterableCollections = (Map<any, any> | Set<any>) & Target;\ntype WeakCollections = (WeakMap<any, any> | WeakSet<any>) & Target;\ntype MapTypes = (Map<any, any> | WeakMap<any, any>) & Target;\ntype SetTypes = (Set<any> | WeakSet<any>) & Target;\n","import { mutableHandlers } from './baseHandlers';\nimport { mutableCollectionHandlers } from './collectionHandlers';\nimport { Computed } from './computed';\nimport { Ref } from './ref';\nimport { ReactiveFlags, TargetType } from './shared/constants';\nimport { getTargetType, isObject, Target } from './shared/general';\n\n/**\n * 移除对象属性中的 readonly 关键字。\n */\ntype UnReadonly<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * 创建或者获取响应式对象的代理对象。\n *\n * @param target 被响应式的对象。\n * @returns 响应式代理对象。\n *\n * 注意:\n *\n * 1. 扩大被反应式的对象的类型范围,只有`Object.isExtensible`不通过的对象不被响应化。Float32Array等都允许被响应化。\n * 2. 被反应式的对象的只读属性也会被标记为可编辑。希望被反应对象属性一般为只读属性,通过反应式来改变属性值,同时又通过反应式系统来处理其更改后响应逻辑。\n *\n */\nexport function reactive<T extends object>(target: T): UnReadonly<Reactive<T>>\n{\n if (!isObject(target))\n {\n return target;\n }\n\n if (target[ReactiveFlags.RAW])\n {\n return target as any;\n }\n\n // only specific value types can be observed.\n const targetType = getTargetType(target);\n if (targetType === TargetType.INVALID)\n {\n return target as any;\n }\n\n // target already has corresponding Proxy\n const existingProxy = reactiveMap.get(target);\n if (existingProxy)\n {\n return existingProxy;\n }\n\n const proxy = new Proxy<T>(\n target,\n targetType === TargetType.COLLECTION ? mutableCollectionHandlers : mutableHandlers as any,\n ) as T;\n reactiveMap.set(target, proxy);\n\n return proxy as any;\n}\nexport const reactiveMap = new WeakMap<Target, any>();\n\n/**\n * 判断一个对象是否为响应式对象。\n *\n * @param value 对象。\n * @returns\n */\nexport function isReactive(value: unknown): boolean\n{\n return !!(value && (value as Target)[ReactiveFlags.IS_REACTIVE]);\n}\n\n/**\n * 转换为响应式对象。\n *\n * @param value 对象。\n * @returns\n */\nexport const toReactive = <T>(value: T): T =>\n{\n if (isObject(value))\n {\n return reactive(value as any) as any;\n }\n\n return value;\n};\n\n/**\n * 判断一个对象是否为代理对象。\n *\n * @param value 对象。\n * @returns\n */\nexport function isProxy(value: any): boolean\n{\n return value ? !!value[ReactiveFlags.RAW] : false;\n}\n\nexport type Reactive<T> = UnwrapRefSimple<T>;\n\n/**\n * 原始类型\n */\ntype Primitive = string | number | boolean | bigint | symbol | undefined | null;\n/**\n * 内置类型\n */\nexport type Builtin = Primitive | Function | Date | Error | RegExp;\n\n/**\n * 用于扩展不被 unwrap 的类型。\n *\n * ``` ts\n * declare module '@vue/reactivity' {\n * export interface RefUnwrapBailTypes {\n * runtimeDOMBailTypes: Node | Window\n * }\n * }\n * ```\n */\nexport interface RefUnwrapBailTypes { }\n\n/**\n * 解包类型。\n */\nexport type UnwrapRefSimple<T> =\n T extends\n | Builtin\n | Ref\n | RefUnwrapBailTypes[keyof RefUnwrapBailTypes]\n ? T :\n T extends Ref<infer TT> ? TT :\n T extends Computed<infer TT> ? TT :\n T extends object ? {\n [K in keyof T]: UnwrapRefSimple<T[K]>\n } :\n T;\n"],"names":["_EffectReactivity","ReactiveFlags","TargetType","TrackOpTypes","TriggerOpTypes","key","self","result"],"mappings":"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"}
|
package/lib/computed.d.ts
CHANGED
|
@@ -56,17 +56,19 @@ export declare class ComputedReactivity<T = any> extends Reactivity<T> {
|
|
|
56
56
|
* @private
|
|
57
57
|
*/
|
|
58
58
|
_version: number;
|
|
59
|
+
/**
|
|
60
|
+
* 获取值。
|
|
61
|
+
*
|
|
62
|
+
* 取值时将会建立与父节点的依赖关系。
|
|
63
|
+
*
|
|
64
|
+
* 同时会检查子节点是否发生变化,如果发生变化,则重新计算。
|
|
65
|
+
*/
|
|
66
|
+
get value(): T;
|
|
59
67
|
/**
|
|
60
68
|
* 创建计算依赖。
|
|
61
69
|
* @param func 检测的可能包含响应式的函数。
|
|
62
70
|
*/
|
|
63
71
|
constructor(func: (oldValue?: T) => T);
|
|
64
|
-
/**
|
|
65
|
-
* 捕捉。
|
|
66
|
-
*
|
|
67
|
-
* 建立与父节点的依赖关系。
|
|
68
|
-
*/
|
|
69
|
-
track(): void;
|
|
70
72
|
/**
|
|
71
73
|
* 触发。
|
|
72
74
|
*
|
package/lib/computed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAc,MAAM,cAAc,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAGlE;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,GAAG;IAE7B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,CAAC,cAAc,CAAC,EAAE,IAAI,CAAA;CACzB;AACD,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAE5C,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;CAAI;AAEpE;;;;;;GAMG;AACH,qBAAa,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IAE1D;;OAEG;IACH,QAAQ,CAAC,SAAS,QAAQ;IAE1B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAErC;;;;OAIG;IACH,SAAS,4BAA8B;IAEvC;;;;;;OAMG;IACH,QAAQ,UAAQ;IAEhB;;;;;;OAMG;IACH,QAAQ,SAAM;IAEd;;;;;;OAMG;IACH,IAAI,KAAK,IAAI,CAAC,CAOb;IAED;;;OAGG;gBACS,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;IAMrC;;;;;;OAMG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACH,GAAG;IAkBH;;;;OAIG;IACH,UAAU;IAgBV;;OAEG;IACH,SAAS,CAAC,iBAAiB;CAyC9B"}
|
package/lib/property.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAuD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA8BvH;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IAEvE;;;;OAIG;IACH,IAAI,KAAK,IAAI,CAAC,CAKb;IACD,IAAI,KAAK,CAAC,CAAC,EANE,CAMF,EAeV;IAED,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAAI;gBAEJ,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAuB7B,gBAAgB;IAKhB;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAuD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA8BvH;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IAEvE;;;;OAIG;IACH,IAAI,KAAK,IAAI,CAAC,CAKb;IACD,IAAI,KAAK,CAAC,CAAC,EANE,CAMF,EAeV;IAED,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAAI;gBAEJ,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAuB7B,gBAAgB;IAKhB;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IASpE;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAiB;IAExF;;;;;;;;;OASG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;CA+FpH"}
|
package/lib/reactive.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { Computed } from './computed';
|
|
2
2
|
import { Ref } from './ref';
|
|
3
3
|
import { Target } from './shared/general';
|
|
4
|
+
/**
|
|
5
|
+
* 移除对象属性中的 readonly 关键字。
|
|
6
|
+
*/
|
|
7
|
+
type UnReadonly<T> = {
|
|
8
|
+
-readonly [P in keyof T]: T[P];
|
|
9
|
+
};
|
|
4
10
|
/**
|
|
5
11
|
* 创建或者获取响应式对象的代理对象。
|
|
6
12
|
*
|
|
@@ -9,9 +15,11 @@ import { Target } from './shared/general';
|
|
|
9
15
|
*
|
|
10
16
|
* 注意:
|
|
11
17
|
*
|
|
12
|
-
* 扩大被反应式的对象的类型范围,只有`Object.isExtensible`不通过的对象不被响应化。Float32Array等都允许被响应化。
|
|
18
|
+
* 1. 扩大被反应式的对象的类型范围,只有`Object.isExtensible`不通过的对象不被响应化。Float32Array等都允许被响应化。
|
|
19
|
+
* 2. 被反应式的对象的只读属性也会被标记为可编辑。希望被反应对象属性一般为只读属性,通过反应式来改变属性值,同时又通过反应式系统来处理其更改后响应逻辑。
|
|
20
|
+
*
|
|
13
21
|
*/
|
|
14
|
-
export declare function reactive<T extends object>(target: T): Reactive<T
|
|
22
|
+
export declare function reactive<T extends object>(target: T): UnReadonly<Reactive<T>>;
|
|
15
23
|
export declare const reactiveMap: WeakMap<Target, any>;
|
|
16
24
|
/**
|
|
17
25
|
* 判断一个对象是否为响应式对象。
|
package/lib/reactive.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAA2B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnE
|
|
1
|
+
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAA2B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;GAEG;AACH,KAAK,UAAU,CAAC,CAAC,IAAI;IACjB,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAiC7E;AACD,eAAO,MAAM,WAAW,sBAA6B,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGlD;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,oBAQtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAG3C;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;AAE7C;;GAEG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAChF;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;CAAI;AAEvC;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB,CAAC,SACC,OAAO,GACP,GAAG,GACH,kBAAkB,CAAC,MAAM,kBAAkB,CAAC,GAC5C,CAAC,GACH,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAC5B,CAAC,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GACjC,CAAC,SAAS,MAAM,GAAG;KACd,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,GACD,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@feng3d/reactivity",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
5
|
-
"description": "反应式",
|
|
6
|
-
"homepage": "https://feng3d.com/reactivity",
|
|
7
|
-
"main": "./dist/index.umd.cjs",
|
|
8
|
-
"types": "./lib/index.d.ts",
|
|
9
|
-
"module": "./dist/index.js",
|
|
10
|
-
"author": "feng",
|
|
11
|
-
"license": "MIT",
|
|
12
|
-
"exports": {
|
|
13
|
-
".": {
|
|
14
|
-
"import": "./dist/index.js",
|
|
15
|
-
"require": "./dist/index.umd.cjs",
|
|
16
|
-
"types": "./lib/index.d.ts"
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"scripts": {
|
|
20
|
-
"dev": "cd examples && npm run dev",
|
|
21
|
-
"clean": "rimraf \"{lib,dist,public}\"",
|
|
22
|
-
"build": "vite build",
|
|
23
|
-
"test": "vitest",
|
|
24
|
-
"test:ui": "vitest --ui",
|
|
25
|
-
"types": "tsc",
|
|
26
|
-
"watch": "tsc -w",
|
|
27
|
-
"lint": "eslint --ext .js --ext .ts src test --ignore-path .gitignore --max-warnings 0",
|
|
28
|
-
"lintfix": "npm run lint -- --fix",
|
|
29
|
-
"docs": "typedoc && cd examples && vite build --outDir ../public",
|
|
30
|
-
"upload_oss": "npm run docs && feng3d-cli oss_upload_dir",
|
|
31
|
-
"release": "npm run clean && npm run lint && npm run build && npm run docs && npm run types && npm publish",
|
|
32
|
-
"prepublishOnly": "node scripts/prepublish.js",
|
|
33
|
-
"postpublish": "node scripts/postpublish.js"
|
|
34
|
-
},
|
|
35
|
-
"repository": {
|
|
36
|
-
"type": "git",
|
|
37
|
-
"url": "https://
|
|
38
|
-
},
|
|
39
|
-
"workspaces": [
|
|
40
|
-
".",
|
|
41
|
-
"./examples"
|
|
42
|
-
],
|
|
43
|
-
"publishConfig": {
|
|
44
|
-
"access": "public"
|
|
45
|
-
},
|
|
46
|
-
"files": [
|
|
47
|
-
"dist/",
|
|
48
|
-
"lib",
|
|
49
|
-
"src",
|
|
50
|
-
"readme",
|
|
51
|
-
"tsconfig.json"
|
|
52
|
-
],
|
|
53
|
-
"devDependencies": {
|
|
54
|
-
"@feng3d/cli": "^0.0.19",
|
|
55
|
-
"@typescript-eslint/eslint-plugin": "5.17.0",
|
|
56
|
-
"@typescript-eslint/parser": "5.17.0",
|
|
57
|
-
"@vitest/ui": "^0.32.2",
|
|
58
|
-
"cross-env": "7.0.3",
|
|
59
|
-
"eslint": "8.12.0",
|
|
60
|
-
"rimraf": "3.0.2",
|
|
61
|
-
"tslib": "^2.4.0",
|
|
62
|
-
"typedoc": "^0.24.8",
|
|
63
|
-
"typescript": "5.1.3",
|
|
64
|
-
"vite": "^4.3.9",
|
|
65
|
-
"vitest": "^0.32.2"
|
|
66
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@feng3d/reactivity",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.5",
|
|
5
|
+
"description": "反应式",
|
|
6
|
+
"homepage": "https://feng3d.com/reactivity",
|
|
7
|
+
"main": "./dist/index.umd.cjs",
|
|
8
|
+
"types": "./lib/index.d.ts",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"author": "feng",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.umd.cjs",
|
|
16
|
+
"types": "./lib/index.d.ts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "cd examples && npm run dev",
|
|
21
|
+
"clean": "rimraf \"{lib,dist,public}\"",
|
|
22
|
+
"build": "vite build",
|
|
23
|
+
"test": "vitest",
|
|
24
|
+
"test:ui": "vitest --ui",
|
|
25
|
+
"types": "tsc",
|
|
26
|
+
"watch": "tsc -w",
|
|
27
|
+
"lint": "eslint --ext .js --ext .ts src test --ignore-path .gitignore --max-warnings 0",
|
|
28
|
+
"lintfix": "npm run lint -- --fix",
|
|
29
|
+
"docs": "typedoc && cd examples && vite build --outDir ../public",
|
|
30
|
+
"upload_oss": "npm run docs && feng3d-cli oss_upload_dir",
|
|
31
|
+
"release": "npm run clean && npm run lint && npm run build && npm run docs && npm run types && npm publish",
|
|
32
|
+
"prepublishOnly": "node scripts/prepublish.js",
|
|
33
|
+
"postpublish": "node scripts/postpublish.js"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/feng3d-labs/reactivity.git"
|
|
38
|
+
},
|
|
39
|
+
"workspaces": [
|
|
40
|
+
".",
|
|
41
|
+
"./examples"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist/",
|
|
48
|
+
"lib",
|
|
49
|
+
"src",
|
|
50
|
+
"readme",
|
|
51
|
+
"tsconfig.json"
|
|
52
|
+
],
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@feng3d/cli": "^0.0.19",
|
|
55
|
+
"@typescript-eslint/eslint-plugin": "5.17.0",
|
|
56
|
+
"@typescript-eslint/parser": "5.17.0",
|
|
57
|
+
"@vitest/ui": "^0.32.2",
|
|
58
|
+
"cross-env": "7.0.3",
|
|
59
|
+
"eslint": "8.12.0",
|
|
60
|
+
"rimraf": "3.0.2",
|
|
61
|
+
"tslib": "^2.4.0",
|
|
62
|
+
"typedoc": "^0.24.8",
|
|
63
|
+
"typescript": "5.1.3",
|
|
64
|
+
"vite": "^4.3.9",
|
|
65
|
+
"vitest": "^0.32.2"
|
|
66
|
+
}
|
|
67
67
|
}
|