wevu 7.2.2 → 7.4.0

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.
Files changed (383) hide show
  1. package/README.md +6 -0
  2. package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/defineProperty.mjs +1 -1
  3. package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPrimitive.mjs +1 -1
  4. package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPropertyKey.mjs +1 -1
  5. package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/typeof.mjs +1 -1
  6. package/dist/dev/internal-runtime.d.mts +2 -1
  7. package/dist/dev/internal-runtime.mjs +3 -2
  8. package/dist/dev/package.mjs +1 -1
  9. package/dist/dev/reactivity/asyncDerivation.mjs +8 -10
  10. package/dist/dev/reactivity/asyncDerivation.mjs.map +1 -1
  11. package/dist/dev/reactivity/core.mjs +5 -8
  12. package/dist/dev/reactivity/core.mjs.map +1 -1
  13. package/dist/dev/reactivity/reactive/patch.mjs +3 -3
  14. package/dist/dev/reactivity/reactive/patch.mjs.map +1 -1
  15. package/dist/dev/reactivity/reactive/patchState.mjs +4 -8
  16. package/dist/dev/reactivity/reactive/patchState.mjs.map +1 -1
  17. package/dist/dev/reactivity/reactive/shared.mjs +1 -2
  18. package/dist/dev/reactivity/reactive/shared.mjs.map +1 -1
  19. package/dist/dev/reactivity/reactive.mjs +5 -10
  20. package/dist/dev/reactivity/reactive.mjs.map +1 -1
  21. package/dist/dev/reactivity/ref.mjs +2 -2
  22. package/dist/dev/reactivity/ref.mjs.map +1 -1
  23. package/dist/dev/reactivity/shallowRef.mjs +1 -1
  24. package/dist/dev/reactivity/shallowRef.mjs.map +1 -1
  25. package/dist/dev/reactivity/watch/helpers.mjs +1 -1
  26. package/dist/dev/reactivity/watch/helpers.mjs.map +1 -1
  27. package/dist/dev/reactivity/watch.mjs +6 -8
  28. package/dist/dev/reactivity/watch.mjs.map +1 -1
  29. package/dist/dev/router/createRouter.mjs +17 -24
  30. package/dist/dev/router/createRouter.mjs.map +1 -1
  31. package/dist/dev/router/initialNavigation.mjs +22 -17
  32. package/dist/dev/router/initialNavigation.mjs.map +1 -1
  33. package/dist/dev/router/instance.mjs +1 -2
  34. package/dist/dev/router/instance.mjs.map +1 -1
  35. package/dist/dev/router/navigationCore.mjs +2 -2
  36. package/dist/dev/router/navigationCore.mjs.map +1 -1
  37. package/dist/dev/router/navigationResult.mjs +7 -10
  38. package/dist/dev/router/navigationResult.mjs.map +1 -1
  39. package/dist/dev/router/navigationTarget.mjs +1 -3
  40. package/dist/dev/router/navigationTarget.mjs.map +1 -1
  41. package/dist/dev/router/resolve.mjs +3 -4
  42. package/dist/dev/router/resolve.mjs.map +1 -1
  43. package/dist/dev/router/routeRegistry.mjs +1 -1
  44. package/dist/dev/router/routeRegistry.mjs.map +1 -1
  45. package/dist/dev/router/routeSync.mjs +1 -1
  46. package/dist/dev/router/routeSync.mjs.map +1 -1
  47. package/dist/dev/router/scrollRestoration/adapters.d.mts +8 -0
  48. package/dist/dev/router/scrollRestoration/adapters.mjs +86 -0
  49. package/dist/dev/router/scrollRestoration/adapters.mjs.map +1 -0
  50. package/dist/dev/router/scrollRestoration/controller.d.mts +8 -0
  51. package/dist/dev/router/scrollRestoration/controller.mjs +148 -0
  52. package/dist/dev/router/scrollRestoration/controller.mjs.map +1 -0
  53. package/dist/dev/router/scrollRestoration/host.d.mts +3 -0
  54. package/dist/dev/router/scrollRestoration/host.mjs +76 -0
  55. package/dist/dev/router/scrollRestoration/host.mjs.map +1 -0
  56. package/dist/dev/router/scrollRestoration/index.d.mts +9 -0
  57. package/dist/dev/router/scrollRestoration/index.mjs +156 -0
  58. package/dist/dev/router/scrollRestoration/index.mjs.map +1 -0
  59. package/dist/dev/router/scrollRestoration/types.d.mts +61 -0
  60. package/dist/dev/router/useRoute.mjs +12 -19
  61. package/dist/dev/router/useRoute.mjs.map +1 -1
  62. package/dist/dev/router.d.mts +5 -1
  63. package/dist/dev/router.mjs +4 -1
  64. package/dist/dev/routerInternal/location.mjs +2 -3
  65. package/dist/dev/routerInternal/location.mjs.map +1 -1
  66. package/dist/dev/routerInternal/params.mjs +2 -3
  67. package/dist/dev/routerInternal/params.mjs.map +1 -1
  68. package/dist/dev/routerInternal/records.mjs +1 -1
  69. package/dist/dev/routerInternal/records.mjs.map +1 -1
  70. package/dist/dev/routerInternal/recordsWarnings.mjs +1 -2
  71. package/dist/dev/routerInternal/recordsWarnings.mjs.map +1 -1
  72. package/dist/dev/runtime/app/context.mjs +13 -26
  73. package/dist/dev/runtime/app/context.mjs.map +1 -1
  74. package/dist/dev/runtime/app/diagnostics.mjs +2 -4
  75. package/dist/dev/runtime/app/diagnostics.mjs.map +1 -1
  76. package/dist/dev/runtime/app/mount.mjs +27 -33
  77. package/dist/dev/runtime/app/mount.mjs.map +1 -1
  78. package/dist/dev/runtime/app/setData/commitTracker.mjs +5 -9
  79. package/dist/dev/runtime/app/setData/commitTracker.mjs.map +1 -1
  80. package/dist/dev/runtime/app/setData/patchScheduler.mjs +2 -4
  81. package/dist/dev/runtime/app/setData/patchScheduler.mjs.map +1 -1
  82. package/dist/dev/runtime/app/setData/payload.mjs +2 -3
  83. package/dist/dev/runtime/app/setData/payload.mjs.map +1 -1
  84. package/dist/dev/runtime/app/setData/scheduler.mjs +7 -9
  85. package/dist/dev/runtime/app/setData/scheduler.mjs.map +1 -1
  86. package/dist/dev/runtime/app/setData/snapshot.mjs +5 -6
  87. package/dist/dev/runtime/app/setData/snapshot.mjs.map +1 -1
  88. package/dist/dev/runtime/app/setDataOptions.mjs +26 -27
  89. package/dist/dev/runtime/app/setDataOptions.mjs.map +1 -1
  90. package/dist/dev/runtime/app.mjs +9 -9
  91. package/dist/dev/runtime/app.mjs.map +1 -1
  92. package/dist/dev/runtime/bindingManifest.mjs +6 -14
  93. package/dist/dev/runtime/bindingManifest.mjs.map +1 -1
  94. package/dist/dev/runtime/capabilities.d.mts +4 -1
  95. package/dist/dev/runtime/capabilities.mjs.map +1 -1
  96. package/dist/dev/runtime/css.mjs +4 -8
  97. package/dist/dev/runtime/css.mjs.map +1 -1
  98. package/dist/dev/runtime/defaults.mjs +4 -4
  99. package/dist/dev/runtime/defaults.mjs.map +1 -1
  100. package/dist/dev/runtime/define/initialComputed.mjs +5 -5
  101. package/dist/dev/runtime/define/initialComputed.mjs.map +1 -1
  102. package/dist/dev/runtime/define/options.mjs +10 -12
  103. package/dist/dev/runtime/define/options.mjs.map +1 -1
  104. package/dist/dev/runtime/define/props.mjs +4 -5
  105. package/dist/dev/runtime/define/props.mjs.map +1 -1
  106. package/dist/dev/runtime/define/scopedSlotOptions.mjs +43 -61
  107. package/dist/dev/runtime/define/scopedSlotOptions.mjs.map +1 -1
  108. package/dist/dev/runtime/define/setupResult.mjs +17 -28
  109. package/dist/dev/runtime/define/setupResult.mjs.map +1 -1
  110. package/dist/dev/runtime/define.mjs +9 -12
  111. package/dist/dev/runtime/define.mjs.map +1 -1
  112. package/dist/dev/runtime/diff.mjs +9 -11
  113. package/dist/dev/runtime/diff.mjs.map +1 -1
  114. package/dist/dev/runtime/disposables.mjs +2 -2
  115. package/dist/dev/runtime/disposables.mjs.map +1 -1
  116. package/dist/dev/runtime/elementIntersectionObserver.mjs +16 -24
  117. package/dist/dev/runtime/elementIntersectionObserver.mjs.map +1 -1
  118. package/dist/dev/runtime/features/inlineEvents.mjs +2 -3
  119. package/dist/dev/runtime/features/inlineEvents.mjs.map +1 -1
  120. package/dist/dev/runtime/features/jsxIslands.d.mts +7 -0
  121. package/dist/dev/runtime/features/jsxIslands.mjs +20 -0
  122. package/dist/dev/runtime/features/jsxIslands.mjs.map +1 -0
  123. package/dist/dev/runtime/features/layout.mjs +2 -3
  124. package/dist/dev/runtime/features/layout.mjs.map +1 -1
  125. package/dist/dev/runtime/features/publicLayout.mjs +2 -6
  126. package/dist/dev/runtime/features/publicLayout.mjs.map +1 -1
  127. package/dist/dev/runtime/features/scopedSlots.mjs +5 -9
  128. package/dist/dev/runtime/features/scopedSlots.mjs.map +1 -1
  129. package/dist/dev/runtime/features/templateRefs.mjs +1 -1
  130. package/dist/dev/runtime/features/templateRefs.mjs.map +1 -1
  131. package/dist/dev/runtime/hooks/base.mjs +20 -43
  132. package/dist/dev/runtime/hooks/base.mjs.map +1 -1
  133. package/dist/dev/runtime/hooks/pageScroll.mjs +41 -0
  134. package/dist/dev/runtime/hooks/pageScroll.mjs.map +1 -0
  135. package/dist/dev/runtime/hooks/register.mjs +2 -1
  136. package/dist/dev/runtime/hooks/register.mjs.map +1 -1
  137. package/dist/dev/runtime/inlineDataset.mjs +1 -2
  138. package/dist/dev/runtime/inlineDataset.mjs.map +1 -1
  139. package/dist/dev/runtime/intersectionObserver.mjs +6 -6
  140. package/dist/dev/runtime/intersectionObserver.mjs.map +1 -1
  141. package/dist/dev/runtime/jsxIsland.mjs +16 -33
  142. package/dist/dev/runtime/jsxIsland.mjs.map +1 -1
  143. package/dist/dev/runtime/layoutBridge.mjs +32 -62
  144. package/dist/dev/runtime/layoutBridge.mjs.map +1 -1
  145. package/dist/dev/runtime/nativeBridge.mjs +1 -1
  146. package/dist/dev/runtime/nativeBridge.mjs.map +1 -1
  147. package/dist/dev/runtime/navigationLifecycle.mjs +24 -0
  148. package/dist/dev/runtime/navigationLifecycle.mjs.map +1 -0
  149. package/dist/dev/runtime/pageEnvironment.mjs +15 -18
  150. package/dist/dev/runtime/pageEnvironment.mjs.map +1 -1
  151. package/dist/dev/runtime/pageLayout.mjs +7 -11
  152. package/dist/dev/runtime/pageLayout.mjs.map +1 -1
  153. package/dist/dev/runtime/pageScroll.mjs +2 -3
  154. package/dist/dev/runtime/pageScroll.mjs.map +1 -1
  155. package/dist/dev/runtime/platform/current.mjs +12 -0
  156. package/dist/dev/runtime/platform/current.mjs.map +1 -0
  157. package/dist/dev/runtime/platform/generic.mjs +36 -0
  158. package/dist/dev/runtime/platform/generic.mjs.map +1 -0
  159. package/dist/dev/runtime/platform/globals.mjs +29 -0
  160. package/dist/dev/runtime/platform/globals.mjs.map +1 -0
  161. package/dist/dev/runtime/platform.mjs +15 -60
  162. package/dist/dev/runtime/platform.mjs.map +1 -1
  163. package/dist/dev/runtime/provideContext.mjs +7 -9
  164. package/dist/dev/runtime/provideContext.mjs.map +1 -1
  165. package/dist/dev/runtime/publicRuntime.mjs +4 -0
  166. package/dist/dev/runtime/publicRuntime.mjs.map +1 -1
  167. package/dist/dev/runtime/pullDownRefresh.mjs +2 -4
  168. package/dist/dev/runtime/pullDownRefresh.mjs.map +1 -1
  169. package/dist/dev/runtime/register/app.mjs +18 -19
  170. package/dist/dev/runtime/register/app.mjs.map +1 -1
  171. package/dist/dev/runtime/register/component/alipay.mjs +9 -18
  172. package/dist/dev/runtime/register/component/alipay.mjs.map +1 -1
  173. package/dist/dev/runtime/register/component/alipayRegistration.mjs +60 -0
  174. package/dist/dev/runtime/register/component/alipayRegistration.mjs.map +1 -0
  175. package/dist/dev/runtime/register/component/lifecycle/optionalHooks.mjs +2 -5
  176. package/dist/dev/runtime/register/component/lifecycle/optionalHooks.mjs.map +1 -1
  177. package/dist/dev/runtime/register/component/lifecycle/platform.mjs +13 -26
  178. package/dist/dev/runtime/register/component/lifecycle/platform.mjs.map +1 -1
  179. package/dist/dev/runtime/register/component/lifecycle.mjs +7 -12
  180. package/dist/dev/runtime/register/component/lifecycle.mjs.map +1 -1
  181. package/dist/dev/runtime/register/component/methods.mjs +13 -18
  182. package/dist/dev/runtime/register/component/methods.mjs.map +1 -1
  183. package/dist/dev/runtime/register/component/options.mjs +3 -4
  184. package/dist/dev/runtime/register/component/options.mjs.map +1 -1
  185. package/dist/dev/runtime/register/component/props.mjs +25 -31
  186. package/dist/dev/runtime/register/component/props.mjs.map +1 -1
  187. package/dist/dev/runtime/register/component/registerDefinition.mjs +21 -40
  188. package/dist/dev/runtime/register/component/registerDefinition.mjs.map +1 -1
  189. package/dist/dev/runtime/register/component/registerNativeDefinition.mjs +18 -60
  190. package/dist/dev/runtime/register/component/registerNativeDefinition.mjs.map +1 -1
  191. package/dist/dev/runtime/register/component.mjs +3 -5
  192. package/dist/dev/runtime/register/component.mjs.map +1 -1
  193. package/dist/dev/runtime/register/inline.mjs +8 -10
  194. package/dist/dev/runtime/register/inline.mjs.map +1 -1
  195. package/dist/dev/runtime/register/runtimeInstance/methodBridge.mjs +7 -8
  196. package/dist/dev/runtime/register/runtimeInstance/methodBridge.mjs.map +1 -1
  197. package/dist/dev/runtime/register/runtimeInstance/provideContext.mjs +1 -1
  198. package/dist/dev/runtime/register/runtimeInstance/provideContext.mjs.map +1 -1
  199. package/dist/dev/runtime/register/runtimeInstance/setupContext.mjs +25 -34
  200. package/dist/dev/runtime/register/runtimeInstance/setupContext.mjs.map +1 -1
  201. package/dist/dev/runtime/register/runtimeInstance/setupPhase.mjs +13 -15
  202. package/dist/dev/runtime/register/runtimeInstance/setupPhase.mjs.map +1 -1
  203. package/dist/dev/runtime/register/runtimeInstance/setupSnapshot.mjs +2 -2
  204. package/dist/dev/runtime/register/runtimeInstance/setupSnapshot.mjs.map +1 -1
  205. package/dist/dev/runtime/register/runtimeInstance/utils.mjs +9 -9
  206. package/dist/dev/runtime/register/runtimeInstance/utils.mjs.map +1 -1
  207. package/dist/dev/runtime/register/runtimeInstance.mjs +74 -100
  208. package/dist/dev/runtime/register/runtimeInstance.mjs.map +1 -1
  209. package/dist/dev/runtime/register/setDataFrequencyWarning.mjs +12 -15
  210. package/dist/dev/runtime/register/setDataFrequencyWarning.mjs.map +1 -1
  211. package/dist/dev/runtime/register/setup.mjs +2 -3
  212. package/dist/dev/runtime/register/setup.mjs.map +1 -1
  213. package/dist/dev/runtime/register/snapshot.mjs +1 -4
  214. package/dist/dev/runtime/register/snapshot.mjs.map +1 -1
  215. package/dist/dev/runtime/register/watch.mjs +3 -5
  216. package/dist/dev/runtime/register/watch.mjs.map +1 -1
  217. package/dist/dev/runtime/scopedSlots.mjs +14 -21
  218. package/dist/dev/runtime/scopedSlots.mjs.map +1 -1
  219. package/dist/dev/runtime/selectorQuery.mjs +5 -9
  220. package/dist/dev/runtime/selectorQuery.mjs.map +1 -1
  221. package/dist/dev/runtime/template.mjs +1 -1
  222. package/dist/dev/runtime/template.mjs.map +1 -1
  223. package/dist/dev/runtime/templateRefs/helpers.mjs +14 -24
  224. package/dist/dev/runtime/templateRefs/helpers.mjs.map +1 -1
  225. package/dist/dev/runtime/templateRefs.mjs +8 -15
  226. package/dist/dev/runtime/templateRefs.mjs.map +1 -1
  227. package/dist/dev/runtime/uniAppHost.mjs +6 -14
  228. package/dist/dev/runtime/uniAppHost.mjs.map +1 -1
  229. package/dist/dev/runtime/updatePerformance.mjs +1 -1
  230. package/dist/dev/runtime/updatePerformance.mjs.map +1 -1
  231. package/dist/dev/runtime/use.mjs +1 -1
  232. package/dist/dev/runtime/use.mjs.map +1 -1
  233. package/dist/dev/runtime/vueCompat/context.mjs +3 -5
  234. package/dist/dev/runtime/vueCompat/context.mjs.map +1 -1
  235. package/dist/dev/runtime/vueCompat/model.mjs +9 -13
  236. package/dist/dev/runtime/vueCompat/model.mjs.map +1 -1
  237. package/dist/dev/runtime/vueCompat/router.mjs +4 -4
  238. package/dist/dev/runtime/vueCompat/router.mjs.map +1 -1
  239. package/dist/dev/runtime/vueCompat/templateRef.mjs +1 -1
  240. package/dist/dev/runtime/vueCompat/templateRef.mjs.map +1 -1
  241. package/dist/dev/scheduler.mjs +3 -4
  242. package/dist/dev/scheduler.mjs.map +1 -1
  243. package/dist/dev/store/base.mjs +1 -2
  244. package/dist/dev/store/base.mjs.map +1 -1
  245. package/dist/dev/store/define/create.mjs +11 -22
  246. package/dist/dev/store/define/create.mjs.map +1 -1
  247. package/dist/dev/store/define.mjs +1 -1
  248. package/dist/dev/store/define.mjs.map +1 -1
  249. package/dist/dev/store/view.mjs +1 -1
  250. package/dist/dev/store/view.mjs.map +1 -1
  251. package/dist/internal-runtime.d.mts +2 -1
  252. package/dist/internal-runtime.mjs +1 -1
  253. package/dist/package.mjs +1 -1
  254. package/dist/reactivity/asyncDerivation.mjs +1 -1
  255. package/dist/reactivity/core.mjs +1 -1
  256. package/dist/reactivity/reactive/patch.mjs +1 -1
  257. package/dist/reactivity/reactive/patchState.mjs +1 -1
  258. package/dist/reactivity/reactive/shared.mjs +1 -1
  259. package/dist/reactivity/reactive.mjs +1 -1
  260. package/dist/reactivity/ref.mjs +1 -1
  261. package/dist/reactivity/shallowRef.mjs +1 -1
  262. package/dist/reactivity/watch/helpers.mjs +1 -1
  263. package/dist/reactivity/watch.mjs +1 -1
  264. package/dist/router/createRouter.mjs +1 -1
  265. package/dist/router/initialNavigation.mjs +1 -1
  266. package/dist/router/instance.mjs +1 -1
  267. package/dist/router/navigationCore.mjs +1 -1
  268. package/dist/router/navigationResult.mjs +1 -1
  269. package/dist/router/navigationTarget.mjs +1 -1
  270. package/dist/router/resolve.mjs +1 -1
  271. package/dist/router/routeRegistry.mjs +1 -1
  272. package/dist/router/routeSync.mjs +1 -1
  273. package/dist/router/scrollRestoration/adapters.d.mts +7 -0
  274. package/dist/router/scrollRestoration/adapters.mjs +1 -0
  275. package/dist/router/scrollRestoration/controller.d.mts +7 -0
  276. package/dist/router/scrollRestoration/controller.mjs +1 -0
  277. package/dist/router/scrollRestoration/host.d.mts +3 -0
  278. package/dist/router/scrollRestoration/host.mjs +1 -0
  279. package/dist/router/scrollRestoration/index.d.mts +8 -0
  280. package/dist/router/scrollRestoration/index.mjs +1 -0
  281. package/dist/router/scrollRestoration/types.d.mts +60 -0
  282. package/dist/router/useRoute.mjs +1 -1
  283. package/dist/router.d.mts +5 -1
  284. package/dist/router.mjs +1 -1
  285. package/dist/routerInternal/location.mjs +1 -1
  286. package/dist/routerInternal/params.mjs +1 -1
  287. package/dist/routerInternal/records.mjs +1 -1
  288. package/dist/routerInternal/recordsWarnings.mjs +1 -1
  289. package/dist/runtime/app/context.mjs +1 -1
  290. package/dist/runtime/app/diagnostics.mjs +1 -1
  291. package/dist/runtime/app/mount.mjs +1 -1
  292. package/dist/runtime/app/setData/commitTracker.mjs +1 -1
  293. package/dist/runtime/app/setData/patchScheduler.mjs +1 -1
  294. package/dist/runtime/app/setData/payload.mjs +1 -1
  295. package/dist/runtime/app/setData/scheduler.mjs +1 -1
  296. package/dist/runtime/app/setData/snapshot.mjs +1 -1
  297. package/dist/runtime/app/setDataOptions.mjs +1 -1
  298. package/dist/runtime/app.mjs +1 -1
  299. package/dist/runtime/bindingManifest.mjs +1 -1
  300. package/dist/runtime/capabilities.d.mts +4 -1
  301. package/dist/runtime/css.mjs +1 -1
  302. package/dist/runtime/defaults.mjs +1 -1
  303. package/dist/runtime/define/initialComputed.mjs +1 -1
  304. package/dist/runtime/define/options.mjs +1 -1
  305. package/dist/runtime/define/props.mjs +1 -1
  306. package/dist/runtime/define/scopedSlotOptions.mjs +1 -1
  307. package/dist/runtime/define/setupResult.mjs +1 -1
  308. package/dist/runtime/define.mjs +1 -1
  309. package/dist/runtime/diff.mjs +1 -1
  310. package/dist/runtime/disposables.mjs +1 -1
  311. package/dist/runtime/elementIntersectionObserver.mjs +1 -1
  312. package/dist/runtime/features/inlineEvents.mjs +1 -1
  313. package/dist/runtime/features/jsxIslands.d.mts +6 -0
  314. package/dist/runtime/features/jsxIslands.mjs +1 -0
  315. package/dist/runtime/features/layout.mjs +1 -1
  316. package/dist/runtime/features/publicLayout.mjs +1 -1
  317. package/dist/runtime/features/scopedSlots.mjs +1 -1
  318. package/dist/runtime/features/templateRefs.mjs +1 -1
  319. package/dist/runtime/hooks/base.mjs +1 -1
  320. package/dist/runtime/hooks/pageScroll.mjs +1 -0
  321. package/dist/runtime/hooks/register.mjs +1 -1
  322. package/dist/runtime/inlineDataset.mjs +1 -1
  323. package/dist/runtime/intersectionObserver.mjs +1 -1
  324. package/dist/runtime/jsxIsland.mjs +1 -1
  325. package/dist/runtime/layoutBridge.mjs +1 -1
  326. package/dist/runtime/nativeBridge.mjs +1 -1
  327. package/dist/runtime/navigationLifecycle.mjs +1 -0
  328. package/dist/runtime/pageEnvironment.mjs +1 -1
  329. package/dist/runtime/pageLayout.mjs +1 -1
  330. package/dist/runtime/pageScroll.mjs +1 -1
  331. package/dist/runtime/platform/current.mjs +1 -0
  332. package/dist/runtime/platform/generic.mjs +1 -0
  333. package/dist/runtime/platform/globals.mjs +1 -0
  334. package/dist/runtime/platform.mjs +1 -1
  335. package/dist/runtime/provideContext.mjs +1 -1
  336. package/dist/runtime/publicRuntime.mjs +1 -1
  337. package/dist/runtime/pullDownRefresh.mjs +1 -1
  338. package/dist/runtime/register/app.mjs +1 -1
  339. package/dist/runtime/register/component/alipay.mjs +1 -1
  340. package/dist/runtime/register/component/alipayRegistration.mjs +1 -0
  341. package/dist/runtime/register/component/lifecycle/optionalHooks.mjs +1 -1
  342. package/dist/runtime/register/component/lifecycle/platform.mjs +1 -1
  343. package/dist/runtime/register/component/lifecycle.mjs +1 -1
  344. package/dist/runtime/register/component/methods.mjs +1 -1
  345. package/dist/runtime/register/component/options.mjs +1 -1
  346. package/dist/runtime/register/component/props.mjs +1 -1
  347. package/dist/runtime/register/component/registerDefinition.mjs +1 -1
  348. package/dist/runtime/register/component/registerNativeDefinition.mjs +1 -1
  349. package/dist/runtime/register/component.mjs +1 -1
  350. package/dist/runtime/register/inline.mjs +1 -1
  351. package/dist/runtime/register/runtimeInstance/methodBridge.mjs +1 -1
  352. package/dist/runtime/register/runtimeInstance/provideContext.mjs +1 -1
  353. package/dist/runtime/register/runtimeInstance/setupContext.mjs +1 -1
  354. package/dist/runtime/register/runtimeInstance/setupPhase.mjs +1 -1
  355. package/dist/runtime/register/runtimeInstance/setupSnapshot.mjs +1 -1
  356. package/dist/runtime/register/runtimeInstance/utils.mjs +1 -1
  357. package/dist/runtime/register/runtimeInstance.mjs +1 -1
  358. package/dist/runtime/register/setDataFrequencyWarning.mjs +1 -1
  359. package/dist/runtime/register/setup.mjs +1 -1
  360. package/dist/runtime/register/snapshot.mjs +1 -1
  361. package/dist/runtime/register/watch.mjs +1 -1
  362. package/dist/runtime/scopedSlots.mjs +1 -1
  363. package/dist/runtime/selectorQuery.mjs +1 -1
  364. package/dist/runtime/template.mjs +1 -1
  365. package/dist/runtime/templateRefs/helpers.mjs +1 -1
  366. package/dist/runtime/templateRefs.mjs +1 -1
  367. package/dist/runtime/uniAppHost.mjs +1 -1
  368. package/dist/runtime/updatePerformance.mjs +1 -1
  369. package/dist/runtime/use.mjs +1 -1
  370. package/dist/runtime/vueCompat/context.mjs +1 -1
  371. package/dist/runtime/vueCompat/model.mjs +1 -1
  372. package/dist/runtime/vueCompat/router.mjs +1 -1
  373. package/dist/runtime/vueCompat/templateRef.mjs +1 -1
  374. package/dist/scheduler.mjs +1 -1
  375. package/dist/store/base.mjs +1 -1
  376. package/dist/store/define/create.mjs +1 -1
  377. package/dist/store/define.mjs +1 -1
  378. package/dist/store/view.mjs +1 -1
  379. package/package.json +7 -7
  380. /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/defineProperty.mjs +0 -0
  381. /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPrimitive.mjs +0 -0
  382. /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPropertyKey.mjs +0 -0
  383. /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/typeof.mjs +0 -0
