wevu 7.4.0 → 7.6.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 (291) hide show
  1. package/README.md +2 -0
  2. package/dist/config/defaults.d.mts +44 -0
  3. package/dist/config/pageFeatures.d.mts +51 -0
  4. package/dist/config.d.mts +4 -0
  5. package/dist/config.mjs +1 -0
  6. package/dist/dev/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/defineProperty.mjs +1 -1
  7. package/dist/dev/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/toPrimitive.mjs +1 -1
  8. package/dist/dev/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/toPropertyKey.mjs +1 -1
  9. package/dist/dev/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/typeof.mjs +1 -1
  10. package/dist/dev/package.mjs +1 -1
  11. package/dist/dev/reactivity/computed.mjs.map +1 -1
  12. package/dist/dev/reactivity/core.mjs +1 -1
  13. package/dist/dev/reactivity/ref.mjs +1 -1
  14. package/dist/dev/reactivity/ref.mjs.map +1 -1
  15. package/dist/dev/runtime/app/diagnostics.mjs +5 -1
  16. package/dist/dev/runtime/app/diagnostics.mjs.map +1 -1
  17. package/dist/dev/runtime/app/mount.mjs +8 -3
  18. package/dist/dev/runtime/app/mount.mjs.map +1 -1
  19. package/dist/dev/runtime/app/setData/commitTracker.mjs +39 -4
  20. package/dist/dev/runtime/app/setData/commitTracker.mjs.map +1 -1
  21. package/dist/dev/runtime/app/setData/observation.mjs +109 -0
  22. package/dist/dev/runtime/app/setData/observation.mjs.map +1 -0
  23. package/dist/dev/runtime/app/setData/scheduler.mjs +12 -1
  24. package/dist/dev/runtime/app/setData/scheduler.mjs.map +1 -1
  25. package/dist/dev/runtime/app/setDataOptions.mjs +1 -0
  26. package/dist/dev/runtime/app/setDataOptions.mjs.map +1 -1
  27. package/dist/dev/runtime/define/initialComputed.mjs +13 -12
  28. package/dist/dev/runtime/define/initialComputed.mjs.map +1 -1
  29. package/dist/dev/runtime/define/props.mjs +5 -1
  30. package/dist/dev/runtime/define/props.mjs.map +1 -1
  31. package/dist/dev/runtime/define/scopedSlotOptions.mjs +2 -1
  32. package/dist/dev/runtime/define/scopedSlotOptions.mjs.map +1 -1
  33. package/dist/dev/runtime/define/setupResult.mjs +3 -5
  34. package/dist/dev/runtime/define/setupResult.mjs.map +1 -1
  35. package/dist/dev/runtime/define.mjs +3 -8
  36. package/dist/dev/runtime/define.mjs.map +1 -1
  37. package/dist/dev/runtime/features/scopedSlots.mjs.map +1 -1
  38. package/dist/dev/runtime/pageLayout.mjs.map +1 -1
  39. package/dist/dev/runtime/register/component/hmrRegistration.mjs +15 -0
  40. package/dist/dev/runtime/register/component/hmrRegistration.mjs.map +1 -0
  41. package/dist/dev/runtime/register/component/props.mjs +15 -5
  42. package/dist/dev/runtime/register/component/props.mjs.map +1 -1
  43. package/dist/dev/runtime/register/component/registerDefinition.mjs +30 -18
  44. package/dist/dev/runtime/register/component/registerDefinition.mjs.map +1 -1
  45. package/dist/dev/runtime/register/component.mjs +23 -12
  46. package/dist/dev/runtime/register/component.mjs.map +1 -1
  47. package/dist/dev/runtime/register/runtimeInstance/methodBridge.mjs +14 -7
  48. package/dist/dev/runtime/register/runtimeInstance/methodBridge.mjs.map +1 -1
  49. package/dist/dev/runtime/register/runtimeInstance/nativeDeclaration.mjs +78 -0
  50. package/dist/dev/runtime/register/runtimeInstance/nativeDeclaration.mjs.map +1 -0
  51. package/dist/dev/runtime/register/runtimeInstance/provideContext.mjs +52 -8
  52. package/dist/dev/runtime/register/runtimeInstance/provideContext.mjs.map +1 -1
  53. package/dist/dev/runtime/register/runtimeInstance/setupPhase.mjs +2 -25
  54. package/dist/dev/runtime/register/runtimeInstance/setupPhase.mjs.map +1 -1
  55. package/dist/dev/runtime/register/runtimeInstance/utils.mjs.map +1 -1
  56. package/dist/dev/runtime/register/runtimeInstance.mjs +69 -29
  57. package/dist/dev/runtime/register/runtimeInstance.mjs.map +1 -1
  58. package/dist/dev/runtime/register/watch.mjs +1 -3
  59. package/dist/dev/runtime/register/watch.mjs.map +1 -1
  60. package/dist/fetch.mjs +1 -1
  61. package/dist/index.d.mts +13 -8
  62. package/dist/internal-reactivity.d.mts +2 -1
  63. package/dist/internal-template.mjs +1 -1
  64. package/dist/jsx-runtime.d.mts +2 -1
  65. package/dist/macros/shared.d.mts +3 -2
  66. package/dist/macros.d.mts +3 -10
  67. package/dist/package.mjs +1 -1
  68. package/dist/reactivity/asyncDerivation.d.mts +2 -1
  69. package/dist/reactivity/computed.d.mts +3 -7
  70. package/dist/reactivity/core.mjs +1 -1
  71. package/dist/reactivity/index.d.mts +2 -1
  72. package/dist/reactivity/reactive/mutation.d.mts +2 -1
  73. package/dist/reactivity/reactive/patch.mjs +1 -1
  74. package/dist/reactivity/reactive/patchState.mjs +1 -1
  75. package/dist/reactivity/ref.d.mts +1 -1
  76. package/dist/reactivity/ref.mjs +1 -1
  77. package/dist/reactivity/toRefs.d.mts +2 -1
  78. package/dist/reactivity/watch/helpers.mjs +1 -1
  79. package/dist/reactivity/watch/types.d.mts +2 -1
  80. package/dist/router/initialNavigation.mjs +1 -1
  81. package/dist/router/types.d.mts +2 -1
  82. package/dist/router/useRoute.mjs +1 -1
  83. package/dist/routerInternal/matching.mjs +1 -1
  84. package/dist/routerInternal/params.mjs +1 -1
  85. package/dist/routerInternal/path.mjs +1 -1
  86. package/dist/routerInternal/query.mjs +1 -1
  87. package/dist/routerInternal/records.mjs +1 -1
  88. package/dist/runtime/app/context.mjs +1 -1
  89. package/dist/runtime/app/diagnostics.mjs +1 -1
  90. package/dist/runtime/app/mount.mjs +1 -1
  91. package/dist/runtime/app/setData/commitTracker.d.mts +2 -1
  92. package/dist/runtime/app/setData/commitTracker.mjs +1 -1
  93. package/dist/runtime/app/setData/observation.d.mts +13 -0
  94. package/dist/runtime/app/setData/observation.mjs +1 -0
  95. package/dist/runtime/app/setData/scheduler.d.mts +1 -0
  96. package/dist/runtime/app/setData/scheduler.mjs +1 -1
  97. package/dist/runtime/app/setDataOptions.mjs +1 -1
  98. package/dist/runtime/app.d.mts +1 -1
  99. package/dist/runtime/capabilities.d.mts +2 -2
  100. package/dist/runtime/define/initialComputed.mjs +1 -1
  101. package/dist/runtime/define/props.mjs +1 -1
  102. package/dist/runtime/define/scopedSlotOptions.mjs +1 -1
  103. package/dist/runtime/define/setupResult.mjs +1 -1
  104. package/dist/runtime/define.d.mts +5 -3
  105. package/dist/runtime/define.mjs +1 -1
  106. package/dist/runtime/diff.mjs +1 -1
  107. package/dist/runtime/features/publicLayout.d.mts +2 -1
  108. package/dist/runtime/features/publicLayout.mjs +1 -1
  109. package/dist/runtime/features/scopedSlots.d.mts +3 -2
  110. package/dist/runtime/index.d.mts +7 -4
  111. package/dist/runtime/jsxIsland.mjs +1 -1
  112. package/dist/runtime/pageLayout.d.mts +3 -2
  113. package/dist/runtime/pageLayout.mjs +1 -1
  114. package/dist/runtime/pageScroll.mjs +1 -1
  115. package/dist/runtime/register/app.d.mts +1 -1
  116. package/dist/runtime/register/component/alipayRegistration.mjs +1 -1
  117. package/dist/runtime/register/component/hmrRegistration.mjs +1 -0
  118. package/dist/runtime/register/component/lifecycle.mjs +1 -1
  119. package/dist/runtime/register/component/props.mjs +1 -1
  120. package/dist/runtime/register/component/registerDefinition.mjs +1 -1
  121. package/dist/runtime/register/component/registerNativeDefinition.mjs +1 -1
  122. package/dist/runtime/register/component.d.mts +1 -1
  123. package/dist/runtime/register/component.mjs +1 -1
  124. package/dist/runtime/register/inline.d.mts +2 -1
  125. package/dist/runtime/register/runtimeInstance/methodBridge.mjs +1 -1
  126. package/dist/runtime/register/runtimeInstance/nativeDeclaration.mjs +1 -0
  127. package/dist/runtime/register/runtimeInstance/provideContext.mjs +1 -1
  128. package/dist/runtime/register/runtimeInstance/setupPhase.mjs +1 -1
  129. package/dist/runtime/register/runtimeInstance.d.mts +11 -6
  130. package/dist/runtime/register/runtimeInstance.mjs +1 -1
  131. package/dist/runtime/register/setup.d.mts +2 -1
  132. package/dist/runtime/register/watch.d.mts +2 -1
  133. package/dist/runtime/register/watch.mjs +1 -1
  134. package/dist/runtime/setupTracking.mjs +1 -1
  135. package/dist/runtime/templateRefTypes.d.mts +3 -5
  136. package/dist/runtime/templateRefs.mjs +1 -1
  137. package/dist/runtime/types/core.d.mts +3 -7
  138. package/dist/runtime/types/miniprogramHostSources.d.mts +1 -0
  139. package/dist/runtime/types/options.d.mts +6 -52
  140. package/dist/runtime/types/props/propTypes.d.mts +2 -1
  141. package/dist/runtime/types/props/router.d.mts +2 -1
  142. package/dist/runtime/types/props/setup.d.mts +2 -1
  143. package/dist/runtime/types/runtime.d.mts +3 -1
  144. package/dist/runtime/types/setData.d.mts +30 -0
  145. package/dist/runtime/types.d.mts +5 -3
  146. package/dist/runtime/uniAppHost.d.mts +2 -1
  147. package/dist/runtime/vueCompat/model.d.mts +3 -2
  148. package/dist/runtime/vueCompat/router.d.mts +2 -1
  149. package/dist/scheduler.mjs +1 -1
  150. package/dist/store/storeToRefs.d.mts +2 -1
  151. package/dist/store/types.d.mts +4 -3
  152. package/dist/types/definitions.d.mts +7 -0
  153. package/dist/types/pageLayout.d.mts +4 -0
  154. package/dist/types/pageMeta.d.mts +10 -0
  155. package/dist/types/reactivity.d.mts +13 -0
  156. package/dist/types.d.mts +5 -0
  157. package/dist/types.mjs +1 -0
  158. package/dist/vue-demi.d.mts +13 -7
  159. package/dist/vue-types.d.mts +3 -4
  160. package/dist/web-apis.mjs +1 -1
  161. package/package.json +23 -13
  162. package/dist/dev/api/vitest/setup.d.mts +0 -1
  163. package/dist/dev/api/vitest.d.mts +0 -1
  164. package/dist/dev/api.d.mts +0 -1
  165. package/dist/dev/compiler.d.mts +0 -1
  166. package/dist/dev/fetch.d.mts +0 -9
  167. package/dist/dev/index.d.mts +0 -72
  168. package/dist/dev/internal-reactivity.d.mts +0 -18
  169. package/dist/dev/internal-runtime.d.mts +0 -45
  170. package/dist/dev/internal-template.d.mts +0 -2
  171. package/dist/dev/jsxTypes.d.mts +0 -9
  172. package/dist/dev/macros/shared.d.mts +0 -83
  173. package/dist/dev/macros.d.mts +0 -71
  174. package/dist/dev/reactivity/asyncDerivation.d.mts +0 -41
  175. package/dist/dev/reactivity/computed.d.mts +0 -25
  176. package/dist/dev/reactivity/core.d.mts +0 -35
  177. package/dist/dev/reactivity/index.d.mts +0 -16
  178. package/dist/dev/reactivity/reactive/mutation.d.mts +0 -21
  179. package/dist/dev/reactivity/reactive/patch.d.mts +0 -18
  180. package/dist/dev/reactivity/reactive/shallow.d.mts +0 -22
  181. package/dist/dev/reactivity/reactive/shared.d.mts +0 -4
  182. package/dist/dev/reactivity/reactive.d.mts +0 -42
  183. package/dist/dev/reactivity/readonly.d.mts +0 -27
  184. package/dist/dev/reactivity/ref.d.mts +0 -27
  185. package/dist/dev/reactivity/shallowRef.d.mts +0 -19
  186. package/dist/dev/reactivity/toRefs.d.mts +0 -43
  187. package/dist/dev/reactivity/traverse.d.mts +0 -8
  188. package/dist/dev/reactivity/watch/types.d.mts +0 -43
  189. package/dist/dev/reactivity/watch.d.mts +0 -22
  190. package/dist/dev/router/auto-routes.d.mts +0 -8
  191. package/dist/dev/router/createRouter.d.mts +0 -9
  192. package/dist/dev/router/navigationCore.d.mts +0 -7
  193. package/dist/dev/router/resolve.d.mts +0 -7
  194. package/dist/dev/router/routeSync.d.mts +0 -2
  195. package/dist/dev/router/scrollRestoration/adapters.d.mts +0 -8
  196. package/dist/dev/router/scrollRestoration/controller.d.mts +0 -8
  197. package/dist/dev/router/scrollRestoration/host.d.mts +0 -3
  198. package/dist/dev/router/scrollRestoration/index.d.mts +0 -9
  199. package/dist/dev/router/scrollRestoration/types.d.mts +0 -61
  200. package/dist/dev/router/types.d.mts +0 -267
  201. package/dist/dev/router/useRoute.d.mts +0 -20
  202. package/dist/dev/router/useRouter.d.mts +0 -9
  203. package/dist/dev/router.d.mts +0 -30
  204. package/dist/dev/routerInternal/location.d.mts +0 -2
  205. package/dist/dev/routerInternal/matching.d.mts +0 -2
  206. package/dist/dev/routerInternal/params.d.mts +0 -2
  207. package/dist/dev/routerInternal/query.d.mts +0 -7
  208. package/dist/dev/routerInternal/records.d.mts +0 -2
  209. package/dist/dev/routerInternal/recordsWarnings.d.mts +0 -2
  210. package/dist/dev/routerInternal/shared.d.mts +0 -9
  211. package/dist/dev/routerInternal/snapshots.d.mts +0 -2
  212. package/dist/dev/routerInternal/types.d.mts +0 -9
  213. package/dist/dev/runtime/app/pending.d.mts +0 -10
  214. package/dist/dev/runtime/app/setData/commitTracker.d.mts +0 -13
  215. package/dist/dev/runtime/app/setData/scheduler.d.mts +0 -51
  216. package/dist/dev/runtime/app.d.mts +0 -8
  217. package/dist/dev/runtime/capabilities.d.mts +0 -78
  218. package/dist/dev/runtime/css.d.mts +0 -14
  219. package/dist/dev/runtime/defaults.d.mts +0 -12
  220. package/dist/dev/runtime/define.d.mts +0 -118
  221. package/dist/dev/runtime/disposables.d.mts +0 -31
  222. package/dist/dev/runtime/elementIntersectionObserver.d.mts +0 -26
  223. package/dist/dev/runtime/features/inlineEvents.d.mts +0 -7
  224. package/dist/dev/runtime/features/jsxIslands.d.mts +0 -7
  225. package/dist/dev/runtime/features/layout.d.mts +0 -7
  226. package/dist/dev/runtime/features/patchStrategy.d.mts +0 -7
  227. package/dist/dev/runtime/features/publicLayout.d.mts +0 -24
  228. package/dist/dev/runtime/features/scopedSlots.d.mts +0 -23
  229. package/dist/dev/runtime/features/setDataHighFrequencyWarning.d.mts +0 -7
  230. package/dist/dev/runtime/features/templateRefs.d.mts +0 -7
  231. package/dist/dev/runtime/hooks/base.d.mts +0 -27
  232. package/dist/dev/runtime/hooks/register.d.mts +0 -30
  233. package/dist/dev/runtime/hooks/vue.d.mts +0 -52
  234. package/dist/dev/runtime/hooks.d.mts +0 -4
  235. package/dist/dev/runtime/index.d.mts +0 -46
  236. package/dist/dev/runtime/intersectionObserver.d.mts +0 -14
  237. package/dist/dev/runtime/jsxIsland.d.mts +0 -37
  238. package/dist/dev/runtime/layoutBridge.d.mts +0 -55
  239. package/dist/dev/runtime/noSetData.d.mts +0 -5
  240. package/dist/dev/runtime/pageEnvironment.d.mts +0 -50
  241. package/dist/dev/runtime/pageLayout.d.mts +0 -25
  242. package/dist/dev/runtime/pageScroll.d.mts +0 -29
  243. package/dist/dev/runtime/provide.d.mts +0 -60
  244. package/dist/dev/runtime/provideStore.d.mts +0 -7
  245. package/dist/dev/runtime/publicRuntime.d.mts +0 -22
  246. package/dist/dev/runtime/pullDownRefresh.d.mts +0 -12
  247. package/dist/dev/runtime/register/app.d.mts +0 -14
  248. package/dist/dev/runtime/register/component.d.mts +0 -17
  249. package/dist/dev/runtime/register/inline.d.mts +0 -15
  250. package/dist/dev/runtime/register/runtimeInstance.d.mts +0 -26
  251. package/dist/dev/runtime/register/setup.d.mts +0 -11
  252. package/dist/dev/runtime/register/watch.d.mts +0 -12
  253. package/dist/dev/runtime/register.d.mts +0 -5
  254. package/dist/dev/runtime/selectorQuery.d.mts +0 -54
  255. package/dist/dev/runtime/template.d.mts +0 -6
  256. package/dist/dev/runtime/templateRefTypes.d.mts +0 -12
  257. package/dist/dev/runtime/types/core.d.mts +0 -35
  258. package/dist/dev/runtime/types/miniprogram.d.mts +0 -84
  259. package/dist/dev/runtime/types/miniprogramHost.d.mts +0 -45
  260. package/dist/dev/runtime/types/miniprogramHostSources.d.mts +0 -112
  261. package/dist/dev/runtime/types/options.d.mts +0 -138
  262. package/dist/dev/runtime/types/props/propTypes.d.mts +0 -79
  263. package/dist/dev/runtime/types/props/router.d.mts +0 -51
  264. package/dist/dev/runtime/types/props/setup.d.mts +0 -96
  265. package/dist/dev/runtime/types/props.d.mts +0 -4
  266. package/dist/dev/runtime/types/runtime.d.mts +0 -59
  267. package/dist/dev/runtime/types/setData.d.mts +0 -237
  268. package/dist/dev/runtime/types.d.mts +0 -29
  269. package/dist/dev/runtime/uniAppHost.d.mts +0 -8
  270. package/dist/dev/runtime/updatePerformance.d.mts +0 -13
  271. package/dist/dev/runtime/use.d.mts +0 -13
  272. package/dist/dev/runtime/vueCompat/context.d.mts +0 -8
  273. package/dist/dev/runtime/vueCompat/model.d.mts +0 -30
  274. package/dist/dev/runtime/vueCompat/router.d.mts +0 -29
  275. package/dist/dev/runtime/vueCompat/templateRef.d.mts +0 -9
  276. package/dist/dev/runtime/vueCompat.d.mts +0 -5
  277. package/dist/dev/scheduler.d.mts +0 -4
  278. package/dist/dev/store/define.d.mts +0 -8
  279. package/dist/dev/store/manager.d.mts +0 -16
  280. package/dist/dev/store/storeToRefs.d.mts +0 -11
  281. package/dist/dev/store/types.d.mts +0 -106
  282. package/dist/dev/store.d.mts +0 -5
  283. package/dist/dev/version.d.mts +0 -4
  284. package/dist/dev/vue-augment.d.mts +0 -8
  285. package/dist/dev/vue-demi.d.mts +0 -87
  286. package/dist/dev/vue-types.d.mts +0 -19
  287. package/dist/dev/web-apis.d.mts +0 -3
  288. /package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/defineProperty.mjs +0 -0
  289. /package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/toPrimitive.mjs +0 -0
  290. /package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/toPropertyKey.mjs +0 -0
  291. /package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.154.0}/helpers/esm/typeof.mjs +0 -0
