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
@@ -1 +1 @@
1
- {"version":3,"file":"commitTracker.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/commitTracker.ts"],"sourcesContent":["import type { MiniProgramAdapter, SetDataDebugInfo } from '../../types'\nimport { cloneSnapshotValue } from './snapshot'\n\nexport type SetDataSnapshot = Record<string, unknown>\nexport type SetDataPayload = Record<string, unknown>\nexport type SetDataMode = 'diff' | 'patch'\nexport type SetDataRevisionKind = 'delta' | 'full'\nexport type SetDataAdapterSettlement = 'committed' | 'failed' | 'abandoned'\n\nexport type SetDataAdapterSettler = (\n settlement: SetDataAdapterSettlement,\n cause?: unknown,\n) => void\n\nexport interface CommitAwareSetDataAdapter extends MiniProgramAdapter {\n __wevu_dispatchSetData?: (\n payload: SetDataPayload,\n settle: SetDataAdapterSettler,\n ) => void\n __wevu_reportSetDataError?: (error: Error) => void\n __wevu_disposeSetData?: () => void\n}\n\nexport interface PreparedSetDataUpdate {\n mode: SetDataMode\n kind: SetDataRevisionKind\n reason: SetDataDebugInfo['reason']\n snapshot: SetDataSnapshot\n payload: SetDataPayload\n pendingPatchKeys: number\n}\n\nexport interface SetDataCommitFailure {\n kind: 'adapter' | 'out-of-order'\n revision: number\n committedRevision: number\n mode: SetDataMode\n cause: unknown\n error: Error\n payloadKeys: number\n pendingPatchKeys: number\n}\n\nexport interface SetDataCommitState {\n preparedSnapshot: SetDataSnapshot\n dispatchedSnapshot: SetDataSnapshot\n committedSnapshot: SetDataSnapshot\n revision: number\n committedRevision: number\n failedRevision: number | undefined\n needsFullSnapshot: boolean\n commitPromise: Promise<void>\n disposed: boolean\n}\n\nexport interface SetDataCommitTracker {\n readonly state: SetDataCommitState\n dispatch: (update: PreparedSetDataUpdate) => number\n createFullPayload: (snapshot: SetDataSnapshot) => SetDataPayload\n dispose: () => void\n}\n\ntype RevisionStatus = 'dispatched' | 'succeeded' | 'failed' | 'abandoned'\n\ninterface RevisionRecord {\n revision: number\n epoch: number\n mode: SetDataMode\n kind: SetDataRevisionKind\n snapshot: SetDataSnapshot\n payloadKeys: number\n pendingPatchKeys: number\n status: RevisionStatus\n physicalSettled: boolean\n inLedger: boolean\n next: RevisionRecord | undefined\n commitPromise?: Promise<void>\n resolveCommit?: () => void\n}\n\nconst resolvedCommitPromise = Promise.resolve()\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return Boolean(\n value\n && (typeof value === 'object' || typeof value === 'function')\n && typeof (value as PromiseLike<unknown>).then === 'function',\n )\n}\n\nfunction formatCommitFailureCause(cause: unknown): string {\n try {\n return cause instanceof Error ? cause.message : String(cause)\n }\n catch {\n return '<unprintable cause>'\n }\n}\n\nfunction createCommitError(\n kind: SetDataCommitFailure['kind'],\n record: RevisionRecord,\n cause: unknown,\n) {\n const causeMessage = formatCommitFailureCause(cause)\n const label = kind === 'adapter' ? 'adapter failure' : 'out-of-order completion'\n const error = new Error(\n `[wevu] setData commit failed (${label}, revision=${record.revision}, mode=${record.mode}, kind=${record.kind}): ${causeMessage}`,\n )\n ;(error as Error & { cause?: unknown }).cause = cause\n return error\n}\n\nexport function observeSetDataCompletion(options: {\n invoke: (callback: () => void) => unknown\n completion: 'return' | 'callback'\n settle: SetDataAdapterSettler\n}): void {\n let settled = false\n let invoking = true\n let callbackCalled = false\n let returnIsAuthoritative = false\n const settleOnce: SetDataAdapterSettler = (settlement, cause) => {\n if (settled) {\n return\n }\n settled = true\n options.settle(settlement, cause)\n }\n const callback = () => {\n if (invoking) {\n callbackCalled = true\n return\n }\n if (returnIsAuthoritative) {\n return\n }\n if (options.completion === 'callback') {\n settleOnce('committed')\n }\n }\n\n try {\n const result = options.invoke(callback)\n const resultIsThenable = isThenable(result)\n returnIsAuthoritative = resultIsThenable\n invoking = false\n if (resultIsThenable) {\n result.then(\n () => settleOnce('committed'),\n cause => settleOnce('failed', cause),\n )\n return\n }\n if (options.completion === 'return' || callbackCalled) {\n settleOnce('committed')\n }\n }\n catch (cause) {\n invoking = false\n settleOnce('failed', cause)\n }\n}\n\nexport function createSetDataCommitTracker(options: {\n initialSnapshot?: SetDataSnapshot\n adapter: CommitAwareSetDataAdapter\n onFailure: (failure: SetDataCommitFailure) => void\n}): SetDataCommitTracker {\n const initialSnapshot = options.initialSnapshot ? cloneSnapshotValue(options.initialSnapshot) : {}\n const knownHostTopKeys = new Set(Object.keys(initialSnapshot))\n let epoch = 0\n let highestCompletedRevision = 0\n let head: RevisionRecord | undefined\n let tail: RevisionRecord | undefined\n\n function ensureCommitBarrier(record: RevisionRecord) {\n if (!record.inLedger) {\n return resolvedCommitPromise\n }\n if (!record.commitPromise) {\n record.commitPromise = new Promise<void>((resolve) => {\n record.resolveCommit = resolve\n })\n }\n return record.commitPromise\n }\n\n const state: SetDataCommitState = {\n preparedSnapshot: initialSnapshot,\n dispatchedSnapshot: initialSnapshot,\n committedSnapshot: initialSnapshot,\n revision: 0,\n committedRevision: 0,\n failedRevision: undefined,\n needsFullSnapshot: false,\n get commitPromise() {\n return tail ? ensureCommitBarrier(tail) : resolvedCommitPromise\n },\n disposed: false,\n }\n\n const reportFailure = (\n kind: SetDataCommitFailure['kind'],\n record: RevisionRecord,\n cause: unknown,\n ) => {\n const error = createCommitError(kind, record, cause)\n try {\n options.onFailure({\n kind,\n revision: record.revision,\n committedRevision: state.committedRevision,\n mode: record.mode,\n cause,\n error,\n payloadKeys: record.payloadKeys,\n pendingPatchKeys: record.pendingPatchKeys,\n })\n }\n catch {\n // 错误上报不得反向破坏提交状态机。\n }\n }\n\n const resolveRecord = (record: RevisionRecord) => {\n record.resolveCommit?.()\n record.resolveCommit = undefined\n }\n\n const removePrefixThrough = (last: RevisionRecord) => {\n let current = head\n while (current) {\n const next = current.next\n current.inLedger = false\n current.next = undefined\n resolveRecord(current)\n if (current === last) {\n head = next\n if (!head) {\n tail = undefined\n }\n return\n }\n current = next\n }\n }\n\n const invalidateLedger = () => {\n let current = head\n while (current) {\n const next = current.next\n current.inLedger = false\n current.next = undefined\n if (!current.physicalSettled) {\n current.status = 'abandoned'\n }\n resolveRecord(current)\n current = next\n }\n head = undefined\n tail = undefined\n epoch += 1\n highestCompletedRevision = state.committedRevision\n }\n\n const armRecovery = () => {\n state.needsFullSnapshot = true\n }\n\n const failLineage = (\n kind: SetDataCommitFailure['kind'],\n record: RevisionRecord,\n cause: unknown,\n ) => {\n record.status = 'failed'\n state.failedRevision = record.revision\n armRecovery()\n invalidateLedger()\n reportFailure(kind, record, cause)\n }\n\n const drainSucceededPrefix = () => {\n while (head?.status === 'succeeded') {\n const record = head\n state.committedSnapshot = record.snapshot\n state.committedRevision = record.revision\n head = record.next\n record.inLedger = false\n record.next = undefined\n resolveRecord(record)\n }\n if (!head) {\n tail = undefined\n }\n }\n\n const commitFullCheckpoint = (record: RevisionRecord) => {\n state.committedSnapshot = record.snapshot\n state.committedRevision = record.revision\n state.failedRevision = undefined\n state.needsFullSnapshot = false\n removePrefixThrough(record)\n drainSucceededPrefix()\n }\n\n const handleLateSettlement = (\n record: RevisionRecord,\n settlement: SetDataAdapterSettlement,\n cause: unknown,\n ) => {\n if (settlement === 'failed') {\n reportFailure('adapter', record, cause)\n return\n }\n if (settlement === 'committed' && state.committedRevision > record.revision) {\n if (head) {\n invalidateLedger()\n }\n armRecovery()\n reportFailure(\n 'out-of-order',\n record,\n `revision ${record.revision} completed after committed revision ${state.committedRevision}`,\n )\n }\n }\n\n const settleRecord = (\n record: RevisionRecord,\n settlement: SetDataAdapterSettlement,\n cause?: unknown,\n ) => {\n if (state.disposed || record.physicalSettled) {\n return\n }\n record.physicalSettled = true\n\n if (!record.inLedger || record.epoch !== epoch) {\n handleLateSettlement(record, settlement, cause)\n return\n }\n\n if (settlement === 'abandoned') {\n record.status = 'abandoned'\n armRecovery()\n invalidateLedger()\n return\n }\n if (settlement === 'failed') {\n failLineage('adapter', record, cause)\n return\n }\n\n record.status = 'succeeded'\n if (highestCompletedRevision > record.revision) {\n failLineage(\n 'out-of-order',\n record,\n `revision ${record.revision} completed after revision ${highestCompletedRevision}`,\n )\n return\n }\n highestCompletedRevision = record.revision\n\n if (record.kind === 'full') {\n commitFullCheckpoint(record)\n return\n }\n drainSucceededPrefix()\n }\n\n const createFullPayload = (snapshot: SetDataSnapshot): SetDataPayload => {\n const payload: SetDataPayload = {}\n const snapshotKeys = new Set(Object.keys(snapshot))\n for (const [key, value] of Object.entries(snapshot)) {\n payload[key] = value === undefined ? null : value\n }\n for (const key of knownHostTopKeys) {\n if (!snapshotKeys.has(key)) {\n payload[key] = null\n }\n }\n return payload\n }\n\n const dispatch = (update: PreparedSetDataUpdate) => {\n if (state.disposed) {\n return state.revision\n }\n\n const revision = state.revision + 1\n state.revision = revision\n state.preparedSnapshot = update.snapshot\n const record: RevisionRecord = {\n revision,\n epoch,\n mode: update.mode,\n kind: update.kind,\n snapshot: update.snapshot,\n payloadKeys: Object.keys(update.payload).length,\n pendingPatchKeys: update.pendingPatchKeys,\n status: 'dispatched',\n physicalSettled: false,\n inLedger: true,\n next: undefined,\n }\n if (tail) {\n tail.next = record\n }\n else {\n head = record\n }\n tail = record\n state.dispatchedSnapshot = update.snapshot\n for (const key of Object.keys(update.payload)) {\n knownHostTopKeys.add(key.split('.', 1)[0]!)\n }\n\n const settle: SetDataAdapterSettler = (settlement, cause) => {\n settleRecord(record, settlement, cause)\n }\n // 宿主会保留对象并在后续路径更新时原地修改,载荷不能与序列化缓存及快照共享引用。\n const hostPayload = cloneSnapshotValue(update.payload)\n if (typeof options.adapter.__wevu_dispatchSetData === 'function') {\n try {\n options.adapter.__wevu_dispatchSetData(hostPayload, settle)\n }\n catch (cause) {\n settle('failed', cause)\n }\n }\n else {\n observeSetDataCompletion({\n invoke: () => options.adapter.setData?.(hostPayload),\n completion: 'return',\n settle,\n })\n }\n return revision\n }\n\n const dispose = () => {\n if (state.disposed) {\n return\n }\n state.disposed = true\n invalidateLedger()\n }\n\n return {\n state,\n dispatch,\n createFullPayload,\n dispose,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"commitTracker.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/commitTracker.ts"],"sourcesContent":["import type { MiniProgramAdapter, SetDataDebugInfo } from '../../types'\nimport type { PhysicalSetDataObserver, SetDataRevisionObservation } from './observation'\nimport { observePhysicalDispatch } from './observation'\nimport { cloneSnapshotValue } from './snapshot'\n\nexport type SetDataSnapshot = Record<string, unknown>\nexport type SetDataPayload = Record<string, unknown>\nexport type SetDataMode = 'diff' | 'patch'\nexport type SetDataRevisionKind = 'delta' | 'full'\nexport type SetDataAdapterSettlement = 'committed' | 'failed' | 'abandoned'\n\nexport type SetDataAdapterSettler = (\n settlement: SetDataAdapterSettlement,\n cause?: unknown,\n) => void\n\nexport interface CommitAwareSetDataAdapter extends MiniProgramAdapter {\n __wevu_dispatchSetData?: (\n payload: SetDataPayload,\n settle: SetDataAdapterSettler,\n observer?: PhysicalSetDataObserver,\n ) => void\n __wevu_reportSetDataError?: (error: Error) => void\n __wevu_disposeSetData?: () => void\n}\n\nexport interface PreparedSetDataUpdate {\n mode: SetDataMode\n kind: SetDataRevisionKind\n reason: SetDataDebugInfo['reason']\n snapshot: SetDataSnapshot\n payload: SetDataPayload\n pendingPatchKeys: number\n}\n\nexport interface SetDataCommitFailure {\n kind: 'adapter' | 'out-of-order'\n revision: number\n committedRevision: number\n mode: SetDataMode\n cause: unknown\n error: Error\n payloadKeys: number\n pendingPatchKeys: number\n}\n\nexport interface SetDataCommitState {\n preparedSnapshot: SetDataSnapshot\n dispatchedSnapshot: SetDataSnapshot\n committedSnapshot: SetDataSnapshot\n revision: number\n committedRevision: number\n failedRevision: number | undefined\n needsFullSnapshot: boolean\n commitPromise: Promise<void>\n disposed: boolean\n}\n\nexport interface SetDataCommitTracker {\n readonly state: SetDataCommitState\n dispatch: (update: PreparedSetDataUpdate) => number\n createFullPayload: (snapshot: SetDataSnapshot) => SetDataPayload\n dispose: () => void\n}\n\ntype RevisionStatus = 'dispatched' | 'succeeded' | 'failed' | 'abandoned'\n\ninterface RevisionRecord {\n revision: number\n epoch: number\n mode: SetDataMode\n kind: SetDataRevisionKind\n snapshot: SetDataSnapshot\n payloadKeys: number\n pendingPatchKeys: number\n status: RevisionStatus\n physicalSettled: boolean\n inLedger: boolean\n next: RevisionRecord | undefined\n commitPromise?: Promise<void>\n observation?: SetDataRevisionObservation\n resolveCommit?: () => void\n}\n\nconst resolvedCommitPromise = Promise.resolve()\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return Boolean(\n value\n && (typeof value === 'object' || typeof value === 'function')\n && typeof (value as PromiseLike<unknown>).then === 'function',\n )\n}\n\nfunction formatCommitFailureCause(cause: unknown): string {\n try {\n return cause instanceof Error ? cause.message : String(cause)\n }\n catch {\n return '<unprintable cause>'\n }\n}\n\nfunction createCommitError(\n kind: SetDataCommitFailure['kind'],\n record: RevisionRecord,\n cause: unknown,\n) {\n const causeMessage = formatCommitFailureCause(cause)\n const label = kind === 'adapter' ? 'adapter failure' : 'out-of-order completion'\n const error = new Error(\n `[wevu] setData commit failed (${label}, revision=${record.revision}, mode=${record.mode}, kind=${record.kind}): ${causeMessage}`,\n )\n ;(error as Error & { cause?: unknown }).cause = cause\n return error\n}\n\nexport function observeSetDataCompletion(options: {\n invoke: (callback: () => void) => unknown\n completion: 'return' | 'callback'\n settle: SetDataAdapterSettler\n observer?: PhysicalSetDataObserver\n payload?: SetDataPayload\n}): void {\n let settled = false\n let invoking = true\n let callbackCalled = false\n let observedReturn = false\n let returnIsAuthoritative = false\n let boundary: Parameters<PhysicalSetDataObserver['complete']>[0] = options.completion\n const settleOnce: SetDataAdapterSettler = (settlement, cause) => {\n if (settled) {\n return\n }\n settled = true\n options.observer?.complete(boundary)\n options.settle(settlement, cause)\n }\n const callback = () => {\n if (invoking) {\n callbackCalled = true\n return\n }\n if (returnIsAuthoritative) {\n return\n }\n if (options.completion === 'callback') {\n settleOnce('committed')\n }\n }\n\n try {\n if (options.observer && options.payload) {\n observePhysicalDispatch(options.observer, options.payload)\n }\n const result = options.invoke(callback)\n const resultIsThenable = isThenable(result)\n returnIsAuthoritative = resultIsThenable\n invoking = false\n if (options.observer && !observedReturn) {\n observedReturn = true\n options.observer.returned(Date.now())\n }\n if (resultIsThenable) {\n boundary = 'promise'\n result.then(\n () => settleOnce('committed'),\n cause => settleOnce('failed', cause),\n )\n return\n }\n if (options.completion === 'return' || callbackCalled) {\n settleOnce('committed')\n }\n }\n catch (cause) {\n boundary = 'throw'\n invoking = false\n if (options.observer && !observedReturn) {\n observedReturn = true\n options.observer.returned(Date.now())\n }\n settleOnce('failed', cause)\n }\n}\n\nexport function createSetDataCommitTracker(options: {\n initialSnapshot?: SetDataSnapshot\n adapter: CommitAwareSetDataAdapter\n onFailure: (failure: SetDataCommitFailure) => void\n observe?: (update: PreparedSetDataUpdate, revision: number) => SetDataRevisionObservation | undefined\n}): SetDataCommitTracker {\n const initialSnapshot = options.initialSnapshot ? cloneSnapshotValue(options.initialSnapshot) : {}\n const knownHostTopKeys = new Set(Object.keys(initialSnapshot))\n let epoch = 0\n let highestCompletedRevision = 0\n let head: RevisionRecord | undefined\n let tail: RevisionRecord | undefined\n\n function ensureCommitBarrier(record: RevisionRecord) {\n if (!record.inLedger) {\n return resolvedCommitPromise\n }\n if (!record.commitPromise) {\n record.commitPromise = new Promise<void>((resolve) => {\n record.resolveCommit = resolve\n })\n }\n return record.commitPromise\n }\n\n const state: SetDataCommitState = {\n preparedSnapshot: initialSnapshot,\n dispatchedSnapshot: initialSnapshot,\n committedSnapshot: initialSnapshot,\n revision: 0,\n committedRevision: 0,\n failedRevision: undefined,\n needsFullSnapshot: false,\n get commitPromise() {\n return tail ? ensureCommitBarrier(tail) : resolvedCommitPromise\n },\n disposed: false,\n }\n\n const reportFailure = (\n kind: SetDataCommitFailure['kind'],\n record: RevisionRecord,\n cause: unknown,\n ) => {\n const error = createCommitError(kind, record, cause)\n try {\n options.onFailure({\n kind,\n revision: record.revision,\n committedRevision: state.committedRevision,\n mode: record.mode,\n cause,\n error,\n payloadKeys: record.payloadKeys,\n pendingPatchKeys: record.pendingPatchKeys,\n })\n }\n catch {\n // 错误上报不得反向破坏提交状态机。\n }\n }\n\n const resolveRecord = (record: RevisionRecord) => {\n record.resolveCommit?.()\n record.resolveCommit = undefined\n }\n\n const removePrefixThrough = (last: RevisionRecord) => {\n let current = head\n while (current) {\n const next = current.next\n current.inLedger = false\n current.next = undefined\n resolveRecord(current)\n if (current === last) {\n head = next\n if (!head) {\n tail = undefined\n }\n return\n }\n current = next\n }\n }\n\n const invalidateLedger = () => {\n let abandonedObservations: SetDataRevisionObservation[] | undefined\n const result = state.disposed ? 'disposed' : 'abandoned'\n let current = head\n while (current) {\n const next = current.next\n current.inLedger = false\n current.next = undefined\n if (!current.physicalSettled) {\n current.status = 'abandoned'\n if (current.observation) {\n (abandonedObservations ??= []).push(current.observation)\n }\n }\n resolveRecord(current)\n current = next\n }\n head = undefined\n tail = undefined\n epoch += 1\n highestCompletedRevision = state.committedRevision\n // 先清空旧账本,再交付诊断,避免回调重入时误删新 revision。\n abandonedObservations?.forEach(observation => observation.finish(result))\n }\n\n const armRecovery = () => {\n state.needsFullSnapshot = true\n }\n\n const failLineage = (\n kind: SetDataCommitFailure['kind'],\n record: RevisionRecord,\n cause: unknown,\n ) => {\n record.status = 'failed'\n state.failedRevision = record.revision\n armRecovery()\n invalidateLedger()\n reportFailure(kind, record, cause)\n }\n\n const drainSucceededPrefix = () => {\n while (head?.status === 'succeeded') {\n const record = head\n state.committedSnapshot = record.snapshot\n state.committedRevision = record.revision\n head = record.next\n record.inLedger = false\n record.next = undefined\n resolveRecord(record)\n }\n if (!head) {\n tail = undefined\n }\n }\n\n const commitFullCheckpoint = (record: RevisionRecord) => {\n state.committedSnapshot = record.snapshot\n state.committedRevision = record.revision\n state.failedRevision = undefined\n state.needsFullSnapshot = false\n removePrefixThrough(record)\n drainSucceededPrefix()\n }\n\n const handleLateSettlement = (\n record: RevisionRecord,\n settlement: SetDataAdapterSettlement,\n cause: unknown,\n ) => {\n if (settlement === 'failed') {\n reportFailure('adapter', record, cause)\n return\n }\n if (settlement === 'committed' && state.committedRevision > record.revision) {\n if (head) {\n invalidateLedger()\n }\n armRecovery()\n reportFailure(\n 'out-of-order',\n record,\n `revision ${record.revision} completed after committed revision ${state.committedRevision}`,\n )\n }\n }\n\n const applySettlement = (\n record: RevisionRecord,\n settlement: SetDataAdapterSettlement,\n cause?: unknown,\n ) => {\n if (state.disposed || record.physicalSettled) {\n return\n }\n record.physicalSettled = true\n\n if (!record.inLedger || record.epoch !== epoch) {\n handleLateSettlement(record, settlement, cause)\n return\n }\n\n if (settlement === 'abandoned') {\n record.status = 'abandoned'\n armRecovery()\n invalidateLedger()\n return\n }\n if (settlement === 'failed') {\n failLineage('adapter', record, cause)\n return\n }\n\n record.status = 'succeeded'\n if (highestCompletedRevision > record.revision) {\n failLineage(\n 'out-of-order',\n record,\n `revision ${record.revision} completed after revision ${highestCompletedRevision}`,\n )\n return\n }\n highestCompletedRevision = record.revision\n\n if (record.kind === 'full') {\n commitFullCheckpoint(record)\n return\n }\n drainSucceededPrefix()\n }\n\n const settleRecord = (record: RevisionRecord, settlement: SetDataAdapterSettlement, cause?: unknown) => {\n if (state.disposed || record.physicalSettled) {\n return\n }\n if (!record.observation) {\n applySettlement(record, settlement, cause)\n return\n }\n const late = !record.inLedger || record.epoch !== epoch\n const outOfOrder = settlement === 'committed' && (late\n ? state.committedRevision > record.revision\n : highestCompletedRevision > record.revision)\n applySettlement(record, settlement, cause)\n record.observation?.finish(outOfOrder\n ? 'out-of-order'\n : late\n ? settlement === 'failed' ? 'late-failed' : settlement === 'committed' ? 'late-committed' : 'abandoned'\n : settlement)\n }\n\n const createFullPayload = (snapshot: SetDataSnapshot): SetDataPayload => {\n const payload: SetDataPayload = {}\n const snapshotKeys = new Set(Object.keys(snapshot))\n for (const [key, value] of Object.entries(snapshot)) {\n payload[key] = value === undefined ? null : value\n }\n for (const key of knownHostTopKeys) {\n if (!snapshotKeys.has(key)) {\n payload[key] = null\n }\n }\n return payload\n }\n\n const dispatch = (update: PreparedSetDataUpdate) => {\n if (state.disposed) {\n return state.revision\n }\n\n const revision = state.revision + 1\n state.revision = revision\n state.preparedSnapshot = update.snapshot\n const record: RevisionRecord = {\n revision,\n epoch,\n mode: update.mode,\n kind: update.kind,\n snapshot: update.snapshot,\n payloadKeys: Object.keys(update.payload).length,\n pendingPatchKeys: update.pendingPatchKeys,\n status: 'dispatched',\n physicalSettled: false,\n inLedger: true,\n next: undefined,\n }\n if (tail) {\n tail.next = record\n }\n else {\n head = record\n }\n tail = record\n state.dispatchedSnapshot = update.snapshot\n for (const key of Object.keys(update.payload)) {\n knownHostTopKeys.add(key.split('.', 1)[0]!)\n }\n\n record.observation = options.observe?.(update, revision)\n const settle: SetDataAdapterSettler = (settlement, cause) => {\n settleRecord(record, settlement, cause)\n }\n // 宿主会保留对象并在后续路径更新时原地修改,载荷不能与序列化缓存及快照共享引用。\n const hostPayload = cloneSnapshotValue(update.payload)\n if (typeof options.adapter.__wevu_dispatchSetData === 'function') {\n try {\n options.adapter.__wevu_dispatchSetData(hostPayload, settle, record.observation?.physical)\n }\n catch (cause) {\n settle('failed', cause)\n }\n }\n else {\n observeSetDataCompletion({\n invoke: () => options.adapter.setData?.(hostPayload),\n completion: 'return',\n settle,\n payload: hostPayload,\n observer: options.adapter.setData ? record.observation?.physical : undefined,\n })\n }\n return revision\n }\n\n const dispose = () => {\n if (state.disposed) {\n return\n }\n state.disposed = true\n invalidateLedger()\n }\n\n return {\n state,\n dispatch,\n createFullPayload,\n dispose,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ //#region src/runtime/app/setData/observation.ts
2
+ let nextObserverId = 0;
3
+ let nextDispatchId = 0;
4
+ function duration(start, end) {
5
+ return start !== null && end >= start ? end - start : null;
6
+ }
7
+ function payloadBytes(payload) {
8
+ try {
9
+ const json = JSON.stringify(payload);
10
+ let bytes = 0;
11
+ for (let index = 0; index < json.length; index++) {
12
+ const code = json.charCodeAt(index);
13
+ if (code < 128) bytes += 1;
14
+ else if (code < 2048) bytes += 2;
15
+ else if (code >= 55296 && code <= 56319 && json.charCodeAt(index + 1) >= 56320 && json.charCodeAt(index + 1) <= 57343) {
16
+ bytes += 4;
17
+ index += 1;
18
+ } else bytes += 3;
19
+ }
20
+ return bytes;
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function observePhysicalDispatch(observer, payload) {
26
+ const bytes = payloadBytes(payload);
27
+ observer.dispatch({
28
+ id: ++nextDispatchId,
29
+ startedAt: Date.now(),
30
+ payloadBytes: bytes,
31
+ returnedAt: null,
32
+ durationMs: null
33
+ });
34
+ }
35
+ function createSetDataObservation(options) {
36
+ const observerId = ++nextObserverId;
37
+ let prepareStartedAt = null;
38
+ return {
39
+ prepare() {
40
+ prepareStartedAt = Date.now();
41
+ },
42
+ revision(update, revision) {
43
+ const startedAt = prepareStartedAt;
44
+ prepareStartedAt = null;
45
+ if (options.debugWhen === "fallback" && (update.reason === "patch" || update.reason === "diff")) return;
46
+ if (options.debugSampleRate <= 0 || options.debugSampleRate < 1 && Math.random() >= options.debugSampleRate) return;
47
+ const preparedAt = Date.now();
48
+ let dispatch = null;
49
+ let completion = "unknown";
50
+ const base = {
51
+ mode: update.mode,
52
+ reason: update.reason,
53
+ pendingPatchKeys: update.pendingPatchKeys,
54
+ payloadKeys: Object.keys(update.payload).length,
55
+ revision,
56
+ targetLabel: options.targetLabel
57
+ };
58
+ const emit = (name, result, settledAt = null) => {
59
+ try {
60
+ options.debug({
61
+ ...base,
62
+ committedRevision: options.committedRevision(),
63
+ phase: {
64
+ version: 1,
65
+ observerId,
66
+ name,
67
+ result,
68
+ completion,
69
+ prepareStartedAt: startedAt,
70
+ preparedAt,
71
+ prepareDurationMs: duration(startedAt, preparedAt),
72
+ settledAt,
73
+ commitDurationMs: settledAt === null ? null : duration(dispatch?.startedAt ?? null, settledAt),
74
+ visibleAt: null,
75
+ dispatch: dispatch ? { ...dispatch } : null
76
+ }
77
+ });
78
+ } catch {}
79
+ };
80
+ emit("prepare", "prepared");
81
+ return {
82
+ physical: {
83
+ dispatch(info) {
84
+ dispatch = info;
85
+ },
86
+ returned(returnedAt) {
87
+ if (!dispatch) return;
88
+ dispatch = {
89
+ ...dispatch,
90
+ returnedAt,
91
+ durationMs: duration(dispatch.startedAt, returnedAt)
92
+ };
93
+ emit("dispatch", "pending");
94
+ },
95
+ complete(boundary) {
96
+ if (dispatch || boundary === "throw") completion = boundary;
97
+ }
98
+ },
99
+ finish(result) {
100
+ emit("commit", result, Date.now());
101
+ }
102
+ };
103
+ }
104
+ };
105
+ }
106
+
107
+ //#endregion
108
+ export { createSetDataObservation, observePhysicalDispatch };
109
+ //# sourceMappingURL=observation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/observation.ts"],"sourcesContent":["import type { SetDataDebugInfo } from '../../types'\nimport type { PreparedSetDataUpdate } from './commitTracker'\n\ntype Phase = NonNullable<SetDataDebugInfo['phase']>\nexport type SetDataCompletionBoundary = Phase['completion']\n\nexport interface PhysicalSetDataObserver {\n dispatch: (dispatch: NonNullable<Phase['dispatch']>) => void\n returned: (returnedAt: number) => void\n complete: (boundary: SetDataCompletionBoundary) => void\n}\n\nexport interface SetDataRevisionObservation {\n physical: PhysicalSetDataObserver\n finish: (result: Phase['result']) => void\n}\n\nlet nextObserverId = 0\nlet nextDispatchId = 0\n\nfunction duration(start: number | null, end: number): number | null {\n return start !== null && end >= start ? end - start : null\n}\n\nfunction payloadBytes(payload: Record<string, unknown>): number | null {\n try {\n const json = JSON.stringify(payload)\n let bytes = 0\n for (let index = 0; index < json.length; index++) {\n const code = json.charCodeAt(index)\n if (code < 0x80) {\n bytes += 1\n }\n else if (code < 0x800) {\n bytes += 2\n }\n else if (code >= 0xD800 && code <= 0xDBFF && json.charCodeAt(index + 1) >= 0xDC00 && json.charCodeAt(index + 1) <= 0xDFFF) {\n bytes += 4\n index += 1\n }\n else {\n bytes += 3\n }\n }\n return bytes\n }\n catch {\n return null\n }\n}\n\nexport function observePhysicalDispatch(observer: PhysicalSetDataObserver, payload: Record<string, unknown>) {\n // 只在观测启用时序列化;耗时从字节测量之后开始,避免将测量成本计入宿主提交。\n const bytes = payloadBytes(payload)\n observer.dispatch({ id: ++nextDispatchId, startedAt: Date.now(), payloadBytes: bytes, returnedAt: null, durationMs: null })\n}\n\nexport function createSetDataObservation(options: {\n debug: (info: SetDataDebugInfo) => void\n debugWhen: 'fallback' | 'always'\n debugSampleRate: number\n targetLabel?: string\n committedRevision: () => number\n}) {\n const observerId = ++nextObserverId\n let prepareStartedAt: number | null = null\n return {\n prepare() {\n prepareStartedAt = Date.now()\n },\n revision(update: PreparedSetDataUpdate, revision: number): SetDataRevisionObservation | undefined {\n const startedAt = prepareStartedAt\n prepareStartedAt = null\n if (options.debugWhen === 'fallback' && (update.reason === 'patch' || update.reason === 'diff')) {\n return\n }\n if (options.debugSampleRate <= 0 || (options.debugSampleRate < 1 && Math.random() >= options.debugSampleRate)) {\n return\n }\n const preparedAt = Date.now()\n let dispatch: Phase['dispatch'] = null\n let completion: SetDataCompletionBoundary = 'unknown'\n const base = {\n mode: update.mode,\n reason: update.reason,\n pendingPatchKeys: update.pendingPatchKeys,\n payloadKeys: Object.keys(update.payload).length,\n revision,\n targetLabel: options.targetLabel,\n }\n const emit = (name: Phase['name'], result: Phase['result'], settledAt: number | null = null) => {\n try {\n options.debug({\n ...base,\n committedRevision: options.committedRevision(),\n phase: {\n version: 1,\n observerId,\n name,\n result,\n completion,\n prepareStartedAt: startedAt,\n preparedAt,\n prepareDurationMs: duration(startedAt, preparedAt),\n settledAt,\n commitDurationMs: settledAt === null ? null : duration(dispatch?.startedAt ?? null, settledAt),\n visibleAt: null,\n dispatch: dispatch ? { ...dispatch } : null,\n },\n })\n }\n catch {\n // 消费者诊断异常不能影响调度或宿主提交。\n }\n }\n emit('prepare', 'prepared')\n return {\n physical: {\n dispatch(info) {\n dispatch = info\n },\n returned(returnedAt) {\n if (!dispatch) {\n return\n }\n dispatch = { ...dispatch, returnedAt, durationMs: duration(dispatch.startedAt, returnedAt) }\n emit('dispatch', 'pending')\n },\n complete(boundary) {\n if (dispatch || boundary === 'throw') {\n completion = boundary\n }\n },\n },\n finish(result) { emit('commit', result, Date.now()) },\n }\n },\n }\n}\n"],"mappings":";AAiBA,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AAErB,SAAS,SAAS,OAAsB,KAA4B;CAClE,OAAO,UAAU,QAAQ,OAAO,QAAQ,MAAM,QAAQ;AACxD;AAEA,SAAS,aAAa,SAAiD;CACrE,IAAI;EACF,MAAM,OAAO,KAAK,UAAU,OAAO;EACnC,IAAI,QAAQ;EACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;GAChD,MAAM,OAAO,KAAK,WAAW,KAAK;GAClC,IAAI,OAAO,KACT,SAAS;QAEN,IAAI,OAAO,MACd,SAAS;QAEN,IAAI,QAAQ,SAAU,QAAQ,SAAU,KAAK,WAAW,QAAQ,CAAC,KAAK,SAAU,KAAK,WAAW,QAAQ,CAAC,KAAK,OAAQ;IACzH,SAAS;IACT,SAAS;GACX,OAEE,SAAS;EAEb;EACA,OAAO;CACT,QACM;EACJ,OAAO;CACT;AACF;AAEA,SAAgB,wBAAwB,UAAmC,SAAkC;CAE3G,MAAM,QAAQ,aAAa,OAAO;CAClC,SAAS,SAAS;EAAE,IAAI,EAAE;EAAgB,WAAW,KAAK,IAAI;EAAG,cAAc;EAAO,YAAY;EAAM,YAAY;CAAK,CAAC;AAC5H;AAEA,SAAgB,yBAAyB,SAMtC;CACD,MAAM,aAAa,EAAE;CACrB,IAAI,mBAAkC;CACtC,OAAO;EACL,UAAU;GACR,mBAAmB,KAAK,IAAI;EAC9B;EACA,SAAS,QAA+B,UAA0D;GAChG,MAAM,YAAY;GAClB,mBAAmB;GACnB,IAAI,QAAQ,cAAc,eAAe,OAAO,WAAW,WAAW,OAAO,WAAW,SACtF;GAEF,IAAI,QAAQ,mBAAmB,KAAM,QAAQ,kBAAkB,KAAK,KAAK,OAAO,KAAK,QAAQ,iBAC3F;GAEF,MAAM,aAAa,KAAK,IAAI;GAC5B,IAAI,WAA8B;GAClC,IAAI,aAAwC;GAC5C,MAAM,OAAO;IACX,MAAM,OAAO;IACb,QAAQ,OAAO;IACf,kBAAkB,OAAO;IACzB,aAAa,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC;IACzC;IACA,aAAa,QAAQ;GACvB;GACA,MAAM,QAAQ,MAAqB,QAAyB,YAA2B,SAAS;IAC9F,IAAI;KACF,QAAQ,MAAM;MACZ,GAAG;MACH,mBAAmB,QAAQ,kBAAkB;MAC7C,OAAO;OACL,SAAS;OACT;OACA;OACA;OACA;OACA,kBAAkB;OAClB;OACA,mBAAmB,SAAS,WAAW,UAAU;OACjD;OACA,kBAAkB,cAAc,OAAO,OAAO,SAAS,UAAU,aAAa,MAAM,SAAS;OAC7F,WAAW;OACX,UAAU,WAAW,EAAE,GAAG,SAAS,IAAI;MACzC;KACF,CAAC;IACH,QACM,CAEN;GACF;GACA,KAAK,WAAW,UAAU;GAC1B,OAAO;IACL,UAAU;KACR,SAAS,MAAM;MACb,WAAW;KACb;KACA,SAAS,YAAY;MACnB,IAAI,CAAC,UACH;MAEF,WAAW;OAAE,GAAG;OAAU;OAAY,YAAY,SAAS,SAAS,WAAW,UAAU;MAAE;MAC3F,KAAK,YAAY,SAAS;KAC5B;KACA,SAAS,UAAU;MACjB,IAAI,YAAY,aAAa,SAC3B,aAAa;KAEjB;IACF;IACA,OAAO,QAAQ;KAAE,KAAK,UAAU,QAAQ,KAAK,IAAI,CAAC;IAAE;GACtD;EACF;CACF;AACF"}
@@ -5,6 +5,7 @@ import { hasOwn } from "../../../utils.mjs";
5
5
  import { hasTrackableSetupBinding } from "../../setupTracking.mjs";
6
6
  import { resolveBindingDiagnostics } from "../../bindingManifest.mjs";
7
7
  import { diffSnapshots, toPlain } from "../../diff.mjs";
8
+ import { createSetDataObservation } from "./observation.mjs";
8
9
  import { collectSnapshot } from "./snapshot.mjs";
9
10
  import { createSetDataCommitTracker } from "./commitTracker.mjs";
10
11
 
@@ -113,7 +114,16 @@ function createSetDataScheduler(options) {
113
114
  debug(debugInfo);
114
115
  } catch {}
115
116
  };
116
- const commitTracker = createSetDataCommitTracker({
117
+ let commitTracker;
118
+ const observation = options.debugPhases && debug ? createSetDataObservation({
119
+ debug,
120
+ debugWhen,
121
+ debugSampleRate,
122
+ targetLabel,
123
+ committedRevision: () => commitTracker.state.committedRevision
124
+ }) : void 0;
125
+ commitTracker = createSetDataCommitTracker({
126
+ observe: observation?.revision,
117
127
  initialSnapshot: initialSnapshotBaseline,
118
128
  adapter: currentAdapter,
119
129
  onFailure: (failure) => {
@@ -264,6 +274,7 @@ function createSetDataScheduler(options) {
264
274
  };
265
275
  const prepareJob = (pendingPatchKeys = 0, pathSource) => {
266
276
  if (!isMounted()) return false;
277
+ observation?.prepare();
267
278
  recordFlushForLoopWarning(pendingPatchKeys, pathSource);
268
279
  runTracker();
269
280
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/scheduler.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { SetDataScheduler } from '../../capabilities'\nimport type { SetDataDebugInfo } from '../../types'\nimport type { CommitAwareSetDataAdapter, PreparedSetDataUpdate, SetDataCommitFailure, SetDataSnapshot } from './commitTracker'\nimport { getReactiveVersion, isReactive, isRef, toRaw } from '../../../reactivity'\nimport { hasOwn } from '../../../utils'\nimport { resolveBindingDiagnostics } from '../../bindingManifest'\nimport { diffSnapshots, toPlain } from '../../diff'\nimport { hasTrackableSetupBinding } from '../../setupTracking'\nimport { createSetDataCommitTracker } from './commitTracker'\nimport { collectSnapshot } from './snapshot'\n\nexport interface SetDataSchedulerOptions {\n state: Record<string, any>\n setupState?: Record<string, any>\n snapshotOmitKeys?: Set<string>\n computedRefs: Record<string, { value: any }>\n dirtyComputedKeys: Set<string>\n includeComputed: boolean\n setDataStrategy: 'diff' | 'patch'\n computedCompare: 'reference' | 'shallow' | 'deep'\n computedCompareMaxDepth: number\n computedCompareMaxKeys: number\n currentAdapter: CommitAwareSetDataAdapter\n shouldIncludeKey: (key: string) => boolean\n maxPatchKeys: number\n maxPayloadBytes: number\n mergeSiblingThreshold: number\n mergeSiblingMaxInflationRatio: number\n mergeSiblingMaxParentBytes: number\n mergeSiblingSkipArray: boolean\n elevateTopKeyThreshold: number\n prelinkMaxDepth?: number\n prelinkMaxKeys?: number\n toPlainMaxDepth: number\n toPlainMaxKeys: number\n includeFunctions?: boolean\n functionPaths: string[]\n debug: ((info: SetDataDebugInfo) => void) | undefined\n debugWhen: 'fallback' | 'always'\n debugSampleRate: number\n bindingManifest?: WevuRuntimeBindingManifestV1\n loopWarning: false | {\n sampleWindowMs: number\n maxFlushes: number\n coolDownMs: number\n }\n targetLabel?: string\n runTracker: () => void\n isMounted: () => boolean\n initialSnapshot?: Record<string, any>\n initialState?: Record<string, any>\n}\n\nexport interface SetDataSchedulerInternals extends SetDataScheduler {\n collect: () => Record<string, unknown>\n dispatchUpdate: (update: PreparedSetDataUpdate) => number\n dispose: () => void\n emitDebug: (info: SetDataDebugInfo, pathSource?: Iterable<string> | (() => Iterable<string>)) => void\n getLatestSnapshot: () => Record<string, unknown>\n needsFullSnapshot: () => boolean\n plainCache: WeakMap<object, { version: number, value: unknown }>\n plainCacheEligibility: WeakMap<object, boolean>\n prepareJob: (pendingPatchKeys?: number, pathSource?: Iterable<string> | (() => Iterable<string>)) => boolean\n resolveTopKeysByRoot: (root: object) => string[]\n runDiffUpdate: (\n reason?: SetDataDebugInfo['reason'],\n pendingPatchKeys?: number,\n onSnapshotPrepared?: (snapshot: SetDataSnapshot) => void,\n ) => void\n shouldIncludeSnapshotKey: (key: string) => boolean\n}\n\nexport function createSetDataScheduler(options: SetDataSchedulerOptions): SetDataSchedulerInternals {\n const {\n state,\n setupState,\n snapshotOmitKeys,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n setDataStrategy,\n currentAdapter,\n shouldIncludeKey,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions = false,\n functionPaths,\n debug,\n debugWhen,\n debugSampleRate,\n bindingManifest,\n loopWarning,\n targetLabel,\n runTracker,\n isMounted,\n initialSnapshot,\n initialState,\n } = options\n\n const plainCache = new WeakMap<object, { version: number, value: any }>()\n const plainCacheEligibility = new WeakMap<object, boolean>()\n const initialSnapshotBaseline: SetDataSnapshot = {}\n const dispatchedStateTokens = Object.create(null) as Record<string, unknown>\n const dispatchedComputedTokens = Object.create(null) as Record<string, unknown>\n const flushTimes: number[] = []\n let lastLoopWarningAt = Number.NEGATIVE_INFINITY\n const initialStateKeys = new Set(\n initialState && typeof initialState === 'object'\n ? Object.keys(initialState)\n : [],\n )\n\n const isPlainObject = (value: unknown): value is Record<string, any> => {\n if (Object.prototype.toString.call(value) !== '[object Object]') {\n return false\n }\n const proto = Object.getPrototypeOf(value)\n return proto === null || proto === Object.prototype\n }\n\n const isDeepEqual = (left: any, right: any): boolean => {\n if (Object.is(left, right)) {\n return true\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) {\n return false\n }\n return left.every((item, index) => isDeepEqual(item, right[index]))\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Object.keys(left)\n const rightKeys = Object.keys(right)\n if (leftKeys.length !== rightKeys.length) {\n return false\n }\n return leftKeys.every(key => hasOwn(right, key) && isDeepEqual(left[key], right[key]))\n }\n return false\n }\n\n const createValueToken = (value: unknown) => {\n const candidate = isRef(value) ? value.value : value\n if (candidate == null || typeof candidate !== 'object') {\n return candidate\n }\n if (!isReactive(candidate) && hasTrackableSetupBinding(candidate)) {\n return {\n snapshot: toPlain(candidate, new WeakMap(), {\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n }),\n }\n }\n const raw = isReactive(candidate) ? toRaw(candidate as any) : candidate\n return {\n raw,\n version: getReactiveVersion(raw as any),\n }\n }\n\n const isSameToken = (left: unknown, right: unknown) => {\n if (Object.is(left, right)) {\n return true\n }\n if (\n !left\n || !right\n || typeof left !== 'object'\n || typeof right !== 'object'\n || !hasOwn(left as object, 'raw')\n || !hasOwn(right as object, 'raw')\n ) {\n if (\n left\n && right\n && typeof left === 'object'\n && typeof right === 'object'\n && hasOwn(left as object, 'snapshot')\n && hasOwn(right as object, 'snapshot')\n ) {\n return isDeepEqual((left as any).snapshot, (right as any).snapshot)\n }\n return false\n }\n return (left as any).raw === (right as any).raw && (left as any).version === (right as any).version\n }\n\n const shouldIncludeSnapshotKey = (key: string) => shouldIncludeKey(key) && !snapshotOmitKeys?.has(key)\n\n if (initialSnapshot) {\n for (const [key, value] of Object.entries(initialSnapshot)) {\n if (shouldIncludeSnapshotKey(key)) {\n initialSnapshotBaseline[key] = value\n }\n }\n }\n\n const syncInitialSnapshotTokens = () => {\n if (!initialSnapshot) {\n return\n }\n const rawState = (isReactive(state) ? toRaw(state as any) : state) as Record<string, any>\n const rawSetupState = setupState && typeof setupState === 'object'\n ? (isReactive(setupState) ? toRaw(setupState as any) : setupState)\n : undefined\n\n for (const key of Object.keys(initialSnapshot)) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n if (rawSetupState && hasOwn(rawSetupState, key)) {\n dispatchedStateTokens[key] = createValueToken(rawSetupState[key])\n continue\n }\n if (hasOwn(rawState, key)) {\n if (initialStateKeys.has(key)) {\n continue\n }\n rawState[key] = initialSnapshot[key]\n dispatchedStateTokens[key] = createValueToken(rawState[key])\n }\n }\n }\n\n const resolveTopKeysByRoot = (root: object) => {\n const matches: string[] = []\n const rawSetupState = setupState && typeof setupState === 'object'\n ? (isReactive(setupState) ? toRaw(setupState as any) : setupState)\n : undefined\n for (const key of new Set([...Object.keys(state), ...(rawSetupState ? Object.keys(rawSetupState) : [])])) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n const value = rawSetupState && hasOwn(rawSetupState, key) ? rawSetupState[key] : state[key]\n const candidate = isRef(value) ? value.value : value\n if (!candidate || typeof candidate !== 'object') {\n continue\n }\n if (toRaw(candidate as any) === root) {\n matches.push(key)\n }\n }\n return matches\n }\n\n const emitDebug = (\n info: SetDataDebugInfo,\n pathSource?: Iterable<string> | (() => Iterable<string>),\n ) => {\n if (!debug) {\n return\n }\n const isFallback = info.reason !== 'patch' && info.reason !== 'diff'\n if (debugWhen === 'fallback' && !isFallback) {\n return\n }\n if (info.reason !== 'commitFailure' && debugSampleRate < 1 && Math.random() > debugSampleRate) {\n return\n }\n let debugInfo = info\n if (bindingManifest) {\n const paths = typeof pathSource === 'function'\n ? pathSource()\n : pathSource ?? []\n const wholeSnapshotFallback = info.reason === 'needsFullSnapshot'\n || info.reason === 'maxPatchKeys'\n || info.reason === 'maxPayloadBytes'\n debugInfo = {\n ...info,\n bindings: resolveBindingDiagnostics(bindingManifest, paths, wholeSnapshotFallback),\n }\n }\n try {\n debug(debugInfo)\n }\n catch {\n // 忽略异常\n }\n }\n\n const commitTracker = createSetDataCommitTracker({\n initialSnapshot: initialSnapshotBaseline,\n adapter: currentAdapter,\n onFailure: (failure: SetDataCommitFailure) => {\n emitDebug({\n mode: failure.mode,\n reason: 'commitFailure',\n pendingPatchKeys: failure.pendingPatchKeys,\n payloadKeys: failure.payloadKeys,\n revision: failure.revision,\n committedRevision: failure.committedRevision,\n targetLabel,\n message: failure.error.message,\n })\n try {\n currentAdapter.__wevu_reportSetDataError?.(failure.error)\n }\n catch {\n // 宿主错误钩子不得反向破坏提交状态机。\n }\n },\n })\n\n const recordFlushForLoopWarning = (\n pendingPatchKeys = 0,\n pathSource?: Iterable<string> | (() => Iterable<string>),\n ) => {\n if (!loopWarning) {\n return\n }\n const current = Date.now()\n flushTimes.push(current)\n const windowStart = current - loopWarning.sampleWindowMs\n while (flushTimes.length && flushTimes[0] < windowStart) {\n flushTimes.shift()\n }\n if (flushTimes.length <= loopWarning.maxFlushes) {\n return\n }\n if (loopWarning.coolDownMs > 0 && current - lastLoopWarningAt < loopWarning.coolDownMs) {\n return\n }\n lastLoopWarningAt = current\n emitDebug({\n mode: setDataStrategy,\n reason: 'loopWarning',\n pendingPatchKeys,\n payloadKeys: 0,\n computedDirtyKeys: includeComputed ? dirtyComputedKeys.size : 0,\n flushCount: flushTimes.length,\n windowMs: loopWarning.sampleWindowMs,\n targetLabel,\n message: `${targetLabel ? `${targetLabel} ` : ''}疑似运行时更新循环:${flushTimes.length} 次 setData flush/${loopWarning.sampleWindowMs}ms`,\n }, pathSource)\n }\n\n const collect = () => collectSnapshot({\n state,\n setupState,\n computedRefs,\n includeComputed,\n shouldIncludeKey: shouldIncludeSnapshotKey,\n plainCache,\n plainCacheEligibility,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n })\n\n syncInitialSnapshotTokens()\n\n const collectDiffSnapshot = () => {\n const rawState = (isReactive(state) ? toRaw(state as any) : state) as Record<string, any>\n const rawSetupState = setupState && typeof setupState === 'object'\n ? (isReactive(setupState) ? toRaw(setupState as any) : setupState)\n : undefined\n const dispatchedSnapshot = commitTracker.state.dispatchedSnapshot\n const nextSnapshot: Record<string, any> = { ...dispatchedSnapshot }\n const seen = new WeakMap<object, any>()\n const includedStateKeys = new Set<string>()\n const includedComputedKeys = new Set<string>()\n const replacedTopLevelKeys = new Set<string>()\n\n for (const key of new Set([...Object.keys(rawState), ...(rawSetupState ? Object.keys(rawSetupState) : [])])) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n includedStateKeys.add(key)\n const source = rawSetupState && hasOwn(rawSetupState, key) ? rawSetupState : rawState\n const token = createValueToken(source[key])\n const previousToken = dispatchedStateTokens[key]\n if (\n previousToken\n && token\n && typeof previousToken === 'object'\n && typeof token === 'object'\n && hasOwn(previousToken as object, 'raw')\n && hasOwn(token as object, 'raw')\n && Array.isArray((previousToken as any).raw)\n && Array.isArray((token as any).raw)\n && (previousToken as any).raw !== (token as any).raw\n ) {\n replacedTopLevelKeys.add(key)\n }\n if (!isSameToken(previousToken, token) || !hasOwn(dispatchedSnapshot, key)) {\n nextSnapshot[key] = toPlain(source[key], seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n }\n dispatchedStateTokens[key] = token\n }\n\n for (const key of Object.keys(dispatchedStateTokens)) {\n if (!includedStateKeys.has(key)) {\n delete dispatchedStateTokens[key]\n if (!includeComputed || !hasOwn(computedRefs, key)) {\n delete nextSnapshot[key]\n }\n }\n }\n\n if (!includeComputed) {\n for (const key of Object.keys(dispatchedComputedTokens)) {\n delete dispatchedComputedTokens[key]\n }\n return {\n snapshot: nextSnapshot,\n replacedTopLevelKeys,\n }\n }\n\n for (const key of Object.keys(computedRefs)) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n includedComputedKeys.add(key)\n const value = computedRefs[key].value\n const token = createValueToken(value)\n if (!isSameToken(dispatchedComputedTokens[key], token) || !hasOwn(dispatchedSnapshot, key)) {\n nextSnapshot[key] = toPlain(value, seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n }\n dispatchedComputedTokens[key] = token\n }\n\n for (const key of Object.keys(dispatchedComputedTokens)) {\n if (!includedComputedKeys.has(key)) {\n delete dispatchedComputedTokens[key]\n if (!hasOwn(rawState, key) || !shouldIncludeSnapshotKey(key)) {\n delete nextSnapshot[key]\n }\n }\n }\n\n return {\n snapshot: nextSnapshot,\n replacedTopLevelKeys,\n }\n }\n\n const runDiffUpdate = (\n reason: SetDataDebugInfo['reason'] = 'diff',\n pendingPatchKeys = 0,\n onSnapshotPrepared?: (snapshot: SetDataSnapshot) => void,\n ): void => {\n const diffCollection = setDataStrategy === 'diff' ? collectDiffSnapshot() : undefined\n const snapshot = diffCollection?.snapshot ?? collect()\n const dispatchedSnapshot = commitTracker.state.dispatchedSnapshot\n const needsRecovery = commitTracker.state.needsFullSnapshot\n const payload = needsRecovery\n ? commitTracker.createFullPayload(snapshot)\n : diffCollection\n ? (() => {\n const fastDiff: Record<string, any> = {}\n for (const key of diffCollection.replacedTopLevelKeys) {\n fastDiff[key] = snapshot[key]\n }\n const baseDiff = diffSnapshots(dispatchedSnapshot, snapshot, {\n skipKeys: diffCollection.replacedTopLevelKeys,\n })\n return {\n ...baseDiff,\n ...fastDiff,\n }\n })()\n : diffSnapshots(dispatchedSnapshot, snapshot)\n onSnapshotPrepared?.(snapshot)\n const payloadKeys = Object.keys(payload).length\n if (!payloadKeys && !needsRecovery) {\n return\n }\n const effectiveReason = needsRecovery ? 'needsFullSnapshot' : reason\n emitDebug({\n mode: 'diff',\n reason: effectiveReason,\n pendingPatchKeys,\n payloadKeys,\n }, Object.keys(payload))\n commitTracker.dispatch({\n mode: 'diff',\n kind: needsRecovery ? 'full' : 'delta',\n reason: effectiveReason,\n snapshot,\n payload,\n pendingPatchKeys,\n })\n }\n\n const prepareJob = (\n pendingPatchKeys = 0,\n pathSource?: Iterable<string> | (() => Iterable<string>),\n ) => {\n if (!isMounted()) {\n return false\n }\n recordFlushForLoopWarning(pendingPatchKeys, pathSource)\n // 生成快照前刷新依赖(setup 中的 ref / 新增 key)\n runTracker()\n return true\n }\n\n const job = (_stateRootRaw?: object) => {\n if (!prepareJob()) {\n return\n }\n return runDiffUpdate('diff')\n }\n\n const snapshot = () => (\n setDataStrategy === 'patch'\n ? collect()\n : { ...commitTracker.state.dispatchedSnapshot }\n )\n const cloneLatestSnapshot = () => ({ ...commitTracker.state.dispatchedSnapshot })\n\n return {\n collect,\n emitDebug,\n getLatestSnapshot: () => commitTracker.state.dispatchedSnapshot,\n dispatchUpdate: commitTracker.dispatch,\n needsFullSnapshot: () => commitTracker.state.needsFullSnapshot,\n job,\n plainCache,\n plainCacheEligibility,\n prepareJob,\n resolveTopKeysByRoot,\n runDiffUpdate,\n shouldIncludeSnapshotKey,\n snapshot,\n cloneLatestSnapshot,\n dispose: commitTracker.dispose,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"scheduler.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/scheduler.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { SetDataScheduler } from '../../capabilities'\nimport type { SetDataDebugInfo } from '../../types'\nimport type { CommitAwareSetDataAdapter, PreparedSetDataUpdate, SetDataCommitFailure, SetDataCommitTracker, SetDataSnapshot } from './commitTracker'\nimport { getReactiveVersion, isReactive, isRef, toRaw } from '../../../reactivity'\nimport { hasOwn } from '../../../utils'\nimport { resolveBindingDiagnostics } from '../../bindingManifest'\nimport { diffSnapshots, toPlain } from '../../diff'\nimport { hasTrackableSetupBinding } from '../../setupTracking'\nimport { createSetDataCommitTracker } from './commitTracker'\nimport { createSetDataObservation } from './observation'\nimport { collectSnapshot } from './snapshot'\n\nexport interface SetDataSchedulerOptions {\n state: Record<string, any>\n setupState?: Record<string, any>\n snapshotOmitKeys?: Set<string>\n computedRefs: Record<string, { value: any }>\n dirtyComputedKeys: Set<string>\n includeComputed: boolean\n setDataStrategy: 'diff' | 'patch'\n computedCompare: 'reference' | 'shallow' | 'deep'\n computedCompareMaxDepth: number\n computedCompareMaxKeys: number\n currentAdapter: CommitAwareSetDataAdapter\n shouldIncludeKey: (key: string) => boolean\n maxPatchKeys: number\n maxPayloadBytes: number\n mergeSiblingThreshold: number\n mergeSiblingMaxInflationRatio: number\n mergeSiblingMaxParentBytes: number\n mergeSiblingSkipArray: boolean\n elevateTopKeyThreshold: number\n prelinkMaxDepth?: number\n prelinkMaxKeys?: number\n toPlainMaxDepth: number\n toPlainMaxKeys: number\n includeFunctions?: boolean\n functionPaths: string[]\n debug: ((info: SetDataDebugInfo) => void) | undefined\n debugWhen: 'fallback' | 'always'\n debugSampleRate: number\n debugPhases?: boolean\n bindingManifest?: WevuRuntimeBindingManifestV1\n loopWarning: false | {\n sampleWindowMs: number\n maxFlushes: number\n coolDownMs: number\n }\n targetLabel?: string\n runTracker: () => void\n isMounted: () => boolean\n initialSnapshot?: Record<string, any>\n initialState?: Record<string, any>\n}\n\nexport interface SetDataSchedulerInternals extends SetDataScheduler {\n collect: () => Record<string, unknown>\n dispatchUpdate: (update: PreparedSetDataUpdate) => number\n dispose: () => void\n emitDebug: (info: SetDataDebugInfo, pathSource?: Iterable<string> | (() => Iterable<string>)) => void\n getLatestSnapshot: () => Record<string, unknown>\n needsFullSnapshot: () => boolean\n plainCache: WeakMap<object, { version: number, value: unknown }>\n plainCacheEligibility: WeakMap<object, boolean>\n prepareJob: (pendingPatchKeys?: number, pathSource?: Iterable<string> | (() => Iterable<string>)) => boolean\n resolveTopKeysByRoot: (root: object) => string[]\n runDiffUpdate: (\n reason?: SetDataDebugInfo['reason'],\n pendingPatchKeys?: number,\n onSnapshotPrepared?: (snapshot: SetDataSnapshot) => void,\n ) => void\n shouldIncludeSnapshotKey: (key: string) => boolean\n}\n\nexport function createSetDataScheduler(options: SetDataSchedulerOptions): SetDataSchedulerInternals {\n const {\n state,\n setupState,\n snapshotOmitKeys,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n setDataStrategy,\n currentAdapter,\n shouldIncludeKey,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions = false,\n functionPaths,\n debug,\n debugWhen,\n debugSampleRate,\n bindingManifest,\n loopWarning,\n targetLabel,\n runTracker,\n isMounted,\n initialSnapshot,\n initialState,\n } = options\n\n const plainCache = new WeakMap<object, { version: number, value: any }>()\n const plainCacheEligibility = new WeakMap<object, boolean>()\n const initialSnapshotBaseline: SetDataSnapshot = {}\n const dispatchedStateTokens = Object.create(null) as Record<string, unknown>\n const dispatchedComputedTokens = Object.create(null) as Record<string, unknown>\n const flushTimes: number[] = []\n let lastLoopWarningAt = Number.NEGATIVE_INFINITY\n const initialStateKeys = new Set(\n initialState && typeof initialState === 'object'\n ? Object.keys(initialState)\n : [],\n )\n\n const isPlainObject = (value: unknown): value is Record<string, any> => {\n if (Object.prototype.toString.call(value) !== '[object Object]') {\n return false\n }\n const proto = Object.getPrototypeOf(value)\n return proto === null || proto === Object.prototype\n }\n\n const isDeepEqual = (left: any, right: any): boolean => {\n if (Object.is(left, right)) {\n return true\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) {\n return false\n }\n return left.every((item, index) => isDeepEqual(item, right[index]))\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Object.keys(left)\n const rightKeys = Object.keys(right)\n if (leftKeys.length !== rightKeys.length) {\n return false\n }\n return leftKeys.every(key => hasOwn(right, key) && isDeepEqual(left[key], right[key]))\n }\n return false\n }\n\n const createValueToken = (value: unknown) => {\n const candidate = isRef(value) ? value.value : value\n if (candidate == null || typeof candidate !== 'object') {\n return candidate\n }\n if (!isReactive(candidate) && hasTrackableSetupBinding(candidate)) {\n return {\n snapshot: toPlain(candidate, new WeakMap(), {\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n }),\n }\n }\n const raw = isReactive(candidate) ? toRaw(candidate as any) : candidate\n return {\n raw,\n version: getReactiveVersion(raw as any),\n }\n }\n\n const isSameToken = (left: unknown, right: unknown) => {\n if (Object.is(left, right)) {\n return true\n }\n if (\n !left\n || !right\n || typeof left !== 'object'\n || typeof right !== 'object'\n || !hasOwn(left as object, 'raw')\n || !hasOwn(right as object, 'raw')\n ) {\n if (\n left\n && right\n && typeof left === 'object'\n && typeof right === 'object'\n && hasOwn(left as object, 'snapshot')\n && hasOwn(right as object, 'snapshot')\n ) {\n return isDeepEqual((left as any).snapshot, (right as any).snapshot)\n }\n return false\n }\n return (left as any).raw === (right as any).raw && (left as any).version === (right as any).version\n }\n\n const shouldIncludeSnapshotKey = (key: string) => shouldIncludeKey(key) && !snapshotOmitKeys?.has(key)\n\n if (initialSnapshot) {\n for (const [key, value] of Object.entries(initialSnapshot)) {\n if (shouldIncludeSnapshotKey(key)) {\n initialSnapshotBaseline[key] = value\n }\n }\n }\n\n const syncInitialSnapshotTokens = () => {\n if (!initialSnapshot) {\n return\n }\n const rawState = (isReactive(state) ? toRaw(state as any) : state) as Record<string, any>\n const rawSetupState = setupState && typeof setupState === 'object'\n ? (isReactive(setupState) ? toRaw(setupState as any) : setupState)\n : undefined\n\n for (const key of Object.keys(initialSnapshot)) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n if (rawSetupState && hasOwn(rawSetupState, key)) {\n dispatchedStateTokens[key] = createValueToken(rawSetupState[key])\n continue\n }\n if (hasOwn(rawState, key)) {\n if (initialStateKeys.has(key)) {\n continue\n }\n rawState[key] = initialSnapshot[key]\n dispatchedStateTokens[key] = createValueToken(rawState[key])\n }\n }\n }\n\n const resolveTopKeysByRoot = (root: object) => {\n const matches: string[] = []\n const rawSetupState = setupState && typeof setupState === 'object'\n ? (isReactive(setupState) ? toRaw(setupState as any) : setupState)\n : undefined\n for (const key of new Set([...Object.keys(state), ...(rawSetupState ? Object.keys(rawSetupState) : [])])) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n const value = rawSetupState && hasOwn(rawSetupState, key) ? rawSetupState[key] : state[key]\n const candidate = isRef(value) ? value.value : value\n if (!candidate || typeof candidate !== 'object') {\n continue\n }\n if (toRaw(candidate as any) === root) {\n matches.push(key)\n }\n }\n return matches\n }\n\n const emitDebug = (\n info: SetDataDebugInfo,\n pathSource?: Iterable<string> | (() => Iterable<string>),\n ) => {\n if (!debug) {\n return\n }\n const isFallback = info.reason !== 'patch' && info.reason !== 'diff'\n if (debugWhen === 'fallback' && !isFallback) {\n return\n }\n if (info.reason !== 'commitFailure' && debugSampleRate < 1 && Math.random() > debugSampleRate) {\n return\n }\n let debugInfo = info\n if (bindingManifest) {\n const paths = typeof pathSource === 'function'\n ? pathSource()\n : pathSource ?? []\n const wholeSnapshotFallback = info.reason === 'needsFullSnapshot'\n || info.reason === 'maxPatchKeys'\n || info.reason === 'maxPayloadBytes'\n debugInfo = {\n ...info,\n bindings: resolveBindingDiagnostics(bindingManifest, paths, wholeSnapshotFallback),\n }\n }\n try {\n debug(debugInfo)\n }\n catch {\n // 忽略异常\n }\n }\n\n let commitTracker: SetDataCommitTracker\n const observation = options.debugPhases && debug\n ? createSetDataObservation({ debug, debugWhen, debugSampleRate, targetLabel, committedRevision: () => commitTracker.state.committedRevision })\n : undefined\n\n commitTracker = createSetDataCommitTracker({\n observe: observation?.revision,\n initialSnapshot: initialSnapshotBaseline,\n adapter: currentAdapter,\n onFailure: (failure: SetDataCommitFailure) => {\n emitDebug({\n mode: failure.mode,\n reason: 'commitFailure',\n pendingPatchKeys: failure.pendingPatchKeys,\n payloadKeys: failure.payloadKeys,\n revision: failure.revision,\n committedRevision: failure.committedRevision,\n targetLabel,\n message: failure.error.message,\n })\n try {\n currentAdapter.__wevu_reportSetDataError?.(failure.error)\n }\n catch {\n // 宿主错误钩子不得反向破坏提交状态机。\n }\n },\n })\n\n const recordFlushForLoopWarning = (\n pendingPatchKeys = 0,\n pathSource?: Iterable<string> | (() => Iterable<string>),\n ) => {\n if (!loopWarning) {\n return\n }\n const current = Date.now()\n flushTimes.push(current)\n const windowStart = current - loopWarning.sampleWindowMs\n while (flushTimes.length && flushTimes[0] < windowStart) {\n flushTimes.shift()\n }\n if (flushTimes.length <= loopWarning.maxFlushes) {\n return\n }\n if (loopWarning.coolDownMs > 0 && current - lastLoopWarningAt < loopWarning.coolDownMs) {\n return\n }\n lastLoopWarningAt = current\n emitDebug({\n mode: setDataStrategy,\n reason: 'loopWarning',\n pendingPatchKeys,\n payloadKeys: 0,\n computedDirtyKeys: includeComputed ? dirtyComputedKeys.size : 0,\n flushCount: flushTimes.length,\n windowMs: loopWarning.sampleWindowMs,\n targetLabel,\n message: `${targetLabel ? `${targetLabel} ` : ''}疑似运行时更新循环:${flushTimes.length} 次 setData flush/${loopWarning.sampleWindowMs}ms`,\n }, pathSource)\n }\n\n const collect = () => collectSnapshot({\n state,\n setupState,\n computedRefs,\n includeComputed,\n shouldIncludeKey: shouldIncludeSnapshotKey,\n plainCache,\n plainCacheEligibility,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n })\n\n syncInitialSnapshotTokens()\n\n const collectDiffSnapshot = () => {\n const rawState = (isReactive(state) ? toRaw(state as any) : state) as Record<string, any>\n const rawSetupState = setupState && typeof setupState === 'object'\n ? (isReactive(setupState) ? toRaw(setupState as any) : setupState)\n : undefined\n const dispatchedSnapshot = commitTracker.state.dispatchedSnapshot\n const nextSnapshot: Record<string, any> = { ...dispatchedSnapshot }\n const seen = new WeakMap<object, any>()\n const includedStateKeys = new Set<string>()\n const includedComputedKeys = new Set<string>()\n const replacedTopLevelKeys = new Set<string>()\n\n for (const key of new Set([...Object.keys(rawState), ...(rawSetupState ? Object.keys(rawSetupState) : [])])) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n includedStateKeys.add(key)\n const source = rawSetupState && hasOwn(rawSetupState, key) ? rawSetupState : rawState\n const token = createValueToken(source[key])\n const previousToken = dispatchedStateTokens[key]\n if (\n previousToken\n && token\n && typeof previousToken === 'object'\n && typeof token === 'object'\n && hasOwn(previousToken as object, 'raw')\n && hasOwn(token as object, 'raw')\n && Array.isArray((previousToken as any).raw)\n && Array.isArray((token as any).raw)\n && (previousToken as any).raw !== (token as any).raw\n ) {\n replacedTopLevelKeys.add(key)\n }\n if (!isSameToken(previousToken, token) || !hasOwn(dispatchedSnapshot, key)) {\n nextSnapshot[key] = toPlain(source[key], seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n }\n dispatchedStateTokens[key] = token\n }\n\n for (const key of Object.keys(dispatchedStateTokens)) {\n if (!includedStateKeys.has(key)) {\n delete dispatchedStateTokens[key]\n if (!includeComputed || !hasOwn(computedRefs, key)) {\n delete nextSnapshot[key]\n }\n }\n }\n\n if (!includeComputed) {\n for (const key of Object.keys(dispatchedComputedTokens)) {\n delete dispatchedComputedTokens[key]\n }\n return {\n snapshot: nextSnapshot,\n replacedTopLevelKeys,\n }\n }\n\n for (const key of Object.keys(computedRefs)) {\n if (!shouldIncludeSnapshotKey(key)) {\n continue\n }\n includedComputedKeys.add(key)\n const value = computedRefs[key].value\n const token = createValueToken(value)\n if (!isSameToken(dispatchedComputedTokens[key], token) || !hasOwn(dispatchedSnapshot, key)) {\n nextSnapshot[key] = toPlain(value, seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n }\n dispatchedComputedTokens[key] = token\n }\n\n for (const key of Object.keys(dispatchedComputedTokens)) {\n if (!includedComputedKeys.has(key)) {\n delete dispatchedComputedTokens[key]\n if (!hasOwn(rawState, key) || !shouldIncludeSnapshotKey(key)) {\n delete nextSnapshot[key]\n }\n }\n }\n\n return {\n snapshot: nextSnapshot,\n replacedTopLevelKeys,\n }\n }\n\n const runDiffUpdate = (\n reason: SetDataDebugInfo['reason'] = 'diff',\n pendingPatchKeys = 0,\n onSnapshotPrepared?: (snapshot: SetDataSnapshot) => void,\n ): void => {\n const diffCollection = setDataStrategy === 'diff' ? collectDiffSnapshot() : undefined\n const snapshot = diffCollection?.snapshot ?? collect()\n const dispatchedSnapshot = commitTracker.state.dispatchedSnapshot\n const needsRecovery = commitTracker.state.needsFullSnapshot\n const payload = needsRecovery\n ? commitTracker.createFullPayload(snapshot)\n : diffCollection\n ? (() => {\n const fastDiff: Record<string, any> = {}\n for (const key of diffCollection.replacedTopLevelKeys) {\n fastDiff[key] = snapshot[key]\n }\n const baseDiff = diffSnapshots(dispatchedSnapshot, snapshot, {\n skipKeys: diffCollection.replacedTopLevelKeys,\n })\n return {\n ...baseDiff,\n ...fastDiff,\n }\n })()\n : diffSnapshots(dispatchedSnapshot, snapshot)\n onSnapshotPrepared?.(snapshot)\n const payloadKeys = Object.keys(payload).length\n if (!payloadKeys && !needsRecovery) {\n return\n }\n const effectiveReason = needsRecovery ? 'needsFullSnapshot' : reason\n emitDebug({\n mode: 'diff',\n reason: effectiveReason,\n pendingPatchKeys,\n payloadKeys,\n }, Object.keys(payload))\n commitTracker.dispatch({\n mode: 'diff',\n kind: needsRecovery ? 'full' : 'delta',\n reason: effectiveReason,\n snapshot,\n payload,\n pendingPatchKeys,\n })\n }\n\n const prepareJob = (\n pendingPatchKeys = 0,\n pathSource?: Iterable<string> | (() => Iterable<string>),\n ) => {\n if (!isMounted()) {\n return false\n }\n observation?.prepare()\n recordFlushForLoopWarning(pendingPatchKeys, pathSource)\n // 生成快照前刷新依赖(setup 中的 ref / 新增 key)\n runTracker()\n return true\n }\n\n const job = (_stateRootRaw?: object) => {\n if (!prepareJob()) {\n return\n }\n return runDiffUpdate('diff')\n }\n\n const snapshot = () => (\n setDataStrategy === 'patch'\n ? collect()\n : { ...commitTracker.state.dispatchedSnapshot }\n )\n const cloneLatestSnapshot = () => ({ ...commitTracker.state.dispatchedSnapshot })\n\n return {\n collect,\n emitDebug,\n getLatestSnapshot: () => commitTracker.state.dispatchedSnapshot,\n dispatchUpdate: commitTracker.dispatch,\n needsFullSnapshot: () => commitTracker.state.needsFullSnapshot,\n job,\n plainCache,\n plainCacheEligibility,\n prepareJob,\n resolveTopKeysByRoot,\n runDiffUpdate,\n shouldIncludeSnapshotKey,\n snapshot,\n cloneLatestSnapshot,\n dispose: commitTracker.dispose,\n }\n}\n"],"mappings":"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"}
@@ -52,6 +52,7 @@ function resolveSetDataOptions(setDataOptions) {
52
52
  prelinkMaxDepth,
53
53
  prelinkMaxKeys,
54
54
  debug,
55
+ debugPhases: setDataOptions?.debugPhases === true,
55
56
  diagnostics,
56
57
  loopWarning,
57
58
  debugWhen,
@@ -1 +1 @@
1
- {"version":3,"file":"setDataOptions.mjs","names":[],"sources":["../../../../src/runtime/app/setDataOptions.ts"],"sourcesContent":["import type { SetDataSnapshotOptions } from '../types'\n\nexport interface ResolvedSetDataOptions {\n includeComputed: boolean\n suspendWhenHidden: boolean\n setDataStrategy: 'diff' | 'patch'\n maxPatchKeys: number\n maxPayloadBytes: number\n mergeSiblingThreshold: number\n mergeSiblingMaxInflationRatio: number\n mergeSiblingMaxParentBytes: number\n mergeSiblingSkipArray: boolean\n computedCompare: 'reference' | 'shallow' | 'deep'\n computedCompareMaxDepth: number\n computedCompareMaxKeys: number\n prelinkMaxDepth: number | undefined\n prelinkMaxKeys: number | undefined\n debug: SetDataSnapshotOptions['debug']\n diagnostics: 'off' | 'fallback' | 'always'\n loopWarning: false | {\n sampleWindowMs: number\n maxFlushes: number\n coolDownMs: number\n }\n debugWhen: 'fallback' | 'always'\n debugSampleRate: number\n elevateTopKeyThreshold: number\n toPlainMaxDepth: number\n toPlainMaxKeys: number\n includeFunctions: boolean\n functionPaths: string[]\n pickSet: Set<string> | undefined\n omitSet: Set<string> | undefined\n shouldIncludeKey: (key: string) => boolean\n}\n\nexport function resolveSetDataOptions(\n setDataOptions?: SetDataSnapshotOptions,\n): ResolvedSetDataOptions {\n const includeComputed = setDataOptions?.includeComputed ?? true\n const suspendWhenHidden = setDataOptions?.suspendWhenHidden ?? false\n const setDataStrategy = setDataOptions?.strategy ?? 'diff'\n const maxPatchKeys = typeof setDataOptions?.maxPatchKeys === 'number'\n ? Math.max(0, setDataOptions!.maxPatchKeys!)\n : Number.POSITIVE_INFINITY\n const maxPayloadBytes = typeof setDataOptions?.maxPayloadBytes === 'number'\n ? Math.max(0, setDataOptions!.maxPayloadBytes!)\n : Number.POSITIVE_INFINITY\n const mergeSiblingThreshold = typeof setDataOptions?.mergeSiblingThreshold === 'number'\n ? Math.max(2, Math.floor(setDataOptions!.mergeSiblingThreshold!))\n : 0\n const mergeSiblingMaxInflationRatio = typeof setDataOptions?.mergeSiblingMaxInflationRatio === 'number'\n ? Math.max(0, setDataOptions!.mergeSiblingMaxInflationRatio!)\n : 1.25\n const mergeSiblingMaxParentBytes = typeof setDataOptions?.mergeSiblingMaxParentBytes === 'number'\n ? Math.max(0, setDataOptions!.mergeSiblingMaxParentBytes!)\n : Number.POSITIVE_INFINITY\n const mergeSiblingSkipArray = setDataOptions?.mergeSiblingSkipArray ?? true\n const computedCompare = setDataOptions?.computedCompare ?? (setDataStrategy === 'patch' ? 'deep' : 'reference')\n const computedCompareMaxDepth = typeof setDataOptions?.computedCompareMaxDepth === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.computedCompareMaxDepth!))\n : 4\n const computedCompareMaxKeys = typeof setDataOptions?.computedCompareMaxKeys === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.computedCompareMaxKeys!))\n : 200\n const prelinkMaxDepth = setDataOptions?.prelinkMaxDepth\n const prelinkMaxKeys = setDataOptions?.prelinkMaxKeys\n const debug = setDataOptions?.debug\n const diagnostics = setDataOptions?.diagnostics ?? 'off'\n const loopWarningOption = setDataOptions?.loopWarning\n const loopWarning = loopWarningOption === false || (\n loopWarningOption\n && typeof loopWarningOption === 'object'\n && loopWarningOption.enabled === false\n )\n ? false\n : {\n sampleWindowMs: typeof loopWarningOption === 'object' && typeof loopWarningOption.sampleWindowMs === 'number'\n ? Math.max(100, Math.floor(loopWarningOption.sampleWindowMs))\n : 1000,\n maxFlushes: typeof loopWarningOption === 'object' && typeof loopWarningOption.maxFlushes === 'number'\n ? Math.max(1, Math.floor(loopWarningOption.maxFlushes))\n : 50,\n coolDownMs: typeof loopWarningOption === 'object' && typeof loopWarningOption.coolDownMs === 'number'\n ? Math.max(0, Math.floor(loopWarningOption.coolDownMs))\n : 5000,\n }\n const debugWhen = setDataOptions?.debugWhen ?? 'fallback'\n const debugSampleRate = typeof setDataOptions?.debugSampleRate === 'number'\n ? Math.min(1, Math.max(0, setDataOptions!.debugSampleRate!))\n : 1\n const elevateTopKeyThreshold = typeof setDataOptions?.elevateTopKeyThreshold === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.elevateTopKeyThreshold!))\n : Number.POSITIVE_INFINITY\n const toPlainMaxDepth = typeof setDataOptions?.toPlainMaxDepth === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.toPlainMaxDepth!))\n : Number.POSITIVE_INFINITY\n const toPlainMaxKeys = typeof setDataOptions?.toPlainMaxKeys === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.toPlainMaxKeys!))\n : Number.POSITIVE_INFINITY\n const includeFunctions = Boolean(setDataOptions?.includeFunctions)\n const functionPaths = Array.isArray(setDataOptions?.functionPaths)\n ? [...new Set(setDataOptions.functionPaths.filter(path => typeof path === 'string' && path.length > 0))]\n : []\n const pickSet = Array.isArray(setDataOptions?.pick) && setDataOptions!.pick!.length > 0\n ? new Set(setDataOptions!.pick)\n : undefined\n const omitSet = Array.isArray(setDataOptions?.omit) && setDataOptions!.omit!.length > 0\n ? new Set(setDataOptions!.omit)\n : undefined\n const shouldIncludeKey = (key: string) => {\n if (pickSet && !pickSet.has(key)) {\n return false\n }\n if (omitSet && omitSet.has(key)) {\n return false\n }\n return true\n }\n\n return {\n includeComputed,\n suspendWhenHidden,\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 pickSet,\n omitSet,\n shouldIncludeKey,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"setDataOptions.mjs","names":[],"sources":["../../../../src/runtime/app/setDataOptions.ts"],"sourcesContent":["import type { SetDataSnapshotOptions } from '../types'\n\nexport interface ResolvedSetDataOptions {\n includeComputed: boolean\n suspendWhenHidden: boolean\n setDataStrategy: 'diff' | 'patch'\n maxPatchKeys: number\n maxPayloadBytes: number\n mergeSiblingThreshold: number\n mergeSiblingMaxInflationRatio: number\n mergeSiblingMaxParentBytes: number\n mergeSiblingSkipArray: boolean\n computedCompare: 'reference' | 'shallow' | 'deep'\n computedCompareMaxDepth: number\n computedCompareMaxKeys: number\n prelinkMaxDepth: number | undefined\n prelinkMaxKeys: number | undefined\n debug: SetDataSnapshotOptions['debug']\n debugPhases: boolean\n diagnostics: 'off' | 'fallback' | 'always'\n loopWarning: false | {\n sampleWindowMs: number\n maxFlushes: number\n coolDownMs: number\n }\n debugWhen: 'fallback' | 'always'\n debugSampleRate: number\n elevateTopKeyThreshold: number\n toPlainMaxDepth: number\n toPlainMaxKeys: number\n includeFunctions: boolean\n functionPaths: string[]\n pickSet: Set<string> | undefined\n omitSet: Set<string> | undefined\n shouldIncludeKey: (key: string) => boolean\n}\n\nexport function resolveSetDataOptions(\n setDataOptions?: SetDataSnapshotOptions,\n): ResolvedSetDataOptions {\n const includeComputed = setDataOptions?.includeComputed ?? true\n const suspendWhenHidden = setDataOptions?.suspendWhenHidden ?? false\n const setDataStrategy = setDataOptions?.strategy ?? 'diff'\n const maxPatchKeys = typeof setDataOptions?.maxPatchKeys === 'number'\n ? Math.max(0, setDataOptions!.maxPatchKeys!)\n : Number.POSITIVE_INFINITY\n const maxPayloadBytes = typeof setDataOptions?.maxPayloadBytes === 'number'\n ? Math.max(0, setDataOptions!.maxPayloadBytes!)\n : Number.POSITIVE_INFINITY\n const mergeSiblingThreshold = typeof setDataOptions?.mergeSiblingThreshold === 'number'\n ? Math.max(2, Math.floor(setDataOptions!.mergeSiblingThreshold!))\n : 0\n const mergeSiblingMaxInflationRatio = typeof setDataOptions?.mergeSiblingMaxInflationRatio === 'number'\n ? Math.max(0, setDataOptions!.mergeSiblingMaxInflationRatio!)\n : 1.25\n const mergeSiblingMaxParentBytes = typeof setDataOptions?.mergeSiblingMaxParentBytes === 'number'\n ? Math.max(0, setDataOptions!.mergeSiblingMaxParentBytes!)\n : Number.POSITIVE_INFINITY\n const mergeSiblingSkipArray = setDataOptions?.mergeSiblingSkipArray ?? true\n const computedCompare = setDataOptions?.computedCompare ?? (setDataStrategy === 'patch' ? 'deep' : 'reference')\n const computedCompareMaxDepth = typeof setDataOptions?.computedCompareMaxDepth === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.computedCompareMaxDepth!))\n : 4\n const computedCompareMaxKeys = typeof setDataOptions?.computedCompareMaxKeys === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.computedCompareMaxKeys!))\n : 200\n const prelinkMaxDepth = setDataOptions?.prelinkMaxDepth\n const prelinkMaxKeys = setDataOptions?.prelinkMaxKeys\n const debug = setDataOptions?.debug\n const diagnostics = setDataOptions?.diagnostics ?? 'off'\n const loopWarningOption = setDataOptions?.loopWarning\n const loopWarning = loopWarningOption === false || (\n loopWarningOption\n && typeof loopWarningOption === 'object'\n && loopWarningOption.enabled === false\n )\n ? false\n : {\n sampleWindowMs: typeof loopWarningOption === 'object' && typeof loopWarningOption.sampleWindowMs === 'number'\n ? Math.max(100, Math.floor(loopWarningOption.sampleWindowMs))\n : 1000,\n maxFlushes: typeof loopWarningOption === 'object' && typeof loopWarningOption.maxFlushes === 'number'\n ? Math.max(1, Math.floor(loopWarningOption.maxFlushes))\n : 50,\n coolDownMs: typeof loopWarningOption === 'object' && typeof loopWarningOption.coolDownMs === 'number'\n ? Math.max(0, Math.floor(loopWarningOption.coolDownMs))\n : 5000,\n }\n const debugWhen = setDataOptions?.debugWhen ?? 'fallback'\n const debugSampleRate = typeof setDataOptions?.debugSampleRate === 'number'\n ? Math.min(1, Math.max(0, setDataOptions!.debugSampleRate!))\n : 1\n const elevateTopKeyThreshold = typeof setDataOptions?.elevateTopKeyThreshold === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.elevateTopKeyThreshold!))\n : Number.POSITIVE_INFINITY\n const toPlainMaxDepth = typeof setDataOptions?.toPlainMaxDepth === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.toPlainMaxDepth!))\n : Number.POSITIVE_INFINITY\n const toPlainMaxKeys = typeof setDataOptions?.toPlainMaxKeys === 'number'\n ? Math.max(0, Math.floor(setDataOptions!.toPlainMaxKeys!))\n : Number.POSITIVE_INFINITY\n const includeFunctions = Boolean(setDataOptions?.includeFunctions)\n const functionPaths = Array.isArray(setDataOptions?.functionPaths)\n ? [...new Set(setDataOptions.functionPaths.filter(path => typeof path === 'string' && path.length > 0))]\n : []\n const pickSet = Array.isArray(setDataOptions?.pick) && setDataOptions!.pick!.length > 0\n ? new Set(setDataOptions!.pick)\n : undefined\n const omitSet = Array.isArray(setDataOptions?.omit) && setDataOptions!.omit!.length > 0\n ? new Set(setDataOptions!.omit)\n : undefined\n const shouldIncludeKey = (key: string) => {\n if (pickSet && !pickSet.has(key)) {\n return false\n }\n if (omitSet && omitSet.has(key)) {\n return false\n }\n return true\n }\n\n return {\n includeComputed,\n suspendWhenHidden,\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 debugPhases: setDataOptions?.debugPhases === true,\n diagnostics,\n loopWarning,\n debugWhen,\n debugSampleRate,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n pickSet,\n omitSet,\n shouldIncludeKey,\n }\n}\n"],"mappings":";AAqCA,SAAgB,sBACd,gBACwB;CACxB,MAAM,kBAAkB,gBAAgB,mBAAmB;CAC3D,MAAM,oBAAoB,gBAAgB,qBAAqB;CAC/D,MAAM,kBAAkB,gBAAgB,YAAY;CACpD,MAAM,eAAe,OAAO,gBAAgB,iBAAiB,WACzD,KAAK,IAAI,GAAG,eAAgB,YAAa,IACzC,OAAO;CACX,MAAM,kBAAkB,OAAO,gBAAgB,oBAAoB,WAC/D,KAAK,IAAI,GAAG,eAAgB,eAAgB,IAC5C,OAAO;CACX,MAAM,wBAAwB,OAAO,gBAAgB,0BAA0B,WAC3E,KAAK,IAAI,GAAG,KAAK,MAAM,eAAgB,qBAAsB,CAAC,IAC9D;CACJ,MAAM,gCAAgC,OAAO,gBAAgB,kCAAkC,WAC3F,KAAK,IAAI,GAAG,eAAgB,6BAA8B,IAC1D;CACJ,MAAM,6BAA6B,OAAO,gBAAgB,+BAA+B,WACrF,KAAK,IAAI,GAAG,eAAgB,0BAA2B,IACvD,OAAO;CACX,MAAM,wBAAwB,gBAAgB,yBAAyB;CACvE,MAAM,kBAAkB,gBAAgB,oBAAoB,oBAAoB,UAAU,SAAS;CACnG,MAAM,0BAA0B,OAAO,gBAAgB,4BAA4B,WAC/E,KAAK,IAAI,GAAG,KAAK,MAAM,eAAgB,uBAAwB,CAAC,IAChE;CACJ,MAAM,yBAAyB,OAAO,gBAAgB,2BAA2B,WAC7E,KAAK,IAAI,GAAG,KAAK,MAAM,eAAgB,sBAAuB,CAAC,IAC/D;CACJ,MAAM,kBAAkB,gBAAgB;CACxC,MAAM,iBAAiB,gBAAgB;CACvC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,cAAc,gBAAgB,eAAe;CACnD,MAAM,oBAAoB,gBAAgB;CAC1C,MAAM,cAAc,sBAAsB,SACxC,qBACG,OAAO,sBAAsB,YAC7B,kBAAkB,YAAY,QAE/B,QACA;EACE,gBAAgB,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,mBAAmB,WACjG,KAAK,IAAI,KAAK,KAAK,MAAM,kBAAkB,cAAc,CAAC,IAC1D;EACJ,YAAY,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,eAAe,WACzF,KAAK,IAAI,GAAG,KAAK,MAAM,kBAAkB,UAAU,CAAC,IACpD;EACJ,YAAY,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,eAAe,WACzF,KAAK,IAAI,GAAG,KAAK,MAAM,kBAAkB,UAAU,CAAC,IACpD;CACN;CACJ,MAAM,YAAY,gBAAgB,aAAa;CAC/C,MAAM,kBAAkB,OAAO,gBAAgB,oBAAoB,WAC/D,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,eAAgB,eAAgB,CAAC,IACzD;CACJ,MAAM,yBAAyB,OAAO,gBAAgB,2BAA2B,WAC7E,KAAK,IAAI,GAAG,KAAK,MAAM,eAAgB,sBAAuB,CAAC,IAC/D,OAAO;CACX,MAAM,kBAAkB,OAAO,gBAAgB,oBAAoB,WAC/D,KAAK,IAAI,GAAG,KAAK,MAAM,eAAgB,eAAgB,CAAC,IACxD,OAAO;CACX,MAAM,iBAAiB,OAAO,gBAAgB,mBAAmB,WAC7D,KAAK,IAAI,GAAG,KAAK,MAAM,eAAgB,cAAe,CAAC,IACvD,OAAO;CACX,MAAM,mBAAmB,QAAQ,gBAAgB,gBAAgB;CACjE,MAAM,gBAAgB,MAAM,QAAQ,gBAAgB,aAAa,IAC7D,CAAC,GAAG,IAAI,IAAI,eAAe,cAAc,QAAO,SAAQ,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IACrG,CAAC;CACL,MAAM,UAAU,MAAM,QAAQ,gBAAgB,IAAI,KAAK,eAAgB,KAAM,SAAS,IAClF,IAAI,IAAI,eAAgB,IAAI,IAC5B;CACJ,MAAM,UAAU,MAAM,QAAQ,gBAAgB,IAAI,KAAK,eAAgB,KAAM,SAAS,IAClF,IAAI,IAAI,eAAgB,IAAI,IAC5B;CACJ,MAAM,oBAAoB,QAAgB;EACxC,IAAI,WAAW,CAAC,QAAQ,IAAI,GAAG,GAC7B,OAAO;EAET,IAAI,WAAW,QAAQ,IAAI,GAAG,GAC5B,OAAO;EAET,OAAO;CACT;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,gBAAgB,gBAAgB;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -26,13 +26,13 @@ function resolveRuntimeBindingPlaceholder(key) {
26
26
  if (key.startsWith("__wv_bind_")) return null;
27
27
  if (key.startsWith("__wv_cls_") || key.startsWith("__wv_style_")) return "";
28
28
  }
29
- function resolveRuntimeBindingPlaceholderData(data, setData) {
30
- const pickKeys = Array.isArray(setData?.pick) ? setData.pick : [];
31
- if (!pickKeys.length) return;
32
- const omitKeys = new Set(Array.isArray(setData?.omit) ? setData.omit : []);
29
+ function resolveRuntimeBindingPlaceholderData(data, setData, bindingManifest) {
30
+ const bindingKeys = /* @__PURE__ */ new Set([...Array.isArray(setData?.pick) ? setData.pick : [], ...bindingManifest?.bindings.map((binding) => binding.outputPath) ?? []]);
31
+ if (!bindingKeys.size) return;
32
+ const { shouldIncludeKey } = resolveSetDataOptions(setData);
33
33
  const resolved = {};
34
- for (const key of pickKeys) {
35
- if (omitKeys.has(key) || hasOwn(data, key)) continue;
34
+ for (const key of bindingKeys) {
35
+ if (!shouldIncludeKey(key) || hasOwn(data, key) || key.includes(".") || key.includes("[")) continue;
36
36
  const placeholder = resolveRuntimeBindingPlaceholder(key);
37
37
  if (placeholder !== void 0) resolved[key] = placeholder;
38
38
  }
@@ -109,17 +109,18 @@ function resolveInitialComputedData(options) {
109
109
  }
110
110
  return Object.keys(resolved).length ? resolved : void 0;
111
111
  }
112
- function resolveNativeInitialData(data, computed, setData, methods) {
113
- if (!data || typeof data !== "object") return data;
114
- const initialComputedData = resolveInitialComputedData({
115
- data,
112
+ function resolveNativeInitialData(data, computed, setData, methods, bindingManifest) {
113
+ if (data !== void 0 && (!data || typeof data !== "object")) return data;
114
+ const nativeData = data ?? {};
115
+ const initialComputedData = data === void 0 ? void 0 : resolveInitialComputedData({
116
+ data: nativeData,
116
117
  computed,
117
118
  methods,
118
119
  setData
119
120
  });
120
- const runtimeBindingPlaceholderData = resolveRuntimeBindingPlaceholderData(data, setData);
121
+ const runtimeBindingPlaceholderData = resolveRuntimeBindingPlaceholderData(nativeData, setData, bindingManifest);
121
122
  return initialComputedData || runtimeBindingPlaceholderData ? {
122
- ...data,
123
+ ...nativeData,
123
124
  ...runtimeBindingPlaceholderData,
124
125
  ...initialComputedData
125
126
  } : data;
@@ -1 +1 @@
1
- {"version":3,"file":"initialComputed.mjs","names":[],"sources":["../../../../src/runtime/define/initialComputed.ts"],"sourcesContent":["import type { WritableComputedOptions } from '../../reactivity'\nimport type { ComputedDefinitions, SetDataSnapshotOptions } from '../types'\nimport { WEVU_SLOT_OWNER_ID_KEY } from '@weapp-core/constants'\nimport { hasOwn } from '../../utils'\nimport { resolveSetDataOptions } from '../app/setDataOptions'\nimport { toPlain } from '../diff'\n\nclass InitialComputedBailout extends Error {}\n\nfunction resolveComputedGetter(definition: unknown): ((...args: any[]) => unknown) | undefined {\n if (typeof definition === 'function') {\n return definition as (...args: any[]) => unknown\n }\n const getter = (definition as WritableComputedOptions<any> | undefined)?.get\n return typeof getter === 'function' ? getter : undefined\n}\n\nfunction isCompilerGeneratedTemplateComputedKey(key: string) {\n return key.startsWith('__wv_bind_')\n || key.startsWith('__wv_cls_')\n || key.startsWith('__wv_style_')\n}\n\nfunction canResolveInitialTemplateComputed(key: string, getter: (...args: any[]) => unknown) {\n if (!key.startsWith('__wv_bind_')) {\n return false\n }\n try {\n return !/\\bthis\\b/.test(Function.prototype.toString.call(getter))\n }\n catch {\n return false\n }\n}\n\nfunction resolveRuntimeBindingPlaceholder(key: string) {\n if (key === WEVU_SLOT_OWNER_ID_KEY) {\n return ''\n }\n if (key.startsWith('__wv_bind_')) {\n return null\n }\n if (key.startsWith('__wv_cls_') || key.startsWith('__wv_style_')) {\n return ''\n }\n}\n\nfunction resolveRuntimeBindingPlaceholderData(\n data: Record<string, any>,\n setData: SetDataSnapshotOptions | undefined,\n) {\n const pickKeys = Array.isArray(setData?.pick) ? setData.pick : []\n if (!pickKeys.length) {\n return undefined\n }\n const omitKeys = new Set(Array.isArray(setData?.omit) ? setData.omit : [])\n const resolved: Record<string, any> = {}\n for (const key of pickKeys) {\n if (omitKeys.has(key) || hasOwn(data, key)) {\n continue\n }\n const placeholder = resolveRuntimeBindingPlaceholder(key)\n if (placeholder !== undefined) {\n resolved[key] = placeholder\n }\n }\n return Object.keys(resolved).length ? resolved : undefined\n}\n\nexport function resolveInitialComputedData(options: {\n data: Record<string, any>\n computed: ComputedDefinitions | undefined\n methods?: Record<string, any>\n setData: SetDataSnapshotOptions | undefined\n}) {\n const {\n data,\n computed,\n methods,\n setData,\n } = options\n const computedKeys = computed ? Object.keys(computed) : []\n if (!computedKeys.length) {\n return undefined\n }\n\n const {\n includeComputed,\n shouldIncludeKey,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n } = resolveSetDataOptions(setData)\n if (!includeComputed) {\n return undefined\n }\n\n const resolved: Record<string, any> = {}\n const resolving = new Set<string>()\n let proxy!: Record<string, any>\n const resolveComputedValue = (key: string): { ok: true, value: any } | { ok: false } => {\n if (hasOwn(data, key) || !shouldIncludeKey(key)) {\n return { ok: false }\n }\n if (hasOwn(resolved, key)) {\n return { ok: true, value: resolved[key] }\n }\n if (resolving.has(key)) {\n return { ok: false }\n }\n const getter = resolveComputedGetter((computed as ComputedDefinitions)[key])\n if (!getter) {\n return { ok: false }\n }\n resolving.add(key)\n try {\n const rawValue = getter.call(proxy)\n if (rawValue === undefined) {\n return { ok: false }\n }\n const value = toPlain(rawValue, new WeakMap(), {\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n if (value === undefined) {\n return { ok: false }\n }\n resolved[key] = value\n return { ok: true, value }\n }\n catch {\n return { ok: false }\n }\n finally {\n resolving.delete(key)\n }\n }\n\n proxy = new Proxy(data, {\n get(target, key, receiver) {\n if (typeof key === 'string') {\n if (key === 'data' || key === '$state') {\n return data\n }\n if (key === 'props' || key === '$props' || key === '$attrs') {\n throw new InitialComputedBailout()\n }\n if (hasOwn(data, key)) {\n return Reflect.get(target, key, receiver)\n }\n if (methods && hasOwn(methods, key)) {\n const method = methods[key]\n return typeof method === 'function' ? method.bind(proxy) : method\n }\n if (computed && hasOwn(computed, key)) {\n const computedValue = resolveComputedValue(key)\n if (computedValue.ok) {\n return computedValue.value\n }\n throw new InitialComputedBailout()\n }\n throw new InitialComputedBailout()\n }\n return Reflect.get(target, key, receiver)\n },\n has(target, key) {\n return Reflect.has(target, key)\n || (typeof key === 'string' && Boolean(\n computed && hasOwn(computed, key),\n ))\n },\n })\n\n for (const key of computedKeys) {\n const getter = resolveComputedGetter((computed as ComputedDefinitions)[key])\n if (isCompilerGeneratedTemplateComputedKey(key) && (!getter || !canResolveInitialTemplateComputed(key, getter))) {\n continue\n }\n resolveComputedValue(key)\n }\n\n return Object.keys(resolved).length ? resolved : undefined\n}\n\nexport function resolveNativeInitialData(\n data: unknown,\n computed: ComputedDefinitions | undefined,\n setData: SetDataSnapshotOptions | undefined,\n methods?: Record<string, any>,\n) {\n if (!data || typeof data !== 'object') {\n return data\n }\n const initialComputedData = resolveInitialComputedData({\n data: data as Record<string, any>,\n computed,\n methods,\n setData,\n })\n const runtimeBindingPlaceholderData = resolveRuntimeBindingPlaceholderData(data as Record<string, any>, setData)\n return initialComputedData || runtimeBindingPlaceholderData\n ? {\n ...(data as Record<string, any>),\n ...runtimeBindingPlaceholderData,\n ...initialComputedData,\n }\n : data\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"initialComputed.mjs","names":[],"sources":["../../../../src/runtime/define/initialComputed.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { WritableComputedOptions } from '../../reactivity'\nimport type { ComputedDefinitions, SetDataSnapshotOptions } from '../types'\nimport { WEVU_SLOT_OWNER_ID_KEY } from '@weapp-core/constants'\nimport { hasOwn } from '../../utils'\nimport { resolveSetDataOptions } from '../app/setDataOptions'\nimport { toPlain } from '../diff'\n\nclass InitialComputedBailout extends Error {}\n\nfunction resolveComputedGetter(definition: unknown): ((...args: any[]) => unknown) | undefined {\n if (typeof definition === 'function') {\n return definition as (...args: any[]) => unknown\n }\n const getter = (definition as WritableComputedOptions<any> | undefined)?.get\n return typeof getter === 'function' ? getter : undefined\n}\n\nfunction isCompilerGeneratedTemplateComputedKey(key: string) {\n return key.startsWith('__wv_bind_')\n || key.startsWith('__wv_cls_')\n || key.startsWith('__wv_style_')\n}\n\nfunction canResolveInitialTemplateComputed(key: string, getter: (...args: any[]) => unknown) {\n if (!key.startsWith('__wv_bind_')) {\n return false\n }\n try {\n return !/\\bthis\\b/.test(Function.prototype.toString.call(getter))\n }\n catch {\n return false\n }\n}\n\nfunction resolveRuntimeBindingPlaceholder(key: string) {\n if (key === WEVU_SLOT_OWNER_ID_KEY) {\n return ''\n }\n if (key.startsWith('__wv_bind_')) {\n return null\n }\n if (key.startsWith('__wv_cls_') || key.startsWith('__wv_style_')) {\n return ''\n }\n}\n\nfunction resolveRuntimeBindingPlaceholderData(\n data: Record<string, any>,\n setData: SetDataSnapshotOptions | undefined,\n bindingManifest: WevuRuntimeBindingManifestV1 | undefined,\n) {\n const bindingKeys = new Set([\n ...(Array.isArray(setData?.pick) ? setData.pick : []),\n ...(bindingManifest?.bindings.map(binding => binding.outputPath) ?? []),\n ])\n if (!bindingKeys.size) {\n return undefined\n }\n const { shouldIncludeKey } = resolveSetDataOptions(setData)\n const resolved: Record<string, any> = {}\n for (const key of bindingKeys) {\n if (!shouldIncludeKey(key) || hasOwn(data, key) || key.includes('.') || key.includes('[')) {\n continue\n }\n const placeholder = resolveRuntimeBindingPlaceholder(key)\n if (placeholder !== undefined) {\n resolved[key] = placeholder\n }\n }\n return Object.keys(resolved).length ? resolved : undefined\n}\n\nexport function resolveInitialComputedData(options: {\n data: Record<string, any>\n computed: ComputedDefinitions | undefined\n methods?: Record<string, any>\n setData: SetDataSnapshotOptions | undefined\n}) {\n const {\n data,\n computed,\n methods,\n setData,\n } = options\n const computedKeys = computed ? Object.keys(computed) : []\n if (!computedKeys.length) {\n return undefined\n }\n\n const {\n includeComputed,\n shouldIncludeKey,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n } = resolveSetDataOptions(setData)\n if (!includeComputed) {\n return undefined\n }\n\n const resolved: Record<string, any> = {}\n const resolving = new Set<string>()\n let proxy!: Record<string, any>\n const resolveComputedValue = (key: string): { ok: true, value: any } | { ok: false } => {\n if (hasOwn(data, key) || !shouldIncludeKey(key)) {\n return { ok: false }\n }\n if (hasOwn(resolved, key)) {\n return { ok: true, value: resolved[key] }\n }\n if (resolving.has(key)) {\n return { ok: false }\n }\n const getter = resolveComputedGetter((computed as ComputedDefinitions)[key])\n if (!getter) {\n return { ok: false }\n }\n resolving.add(key)\n try {\n const rawValue = getter.call(proxy)\n if (rawValue === undefined) {\n return { ok: false }\n }\n const value = toPlain(rawValue, new WeakMap(), {\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n if (value === undefined) {\n return { ok: false }\n }\n resolved[key] = value\n return { ok: true, value }\n }\n catch {\n return { ok: false }\n }\n finally {\n resolving.delete(key)\n }\n }\n\n proxy = new Proxy(data, {\n get(target, key, receiver) {\n if (typeof key === 'string') {\n if (key === 'data' || key === '$state') {\n return data\n }\n if (key === 'props' || key === '$props' || key === '$attrs') {\n throw new InitialComputedBailout()\n }\n if (hasOwn(data, key)) {\n return Reflect.get(target, key, receiver)\n }\n if (methods && hasOwn(methods, key)) {\n const method = methods[key]\n return typeof method === 'function' ? method.bind(proxy) : method\n }\n if (computed && hasOwn(computed, key)) {\n const computedValue = resolveComputedValue(key)\n if (computedValue.ok) {\n return computedValue.value\n }\n throw new InitialComputedBailout()\n }\n throw new InitialComputedBailout()\n }\n return Reflect.get(target, key, receiver)\n },\n has(target, key) {\n return Reflect.has(target, key)\n || (typeof key === 'string' && Boolean(\n computed && hasOwn(computed, key),\n ))\n },\n })\n\n for (const key of computedKeys) {\n const getter = resolveComputedGetter((computed as ComputedDefinitions)[key])\n if (isCompilerGeneratedTemplateComputedKey(key) && (!getter || !canResolveInitialTemplateComputed(key, getter))) {\n continue\n }\n resolveComputedValue(key)\n }\n\n return Object.keys(resolved).length ? resolved : undefined\n}\n\nexport function resolveNativeInitialData(\n data: unknown,\n computed: ComputedDefinitions | undefined,\n setData: SetDataSnapshotOptions | undefined,\n methods?: Record<string, any>,\n bindingManifest?: WevuRuntimeBindingManifestV1,\n) {\n if (data !== undefined && (!data || typeof data !== 'object')) {\n return data\n }\n const nativeData = (data ?? {}) as Record<string, any>\n const initialComputedData = data === undefined\n ? undefined\n : resolveInitialComputedData({\n data: nativeData,\n computed,\n methods,\n setData,\n })\n const runtimeBindingPlaceholderData = resolveRuntimeBindingPlaceholderData(nativeData, setData, bindingManifest)\n return initialComputedData || runtimeBindingPlaceholderData\n ? {\n ...nativeData,\n ...runtimeBindingPlaceholderData,\n ...initialComputedData,\n }\n : data\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { hasOwn } from "../../utils.mjs";
2
- import { WEVU_SLOT_NAMES_PROP, WEVU_SLOT_OWNER_ID_PROP, WEVU_SLOT_SCOPE_KEY } from "@weapp-core/constants";
2
+ import { WEVU_NATIVE_DECLARATION_ADDRESS_PROP, WEVU_NATIVE_SLOT_CONTEXT_KEY, WEVU_SLOT_NAMES_PROP, WEVU_SLOT_OWNER_ID_PROP, WEVU_SLOT_SCOPE_KEY } from "@weapp-core/constants";
3
3
 
4
4
  //#region src/runtime/define/props.ts
5
5
  const ALLOW_NULL_PROP_INPUT_KEY = "__wevu_allowNullPropInput";
@@ -125,6 +125,10 @@ function normalizeProps(baseOptions, props, explicitProperties) {
125
125
  const shouldAttachInternalProps = Boolean(props || resolvedExplicit);
126
126
  const attachInternalProps = (source) => {
127
127
  const next = { ...source ?? {} };
128
+ if ((!import.meta.env?.PLATFORM || import.meta.env?.PLATFORM === "weapp") && baseOptions[WEVU_NATIVE_SLOT_CONTEXT_KEY] === true) next[WEVU_NATIVE_DECLARATION_ADDRESS_PROP] = {
129
+ type: Array,
130
+ value: []
131
+ };
128
132
  if (!shouldAttachInternalProps) return next;
129
133
  if (!hasOwn(next, WEVU_SLOT_OWNER_ID_PROP)) next[WEVU_SLOT_OWNER_ID_PROP] = {
130
134
  type: String,