package/README.md CHANGED
@@ -184,6 +184,12 @@ const onActiveChange = bindModel.model<boolean>('isActive').onChange
184
184
 
185
185
  ## 开发产物与源码调试
186
186
 
187
+ 使用 weapp-vite 构建时,现有 `--platform` / `weapp.platform` 会自动注入编译期常量 `import.meta.env.PLATFORM`,取值为 `weapp`、`alipay`、`tt`、`swan`、`jd`、`xhs` 或 `web`。Wevu 发布包保留平台表达式,消费构建替换后即可移除非目标平台分支及构建、IDE 等元数据,无需额外裁剪配置。
188
+
189
+ 能力裁剪取决于实际使用:继续从 `wevu` 使用具名导入,未使用的 Store、router 和 API/fetch 不会因根入口导出而强制进入产物。SFC / JSX 编译器根据 Binding Manifest 安装所需能力;普通 SFC 不依赖 JSX island 处理器,没有创建 router 时不加载首航 guard 状态机。公开动态工厂仍保留兼容能力安装,不能把编译器精简入口的测量值当成任意动态工厂的体积承诺。
190
+
191
+ 直接在其他工具链中使用时,未提供构建目标会保留宿主探测;显式使用 API/fetch 后,其动态跨平台 adapter 仍保留。Web 继续使用自己的宿主桥接,不等同于 Vue DOM runtime,也不表示已支持原生 App 渲染。
192
+
187
193
  `wevu` 默认导出压缩后的生产产物,用于降低小程序包体积。包内同时提供未压缩并带 sourcemap 的开发产物:
188
194
 
189
195
  - 支持 `development` export condition 的构建器会在开发模式下优先解析到 `dist/dev/*`。
@@ -1,6 +1,6 @@
1
1
  import toPropertyKey from "./toPropertyKey.mjs";
2
2
 