package/README.md CHANGED
@@ -180,6 +180,8 @@ const onActiveChange = bindModel.model<boolean>('isActive').onChange
180
180
 
181
181
  - 更新被批量加入微任务队列;`nextTick` 只等待当前 JavaScript/响应式任务队列排空,不等待小程序 `setData` 回调或视图提交。
182
182
  - 对状态做快照 diff,只把变更路径传给 `setData`;宿主提交失败时,下一次响应式更新会发送完整恢复快照。
183
+ - 可用 `setData.debugPhases: true` 在现有 `debug` 回调中关联 prepare、物理 dispatch 与 commit。合并调用按 ID 去重;callback/Promise/同步返回不等于可见视图完成,未观测边界保持 `null`。参见 [阶段观测与测量示例](../../docs/wevu/setdata-observation.md)。
184
+ - `weapp.wevu.preset: 'performance'` 默认开启 patch、隐藏时暂停和 `diagnostics: 'fallback'`。首次快照收集也会记录 `needsFullSnapshot`;启用阶段观测后,同一 revision 可有多条日志,不能将 warning 条数视为失败或回退次数。配置覆盖见 [预设说明](https://vite.weapp.dev/config/wevu#weapp-wevu-preset)。
183
185
  - 提供 `batch`/`startBatch`/`endBatch` 用于同步更新合并触发;以及 `effectScope`/`getCurrentScope`/`onScopeDispose` 统一管理 effect/watch 的销毁,`setup()` 同步阶段内创建的副作用会自动归属到实例级 scope,便于避免泄漏。
184
186
 
185
187
  ## 开发产物与源码调试
@@ -0,0 +1,44 @@
1
+ import { SetDataSnapshotOptions } from "../runtime/types/setData.mjs";
2
+ import { PageFeatures } from "./pageFeatures.mjs";
3
+ //#region src/config/defaults.d.ts
4
+ /** 编译期默认值允许的 JSON 数据;对象的可选字段可省略。 */
5
+ export type WevuConfigValue = string | number | boolean | null | WevuConfigValue[] | WevuConfigRecord;
6
+ export interface WevuConfigRecord {
7
+ [key: string]: WevuConfigValue | undefined;
8
+ }
9
+ /** 编译配置不会保留回调;运行时 setWevuDefaults 仍接受完整选项。 */
10
+ export type WevuConfigSetDataOptions = Omit<SetDataSnapshotOptions, 'debug'> & {
11
+ debug?: never;
12
+ };
13
+ /** 可写入编译产物的组件静态选项,不包含 RegExp 纯数据匹配器。 */
14
+ export interface WevuConfigComponentOptions {
15
+ multipleSlots?: boolean;
16
+ addGlobalClass?: boolean;
17
+ styleIsolation?: 'isolated' | 'apply-shared' | 'shared' | 'page-isolated' | 'page-apply-shared' | 'page-shared';
18
+ virtualHost?: boolean;
19
+ pureDataPattern?: never;
20
+ }
21
+ export interface WevuConfigAppDefaults {
22
+ data?: WevuConfigRecord;
23
+ globalData?: WevuConfigRecord;
24
+ setData?: WevuConfigSetDataOptions;
25
+ [key: string]: WevuConfigValue | undefined;
26
+ }
27
+ export interface WevuConfigComponentDefaults {
28
+ data?: WevuConfigRecord;
29
+ setData?: WevuConfigSetDataOptions;
30
+ features?: { [Key in keyof PageFeatures]: PageFeatures[Key]; };
31
+ allowNullPropInput?: boolean;
32
+ allowFunctionProps?: boolean | 'auto';
33
+ setupLifecycle?: 'created' | 'attached';
34
+ externalClasses?: string[];
35
+ behaviors?: string[];
36
+ options?: { [Key in keyof WevuConfigComponentOptions]: WevuConfigComponentOptions[Key]; };
37
+ [key: string]: WevuConfigValue | undefined;
38
+ }
39
+ /** 仅供构建配置使用的 JSON 默认值;运行时 WevuDefaults 的 API 保持独立。 */
40
+ export interface WevuConfigDefaults {
41
+ app?: WevuConfigAppDefaults;
42
+ component?: WevuConfigComponentDefaults;
43
+ }
44
+ //#endregion
@@ -0,0 +1,51 @@
1
+ //#region src/config/pageFeatures.d.ts
2
+ export interface PageFeatures {
3
+ /**
4
+ * 启用页面滚动事件(注入 `onPageScroll`)。
5
+ */
6
+ enableOnPageScroll?: boolean;
7
+ /**
8
+ * 启用下拉刷新事件(注入 `onPullDownRefresh`;仍需在页面配置开启 enablePullDownRefresh)。
9
+ */
10
+ enableOnPullDownRefresh?: boolean;
11
+ /**
12
+ * 启用触底事件(注入 `onReachBottom`)。
13
+ */
14
+ enableOnReachBottom?: boolean;
15
+ /**
16
+ * 启用路由动画完成事件(注入 `onRouteDone`)。
17
+ */
18
+ enableOnRouteDone?: boolean;
19
+ /**
20
+ * 启用 onReady 阶段的 routeDone 兜底补发。
21
+ *
22
+ * 默认关闭:保持与微信小程序平台事件更一致的行为。
23
+ * 仅当个别 IDE/基础库未派发 routeDone 且业务确实依赖该时机时再开启。
24
+ */
25
+ enableOnRouteDoneFallback?: boolean;
26
+ /**
27
+ * 启用 Tab 点击事件(注入 `onTabItemTap`)。
28
+ */
29
+ enableOnTabItemTap?: boolean;
30
+ /**
31
+ * 启用窗口尺寸变化事件(注入 `onResize`)。
32
+ */
33
+ enableOnResize?: boolean;
34
+ /**
35
+ * 启用“转发/分享给朋友”(注入 `onShareAppMessage`,使右上角菜单显示“转发”)。
36
+ */
37
+ enableOnShareAppMessage?: boolean;
38
+ /**
39
+ * 启用“分享到朋友圈”(注入 `onShareTimeline`,使右上角菜单显示“分享到朋友圈”)。
40
+ */
41
+ enableOnShareTimeline?: boolean;
42
+ /**
43
+ * 启用“收藏”(注入 `onAddToFavorites`)。
44
+ */
45
+ enableOnAddToFavorites?: boolean;
46
+ /**
47
+ * 启用“退出状态保存”(注入 `onSaveExitState`)。
48
+ */
49
+ enableOnSaveExitState?: boolean;
50
+ }
51
+ //#endregion
@@ -0,0 +1,4 @@
1
+ import { PageLayoutMeta, PageMeta } from "./types/pageMeta.mjs";
2
+ import { PageFeatures } from "./config/pageFeatures.mjs";
3
+ import { WevuConfigAppDefaults, WevuConfigComponentDefaults, WevuConfigComponentOptions, WevuConfigDefaults, WevuConfigRecord, WevuConfigSetDataOptions, WevuConfigValue } from "./config/defaults.mjs";
4
+ export type { PageFeatures, PageLayoutMeta, PageMeta, WevuConfigAppDefaults, WevuConfigComponentDefaults, WevuConfigComponentOptions, WevuConfigDefaults, WevuConfigRecord, WevuConfigSetDataOptions, WevuConfigValue };
@@ -0,0 +1 @@
1
+ export{};
@@ -1,6 +1,6 @@
1
1
  import toPropertyKey from "./toPropertyKey.mjs";
2
2
 
3
- //#region \0@oxc-project+runtime@0.151.0/helpers/esm/defineProperty.js
3
+ //#region \0@oxc-project+runtime@0.154.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.151.0/helpers/esm/toPrimitive.js
3
+ //#region \0@oxc-project+runtime@0.154.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.151.0/helpers/esm/toPropertyKey.js
4
+ //#region \0@oxc-project+runtime@0.154.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.151.0/helpers/esm/typeof.js
1
+ //#region \0@oxc-project+runtime@0.154.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) {
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "7.4.0";
2
+ var version = "7.6.0";
3
3
 
4
4
  //#endregion
5
5
  export { version };
@@ -1 +1 @@
1
- {"version":3,"file":"computed.mjs","names":[],"sources":["../../../src/reactivity/computed.ts"],"sourcesContent":["import type { ReactiveEffect } from './core'\nimport type { Ref } from './ref'\nimport { createComputedEffect, track, trigger } from './core'\nimport { markRaw } from './reactive'\nimport { ReactiveFlags } from './reactive/shared'\nimport { markAsRef } from './ref'\n\nexport type ComputedGetter<T> = () => T\nexport type ComputedSetter<T> = (value: T) => void\n\ndeclare const computedBrand: unique symbol\ndeclare const writableComputedBrand: unique symbol\n\nconst computedRefs = new WeakSet<object>()\n\n/** 识别计算来源,供 Store 将派生值与可持久化 state 分离。 */\nexport function isComputedRef(value: unknown): value is ComputedRef | WritableComputedRef<any> {\n return typeof value === 'object' && value !== null && computedRefs.has(value)\n}\n\ninterface BaseComputedRef<T, S = T> extends Ref<T, S> {\n [key: symbol]: any\n}\n\nexport interface ComputedRef<T = any> extends BaseComputedRef<T> {\n readonly [computedBrand]: true\n readonly value: T\n}\n\nexport interface WritableComputedRef<T, S = T> extends BaseComputedRef<T, S> {\n readonly [writableComputedBrand]: true\n value: T\n}\n\nexport interface WritableComputedOptions<T> {\n get: ComputedGetter<T>\n set: ComputedSetter<T>\n}\n\nexport function computed<T>(getter: ComputedGetter<T>): ComputedRef<T>\nexport function computed<T>(options: WritableComputedOptions<T>): WritableComputedRef<T>\nexport function computed<T>(\n getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,\n): ComputedRef<T> | WritableComputedRef<T> {\n let getter: ComputedGetter<T>\n let setter: ComputedSetter<T>\n const onlyGetter = typeof getterOrOptions === 'function'\n if (onlyGetter) {\n getter = getterOrOptions as ComputedGetter<T>\n setter = () => {\n throw new Error('计算属性是只读的')\n }\n }\n else {\n getter = (getterOrOptions as WritableComputedOptions<T>).get\n setter = (getterOrOptions as WritableComputedOptions<T>).set\n }\n let value: T\n let dirty = true\n let runner: ReactiveEffect<T>\n const obj: any = {\n get value() {\n if (dirty) {\n value = runner()\n dirty = false\n }\n track(obj, 'value')\n return value\n },\n set value(newValue: T) {\n setter(newValue)\n },\n }\n markAsRef(obj)\n markRaw(obj)\n computedRefs.add(obj)\n Object.defineProperty(obj, ReactiveFlags.IS_READONLY, { value: onlyGetter })\n runner = createComputedEffect(getter, {\n lazy: true,\n scheduler: () => {\n if (!dirty) {\n dirty = true\n trigger(obj, 'value')\n }\n },\n })\n return (onlyGetter ? obj as ComputedRef<T> : obj as WritableComputedRef<T>)\n}\n"],"mappings":";;;;;AAaA,MAAM,+BAAe,IAAI,QAAgB;;AAGzC,SAAgB,cAAc,OAAiE;CAC7F,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,IAAI,KAAK;AAC9E;AAuBA,SAAgB,SACd,iBACyC;CACzC,IAAI;CACJ,IAAI;CACJ,MAAM,aAAa,OAAO,oBAAoB;CAC9C,IAAI,YAAY;EACd,SAAS;EACT,eAAe;GACb,MAAM,IAAI,MAAM,UAAU;EAC5B;CACF,OACK;EACH,SAAU,gBAA+C;EACzD,SAAU,gBAA+C;CAC3D;CACA,IAAI;CACJ,IAAI,QAAQ;CACZ,IAAI;CACJ,MAAM,MAAW;EACf,IAAI,QAAQ;GACV,IAAI,OAAO;IACT,QAAQ,OAAO;IACf,QAAQ;GACV;GACA,MAAM,KAAK,OAAO;GAClB,OAAO;EACT;EACA,IAAI,MAAM,UAAa;GACrB,OAAO,QAAQ;EACjB;CACF;CACA,UAAU,GAAG;CACb,QAAQ,GAAG;CACX,aAAa,IAAI,GAAG;CACpB,OAAO,eAAe,uBAAgC,EAAE,OAAO,WAAW,CAAC;CAC3E,SAAS,qBAAqB,QAAQ;EACpC,MAAM;EACN,iBAAiB;GACf,IAAI,CAAC,OAAO;IACV,QAAQ;IACR,QAAQ,KAAK,OAAO;GACtB;EACF;CACF,CAAC;CACD,OAAQ,aAAa,MAAwB;AAC/C"}
1
+ {"version":3,"file":"computed.mjs","names":[],"sources":["../../../src/reactivity/computed.ts"],"sourcesContent":["import type { ComputedGetter, ComputedSetter, WritableComputedOptions } from '../types/reactivity'\nimport type { ReactiveEffect } from './core'\nimport type { Ref } from './ref'\nimport { createComputedEffect, track, trigger } from './core'\nimport { markRaw } from './reactive'\nimport { ReactiveFlags } from './reactive/shared'\nimport { markAsRef } from './ref'\n\nexport type { ComputedGetter, ComputedSetter, WritableComputedOptions } from '../types/reactivity'\n\ndeclare const computedBrand: unique symbol\ndeclare const writableComputedBrand: unique symbol\n\nconst computedRefs = new WeakSet<object>()\n\n/** 识别计算来源,供 Store 将派生值与可持久化 state 分离。 */\nexport function isComputedRef(value: unknown): value is ComputedRef | WritableComputedRef<any> {\n return typeof value === 'object' && value !== null && computedRefs.has(value)\n}\n\ninterface BaseComputedRef<T, S = T> extends Ref<T, S> {\n [key: symbol]: any\n}\n\nexport interface ComputedRef<T = any> extends BaseComputedRef<T> {\n readonly [computedBrand]: true\n readonly value: T\n}\n\nexport interface WritableComputedRef<T, S = T> extends BaseComputedRef<T, S> {\n readonly [writableComputedBrand]: true\n value: T\n}\n\nexport function computed<T>(getter: ComputedGetter<T>): ComputedRef<T>\nexport function computed<T>(options: WritableComputedOptions<T>): WritableComputedRef<T>\nexport function computed<T>(\n getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,\n): ComputedRef<T> | WritableComputedRef<T> {\n let getter: ComputedGetter<T>\n let setter: ComputedSetter<T>\n const onlyGetter = typeof getterOrOptions === 'function'\n if (onlyGetter) {\n getter = getterOrOptions as ComputedGetter<T>\n setter = () => {\n throw new Error('计算属性是只读的')\n }\n }\n else {\n getter = (getterOrOptions as WritableComputedOptions<T>).get\n setter = (getterOrOptions as WritableComputedOptions<T>).set\n }\n let value: T\n let dirty = true\n let runner: ReactiveEffect<T>\n const obj: any = {\n get value() {\n if (dirty) {\n value = runner()\n dirty = false\n }\n track(obj, 'value')\n return value\n },\n set value(newValue: T) {\n setter(newValue)\n },\n }\n markAsRef(obj)\n markRaw(obj)\n computedRefs.add(obj)\n Object.defineProperty(obj, ReactiveFlags.IS_READONLY, { value: onlyGetter })\n runner = createComputedEffect(getter, {\n lazy: true,\n scheduler: () => {\n if (!dirty) {\n dirty = true\n trigger(obj, 'value')\n }\n },\n })\n return (onlyGetter ? obj as ComputedRef<T> : obj as WritableComputedRef<T>)\n}\n"],"mappings":";;;;;AAaA,MAAM,+BAAe,IAAI,QAAgB;;AAGzC,SAAgB,cAAc,OAAiE;CAC7F,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,IAAI,KAAK;AAC9E;AAkBA,SAAgB,SACd,iBACyC;CACzC,IAAI;CACJ,IAAI;CACJ,MAAM,aAAa,OAAO,oBAAoB;CAC9C,IAAI,YAAY;EACd,SAAS;EACT,eAAe;GACb,MAAM,IAAI,MAAM,UAAU;EAC5B;CACF,OACK;EACH,SAAU,gBAA+C;EACzD,SAAU,gBAA+C;CAC3D;CACA,IAAI;CACJ,IAAI,QAAQ;CACZ,IAAI;CACJ,MAAM,MAAW;EACf,IAAI,QAAQ;GACV,IAAI,OAAO;IACT,QAAQ,OAAO;IACf,QAAQ;GACV;GACA,MAAM,KAAK,OAAO;GAClB,OAAO;EACT;EACA,IAAI,MAAM,UAAa;GACrB,OAAO,QAAQ;EACjB;CACF;CACA,UAAU,GAAG;CACb,QAAQ,GAAG;CACX,aAAa,IAAI,GAAG;CACpB,OAAO,eAAe,uBAAgC,EAAE,OAAO,WAAW,CAAC;CAC3E,SAAS,qBAAqB,QAAQ;EACpC,MAAM;EACN,iBAAiB;GACf,IAAI,CAAC,OAAO;IACV,QAAQ;IACR,QAAQ,KAAK,OAAO;GACtB;EACF;CACF,CAAC;CACD,OAAQ,aAAa,MAAwB;AAC/C"}
@@ -1,5 +1,5 @@
1
1
  import { queueJob } from "../scheduler.mjs";
2
- import _defineProperty from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/defineProperty.mjs";
2
+ import _defineProperty from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/defineProperty.mjs";
3
3
 
4
4
  //#region src/reactivity/core.ts
5
5
  const targetMap = /* @__PURE__ */ new WeakMap();
@@ -1,4 +1,4 @@
1
- import _defineProperty from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/defineProperty.mjs";
1
+ import _defineProperty from "../_virtual/_@oxc-project_runtime@0.154.0/helpers/esm/defineProperty.mjs";
2
2
  import { trackEffects, triggerEffects } from "./core.mjs";
3
3
  import { convertToReactive, markRaw } from "./reactive.mjs";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"ref.mjs","names":[],"sources":["../../../src/reactivity/ref.ts"],"sourcesContent":["import type { Ref as VueRef, ShallowRef as VueShallowRef } from '../vue-types'\nimport type { ComputedRef, WritableComputedRef } from './computed'\nimport type { Dep } from './core'\nimport { trackEffects, triggerEffects } from './core'\nimport { convertToReactive, markRaw } from './reactive'\n\n// 类型对齐 @vue/reactivity.Ref:\n// - 用于 Volar 模板自动解包(UnwrapRef 依赖 RefSymbol 品牌标记)。\n// - 运行时仍使用 wevu 自己的 ref 实现,不依赖 Vue。\nexport type Ref<T = any, S = T> = VueRef<T, S>\nexport type ShallowRef<T = any> = VueShallowRef<T>\nexport type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>\nexport type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T)\n\nexport const RefFlag = '__v_isRef' as const\n\nexport function markAsRef<T extends object>(target: T): T {\n try {\n Object.defineProperty(target, RefFlag, {\n value: true,\n configurable: true,\n })\n }\n catch {\n ;(target as any)[RefFlag] = true\n }\n return target\n}\n\nexport function isRef(value: unknown): value is Ref<any> {\n return Boolean(value && typeof value === 'object' && (value as any)[RefFlag] === true)\n}\n\nclass RefImpl<T> {\n private _value: T\n private _rawValue: T\n public dep: Dep | undefined\n constructor(value: T) {\n markAsRef(this)\n this._rawValue = value\n this._value = convertToReactive(value)\n }\n\n get value(): T {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n return this._value\n }\n\n set value(newValue: T) {\n if (!Object.is(newValue, this._rawValue)) {\n this._rawValue = newValue\n this._value = convertToReactive(newValue)\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n }\n}\n\nexport function ref<T = any>(): Ref<T | undefined>\nexport function ref<T>(value: T): Ref<T>\nexport function ref<T>(value?: T): Ref<T | undefined> {\n if (isRef(value)) {\n return value\n }\n return markRaw(new RefImpl(value as T | undefined)) as any\n}\n\nexport function unref<T>(value: MaybeRef<T> | ComputedRef<T>): T {\n return isRef(value) ? value.value : value\n}\n\nexport function toValue<T>(source: MaybeRefOrGetter<T>): T {\n return typeof source === 'function' ? (source as () => T)() : unref(source)\n}\n\n/**\n * 自定义 ref 工厂:用于创建可显式控制 track/trigger 的自定义 ref\n */\nexport type CustomRefFactory<T> = (\n track: () => void,\n trigger: () => void,\n) => {\n get: () => T\n set: (value: T) => void\n}\n\nexport interface CustomRefOptions<T> {\n get: () => T\n set: (value: T) => void\n}\n\nexport type CustomRefSource<T> = CustomRefFactory<T> | CustomRefOptions<T>\n\nclass CustomRefImpl<T> {\n private _getValue: () => T\n private _setValue: (value: T) => void\n public dep: Dep | undefined\n\n constructor(factory: CustomRefSource<T>, defaultValue?: T) {\n markAsRef(this)\n const fallbackValue = defaultValue\n const track = () => {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n }\n const trigger = () => {\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n\n const withFallback = (value: T) => (value === undefined && fallbackValue !== undefined ? fallbackValue as T : value)\n\n if (typeof factory === 'function') {\n const handlers = factory(track, trigger)\n this._getValue = () => withFallback(handlers.get())\n this._setValue = value => handlers.set(value)\n return\n }\n\n const handlers = factory\n this._getValue = () => {\n track()\n return withFallback(handlers.get())\n }\n this._setValue = (value: T) => {\n handlers.set(value)\n trigger()\n }\n }\n\n get value(): T {\n return this._getValue()\n }\n\n set value(newValue: T) {\n this._setValue(newValue)\n }\n}\n\nexport function customRef<T>(factory: CustomRefSource<T>, defaultValue?: T): Ref<T> {\n return markRaw(new CustomRefImpl(factory, defaultValue)) as any\n}\n"],"mappings":";;;;;AAcA,MAAa,UAAU;AAEvB,SAAgB,UAA4B,QAAc;CACxD,IAAI;EACF,OAAO,eAAe,QAAQ,SAAS;GACrC,OAAO;GACP,cAAc;EAChB,CAAC;CACH,QACM;EACH,AAAC,OAAe,WAAW;CAC9B;CACA,OAAO;AACT;AAEA,SAAgB,MAAM,OAAmC;CACvD,OAAO,QAAQ,SAAS,OAAO,UAAU,YAAa,uBAA2B,IAAI;AACvF;AAEA,IAAM,UAAN,MAAiB;CAIf,YAAY,OAAU;wBAHd;wBACA;wBACD;EAEL,UAAU,IAAI;EACd,KAAK,YAAY;EACjB,KAAK,SAAS,kBAAkB,KAAK;CACvC;CAEA,IAAI,QAAW;EACb,IAAI,CAAC,KAAK,KACR,KAAK,sBAAM,IAAI,IAAI;EAErB,aAAa,KAAK,GAAG;EACrB,OAAO,KAAK;CACd;CAEA,IAAI,MAAM,UAAa;EACrB,IAAI,CAAC,OAAO,GAAG,UAAU,KAAK,SAAS,GAAG;GACxC,KAAK,YAAY;GACjB,KAAK,SAAS,kBAAkB,QAAQ;GACxC,IAAI,KAAK,KACP,eAAe,KAAK,GAAG;EAE3B;CACF;AACF;AAIA,SAAgB,IAAO,OAA+B;CACpD,IAAI,MAAM,KAAK,GACb,OAAO;CAET,OAAO,QAAQ,IAAI,QAAQ,KAAsB,CAAC;AACpD;AAEA,SAAgB,MAAS,OAAwC;CAC/D,OAAO,MAAM,KAAK,IAAI,MAAM,QAAQ;AACtC;AAEA,SAAgB,QAAW,QAAgC;CACzD,OAAO,OAAO,WAAW,aAAc,OAAmB,IAAI,MAAM,MAAM;AAC5E;AAoBA,IAAM,gBAAN,MAAuB;CAKrB,YAAY,SAA6B,cAAkB;wBAJnD;wBACA;wBACD;EAGL,UAAU,IAAI;EACd,MAAM,gBAAgB;EACtB,MAAM,cAAc;GAClB,IAAI,CAAC,KAAK,KACR,KAAK,sBAAM,IAAI,IAAI;GAErB,aAAa,KAAK,GAAG;EACvB;EACA,MAAM,gBAAgB;GACpB,IAAI,KAAK,KACP,eAAe,KAAK,GAAG;EAE3B;EAEA,MAAM,gBAAgB,UAAc,UAAU,UAAa,kBAAkB,SAAY,gBAAqB;EAE9G,IAAI,OAAO,YAAY,YAAY;GACjC,MAAM,WAAW,QAAQ,OAAO,OAAO;GACvC,KAAK,kBAAkB,aAAa,SAAS,IAAI,CAAC;GAClD,KAAK,aAAY,UAAS,SAAS,IAAI,KAAK;GAC5C;EACF;EAEA,MAAM,WAAW;EACjB,KAAK,kBAAkB;GACrB,MAAM;GACN,OAAO,aAAa,SAAS,IAAI,CAAC;EACpC;EACA,KAAK,aAAa,UAAa;GAC7B,SAAS,IAAI,KAAK;GAClB,QAAQ;EACV;CACF;CAEA,IAAI,QAAW;EACb,OAAO,KAAK,UAAU;CACxB;CAEA,IAAI,MAAM,UAAa;EACrB,KAAK,UAAU,QAAQ;CACzB;AACF;AAEA,SAAgB,UAAa,SAA6B,cAA0B;CAClF,OAAO,QAAQ,IAAI,cAAc,SAAS,YAAY,CAAC;AACzD"}
1
+ {"version":3,"file":"ref.mjs","names":[],"sources":["../../../src/reactivity/ref.ts"],"sourcesContent":["import type { Ref as VueRef, ShallowRef as VueShallowRef } from '../types/reactivity'\nimport type { ComputedRef, WritableComputedRef } from './computed'\nimport type { Dep } from './core'\nimport { trackEffects, triggerEffects } from './core'\nimport { convertToReactive, markRaw } from './reactive'\n\n// 类型对齐 @vue/reactivity.Ref:\n// - 用于 Volar 模板自动解包(UnwrapRef 依赖 RefSymbol 品牌标记)。\n// - 运行时仍使用 wevu 自己的 ref 实现,不依赖 Vue。\nexport type Ref<T = any, S = T> = VueRef<T, S>\nexport type ShallowRef<T = any> = VueShallowRef<T>\nexport type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>\nexport type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T)\n\nexport const RefFlag = '__v_isRef' as const\n\nexport function markAsRef<T extends object>(target: T): T {\n try {\n Object.defineProperty(target, RefFlag, {\n value: true,\n configurable: true,\n })\n }\n catch {\n ;(target as any)[RefFlag] = true\n }\n return target\n}\n\nexport function isRef(value: unknown): value is Ref<any> {\n return Boolean(value && typeof value === 'object' && (value as any)[RefFlag] === true)\n}\n\nclass RefImpl<T> {\n private _value: T\n private _rawValue: T\n public dep: Dep | undefined\n constructor(value: T) {\n markAsRef(this)\n this._rawValue = value\n this._value = convertToReactive(value)\n }\n\n get value(): T {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n return this._value\n }\n\n set value(newValue: T) {\n if (!Object.is(newValue, this._rawValue)) {\n this._rawValue = newValue\n this._value = convertToReactive(newValue)\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n }\n}\n\nexport function ref<T = any>(): Ref<T | undefined>\nexport function ref<T>(value: T): Ref<T>\nexport function ref<T>(value?: T): Ref<T | undefined> {\n if (isRef(value)) {\n return value\n }\n return markRaw(new RefImpl(value as T | undefined)) as any\n}\n\nexport function unref<T>(value: MaybeRef<T> | ComputedRef<T>): T {\n return isRef(value) ? value.value : value\n}\n\nexport function toValue<T>(source: MaybeRefOrGetter<T>): T {\n return typeof source === 'function' ? (source as () => T)() : unref(source)\n}\n\n/**\n * 自定义 ref 工厂:用于创建可显式控制 track/trigger 的自定义 ref\n */\nexport type CustomRefFactory<T> = (\n track: () => void,\n trigger: () => void,\n) => {\n get: () => T\n set: (value: T) => void\n}\n\nexport interface CustomRefOptions<T> {\n get: () => T\n set: (value: T) => void\n}\n\nexport type CustomRefSource<T> = CustomRefFactory<T> | CustomRefOptions<T>\n\nclass CustomRefImpl<T> {\n private _getValue: () => T\n private _setValue: (value: T) => void\n public dep: Dep | undefined\n\n constructor(factory: CustomRefSource<T>, defaultValue?: T) {\n markAsRef(this)\n const fallbackValue = defaultValue\n const track = () => {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n }\n const trigger = () => {\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n\n const withFallback = (value: T) => (value === undefined && fallbackValue !== undefined ? fallbackValue as T : value)\n\n if (typeof factory === 'function') {\n const handlers = factory(track, trigger)\n this._getValue = () => withFallback(handlers.get())\n this._setValue = value => handlers.set(value)\n return\n }\n\n const handlers = factory\n this._getValue = () => {\n track()\n return withFallback(handlers.get())\n }\n this._setValue = (value: T) => {\n handlers.set(value)\n trigger()\n }\n }\n\n get value(): T {\n return this._getValue()\n }\n\n set value(newValue: T) {\n this._setValue(newValue)\n }\n}\n\nexport function customRef<T>(factory: CustomRefSource<T>, defaultValue?: T): Ref<T> {\n return markRaw(new CustomRefImpl(factory, defaultValue)) as any\n}\n"],"mappings":";;;;;AAcA,MAAa,UAAU;AAEvB,SAAgB,UAA4B,QAAc;CACxD,IAAI;EACF,OAAO,eAAe,QAAQ,SAAS;GACrC,OAAO;GACP,cAAc;EAChB,CAAC;CACH,QACM;EACH,AAAC,OAAe,WAAW;CAC9B;CACA,OAAO;AACT;AAEA,SAAgB,MAAM,OAAmC;CACvD,OAAO,QAAQ,SAAS,OAAO,UAAU,YAAa,uBAA2B,IAAI;AACvF;AAEA,IAAM,UAAN,MAAiB;CAIf,YAAY,OAAU;wBAHd;wBACA;wBACD;EAEL,UAAU,IAAI;EACd,KAAK,YAAY;EACjB,KAAK,SAAS,kBAAkB,KAAK;CACvC;CAEA,IAAI,QAAW;EACb,IAAI,CAAC,KAAK,KACR,KAAK,sBAAM,IAAI,IAAI;EAErB,aAAa,KAAK,GAAG;EACrB,OAAO,KAAK;CACd;CAEA,IAAI,MAAM,UAAa;EACrB,IAAI,CAAC,OAAO,GAAG,UAAU,KAAK,SAAS,GAAG;GACxC,KAAK,YAAY;GACjB,KAAK,SAAS,kBAAkB,QAAQ;GACxC,IAAI,KAAK,KACP,eAAe,KAAK,GAAG;EAE3B;CACF;AACF;AAIA,SAAgB,IAAO,OAA+B;CACpD,IAAI,MAAM,KAAK,GACb,OAAO;CAET,OAAO,QAAQ,IAAI,QAAQ,KAAsB,CAAC;AACpD;AAEA,SAAgB,MAAS,OAAwC;CAC/D,OAAO,MAAM,KAAK,IAAI,MAAM,QAAQ;AACtC;AAEA,SAAgB,QAAW,QAAgC;CACzD,OAAO,OAAO,WAAW,aAAc,OAAmB,IAAI,MAAM,MAAM;AAC5E;AAoBA,IAAM,gBAAN,MAAuB;CAKrB,YAAY,SAA6B,cAAkB;wBAJnD;wBACA;wBACD;EAGL,UAAU,IAAI;EACd,MAAM,gBAAgB;EACtB,MAAM,cAAc;GAClB,IAAI,CAAC,KAAK,KACR,KAAK,sBAAM,IAAI,IAAI;GAErB,aAAa,KAAK,GAAG;EACvB;EACA,MAAM,gBAAgB;GACpB,IAAI,KAAK,KACP,eAAe,KAAK,GAAG;EAE3B;EAEA,MAAM,gBAAgB,UAAc,UAAU,UAAa,kBAAkB,SAAY,gBAAqB;EAE9G,IAAI,OAAO,YAAY,YAAY;GACjC,MAAM,WAAW,QAAQ,OAAO,OAAO;GACvC,KAAK,kBAAkB,aAAa,SAAS,IAAI,CAAC;GAClD,KAAK,aAAY,UAAS,SAAS,IAAI,KAAK;GAC5C;EACF;EAEA,MAAM,WAAW;EACjB,KAAK,kBAAkB;GACrB,MAAM;GACN,OAAO,aAAa,SAAS,IAAI,CAAC;EACpC;EACA,KAAK,aAAa,UAAa;GAC7B,SAAS,IAAI,KAAK;GAClB,QAAQ;EACV;CACF;CAEA,IAAI,QAAW;EACb,OAAO,KAAK,UAAU;CACxB;CAEA,IAAI,MAAM,UAAa;EACrB,KAAK,UAAU,QAAQ;CACzB;AACF;AAEA,SAAgB,UAAa,SAA6B,cAA0B;CAClF,OAAO,QAAQ,IAAI,cAAc,SAAS,YAAY,CAAC;AACzD"}
@@ -6,7 +6,7 @@ function createDiagnosticsLogger(mode) {
6
6
  if (mode === "off") return;
7
7
  return (info) => {
8
8
  if (mode === "fallback" && !isFallbackReason(info.reason)) return;
9
- const bytes = typeof info.bytes === "number" ? info.bytes : info.estimatedBytes;
9
+ const bytes = info.phase ? info.phase.dispatch?.payloadBytes : typeof info.bytes === "number" ? info.bytes : info.estimatedBytes;
10
10
  const bytesText = typeof bytes === "number" ? `${bytes}B` : "unknown";
11
11
  const parts = [
12
12
  `mode=${info.mode}`,
@@ -17,6 +17,10 @@ function createDiagnosticsLogger(mode) {
17
17
  ];
18
18
  if (typeof info.revision === "number") parts.push(`revision=${info.revision}`);
19
19
  if (typeof info.committedRevision === "number") parts.push(`committedRevision=${info.committedRevision}`);
20
+ if (info.phase) {
21
+ const phase = info.phase;
22
+ parts.push(`phase=${phase.name}`, `observer=${phase.observerId}`, `result=${phase.result}`, `completion=${phase.completion}`, `dispatch=${phase.dispatch?.id ?? "unknown"}`, `prepareMs=${phase.prepareDurationMs ?? "unknown"}`, `dispatchMs=${phase.dispatch?.durationMs ?? "unknown"}`, `commitMs=${phase.commitDurationMs ?? "unknown"}`, "visibleAt=unknown");
23
+ }
20
24
  if (typeof info.mergedSiblingParents === "number") parts.push(`mergedParents=${info.mergedSiblingParents}`);
21
25
  if (typeof info.computedDirtyKeys === "number") parts.push(`computedDirty=${info.computedDirtyKeys}`);
22
26
  if (typeof info.flushCount === "number") parts.push(`flushes=${info.flushCount}`);
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.mjs","names":[],"sources":["../../../../src/runtime/app/diagnostics.ts"],"sourcesContent":["import type { SetDataDebugInfo } from '../types'\n\nfunction isFallbackReason(reason: SetDataDebugInfo['reason']) {\n return reason !== 'patch' && reason !== 'diff'\n}\n\nexport function createDiagnosticsLogger(mode: 'off' | 'fallback' | 'always') {\n if (mode === 'off') {\n return undefined\n }\n return (info: SetDataDebugInfo) => {\n if (mode === 'fallback' && !isFallbackReason(info.reason)) {\n return\n }\n const bytes = typeof info.bytes === 'number' ? info.bytes : info.estimatedBytes\n const bytesText = typeof bytes === 'number' ? `${bytes}B` : 'unknown'\n const parts = [\n `mode=${info.mode}`,\n `reason=${info.reason}`,\n `pending=${info.pendingPatchKeys}`,\n `keys=${info.payloadKeys}`,\n `bytes=${bytesText}`,\n ]\n if (typeof info.revision === 'number') {\n parts.push(`revision=${info.revision}`)\n }\n if (typeof info.committedRevision === 'number') {\n parts.push(`committedRevision=${info.committedRevision}`)\n }\n if (typeof info.mergedSiblingParents === 'number') {\n parts.push(`mergedParents=${info.mergedSiblingParents}`)\n }\n if (typeof info.computedDirtyKeys === 'number') {\n parts.push(`computedDirty=${info.computedDirtyKeys}`)\n }\n if (typeof info.flushCount === 'number') {\n parts.push(`flushes=${info.flushCount}`)\n }\n if (typeof info.windowMs === 'number') {\n parts.push(`window=${info.windowMs}ms`)\n }\n if (info.targetLabel) {\n parts.push(`target=${info.targetLabel}`)\n }\n if (info.bindings?.length) {\n const bindings = info.bindings.map((binding) => {\n const start = binding.sourceLocation?.start\n return start\n ? `${binding.id}@${binding.sourceFile}:${start.line}:${start.column}`\n : `${binding.id}@${binding.sourceFile}`\n })\n parts.push(`bindings=${bindings.join(',')}`)\n }\n if (info.message) {\n parts.push(`message=${info.message}`)\n }\n const message = `[wevu:setData] ${parts.join(' ')}`\n if (isFallbackReason(info.reason)) {\n // eslint-disable-next-line no-console\n console.warn(message)\n return\n }\n // eslint-disable-next-line no-console\n console.info(message)\n }\n}\n"],"mappings":";AAEA,SAAS,iBAAiB,QAAoC;CAC5D,OAAO,WAAW,WAAW,WAAW;AAC1C;AAEA,SAAgB,wBAAwB,MAAqC;CAC3E,IAAI,SAAS,OACX;CAEF,QAAQ,SAA2B;EACjC,IAAI,SAAS,cAAc,CAAC,iBAAiB,KAAK,MAAM,GACtD;EAEF,MAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK;EACjE,MAAM,YAAY,OAAO,UAAU,WAAW,GAAG,MAAM,KAAK;EAC5D,MAAM,QAAQ;GACZ,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,SAAS;EACX;EACA,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,KAAK,YAAY,KAAK,UAAU;EAExC,IAAI,OAAO,KAAK,sBAAsB,UACpC,MAAM,KAAK,qBAAqB,KAAK,mBAAmB;EAE1D,IAAI,OAAO,KAAK,yBAAyB,UACvC,MAAM,KAAK,iBAAiB,KAAK,sBAAsB;EAEzD,IAAI,OAAO,KAAK,sBAAsB,UACpC,MAAM,KAAK,iBAAiB,KAAK,mBAAmB;EAEtD,IAAI,OAAO,KAAK,eAAe,UAC7B,MAAM,KAAK,WAAW,KAAK,YAAY;EAEzC,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,KAAK,UAAU,KAAK,SAAS,GAAG;EAExC,IAAI,KAAK,aACP,MAAM,KAAK,UAAU,KAAK,aAAa;EAEzC,IAAI,KAAK,UAAU,QAAQ;GACzB,MAAM,WAAW,KAAK,SAAS,KAAK,YAAY;IAC9C,MAAM,QAAQ,QAAQ,gBAAgB;IACtC,OAAO,QACH,GAAG,QAAQ,GAAG,GAAG,QAAQ,WAAW,GAAG,MAAM,KAAK,GAAG,MAAM,WAC3D,GAAG,QAAQ,GAAG,GAAG,QAAQ;GAC/B,CAAC;GACD,MAAM,KAAK,YAAY,SAAS,KAAK,GAAG,GAAG;EAC7C;EACA,IAAI,KAAK,SACP,MAAM,KAAK,WAAW,KAAK,SAAS;EAEtC,MAAM,UAAU,kBAAkB,MAAM,KAAK,GAAG;EAChD,IAAI,iBAAiB,KAAK,MAAM,GAAG;GAEjC,QAAQ,KAAK,OAAO;GACpB;EACF;EAEA,QAAQ,KAAK,OAAO;CACtB;AACF"}
1
+ {"version":3,"file":"diagnostics.mjs","names":[],"sources":["../../../../src/runtime/app/diagnostics.ts"],"sourcesContent":["import type { SetDataDebugInfo } from '../types'\n\nfunction isFallbackReason(reason: SetDataDebugInfo['reason']) {\n return reason !== 'patch' && reason !== 'diff'\n}\n\nexport function createDiagnosticsLogger(mode: 'off' | 'fallback' | 'always') {\n if (mode === 'off') {\n return undefined\n }\n return (info: SetDataDebugInfo) => {\n if (mode === 'fallback' && !isFallbackReason(info.reason)) {\n return\n }\n const bytes = info.phase\n ? info.phase.dispatch?.payloadBytes\n : typeof info.bytes === 'number' ? info.bytes : info.estimatedBytes\n const bytesText = typeof bytes === 'number' ? `${bytes}B` : 'unknown'\n const parts = [\n `mode=${info.mode}`,\n `reason=${info.reason}`,\n `pending=${info.pendingPatchKeys}`,\n `keys=${info.payloadKeys}`,\n `bytes=${bytesText}`,\n ]\n if (typeof info.revision === 'number') {\n parts.push(`revision=${info.revision}`)\n }\n if (typeof info.committedRevision === 'number') {\n parts.push(`committedRevision=${info.committedRevision}`)\n }\n if (info.phase) {\n const phase = info.phase\n parts.push(\n `phase=${phase.name}`,\n `observer=${phase.observerId}`,\n `result=${phase.result}`,\n `completion=${phase.completion}`,\n `dispatch=${phase.dispatch?.id ?? 'unknown'}`,\n `prepareMs=${phase.prepareDurationMs ?? 'unknown'}`,\n `dispatchMs=${phase.dispatch?.durationMs ?? 'unknown'}`,\n `commitMs=${phase.commitDurationMs ?? 'unknown'}`,\n 'visibleAt=unknown',\n )\n }\n if (typeof info.mergedSiblingParents === 'number') {\n parts.push(`mergedParents=${info.mergedSiblingParents}`)\n }\n if (typeof info.computedDirtyKeys === 'number') {\n parts.push(`computedDirty=${info.computedDirtyKeys}`)\n }\n if (typeof info.flushCount === 'number') {\n parts.push(`flushes=${info.flushCount}`)\n }\n if (typeof info.windowMs === 'number') {\n parts.push(`window=${info.windowMs}ms`)\n }\n if (info.targetLabel) {\n parts.push(`target=${info.targetLabel}`)\n }\n if (info.bindings?.length) {\n const bindings = info.bindings.map((binding) => {\n const start = binding.sourceLocation?.start\n return start\n ? `${binding.id}@${binding.sourceFile}:${start.line}:${start.column}`\n : `${binding.id}@${binding.sourceFile}`\n })\n parts.push(`bindings=${bindings.join(',')}`)\n }\n if (info.message) {\n parts.push(`message=${info.message}`)\n }\n const message = `[wevu:setData] ${parts.join(' ')}`\n if (isFallbackReason(info.reason)) {\n // eslint-disable-next-line no-console\n console.warn(message)\n return\n }\n // eslint-disable-next-line no-console\n console.info(message)\n }\n}\n"],"mappings":";AAEA,SAAS,iBAAiB,QAAoC;CAC5D,OAAO,WAAW,WAAW,WAAW;AAC1C;AAEA,SAAgB,wBAAwB,MAAqC;CAC3E,IAAI,SAAS,OACX;CAEF,QAAQ,SAA2B;EACjC,IAAI,SAAS,cAAc,CAAC,iBAAiB,KAAK,MAAM,GACtD;EAEF,MAAM,QAAQ,KAAK,QACf,KAAK,MAAM,UAAU,eACrB,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK;EACvD,MAAM,YAAY,OAAO,UAAU,WAAW,GAAG,MAAM,KAAK;EAC5D,MAAM,QAAQ;GACZ,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,SAAS;EACX;EACA,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,KAAK,YAAY,KAAK,UAAU;EAExC,IAAI,OAAO,KAAK,sBAAsB,UACpC,MAAM,KAAK,qBAAqB,KAAK,mBAAmB;EAE1D,IAAI,KAAK,OAAO;GACd,MAAM,QAAQ,KAAK;GACnB,MAAM,KACJ,SAAS,MAAM,QACf,YAAY,MAAM,cAClB,UAAU,MAAM,UAChB,cAAc,MAAM,cACpB,YAAY,MAAM,UAAU,MAAM,aAClC,aAAa,MAAM,qBAAqB,aACxC,cAAc,MAAM,UAAU,cAAc,aAC5C,YAAY,MAAM,oBAAoB,aACtC,mBACF;EACF;EACA,IAAI,OAAO,KAAK,yBAAyB,UACvC,MAAM,KAAK,iBAAiB,KAAK,sBAAsB;EAEzD,IAAI,OAAO,KAAK,sBAAsB,UACpC,MAAM,KAAK,iBAAiB,KAAK,mBAAmB;EAEtD,IAAI,OAAO,KAAK,eAAe,UAC7B,MAAM,KAAK,WAAW,KAAK,YAAY;EAEzC,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,KAAK,UAAU,KAAK,SAAS,GAAG;EAExC,IAAI,KAAK,aACP,MAAM,KAAK,UAAU,KAAK,aAAa;EAEzC,IAAI,KAAK,UAAU,QAAQ;GACzB,MAAM,WAAW,KAAK,SAAS,KAAK,YAAY;IAC9C,MAAM,QAAQ,QAAQ,gBAAgB;IACtC,OAAO,QACH,GAAG,QAAQ,GAAG,GAAG,QAAQ,WAAW,GAAG,MAAM,KAAK,GAAG,MAAM,WAC3D,GAAG,QAAQ,GAAG,GAAG,QAAQ;GAC/B,CAAC;GACD,MAAM,KAAK,YAAY,SAAS,KAAK,GAAG,GAAG;EAC7C;EACA,IAAI,KAAK,SACP,MAAM,KAAK,WAAW,KAAK,SAAS;EAEtC,MAAM,UAAU,kBAAkB,MAAM,KAAK,GAAG;EAChD,IAAI,iBAAiB,KAAK,MAAM,GAAG;GAEjC,QAAQ,KAAK,OAAO;GACpB;EACF;EAEA,QAAQ,KAAK,OAAO;CACtB;AACF"}
@@ -76,7 +76,7 @@ function createRuntimeMount(options) {
76
76
  const value = state[key];
77
77
  if (hasTrackableSetupBinding(value)) trackedSetupReactiveKeys.add(key);
78
78
  });
79
- const { includeComputed, setDataStrategy, maxPatchKeys, maxPayloadBytes, mergeSiblingThreshold, mergeSiblingMaxInflationRatio, mergeSiblingMaxParentBytes, mergeSiblingSkipArray, computedCompare, computedCompareMaxDepth, computedCompareMaxKeys, prelinkMaxDepth, prelinkMaxKeys, debug, diagnostics, loopWarning, debugWhen, debugSampleRate, elevateTopKeyThreshold, toPlainMaxDepth, toPlainMaxKeys, includeFunctions, functionPaths, shouldIncludeKey } = resolveSetDataOptions(setDataOptions);
79
+ const { includeComputed, setDataStrategy, maxPatchKeys, maxPayloadBytes, mergeSiblingThreshold, mergeSiblingMaxInflationRatio, mergeSiblingMaxParentBytes, mergeSiblingSkipArray, computedCompare, computedCompareMaxDepth, computedCompareMaxKeys, prelinkMaxDepth, prelinkMaxKeys, debug, diagnostics, loopWarning, debugWhen, debugSampleRate, debugPhases, elevateTopKeyThreshold, toPlainMaxDepth, toPlainMaxKeys, includeFunctions, functionPaths, shouldIncludeKey } = resolveSetDataOptions(setDataOptions);
80
80
  const diagnosticsLogger = createDiagnosticsLogger(diagnostics);
81
81
  const loopWarningLogger = diagnostics === "off" && loopWarning ? createDiagnosticsLogger("fallback") : void 0;
82
82
  const mergedDebug = debug || diagnosticsLogger || loopWarningLogger ? (info) => {
@@ -128,6 +128,7 @@ function createRuntimeMount(options) {
128
128
  debug: mergedDebug,
129
129
  debugWhen: mergedDebugWhen,
130
130
  debugSampleRate,
131
+ debugPhases,
131
132
  bindingManifest,
132
133
  loopWarning,
133
134
  targetLabel,
@@ -138,6 +139,10 @@ function createRuntimeMount(options) {
138
139
  };
139
140
  const scheduler = setDataStrategy === "patch" ? requireRuntimeCapability("patchStrategy", "createRuntimeMount(setData.strategy=\"patch\")").createScheduler(schedulerOptions) : createSetDataScheduler(schedulerOptions);
140
141
  const job = () => scheduler.job();
142
+ const flushSetupSnapshotSync = () => {
143
+ tracker?.();
144
+ scheduler.job();
145
+ };
141
146
  tracker = effect(() => {
142
147
  touchReactive(state);
143
148
  const runtimeProps = state[WEVU_PROPS_KEY];
@@ -216,13 +221,13 @@ function createRuntimeMount(options) {
216
221
  }
217
222
  try {
218
223
  Object.defineProperty(runtimeInstance, "__wevu_flushSetupSnapshotSync", {
219
- value: job,
224
+ value: flushSetupSnapshotSync,
220
225
  configurable: true,
221
226
  enumerable: false,
222
227
  writable: false
223
228
  });
224
229
  } catch {
225
- runtimeInstance.__wevu_flushSetupSnapshotSync = job;
230
+ runtimeInstance.__wevu_flushSetupSnapshotSync = flushSetupSnapshotSync;
226
231
  }
227
232
  try {
228
233
  Object.defineProperty(runtimeInstance, "__wevu_cloneDispatchedSnapshot", {
@@ -1 +1 @@
1
- {"version":3,"file":"mount.mjs","names":[],"sources":["../../../../src/runtime/app/mount.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { WatchOptions, WatchStopHandle } from '../../reactivity'\nimport type {\n AppConfig,\n ComputedDefinitions,\n CreateAppOptions,\n ExtractComputed,\n MethodDefinitions,\n MiniProgramAdapter,\n RuntimeInstance,\n SetDataDebugInfo,\n} from '../types'\nimport type { CommitAwareSetDataAdapter } from './setData/commitTracker'\nimport {\n WEVU_ATTRS_KEY,\n WEVU_PROPS_DERIVED_KEYS_KEY,\n WEVU_PROPS_KEY,\n WEVU_SETUP_STATE_KEY,\n} from '@weapp-core/constants'\nimport { effect, isReactive, reactive, shallowReactive, stop, touchReactive, watch } from '../../reactivity'\nimport { queueJob } from '../../scheduler'\nimport { hasOwn } from '../../utils'\nimport { createBindModel } from '../bindModel'\nimport { requireRuntimeCapability } from '../capabilities'\nimport { hasTrackableSetupBinding, touchSetupBinding } from '../setupTracking'\nimport { createRuntimeContext } from './context'\nimport { createDiagnosticsLogger } from './diagnostics'\nimport { createSetDataScheduler } from './setData/scheduler'\nimport { resolveSetDataOptions } from './setDataOptions'\n\nfunction createWatchStopHandle(cleanup: () => void, baseHandle?: WatchStopHandle): WatchStopHandle {\n const stopHandle = (() => {\n cleanup()\n }) as WatchStopHandle\n stopHandle.stop = () => stopHandle()\n stopHandle.pause = () => {\n baseHandle?.pause?.()\n }\n stopHandle.resume = () => {\n baseHandle?.resume?.()\n }\n return stopHandle\n}\n\ntype RuntimeInstanceWithSetupMethodsVersion<\n D extends object,\n C extends ComputedDefinitions,\n M extends MethodDefinitions,\n> = RuntimeInstance<D, C, M> & {\n __wevu_touchSetupMethodsVersion?: () => void\n __wevu_flushSetupSnapshotSync?: () => void\n __wevu_cloneDispatchedSnapshot?: () => Record<string, any>\n __wevu_trackSetupReactiveKey?: (key: string) => void\n}\n\nfunction resolveDataOption<D extends object>(data: CreateAppOptions<D, any, any>['data']): D {\n if (typeof data === 'function') {\n return data()\n }\n return (data ?? {}) as D\n}\n\nexport function createRuntimeMount<D extends object, C extends ComputedDefinitions, M extends MethodDefinitions>(options: {\n data: CreateAppOptions<D, C, M>['data']\n resolvedComputed: C\n resolvedMethods: M\n appConfig: AppConfig\n setDataOptions: CreateAppOptions<D, C, M>['setData']\n bindingManifest?: WevuRuntimeBindingManifestV1\n}) {\n const {\n data,\n resolvedComputed,\n resolvedMethods,\n appConfig,\n setDataOptions,\n bindingManifest,\n } = options\n\n return (adapter?: MiniProgramAdapter): RuntimeInstance<D, C, M> => {\n if (setDataOptions?.strategy === 'patch') {\n requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n }\n const rawState = resolveDataOption(data)\n const adapterInitialProps = (adapter as any)?.__wevu_initialProps\n // 预置 props 容器,确保编译器生成的 this.__wevuProps 回退表达式\n // 在 computed 首次求值阶段即可建立响应式依赖。\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_PROPS_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_PROPS_KEY, {\n value: shallowReactive(Object.create(null)),\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由 mount 阶段兜底注入。\n }\n }\n const rawProps = rawState && typeof rawState === 'object'\n ? (rawState as any)[WEVU_PROPS_KEY]\n : undefined\n if (rawProps && typeof rawProps === 'object' && adapterInitialProps && typeof adapterInitialProps === 'object') {\n Object.assign(rawProps, adapterInitialProps)\n }\n const state = reactive(rawState)\n const setupState = reactive(Object.create(null))\n const adapterSnapshotOmitKeys = (adapter as any)?.__wevu_snapshotOmitKeys\n const deferInitialSnapshot = Boolean((adapter as any)?.__wevu_deferInitialSnapshot)\n const adapterInitialSnapshot = (adapter as any)?.__wevu_initialSnapshot\n const adapterInitialState = (adapter as any)?.__wevu_initialState\n const snapshotOmitKeys = new Set<string>(\n adapterSnapshotOmitKeys instanceof Set\n ? adapterSnapshotOmitKeys\n : Array.isArray(adapterSnapshotOmitKeys)\n ? adapterSnapshotOmitKeys\n : [],\n )\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_SETUP_STATE_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_SETUP_STATE_KEY, {\n value: setupState,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由注册阶段兜底注入。\n }\n }\n if (rawState && typeof rawState === 'object' && adapterInitialState && typeof adapterInitialState === 'object') {\n for (const [key, value] of Object.entries(adapterInitialState as Record<string, unknown>)) {\n if (snapshotOmitKeys.has(key)) {\n continue\n }\n ;(rawState as Record<string, unknown>)[key] = value\n }\n }\n const computedDefs = resolvedComputed\n const methodDefs = resolvedMethods\n\n let mounted = true\n const stopHandles: WatchStopHandle[] = []\n const trackedSetupReactiveKeys = new Set<string>()\n Object.keys(state as any).forEach((key) => {\n const value = (state as any)[key]\n if (hasTrackableSetupBinding(value)) {\n trackedSetupReactiveKeys.add(key)\n }\n })\n\n const {\n includeComputed,\n setDataStrategy,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n prelinkMaxDepth,\n prelinkMaxKeys,\n debug,\n diagnostics,\n loopWarning,\n debugWhen,\n debugSampleRate,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n shouldIncludeKey,\n } = resolveSetDataOptions(setDataOptions)\n const diagnosticsLogger = createDiagnosticsLogger(diagnostics)\n const loopWarningLogger = diagnostics === 'off' && loopWarning\n ? createDiagnosticsLogger('fallback')\n : undefined\n const mergedDebug = (debug || diagnosticsLogger || loopWarningLogger)\n ? (info: SetDataDebugInfo) => {\n if (typeof debug === 'function') {\n try {\n debug(info)\n }\n catch {\n // 用户调试回调不得阻止默认诊断。\n }\n }\n diagnosticsLogger?.(info)\n if (info.reason === 'loopWarning') {\n loopWarningLogger?.(info)\n }\n }\n : undefined\n const mergedDebugWhen = diagnostics === 'always'\n ? 'always'\n : debugWhen\n\n const {\n boundMethods,\n computedRefs,\n computedSetters,\n dirtyComputedKeys,\n computedProxy,\n publicInstance,\n touchSetupMethodsVersion,\n } = createRuntimeContext({\n state,\n setupState: setupState as Record<string, any>,\n computedDefs,\n methodDefs,\n appConfig,\n includeComputed,\n setDataStrategy,\n })\n\n const currentAdapter: CommitAwareSetDataAdapter = adapter ?? { setData: () => {} }\n const targetLabel = (currentAdapter as any).__wevu_targetLabel as string | undefined\n let tracker: ReturnType<typeof effect> | undefined\n const schedulerOptions = {\n state: state as any,\n setupState: setupState as any,\n snapshotOmitKeys,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n setDataStrategy,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n currentAdapter,\n shouldIncludeKey,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n elevateTopKeyThreshold,\n prelinkMaxDepth,\n prelinkMaxKeys,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n debug: mergedDebug,\n debugWhen: mergedDebugWhen,\n debugSampleRate,\n bindingManifest,\n loopWarning,\n targetLabel,\n runTracker: () => tracker?.(),\n isMounted: () => mounted,\n initialSnapshot: adapterInitialSnapshot && typeof adapterInitialSnapshot === 'object'\n ? adapterInitialSnapshot\n : undefined,\n initialState: adapterInitialState && typeof adapterInitialState === 'object'\n ? adapterInitialState\n : undefined,\n }\n const scheduler = setDataStrategy === 'patch'\n ? requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n .createScheduler(schedulerOptions)\n : createSetDataScheduler(schedulerOptions)\n const job = () => scheduler.job()\n\n tracker = effect(\n () => {\n // 通过根版本信号跟踪任意状态变化\n touchReactive(state as any)\n // __wevuProps / __wevuAttrs 是非枚举属性,需显式跟踪,\n // 否则 props/attrs 更新不会触发 setData 调度。\n const runtimeProps = (state as any)[WEVU_PROPS_KEY]\n if (isReactive(runtimeProps)) {\n touchReactive(runtimeProps as any)\n }\n const runtimeAttrs = (state as any)[WEVU_ATTRS_KEY]\n if (isReactive(runtimeAttrs)) {\n touchReactive(runtimeAttrs as any)\n }\n // 在 setup 返回的 ref/computedRef 变更不会提升 reactive 根版本:\n // 仅跟踪这些明确注册过的键,避免每轮 flush 扫描整份 state。\n trackedSetupReactiveKeys.forEach((key) => {\n const v = (setupState as any)[key] ?? (state as any)[key]\n // setup 返回的组合式对象常常是“普通对象 + 内含 refs/reactive”,\n // 这里递归触达内部响应式源,确保异步更新也能继续驱动 setData。\n touchSetupBinding(v)\n })\n },\n {\n lazy: true,\n scheduler: () => queueJob(job),\n },\n )\n\n if (!deferInitialSnapshot) {\n job()\n }\n\n stopHandles.push(createWatchStopHandle(() => stop(tracker)))\n scheduler.start?.()\n if (scheduler.dispose) {\n stopHandles.push(createWatchStopHandle(scheduler.dispose))\n }\n\n function registerWatch<T>(\n source: (() => T) | Record<string, any>,\n cb: (value: T, oldValue: T) => void,\n watchOptions?: WatchOptions,\n ): WatchStopHandle {\n const stopHandle = watch(source as any, (value: T, oldValue: T) => cb(value, oldValue), watchOptions)\n stopHandles.push(stopHandle)\n return createWatchStopHandle(() => {\n stopHandle()\n const index = stopHandles.indexOf(stopHandle)\n if (index >= 0) {\n stopHandles.splice(index, 1)\n }\n }, stopHandle)\n }\n\n const bindModel = createBindModel(\n publicInstance as any,\n state as any,\n computedRefs,\n computedSetters,\n setupState as Record<string, any>,\n )\n\n const unmount = () => {\n if (!mounted) {\n return\n }\n mounted = false\n scheduler.dispose?.()\n try {\n currentAdapter.__wevu_disposeSetData?.()\n }\n catch {\n // 卸载阶段继续清理其余运行时资源。\n }\n stopHandles.forEach((handle) => {\n try {\n handle()\n }\n catch {\n // 卸载阶段忽略 stop 抛错,确保其余清理继续\n }\n })\n stopHandles.length = 0\n }\n\n const runtimeInstance: RuntimeInstance<D, C, M> = {\n get state() {\n return state\n },\n get setupState() {\n return setupState as Record<string, any>\n },\n get proxy() {\n return publicInstance\n },\n get methods() {\n return boundMethods\n },\n get computed() {\n return computedProxy as Readonly<ExtractComputed<C>>\n },\n get adapter() {\n return currentAdapter\n },\n bindModel,\n watch: registerWatch,\n snapshot: () => scheduler.snapshot(),\n unmount,\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_touchSetupMethodsVersion', {\n value: touchSetupMethodsVersion,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_touchSetupMethodsVersion = touchSetupMethodsVersion\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_flushSetupSnapshotSync', {\n value: job,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_flushSetupSnapshotSync = job\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_cloneDispatchedSnapshot', {\n value: scheduler.cloneLatestSnapshot,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_cloneDispatchedSnapshot = scheduler.cloneLatestSnapshot\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_trackSetupReactiveKey', {\n value: (key: string) => {\n trackedSetupReactiveKeys.add(key)\n },\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_trackSetupReactiveKey = (key: string) => {\n trackedSetupReactiveKeys.add(key)\n }\n }\n\n try {\n Object.defineProperty(runtimeInstance, WEVU_PROPS_DERIVED_KEYS_KEY, {\n value: snapshotOmitKeys,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as any)[WEVU_PROPS_DERIVED_KEYS_KEY] = snapshotOmitKeys\n }\n\n return runtimeInstance\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mount.mjs","names":[],"sources":["../../../../src/runtime/app/mount.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { WatchOptions, WatchStopHandle } from '../../reactivity'\nimport type {\n AppConfig,\n ComputedDefinitions,\n CreateAppOptions,\n ExtractComputed,\n MethodDefinitions,\n MiniProgramAdapter,\n RuntimeInstance,\n SetDataDebugInfo,\n} from '../types'\nimport type { CommitAwareSetDataAdapter } from './setData/commitTracker'\nimport {\n WEVU_ATTRS_KEY,\n WEVU_PROPS_DERIVED_KEYS_KEY,\n WEVU_PROPS_KEY,\n WEVU_SETUP_STATE_KEY,\n} from '@weapp-core/constants'\nimport { effect, isReactive, reactive, shallowReactive, stop, touchReactive, watch } from '../../reactivity'\nimport { queueJob } from '../../scheduler'\nimport { hasOwn } from '../../utils'\nimport { createBindModel } from '../bindModel'\nimport { requireRuntimeCapability } from '../capabilities'\nimport { hasTrackableSetupBinding, touchSetupBinding } from '../setupTracking'\nimport { createRuntimeContext } from './context'\nimport { createDiagnosticsLogger } from './diagnostics'\nimport { createSetDataScheduler } from './setData/scheduler'\nimport { resolveSetDataOptions } from './setDataOptions'\n\nfunction createWatchStopHandle(cleanup: () => void, baseHandle?: WatchStopHandle): WatchStopHandle {\n const stopHandle = (() => {\n cleanup()\n }) as WatchStopHandle\n stopHandle.stop = () => stopHandle()\n stopHandle.pause = () => {\n baseHandle?.pause?.()\n }\n stopHandle.resume = () => {\n baseHandle?.resume?.()\n }\n return stopHandle\n}\n\ntype RuntimeInstanceWithSetupMethodsVersion<\n D extends object,\n C extends ComputedDefinitions,\n M extends MethodDefinitions,\n> = RuntimeInstance<D, C, M> & {\n __wevu_touchSetupMethodsVersion?: () => void\n __wevu_flushSetupSnapshotSync?: () => void\n __wevu_cloneDispatchedSnapshot?: () => Record<string, any>\n __wevu_trackSetupReactiveKey?: (key: string) => void\n}\n\nfunction resolveDataOption<D extends object>(data: CreateAppOptions<D, any, any>['data']): D {\n if (typeof data === 'function') {\n return data()\n }\n return (data ?? {}) as D\n}\n\nexport function createRuntimeMount<D extends object, C extends ComputedDefinitions, M extends MethodDefinitions>(options: {\n data: CreateAppOptions<D, C, M>['data']\n resolvedComputed: C\n resolvedMethods: M\n appConfig: AppConfig\n setDataOptions: CreateAppOptions<D, C, M>['setData']\n bindingManifest?: WevuRuntimeBindingManifestV1\n}) {\n const {\n data,\n resolvedComputed,\n resolvedMethods,\n appConfig,\n setDataOptions,\n bindingManifest,\n } = options\n\n return (adapter?: MiniProgramAdapter): RuntimeInstance<D, C, M> => {\n if (setDataOptions?.strategy === 'patch') {\n requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n }\n const rawState = resolveDataOption(data)\n const adapterInitialProps = (adapter as any)?.__wevu_initialProps\n // 预置 props 容器,确保编译器生成的 this.__wevuProps 回退表达式\n // 在 computed 首次求值阶段即可建立响应式依赖。\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_PROPS_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_PROPS_KEY, {\n value: shallowReactive(Object.create(null)),\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由 mount 阶段兜底注入。\n }\n }\n const rawProps = rawState && typeof rawState === 'object'\n ? (rawState as any)[WEVU_PROPS_KEY]\n : undefined\n if (rawProps && typeof rawProps === 'object' && adapterInitialProps && typeof adapterInitialProps === 'object') {\n Object.assign(rawProps, adapterInitialProps)\n }\n const state = reactive(rawState)\n const setupState = reactive(Object.create(null))\n const adapterSnapshotOmitKeys = (adapter as any)?.__wevu_snapshotOmitKeys\n const deferInitialSnapshot = Boolean((adapter as any)?.__wevu_deferInitialSnapshot)\n const adapterInitialSnapshot = (adapter as any)?.__wevu_initialSnapshot\n const adapterInitialState = (adapter as any)?.__wevu_initialState\n const snapshotOmitKeys = new Set<string>(\n adapterSnapshotOmitKeys instanceof Set\n ? adapterSnapshotOmitKeys\n : Array.isArray(adapterSnapshotOmitKeys)\n ? adapterSnapshotOmitKeys\n : [],\n )\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_SETUP_STATE_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_SETUP_STATE_KEY, {\n value: setupState,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由注册阶段兜底注入。\n }\n }\n if (rawState && typeof rawState === 'object' && adapterInitialState && typeof adapterInitialState === 'object') {\n for (const [key, value] of Object.entries(adapterInitialState as Record<string, unknown>)) {\n if (snapshotOmitKeys.has(key)) {\n continue\n }\n ;(rawState as Record<string, unknown>)[key] = value\n }\n }\n const computedDefs = resolvedComputed\n const methodDefs = resolvedMethods\n\n let mounted = true\n const stopHandles: WatchStopHandle[] = []\n const trackedSetupReactiveKeys = new Set<string>()\n Object.keys(state as any).forEach((key) => {\n const value = (state as any)[key]\n if (hasTrackableSetupBinding(value)) {\n trackedSetupReactiveKeys.add(key)\n }\n })\n\n const {\n includeComputed,\n setDataStrategy,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n prelinkMaxDepth,\n prelinkMaxKeys,\n debug,\n diagnostics,\n loopWarning,\n debugWhen,\n debugSampleRate,\n debugPhases,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n shouldIncludeKey,\n } = resolveSetDataOptions(setDataOptions)\n const diagnosticsLogger = createDiagnosticsLogger(diagnostics)\n const loopWarningLogger = diagnostics === 'off' && loopWarning\n ? createDiagnosticsLogger('fallback')\n : undefined\n const mergedDebug = (debug || diagnosticsLogger || loopWarningLogger)\n ? (info: SetDataDebugInfo) => {\n if (typeof debug === 'function') {\n try {\n debug(info)\n }\n catch {\n // 用户调试回调不得阻止默认诊断。\n }\n }\n diagnosticsLogger?.(info)\n if (info.reason === 'loopWarning') {\n loopWarningLogger?.(info)\n }\n }\n : undefined\n const mergedDebugWhen = diagnostics === 'always'\n ? 'always'\n : debugWhen\n\n const {\n boundMethods,\n computedRefs,\n computedSetters,\n dirtyComputedKeys,\n computedProxy,\n publicInstance,\n touchSetupMethodsVersion,\n } = createRuntimeContext({\n state,\n setupState: setupState as Record<string, any>,\n computedDefs,\n methodDefs,\n appConfig,\n includeComputed,\n setDataStrategy,\n })\n\n const currentAdapter: CommitAwareSetDataAdapter = adapter ?? { setData: () => {} }\n const targetLabel = (currentAdapter as any).__wevu_targetLabel as string | undefined\n let tracker: ReturnType<typeof effect> | undefined\n const schedulerOptions = {\n state: state as any,\n setupState: setupState as any,\n snapshotOmitKeys,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n setDataStrategy,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n currentAdapter,\n shouldIncludeKey,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n elevateTopKeyThreshold,\n prelinkMaxDepth,\n prelinkMaxKeys,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n debug: mergedDebug,\n debugWhen: mergedDebugWhen,\n debugSampleRate,\n debugPhases,\n bindingManifest,\n loopWarning,\n targetLabel,\n runTracker: () => tracker?.(),\n isMounted: () => mounted,\n initialSnapshot: adapterInitialSnapshot && typeof adapterInitialSnapshot === 'object'\n ? adapterInitialSnapshot\n : undefined,\n initialState: adapterInitialState && typeof adapterInitialState === 'object'\n ? adapterInitialState\n : undefined,\n }\n const scheduler = setDataStrategy === 'patch'\n ? requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n .createScheduler(schedulerOptions)\n : createSetDataScheduler(schedulerOptions)\n const job = () => scheduler.job()\n // HMR 延迟快照可能把 setup 状态恢复为与宿主相同的值;此时调度器不会因值变化重新运行\n // tracker。先主动触达一次新 setup 的响应式依赖,确保后续 ref/computed 更新仍能进入调度器。\n const flushSetupSnapshotSync = () => {\n tracker?.()\n scheduler.job()\n }\n\n tracker = effect(\n () => {\n // 通过根版本信号跟踪任意状态变化\n touchReactive(state as any)\n // __wevuProps / __wevuAttrs 是非枚举属性,需显式跟踪,\n // 否则 props/attrs 更新不会触发 setData 调度。\n const runtimeProps = (state as any)[WEVU_PROPS_KEY]\n if (isReactive(runtimeProps)) {\n touchReactive(runtimeProps as any)\n }\n const runtimeAttrs = (state as any)[WEVU_ATTRS_KEY]\n if (isReactive(runtimeAttrs)) {\n touchReactive(runtimeAttrs as any)\n }\n // 在 setup 返回的 ref/computedRef 变更不会提升 reactive 根版本:\n // 仅跟踪这些明确注册过的键,避免每轮 flush 扫描整份 state。\n trackedSetupReactiveKeys.forEach((key) => {\n const v = (setupState as any)[key] ?? (state as any)[key]\n // setup 返回的组合式对象常常是“普通对象 + 内含 refs/reactive”,\n // 这里递归触达内部响应式源,确保异步更新也能继续驱动 setData。\n touchSetupBinding(v)\n })\n },\n {\n lazy: true,\n scheduler: () => queueJob(job),\n },\n )\n\n if (!deferInitialSnapshot) {\n job()\n }\n\n stopHandles.push(createWatchStopHandle(() => stop(tracker)))\n scheduler.start?.()\n if (scheduler.dispose) {\n stopHandles.push(createWatchStopHandle(scheduler.dispose))\n }\n\n function registerWatch<T>(\n source: (() => T) | Record<string, any>,\n cb: (value: T, oldValue: T) => void,\n watchOptions?: WatchOptions,\n ): WatchStopHandle {\n const stopHandle = watch(source as any, (value: T, oldValue: T) => cb(value, oldValue), watchOptions)\n stopHandles.push(stopHandle)\n return createWatchStopHandle(() => {\n stopHandle()\n const index = stopHandles.indexOf(stopHandle)\n if (index >= 0) {\n stopHandles.splice(index, 1)\n }\n }, stopHandle)\n }\n\n const bindModel = createBindModel(\n publicInstance as any,\n state as any,\n computedRefs,\n computedSetters,\n setupState as Record<string, any>,\n )\n\n const unmount = () => {\n if (!mounted) {\n return\n }\n mounted = false\n scheduler.dispose?.()\n try {\n currentAdapter.__wevu_disposeSetData?.()\n }\n catch {\n // 卸载阶段继续清理其余运行时资源。\n }\n stopHandles.forEach((handle) => {\n try {\n handle()\n }\n catch {\n // 卸载阶段忽略 stop 抛错,确保其余清理继续\n }\n })\n stopHandles.length = 0\n }\n\n const runtimeInstance: RuntimeInstance<D, C, M> = {\n get state() {\n return state\n },\n get setupState() {\n return setupState as Record<string, any>\n },\n get proxy() {\n return publicInstance\n },\n get methods() {\n return boundMethods\n },\n get computed() {\n return computedProxy as Readonly<ExtractComputed<C>>\n },\n get adapter() {\n return currentAdapter\n },\n bindModel,\n watch: registerWatch,\n snapshot: () => scheduler.snapshot(),\n unmount,\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_touchSetupMethodsVersion', {\n value: touchSetupMethodsVersion,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_touchSetupMethodsVersion = touchSetupMethodsVersion\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_flushSetupSnapshotSync', {\n value: flushSetupSnapshotSync,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_flushSetupSnapshotSync = flushSetupSnapshotSync\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_cloneDispatchedSnapshot', {\n value: scheduler.cloneLatestSnapshot,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_cloneDispatchedSnapshot = scheduler.cloneLatestSnapshot\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_trackSetupReactiveKey', {\n value: (key: string) => {\n trackedSetupReactiveKeys.add(key)\n },\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_trackSetupReactiveKey = (key: string) => {\n trackedSetupReactiveKeys.add(key)\n }\n }\n\n try {\n Object.defineProperty(runtimeInstance, WEVU_PROPS_DERIVED_KEYS_KEY, {\n value: snapshotOmitKeys,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as any)[WEVU_PROPS_DERIVED_KEYS_KEY] = snapshotOmitKeys\n }\n\n return runtimeInstance\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { observePhysicalDispatch } from "./observation.mjs";
1
2
  import { cloneSnapshotValue } from "./snapshot.mjs";
2
3
 
3
4
  //#region src/runtime/app/setData/commitTracker.ts
@@ -22,10 +23,13 @@ function observeSetDataCompletion(options) {
22
23
  let settled = false;
23
24
  let invoking = true;
24
25
  let callbackCalled = false;
26
+ let observedReturn = false;
25
27
  let returnIsAuthoritative = false;
28
+ let boundary = options.completion;
26
29
  const settleOnce = (settlement, cause) => {
27
30
  if (settled) return;
28
31
  settled = true;
32
+ options.observer?.complete(boundary);
29
33
  options.settle(settlement, cause);
30
34
  };
31
35
  const callback = () => {
@@ -37,17 +41,28 @@ function observeSetDataCompletion(options) {
37
41
  if (options.completion === "callback") settleOnce("committed");
38
42
  };
39
43
  try {
44
+ if (options.observer && options.payload) observePhysicalDispatch(options.observer, options.payload);
40
45
  const result = options.invoke(callback);
41
46
  const resultIsThenable = isThenable(result);
42
47
  returnIsAuthoritative = resultIsThenable;
43
48
  invoking = false;
49
+ if (options.observer && !observedReturn) {
50
+ observedReturn = true;
51
+ options.observer.returned(Date.now());
52
+ }
44
53
  if (resultIsThenable) {
54
+ boundary = "promise";
45
55
  result.then(() => settleOnce("committed"), (cause) => settleOnce("failed", cause));
46
56
  return;
47
57
  }
48
58
  if (options.completion === "return" || callbackCalled) settleOnce("committed");
49
59
  } catch (cause) {
60
+ boundary = "throw";
50
61
  invoking = false;
62
+ if (options.observer && !observedReturn) {
63
+ observedReturn = true;
64
+ options.observer.returned(Date.now());
65
+ }
51
66
  settleOnce("failed", cause);
52
67
  }
53
68
  }
@@ -113,12 +128,17 @@ function createSetDataCommitTracker(options) {
113
128
  }
114
129
  };
115
130
  const invalidateLedger = () => {
131
+ let abandonedObservations;
132
+ const result = state.disposed ? "disposed" : "abandoned";
116
133
  let current = head;
117
134
  while (current) {
118
135
  const next = current.next;
119
136
  current.inLedger = false;
120
137
  current.next = void 0;
121
- if (!current.physicalSettled) current.status = "abandoned";
138
+ if (!current.physicalSettled) {
139
+ current.status = "abandoned";
140
+ if (current.observation) (abandonedObservations ?? (abandonedObservations = [])).push(current.observation);
141
+ }
122
142
  resolveRecord(current);
123
143
  current = next;
124
144
  }
@@ -126,6 +146,7 @@ function createSetDataCommitTracker(options) {
126
146
  tail = void 0;
127
147
  epoch += 1;
128
148
  highestCompletedRevision = state.committedRevision;
149
+ abandonedObservations?.forEach((observation) => observation.finish(result));
129
150
  };
130
151
  const armRecovery = () => {
131
152
  state.needsFullSnapshot = true;
@@ -168,7 +189,7 @@ function createSetDataCommitTracker(options) {
168
189
  reportFailure("out-of-order", record, `revision ${record.revision} completed after committed revision ${state.committedRevision}`);
169
190
  }
170
191
  };
171
- const settleRecord = (record, settlement, cause) => {
192
+ const applySettlement = (record, settlement, cause) => {
172
193
  if (state.disposed || record.physicalSettled) return;
173
194
  record.physicalSettled = true;
174
195
  if (!record.inLedger || record.epoch !== epoch) {
@@ -197,6 +218,17 @@ function createSetDataCommitTracker(options) {
197
218
  }
198
219
  drainSucceededPrefix();
199
220
  };
221
+ const settleRecord = (record, settlement, cause) => {
222
+ if (state.disposed || record.physicalSettled) return;
223
+ if (!record.observation) {
224
+ applySettlement(record, settlement, cause);
225
+ return;
226
+ }
227
+ const late = !record.inLedger || record.epoch !== epoch;
228
+ const outOfOrder = settlement === "committed" && (late ? state.committedRevision > record.revision : highestCompletedRevision > record.revision);
229
+ applySettlement(record, settlement, cause);
230
+ record.observation?.finish(outOfOrder ? "out-of-order" : late ? settlement === "failed" ? "late-failed" : settlement === "committed" ? "late-committed" : "abandoned" : settlement);
231
+ };
200
232
  const createFullPayload = (snapshot) => {
201
233
  const payload = {};
202
234
  const snapshotKeys = new Set(Object.keys(snapshot));
@@ -227,19 +259,22 @@ function createSetDataCommitTracker(options) {
227
259
  tail = record;
228
260
  state.dispatchedSnapshot = update.snapshot;
229
261
  for (const key of Object.keys(update.payload)) knownHostTopKeys.add(key.split(".", 1)[0]);
262
+ record.observation = options.observe?.(update, revision);
230
263
  const settle = (settlement, cause) => {
231
264
  settleRecord(record, settlement, cause);
232
265
  };
233
266
  const hostPayload = cloneSnapshotValue(update.payload);
234
267
  if (typeof options.adapter.__wevu_dispatchSetData === "function") try {
235
- options.adapter.__wevu_dispatchSetData(hostPayload, settle);
268
+ options.adapter.__wevu_dispatchSetData(hostPayload, settle, record.observation?.physical);
236
269
  } catch (cause) {
237
270
  settle("failed", cause);
238
271
  }
239
272
  else observeSetDataCompletion({
240
273
  invoke: () => options.adapter.setData?.(hostPayload),
241
274
  completion: "return",
242
- settle
275
+ settle,
276
+ payload: hostPayload,
277
+ observer: options.adapter.setData ? record.observation?.physical : void 0
243
278
  });
244
279
  return revision;
245
280
  };