3
- //#region \0@oxc-project+runtime@0.150.0/helpers/esm/defineProperty.js
3
+ //#region \0@oxc-project+runtime@0.151.0/helpers/esm/defineProperty.js
4
4
  function _defineProperty(e, r, t) {
5
5
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
6
6
  value: t,
@@ -1,6 +1,6 @@
1
1
  import _typeof from "./typeof.mjs";
2
2
 
3
- //#region \0@oxc-project+runtime@0.150.0/helpers/esm/toPrimitive.js
3
+ //#region \0@oxc-project+runtime@0.151.0/helpers/esm/toPrimitive.js
4
4
  function toPrimitive(t, r) {
5
5
  if ("object" != _typeof(t) || !t) return t;
6
6
  var e = t[Symbol.toPrimitive];
@@ -1,7 +1,7 @@
1
1
  import _typeof from "./typeof.mjs";
2
2
  import toPrimitive from "./toPrimitive.mjs";
3
3
 
4
- //#region \0@oxc-project+runtime@0.150.0/helpers/esm/toPropertyKey.js
4
+ //#region \0@oxc-project+runtime@0.151.0/helpers/esm/toPropertyKey.js
5
5
  function toPropertyKey(t) {
6
6
  var i = toPrimitive(t, "string");
7
7
  return "symbol" == _typeof(i) ? i : i + "";
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.150.0/helpers/esm/typeof.js
1
+ //#region \0@oxc-project+runtime@0.151.0/helpers/esm/typeof.js
2
2
  function _typeof(o) {
3
3
  "@babel/helpers - typeof";
4
4
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -35,10 +35,11 @@ import "./runtime/vueCompat.mjs";
35
35
  import { version } from "./version.mjs";
36
36
  import { takePendingRuntimeAppRegistration } from "./runtime/app/pending.mjs";
37
37
  import { installInlineEvents } from "./runtime/features/inlineEvents.mjs";
38
+ import { installJsxIslands } from "./runtime/features/jsxIslands.mjs";
38
39
  import { installLayout } from "./runtime/features/layout.mjs";
39
40
  import { installPatchStrategy } from "./runtime/features/patchStrategy.mjs";
40
41
  import { installSetDataHighFrequencyWarning } from "./runtime/features/setDataHighFrequencyWarning.mjs";
41
42
  import { installTemplateRefs } from "./runtime/features/templateRefs.mjs";
42
43
  import { Fragment, createTextVNode, createVNode, isVNode, mergeProps, normalizeJsxIsland, resolveComponent, resolveDirective, transformOn, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, withDirectives } from "./runtime/jsxIsland.mjs";
43
44
  import { createUniAppHost } from "./runtime/uniAppHost.mjs";
44
- export { Fragment, type HighFrequencyWarningMonitorOptions, INTERNAL_DEFAULTS_SCOPE_KEY, type LayoutHostBinding, type RuntimeCapabilityName, type RuntimeCapabilityRegistry, type ScopedSlotMountState, type SetDataScheduler, type SetDataSchedulerOptions, type TemplateRefBinding, callHookList, callHookReturn, createApp, createIsolatedWevuComponentDefinition, createTextVNode, createUniAppHost, createVNode, createWevuComponent, createWevuComponentDefinition, createWevuScopedSlotComponent, defineAppSetup, defineComponent, getCurrentInstance, getCurrentPageStackSnapshot, getCurrentSetupContext, getNavigationBarMetrics, getWevuComponentLifecycleDefinition, hasInjectionContext, inject, injectGlobal, installInlineEvents, installLayout, installPatchStrategy, installScopedSlots, installSetDataHighFrequencyWarning, installTemplateRefs, isNoSetData, isVNode, markNoSetData, mergeModels, mergeProps, mountRuntimeInstance, normalizeJsxIsland, onActivated, onAddToFavorites, onAttached, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onDetached, onError, onErrorCaptured, onHide, onLaunch, onLoad, onMemoryWarning, onMounted, onMoved, onPageNotFound, onPageScroll, onPullDownRefresh, onReachBottom, onReady, onResize, onRouteDone, onSaveExitState, onServerPrefetch, onShareAppMessage, onShareTimeline, onShow, onTabItemTap, onThemeChange, onUnhandledRejection, onUnload, onUnmounted, onUpdated, provide, provideGlobal, registerApp, registerComponent, resetWevuDefaults, resolveComponent, resolveDirective, resolveLayoutBridge, resolveLayoutHost, resolveRuntimePageLayoutName, runSetupFunction, setCurrentInstance, setCurrentSetupContext, setGlobalProvidedValue, setPageLayout, setRuntimeSetDataVisibility, setWevuDefaults, syncRuntimePageLayoutState, syncRuntimePageLayoutStateFromRuntime, takePendingRuntimeAppRegistration, teardownRuntimeInstance, transformOn, use, useAsyncPullDownRefresh, useAttrs, useBindModel, useBoundingClientRect, useChangeModel, useCssModule, useCssVars, useDisposables, useElementIntersectionObserver, useIntersectionObserver, useLayoutBridge, useLayoutHosts, useModel, useNativeInstance, useNativePageRouter, useNativeRouter, useNavigationBarMetrics, usePageLayout, usePageScrollThrottle, usePageStack, useScrollOffset, useSelectorFields, useSelectorQuery, useSlots, useTemplateRef, useUpdatePerformanceListener, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, version, waitForLayoutHost, withDirectives };
45
+ export { Fragment, type HighFrequencyWarningMonitorOptions, INTERNAL_DEFAULTS_SCOPE_KEY, type LayoutHostBinding, type RuntimeCapabilityName, type RuntimeCapabilityRegistry, type ScopedSlotMountState, type SetDataScheduler, type SetDataSchedulerOptions, type TemplateRefBinding, callHookList, callHookReturn, createApp, createIsolatedWevuComponentDefinition, createTextVNode, createUniAppHost, createVNode, createWevuComponent, createWevuComponentDefinition, createWevuScopedSlotComponent, defineAppSetup, defineComponent, getCurrentInstance, getCurrentPageStackSnapshot, getCurrentSetupContext, getNavigationBarMetrics, getWevuComponentLifecycleDefinition, hasInjectionContext, inject, injectGlobal, installInlineEvents, installJsxIslands, installLayout, installPatchStrategy, installScopedSlots, installSetDataHighFrequencyWarning, installTemplateRefs, isNoSetData, isVNode, markNoSetData, mergeModels, mergeProps, mountRuntimeInstance, normalizeJsxIsland, onActivated, onAddToFavorites, onAttached, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onDetached, onError, onErrorCaptured, onHide, onLaunch, onLoad, onMemoryWarning, onMounted, onMoved, onPageNotFound, onPageScroll, onPullDownRefresh, onReachBottom, onReady, onResize, onRouteDone, onSaveExitState, onServerPrefetch, onShareAppMessage, onShareTimeline, onShow, onTabItemTap, onThemeChange, onUnhandledRejection, onUnload, onUnmounted, onUpdated, provide, provideGlobal, registerApp, registerComponent, resetWevuDefaults, resolveComponent, resolveDirective, resolveLayoutBridge, resolveLayoutHost, resolveRuntimePageLayoutName, runSetupFunction, setCurrentInstance, setCurrentSetupContext, setGlobalProvidedValue, setPageLayout, setRuntimeSetDataVisibility, setWevuDefaults, syncRuntimePageLayoutState, syncRuntimePageLayoutStateFromRuntime, takePendingRuntimeAppRegistration, teardownRuntimeInstance, transformOn, use, useAsyncPullDownRefresh, useAttrs, useBindModel, useBoundingClientRect, useChangeModel, useCssModule, useCssVars, useDisposables, useElementIntersectionObserver, useIntersectionObserver, useLayoutBridge, useLayoutHosts, useModel, useNativeInstance, useNativePageRouter, useNativeRouter, useNavigationBarMetrics, usePageLayout, usePageScrollThrottle, usePageStack, useScrollOffset, useSelectorFields, useSelectorQuery, useSlots, useTemplateRef, useUpdatePerformanceListener, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, version, waitForLayoutHost, withDirectives };
@@ -19,11 +19,12 @@ import { takePendingRuntimeAppRegistration } from "./runtime/app/pending.mjs";
19
19
  import { runSetupFunction } from "./runtime/register/setup.mjs";
20
20
  import { mountRuntimeInstance, setRuntimeSetDataVisibility, teardownRuntimeInstance } from "./runtime/register/runtimeInstance.mjs";
21
21
  import { registerApp } from "./runtime/register/app.mjs";
22
- import { Fragment, createTextVNode, createVNode, isVNode, mergeProps, normalizeJsxIsland, resolveComponent, resolveDirective, transformOn, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, withDirectives } from "./runtime/jsxIsland.mjs";
23
22
  import { registerComponent } from "./runtime/register/component.mjs";
24
23
  import { createApp } from "./runtime/app.mjs";
25
24
  import { createIsolatedWevuComponentDefinition, createWevuComponent, createWevuComponentDefinition, defineComponent, getWevuComponentLifecycleDefinition } from "./runtime/define.mjs";
26
25
  import { installInlineEvents } from "./runtime/features/inlineEvents.mjs";
26
+ import { Fragment, createTextVNode, createVNode, isVNode, mergeProps, normalizeJsxIsland, resolveComponent, resolveDirective, transformOn, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, withDirectives } from "./runtime/jsxIsland.mjs";
27
+ import { installJsxIslands } from "./runtime/features/jsxIslands.mjs";
27
28
  import { installPatchStrategy } from "./runtime/features/patchStrategy.mjs";
28
29
  import { createWevuScopedSlotComponent, installScopedSlots } from "./runtime/features/scopedSlots.mjs";
29
30
  import { installSetDataHighFrequencyWarning } from "./runtime/features/setDataHighFrequencyWarning.mjs";
@@ -37,4 +38,4 @@ import { useNativePageRouter, useNativeRouter } from "./runtime/vueCompat/router
37
38
  import { useTemplateRef } from "./runtime/vueCompat/templateRef.mjs";
38
39
  import { createUniAppHost } from "./runtime/uniAppHost.mjs";
39
40
 
40
- export { Fragment, INTERNAL_DEFAULTS_SCOPE_KEY, callHookList, callHookReturn, createApp, createIsolatedWevuComponentDefinition, createTextVNode, createUniAppHost, createVNode, createWevuComponent, createWevuComponentDefinition, createWevuScopedSlotComponent, defineAppSetup, defineComponent, getCurrentInstance, getCurrentPageStackSnapshot, getCurrentSetupContext, getNavigationBarMetrics, getWevuComponentLifecycleDefinition, hasInjectionContext, inject, injectGlobal, installInlineEvents, installLayout, installPatchStrategy, installScopedSlots, installSetDataHighFrequencyWarning, installTemplateRefs, isNoSetData, isVNode, markNoSetData, mergeModels, mergeProps, mountRuntimeInstance, normalizeJsxIsland, onActivated, onAddToFavorites, onAttached, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onDetached, onError, onErrorCaptured, onHide, onLaunch, onLoad, onMemoryWarning, onMounted, onMoved, onPageNotFound, onPageScroll, onPullDownRefresh, onReachBottom, onReady, onResize, onRouteDone, onSaveExitState, onServerPrefetch, onShareAppMessage, onShareTimeline, onShow, onTabItemTap, onThemeChange, onUnhandledRejection, onUnload, onUnmounted, onUpdated, provide, provideGlobal, registerApp, registerComponent, resetWevuDefaults, resolveComponent, resolveDirective, resolveLayoutBridge, resolveLayoutHost, resolveRuntimePageLayoutName, runSetupFunction, setCurrentInstance, setCurrentSetupContext, setGlobalProvidedValue, setPageLayout, setRuntimeSetDataVisibility, setWevuDefaults, syncRuntimePageLayoutState, syncRuntimePageLayoutStateFromRuntime, takePendingRuntimeAppRegistration, teardownRuntimeInstance, transformOn, use, useAsyncPullDownRefresh, useAttrs, useBindModel, useBoundingClientRect, useChangeModel, useCssModule, useCssVars, useDisposables, useElementIntersectionObserver, useIntersectionObserver, useLayoutBridge, useLayoutHosts, useModel, useNativeInstance, useNativePageRouter, useNativeRouter, useNavigationBarMetrics, usePageLayout, usePageScrollThrottle, usePageStack, useScrollOffset, useSelectorFields, useSelectorQuery, useSlots, useTemplateRef, useUpdatePerformanceListener, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, version, waitForLayoutHost, withDirectives };
41
+ export { Fragment, INTERNAL_DEFAULTS_SCOPE_KEY, callHookList, callHookReturn, createApp, createIsolatedWevuComponentDefinition, createTextVNode, createUniAppHost, createVNode, createWevuComponent, createWevuComponentDefinition, createWevuScopedSlotComponent, defineAppSetup, defineComponent, getCurrentInstance, getCurrentPageStackSnapshot, getCurrentSetupContext, getNavigationBarMetrics, getWevuComponentLifecycleDefinition, hasInjectionContext, inject, injectGlobal, installInlineEvents, installJsxIslands, installLayout, installPatchStrategy, installScopedSlots, installSetDataHighFrequencyWarning, installTemplateRefs, isNoSetData, isVNode, markNoSetData, mergeModels, mergeProps, mountRuntimeInstance, normalizeJsxIsland, onActivated, onAddToFavorites, onAttached, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onDetached, onError, onErrorCaptured, onHide, onLaunch, onLoad, onMemoryWarning, onMounted, onMoved, onPageNotFound, onPageScroll, onPullDownRefresh, onReachBottom, onReady, onResize, onRouteDone, onSaveExitState, onServerPrefetch, onShareAppMessage, onShareTimeline, onShow, onTabItemTap, onThemeChange, onUnhandledRejection, onUnload, onUnmounted, onUpdated, provide, provideGlobal, registerApp, registerComponent, resetWevuDefaults, resolveComponent, resolveDirective, resolveLayoutBridge, resolveLayoutHost, resolveRuntimePageLayoutName, runSetupFunction, setCurrentInstance, setCurrentSetupContext, setGlobalProvidedValue, setPageLayout, setRuntimeSetDataVisibility, setWevuDefaults, syncRuntimePageLayoutState, syncRuntimePageLayoutStateFromRuntime, takePendingRuntimeAppRegistration, teardownRuntimeInstance, transformOn, use, useAsyncPullDownRefresh, useAttrs, useBindModel, useBoundingClientRect, useChangeModel, useCssModule, useCssVars, useDisposables, useElementIntersectionObserver, useIntersectionObserver, useLayoutBridge, useLayoutHosts, useModel, useNativeInstance, useNativePageRouter, useNativeRouter, useNavigationBarMetrics, usePageLayout, usePageScrollThrottle, usePageStack, useScrollOffset, useSelectorFields, useSelectorQuery, useSlots, useTemplateRef, useUpdatePerformanceListener, vModelCheckbox, vModelRadio, vModelSelect, vModelText, vShow, version, waitForLayoutHost, withDirectives };
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "7.2.2";
2
+ var version = "7.4.0";
3
3
 
4
4
  //#endregion
5
5
  export { version };
@@ -19,7 +19,6 @@ function createAsyncDerivationCycle() {
19
19
  * 加载错误通过 `status` 与 `error` 暴露,`refresh()` 始终正常完成。
20
20
  */
21
21
  function useAsyncDerivation(loader, options = {}) {
22
- var _options$immediate;
23
22
  const storage = {
24
23
  status: "idle",
25
24
  value: void 0,
@@ -35,7 +34,7 @@ function useAsyncDerivation(loader, options = {}) {
35
34
  if (disposed || completedGeneration !== generation) return;
36
35
  const cycle = activeCycle;
37
36
  activeCycle = void 0;
38
- cycle === null || cycle === void 0 || cycle.resolve();
37
+ cycle?.resolve();
39
38
  }
40
39
  function commitValue(completedGeneration, value) {
41
40
  if (disposed || completedGeneration !== generation) return;
@@ -65,17 +64,16 @@ function useAsyncDerivation(loader, options = {}) {
65
64
  }
66
65
  }
67
66
  function refresh() {
68
- var _activeCycle;
69
67
  if (disposed) return RESOLVED_PROMISE;
70
- const cycle = (_activeCycle = activeCycle) !== null && _activeCycle !== void 0 ? _activeCycle : createAsyncDerivationCycle();
68
+ const cycle = activeCycle ?? createAsyncDerivationCycle();
71
69
  activeCycle = cycle;
72
70
  const currentGeneration = ++generation;
73
71
  const previousController = activeController;
74
72
  const controller = new (typeof AbortController === "function" ? AbortController : AbortControllerPolyfill)();
75
73
  activeController = controller;
76
74
  try {
77
- previousController === null || previousController === void 0 || previousController.abort();
78
- } catch (_unused) {}
75
+ previousController?.abort();
76
+ } catch {}
79
77
  if (disposed || currentGeneration !== generation) return cycle.promise;
80
78
  batch(() => {
81
79
  state.status = hasValue ? "refreshing" : "initial-pending";
@@ -100,8 +98,8 @@ function useAsyncDerivation(loader, options = {}) {
100
98
  const controller = activeController;
101
99
  activeController = void 0;
102
100
  try {
103
- controller === null || controller === void 0 || controller.abort();
104
- } catch (_unused2) {}
101
+ controller?.abort();
102
+ } catch {}
105
103
  try {
106
104
  batch(() => {
107
105
  state.status = "disposed";
@@ -112,7 +110,7 @@ function useAsyncDerivation(loader, options = {}) {
112
110
  hasValue = false;
113
111
  const cycle = activeCycle;
114
112
  activeCycle = void 0;
115
- cycle === null || cycle === void 0 || cycle.resolve();
113
+ cycle?.resolve();
116
114
  }
117
115
  }
118
116
  Object.defineProperties(storage, {
@@ -121,7 +119,7 @@ function useAsyncDerivation(loader, options = {}) {
121
119
  });
122
120
  const result = readonly(state);
123
121
  onScopeDispose(dispose);
124
- if ((_options$immediate = options.immediate) !== null && _options$immediate !== void 0 ? _options$immediate : true) refresh();
122
+ if (options.immediate ?? true) refresh();
125
123
  return result;
126
124
  }
127
125
 
@@ -1 +1 @@
1
- {"version":3,"file":"asyncDerivation.mjs","names":[],"sources":["../../../src/reactivity/asyncDerivation.ts"],"sourcesContent":["import { AbortControllerPolyfill } from '@wevu/web-apis/abort'\nimport { batch, onScopeDispose, runWithoutTracking } from './core'\nimport { reactive } from './reactive'\nimport { readonly } from './readonly'\n\n/** 异步派生状态的生命周期阶段。 */\nexport type AsyncDerivationStatus\n = | 'idle'\n | 'initial-pending'\n | 'ready'\n | 'refreshing'\n | 'error'\n | 'disposed'\n\n/** 传给异步加载函数的当前任务上下文。 */\nexport interface AsyncDerivationContext {\n readonly signal: AbortSignal\n}\n\n/** `useAsyncDerivation()` 的配置。 */\nexport interface UseAsyncDerivationOptions {\n immediate?: boolean\n}\n\ntype AsyncDerivationIdleState<TStatus extends 'idle' | 'initial-pending' | 'disposed'> = Readonly<{\n status: TStatus\n value: undefined\n error: undefined\n}>\n\ntype AsyncDerivationReadyState<T, TStatus extends 'ready' | 'refreshing'> = Readonly<{\n status: TStatus\n value: T\n error: undefined\n}>\n\ntype AsyncDerivationErrorState<T> = Readonly<{\n status: 'error'\n value: T | undefined\n error: unknown\n}>\n\n/** 模板可观察的只读异步派生状态。 */\nexport type AsyncDerivationState<T>\n = | AsyncDerivationIdleState<'idle'>\n | AsyncDerivationIdleState<'initial-pending'>\n | AsyncDerivationIdleState<'disposed'>\n | AsyncDerivationReadyState<T, 'ready'>\n | AsyncDerivationReadyState<T, 'refreshing'>\n | AsyncDerivationErrorState<T>\n\ntype AsyncDerivationControls = Readonly<{\n refresh: () => Promise<void>\n dispose: () => void\n}>\n\n/** 异步派生状态及其非枚举控制方法。 */\nexport type AsyncDerivation<T> = AsyncDerivationState<T> & AsyncDerivationControls\n\ninterface MutableAsyncDerivationState<T> {\n status: AsyncDerivationStatus\n value: T | undefined\n error: unknown\n}\n\ninterface AsyncDerivationCycle {\n readonly promise: Promise<void>\n readonly resolve: () => void\n}\n\nconst RESOLVED_PROMISE: Promise<void> = Promise.resolve()\n\nfunction createAsyncDerivationCycle(): AsyncDerivationCycle {\n let resolve!: () => void\n const promise = new Promise<void>((settle) => {\n resolve = settle\n })\n return { promise, resolve }\n}\n\n/**\n * 创建面向静态 WXML 数据绑定的异步派生状态。\n * 加载错误通过 `status` 与 `error` 暴露,`refresh()` 始终正常完成。\n */\nexport function useAsyncDerivation<T>(\n loader: (context: AsyncDerivationContext) => T | PromiseLike<T>,\n options: UseAsyncDerivationOptions = {},\n): AsyncDerivation<T> {\n const storage: MutableAsyncDerivationState<T> = {\n status: 'idle',\n value: undefined,\n error: undefined,\n }\n const state = reactive(storage)\n let activeController: AbortController | undefined\n let activeCycle: AsyncDerivationCycle | undefined\n let generation = 0\n let hasValue = false\n let disposed = false\n\n function settleLatestCycle(completedGeneration: number) {\n if (disposed || completedGeneration !== generation) {\n return\n }\n const cycle = activeCycle\n activeCycle = undefined\n cycle?.resolve()\n }\n\n function commitValue(completedGeneration: number, value: T) {\n if (disposed || completedGeneration !== generation) {\n return\n }\n activeController = undefined\n hasValue = true\n try {\n batch(() => {\n state.status = 'ready'\n state.value = value\n state.error = undefined\n })\n }\n finally {\n settleLatestCycle(completedGeneration)\n }\n }\n\n function commitError(completedGeneration: number, error: unknown) {\n if (disposed || completedGeneration !== generation) {\n return\n }\n activeController = undefined\n try {\n batch(() => {\n state.status = 'error'\n state.error = error\n if (!hasValue) {\n state.value = undefined\n }\n })\n }\n finally {\n settleLatestCycle(completedGeneration)\n }\n }\n\n function refresh(): Promise<void> {\n if (disposed) {\n return RESOLVED_PROMISE\n }\n\n const cycle = activeCycle ?? createAsyncDerivationCycle()\n activeCycle = cycle\n const currentGeneration = ++generation\n const previousController = activeController\n // eslint-disable-next-line mini-program/no-implicit-runtime-polyfill -- 缺失宿主实现时显式回退兼容层。\n const Controller = typeof AbortController === 'function' ? AbortController : AbortControllerPolyfill\n const controller = new Controller() as unknown as AbortController\n activeController = controller\n try {\n previousController?.abort()\n }\n catch {\n // 原生 EventTarget 不把 abort listener 异常传播给调用者,兼容实现保持相同控制流。\n }\n\n if (disposed || currentGeneration !== generation) {\n return cycle.promise\n }\n\n batch(() => {\n state.status = hasValue ? 'refreshing' : 'initial-pending'\n state.error = undefined\n })\n\n if (disposed || currentGeneration !== generation) {\n return cycle.promise\n }\n\n runWithoutTracking(() => {\n // 自有 Promise 避免原生 Promise 的身份快路径把 then 访问移出收养边界。\n const task = new Promise<T>((resolve) => {\n resolve(loader({ signal: controller.signal }))\n })\n void task.then(\n value => commitValue(currentGeneration, value),\n error => commitError(currentGeneration, error),\n ).catch((error) => {\n // 观察者异常交给宿主报告,不改写加载结果,也不阻塞 refresh 的完成。\n setTimeout(() => {\n throw error\n }, 0)\n })\n })\n return cycle.promise\n }\n\n function dispose() {\n if (disposed) {\n return\n }\n disposed = true\n generation += 1\n const controller = activeController\n activeController = undefined\n try {\n controller?.abort()\n }\n catch {\n // dispose 必须完成状态清理和 waiter 结算,不能被 listener 异常中断。\n }\n try {\n batch(() => {\n state.status = 'disposed'\n state.value = undefined\n state.error = undefined\n })\n }\n finally {\n hasValue = false\n const cycle = activeCycle\n activeCycle = undefined\n cycle?.resolve()\n }\n }\n\n Object.defineProperties(storage, {\n refresh: {\n value: refresh,\n },\n dispose: {\n value: dispose,\n },\n })\n\n const result = readonly(state) as AsyncDerivation<T>\n onScopeDispose(dispose)\n if (options.immediate ?? true) {\n void refresh()\n }\n return result\n}\n"],"mappings":";;;;;;AAsEA,MAAM,mBAAkC,QAAQ,QAAQ;AAExD,SAAS,6BAAmD;CAC1D,IAAI;CAIJ,OAAO;EAAE,aAHW,SAAe,WAAW;GAC5C,UAAU;EACZ,CACe;EAAG;CAAQ;AAC5B;;;;;AAMA,SAAgB,mBACd,QACA,UAAqC,CAAC,GAClB;;CACpB,MAAM,UAA0C;EAC9C,QAAQ;EACR,OAAO;EACP,OAAO;CACT;CACA,MAAM,QAAQ,SAAS,OAAO;CAC9B,IAAI;CACJ,IAAI;CACJ,IAAI,aAAa;CACjB,IAAI,WAAW;CACf,IAAI,WAAW;CAEf,SAAS,kBAAkB,qBAA6B;EACtD,IAAI,YAAY,wBAAwB,YACtC;EAEF,MAAM,QAAQ;EACd,cAAc;EACd,4CAAO,QAAQ;CACjB;CAEA,SAAS,YAAY,qBAA6B,OAAU;EAC1D,IAAI,YAAY,wBAAwB,YACtC;EAEF,mBAAmB;EACnB,WAAW;EACX,IAAI;GACF,YAAY;IACV,MAAM,SAAS;IACf,MAAM,QAAQ;IACd,MAAM,QAAQ;GAChB,CAAC;EACH,UACQ;GACN,kBAAkB,mBAAmB;EACvC;CACF;CAEA,SAAS,YAAY,qBAA6B,OAAgB;EAChE,IAAI,YAAY,wBAAwB,YACtC;EAEF,mBAAmB;EACnB,IAAI;GACF,YAAY;IACV,MAAM,SAAS;IACf,MAAM,QAAQ;IACd,IAAI,CAAC,UACH,MAAM,QAAQ;GAElB,CAAC;EACH,UACQ;GACN,kBAAkB,mBAAmB;EACvC;CACF;CAEA,SAAS,UAAyB;;EAChC,IAAI,UACF,OAAO;EAGT,MAAM,wBAAQ,kEAAe,2BAA2B;EACxD,cAAc;EACd,MAAM,oBAAoB,EAAE;EAC5B,MAAM,qBAAqB;EAG3B,MAAM,aAAa,KADA,OAAO,oBAAoB,aAAa,kBAAkB,yBAC3C;EAClC,mBAAmB;EACnB,IAAI;GACF,mFAAoB,MAAM;EAC5B,kBACM,CAEN;EAEA,IAAI,YAAY,sBAAsB,YACpC,OAAO,MAAM;EAGf,YAAY;GACV,MAAM,SAAS,WAAW,eAAe;GACzC,MAAM,QAAQ;EAChB,CAAC;EAED,IAAI,YAAY,sBAAsB,YACpC,OAAO,MAAM;EAGf,yBAAyB;GAKvB,AAAK,IAHY,SAAY,YAAY;IACvC,QAAQ,OAAO,EAAE,QAAQ,WAAW,OAAO,CAAC,CAAC;GAC/C,CACQ,CAAC,CAAC,MACR,UAAS,YAAY,mBAAmB,KAAK,IAC7C,UAAS,YAAY,mBAAmB,KAAK,CAC/C,CAAC,CAAC,OAAO,UAAU;IAEjB,iBAAiB;KACf,MAAM;IACR,GAAG,CAAC;GACN,CAAC;EACH,CAAC;EACD,OAAO,MAAM;CACf;CAEA,SAAS,UAAU;EACjB,IAAI,UACF;EAEF,WAAW;EACX,cAAc;EACd,MAAM,aAAa;EACnB,mBAAmB;EACnB,IAAI;GACF,2DAAY,MAAM;EACpB,mBACM,CAEN;EACA,IAAI;GACF,YAAY;IACV,MAAM,SAAS;IACf,MAAM,QAAQ;IACd,MAAM,QAAQ;GAChB,CAAC;EACH,UACQ;GACN,WAAW;GACX,MAAM,QAAQ;GACd,cAAc;GACd,4CAAO,QAAQ;EACjB;CACF;CAEA,OAAO,iBAAiB,SAAS;EAC/B,SAAS,EACP,OAAO,QACT;EACA,SAAS,EACP,OAAO,QACT;CACF,CAAC;CAED,MAAM,SAAS,SAAS,KAAK;CAC7B,eAAe,OAAO;CACtB,0BAAI,QAAQ,4EAAa,MACvB,AAAK,QAAQ;CAEf,OAAO;AACT"}
1
+ {"version":3,"file":"asyncDerivation.mjs","names":[],"sources":["../../../src/reactivity/asyncDerivation.ts"],"sourcesContent":["import { AbortControllerPolyfill } from '@wevu/web-apis/abort'\nimport { batch, onScopeDispose, runWithoutTracking } from './core'\nimport { reactive } from './reactive'\nimport { readonly } from './readonly'\n\n/** 异步派生状态的生命周期阶段。 */\nexport type AsyncDerivationStatus\n = | 'idle'\n | 'initial-pending'\n | 'ready'\n | 'refreshing'\n | 'error'\n | 'disposed'\n\n/** 传给异步加载函数的当前任务上下文。 */\nexport interface AsyncDerivationContext {\n readonly signal: AbortSignal\n}\n\n/** `useAsyncDerivation()` 的配置。 */\nexport interface UseAsyncDerivationOptions {\n immediate?: boolean\n}\n\ntype AsyncDerivationIdleState<TStatus extends 'idle' | 'initial-pending' | 'disposed'> = Readonly<{\n status: TStatus\n value: undefined\n error: undefined\n}>\n\ntype AsyncDerivationReadyState<T, TStatus extends 'ready' | 'refreshing'> = Readonly<{\n status: TStatus\n value: T\n error: undefined\n}>\n\ntype AsyncDerivationErrorState<T> = Readonly<{\n status: 'error'\n value: T | undefined\n error: unknown\n}>\n\n/** 模板可观察的只读异步派生状态。 */\nexport type AsyncDerivationState<T>\n = | AsyncDerivationIdleState<'idle'>\n | AsyncDerivationIdleState<'initial-pending'>\n | AsyncDerivationIdleState<'disposed'>\n | AsyncDerivationReadyState<T, 'ready'>\n | AsyncDerivationReadyState<T, 'refreshing'>\n | AsyncDerivationErrorState<T>\n\ntype AsyncDerivationControls = Readonly<{\n refresh: () => Promise<void>\n dispose: () => void\n}>\n\n/** 异步派生状态及其非枚举控制方法。 */\nexport type AsyncDerivation<T> = AsyncDerivationState<T> & AsyncDerivationControls\n\ninterface MutableAsyncDerivationState<T> {\n status: AsyncDerivationStatus\n value: T | undefined\n error: unknown\n}\n\ninterface AsyncDerivationCycle {\n readonly promise: Promise<void>\n readonly resolve: () => void\n}\n\nconst RESOLVED_PROMISE: Promise<void> = Promise.resolve()\n\nfunction createAsyncDerivationCycle(): AsyncDerivationCycle {\n let resolve!: () => void\n const promise = new Promise<void>((settle) => {\n resolve = settle\n })\n return { promise, resolve }\n}\n\n/**\n * 创建面向静态 WXML 数据绑定的异步派生状态。\n * 加载错误通过 `status` 与 `error` 暴露,`refresh()` 始终正常完成。\n */\nexport function useAsyncDerivation<T>(\n loader: (context: AsyncDerivationContext) => T | PromiseLike<T>,\n options: UseAsyncDerivationOptions = {},\n): AsyncDerivation<T> {\n const storage: MutableAsyncDerivationState<T> = {\n status: 'idle',\n value: undefined,\n error: undefined,\n }\n const state = reactive(storage)\n let activeController: AbortController | undefined\n let activeCycle: AsyncDerivationCycle | undefined\n let generation = 0\n let hasValue = false\n let disposed = false\n\n function settleLatestCycle(completedGeneration: number) {\n if (disposed || completedGeneration !== generation) {\n return\n }\n const cycle = activeCycle\n activeCycle = undefined\n cycle?.resolve()\n }\n\n function commitValue(completedGeneration: number, value: T) {\n if (disposed || completedGeneration !== generation) {\n return\n }\n activeController = undefined\n hasValue = true\n try {\n batch(() => {\n state.status = 'ready'\n state.value = value\n state.error = undefined\n })\n }\n finally {\n settleLatestCycle(completedGeneration)\n }\n }\n\n function commitError(completedGeneration: number, error: unknown) {\n if (disposed || completedGeneration !== generation) {\n return\n }\n activeController = undefined\n try {\n batch(() => {\n state.status = 'error'\n state.error = error\n if (!hasValue) {\n state.value = undefined\n }\n })\n }\n finally {\n settleLatestCycle(completedGeneration)\n }\n }\n\n function refresh(): Promise<void> {\n if (disposed) {\n return RESOLVED_PROMISE\n }\n\n const cycle = activeCycle ?? createAsyncDerivationCycle()\n activeCycle = cycle\n const currentGeneration = ++generation\n const previousController = activeController\n // eslint-disable-next-line mini-program/no-implicit-runtime-polyfill -- 缺失宿主实现时显式回退兼容层。\n const Controller = typeof AbortController === 'function' ? AbortController : AbortControllerPolyfill\n const controller = new Controller() as unknown as AbortController\n activeController = controller\n try {\n previousController?.abort()\n }\n catch {\n // 原生 EventTarget 不把 abort listener 异常传播给调用者,兼容实现保持相同控制流。\n }\n\n if (disposed || currentGeneration !== generation) {\n return cycle.promise\n }\n\n batch(() => {\n state.status = hasValue ? 'refreshing' : 'initial-pending'\n state.error = undefined\n })\n\n if (disposed || currentGeneration !== generation) {\n return cycle.promise\n }\n\n runWithoutTracking(() => {\n // 自有 Promise 避免原生 Promise 的身份快路径把 then 访问移出收养边界。\n const task = new Promise<T>((resolve) => {\n resolve(loader({ signal: controller.signal }))\n })\n void task.then(\n value => commitValue(currentGeneration, value),\n error => commitError(currentGeneration, error),\n ).catch((error) => {\n // 观察者异常交给宿主报告,不改写加载结果,也不阻塞 refresh 的完成。\n setTimeout(() => {\n throw error\n }, 0)\n })\n })\n return cycle.promise\n }\n\n function dispose() {\n if (disposed) {\n return\n }\n disposed = true\n generation += 1\n const controller = activeController\n activeController = undefined\n try {\n controller?.abort()\n }\n catch {\n // dispose 必须完成状态清理和 waiter 结算,不能被 listener 异常中断。\n }\n try {\n batch(() => {\n state.status = 'disposed'\n state.value = undefined\n state.error = undefined\n })\n }\n finally {\n hasValue = false\n const cycle = activeCycle\n activeCycle = undefined\n cycle?.resolve()\n }\n }\n\n Object.defineProperties(storage, {\n refresh: {\n value: refresh,\n },\n dispose: {\n value: dispose,\n },\n })\n\n const result = readonly(state) as AsyncDerivation<T>\n onScopeDispose(dispose)\n if (options.immediate ?? true) {\n void refresh()\n }\n return result\n}\n"],"mappings":";;;;;;AAsEA,MAAM,mBAAkC,QAAQ,QAAQ;AAExD,SAAS,6BAAmD;CAC1D,IAAI;CAIJ,OAAO;EAAE,aAHW,SAAe,WAAW;GAC5C,UAAU;EACZ,CACe;EAAG;CAAQ;AAC5B;;;;;AAMA,SAAgB,mBACd,QACA,UAAqC,CAAC,GAClB;CACpB,MAAM,UAA0C;EAC9C,QAAQ;EACR,OAAO;EACP,OAAO;CACT;CACA,MAAM,QAAQ,SAAS,OAAO;CAC9B,IAAI;CACJ,IAAI;CACJ,IAAI,aAAa;CACjB,IAAI,WAAW;CACf,IAAI,WAAW;CAEf,SAAS,kBAAkB,qBAA6B;EACtD,IAAI,YAAY,wBAAwB,YACtC;EAEF,MAAM,QAAQ;EACd,cAAc;EACd,OAAO,QAAQ;CACjB;CAEA,SAAS,YAAY,qBAA6B,OAAU;EAC1D,IAAI,YAAY,wBAAwB,YACtC;EAEF,mBAAmB;EACnB,WAAW;EACX,IAAI;GACF,YAAY;IACV,MAAM,SAAS;IACf,MAAM,QAAQ;IACd,MAAM,QAAQ;GAChB,CAAC;EACH,UACQ;GACN,kBAAkB,mBAAmB;EACvC;CACF;CAEA,SAAS,YAAY,qBAA6B,OAAgB;EAChE,IAAI,YAAY,wBAAwB,YACtC;EAEF,mBAAmB;EACnB,IAAI;GACF,YAAY;IACV,MAAM,SAAS;IACf,MAAM,QAAQ;IACd,IAAI,CAAC,UACH,MAAM,QAAQ;GAElB,CAAC;EACH,UACQ;GACN,kBAAkB,mBAAmB;EACvC;CACF;CAEA,SAAS,UAAyB;EAChC,IAAI,UACF,OAAO;EAGT,MAAM,QAAQ,eAAe,2BAA2B;EACxD,cAAc;EACd,MAAM,oBAAoB,EAAE;EAC5B,MAAM,qBAAqB;EAG3B,MAAM,aAAa,KADA,OAAO,oBAAoB,aAAa,kBAAkB,yBAC3C;EAClC,mBAAmB;EACnB,IAAI;GACF,oBAAoB,MAAM;EAC5B,QACM,CAEN;EAEA,IAAI,YAAY,sBAAsB,YACpC,OAAO,MAAM;EAGf,YAAY;GACV,MAAM,SAAS,WAAW,eAAe;GACzC,MAAM,QAAQ;EAChB,CAAC;EAED,IAAI,YAAY,sBAAsB,YACpC,OAAO,MAAM;EAGf,yBAAyB;GAKvB,AAAK,IAHY,SAAY,YAAY;IACvC,QAAQ,OAAO,EAAE,QAAQ,WAAW,OAAO,CAAC,CAAC;GAC/C,CACQ,CAAC,CAAC,MACR,UAAS,YAAY,mBAAmB,KAAK,IAC7C,UAAS,YAAY,mBAAmB,KAAK,CAC/C,CAAC,CAAC,OAAO,UAAU;IAEjB,iBAAiB;KACf,MAAM;IACR,GAAG,CAAC;GACN,CAAC;EACH,CAAC;EACD,OAAO,MAAM;CACf;CAEA,SAAS,UAAU;EACjB,IAAI,UACF;EAEF,WAAW;EACX,cAAc;EACd,MAAM,aAAa;EACnB,mBAAmB;EACnB,IAAI;GACF,YAAY,MAAM;EACpB,QACM,CAEN;EACA,IAAI;GACF,YAAY;IACV,MAAM,SAAS;IACf,MAAM,QAAQ;IACd,MAAM,QAAQ;GAChB,CAAC;EACH,UACQ;GACN,WAAW;GACX,MAAM,QAAQ;GACd,cAAc;GACd,OAAO,QAAQ;EACjB;CACF;CAEA,OAAO,iBAAiB,SAAS;EAC/B,SAAS,EACP,OAAO,QACT;EACA,SAAS,EACP,OAAO,QACT;CACF,CAAC;CAED,MAAM,SAAS,SAAS,KAAK;CAC7B,eAAe,OAAO;CACtB,IAAI,QAAQ,aAAa,MACvB,AAAK,QAAQ;CAEf,OAAO;AACT"}
@@ -1,5 +1,5 @@
1
1
  import { queueJob } from "../scheduler.mjs";
2
- import _defineProperty from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/defineProperty.mjs";
2
+ import _defineProperty from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/defineProperty.mjs";
3
3
 
4
4
  //#region src/reactivity/core.ts
5
5
  const targetMap = /* @__PURE__ */ new WeakMap();
@@ -96,11 +96,10 @@ function cleanupEffect(effect) {
96
96
  deps.length = 0;
97
97
  }
98
98
  function stop(runner) {
99
- var _runner$onStop;
100
99
  if (!runner.active) return;
101
100
  runner.active = false;
102
101
  cleanupEffect(runner);
103
- (_runner$onStop = runner.onStop) === null || _runner$onStop === void 0 || _runner$onStop.call(runner);
102
+ runner.onStop?.();
104
103
  }
105
104
  var EffectScopeImpl = class {
106
105
  constructor(detached = false) {
@@ -166,8 +165,7 @@ var EffectScopeImpl = class {
166
165
  scopes.length = 0;
167
166
  }
168
167
  } finally {
169
- var _this$parent;
170
- if ((_this$parent = this.parent) === null || _this$parent === void 0 ? void 0 : _this$parent.scopes) {
168
+ if (this.parent?.scopes) {
171
169
  const index = this.parent.scopes.indexOf(this);
172
170
  if (index >= 0) this.parent.scopes.splice(index, 1);
173
171
  }
@@ -184,7 +182,7 @@ function getCurrentScope() {
184
182
  return activeEffectScope;
185
183
  }
186
184
  function onScopeDispose(fn) {
187
- if (activeEffectScope === null || activeEffectScope === void 0 ? void 0 : activeEffectScope.active) activeEffectScope.cleanups.push(fn);
185
+ if (activeEffectScope?.active) activeEffectScope.cleanups.push(fn);
188
186
  }
189
187
  /**
190
188
  * 在不把读取记录到当前副作用的情况下执行函数。
@@ -222,9 +220,8 @@ function createReactiveEffect(fn, options = {}) {
222
220
  activeEffect = effect;
223
221
  return fn();
224
222
  } finally {
225
- var _effectStack;
226
223
  effectStack.pop();
227
- activeEffect = (_effectStack = effectStack[effectStack.length - 1]) !== null && _effectStack !== void 0 ? _effectStack : null;
224
+ activeEffect = effectStack[effectStack.length - 1] ?? null;
228
225
  effect._running = false;
229
226
  activeEffectScope = previousScope;
230
227
  shouldTrack = previousShouldTrack;
@@ -1 +1 @@
1
- {"version":3,"file":"core.mjs","names":[],"sources":["../../../src/reactivity/core.ts"],"sourcesContent":["import { queueJob } from '../scheduler'\n\nexport type EffectScheduler = () => void\n\nexport type Dep = Set<ReactiveEffect>\n\nexport interface ReactiveEffect<T = any> {\n (): T\n deps: Dep[]\n scheduler?: EffectScheduler\n active: boolean\n _running: boolean\n _fn: () => T\n _computed?: boolean\n onStop?: () => void\n}\n\nconst targetMap = new WeakMap<object, Map<PropertyKey, Dep>>()\n\nlet activeEffect: ReactiveEffect | null = null\nconst effectStack: ReactiveEffect[] = []\nlet shouldTrack = true\nlet activeEffectScope: EffectScopeImpl | undefined\n\nlet batchDepth = 0\nlet isFlushingBatch = false\nconst batchedEffects = new Set<ReactiveEffect>()\nconst batchedCallbacks = new Set<() => void>()\n\nfunction runScheduledEffect(ef: ReactiveEffect) {\n if (!ef.active) {\n return\n }\n if (ef.scheduler) {\n const previousScope = activeEffectScope\n activeEffectScope = (ef as ScopedReactiveEffect)._scope\n try {\n ef.scheduler()\n }\n finally {\n activeEffectScope = previousScope\n }\n return\n }\n ef()\n}\n\n/** 在当前批次的同步副作用全部完成后执行包内通知。 */\nexport function queueBatchCallback(callback: () => void) {\n if (batchDepth > 0 || isFlushingBatch) {\n batchedCallbacks.add(callback)\n return\n }\n batchedCallbacks.delete(callback)\n callback()\n}\n\nexport function startBatch() {\n batchDepth++\n}\n\nfunction takeBatchedEffect(effects: Set<ReactiveEffect>): ReactiveEffect | undefined {\n const next = effects.values().next()\n if (next.done) {\n return undefined\n }\n effects.delete(next.value)\n return next.value\n}\n\nfunction flushBatchedEffects() {\n let firstError: unknown\n let hasError = false\n isFlushingBatch = true\n try {\n while (batchedEffects.size) {\n const effect = takeBatchedEffect(batchedEffects)\n if (!effect) {\n continue\n }\n try {\n runScheduledEffect(effect)\n }\n catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n }\n finally {\n isFlushingBatch = false\n }\n // 通知属于已完成批次之后的操作,保留订阅回调内同步变更的重入保护。\n while (batchedCallbacks.size) {\n const callback = batchedCallbacks.values().next().value!\n batchedCallbacks.delete(callback)\n try {\n callback()\n }\n catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n if (hasError) {\n throw firstError\n }\n}\n\nexport function endBatch() {\n if (batchDepth === 0) {\n return\n }\n batchDepth--\n if (batchDepth === 0 && !isFlushingBatch) {\n flushBatchedEffects()\n }\n}\n\nexport function batch<T>(fn: () => T): T {\n startBatch()\n try {\n return fn()\n }\n finally {\n endBatch()\n }\n}\n\nfunction cleanupEffect(effect: ReactiveEffect) {\n const { deps } = effect\n for (let i = 0; i < deps.length; i++) {\n deps[i].delete(effect)\n }\n deps.length = 0\n}\n\nexport function stop(runner: ReactiveEffect) {\n if (!runner.active) {\n return\n }\n runner.active = false\n cleanupEffect(runner)\n runner.onStop?.()\n}\n\nexport interface EffectScope {\n active: boolean\n effects: ReactiveEffect[]\n cleanups: (() => void)[]\n run: <T>(fn: () => T) => T | undefined\n stop: () => void\n}\n\nclass EffectScopeImpl implements EffectScope {\n active = true\n effects: ReactiveEffect[] = []\n cleanups: (() => void)[] = []\n private parent: EffectScopeImpl | undefined\n private scopes: EffectScopeImpl[] | undefined\n\n constructor(private detached = false) {\n if (!detached && activeEffectScope) {\n if (!activeEffectScope.active) {\n this.active = false\n return\n }\n this.parent = activeEffectScope\n ;(activeEffectScope.scopes ||= []).push(this)\n }\n }\n\n run<T>(fn: () => T): T | undefined {\n if (!this.active) {\n return\n }\n const prev = activeEffectScope\n // eslint-disable-next-line ts/no-this-alias -- 允许 this 临时别名\n activeEffectScope = this\n try {\n return fn()\n }\n finally {\n activeEffectScope = prev\n }\n }\n\n stop(): void {\n if (!this.active) {\n return\n }\n this.active = false\n const prev = activeEffectScope\n // eslint-disable-next-line ts/no-this-alias -- teardown 期间需要把新建 scope 绑定到当前停止中的 scope\n activeEffectScope = this\n\n let firstError: unknown\n let hasError = false\n const recordError = (error: unknown) => {\n if (hasError) {\n return\n }\n firstError = error\n hasError = true\n }\n\n try {\n const effects = this.effects.splice(0)\n for (const effect of effects) {\n try {\n stop(effect)\n }\n catch (error) {\n recordError(error)\n }\n }\n\n const cleanups = this.cleanups.splice(0)\n for (const cleanup of cleanups) {\n try {\n cleanup()\n }\n catch (error) {\n recordError(error)\n }\n }\n\n const scopes = this.scopes\n this.scopes = undefined\n if (scopes) {\n for (const scope of scopes) {\n try {\n scope.stop()\n }\n catch (error) {\n recordError(error)\n }\n }\n scopes.length = 0\n }\n }\n finally {\n if (this.parent?.scopes) {\n const index = this.parent.scopes.indexOf(this)\n if (index >= 0) {\n this.parent.scopes.splice(index, 1)\n }\n }\n this.parent = undefined\n activeEffectScope = prev\n }\n\n if (hasError) {\n throw firstError\n }\n }\n}\n\ninterface ScopedReactiveEffect<T = any> extends ReactiveEffect<T> {\n _scope: EffectScopeImpl | undefined\n}\n\nexport function effectScope(detached = false): EffectScope {\n return new EffectScopeImpl(detached)\n}\n\nexport function getCurrentScope(): EffectScope | undefined {\n return activeEffectScope\n}\n\nexport function onScopeDispose(fn: () => void): void {\n if (activeEffectScope?.active) {\n activeEffectScope.cleanups.push(fn)\n }\n}\n\n/**\n * 在不把读取记录到当前副作用的情况下执行函数。\n * 函数内部主动运行的新副作用仍会正常收集自己的依赖。\n */\nexport function runWithoutTracking<T>(fn: () => T): T {\n const previousShouldTrack = shouldTrack\n shouldTrack = false\n try {\n return fn()\n }\n finally {\n shouldTrack = previousShouldTrack\n }\n}\n\nfunction recordEffectScope(effect: ReactiveEffect) {\n if (!activeEffectScope) {\n return\n }\n if (activeEffectScope.active) {\n activeEffectScope.effects.push(effect)\n return\n }\n stop(effect)\n}\n\nexport interface EffectOptions {\n scheduler?: EffectScheduler\n lazy?: boolean\n onStop?: () => void\n}\n\nexport function createReactiveEffect<T>(fn: () => T, options: EffectOptions = {}): ReactiveEffect<T> {\n const effect = function reactiveEffect() {\n if (!effect.active) {\n return fn()\n }\n if (effect._running) {\n return fn()\n }\n cleanupEffect(effect)\n const previousScope = activeEffectScope\n activeEffectScope = effect._scope\n const previousShouldTrack = shouldTrack\n try {\n shouldTrack = true\n effect._running = true\n effectStack.push(effect)\n activeEffect = effect\n return fn()\n }\n finally {\n effectStack.pop()\n activeEffect = effectStack[effectStack.length - 1] ?? null\n effect._running = false\n activeEffectScope = previousScope\n shouldTrack = previousShouldTrack\n }\n } as ScopedReactiveEffect<T>\n\n effect.deps = []\n effect.scheduler = options.scheduler\n effect.onStop = options.onStop\n effect.active = true\n effect._running = false\n effect._fn = fn\n effect._scope = activeEffectScope\n\n return effect\n}\n\nfunction createEffect<T>(\n fn: () => T,\n options: EffectOptions,\n computed: boolean,\n): ReactiveEffect<T> {\n const runner = createReactiveEffect(fn, options)\n runner._computed = computed\n recordEffectScope(runner)\n if (!options.lazy) {\n runner()\n }\n return runner\n}\n\nexport function effect<T = any>(fn: () => T, options: EffectOptions = {}): ReactiveEffect<T> {\n return createEffect(fn, options, false)\n}\n\nexport function createComputedEffect<T>(\n fn: () => T,\n options: EffectOptions = {},\n): ReactiveEffect<T> {\n return createEffect(fn, options, true)\n}\n\nexport function track(target: object, key: PropertyKey) {\n if (!shouldTrack || !activeEffect) {\n return\n }\n let depsMap = targetMap.get(target)\n if (!depsMap) {\n depsMap = new Map()\n targetMap.set(target, depsMap)\n }\n let dep = depsMap.get(key)\n if (!dep) {\n dep = new Set()\n depsMap.set(key, dep)\n }\n if (!dep.has(activeEffect)) {\n dep.add(activeEffect)\n activeEffect.deps.push(dep)\n }\n}\n\nfunction scheduleEffect(ef: ReactiveEffect) {\n if (ef._running) {\n return\n }\n // 计算属性只同步失效缓存,普通消费者仍由批处理队列合并。\n if (ef._computed) {\n runScheduledEffect(ef)\n return\n }\n if (batchDepth > 0 || isFlushingBatch) {\n batchedEffects.add(ef)\n return\n }\n runScheduledEffect(ef)\n}\n\nexport function trigger(target: object, key: PropertyKey) {\n const depsMap = targetMap.get(target)\n if (!depsMap) {\n return\n }\n const effects = depsMap.get(key)\n if (!effects) {\n return\n }\n const effectsToRun = new Set<ReactiveEffect>()\n effects.forEach((ef) => {\n if (ef !== activeEffect) {\n effectsToRun.add(ef)\n }\n })\n effectsToRun.forEach(scheduleEffect)\n}\n\nexport function trackEffects(dep: Dep) {\n if (!shouldTrack || !activeEffect) {\n return\n }\n if (!dep.has(activeEffect)) {\n dep.add(activeEffect)\n activeEffect.deps.push(dep)\n }\n}\n\nexport function triggerEffects(dep: Dep) {\n // 迭代时复制依赖集合,避免遍历过程中被重新加入导致死循环。\n const effectsToRun = new Set(dep)\n effectsToRun.forEach(scheduleEffect)\n}\n\n// 导出队列调度工具,供 watch/watchEffect 等高层 API 复用同一批处理逻辑\nexport { queueJob }\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.mjs","names":[],"sources":["../../../src/reactivity/core.ts"],"sourcesContent":["import { queueJob } from '../scheduler'\n\nexport type EffectScheduler = () => void\n\nexport type Dep = Set<ReactiveEffect>\n\nexport interface ReactiveEffect<T = any> {\n (): T\n deps: Dep[]\n scheduler?: EffectScheduler\n active: boolean\n _running: boolean\n _fn: () => T\n _computed?: boolean\n onStop?: () => void\n}\n\nconst targetMap = new WeakMap<object, Map<PropertyKey, Dep>>()\n\nlet activeEffect: ReactiveEffect | null = null\nconst effectStack: ReactiveEffect[] = []\nlet shouldTrack = true\nlet activeEffectScope: EffectScopeImpl | undefined\n\nlet batchDepth = 0\nlet isFlushingBatch = false\nconst batchedEffects = new Set<ReactiveEffect>()\nconst batchedCallbacks = new Set<() => void>()\n\nfunction runScheduledEffect(ef: ReactiveEffect) {\n if (!ef.active) {\n return\n }\n if (ef.scheduler) {\n const previousScope = activeEffectScope\n activeEffectScope = (ef as ScopedReactiveEffect)._scope\n try {\n ef.scheduler()\n }\n finally {\n activeEffectScope = previousScope\n }\n return\n }\n ef()\n}\n\n/** 在当前批次的同步副作用全部完成后执行包内通知。 */\nexport function queueBatchCallback(callback: () => void) {\n if (batchDepth > 0 || isFlushingBatch) {\n batchedCallbacks.add(callback)\n return\n }\n batchedCallbacks.delete(callback)\n callback()\n}\n\nexport function startBatch() {\n batchDepth++\n}\n\nfunction takeBatchedEffect(effects: Set<ReactiveEffect>): ReactiveEffect | undefined {\n const next = effects.values().next()\n if (next.done) {\n return undefined\n }\n effects.delete(next.value)\n return next.value\n}\n\nfunction flushBatchedEffects() {\n let firstError: unknown\n let hasError = false\n isFlushingBatch = true\n try {\n while (batchedEffects.size) {\n const effect = takeBatchedEffect(batchedEffects)\n if (!effect) {\n continue\n }\n try {\n runScheduledEffect(effect)\n }\n catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n }\n finally {\n isFlushingBatch = false\n }\n // 通知属于已完成批次之后的操作,保留订阅回调内同步变更的重入保护。\n while (batchedCallbacks.size) {\n const callback = batchedCallbacks.values().next().value!\n batchedCallbacks.delete(callback)\n try {\n callback()\n }\n catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n if (hasError) {\n throw firstError\n }\n}\n\nexport function endBatch() {\n if (batchDepth === 0) {\n return\n }\n batchDepth--\n if (batchDepth === 0 && !isFlushingBatch) {\n flushBatchedEffects()\n }\n}\n\nexport function batch<T>(fn: () => T): T {\n startBatch()\n try {\n return fn()\n }\n finally {\n endBatch()\n }\n}\n\nfunction cleanupEffect(effect: ReactiveEffect) {\n const { deps } = effect\n for (let i = 0; i < deps.length; i++) {\n deps[i].delete(effect)\n }\n deps.length = 0\n}\n\nexport function stop(runner: ReactiveEffect) {\n if (!runner.active) {\n return\n }\n runner.active = false\n cleanupEffect(runner)\n runner.onStop?.()\n}\n\nexport interface EffectScope {\n active: boolean\n effects: ReactiveEffect[]\n cleanups: (() => void)[]\n run: <T>(fn: () => T) => T | undefined\n stop: () => void\n}\n\nclass EffectScopeImpl implements EffectScope {\n active = true\n effects: ReactiveEffect[] = []\n cleanups: (() => void)[] = []\n private parent: EffectScopeImpl | undefined\n private scopes: EffectScopeImpl[] | undefined\n\n constructor(private detached = false) {\n if (!detached && activeEffectScope) {\n if (!activeEffectScope.active) {\n this.active = false\n return\n }\n this.parent = activeEffectScope\n ;(activeEffectScope.scopes ||= []).push(this)\n }\n }\n\n run<T>(fn: () => T): T | undefined {\n if (!this.active) {\n return\n }\n const prev = activeEffectScope\n // eslint-disable-next-line ts/no-this-alias -- 允许 this 临时别名\n activeEffectScope = this\n try {\n return fn()\n }\n finally {\n activeEffectScope = prev\n }\n }\n\n stop(): void {\n if (!this.active) {\n return\n }\n this.active = false\n const prev = activeEffectScope\n // eslint-disable-next-line ts/no-this-alias -- teardown 期间需要把新建 scope 绑定到当前停止中的 scope\n activeEffectScope = this\n\n let firstError: unknown\n let hasError = false\n const recordError = (error: unknown) => {\n if (hasError) {\n return\n }\n firstError = error\n hasError = true\n }\n\n try {\n const effects = this.effects.splice(0)\n for (const effect of effects) {\n try {\n stop(effect)\n }\n catch (error) {\n recordError(error)\n }\n }\n\n const cleanups = this.cleanups.splice(0)\n for (const cleanup of cleanups) {\n try {\n cleanup()\n }\n catch (error) {\n recordError(error)\n }\n }\n\n const scopes = this.scopes\n this.scopes = undefined\n if (scopes) {\n for (const scope of scopes) {\n try {\n scope.stop()\n }\n catch (error) {\n recordError(error)\n }\n }\n scopes.length = 0\n }\n }\n finally {\n if (this.parent?.scopes) {\n const index = this.parent.scopes.indexOf(this)\n if (index >= 0) {\n this.parent.scopes.splice(index, 1)\n }\n }\n this.parent = undefined\n activeEffectScope = prev\n }\n\n if (hasError) {\n throw firstError\n }\n }\n}\n\ninterface ScopedReactiveEffect<T = any> extends ReactiveEffect<T> {\n _scope: EffectScopeImpl | undefined\n}\n\nexport function effectScope(detached = false): EffectScope {\n return new EffectScopeImpl(detached)\n}\n\nexport function getCurrentScope(): EffectScope | undefined {\n return activeEffectScope\n}\n\nexport function onScopeDispose(fn: () => void): void {\n if (activeEffectScope?.active) {\n activeEffectScope.cleanups.push(fn)\n }\n}\n\n/**\n * 在不把读取记录到当前副作用的情况下执行函数。\n * 函数内部主动运行的新副作用仍会正常收集自己的依赖。\n */\nexport function runWithoutTracking<T>(fn: () => T): T {\n const previousShouldTrack = shouldTrack\n shouldTrack = false\n try {\n return fn()\n }\n finally {\n shouldTrack = previousShouldTrack\n }\n}\n\nfunction recordEffectScope(effect: ReactiveEffect) {\n if (!activeEffectScope) {\n return\n }\n if (activeEffectScope.active) {\n activeEffectScope.effects.push(effect)\n return\n }\n stop(effect)\n}\n\nexport interface EffectOptions {\n scheduler?: EffectScheduler\n lazy?: boolean\n onStop?: () => void\n}\n\nexport function createReactiveEffect<T>(fn: () => T, options: EffectOptions = {}): ReactiveEffect<T> {\n const effect = function reactiveEffect() {\n if (!effect.active) {\n return fn()\n }\n if (effect._running) {\n return fn()\n }\n cleanupEffect(effect)\n const previousScope = activeEffectScope\n activeEffectScope = effect._scope\n const previousShouldTrack = shouldTrack\n try {\n shouldTrack = true\n effect._running = true\n effectStack.push(effect)\n activeEffect = effect\n return fn()\n }\n finally {\n effectStack.pop()\n activeEffect = effectStack[effectStack.length - 1] ?? null\n effect._running = false\n activeEffectScope = previousScope\n shouldTrack = previousShouldTrack\n }\n } as ScopedReactiveEffect<T>\n\n effect.deps = []\n effect.scheduler = options.scheduler\n effect.onStop = options.onStop\n effect.active = true\n effect._running = false\n effect._fn = fn\n effect._scope = activeEffectScope\n\n return effect\n}\n\nfunction createEffect<T>(\n fn: () => T,\n options: EffectOptions,\n computed: boolean,\n): ReactiveEffect<T> {\n const runner = createReactiveEffect(fn, options)\n runner._computed = computed\n recordEffectScope(runner)\n if (!options.lazy) {\n runner()\n }\n return runner\n}\n\nexport function effect<T = any>(fn: () => T, options: EffectOptions = {}): ReactiveEffect<T> {\n return createEffect(fn, options, false)\n}\n\nexport function createComputedEffect<T>(\n fn: () => T,\n options: EffectOptions = {},\n): ReactiveEffect<T> {\n return createEffect(fn, options, true)\n}\n\nexport function track(target: object, key: PropertyKey) {\n if (!shouldTrack || !activeEffect) {\n return\n }\n let depsMap = targetMap.get(target)\n if (!depsMap) {\n depsMap = new Map()\n targetMap.set(target, depsMap)\n }\n let dep = depsMap.get(key)\n if (!dep) {\n dep = new Set()\n depsMap.set(key, dep)\n }\n if (!dep.has(activeEffect)) {\n dep.add(activeEffect)\n activeEffect.deps.push(dep)\n }\n}\n\nfunction scheduleEffect(ef: ReactiveEffect) {\n if (ef._running) {\n return\n }\n // 计算属性只同步失效缓存,普通消费者仍由批处理队列合并。\n if (ef._computed) {\n runScheduledEffect(ef)\n return\n }\n if (batchDepth > 0 || isFlushingBatch) {\n batchedEffects.add(ef)\n return\n }\n runScheduledEffect(ef)\n}\n\nexport function trigger(target: object, key: PropertyKey) {\n const depsMap = targetMap.get(target)\n if (!depsMap) {\n return\n }\n const effects = depsMap.get(key)\n if (!effects) {\n return\n }\n const effectsToRun = new Set<ReactiveEffect>()\n effects.forEach((ef) => {\n if (ef !== activeEffect) {\n effectsToRun.add(ef)\n }\n })\n effectsToRun.forEach(scheduleEffect)\n}\n\nexport function trackEffects(dep: Dep) {\n if (!shouldTrack || !activeEffect) {\n return\n }\n if (!dep.has(activeEffect)) {\n dep.add(activeEffect)\n activeEffect.deps.push(dep)\n }\n}\n\nexport function triggerEffects(dep: Dep) {\n // 迭代时复制依赖集合,避免遍历过程中被重新加入导致死循环。\n const effectsToRun = new Set(dep)\n effectsToRun.forEach(scheduleEffect)\n}\n\n// 导出队列调度工具,供 watch/watchEffect 等高层 API 复用同一批处理逻辑\nexport { queueJob }\n"],"mappings":"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"}
@@ -11,9 +11,9 @@ function prelinkReactiveTree(root, options) {
11
11
  const rootRaw = toRaw(root);
12
12
  rawPathMap.set(rootRaw, "");
13
13
  indexPatchNode(rootRaw, rootRaw);
14
- const shouldIncludeTopKey = options === null || options === void 0 ? void 0 : options.shouldIncludeTopKey;
15
- const maxDepth = typeof (options === null || options === void 0 ? void 0 : options.maxDepth) === "number" ? Math.max(0, Math.floor(options.maxDepth)) : Number.POSITIVE_INFINITY;
16
- const maxKeys = typeof (options === null || options === void 0 ? void 0 : options.maxKeys) === "number" ? Math.max(0, Math.floor(options.maxKeys)) : Number.POSITIVE_INFINITY;
14
+ const shouldIncludeTopKey = options?.shouldIncludeTopKey;
15
+ const maxDepth = typeof options?.maxDepth === "number" ? Math.max(0, Math.floor(options.maxDepth)) : Number.POSITIVE_INFINITY;
16
+ const maxKeys = typeof options?.maxKeys === "number" ? Math.max(0, Math.floor(options.maxKeys)) : Number.POSITIVE_INFINITY;
17
17
  const visited = /* @__PURE__ */ new WeakSet();
18
18
  const stack = [{
19
19
  current: rootRaw,
@@ -1 +1 @@
1
- {"version":3,"file":"patch.mjs","names":[],"sources":["../../../../src/reactivity/reactive/patch.ts"],"sourcesContent":["import { track } from '../core'\nimport {\n adoptReactiveRoot,\n indexPatchNode,\n rawMultiParentSet,\n rawParentMap,\n rawParentsMap,\n rawPathMap,\n rawRootMap,\n rawVersionMap,\n recordParentLink,\n rootPatchNodesMap,\n} from './patchState'\nimport { isObject, ReactiveFlags, toRaw, VERSION_KEY } from './shared'\n\nexport interface PrelinkReactiveTreeOptions {\n shouldIncludeTopKey?: (key: string) => boolean\n maxDepth?: number\n maxKeys?: number\n}\n\n/**\n * 预链接响应式树结构,供运行时差量路径追踪使用。\n * @internal\n */\nexport function prelinkReactiveTree(root: object, options?: PrelinkReactiveTreeOptions) {\n const rootRaw = toRaw(root as any) as object\n rawPathMap.set(rootRaw, '')\n indexPatchNode(rootRaw, rootRaw)\n\n const shouldIncludeTopKey = options?.shouldIncludeTopKey\n const maxDepth = typeof options?.maxDepth === 'number' ? Math.max(0, Math.floor(options!.maxDepth!)) : Number.POSITIVE_INFINITY\n const maxKeys = typeof options?.maxKeys === 'number' ? Math.max(0, Math.floor(options!.maxKeys!)) : Number.POSITIVE_INFINITY\n\n const visited = new WeakSet<object>()\n const stack: Array<{ current: object, path: string, depth: number }> = [{ current: rootRaw, path: '', depth: 0 }]\n let indexed = 0\n\n while (stack.length) {\n const node = stack.pop()!\n if (visited.has(node.current)) {\n continue\n }\n visited.add(node.current)\n rawPathMap.set(node.current, node.path)\n indexPatchNode(rootRaw, node.current)\n indexed += 1\n if (indexed >= maxKeys) {\n continue\n }\n\n if (node.depth >= maxDepth) {\n continue\n }\n if (Array.isArray(node.current)) {\n // 数组不预先展开子元素:大列表场景避免 O(n) 初始化开销。\n continue\n }\n\n const entries = Object.entries(node.current as any)\n for (const [key, value] of entries) {\n if (node.path === '' && shouldIncludeTopKey && !shouldIncludeTopKey(key)) {\n continue\n }\n if (!isObject(value)) {\n continue\n }\n if ((value as any)[ReactiveFlags.SKIP]) {\n continue\n }\n const childRaw = toRaw(value as any) as object\n adoptReactiveRoot(childRaw, node.current)\n recordParentLink(childRaw, node.current, key)\n if (!rawMultiParentSet.has(childRaw)) {\n const childPath = node.path ? `${node.path}.${key}` : key\n rawPathMap.set(childRaw, childPath)\n }\n indexPatchNode(rootRaw, childRaw)\n stack.push({ current: childRaw, path: node.path ? `${node.path}.${key}` : key, depth: node.depth + 1 })\n }\n }\n}\n\n/**\n * 清理预链接阶段建立的路径与父子索引。\n * @internal\n */\nexport function clearPatchIndices(root: object) {\n const rootRaw = toRaw(root as any) as object\n const nodes = rootPatchNodesMap.get(rootRaw)\n if (!nodes) {\n rawPathMap.delete(rootRaw)\n return\n }\n\n for (const node of nodes) {\n rawParentMap.delete(node)\n rawParentsMap.delete(node)\n rawPathMap.delete(node)\n rawMultiParentSet.delete(node)\n rawRootMap.delete(node)\n rawVersionMap.delete(node)\n }\n\n rootPatchNodesMap.delete(rootRaw)\n}\n\n/**\n * 让 effect 订阅整个对象的“版本号”,无需深度遍历即可对任何字段变化做出响应。\n * @internal\n */\nexport function touchReactive(target: object) {\n const raw = toRaw(target as any) as object\n track(raw, VERSION_KEY)\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAgB,oBAAoB,MAAc,SAAsC;CACtF,MAAM,UAAU,MAAM,IAAW;CACjC,WAAW,IAAI,SAAS,EAAE;CAC1B,eAAe,SAAS,OAAO;CAE/B,MAAM,wEAAsB,QAAS;CACrC,MAAM,WAAW,0DAAO,QAAS,cAAa,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAS,QAAS,CAAC,IAAI,OAAO;CAC9G,MAAM,UAAU,0DAAO,QAAS,aAAY,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAS,OAAQ,CAAC,IAAI,OAAO;CAE3G,MAAM,0BAAU,IAAI,QAAgB;CACpC,MAAM,QAAiE,CAAC;EAAE,SAAS;EAAS,MAAM;EAAI,OAAO;CAAE,CAAC;CAChH,IAAI,UAAU;CAEd,OAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,IAAI;EACvB,IAAI,QAAQ,IAAI,KAAK,OAAO,GAC1B;EAEF,QAAQ,IAAI,KAAK,OAAO;EACxB,WAAW,IAAI,KAAK,SAAS,KAAK,IAAI;EACtC,eAAe,SAAS,KAAK,OAAO;EACpC,WAAW;EACX,IAAI,WAAW,SACb;EAGF,IAAI,KAAK,SAAS,UAChB;EAEF,IAAI,MAAM,QAAQ,KAAK,OAAO,GAE5B;EAGF,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAc;EAClD,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS;GAClC,IAAI,KAAK,SAAS,MAAM,uBAAuB,CAAC,oBAAoB,GAAG,GACrE;GAEF,IAAI,CAAC,SAAS,KAAK,GACjB;GAEF,IAAK,mBACH;GAEF,MAAM,WAAW,MAAM,KAAY;GACnC,kBAAkB,UAAU,KAAK,OAAO;GACxC,iBAAiB,UAAU,KAAK,SAAS,GAAG;GAC5C,IAAI,CAAC,kBAAkB,IAAI,QAAQ,GAAG;IACpC,MAAM,YAAY,KAAK,OAAO,GAAG,KAAK,KAAK,GAAG,QAAQ;IACtD,WAAW,IAAI,UAAU,SAAS;GACpC;GACA,eAAe,SAAS,QAAQ;GAChC,MAAM,KAAK;IAAE,SAAS;IAAU,MAAM,KAAK,OAAO,GAAG,KAAK,KAAK,GAAG,QAAQ;IAAK,OAAO,KAAK,QAAQ;GAAE,CAAC;EACxG;CACF;AACF;;;;;AAMA,SAAgB,kBAAkB,MAAc;CAC9C,MAAM,UAAU,MAAM,IAAW;CACjC,MAAM,QAAQ,kBAAkB,IAAI,OAAO;CAC3C,IAAI,CAAC,OAAO;EACV,WAAW,OAAO,OAAO;EACzB;CACF;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,aAAa,OAAO,IAAI;EACxB,cAAc,OAAO,IAAI;EACzB,WAAW,OAAO,IAAI;EACtB,kBAAkB,OAAO,IAAI;EAC7B,WAAW,OAAO,IAAI;EACtB,cAAc,OAAO,IAAI;CAC3B;CAEA,kBAAkB,OAAO,OAAO;AAClC;;;;;AAMA,SAAgB,cAAc,QAAgB;CAC5C,MAAM,MAAM,MAAM,MAAa;CAC/B,MAAM,KAAK,WAAW;AACxB"}
1
+ {"version":3,"file":"patch.mjs","names":[],"sources":["../../../../src/reactivity/reactive/patch.ts"],"sourcesContent":["import { track } from '../core'\nimport {\n adoptReactiveRoot,\n indexPatchNode,\n rawMultiParentSet,\n rawParentMap,\n rawParentsMap,\n rawPathMap,\n rawRootMap,\n rawVersionMap,\n recordParentLink,\n rootPatchNodesMap,\n} from './patchState'\nimport { isObject, ReactiveFlags, toRaw, VERSION_KEY } from './shared'\n\nexport interface PrelinkReactiveTreeOptions {\n shouldIncludeTopKey?: (key: string) => boolean\n maxDepth?: number\n maxKeys?: number\n}\n\n/**\n * 预链接响应式树结构,供运行时差量路径追踪使用。\n * @internal\n */\nexport function prelinkReactiveTree(root: object, options?: PrelinkReactiveTreeOptions) {\n const rootRaw = toRaw(root as any) as object\n rawPathMap.set(rootRaw, '')\n indexPatchNode(rootRaw, rootRaw)\n\n const shouldIncludeTopKey = options?.shouldIncludeTopKey\n const maxDepth = typeof options?.maxDepth === 'number' ? Math.max(0, Math.floor(options!.maxDepth!)) : Number.POSITIVE_INFINITY\n const maxKeys = typeof options?.maxKeys === 'number' ? Math.max(0, Math.floor(options!.maxKeys!)) : Number.POSITIVE_INFINITY\n\n const visited = new WeakSet<object>()\n const stack: Array<{ current: object, path: string, depth: number }> = [{ current: rootRaw, path: '', depth: 0 }]\n let indexed = 0\n\n while (stack.length) {\n const node = stack.pop()!\n if (visited.has(node.current)) {\n continue\n }\n visited.add(node.current)\n rawPathMap.set(node.current, node.path)\n indexPatchNode(rootRaw, node.current)\n indexed += 1\n if (indexed >= maxKeys) {\n continue\n }\n\n if (node.depth >= maxDepth) {\n continue\n }\n if (Array.isArray(node.current)) {\n // 数组不预先展开子元素:大列表场景避免 O(n) 初始化开销。\n continue\n }\n\n const entries = Object.entries(node.current as any)\n for (const [key, value] of entries) {\n if (node.path === '' && shouldIncludeTopKey && !shouldIncludeTopKey(key)) {\n continue\n }\n if (!isObject(value)) {\n continue\n }\n if ((value as any)[ReactiveFlags.SKIP]) {\n continue\n }\n const childRaw = toRaw(value as any) as object\n adoptReactiveRoot(childRaw, node.current)\n recordParentLink(childRaw, node.current, key)\n if (!rawMultiParentSet.has(childRaw)) {\n const childPath = node.path ? `${node.path}.${key}` : key\n rawPathMap.set(childRaw, childPath)\n }\n indexPatchNode(rootRaw, childRaw)\n stack.push({ current: childRaw, path: node.path ? `${node.path}.${key}` : key, depth: node.depth + 1 })\n }\n }\n}\n\n/**\n * 清理预链接阶段建立的路径与父子索引。\n * @internal\n */\nexport function clearPatchIndices(root: object) {\n const rootRaw = toRaw(root as any) as object\n const nodes = rootPatchNodesMap.get(rootRaw)\n if (!nodes) {\n rawPathMap.delete(rootRaw)\n return\n }\n\n for (const node of nodes) {\n rawParentMap.delete(node)\n rawParentsMap.delete(node)\n rawPathMap.delete(node)\n rawMultiParentSet.delete(node)\n rawRootMap.delete(node)\n rawVersionMap.delete(node)\n }\n\n rootPatchNodesMap.delete(rootRaw)\n}\n\n/**\n * 让 effect 订阅整个对象的“版本号”,无需深度遍历即可对任何字段变化做出响应。\n * @internal\n */\nexport function touchReactive(target: object) {\n const raw = toRaw(target as any) as object\n track(raw, VERSION_KEY)\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAgB,oBAAoB,MAAc,SAAsC;CACtF,MAAM,UAAU,MAAM,IAAW;CACjC,WAAW,IAAI,SAAS,EAAE;CAC1B,eAAe,SAAS,OAAO;CAE/B,MAAM,sBAAsB,SAAS;CACrC,MAAM,WAAW,OAAO,SAAS,aAAa,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAS,QAAS,CAAC,IAAI,OAAO;CAC9G,MAAM,UAAU,OAAO,SAAS,YAAY,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAS,OAAQ,CAAC,IAAI,OAAO;CAE3G,MAAM,0BAAU,IAAI,QAAgB;CACpC,MAAM,QAAiE,CAAC;EAAE,SAAS;EAAS,MAAM;EAAI,OAAO;CAAE,CAAC;CAChH,IAAI,UAAU;CAEd,OAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,IAAI;EACvB,IAAI,QAAQ,IAAI,KAAK,OAAO,GAC1B;EAEF,QAAQ,IAAI,KAAK,OAAO;EACxB,WAAW,IAAI,KAAK,SAAS,KAAK,IAAI;EACtC,eAAe,SAAS,KAAK,OAAO;EACpC,WAAW;EACX,IAAI,WAAW,SACb;EAGF,IAAI,KAAK,SAAS,UAChB;EAEF,IAAI,MAAM,QAAQ,KAAK,OAAO,GAE5B;EAGF,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAc;EAClD,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS;GAClC,IAAI,KAAK,SAAS,MAAM,uBAAuB,CAAC,oBAAoB,GAAG,GACrE;GAEF,IAAI,CAAC,SAAS,KAAK,GACjB;GAEF,IAAK,mBACH;GAEF,MAAM,WAAW,MAAM,KAAY;GACnC,kBAAkB,UAAU,KAAK,OAAO;GACxC,iBAAiB,UAAU,KAAK,SAAS,GAAG;GAC5C,IAAI,CAAC,kBAAkB,IAAI,QAAQ,GAAG;IACpC,MAAM,YAAY,KAAK,OAAO,GAAG,KAAK,KAAK,GAAG,QAAQ;IACtD,WAAW,IAAI,UAAU,SAAS;GACpC;GACA,eAAe,SAAS,QAAQ;GAChC,MAAM,KAAK;IAAE,SAAS;IAAU,MAAM,KAAK,OAAO,GAAG,KAAK,KAAK,GAAG,QAAQ;IAAK,OAAO,KAAK,QAAQ;GAAE,CAAC;EACxG;CACF;AACF;;;;;AAMA,SAAgB,kBAAkB,MAAc;CAC9C,MAAM,UAAU,MAAM,IAAW;CACjC,MAAM,QAAQ,kBAAkB,IAAI,OAAO;CAC3C,IAAI,CAAC,OAAO;EACV,WAAW,OAAO,OAAO;EACzB;CACF;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,aAAa,OAAO,IAAI;EACxB,cAAc,OAAO,IAAI;EACzB,WAAW,OAAO,IAAI;EACtB,kBAAkB,OAAO,IAAI;EAC7B,WAAW,OAAO,IAAI;EACtB,cAAc,OAAO,IAAI;CAC3B;CAEA,kBAAkB,OAAO,OAAO;AAClC;;;;;AAMA,SAAgB,cAAc,QAAgB;CAC5C,MAAM,MAAM,MAAM,MAAa;CAC/B,MAAM,KAAK,WAAW;AACxB"}
@@ -20,20 +20,17 @@ function indexPatchNode(root, node) {
20
20
  getRootPatchNodes(root).add(node);
21
21
  }
22
22
  function bumpRawVersion(target) {
23
- var _rawVersionMap$get;
24
- rawVersionMap.set(target, ((_rawVersionMap$get = rawVersionMap.get(target)) !== null && _rawVersionMap$get !== void 0 ? _rawVersionMap$get : 0) + 1);
23
+ rawVersionMap.set(target, (rawVersionMap.get(target) ?? 0) + 1);
25
24
  }
26
25
  function getRawVersion(target) {
27
- var _rawVersionMap$get2;
28
- return (_rawVersionMap$get2 = rawVersionMap.get(target)) !== null && _rawVersionMap$get2 !== void 0 ? _rawVersionMap$get2 : 0;
26
+ return rawVersionMap.get(target) ?? 0;
29
27
  }
30
28
  /**
31
29
  * 将尚未归属父状态树的响应式节点接入父级根节点。
32
30
  * @internal
33
31
  */
34
32
  function adoptReactiveRoot(child, parent) {
35
- var _rawRootMap$get;
36
- const parentRoot = (_rawRootMap$get = rawRootMap.get(parent)) !== null && _rawRootMap$get !== void 0 ? _rawRootMap$get : parent;
33
+ const parentRoot = rawRootMap.get(parent) ?? parent;
37
34
  const existingRoot = rawRootMap.get(child);
38
35
  if (!existingRoot || existingRoot === child || existingRoot === parent) rawRootMap.set(child, parentRoot);
39
36
  }
@@ -89,8 +86,7 @@ function recordParentLink(child, parent, key) {
89
86
  return;
90
87
  }
91
88
  if (mutationRecorders.size) {
92
- var _rawRootMap$get2;
93
- const root = (_rawRootMap$get2 = rawRootMap.get(parent)) !== null && _rawRootMap$get2 !== void 0 ? _rawRootMap$get2 : parent;
89
+ const root = rawRootMap.get(parent) ?? parent;
94
90
  indexPatchNode(root, parent);
95
91
  indexPatchNode(root, child);
96
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"patchState.mjs","names":[],"sources":["../../../../src/reactivity/reactive/patchState.ts"],"sourcesContent":["import { mutationRecorders } from './mutation'\n\nexport const rawRootMap = new WeakMap<object, object>()\nexport const rawVersionMap = new WeakMap<object, number>()\nexport const rawParentMap = new WeakMap<object, { parent: object, key: PropertyKey }>()\nexport const rawParentsMap = new WeakMap<object, Map<object, Set<PropertyKey>>>()\nexport const rawMultiParentSet = new WeakSet<object>()\nexport const rawPathMap = new WeakMap<object, string>()\nexport const rootPatchNodesMap = new WeakMap<object, Set<object>>()\n\nfunction getRootPatchNodes(root: object) {\n let nodes = rootPatchNodesMap.get(root)\n if (!nodes) {\n nodes = new Set()\n rootPatchNodesMap.set(root, nodes)\n }\n return nodes\n}\n\nexport function indexPatchNode(root: object, node: object) {\n getRootPatchNodes(root).add(node)\n}\n\nexport function bumpRawVersion(target: object) {\n rawVersionMap.set(target, (rawVersionMap.get(target) ?? 0) + 1)\n}\n\nexport function getRawVersion(target: object) {\n return rawVersionMap.get(target) ?? 0\n}\n\n/**\n * 将尚未归属父状态树的响应式节点接入父级根节点。\n * @internal\n */\nexport function adoptReactiveRoot(child: object, parent: object) {\n const parentRoot = rawRootMap.get(parent) ?? parent\n const existingRoot = rawRootMap.get(child)\n if (!existingRoot || existingRoot === child || existingRoot === parent) {\n rawRootMap.set(child, parentRoot)\n }\n}\n\nexport function bumpAncestorVersions(target: object) {\n const visited = new Set<object>()\n const stack: object[] = [target]\n for (let i = 0; i < 2000 && stack.length; i++) {\n const current = stack.pop()!\n const parents = rawParentsMap.get(current)\n if (!parents) {\n continue\n }\n for (const parent of parents.keys()) {\n if (visited.has(parent)) {\n continue\n }\n visited.add(parent)\n bumpRawVersion(parent)\n stack.push(parent)\n }\n }\n}\n\nfunction refreshPathUniqueness(child: object) {\n const parents = rawParentsMap.get(child)\n if (!parents) {\n rawMultiParentSet.delete(child)\n rawParentMap.delete(child)\n return\n }\n\n let uniqueParent: object | undefined\n let uniqueKey: PropertyKey | undefined\n let total = 0\n for (const [parent, keys] of parents) {\n for (const k of keys) {\n total += 1\n if (total > 1) {\n break\n }\n uniqueParent = parent\n uniqueKey = k\n }\n if (total > 1) {\n break\n }\n }\n\n if (total === 1 && uniqueParent && uniqueKey) {\n rawMultiParentSet.delete(child)\n rawParentMap.set(child, { parent: uniqueParent, key: uniqueKey })\n return\n }\n\n rawMultiParentSet.add(child)\n rawParentMap.delete(child)\n}\n\nexport function recordParentLink(child: object, parent: object, key: PropertyKey) {\n if (typeof key !== 'string') {\n rawMultiParentSet.add(child)\n rawParentMap.delete(child)\n return\n }\n\n if (mutationRecorders.size) {\n const root = rawRootMap.get(parent) ?? parent\n indexPatchNode(root, parent)\n indexPatchNode(root, child)\n }\n\n let parents = rawParentsMap.get(child)\n if (!parents) {\n parents = new Map()\n rawParentsMap.set(child, parents)\n }\n\n let keys = parents.get(parent)\n if (!keys) {\n keys = new Set()\n parents.set(parent, keys)\n }\n\n keys.add(key)\n refreshPathUniqueness(child)\n}\n\nexport function removeParentLink(child: object, parent: object, key: PropertyKey) {\n const parents = rawParentsMap.get(child)\n if (!parents) {\n return\n }\n const keys = parents.get(parent)\n if (!keys) {\n return\n }\n keys.delete(key)\n if (!keys.size) {\n parents.delete(parent)\n }\n if (!parents.size) {\n rawParentsMap.delete(child)\n }\n refreshPathUniqueness(child)\n}\n\nexport function resolvePathToTarget(root: object, target: object): string[] | undefined {\n if (target === root) {\n return []\n }\n if (rawMultiParentSet.has(target)) {\n return undefined\n }\n const segments: string[] = []\n let current: object = target\n for (let i = 0; i < 2000; i++) {\n if (current === root) {\n return segments.reverse()\n }\n if (rawMultiParentSet.has(current)) {\n return undefined\n }\n const info = rawParentMap.get(current)\n if (!info) {\n return undefined\n }\n if (typeof info.key !== 'string') {\n return undefined\n }\n segments.push(info.key)\n current = info.parent\n }\n return undefined\n}\n"],"mappings":";;;AAEA,MAAa,6BAAa,IAAI,QAAwB;AACtD,MAAa,gCAAgB,IAAI,QAAwB;AACzD,MAAa,+BAAe,IAAI,QAAsD;AACtF,MAAa,gCAAgB,IAAI,QAA+C;AAChF,MAAa,oCAAoB,IAAI,QAAgB;AACrD,MAAa,6BAAa,IAAI,QAAwB;AACtD,MAAa,oCAAoB,IAAI,QAA6B;AAElE,SAAS,kBAAkB,MAAc;CACvC,IAAI,QAAQ,kBAAkB,IAAI,IAAI;CACtC,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,kBAAkB,IAAI,MAAM,KAAK;CACnC;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,MAAc,MAAc;CACzD,kBAAkB,IAAI,CAAC,CAAC,IAAI,IAAI;AAClC;AAEA,SAAgB,eAAe,QAAgB;;CAC7C,cAAc,IAAI,+BAAS,cAAc,IAAI,MAAM,oEAAK,KAAK,CAAC;AAChE;AAEA,SAAgB,cAAc,QAAgB;;CAC5C,8BAAO,cAAc,IAAI,MAAM,sEAAK;AACtC;;;;;AAMA,SAAgB,kBAAkB,OAAe,QAAgB;;CAC/D,MAAM,gCAAa,WAAW,IAAI,MAAM,8DAAK;CAC7C,MAAM,eAAe,WAAW,IAAI,KAAK;CACzC,IAAI,CAAC,gBAAgB,iBAAiB,SAAS,iBAAiB,QAC9D,WAAW,IAAI,OAAO,UAAU;AAEpC;AAEA,SAAgB,qBAAqB,QAAgB;CACnD,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,QAAkB,CAAC,MAAM;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAQ,MAAM,QAAQ,KAAK;EAC7C,MAAM,UAAU,MAAM,IAAI;EAC1B,MAAM,UAAU,cAAc,IAAI,OAAO;EACzC,IAAI,CAAC,SACH;EAEF,KAAK,MAAM,UAAU,QAAQ,KAAK,GAAG;GACnC,IAAI,QAAQ,IAAI,MAAM,GACpB;GAEF,QAAQ,IAAI,MAAM;GAClB,eAAe,MAAM;GACrB,MAAM,KAAK,MAAM;EACnB;CACF;AACF;AAEA,SAAS,sBAAsB,OAAe;CAC5C,MAAM,UAAU,cAAc,IAAI,KAAK;CACvC,IAAI,CAAC,SAAS;EACZ,kBAAkB,OAAO,KAAK;EAC9B,aAAa,OAAO,KAAK;EACzB;CACF;CAEA,IAAI;CACJ,IAAI;CACJ,IAAI,QAAQ;CACZ,KAAK,MAAM,CAAC,QAAQ,SAAS,SAAS;EACpC,KAAK,MAAM,KAAK,MAAM;GACpB,SAAS;GACT,IAAI,QAAQ,GACV;GAEF,eAAe;GACf,YAAY;EACd;EACA,IAAI,QAAQ,GACV;CAEJ;CAEA,IAAI,UAAU,KAAK,gBAAgB,WAAW;EAC5C,kBAAkB,OAAO,KAAK;EAC9B,aAAa,IAAI,OAAO;GAAE,QAAQ;GAAc,KAAK;EAAU,CAAC;EAChE;CACF;CAEA,kBAAkB,IAAI,KAAK;CAC3B,aAAa,OAAO,KAAK;AAC3B;AAEA,SAAgB,iBAAiB,OAAe,QAAgB,KAAkB;CAChF,IAAI,OAAO,QAAQ,UAAU;EAC3B,kBAAkB,IAAI,KAAK;EAC3B,aAAa,OAAO,KAAK;EACzB;CACF;CAEA,IAAI,kBAAkB,MAAM;;EAC1B,MAAM,2BAAO,WAAW,IAAI,MAAM,gEAAK;EACvC,eAAe,MAAM,MAAM;EAC3B,eAAe,MAAM,KAAK;CAC5B;CAEA,IAAI,UAAU,cAAc,IAAI,KAAK;CACrC,IAAI,CAAC,SAAS;EACZ,0BAAU,IAAI,IAAI;EAClB,cAAc,IAAI,OAAO,OAAO;CAClC;CAEA,IAAI,OAAO,QAAQ,IAAI,MAAM;CAC7B,IAAI,CAAC,MAAM;EACT,uBAAO,IAAI,IAAI;EACf,QAAQ,IAAI,QAAQ,IAAI;CAC1B;CAEA,KAAK,IAAI,GAAG;CACZ,sBAAsB,KAAK;AAC7B;AAEA,SAAgB,iBAAiB,OAAe,QAAgB,KAAkB;CAChF,MAAM,UAAU,cAAc,IAAI,KAAK;CACvC,IAAI,CAAC,SACH;CAEF,MAAM,OAAO,QAAQ,IAAI,MAAM;CAC/B,IAAI,CAAC,MACH;CAEF,KAAK,OAAO,GAAG;CACf,IAAI,CAAC,KAAK,MACR,QAAQ,OAAO,MAAM;CAEvB,IAAI,CAAC,QAAQ,MACX,cAAc,OAAO,KAAK;CAE5B,sBAAsB,KAAK;AAC7B;AAEA,SAAgB,oBAAoB,MAAc,QAAsC;CACtF,IAAI,WAAW,MACb,OAAO,CAAC;CAEV,IAAI,kBAAkB,IAAI,MAAM,GAC9B;CAEF,MAAM,WAAqB,CAAC;CAC5B,IAAI,UAAkB;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAM,KAAK;EAC7B,IAAI,YAAY,MACd,OAAO,SAAS,QAAQ;EAE1B,IAAI,kBAAkB,IAAI,OAAO,GAC/B;EAEF,MAAM,OAAO,aAAa,IAAI,OAAO;EACrC,IAAI,CAAC,MACH;EAEF,IAAI,OAAO,KAAK,QAAQ,UACtB;EAEF,SAAS,KAAK,KAAK,GAAG;EACtB,UAAU,KAAK;CACjB;AAEF"}
1
+ {"version":3,"file":"patchState.mjs","names":[],"sources":["../../../../src/reactivity/reactive/patchState.ts"],"sourcesContent":["import { mutationRecorders } from './mutation'\n\nexport const rawRootMap = new WeakMap<object, object>()\nexport const rawVersionMap = new WeakMap<object, number>()\nexport const rawParentMap = new WeakMap<object, { parent: object, key: PropertyKey }>()\nexport const rawParentsMap = new WeakMap<object, Map<object, Set<PropertyKey>>>()\nexport const rawMultiParentSet = new WeakSet<object>()\nexport const rawPathMap = new WeakMap<object, string>()\nexport const rootPatchNodesMap = new WeakMap<object, Set<object>>()\n\nfunction getRootPatchNodes(root: object) {\n let nodes = rootPatchNodesMap.get(root)\n if (!nodes) {\n nodes = new Set()\n rootPatchNodesMap.set(root, nodes)\n }\n return nodes\n}\n\nexport function indexPatchNode(root: object, node: object) {\n getRootPatchNodes(root).add(node)\n}\n\nexport function bumpRawVersion(target: object) {\n rawVersionMap.set(target, (rawVersionMap.get(target) ?? 0) + 1)\n}\n\nexport function getRawVersion(target: object) {\n return rawVersionMap.get(target) ?? 0\n}\n\n/**\n * 将尚未归属父状态树的响应式节点接入父级根节点。\n * @internal\n */\nexport function adoptReactiveRoot(child: object, parent: object) {\n const parentRoot = rawRootMap.get(parent) ?? parent\n const existingRoot = rawRootMap.get(child)\n if (!existingRoot || existingRoot === child || existingRoot === parent) {\n rawRootMap.set(child, parentRoot)\n }\n}\n\nexport function bumpAncestorVersions(target: object) {\n const visited = new Set<object>()\n const stack: object[] = [target]\n for (let i = 0; i < 2000 && stack.length; i++) {\n const current = stack.pop()!\n const parents = rawParentsMap.get(current)\n if (!parents) {\n continue\n }\n for (const parent of parents.keys()) {\n if (visited.has(parent)) {\n continue\n }\n visited.add(parent)\n bumpRawVersion(parent)\n stack.push(parent)\n }\n }\n}\n\nfunction refreshPathUniqueness(child: object) {\n const parents = rawParentsMap.get(child)\n if (!parents) {\n rawMultiParentSet.delete(child)\n rawParentMap.delete(child)\n return\n }\n\n let uniqueParent: object | undefined\n let uniqueKey: PropertyKey | undefined\n let total = 0\n for (const [parent, keys] of parents) {\n for (const k of keys) {\n total += 1\n if (total > 1) {\n break\n }\n uniqueParent = parent\n uniqueKey = k\n }\n if (total > 1) {\n break\n }\n }\n\n if (total === 1 && uniqueParent && uniqueKey) {\n rawMultiParentSet.delete(child)\n rawParentMap.set(child, { parent: uniqueParent, key: uniqueKey })\n return\n }\n\n rawMultiParentSet.add(child)\n rawParentMap.delete(child)\n}\n\nexport function recordParentLink(child: object, parent: object, key: PropertyKey) {\n if (typeof key !== 'string') {\n rawMultiParentSet.add(child)\n rawParentMap.delete(child)\n return\n }\n\n if (mutationRecorders.size) {\n const root = rawRootMap.get(parent) ?? parent\n indexPatchNode(root, parent)\n indexPatchNode(root, child)\n }\n\n let parents = rawParentsMap.get(child)\n if (!parents) {\n parents = new Map()\n rawParentsMap.set(child, parents)\n }\n\n let keys = parents.get(parent)\n if (!keys) {\n keys = new Set()\n parents.set(parent, keys)\n }\n\n keys.add(key)\n refreshPathUniqueness(child)\n}\n\nexport function removeParentLink(child: object, parent: object, key: PropertyKey) {\n const parents = rawParentsMap.get(child)\n if (!parents) {\n return\n }\n const keys = parents.get(parent)\n if (!keys) {\n return\n }\n keys.delete(key)\n if (!keys.size) {\n parents.delete(parent)\n }\n if (!parents.size) {\n rawParentsMap.delete(child)\n }\n refreshPathUniqueness(child)\n}\n\nexport function resolvePathToTarget(root: object, target: object): string[] | undefined {\n if (target === root) {\n return []\n }\n if (rawMultiParentSet.has(target)) {\n return undefined\n }\n const segments: string[] = []\n let current: object = target\n for (let i = 0; i < 2000; i++) {\n if (current === root) {\n return segments.reverse()\n }\n if (rawMultiParentSet.has(current)) {\n return undefined\n }\n const info = rawParentMap.get(current)\n if (!info) {\n return undefined\n }\n if (typeof info.key !== 'string') {\n return undefined\n }\n segments.push(info.key)\n current = info.parent\n }\n return undefined\n}\n"],"mappings":"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"}
@@ -31,8 +31,7 @@ function isArrayIndexKey(key) {
31
31
  return Number.isInteger(n) && n >= 0 && String(n) === key;
32
32
  }
33
33
  function toRaw(observed) {
34
- var _ReactiveFlags$RAW;
35
- return (_ReactiveFlags$RAW = observed === null || observed === void 0 ? void 0 : observed["__r_raw"]) !== null && _ReactiveFlags$RAW !== void 0 ? _ReactiveFlags$RAW : observed;
34
+ return observed?.["__r_raw"] ?? observed;
36
35
  }
37
36
 
38
37
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"shared.mjs","names":[],"sources":["../../../../src/reactivity/reactive/shared.ts"],"sourcesContent":["export enum ReactiveFlags {\n IS_REACTIVE = '__r_isReactive',\n IS_READONLY = '__r_isReadonly',\n RAW = '__r_raw',\n SKIP = '__r_skip', // 标记此对象无需转换为响应式(用于 markRaw)\n}\n\nexport enum TargetType {\n INVALID = 0,\n COMMON = 1,\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null\n}\n\nexport function hasOwn(source: object, key: PropertyKey) {\n return Object.prototype.hasOwnProperty.call(source, key)\n}\n\nexport function toRawType(value: unknown) {\n return Object.prototype.toString.call(value).slice(8, -1)\n}\n\nfunction targetTypeMap(rawType: string) {\n switch (rawType) {\n case 'Object':\n case 'Array':\n return TargetType.COMMON\n case 'Map':\n case 'Set':\n case 'WeakMap':\n case 'WeakSet':\n // TODO: 后续如需支持集合响应式,需要引入专门的 collection handlers。\n return TargetType.INVALID\n default:\n return TargetType.INVALID\n }\n}\n\nexport function getTargetType(value: object) {\n return (value as any)[ReactiveFlags.SKIP]\n ? TargetType.INVALID\n : targetTypeMap(toRawType(value))\n}\n\n// 版本键(VERSION_KEY)表示“任意字段发生变化”,用于订阅整体版本避免深度遍历跟踪\nexport const VERSION_KEY: unique symbol = Symbol('wevu.version')\n\nexport function isArrayIndexKey(key: string) {\n if (!key) {\n return false\n }\n const code0 = key.charCodeAt(0)\n if (code0 < 48 || code0 > 57) {\n return false\n }\n const n = Number(key)\n return Number.isInteger(n) && n >= 0 && String(n) === key\n}\n\nexport function toRaw<T>(observed: T): T {\n return ((observed as any)?.[ReactiveFlags.RAW] ?? observed) as T\n}\n"],"mappings":";AAYA,SAAgB,SAAS,OAAiC;CACxD,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAgB,OAAO,QAAgB,KAAkB;CACvD,OAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AACzD;AAEA,SAAgB,UAAU,OAAgB;CACxC,OAAO,OAAO,UAAU,SAAS,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AAC1D;AAEA,SAAS,cAAc,SAAiB;CACtC,QAAQ,SAAR;EACE,KAAK;EACL,KAAK,SACH;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,WAEH;EACF,SACE;CACJ;AACF;AAEA,SAAgB,cAAc,OAAe;CAC3C,OAAQ,wBAEJ,cAAc,UAAU,KAAK,CAAC;AACpC;AAGA,MAAa,cAA6B,OAAO,cAAc;AAE/D,SAAgB,gBAAgB,KAAa;CAC3C,IAAI,CAAC,KACH,OAAO;CAET,MAAM,QAAQ,IAAI,WAAW,CAAC;CAC9B,IAAI,QAAQ,MAAM,QAAQ,IACxB,OAAO;CAET,MAAM,IAAI,OAAO,GAAG;CACpB,OAAO,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,OAAO,CAAC,MAAM;AACxD;AAEA,SAAgB,MAAS,UAAgB;;CACvC,iFAAS,sFAAyC;AACpD"}
1
+ {"version":3,"file":"shared.mjs","names":[],"sources":["../../../../src/reactivity/reactive/shared.ts"],"sourcesContent":["export enum ReactiveFlags {\n IS_REACTIVE = '__r_isReactive',\n IS_READONLY = '__r_isReadonly',\n RAW = '__r_raw',\n SKIP = '__r_skip', // 标记此对象无需转换为响应式(用于 markRaw)\n}\n\nexport enum TargetType {\n INVALID = 0,\n COMMON = 1,\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null\n}\n\nexport function hasOwn(source: object, key: PropertyKey) {\n return Object.prototype.hasOwnProperty.call(source, key)\n}\n\nexport function toRawType(value: unknown) {\n return Object.prototype.toString.call(value).slice(8, -1)\n}\n\nfunction targetTypeMap(rawType: string) {\n switch (rawType) {\n case 'Object':\n case 'Array':\n return TargetType.COMMON\n case 'Map':\n case 'Set':\n case 'WeakMap':\n case 'WeakSet':\n // TODO: 后续如需支持集合响应式,需要引入专门的 collection handlers。\n return TargetType.INVALID\n default:\n return TargetType.INVALID\n }\n}\n\nexport function getTargetType(value: object) {\n return (value as any)[ReactiveFlags.SKIP]\n ? TargetType.INVALID\n : targetTypeMap(toRawType(value))\n}\n\n// 版本键(VERSION_KEY)表示“任意字段发生变化”,用于订阅整体版本避免深度遍历跟踪\nexport const VERSION_KEY: unique symbol = Symbol('wevu.version')\n\nexport function isArrayIndexKey(key: string) {\n if (!key) {\n return false\n }\n const code0 = key.charCodeAt(0)\n if (code0 < 48 || code0 > 57) {\n return false\n }\n const n = Number(key)\n return Number.isInteger(n) && n >= 0 && String(n) === key\n}\n\nexport function toRaw<T>(observed: T): T {\n return ((observed as any)?.[ReactiveFlags.RAW] ?? observed) as T\n}\n"],"mappings":";AAYA,SAAgB,SAAS,OAAiC;CACxD,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAgB,OAAO,QAAgB,KAAkB;CACvD,OAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AACzD;AAEA,SAAgB,UAAU,OAAgB;CACxC,OAAO,OAAO,UAAU,SAAS,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AAC1D;AAEA,SAAS,cAAc,SAAiB;CACtC,QAAQ,SAAR;EACE,KAAK;EACL,KAAK,SACH;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,WAEH;EACF,SACE;CACJ;AACF;AAEA,SAAgB,cAAc,OAAe;CAC3C,OAAQ,wBAEJ,cAAc,UAAU,KAAK,CAAC;AACpC;AAGA,MAAa,cAA6B,OAAO,cAAc;AAE/D,SAAgB,gBAAgB,KAAa;CAC3C,IAAI,CAAC,KACH,OAAO;CAET,MAAM,QAAQ,IAAI,WAAW,CAAC;CAC9B,IAAI,QAAQ,MAAM,QAAQ,IACxB,OAAO;CAET,MAAM,IAAI,OAAO,GAAG;CACpB,OAAO,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,OAAO,CAAC,MAAM;AACxD;AAEA,SAAgB,MAAS,UAAgB;CACvC,OAAS,yBAAyC;AACpD"}
@@ -16,25 +16,22 @@ function getReactiveVersion(target) {
16
16
  return getRawVersion(raw);
17
17
  }
18
18
  function emitMutation(target, key, op) {
19
- var _rawRootMap$get;
20
19
  if (!mutationRecorders.size) return;
21
20
  if (typeof key !== "string") return;
22
21
  if (key.startsWith("__r_")) return;
23
- const root = (_rawRootMap$get = rawRootMap.get(target)) !== null && _rawRootMap$get !== void 0 ? _rawRootMap$get : target;
22
+ const root = rawRootMap.get(target) ?? target;
24
23
  const kind = Array.isArray(target) && (key === "length" || isArrayIndexKey(key)) ? "array" : "property";
25
24
  const baseSegments = resolvePathToTarget(root, target);
26
25
  if (!baseSegments) {
27
26
  const fallback = /* @__PURE__ */ new Set();
28
27
  const parents = rawParentsMap.get(target);
29
28
  if (parents) for (const [parent, keys] of parents) {
30
- var _resolvePathToTarget;
31
29
  const parentPath = rawPathMap.get(parent);
32
30
  const topFromParentPath = parentPath ? parentPath.split(".", 1)[0] : void 0;
33
- const topFromResolve = !topFromParentPath ? (_resolvePathToTarget = resolvePathToTarget(root, parent)) === null || _resolvePathToTarget === void 0 ? void 0 : _resolvePathToTarget[0] : void 0;
31
+ const topFromResolve = !topFromParentPath ? resolvePathToTarget(root, parent)?.[0] : void 0;
34
32
  for (const k of keys) {
35
- var _ref;
36
33
  if (typeof k !== "string") continue;
37
- fallback.add((_ref = topFromParentPath !== null && topFromParentPath !== void 0 ? topFromParentPath : topFromResolve) !== null && _ref !== void 0 ? _ref : k);
34
+ fallback.add(topFromParentPath ?? topFromResolve ?? k);
38
35
  }
39
36
  }
40
37
  else fallback.add(key);
@@ -74,9 +71,8 @@ const mutableHandlers = {
74
71
  const res = Reflect.get(target, key, receiver);
75
72
  track(target, key);
76
73
  if (isObject(res)) {
77
- var _ReactiveFlags$RAW;
78
74
  if (res["__r_skip"]) return res;
79
- const childRaw = (_ReactiveFlags$RAW = res === null || res === void 0 ? void 0 : res["__r_raw"]) !== null && _ReactiveFlags$RAW !== void 0 ? _ReactiveFlags$RAW : res;
75
+ const childRaw = res?.["__r_raw"] ?? res;
80
76
  adoptReactiveRoot(childRaw, target);
81
77
  recordParentLink(childRaw, target, key);
82
78
  const parentPath = rawPathMap.get(target);
@@ -132,8 +128,7 @@ const mutableHandlers = {
132
128
  const oldValue = hadKey ? target[key] : void 0;
133
129
  const result = Reflect.deleteProperty(target, key);
134
130
  if (hadKey && result) {
135
- var _ReactiveFlags$RAW2;
136
- const oldRaw = isObject(oldValue) ? (_ReactiveFlags$RAW2 = oldValue === null || oldValue === void 0 ? void 0 : oldValue["__r_raw"]) !== null && _ReactiveFlags$RAW2 !== void 0 ? _ReactiveFlags$RAW2 : oldValue : void 0;
131
+ const oldRaw = isObject(oldValue) ? oldValue?.["__r_raw"] ?? oldValue : void 0;
137
132
  if (oldRaw) removeParentLink(oldRaw, target, key);
138
133
  batch(() => {
139
134
  trigger(target, key);