wevu 7.2.2 → 7.3.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.
- package/README.md +6 -0
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/defineProperty.mjs +1 -1
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPrimitive.mjs +1 -1
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPropertyKey.mjs +1 -1
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/typeof.mjs +1 -1
- package/dist/dev/internal-runtime.d.mts +2 -1
- package/dist/dev/internal-runtime.mjs +3 -2
- package/dist/dev/package.mjs +1 -1
- package/dist/dev/reactivity/asyncDerivation.mjs +8 -10
- package/dist/dev/reactivity/asyncDerivation.mjs.map +1 -1
- package/dist/dev/reactivity/core.mjs +5 -8
- package/dist/dev/reactivity/core.mjs.map +1 -1
- package/dist/dev/reactivity/reactive/patch.mjs +3 -3
- package/dist/dev/reactivity/reactive/patch.mjs.map +1 -1
- package/dist/dev/reactivity/reactive/patchState.mjs +4 -8
- package/dist/dev/reactivity/reactive/patchState.mjs.map +1 -1
- package/dist/dev/reactivity/reactive/shared.mjs +1 -2
- package/dist/dev/reactivity/reactive/shared.mjs.map +1 -1
- package/dist/dev/reactivity/reactive.mjs +5 -10
- package/dist/dev/reactivity/reactive.mjs.map +1 -1
- package/dist/dev/reactivity/ref.mjs +2 -2
- package/dist/dev/reactivity/ref.mjs.map +1 -1
- package/dist/dev/reactivity/shallowRef.mjs +1 -1
- package/dist/dev/reactivity/shallowRef.mjs.map +1 -1
- package/dist/dev/reactivity/watch/helpers.mjs +1 -1
- package/dist/dev/reactivity/watch/helpers.mjs.map +1 -1
- package/dist/dev/reactivity/watch.mjs +6 -8
- package/dist/dev/reactivity/watch.mjs.map +1 -1
- package/dist/dev/router/createRouter.mjs +17 -24
- package/dist/dev/router/createRouter.mjs.map +1 -1
- package/dist/dev/router/initialNavigation.mjs +18 -16
- package/dist/dev/router/initialNavigation.mjs.map +1 -1
- package/dist/dev/router/instance.mjs +1 -2
- package/dist/dev/router/instance.mjs.map +1 -1
- package/dist/dev/router/navigationCore.mjs +2 -2
- package/dist/dev/router/navigationCore.mjs.map +1 -1
- package/dist/dev/router/navigationResult.mjs +7 -10
- package/dist/dev/router/navigationResult.mjs.map +1 -1
- package/dist/dev/router/navigationTarget.mjs +1 -3
- package/dist/dev/router/navigationTarget.mjs.map +1 -1
- package/dist/dev/router/resolve.mjs +3 -4
- package/dist/dev/router/resolve.mjs.map +1 -1
- package/dist/dev/router/routeRegistry.mjs +1 -1
- package/dist/dev/router/routeRegistry.mjs.map +1 -1
- package/dist/dev/router/routeSync.mjs +1 -1
- package/dist/dev/router/routeSync.mjs.map +1 -1
- package/dist/dev/router/useRoute.mjs +12 -19
- package/dist/dev/router/useRoute.mjs.map +1 -1
- package/dist/dev/routerInternal/location.mjs +2 -3
- package/dist/dev/routerInternal/location.mjs.map +1 -1
- package/dist/dev/routerInternal/params.mjs +2 -3
- package/dist/dev/routerInternal/params.mjs.map +1 -1
- package/dist/dev/routerInternal/records.mjs +1 -1
- package/dist/dev/routerInternal/records.mjs.map +1 -1
- package/dist/dev/routerInternal/recordsWarnings.mjs +1 -2
- package/dist/dev/routerInternal/recordsWarnings.mjs.map +1 -1
- package/dist/dev/runtime/app/context.mjs +13 -26
- package/dist/dev/runtime/app/context.mjs.map +1 -1
- package/dist/dev/runtime/app/diagnostics.mjs +2 -4
- package/dist/dev/runtime/app/diagnostics.mjs.map +1 -1
- package/dist/dev/runtime/app/mount.mjs +27 -33
- package/dist/dev/runtime/app/mount.mjs.map +1 -1
- package/dist/dev/runtime/app/setData/commitTracker.mjs +5 -9
- package/dist/dev/runtime/app/setData/commitTracker.mjs.map +1 -1
- package/dist/dev/runtime/app/setData/patchScheduler.mjs +2 -4
- package/dist/dev/runtime/app/setData/patchScheduler.mjs.map +1 -1
- package/dist/dev/runtime/app/setData/payload.mjs +2 -3
- package/dist/dev/runtime/app/setData/payload.mjs.map +1 -1
- package/dist/dev/runtime/app/setData/scheduler.mjs +7 -9
- package/dist/dev/runtime/app/setData/scheduler.mjs.map +1 -1
- package/dist/dev/runtime/app/setData/snapshot.mjs +5 -6
- package/dist/dev/runtime/app/setData/snapshot.mjs.map +1 -1
- package/dist/dev/runtime/app/setDataOptions.mjs +26 -27
- package/dist/dev/runtime/app/setDataOptions.mjs.map +1 -1
- package/dist/dev/runtime/app.mjs +9 -9
- package/dist/dev/runtime/app.mjs.map +1 -1
- package/dist/dev/runtime/bindingManifest.mjs +6 -14
- package/dist/dev/runtime/bindingManifest.mjs.map +1 -1
- package/dist/dev/runtime/capabilities.d.mts +4 -1
- package/dist/dev/runtime/capabilities.mjs.map +1 -1
- package/dist/dev/runtime/css.mjs +4 -8
- package/dist/dev/runtime/css.mjs.map +1 -1
- package/dist/dev/runtime/defaults.mjs +4 -4
- package/dist/dev/runtime/defaults.mjs.map +1 -1
- package/dist/dev/runtime/define/initialComputed.mjs +5 -5
- package/dist/dev/runtime/define/initialComputed.mjs.map +1 -1
- package/dist/dev/runtime/define/options.mjs +10 -12
- package/dist/dev/runtime/define/options.mjs.map +1 -1
- package/dist/dev/runtime/define/props.mjs +4 -5
- package/dist/dev/runtime/define/props.mjs.map +1 -1
- package/dist/dev/runtime/define/scopedSlotOptions.mjs +43 -61
- package/dist/dev/runtime/define/scopedSlotOptions.mjs.map +1 -1
- package/dist/dev/runtime/define/setupResult.mjs +17 -28
- package/dist/dev/runtime/define/setupResult.mjs.map +1 -1
- package/dist/dev/runtime/define.mjs +9 -12
- package/dist/dev/runtime/define.mjs.map +1 -1
- package/dist/dev/runtime/diff.mjs +9 -11
- package/dist/dev/runtime/diff.mjs.map +1 -1
- package/dist/dev/runtime/disposables.mjs +2 -2
- package/dist/dev/runtime/disposables.mjs.map +1 -1
- package/dist/dev/runtime/elementIntersectionObserver.mjs +16 -24
- package/dist/dev/runtime/elementIntersectionObserver.mjs.map +1 -1
- package/dist/dev/runtime/features/inlineEvents.mjs +2 -3
- package/dist/dev/runtime/features/inlineEvents.mjs.map +1 -1
- package/dist/dev/runtime/features/jsxIslands.d.mts +7 -0
- package/dist/dev/runtime/features/jsxIslands.mjs +20 -0
- package/dist/dev/runtime/features/jsxIslands.mjs.map +1 -0
- package/dist/dev/runtime/features/layout.mjs +2 -3
- package/dist/dev/runtime/features/layout.mjs.map +1 -1
- package/dist/dev/runtime/features/publicLayout.mjs +2 -6
- package/dist/dev/runtime/features/publicLayout.mjs.map +1 -1
- package/dist/dev/runtime/features/scopedSlots.mjs +5 -9
- package/dist/dev/runtime/features/scopedSlots.mjs.map +1 -1
- package/dist/dev/runtime/features/templateRefs.mjs +1 -1
- package/dist/dev/runtime/features/templateRefs.mjs.map +1 -1
- package/dist/dev/runtime/hooks/base.mjs +21 -32
- package/dist/dev/runtime/hooks/base.mjs.map +1 -1
- package/dist/dev/runtime/inlineDataset.mjs +1 -2
- package/dist/dev/runtime/inlineDataset.mjs.map +1 -1
- package/dist/dev/runtime/intersectionObserver.mjs +6 -6
- package/dist/dev/runtime/intersectionObserver.mjs.map +1 -1
- package/dist/dev/runtime/jsxIsland.mjs +16 -33
- package/dist/dev/runtime/jsxIsland.mjs.map +1 -1
- package/dist/dev/runtime/layoutBridge.mjs +32 -62
- package/dist/dev/runtime/layoutBridge.mjs.map +1 -1
- package/dist/dev/runtime/nativeBridge.mjs +1 -1
- package/dist/dev/runtime/nativeBridge.mjs.map +1 -1
- package/dist/dev/runtime/navigationLifecycle.mjs +24 -0
- package/dist/dev/runtime/navigationLifecycle.mjs.map +1 -0
- package/dist/dev/runtime/pageEnvironment.mjs +15 -18
- package/dist/dev/runtime/pageEnvironment.mjs.map +1 -1
- package/dist/dev/runtime/pageLayout.mjs +7 -11
- package/dist/dev/runtime/pageLayout.mjs.map +1 -1
- package/dist/dev/runtime/pageScroll.mjs +2 -3
- package/dist/dev/runtime/pageScroll.mjs.map +1 -1
- package/dist/dev/runtime/platform/current.mjs +12 -0
- package/dist/dev/runtime/platform/current.mjs.map +1 -0
- package/dist/dev/runtime/platform/generic.mjs +36 -0
- package/dist/dev/runtime/platform/generic.mjs.map +1 -0
- package/dist/dev/runtime/platform/globals.mjs +29 -0
- package/dist/dev/runtime/platform/globals.mjs.map +1 -0
- package/dist/dev/runtime/platform.mjs +15 -60
- package/dist/dev/runtime/platform.mjs.map +1 -1
- package/dist/dev/runtime/provideContext.mjs +7 -9
- package/dist/dev/runtime/provideContext.mjs.map +1 -1
- package/dist/dev/runtime/publicRuntime.mjs +4 -0
- package/dist/dev/runtime/publicRuntime.mjs.map +1 -1
- package/dist/dev/runtime/pullDownRefresh.mjs +2 -4
- package/dist/dev/runtime/pullDownRefresh.mjs.map +1 -1
- package/dist/dev/runtime/register/app.mjs +18 -19
- package/dist/dev/runtime/register/app.mjs.map +1 -1
- package/dist/dev/runtime/register/component/alipay.mjs +9 -18
- package/dist/dev/runtime/register/component/alipay.mjs.map +1 -1
- package/dist/dev/runtime/register/component/alipayRegistration.mjs +60 -0
- package/dist/dev/runtime/register/component/alipayRegistration.mjs.map +1 -0
- package/dist/dev/runtime/register/component/lifecycle/platform.mjs +8 -9
- package/dist/dev/runtime/register/component/lifecycle/platform.mjs.map +1 -1
- package/dist/dev/runtime/register/component/lifecycle.mjs +7 -12
- package/dist/dev/runtime/register/component/lifecycle.mjs.map +1 -1
- package/dist/dev/runtime/register/component/methods.mjs +13 -18
- package/dist/dev/runtime/register/component/methods.mjs.map +1 -1
- package/dist/dev/runtime/register/component/options.mjs +3 -4
- package/dist/dev/runtime/register/component/options.mjs.map +1 -1
- package/dist/dev/runtime/register/component/props.mjs +25 -31
- package/dist/dev/runtime/register/component/props.mjs.map +1 -1
- package/dist/dev/runtime/register/component/registerDefinition.mjs +18 -40
- package/dist/dev/runtime/register/component/registerDefinition.mjs.map +1 -1
- package/dist/dev/runtime/register/component/registerNativeDefinition.mjs +18 -60
- package/dist/dev/runtime/register/component/registerNativeDefinition.mjs.map +1 -1
- package/dist/dev/runtime/register/component.mjs +3 -5
- package/dist/dev/runtime/register/component.mjs.map +1 -1
- package/dist/dev/runtime/register/inline.mjs +8 -10
- package/dist/dev/runtime/register/inline.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/methodBridge.mjs +7 -8
- package/dist/dev/runtime/register/runtimeInstance/methodBridge.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/provideContext.mjs +1 -1
- package/dist/dev/runtime/register/runtimeInstance/provideContext.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/setupContext.mjs +25 -34
- package/dist/dev/runtime/register/runtimeInstance/setupContext.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/setupPhase.mjs +6 -13
- package/dist/dev/runtime/register/runtimeInstance/setupPhase.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/setupSnapshot.mjs +2 -2
- package/dist/dev/runtime/register/runtimeInstance/setupSnapshot.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/utils.mjs +9 -9
- package/dist/dev/runtime/register/runtimeInstance/utils.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance.mjs +74 -100
- package/dist/dev/runtime/register/runtimeInstance.mjs.map +1 -1
- package/dist/dev/runtime/register/setDataFrequencyWarning.mjs +12 -15
- package/dist/dev/runtime/register/setDataFrequencyWarning.mjs.map +1 -1
- package/dist/dev/runtime/register/setup.mjs +2 -3
- package/dist/dev/runtime/register/setup.mjs.map +1 -1
- package/dist/dev/runtime/register/snapshot.mjs +1 -4
- package/dist/dev/runtime/register/snapshot.mjs.map +1 -1
- package/dist/dev/runtime/register/watch.mjs +3 -5
- package/dist/dev/runtime/register/watch.mjs.map +1 -1
- package/dist/dev/runtime/scopedSlots.mjs +14 -21
- package/dist/dev/runtime/scopedSlots.mjs.map +1 -1
- package/dist/dev/runtime/selectorQuery.mjs +5 -9
- package/dist/dev/runtime/selectorQuery.mjs.map +1 -1
- package/dist/dev/runtime/template.mjs +1 -1
- package/dist/dev/runtime/template.mjs.map +1 -1
- package/dist/dev/runtime/templateRefs/helpers.mjs +14 -24
- package/dist/dev/runtime/templateRefs/helpers.mjs.map +1 -1
- package/dist/dev/runtime/templateRefs.mjs +8 -15
- package/dist/dev/runtime/templateRefs.mjs.map +1 -1
- package/dist/dev/runtime/uniAppHost.mjs +6 -14
- package/dist/dev/runtime/uniAppHost.mjs.map +1 -1
- package/dist/dev/runtime/updatePerformance.mjs +1 -1
- package/dist/dev/runtime/updatePerformance.mjs.map +1 -1
- package/dist/dev/runtime/use.mjs +1 -1
- package/dist/dev/runtime/use.mjs.map +1 -1
- package/dist/dev/runtime/vueCompat/context.mjs +3 -5
- package/dist/dev/runtime/vueCompat/context.mjs.map +1 -1
- package/dist/dev/runtime/vueCompat/model.mjs +9 -13
- package/dist/dev/runtime/vueCompat/model.mjs.map +1 -1
- package/dist/dev/runtime/vueCompat/router.mjs +4 -4
- package/dist/dev/runtime/vueCompat/router.mjs.map +1 -1
- package/dist/dev/runtime/vueCompat/templateRef.mjs +1 -1
- package/dist/dev/runtime/vueCompat/templateRef.mjs.map +1 -1
- package/dist/dev/scheduler.mjs +3 -4
- package/dist/dev/scheduler.mjs.map +1 -1
- package/dist/dev/store/base.mjs +1 -2
- package/dist/dev/store/base.mjs.map +1 -1
- package/dist/dev/store/define/create.mjs +11 -22
- package/dist/dev/store/define/create.mjs.map +1 -1
- package/dist/dev/store/define.mjs +1 -1
- package/dist/dev/store/define.mjs.map +1 -1
- package/dist/dev/store/view.mjs +1 -1
- package/dist/dev/store/view.mjs.map +1 -1
- package/dist/internal-runtime.d.mts +2 -1
- package/dist/internal-runtime.mjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/reactivity/asyncDerivation.mjs +1 -1
- package/dist/reactivity/core.mjs +1 -1
- package/dist/reactivity/reactive/patch.mjs +1 -1
- package/dist/reactivity/reactive/patchState.mjs +1 -1
- package/dist/reactivity/reactive/shared.mjs +1 -1
- package/dist/reactivity/reactive.mjs +1 -1
- package/dist/reactivity/ref.mjs +1 -1
- package/dist/reactivity/shallowRef.mjs +1 -1
- package/dist/reactivity/watch/helpers.mjs +1 -1
- package/dist/reactivity/watch.mjs +1 -1
- package/dist/router/createRouter.mjs +1 -1
- package/dist/router/initialNavigation.mjs +1 -1
- package/dist/router/instance.mjs +1 -1
- package/dist/router/navigationCore.mjs +1 -1
- package/dist/router/navigationResult.mjs +1 -1
- package/dist/router/navigationTarget.mjs +1 -1
- package/dist/router/resolve.mjs +1 -1
- package/dist/router/routeRegistry.mjs +1 -1
- package/dist/router/routeSync.mjs +1 -1
- package/dist/router/useRoute.mjs +1 -1
- package/dist/routerInternal/location.mjs +1 -1
- package/dist/routerInternal/params.mjs +1 -1
- package/dist/routerInternal/records.mjs +1 -1
- package/dist/routerInternal/recordsWarnings.mjs +1 -1
- package/dist/runtime/app/context.mjs +1 -1
- package/dist/runtime/app/diagnostics.mjs +1 -1
- package/dist/runtime/app/mount.mjs +1 -1
- package/dist/runtime/app/setData/commitTracker.mjs +1 -1
- package/dist/runtime/app/setData/patchScheduler.mjs +1 -1
- package/dist/runtime/app/setData/payload.mjs +1 -1
- package/dist/runtime/app/setData/scheduler.mjs +1 -1
- package/dist/runtime/app/setData/snapshot.mjs +1 -1
- package/dist/runtime/app/setDataOptions.mjs +1 -1
- package/dist/runtime/app.mjs +1 -1
- package/dist/runtime/bindingManifest.mjs +1 -1
- package/dist/runtime/capabilities.d.mts +4 -1
- package/dist/runtime/css.mjs +1 -1
- package/dist/runtime/defaults.mjs +1 -1
- package/dist/runtime/define/initialComputed.mjs +1 -1
- package/dist/runtime/define/options.mjs +1 -1
- package/dist/runtime/define/props.mjs +1 -1
- package/dist/runtime/define/scopedSlotOptions.mjs +1 -1
- package/dist/runtime/define/setupResult.mjs +1 -1
- package/dist/runtime/define.mjs +1 -1
- package/dist/runtime/diff.mjs +1 -1
- package/dist/runtime/disposables.mjs +1 -1
- package/dist/runtime/elementIntersectionObserver.mjs +1 -1
- package/dist/runtime/features/inlineEvents.mjs +1 -1
- package/dist/runtime/features/jsxIslands.d.mts +6 -0
- package/dist/runtime/features/jsxIslands.mjs +1 -0
- package/dist/runtime/features/layout.mjs +1 -1
- package/dist/runtime/features/publicLayout.mjs +1 -1
- package/dist/runtime/features/scopedSlots.mjs +1 -1
- package/dist/runtime/features/templateRefs.mjs +1 -1
- package/dist/runtime/hooks/base.mjs +1 -1
- package/dist/runtime/inlineDataset.mjs +1 -1
- package/dist/runtime/intersectionObserver.mjs +1 -1
- package/dist/runtime/jsxIsland.mjs +1 -1
- package/dist/runtime/layoutBridge.mjs +1 -1
- package/dist/runtime/nativeBridge.mjs +1 -1
- package/dist/runtime/navigationLifecycle.mjs +1 -0
- package/dist/runtime/pageEnvironment.mjs +1 -1
- package/dist/runtime/pageLayout.mjs +1 -1
- package/dist/runtime/pageScroll.mjs +1 -1
- package/dist/runtime/platform/current.mjs +1 -0
- package/dist/runtime/platform/generic.mjs +1 -0
- package/dist/runtime/platform/globals.mjs +1 -0
- package/dist/runtime/platform.mjs +1 -1
- package/dist/runtime/provideContext.mjs +1 -1
- package/dist/runtime/publicRuntime.mjs +1 -1
- package/dist/runtime/pullDownRefresh.mjs +1 -1
- package/dist/runtime/register/app.mjs +1 -1
- package/dist/runtime/register/component/alipay.mjs +1 -1
- package/dist/runtime/register/component/alipayRegistration.mjs +1 -0
- package/dist/runtime/register/component/lifecycle/platform.mjs +1 -1
- package/dist/runtime/register/component/lifecycle.mjs +1 -1
- package/dist/runtime/register/component/methods.mjs +1 -1
- package/dist/runtime/register/component/options.mjs +1 -1
- package/dist/runtime/register/component/props.mjs +1 -1
- package/dist/runtime/register/component/registerDefinition.mjs +1 -1
- package/dist/runtime/register/component/registerNativeDefinition.mjs +1 -1
- package/dist/runtime/register/component.mjs +1 -1
- package/dist/runtime/register/inline.mjs +1 -1
- package/dist/runtime/register/runtimeInstance/methodBridge.mjs +1 -1
- package/dist/runtime/register/runtimeInstance/provideContext.mjs +1 -1
- package/dist/runtime/register/runtimeInstance/setupContext.mjs +1 -1
- package/dist/runtime/register/runtimeInstance/setupPhase.mjs +1 -1
- package/dist/runtime/register/runtimeInstance/setupSnapshot.mjs +1 -1
- package/dist/runtime/register/runtimeInstance/utils.mjs +1 -1
- package/dist/runtime/register/runtimeInstance.mjs +1 -1
- package/dist/runtime/register/setDataFrequencyWarning.mjs +1 -1
- package/dist/runtime/register/setup.mjs +1 -1
- package/dist/runtime/register/snapshot.mjs +1 -1
- package/dist/runtime/register/watch.mjs +1 -1
- package/dist/runtime/scopedSlots.mjs +1 -1
- package/dist/runtime/selectorQuery.mjs +1 -1
- package/dist/runtime/template.mjs +1 -1
- package/dist/runtime/templateRefs/helpers.mjs +1 -1
- package/dist/runtime/templateRefs.mjs +1 -1
- package/dist/runtime/uniAppHost.mjs +1 -1
- package/dist/runtime/updatePerformance.mjs +1 -1
- package/dist/runtime/use.mjs +1 -1
- package/dist/runtime/vueCompat/context.mjs +1 -1
- package/dist/runtime/vueCompat/model.mjs +1 -1
- package/dist/runtime/vueCompat/router.mjs +1 -1
- package/dist/runtime/vueCompat/templateRef.mjs +1 -1
- package/dist/scheduler.mjs +1 -1
- package/dist/store/base.mjs +1 -1
- package/dist/store/define/create.mjs +1 -1
- package/dist/store/define.mjs +1 -1
- package/dist/store/view.mjs +1 -1
- package/package.json +7 -7
- /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/defineProperty.mjs +0 -0
- /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPrimitive.mjs +0 -0
- /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/toPropertyKey.mjs +0 -0
- /package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/typeof.mjs +0 -0
|
@@ -21,26 +21,23 @@ function createWatchStopHandle(cleanup, baseHandle) {
|
|
|
21
21
|
});
|
|
22
22
|
stopHandle.stop = () => stopHandle();
|
|
23
23
|
stopHandle.pause = () => {
|
|
24
|
-
|
|
25
|
-
baseHandle === null || baseHandle === void 0 || (_baseHandle$pause = baseHandle.pause) === null || _baseHandle$pause === void 0 || _baseHandle$pause.call(baseHandle);
|
|
24
|
+
baseHandle?.pause?.();
|
|
26
25
|
};
|
|
27
26
|
stopHandle.resume = () => {
|
|
28
|
-
|
|
29
|
-
baseHandle === null || baseHandle === void 0 || (_baseHandle$resume = baseHandle.resume) === null || _baseHandle$resume === void 0 || _baseHandle$resume.call(baseHandle);
|
|
27
|
+
baseHandle?.resume?.();
|
|
30
28
|
};
|
|
31
29
|
return stopHandle;
|
|
32
30
|
}
|
|
33
31
|
function resolveDataOption(data) {
|
|
34
32
|
if (typeof data === "function") return data();
|
|
35
|
-
return data
|
|
33
|
+
return data ?? {};
|
|
36
34
|
}
|
|
37
35
|
function createRuntimeMount(options) {
|
|
38
36
|
const { data, resolvedComputed, resolvedMethods, appConfig, setDataOptions, bindingManifest } = options;
|
|
39
37
|
return (adapter) => {
|
|
40
|
-
|
|
41
|
-
if ((setDataOptions === null || setDataOptions === void 0 ? void 0 : setDataOptions.strategy) === "patch") requireRuntimeCapability("patchStrategy", "createRuntimeMount(setData.strategy=\"patch\")");
|
|
38
|
+
if (setDataOptions?.strategy === "patch") requireRuntimeCapability("patchStrategy", "createRuntimeMount(setData.strategy=\"patch\")");
|
|
42
39
|
const rawState = resolveDataOption(data);
|
|
43
|
-
const adapterInitialProps = adapter
|
|
40
|
+
const adapterInitialProps = adapter?.__wevu_initialProps;
|
|
44
41
|
if (rawState && typeof rawState === "object" && !hasOwn(rawState, WEVU_PROPS_KEY)) try {
|
|
45
42
|
Object.defineProperty(rawState, WEVU_PROPS_KEY, {
|
|
46
43
|
value: shallowReactive(Object.create(null)),
|
|
@@ -48,15 +45,15 @@ function createRuntimeMount(options) {
|
|
|
48
45
|
enumerable: false,
|
|
49
46
|
writable: false
|
|
50
47
|
});
|
|
51
|
-
} catch
|
|
48
|
+
} catch {}
|
|
52
49
|
const rawProps = rawState && typeof rawState === "object" ? rawState[WEVU_PROPS_KEY] : void 0;
|
|
53
50
|
if (rawProps && typeof rawProps === "object" && adapterInitialProps && typeof adapterInitialProps === "object") Object.assign(rawProps, adapterInitialProps);
|
|
54
51
|
const state = reactive(rawState);
|
|
55
52
|
const setupState = reactive(Object.create(null));
|
|
56
|
-
const adapterSnapshotOmitKeys = adapter
|
|
57
|
-
const deferInitialSnapshot = Boolean(adapter
|
|
58
|
-
const adapterInitialSnapshot = adapter
|
|
59
|
-
const adapterInitialState = adapter
|
|
53
|
+
const adapterSnapshotOmitKeys = adapter?.__wevu_snapshotOmitKeys;
|
|
54
|
+
const deferInitialSnapshot = Boolean(adapter?.__wevu_deferInitialSnapshot);
|
|
55
|
+
const adapterInitialSnapshot = adapter?.__wevu_initialSnapshot;
|
|
56
|
+
const adapterInitialState = adapter?.__wevu_initialState;
|
|
60
57
|
const snapshotOmitKeys = new Set(adapterSnapshotOmitKeys instanceof Set ? adapterSnapshotOmitKeys : Array.isArray(adapterSnapshotOmitKeys) ? adapterSnapshotOmitKeys : []);
|
|
61
58
|
if (rawState && typeof rawState === "object" && !hasOwn(rawState, WEVU_SETUP_STATE_KEY)) try {
|
|
62
59
|
Object.defineProperty(rawState, WEVU_SETUP_STATE_KEY, {
|
|
@@ -65,7 +62,7 @@ function createRuntimeMount(options) {
|
|
|
65
62
|
enumerable: false,
|
|
66
63
|
writable: false
|
|
67
64
|
});
|
|
68
|
-
} catch
|
|
65
|
+
} catch {}
|
|
69
66
|
if (rawState && typeof rawState === "object" && adapterInitialState && typeof adapterInitialState === "object") for (const [key, value] of Object.entries(adapterInitialState)) {
|
|
70
67
|
if (snapshotOmitKeys.has(key)) continue;
|
|
71
68
|
rawState[key] = value;
|
|
@@ -85,9 +82,9 @@ function createRuntimeMount(options) {
|
|
|
85
82
|
const mergedDebug = debug || diagnosticsLogger || loopWarningLogger ? (info) => {
|
|
86
83
|
if (typeof debug === "function") try {
|
|
87
84
|
debug(info);
|
|
88
|
-
} catch
|
|
89
|
-
diagnosticsLogger
|
|
90
|
-
if (info.reason === "loopWarning") loopWarningLogger
|
|
85
|
+
} catch {}
|
|
86
|
+
diagnosticsLogger?.(info);
|
|
87
|
+
if (info.reason === "loopWarning") loopWarningLogger?.(info);
|
|
91
88
|
} : void 0;
|
|
92
89
|
const mergedDebugWhen = diagnostics === "always" ? "always" : debugWhen;
|
|
93
90
|
const { boundMethods, computedRefs, computedSetters, dirtyComputedKeys, computedProxy, publicInstance, touchSetupMethodsVersion } = createRuntimeContext({
|
|
@@ -99,7 +96,7 @@ function createRuntimeMount(options) {
|
|
|
99
96
|
includeComputed,
|
|
100
97
|
setDataStrategy
|
|
101
98
|
});
|
|
102
|
-
const currentAdapter = adapter
|
|
99
|
+
const currentAdapter = adapter ?? { setData: () => {} };
|
|
103
100
|
const targetLabel = currentAdapter.__wevu_targetLabel;
|
|
104
101
|
let tracker;
|
|
105
102
|
const schedulerOptions = {
|
|
@@ -134,7 +131,7 @@ function createRuntimeMount(options) {
|
|
|
134
131
|
bindingManifest,
|
|
135
132
|
loopWarning,
|
|
136
133
|
targetLabel,
|
|
137
|
-
runTracker: () => tracker
|
|
134
|
+
runTracker: () => tracker?.(),
|
|
138
135
|
isMounted: () => mounted,
|
|
139
136
|
initialSnapshot: adapterInitialSnapshot && typeof adapterInitialSnapshot === "object" ? adapterInitialSnapshot : void 0,
|
|
140
137
|
initialState: adapterInitialState && typeof adapterInitialState === "object" ? adapterInitialState : void 0
|
|
@@ -148,8 +145,7 @@ function createRuntimeMount(options) {
|
|
|
148
145
|
const runtimeAttrs = state[WEVU_ATTRS_KEY];
|
|
149
146
|
if (isReactive(runtimeAttrs)) touchReactive(runtimeAttrs);
|
|
150
147
|
trackedSetupReactiveKeys.forEach((key) => {
|
|
151
|
-
|
|
152
|
-
const v = (_key = setupState[key]) !== null && _key !== void 0 ? _key : state[key];
|
|
148
|
+
const v = setupState[key] ?? state[key];
|
|
153
149
|
touchSetupBinding(v);
|
|
154
150
|
});
|
|
155
151
|
}, {
|
|
@@ -158,7 +154,7 @@ function createRuntimeMount(options) {
|
|
|
158
154
|
});
|
|
159
155
|
if (!deferInitialSnapshot) job();
|
|
160
156
|
stopHandles.push(createWatchStopHandle(() => stop(tracker)));
|
|
161
|
-
|
|
157
|
+
scheduler.start?.();
|
|
162
158
|
if (scheduler.dispose) stopHandles.push(createWatchStopHandle(scheduler.dispose));
|
|
163
159
|
function registerWatch(source, cb, watchOptions) {
|
|
164
160
|
const stopHandle = watch(source, (value, oldValue) => cb(value, oldValue), watchOptions);
|
|
@@ -171,18 +167,16 @@ function createRuntimeMount(options) {
|
|
|
171
167
|
}
|
|
172
168
|
const bindModel = createBindModel(publicInstance, state, computedRefs, computedSetters, setupState);
|
|
173
169
|
const unmount = () => {
|
|
174
|
-
var _scheduler$dispose;
|
|
175
170
|
if (!mounted) return;
|
|
176
171
|
mounted = false;
|
|
177
|
-
|
|
172
|
+
scheduler.dispose?.();
|
|
178
173
|
try {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
} catch (_unused4) {}
|
|
174
|
+
currentAdapter.__wevu_disposeSetData?.();
|
|
175
|
+
} catch {}
|
|
182
176
|
stopHandles.forEach((handle) => {
|
|
183
177
|
try {
|
|
184
178
|
handle();
|
|
185
|
-
} catch
|
|
179
|
+
} catch {}
|
|
186
180
|
});
|
|
187
181
|
stopHandles.length = 0;
|
|
188
182
|
};
|
|
@@ -217,7 +211,7 @@ function createRuntimeMount(options) {
|
|
|
217
211
|
enumerable: false,
|
|
218
212
|
writable: false
|
|
219
213
|
});
|
|
220
|
-
} catch
|
|
214
|
+
} catch {
|
|
221
215
|
runtimeInstance.__wevu_touchSetupMethodsVersion = touchSetupMethodsVersion;
|
|
222
216
|
}
|
|
223
217
|
try {
|
|
@@ -227,7 +221,7 @@ function createRuntimeMount(options) {
|
|
|
227
221
|
enumerable: false,
|
|
228
222
|
writable: false
|
|
229
223
|
});
|
|
230
|
-
} catch
|
|
224
|
+
} catch {
|
|
231
225
|
runtimeInstance.__wevu_flushSetupSnapshotSync = job;
|
|
232
226
|
}
|
|
233
227
|
try {
|
|
@@ -237,7 +231,7 @@ function createRuntimeMount(options) {
|
|
|
237
231
|
enumerable: false,
|
|
238
232
|
writable: false
|
|
239
233
|
});
|
|
240
|
-
} catch
|
|
234
|
+
} catch {
|
|
241
235
|
runtimeInstance.__wevu_cloneDispatchedSnapshot = scheduler.cloneLatestSnapshot;
|
|
242
236
|
}
|
|
243
237
|
try {
|
|
@@ -249,7 +243,7 @@ function createRuntimeMount(options) {
|
|
|
249
243
|
enumerable: false,
|
|
250
244
|
writable: false
|
|
251
245
|
});
|
|
252
|
-
} catch
|
|
246
|
+
} catch {
|
|
253
247
|
runtimeInstance.__wevu_trackSetupReactiveKey = (key) => {
|
|
254
248
|
trackedSetupReactiveKeys.add(key);
|
|
255
249
|
};
|
|
@@ -261,7 +255,7 @@ function createRuntimeMount(options) {
|
|
|
261
255
|
enumerable: false,
|
|
262
256
|
writable: false
|
|
263
257
|
});
|
|
264
|
-
} catch
|
|
258
|
+
} catch {
|
|
265
259
|
runtimeInstance[WEVU_PROPS_DERIVED_KEYS_KEY] = snapshotOmitKeys;
|
|
266
260
|
}
|
|
267
261
|
return runtimeInstance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.mjs","names":[],"sources":["../../../../src/runtime/app/mount.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { WatchOptions, WatchStopHandle } from '../../reactivity'\nimport type {\n AppConfig,\n ComputedDefinitions,\n CreateAppOptions,\n ExtractComputed,\n MethodDefinitions,\n MiniProgramAdapter,\n RuntimeInstance,\n SetDataDebugInfo,\n} from '../types'\nimport type { CommitAwareSetDataAdapter } from './setData/commitTracker'\nimport {\n WEVU_ATTRS_KEY,\n WEVU_PROPS_DERIVED_KEYS_KEY,\n WEVU_PROPS_KEY,\n WEVU_SETUP_STATE_KEY,\n} from '@weapp-core/constants'\nimport { effect, isReactive, reactive, shallowReactive, stop, touchReactive, watch } from '../../reactivity'\nimport { queueJob } from '../../scheduler'\nimport { hasOwn } from '../../utils'\nimport { createBindModel } from '../bindModel'\nimport { requireRuntimeCapability } from '../capabilities'\nimport { hasTrackableSetupBinding, touchSetupBinding } from '../setupTracking'\nimport { createRuntimeContext } from './context'\nimport { createDiagnosticsLogger } from './diagnostics'\nimport { createSetDataScheduler } from './setData/scheduler'\nimport { resolveSetDataOptions } from './setDataOptions'\n\nfunction createWatchStopHandle(cleanup: () => void, baseHandle?: WatchStopHandle): WatchStopHandle {\n const stopHandle = (() => {\n cleanup()\n }) as WatchStopHandle\n stopHandle.stop = () => stopHandle()\n stopHandle.pause = () => {\n baseHandle?.pause?.()\n }\n stopHandle.resume = () => {\n baseHandle?.resume?.()\n }\n return stopHandle\n}\n\ntype RuntimeInstanceWithSetupMethodsVersion<\n D extends object,\n C extends ComputedDefinitions,\n M extends MethodDefinitions,\n> = RuntimeInstance<D, C, M> & {\n __wevu_touchSetupMethodsVersion?: () => void\n __wevu_flushSetupSnapshotSync?: () => void\n __wevu_cloneDispatchedSnapshot?: () => Record<string, any>\n __wevu_trackSetupReactiveKey?: (key: string) => void\n}\n\nfunction resolveDataOption<D extends object>(data: CreateAppOptions<D, any, any>['data']): D {\n if (typeof data === 'function') {\n return data()\n }\n return (data ?? {}) as D\n}\n\nexport function createRuntimeMount<D extends object, C extends ComputedDefinitions, M extends MethodDefinitions>(options: {\n data: CreateAppOptions<D, C, M>['data']\n resolvedComputed: C\n resolvedMethods: M\n appConfig: AppConfig\n setDataOptions: CreateAppOptions<D, C, M>['setData']\n bindingManifest?: WevuRuntimeBindingManifestV1\n}) {\n const {\n data,\n resolvedComputed,\n resolvedMethods,\n appConfig,\n setDataOptions,\n bindingManifest,\n } = options\n\n return (adapter?: MiniProgramAdapter): RuntimeInstance<D, C, M> => {\n if (setDataOptions?.strategy === 'patch') {\n requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n }\n const rawState = resolveDataOption(data)\n const adapterInitialProps = (adapter as any)?.__wevu_initialProps\n // 预置 props 容器,确保编译器生成的 this.__wevuProps 回退表达式\n // 在 computed 首次求值阶段即可建立响应式依赖。\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_PROPS_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_PROPS_KEY, {\n value: shallowReactive(Object.create(null)),\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由 mount 阶段兜底注入。\n }\n }\n const rawProps = rawState && typeof rawState === 'object'\n ? (rawState as any)[WEVU_PROPS_KEY]\n : undefined\n if (rawProps && typeof rawProps === 'object' && adapterInitialProps && typeof adapterInitialProps === 'object') {\n Object.assign(rawProps, adapterInitialProps)\n }\n const state = reactive(rawState)\n const setupState = reactive(Object.create(null))\n const adapterSnapshotOmitKeys = (adapter as any)?.__wevu_snapshotOmitKeys\n const deferInitialSnapshot = Boolean((adapter as any)?.__wevu_deferInitialSnapshot)\n const adapterInitialSnapshot = (adapter as any)?.__wevu_initialSnapshot\n const adapterInitialState = (adapter as any)?.__wevu_initialState\n const snapshotOmitKeys = new Set<string>(\n adapterSnapshotOmitKeys instanceof Set\n ? adapterSnapshotOmitKeys\n : Array.isArray(adapterSnapshotOmitKeys)\n ? adapterSnapshotOmitKeys\n : [],\n )\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_SETUP_STATE_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_SETUP_STATE_KEY, {\n value: setupState,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由注册阶段兜底注入。\n }\n }\n if (rawState && typeof rawState === 'object' && adapterInitialState && typeof adapterInitialState === 'object') {\n for (const [key, value] of Object.entries(adapterInitialState as Record<string, unknown>)) {\n if (snapshotOmitKeys.has(key)) {\n continue\n }\n ;(rawState as Record<string, unknown>)[key] = value\n }\n }\n const computedDefs = resolvedComputed\n const methodDefs = resolvedMethods\n\n let mounted = true\n const stopHandles: WatchStopHandle[] = []\n const trackedSetupReactiveKeys = new Set<string>()\n Object.keys(state as any).forEach((key) => {\n const value = (state as any)[key]\n if (hasTrackableSetupBinding(value)) {\n trackedSetupReactiveKeys.add(key)\n }\n })\n\n const {\n includeComputed,\n setDataStrategy,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n prelinkMaxDepth,\n prelinkMaxKeys,\n debug,\n diagnostics,\n loopWarning,\n debugWhen,\n debugSampleRate,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n shouldIncludeKey,\n } = resolveSetDataOptions(setDataOptions)\n const diagnosticsLogger = createDiagnosticsLogger(diagnostics)\n const loopWarningLogger = diagnostics === 'off' && loopWarning\n ? createDiagnosticsLogger('fallback')\n : undefined\n const mergedDebug = (debug || diagnosticsLogger || loopWarningLogger)\n ? (info: SetDataDebugInfo) => {\n if (typeof debug === 'function') {\n try {\n debug(info)\n }\n catch {\n // 用户调试回调不得阻止默认诊断。\n }\n }\n diagnosticsLogger?.(info)\n if (info.reason === 'loopWarning') {\n loopWarningLogger?.(info)\n }\n }\n : undefined\n const mergedDebugWhen = diagnostics === 'always'\n ? 'always'\n : debugWhen\n\n const {\n boundMethods,\n computedRefs,\n computedSetters,\n dirtyComputedKeys,\n computedProxy,\n publicInstance,\n touchSetupMethodsVersion,\n } = createRuntimeContext({\n state,\n setupState: setupState as Record<string, any>,\n computedDefs,\n methodDefs,\n appConfig,\n includeComputed,\n setDataStrategy,\n })\n\n const currentAdapter: CommitAwareSetDataAdapter = adapter ?? { setData: () => {} }\n const targetLabel = (currentAdapter as any).__wevu_targetLabel as string | undefined\n let tracker: ReturnType<typeof effect> | undefined\n const schedulerOptions = {\n state: state as any,\n setupState: setupState as any,\n snapshotOmitKeys,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n setDataStrategy,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n currentAdapter,\n shouldIncludeKey,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n elevateTopKeyThreshold,\n prelinkMaxDepth,\n prelinkMaxKeys,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n debug: mergedDebug,\n debugWhen: mergedDebugWhen,\n debugSampleRate,\n bindingManifest,\n loopWarning,\n targetLabel,\n runTracker: () => tracker?.(),\n isMounted: () => mounted,\n initialSnapshot: adapterInitialSnapshot && typeof adapterInitialSnapshot === 'object'\n ? adapterInitialSnapshot\n : undefined,\n initialState: adapterInitialState && typeof adapterInitialState === 'object'\n ? adapterInitialState\n : undefined,\n }\n const scheduler = setDataStrategy === 'patch'\n ? requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n .createScheduler(schedulerOptions)\n : createSetDataScheduler(schedulerOptions)\n const job = () => scheduler.job()\n\n tracker = effect(\n () => {\n // 通过根版本信号跟踪任意状态变化\n touchReactive(state as any)\n // __wevuProps / __wevuAttrs 是非枚举属性,需显式跟踪,\n // 否则 props/attrs 更新不会触发 setData 调度。\n const runtimeProps = (state as any)[WEVU_PROPS_KEY]\n if (isReactive(runtimeProps)) {\n touchReactive(runtimeProps as any)\n }\n const runtimeAttrs = (state as any)[WEVU_ATTRS_KEY]\n if (isReactive(runtimeAttrs)) {\n touchReactive(runtimeAttrs as any)\n }\n // 在 setup 返回的 ref/computedRef 变更不会提升 reactive 根版本:\n // 仅跟踪这些明确注册过的键,避免每轮 flush 扫描整份 state。\n trackedSetupReactiveKeys.forEach((key) => {\n const v = (setupState as any)[key] ?? (state as any)[key]\n // setup 返回的组合式对象常常是“普通对象 + 内含 refs/reactive”,\n // 这里递归触达内部响应式源,确保异步更新也能继续驱动 setData。\n touchSetupBinding(v)\n })\n },\n {\n lazy: true,\n scheduler: () => queueJob(job),\n },\n )\n\n if (!deferInitialSnapshot) {\n job()\n }\n\n stopHandles.push(createWatchStopHandle(() => stop(tracker)))\n scheduler.start?.()\n if (scheduler.dispose) {\n stopHandles.push(createWatchStopHandle(scheduler.dispose))\n }\n\n function registerWatch<T>(\n source: (() => T) | Record<string, any>,\n cb: (value: T, oldValue: T) => void,\n watchOptions?: WatchOptions,\n ): WatchStopHandle {\n const stopHandle = watch(source as any, (value: T, oldValue: T) => cb(value, oldValue), watchOptions)\n stopHandles.push(stopHandle)\n return createWatchStopHandle(() => {\n stopHandle()\n const index = stopHandles.indexOf(stopHandle)\n if (index >= 0) {\n stopHandles.splice(index, 1)\n }\n }, stopHandle)\n }\n\n const bindModel = createBindModel(\n publicInstance as any,\n state as any,\n computedRefs,\n computedSetters,\n setupState as Record<string, any>,\n )\n\n const unmount = () => {\n if (!mounted) {\n return\n }\n mounted = false\n scheduler.dispose?.()\n try {\n currentAdapter.__wevu_disposeSetData?.()\n }\n catch {\n // 卸载阶段继续清理其余运行时资源。\n }\n stopHandles.forEach((handle) => {\n try {\n handle()\n }\n catch {\n // 卸载阶段忽略 stop 抛错,确保其余清理继续\n }\n })\n stopHandles.length = 0\n }\n\n const runtimeInstance: RuntimeInstance<D, C, M> = {\n get state() {\n return state\n },\n get setupState() {\n return setupState as Record<string, any>\n },\n get proxy() {\n return publicInstance\n },\n get methods() {\n return boundMethods\n },\n get computed() {\n return computedProxy as Readonly<ExtractComputed<C>>\n },\n get adapter() {\n return currentAdapter\n },\n bindModel,\n watch: registerWatch,\n snapshot: () => scheduler.snapshot(),\n unmount,\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_touchSetupMethodsVersion', {\n value: touchSetupMethodsVersion,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_touchSetupMethodsVersion = touchSetupMethodsVersion\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_flushSetupSnapshotSync', {\n value: job,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_flushSetupSnapshotSync = job\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_cloneDispatchedSnapshot', {\n value: scheduler.cloneLatestSnapshot,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_cloneDispatchedSnapshot = scheduler.cloneLatestSnapshot\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_trackSetupReactiveKey', {\n value: (key: string) => {\n trackedSetupReactiveKeys.add(key)\n },\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_trackSetupReactiveKey = (key: string) => {\n trackedSetupReactiveKeys.add(key)\n }\n }\n\n try {\n Object.defineProperty(runtimeInstance, WEVU_PROPS_DERIVED_KEYS_KEY, {\n value: snapshotOmitKeys,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as any)[WEVU_PROPS_DERIVED_KEYS_KEY] = snapshotOmitKeys\n }\n\n return runtimeInstance\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mount.mjs","names":[],"sources":["../../../../src/runtime/app/mount.ts"],"sourcesContent":["import type { WevuRuntimeBindingManifestV1 } from '@weapp-core/constants'\nimport type { WatchOptions, WatchStopHandle } from '../../reactivity'\nimport type {\n AppConfig,\n ComputedDefinitions,\n CreateAppOptions,\n ExtractComputed,\n MethodDefinitions,\n MiniProgramAdapter,\n RuntimeInstance,\n SetDataDebugInfo,\n} from '../types'\nimport type { CommitAwareSetDataAdapter } from './setData/commitTracker'\nimport {\n WEVU_ATTRS_KEY,\n WEVU_PROPS_DERIVED_KEYS_KEY,\n WEVU_PROPS_KEY,\n WEVU_SETUP_STATE_KEY,\n} from '@weapp-core/constants'\nimport { effect, isReactive, reactive, shallowReactive, stop, touchReactive, watch } from '../../reactivity'\nimport { queueJob } from '../../scheduler'\nimport { hasOwn } from '../../utils'\nimport { createBindModel } from '../bindModel'\nimport { requireRuntimeCapability } from '../capabilities'\nimport { hasTrackableSetupBinding, touchSetupBinding } from '../setupTracking'\nimport { createRuntimeContext } from './context'\nimport { createDiagnosticsLogger } from './diagnostics'\nimport { createSetDataScheduler } from './setData/scheduler'\nimport { resolveSetDataOptions } from './setDataOptions'\n\nfunction createWatchStopHandle(cleanup: () => void, baseHandle?: WatchStopHandle): WatchStopHandle {\n const stopHandle = (() => {\n cleanup()\n }) as WatchStopHandle\n stopHandle.stop = () => stopHandle()\n stopHandle.pause = () => {\n baseHandle?.pause?.()\n }\n stopHandle.resume = () => {\n baseHandle?.resume?.()\n }\n return stopHandle\n}\n\ntype RuntimeInstanceWithSetupMethodsVersion<\n D extends object,\n C extends ComputedDefinitions,\n M extends MethodDefinitions,\n> = RuntimeInstance<D, C, M> & {\n __wevu_touchSetupMethodsVersion?: () => void\n __wevu_flushSetupSnapshotSync?: () => void\n __wevu_cloneDispatchedSnapshot?: () => Record<string, any>\n __wevu_trackSetupReactiveKey?: (key: string) => void\n}\n\nfunction resolveDataOption<D extends object>(data: CreateAppOptions<D, any, any>['data']): D {\n if (typeof data === 'function') {\n return data()\n }\n return (data ?? {}) as D\n}\n\nexport function createRuntimeMount<D extends object, C extends ComputedDefinitions, M extends MethodDefinitions>(options: {\n data: CreateAppOptions<D, C, M>['data']\n resolvedComputed: C\n resolvedMethods: M\n appConfig: AppConfig\n setDataOptions: CreateAppOptions<D, C, M>['setData']\n bindingManifest?: WevuRuntimeBindingManifestV1\n}) {\n const {\n data,\n resolvedComputed,\n resolvedMethods,\n appConfig,\n setDataOptions,\n bindingManifest,\n } = options\n\n return (adapter?: MiniProgramAdapter): RuntimeInstance<D, C, M> => {\n if (setDataOptions?.strategy === 'patch') {\n requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n }\n const rawState = resolveDataOption(data)\n const adapterInitialProps = (adapter as any)?.__wevu_initialProps\n // 预置 props 容器,确保编译器生成的 this.__wevuProps 回退表达式\n // 在 computed 首次求值阶段即可建立响应式依赖。\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_PROPS_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_PROPS_KEY, {\n value: shallowReactive(Object.create(null)),\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由 mount 阶段兜底注入。\n }\n }\n const rawProps = rawState && typeof rawState === 'object'\n ? (rawState as any)[WEVU_PROPS_KEY]\n : undefined\n if (rawProps && typeof rawProps === 'object' && adapterInitialProps && typeof adapterInitialProps === 'object') {\n Object.assign(rawProps, adapterInitialProps)\n }\n const state = reactive(rawState)\n const setupState = reactive(Object.create(null))\n const adapterSnapshotOmitKeys = (adapter as any)?.__wevu_snapshotOmitKeys\n const deferInitialSnapshot = Boolean((adapter as any)?.__wevu_deferInitialSnapshot)\n const adapterInitialSnapshot = (adapter as any)?.__wevu_initialSnapshot\n const adapterInitialState = (adapter as any)?.__wevu_initialState\n const snapshotOmitKeys = new Set<string>(\n adapterSnapshotOmitKeys instanceof Set\n ? adapterSnapshotOmitKeys\n : Array.isArray(adapterSnapshotOmitKeys)\n ? adapterSnapshotOmitKeys\n : [],\n )\n if (rawState && typeof rawState === 'object' && !hasOwn(rawState as object, WEVU_SETUP_STATE_KEY)) {\n try {\n Object.defineProperty(rawState as object, WEVU_SETUP_STATE_KEY, {\n value: setupState,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n // 若 data 返回对象不可扩展,则跳过预置,后续由注册阶段兜底注入。\n }\n }\n if (rawState && typeof rawState === 'object' && adapterInitialState && typeof adapterInitialState === 'object') {\n for (const [key, value] of Object.entries(adapterInitialState as Record<string, unknown>)) {\n if (snapshotOmitKeys.has(key)) {\n continue\n }\n ;(rawState as Record<string, unknown>)[key] = value\n }\n }\n const computedDefs = resolvedComputed\n const methodDefs = resolvedMethods\n\n let mounted = true\n const stopHandles: WatchStopHandle[] = []\n const trackedSetupReactiveKeys = new Set<string>()\n Object.keys(state as any).forEach((key) => {\n const value = (state as any)[key]\n if (hasTrackableSetupBinding(value)) {\n trackedSetupReactiveKeys.add(key)\n }\n })\n\n const {\n includeComputed,\n setDataStrategy,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n prelinkMaxDepth,\n prelinkMaxKeys,\n debug,\n diagnostics,\n loopWarning,\n debugWhen,\n debugSampleRate,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n shouldIncludeKey,\n } = resolveSetDataOptions(setDataOptions)\n const diagnosticsLogger = createDiagnosticsLogger(diagnostics)\n const loopWarningLogger = diagnostics === 'off' && loopWarning\n ? createDiagnosticsLogger('fallback')\n : undefined\n const mergedDebug = (debug || diagnosticsLogger || loopWarningLogger)\n ? (info: SetDataDebugInfo) => {\n if (typeof debug === 'function') {\n try {\n debug(info)\n }\n catch {\n // 用户调试回调不得阻止默认诊断。\n }\n }\n diagnosticsLogger?.(info)\n if (info.reason === 'loopWarning') {\n loopWarningLogger?.(info)\n }\n }\n : undefined\n const mergedDebugWhen = diagnostics === 'always'\n ? 'always'\n : debugWhen\n\n const {\n boundMethods,\n computedRefs,\n computedSetters,\n dirtyComputedKeys,\n computedProxy,\n publicInstance,\n touchSetupMethodsVersion,\n } = createRuntimeContext({\n state,\n setupState: setupState as Record<string, any>,\n computedDefs,\n methodDefs,\n appConfig,\n includeComputed,\n setDataStrategy,\n })\n\n const currentAdapter: CommitAwareSetDataAdapter = adapter ?? { setData: () => {} }\n const targetLabel = (currentAdapter as any).__wevu_targetLabel as string | undefined\n let tracker: ReturnType<typeof effect> | undefined\n const schedulerOptions = {\n state: state as any,\n setupState: setupState as any,\n snapshotOmitKeys,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n setDataStrategy,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n currentAdapter,\n shouldIncludeKey,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n elevateTopKeyThreshold,\n prelinkMaxDepth,\n prelinkMaxKeys,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n debug: mergedDebug,\n debugWhen: mergedDebugWhen,\n debugSampleRate,\n bindingManifest,\n loopWarning,\n targetLabel,\n runTracker: () => tracker?.(),\n isMounted: () => mounted,\n initialSnapshot: adapterInitialSnapshot && typeof adapterInitialSnapshot === 'object'\n ? adapterInitialSnapshot\n : undefined,\n initialState: adapterInitialState && typeof adapterInitialState === 'object'\n ? adapterInitialState\n : undefined,\n }\n const scheduler = setDataStrategy === 'patch'\n ? requireRuntimeCapability('patchStrategy', 'createRuntimeMount(setData.strategy=\"patch\")')\n .createScheduler(schedulerOptions)\n : createSetDataScheduler(schedulerOptions)\n const job = () => scheduler.job()\n\n tracker = effect(\n () => {\n // 通过根版本信号跟踪任意状态变化\n touchReactive(state as any)\n // __wevuProps / __wevuAttrs 是非枚举属性,需显式跟踪,\n // 否则 props/attrs 更新不会触发 setData 调度。\n const runtimeProps = (state as any)[WEVU_PROPS_KEY]\n if (isReactive(runtimeProps)) {\n touchReactive(runtimeProps as any)\n }\n const runtimeAttrs = (state as any)[WEVU_ATTRS_KEY]\n if (isReactive(runtimeAttrs)) {\n touchReactive(runtimeAttrs as any)\n }\n // 在 setup 返回的 ref/computedRef 变更不会提升 reactive 根版本:\n // 仅跟踪这些明确注册过的键,避免每轮 flush 扫描整份 state。\n trackedSetupReactiveKeys.forEach((key) => {\n const v = (setupState as any)[key] ?? (state as any)[key]\n // setup 返回的组合式对象常常是“普通对象 + 内含 refs/reactive”,\n // 这里递归触达内部响应式源,确保异步更新也能继续驱动 setData。\n touchSetupBinding(v)\n })\n },\n {\n lazy: true,\n scheduler: () => queueJob(job),\n },\n )\n\n if (!deferInitialSnapshot) {\n job()\n }\n\n stopHandles.push(createWatchStopHandle(() => stop(tracker)))\n scheduler.start?.()\n if (scheduler.dispose) {\n stopHandles.push(createWatchStopHandle(scheduler.dispose))\n }\n\n function registerWatch<T>(\n source: (() => T) | Record<string, any>,\n cb: (value: T, oldValue: T) => void,\n watchOptions?: WatchOptions,\n ): WatchStopHandle {\n const stopHandle = watch(source as any, (value: T, oldValue: T) => cb(value, oldValue), watchOptions)\n stopHandles.push(stopHandle)\n return createWatchStopHandle(() => {\n stopHandle()\n const index = stopHandles.indexOf(stopHandle)\n if (index >= 0) {\n stopHandles.splice(index, 1)\n }\n }, stopHandle)\n }\n\n const bindModel = createBindModel(\n publicInstance as any,\n state as any,\n computedRefs,\n computedSetters,\n setupState as Record<string, any>,\n )\n\n const unmount = () => {\n if (!mounted) {\n return\n }\n mounted = false\n scheduler.dispose?.()\n try {\n currentAdapter.__wevu_disposeSetData?.()\n }\n catch {\n // 卸载阶段继续清理其余运行时资源。\n }\n stopHandles.forEach((handle) => {\n try {\n handle()\n }\n catch {\n // 卸载阶段忽略 stop 抛错,确保其余清理继续\n }\n })\n stopHandles.length = 0\n }\n\n const runtimeInstance: RuntimeInstance<D, C, M> = {\n get state() {\n return state\n },\n get setupState() {\n return setupState as Record<string, any>\n },\n get proxy() {\n return publicInstance\n },\n get methods() {\n return boundMethods\n },\n get computed() {\n return computedProxy as Readonly<ExtractComputed<C>>\n },\n get adapter() {\n return currentAdapter\n },\n bindModel,\n watch: registerWatch,\n snapshot: () => scheduler.snapshot(),\n unmount,\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_touchSetupMethodsVersion', {\n value: touchSetupMethodsVersion,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_touchSetupMethodsVersion = touchSetupMethodsVersion\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_flushSetupSnapshotSync', {\n value: job,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_flushSetupSnapshotSync = job\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_cloneDispatchedSnapshot', {\n value: scheduler.cloneLatestSnapshot,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_cloneDispatchedSnapshot = scheduler.cloneLatestSnapshot\n }\n\n try {\n Object.defineProperty(runtimeInstance, '__wevu_trackSetupReactiveKey', {\n value: (key: string) => {\n trackedSetupReactiveKeys.add(key)\n },\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as RuntimeInstanceWithSetupMethodsVersion<D, C, M>).__wevu_trackSetupReactiveKey = (key: string) => {\n trackedSetupReactiveKeys.add(key)\n }\n }\n\n try {\n Object.defineProperty(runtimeInstance, WEVU_PROPS_DERIVED_KEYS_KEY, {\n value: snapshotOmitKeys,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n ;(runtimeInstance as any)[WEVU_PROPS_DERIVED_KEYS_KEY] = snapshotOmitKeys\n }\n\n return runtimeInstance\n }\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ function isThenable(value) {
|
|
|
8
8
|
function formatCommitFailureCause(cause) {
|
|
9
9
|
try {
|
|
10
10
|
return cause instanceof Error ? cause.message : String(cause);
|
|
11
|
-
} catch
|
|
11
|
+
} catch {
|
|
12
12
|
return "<unprintable cause>";
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -91,11 +91,10 @@ function createSetDataCommitTracker(options) {
|
|
|
91
91
|
payloadKeys: record.payloadKeys,
|
|
92
92
|
pendingPatchKeys: record.pendingPatchKeys
|
|
93
93
|
});
|
|
94
|
-
} catch
|
|
94
|
+
} catch {}
|
|
95
95
|
};
|
|
96
96
|
const resolveRecord = (record) => {
|
|
97
|
-
|
|
98
|
-
(_record$resolveCommit = record.resolveCommit) === null || _record$resolveCommit === void 0 || _record$resolveCommit.call(record);
|
|
97
|
+
record.resolveCommit?.();
|
|
99
98
|
record.resolveCommit = void 0;
|
|
100
99
|
};
|
|
101
100
|
const removePrefixThrough = (last) => {
|
|
@@ -139,7 +138,7 @@ function createSetDataCommitTracker(options) {
|
|
|
139
138
|
reportFailure(kind, record, cause);
|
|
140
139
|
};
|
|
141
140
|
const drainSucceededPrefix = () => {
|
|
142
|
-
while (
|
|
141
|
+
while (head?.status === "succeeded") {
|
|
143
142
|
const record = head;
|
|
144
143
|
state.committedSnapshot = record.snapshot;
|
|
145
144
|
state.committedRevision = record.revision;
|
|
@@ -238,10 +237,7 @@ function createSetDataCommitTracker(options) {
|
|
|
238
237
|
settle("failed", cause);
|
|
239
238
|
}
|
|
240
239
|
else observeSetDataCompletion({
|
|
241
|
-
invoke: () =>
|
|
242
|
-
var _options$adapter$setD, _options$adapter;
|
|
243
|
-
return (_options$adapter$setD = (_options$adapter = options.adapter).setData) === null || _options$adapter$setD === void 0 ? void 0 : _options$adapter$setD.call(_options$adapter, hostPayload);
|
|
244
|
-
},
|
|
240
|
+
invoke: () => options.adapter.setData?.(hostPayload),
|
|
245
241
|
completion: "return",
|
|
246
242
|
settle
|
|
247
243
|
});
|
|
@@ -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 { 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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"}
|
|
@@ -27,9 +27,8 @@ function preparePatchUpdate(options) {
|
|
|
27
27
|
if (Number.isFinite(elevateTopKeyThreshold) && elevateTopKeyThreshold > 0) {
|
|
28
28
|
const counts = /* @__PURE__ */ new Map();
|
|
29
29
|
for (const [path] of patchEntriesRaw) {
|
|
30
|
-
var _counts$get;
|
|
31
30
|
const top = path.split(".", 1)[0];
|
|
32
|
-
counts.set(top, (
|
|
31
|
+
counts.set(top, (counts.get(top) ?? 0) + 1);
|
|
33
32
|
}
|
|
34
33
|
for (const [top, count] of counts) if (count >= elevateTopKeyThreshold) fallbackTopKeys.add(top);
|
|
35
34
|
}
|
|
@@ -133,9 +132,8 @@ function preparePatchUpdate(options) {
|
|
|
133
132
|
const snapshot = { ...dispatchedSnapshot };
|
|
134
133
|
const clonedParents = /* @__PURE__ */ new WeakSet();
|
|
135
134
|
for (const [path, value] of Object.entries(collapsedPayload)) {
|
|
136
|
-
var _entry$op;
|
|
137
135
|
const entry = entryMap.get(path);
|
|
138
|
-
applySnapshotUpdate(snapshot, path, value,
|
|
136
|
+
applySnapshotUpdate(snapshot, path, value, entry?.kind === "array" ? "set" : entry?.op ?? "set", {
|
|
139
137
|
cloneValue: false,
|
|
140
138
|
clonedParents
|
|
141
139
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchScheduler.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/patchScheduler.ts"],"sourcesContent":["import type { SetDataDebugInfo } from '../../types'\nimport type { SetDataPayload, SetDataSnapshot } from './commitTracker'\nimport { toPlain } from '../../diff'\nimport { checkPayloadSize, collapsePayload, mergeSiblingPayload } from './payload'\nimport { applySnapshotUpdate, cloneSnapshotValue, isDeepEqualValue, isShallowEqualValue, normalizeSetDataValue } from './snapshot'\n\ninterface PatchEntry {\n kind: 'property' | 'array'\n op: 'set' | 'delete'\n}\n\nexport type PatchPreparation\n = | undefined\n | {\n type: 'fallback'\n reason: 'maxPatchKeys' | 'maxPayloadBytes'\n debug: SetDataDebugInfo\n }\n | {\n type: 'patch'\n payload: SetDataPayload\n snapshot: SetDataSnapshot\n computedUpdates?: SetDataSnapshot\n debug: SetDataDebugInfo\n }\n\nexport interface PatchPrepareOptions {\n state: Record<string, unknown>\n computedRefs: Record<string, { value: unknown }>\n dirtyComputedKeys: Set<string>\n includeComputed: boolean\n computedCompare: 'reference' | 'shallow' | 'deep'\n computedCompareMaxDepth: number\n computedCompareMaxKeys: number\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 toPlainMaxDepth: number\n toPlainMaxKeys: number\n includeFunctions?: boolean\n functionPaths: string[]\n plainCache: WeakMap<object, { version: number, value: unknown }>\n plainCacheEligibility?: WeakMap<object, boolean>\n pendingPatches: Map<string, PatchEntry>\n fallbackTopKeys: Set<string>\n dispatchedSnapshot: SetDataSnapshot\n dispatchedComputedSnapshot: SetDataSnapshot\n}\n\nexport function preparePatchUpdate(options: PatchPrepareOptions): PatchPreparation {\n const {\n state,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n shouldIncludeKey,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions = false,\n functionPaths,\n plainCache,\n plainCacheEligibility,\n pendingPatches,\n fallbackTopKeys,\n dispatchedSnapshot,\n dispatchedComputedSnapshot,\n } = options\n\n if (pendingPatches.size > maxPatchKeys) {\n const pendingCount = pendingPatches.size\n pendingPatches.clear()\n dirtyComputedKeys.clear()\n return {\n type: 'fallback',\n reason: 'maxPatchKeys',\n debug: {\n mode: 'diff',\n reason: 'maxPatchKeys',\n pendingPatchKeys: pendingCount,\n payloadKeys: 0,\n },\n }\n }\n\n const seen = new WeakMap<object, unknown>()\n const plainByPath = new Map<string, unknown>()\n const payload: SetDataPayload = Object.create(null) as SetDataPayload\n const patchEntriesRaw = [...pendingPatches.entries()]\n\n if (Number.isFinite(elevateTopKeyThreshold) && elevateTopKeyThreshold > 0) {\n const counts = new Map<string, number>()\n for (const [path] of patchEntriesRaw) {\n const top = path.split('.', 1)[0]!\n counts.set(top, (counts.get(top) ?? 0) + 1)\n }\n for (const [top, count] of counts) {\n if (count >= elevateTopKeyThreshold) {\n fallbackTopKeys.add(top)\n }\n }\n }\n\n const patchEntries = patchEntriesRaw.filter(([path]) => {\n for (const topKey of fallbackTopKeys) {\n if (path === topKey || path.startsWith(`${topKey}.`)) {\n return false\n }\n }\n return true\n })\n const entryMap = new Map<string, PatchEntry>(patchEntries)\n pendingPatches.clear()\n\n const getStateValueByPath = (path: string) => {\n const segments = path.split('.').filter(Boolean)\n let current: unknown = state\n for (const segment of segments) {\n if (current == null || typeof current !== 'object') {\n return current\n }\n current = Reflect.get(current, segment)\n }\n return current\n }\n\n const getPlainByPath = (path: string) => {\n if (plainByPath.has(path)) {\n return plainByPath.get(path)\n }\n const value = normalizeSetDataValue(\n toPlain(getStateValueByPath(path), seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: path,\n }),\n )\n plainByPath.set(path, value)\n return value\n }\n\n if (fallbackTopKeys.size) {\n for (const topKey of fallbackTopKeys) {\n if (!shouldIncludeKey(topKey)) {\n continue\n }\n payload[topKey] = getPlainByPath(topKey)\n entryMap.set(topKey, { kind: 'property', op: 'set' })\n }\n fallbackTopKeys.clear()\n }\n\n for (const [path, entry] of patchEntries) {\n const effectiveOp = entry.kind === 'array' ? 'set' : entry.op\n payload[path] = effectiveOp === 'delete'\n ? null\n : getPlainByPath(path)\n }\n\n let computedDirtyProcessed = 0\n const computedUpdates: SetDataSnapshot = Object.create(null) as SetDataSnapshot\n if (includeComputed && dirtyComputedKeys.size) {\n const keys = [...dirtyComputedKeys]\n dirtyComputedKeys.clear()\n computedDirtyProcessed = keys.length\n for (const key of keys) {\n if (!shouldIncludeKey(key)) {\n continue\n }\n const nextValue = toPlain(computedRefs[key]!.value, seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n const prevValue = dispatchedComputedSnapshot[key]\n const equal = computedCompare === 'deep'\n ? isDeepEqualValue(prevValue, nextValue, computedCompareMaxDepth, { keys: computedCompareMaxKeys })\n : computedCompare === 'shallow'\n ? isShallowEqualValue(prevValue, nextValue)\n : Object.is(prevValue, nextValue)\n if (equal) {\n continue\n }\n payload[key] = normalizeSetDataValue(nextValue)\n computedUpdates[key] = cloneSnapshotValue(nextValue)\n }\n }\n\n let collapsedPayload = collapsePayload(payload)\n let mergedSiblingParents = 0\n if (mergeSiblingThreshold) {\n const mergedResult = mergeSiblingPayload({\n input: collapsedPayload,\n entryMap,\n getPlainByPath,\n mergeSiblingThreshold,\n mergeSiblingSkipArray,\n mergeSiblingMaxParentBytes,\n mergeSiblingMaxInflationRatio,\n })\n mergedSiblingParents = mergedResult.merged\n collapsedPayload = collapsePayload(mergedResult.out)\n }\n const sizeCheck = checkPayloadSize(collapsedPayload, maxPayloadBytes)\n const payloadKeys = Object.keys(collapsedPayload).length\n const debug: SetDataDebugInfo = {\n mode: sizeCheck.fallback ? 'diff' : 'patch',\n reason: sizeCheck.fallback ? 'maxPayloadBytes' : 'patch',\n pendingPatchKeys: patchEntries.length,\n payloadKeys,\n mergedSiblingParents: mergedSiblingParents || undefined,\n computedDirtyKeys: computedDirtyProcessed || undefined,\n estimatedBytes: sizeCheck.estimatedBytes,\n bytes: sizeCheck.bytes,\n }\n if (sizeCheck.fallback) {\n return {\n type: 'fallback',\n reason: 'maxPayloadBytes',\n debug,\n }\n }\n if (!payloadKeys) {\n return undefined\n }\n\n const snapshot: SetDataSnapshot = { ...dispatchedSnapshot }\n const clonedParents = new WeakSet<object>()\n for (const [path, value] of Object.entries(collapsedPayload)) {\n const entry = entryMap.get(path)\n applySnapshotUpdate(\n snapshot,\n path,\n value,\n entry?.kind === 'array' ? 'set' : (entry?.op ?? 'set'),\n { cloneValue: false, clonedParents },\n )\n }\n\n return {\n type: 'patch',\n payload: collapsedPayload,\n snapshot,\n computedUpdates: Object.keys(computedUpdates).length ? computedUpdates : undefined,\n debug,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"patchScheduler.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/patchScheduler.ts"],"sourcesContent":["import type { SetDataDebugInfo } from '../../types'\nimport type { SetDataPayload, SetDataSnapshot } from './commitTracker'\nimport { toPlain } from '../../diff'\nimport { checkPayloadSize, collapsePayload, mergeSiblingPayload } from './payload'\nimport { applySnapshotUpdate, cloneSnapshotValue, isDeepEqualValue, isShallowEqualValue, normalizeSetDataValue } from './snapshot'\n\ninterface PatchEntry {\n kind: 'property' | 'array'\n op: 'set' | 'delete'\n}\n\nexport type PatchPreparation\n = | undefined\n | {\n type: 'fallback'\n reason: 'maxPatchKeys' | 'maxPayloadBytes'\n debug: SetDataDebugInfo\n }\n | {\n type: 'patch'\n payload: SetDataPayload\n snapshot: SetDataSnapshot\n computedUpdates?: SetDataSnapshot\n debug: SetDataDebugInfo\n }\n\nexport interface PatchPrepareOptions {\n state: Record<string, unknown>\n computedRefs: Record<string, { value: unknown }>\n dirtyComputedKeys: Set<string>\n includeComputed: boolean\n computedCompare: 'reference' | 'shallow' | 'deep'\n computedCompareMaxDepth: number\n computedCompareMaxKeys: number\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 toPlainMaxDepth: number\n toPlainMaxKeys: number\n includeFunctions?: boolean\n functionPaths: string[]\n plainCache: WeakMap<object, { version: number, value: unknown }>\n plainCacheEligibility?: WeakMap<object, boolean>\n pendingPatches: Map<string, PatchEntry>\n fallbackTopKeys: Set<string>\n dispatchedSnapshot: SetDataSnapshot\n dispatchedComputedSnapshot: SetDataSnapshot\n}\n\nexport function preparePatchUpdate(options: PatchPrepareOptions): PatchPreparation {\n const {\n state,\n computedRefs,\n dirtyComputedKeys,\n includeComputed,\n computedCompare,\n computedCompareMaxDepth,\n computedCompareMaxKeys,\n shouldIncludeKey,\n maxPatchKeys,\n maxPayloadBytes,\n mergeSiblingThreshold,\n mergeSiblingMaxInflationRatio,\n mergeSiblingMaxParentBytes,\n mergeSiblingSkipArray,\n elevateTopKeyThreshold,\n toPlainMaxDepth,\n toPlainMaxKeys,\n includeFunctions = false,\n functionPaths,\n plainCache,\n plainCacheEligibility,\n pendingPatches,\n fallbackTopKeys,\n dispatchedSnapshot,\n dispatchedComputedSnapshot,\n } = options\n\n if (pendingPatches.size > maxPatchKeys) {\n const pendingCount = pendingPatches.size\n pendingPatches.clear()\n dirtyComputedKeys.clear()\n return {\n type: 'fallback',\n reason: 'maxPatchKeys',\n debug: {\n mode: 'diff',\n reason: 'maxPatchKeys',\n pendingPatchKeys: pendingCount,\n payloadKeys: 0,\n },\n }\n }\n\n const seen = new WeakMap<object, unknown>()\n const plainByPath = new Map<string, unknown>()\n const payload: SetDataPayload = Object.create(null) as SetDataPayload\n const patchEntriesRaw = [...pendingPatches.entries()]\n\n if (Number.isFinite(elevateTopKeyThreshold) && elevateTopKeyThreshold > 0) {\n const counts = new Map<string, number>()\n for (const [path] of patchEntriesRaw) {\n const top = path.split('.', 1)[0]!\n counts.set(top, (counts.get(top) ?? 0) + 1)\n }\n for (const [top, count] of counts) {\n if (count >= elevateTopKeyThreshold) {\n fallbackTopKeys.add(top)\n }\n }\n }\n\n const patchEntries = patchEntriesRaw.filter(([path]) => {\n for (const topKey of fallbackTopKeys) {\n if (path === topKey || path.startsWith(`${topKey}.`)) {\n return false\n }\n }\n return true\n })\n const entryMap = new Map<string, PatchEntry>(patchEntries)\n pendingPatches.clear()\n\n const getStateValueByPath = (path: string) => {\n const segments = path.split('.').filter(Boolean)\n let current: unknown = state\n for (const segment of segments) {\n if (current == null || typeof current !== 'object') {\n return current\n }\n current = Reflect.get(current, segment)\n }\n return current\n }\n\n const getPlainByPath = (path: string) => {\n if (plainByPath.has(path)) {\n return plainByPath.get(path)\n }\n const value = normalizeSetDataValue(\n toPlain(getStateValueByPath(path), seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: path,\n }),\n )\n plainByPath.set(path, value)\n return value\n }\n\n if (fallbackTopKeys.size) {\n for (const topKey of fallbackTopKeys) {\n if (!shouldIncludeKey(topKey)) {\n continue\n }\n payload[topKey] = getPlainByPath(topKey)\n entryMap.set(topKey, { kind: 'property', op: 'set' })\n }\n fallbackTopKeys.clear()\n }\n\n for (const [path, entry] of patchEntries) {\n const effectiveOp = entry.kind === 'array' ? 'set' : entry.op\n payload[path] = effectiveOp === 'delete'\n ? null\n : getPlainByPath(path)\n }\n\n let computedDirtyProcessed = 0\n const computedUpdates: SetDataSnapshot = Object.create(null) as SetDataSnapshot\n if (includeComputed && dirtyComputedKeys.size) {\n const keys = [...dirtyComputedKeys]\n dirtyComputedKeys.clear()\n computedDirtyProcessed = keys.length\n for (const key of keys) {\n if (!shouldIncludeKey(key)) {\n continue\n }\n const nextValue = toPlain(computedRefs[key]!.value, seen, {\n cache: plainCache,\n cacheEligibility: plainCacheEligibility,\n maxDepth: toPlainMaxDepth,\n maxKeys: toPlainMaxKeys,\n includeFunctions,\n functionPaths,\n _path: key,\n })\n const prevValue = dispatchedComputedSnapshot[key]\n const equal = computedCompare === 'deep'\n ? isDeepEqualValue(prevValue, nextValue, computedCompareMaxDepth, { keys: computedCompareMaxKeys })\n : computedCompare === 'shallow'\n ? isShallowEqualValue(prevValue, nextValue)\n : Object.is(prevValue, nextValue)\n if (equal) {\n continue\n }\n payload[key] = normalizeSetDataValue(nextValue)\n computedUpdates[key] = cloneSnapshotValue(nextValue)\n }\n }\n\n let collapsedPayload = collapsePayload(payload)\n let mergedSiblingParents = 0\n if (mergeSiblingThreshold) {\n const mergedResult = mergeSiblingPayload({\n input: collapsedPayload,\n entryMap,\n getPlainByPath,\n mergeSiblingThreshold,\n mergeSiblingSkipArray,\n mergeSiblingMaxParentBytes,\n mergeSiblingMaxInflationRatio,\n })\n mergedSiblingParents = mergedResult.merged\n collapsedPayload = collapsePayload(mergedResult.out)\n }\n const sizeCheck = checkPayloadSize(collapsedPayload, maxPayloadBytes)\n const payloadKeys = Object.keys(collapsedPayload).length\n const debug: SetDataDebugInfo = {\n mode: sizeCheck.fallback ? 'diff' : 'patch',\n reason: sizeCheck.fallback ? 'maxPayloadBytes' : 'patch',\n pendingPatchKeys: patchEntries.length,\n payloadKeys,\n mergedSiblingParents: mergedSiblingParents || undefined,\n computedDirtyKeys: computedDirtyProcessed || undefined,\n estimatedBytes: sizeCheck.estimatedBytes,\n bytes: sizeCheck.bytes,\n }\n if (sizeCheck.fallback) {\n return {\n type: 'fallback',\n reason: 'maxPayloadBytes',\n debug,\n }\n }\n if (!payloadKeys) {\n return undefined\n }\n\n const snapshot: SetDataSnapshot = { ...dispatchedSnapshot }\n const clonedParents = new WeakSet<object>()\n for (const [path, value] of Object.entries(collapsedPayload)) {\n const entry = entryMap.get(path)\n applySnapshotUpdate(\n snapshot,\n path,\n value,\n entry?.kind === 'array' ? 'set' : (entry?.op ?? 'set'),\n { cloneValue: false, clonedParents },\n )\n }\n\n return {\n type: 'patch',\n payload: collapsedPayload,\n snapshot,\n computedUpdates: Object.keys(computedUpdates).length ? computedUpdates : undefined,\n debug,\n }\n}\n"],"mappings":"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"}
|
|
@@ -68,7 +68,7 @@ function checkPayloadSize(payload, maxPayloadBytes) {
|
|
|
68
68
|
estimatedBytes: estimated,
|
|
69
69
|
bytes
|
|
70
70
|
};
|
|
71
|
-
} catch
|
|
71
|
+
} catch {
|
|
72
72
|
return {
|
|
73
73
|
fallback: false,
|
|
74
74
|
estimatedBytes: estimated,
|
|
@@ -95,7 +95,6 @@ function mergeSiblingPayload(options) {
|
|
|
95
95
|
const groups = /* @__PURE__ */ new Map();
|
|
96
96
|
const hasDelete = /* @__PURE__ */ new Set();
|
|
97
97
|
for (const key of keys) {
|
|
98
|
-
var _groups$get;
|
|
99
98
|
const entry = entryMap.get(key);
|
|
100
99
|
if (!entry) continue;
|
|
101
100
|
if (input[key] === null || entry.op === "delete") {
|
|
@@ -106,7 +105,7 @@ function mergeSiblingPayload(options) {
|
|
|
106
105
|
const dot = key.lastIndexOf(".");
|
|
107
106
|
if (dot <= 0) continue;
|
|
108
107
|
const parent = key.slice(0, dot);
|
|
109
|
-
const list =
|
|
108
|
+
const list = groups.get(parent) ?? [];
|
|
110
109
|
list.push(key);
|
|
111
110
|
groups.set(parent, list);
|
|
112
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/payload.ts"],"sourcesContent":["import { hasOwn } from '../../../utils'\n\nexport function collapsePayload(input: Record<string, any>) {\n const keys = Object.keys(input).sort()\n if (keys.length <= 1) {\n return input\n }\n // 折叠后的 payload 会直接传给原生 setData,并可能被微信开发者工具热重载脚本递归遍历。\n // 这里不能使用 Object.create(null),否则运行时内部的 o.hasOwnProperty(...) 会抛错。\n const out: Record<string, any> = {}\n const prefixStack: string[] = []\n for (const key of keys) {\n while (prefixStack.length) {\n const prefix = prefixStack[prefixStack.length - 1]!\n if (key.startsWith(prefix)) {\n break\n }\n prefixStack.pop()\n }\n if (prefixStack.length) {\n continue\n }\n out[key] = input[key]\n prefixStack.push(`${key}.`)\n }\n return out\n}\n\nexport function estimateJsonSize(\n value: any,\n limit: number,\n seen: WeakSet<object>,\n): number {\n if (limit <= 0) {\n return limit + 1\n }\n if (value === null) {\n return 4\n }\n const t = typeof value\n if (t === 'string') {\n // 粗略估算:未计入转义开销;接近阈值时再用 JSON.stringify 校验\n return 2 + value.length\n }\n if (t === 'number') {\n return Number.isFinite(value) ? String(value).length : 4 // 空值占位\n }\n if (t === 'boolean') {\n return value ? 4 : 5\n }\n if (t === 'undefined' || t === 'function' || t === 'symbol') {\n return 4 // 空值占位\n }\n if (t !== 'object') {\n return 4\n }\n\n if (seen.has(value)) {\n return 4\n }\n seen.add(value)\n\n if (Array.isArray(value)) {\n let size = 2 // []\n for (let i = 0; i < value.length; i++) {\n if (i) {\n size += 1\n }\n size += estimateJsonSize(value[i], limit - size, seen)\n if (size > limit) {\n return size\n }\n }\n return size\n }\n\n let size = 2 // {}\n for (const [k, v] of Object.entries(value)) {\n if (size > 2) {\n size += 1\n }\n // 键名部分:\n size += 2 + k.length + 1\n size += estimateJsonSize(v, limit - size, seen)\n if (size > limit) {\n return size\n }\n }\n return size\n}\n\nexport function checkPayloadSize(payload: Record<string, any>, maxPayloadBytes: number) {\n if (maxPayloadBytes === Number.POSITIVE_INFINITY) {\n return { fallback: false as const, estimatedBytes: undefined as number | undefined, bytes: undefined as number | undefined }\n }\n const limit = maxPayloadBytes\n const keyCount = Object.keys(payload).length\n const estimated = estimateJsonSize(payload, limit + 1, new WeakSet())\n if (estimated > limit) {\n return { fallback: true as const, estimatedBytes: estimated, bytes: undefined }\n }\n // 接近阈值时再用 JSON.stringify 精确判断,避免低估导致未降级\n if (estimated >= limit * 0.85 && keyCount > 2) {\n try {\n const bytes = JSON.stringify(payload).length\n return { fallback: bytes > limit, estimatedBytes: estimated, bytes }\n }\n catch {\n return { fallback: false as const, estimatedBytes: estimated, bytes: undefined }\n }\n }\n return { fallback: false as const, estimatedBytes: estimated, bytes: undefined }\n}\n\nexport function mergeSiblingPayload(options: {\n input: Record<string, any>\n entryMap: Map<string, { kind: 'property' | 'array', op: 'set' | 'delete' }>\n getPlainByPath: (path: string) => any\n mergeSiblingThreshold: number\n mergeSiblingSkipArray: boolean\n mergeSiblingMaxParentBytes: number\n mergeSiblingMaxInflationRatio: number\n}) {\n const {\n input,\n entryMap,\n getPlainByPath,\n mergeSiblingThreshold,\n mergeSiblingSkipArray,\n mergeSiblingMaxParentBytes,\n mergeSiblingMaxInflationRatio,\n } = options\n\n if (!mergeSiblingThreshold) {\n return { out: input, merged: 0 }\n }\n\n const keys = Object.keys(input)\n if (keys.length < mergeSiblingThreshold) {\n return { out: input, merged: 0 }\n }\n\n const groups = new Map<string, string[]>()\n const hasDelete = new Set<string>()\n\n for (const key of keys) {\n const entry = entryMap.get(key)\n if (!entry) {\n continue\n }\n if (input[key] === null || entry.op === 'delete') {\n const dot = key.lastIndexOf('.')\n if (dot > 0) {\n hasDelete.add(key.slice(0, dot))\n }\n continue\n }\n const dot = key.lastIndexOf('.')\n if (dot <= 0) {\n continue\n }\n const parent = key.slice(0, dot)\n const list = groups.get(parent) ?? []\n list.push(key)\n groups.set(parent, list)\n }\n\n const parents = [...groups.entries()]\n .filter(([parent, list]) => list.length >= mergeSiblingThreshold && !hasDelete.has(parent))\n .sort((a, b) => b[0].split('.').length - a[0].split('.').length)\n\n if (!parents.length) {\n return { out: input, merged: 0 }\n }\n\n // mergeSiblingPayload 的输出仍然属于对外 payload,必须保持普通对象原型。\n // 后续如果为了“纯字典”语义改成 null-prototype,会重新引入热重载兼容性问题。\n const out: Record<string, any> = {}\n Object.assign(out, input)\n\n let merged = 0\n const valueSizeCache = new WeakMap<object, number>()\n const estimateValueSize = (value: any) => {\n if (value && typeof value === 'object') {\n const cached = valueSizeCache.get(value as object)\n if (cached !== undefined) {\n return cached\n }\n const size = estimateJsonSize(value, Number.POSITIVE_INFINITY, new WeakSet())\n valueSizeCache.set(value as object, size)\n return size\n }\n return estimateJsonSize(value, Number.POSITIVE_INFINITY, new WeakSet())\n }\n const estimateEntryBytes = (key: string, value: any) => {\n // 键名部分:\n return (2 + key.length + 1) + estimateValueSize(value)\n }\n\n for (const [parent, list] of parents) {\n if (hasOwn(out, parent)) {\n continue\n }\n const existingChildren = list.filter(k => hasOwn(out, k))\n if (existingChildren.length < mergeSiblingThreshold) {\n continue\n }\n const parentValue = getPlainByPath(parent)\n if (mergeSiblingSkipArray && Array.isArray(parentValue)) {\n continue\n }\n if (mergeSiblingMaxParentBytes !== Number.POSITIVE_INFINITY) {\n const parentBytes = estimateEntryBytes(parent, parentValue)\n if (parentBytes > mergeSiblingMaxParentBytes) {\n continue\n }\n }\n if (mergeSiblingMaxInflationRatio !== Number.POSITIVE_INFINITY) {\n let childBytes = 0\n for (const child of existingChildren) {\n childBytes += estimateEntryBytes(child, out[child])\n }\n const parentBytes = estimateEntryBytes(parent, parentValue)\n if (parentBytes > childBytes * mergeSiblingMaxInflationRatio) {\n continue\n }\n }\n out[parent] = parentValue\n for (const child of existingChildren) {\n delete out[child]\n }\n merged += 1\n }\n\n return { out, merged }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"payload.mjs","names":[],"sources":["../../../../../src/runtime/app/setData/payload.ts"],"sourcesContent":["import { hasOwn } from '../../../utils'\n\nexport function collapsePayload(input: Record<string, any>) {\n const keys = Object.keys(input).sort()\n if (keys.length <= 1) {\n return input\n }\n // 折叠后的 payload 会直接传给原生 setData,并可能被微信开发者工具热重载脚本递归遍历。\n // 这里不能使用 Object.create(null),否则运行时内部的 o.hasOwnProperty(...) 会抛错。\n const out: Record<string, any> = {}\n const prefixStack: string[] = []\n for (const key of keys) {\n while (prefixStack.length) {\n const prefix = prefixStack[prefixStack.length - 1]!\n if (key.startsWith(prefix)) {\n break\n }\n prefixStack.pop()\n }\n if (prefixStack.length) {\n continue\n }\n out[key] = input[key]\n prefixStack.push(`${key}.`)\n }\n return out\n}\n\nexport function estimateJsonSize(\n value: any,\n limit: number,\n seen: WeakSet<object>,\n): number {\n if (limit <= 0) {\n return limit + 1\n }\n if (value === null) {\n return 4\n }\n const t = typeof value\n if (t === 'string') {\n // 粗略估算:未计入转义开销;接近阈值时再用 JSON.stringify 校验\n return 2 + value.length\n }\n if (t === 'number') {\n return Number.isFinite(value) ? String(value).length : 4 // 空值占位\n }\n if (t === 'boolean') {\n return value ? 4 : 5\n }\n if (t === 'undefined' || t === 'function' || t === 'symbol') {\n return 4 // 空值占位\n }\n if (t !== 'object') {\n return 4\n }\n\n if (seen.has(value)) {\n return 4\n }\n seen.add(value)\n\n if (Array.isArray(value)) {\n let size = 2 // []\n for (let i = 0; i < value.length; i++) {\n if (i) {\n size += 1\n }\n size += estimateJsonSize(value[i], limit - size, seen)\n if (size > limit) {\n return size\n }\n }\n return size\n }\n\n let size = 2 // {}\n for (const [k, v] of Object.entries(value)) {\n if (size > 2) {\n size += 1\n }\n // 键名部分:\n size += 2 + k.length + 1\n size += estimateJsonSize(v, limit - size, seen)\n if (size > limit) {\n return size\n }\n }\n return size\n}\n\nexport function checkPayloadSize(payload: Record<string, any>, maxPayloadBytes: number) {\n if (maxPayloadBytes === Number.POSITIVE_INFINITY) {\n return { fallback: false as const, estimatedBytes: undefined as number | undefined, bytes: undefined as number | undefined }\n }\n const limit = maxPayloadBytes\n const keyCount = Object.keys(payload).length\n const estimated = estimateJsonSize(payload, limit + 1, new WeakSet())\n if (estimated > limit) {\n return { fallback: true as const, estimatedBytes: estimated, bytes: undefined }\n }\n // 接近阈值时再用 JSON.stringify 精确判断,避免低估导致未降级\n if (estimated >= limit * 0.85 && keyCount > 2) {\n try {\n const bytes = JSON.stringify(payload).length\n return { fallback: bytes > limit, estimatedBytes: estimated, bytes }\n }\n catch {\n return { fallback: false as const, estimatedBytes: estimated, bytes: undefined }\n }\n }\n return { fallback: false as const, estimatedBytes: estimated, bytes: undefined }\n}\n\nexport function mergeSiblingPayload(options: {\n input: Record<string, any>\n entryMap: Map<string, { kind: 'property' | 'array', op: 'set' | 'delete' }>\n getPlainByPath: (path: string) => any\n mergeSiblingThreshold: number\n mergeSiblingSkipArray: boolean\n mergeSiblingMaxParentBytes: number\n mergeSiblingMaxInflationRatio: number\n}) {\n const {\n input,\n entryMap,\n getPlainByPath,\n mergeSiblingThreshold,\n mergeSiblingSkipArray,\n mergeSiblingMaxParentBytes,\n mergeSiblingMaxInflationRatio,\n } = options\n\n if (!mergeSiblingThreshold) {\n return { out: input, merged: 0 }\n }\n\n const keys = Object.keys(input)\n if (keys.length < mergeSiblingThreshold) {\n return { out: input, merged: 0 }\n }\n\n const groups = new Map<string, string[]>()\n const hasDelete = new Set<string>()\n\n for (const key of keys) {\n const entry = entryMap.get(key)\n if (!entry) {\n continue\n }\n if (input[key] === null || entry.op === 'delete') {\n const dot = key.lastIndexOf('.')\n if (dot > 0) {\n hasDelete.add(key.slice(0, dot))\n }\n continue\n }\n const dot = key.lastIndexOf('.')\n if (dot <= 0) {\n continue\n }\n const parent = key.slice(0, dot)\n const list = groups.get(parent) ?? []\n list.push(key)\n groups.set(parent, list)\n }\n\n const parents = [...groups.entries()]\n .filter(([parent, list]) => list.length >= mergeSiblingThreshold && !hasDelete.has(parent))\n .sort((a, b) => b[0].split('.').length - a[0].split('.').length)\n\n if (!parents.length) {\n return { out: input, merged: 0 }\n }\n\n // mergeSiblingPayload 的输出仍然属于对外 payload,必须保持普通对象原型。\n // 后续如果为了“纯字典”语义改成 null-prototype,会重新引入热重载兼容性问题。\n const out: Record<string, any> = {}\n Object.assign(out, input)\n\n let merged = 0\n const valueSizeCache = new WeakMap<object, number>()\n const estimateValueSize = (value: any) => {\n if (value && typeof value === 'object') {\n const cached = valueSizeCache.get(value as object)\n if (cached !== undefined) {\n return cached\n }\n const size = estimateJsonSize(value, Number.POSITIVE_INFINITY, new WeakSet())\n valueSizeCache.set(value as object, size)\n return size\n }\n return estimateJsonSize(value, Number.POSITIVE_INFINITY, new WeakSet())\n }\n const estimateEntryBytes = (key: string, value: any) => {\n // 键名部分:\n return (2 + key.length + 1) + estimateValueSize(value)\n }\n\n for (const [parent, list] of parents) {\n if (hasOwn(out, parent)) {\n continue\n }\n const existingChildren = list.filter(k => hasOwn(out, k))\n if (existingChildren.length < mergeSiblingThreshold) {\n continue\n }\n const parentValue = getPlainByPath(parent)\n if (mergeSiblingSkipArray && Array.isArray(parentValue)) {\n continue\n }\n if (mergeSiblingMaxParentBytes !== Number.POSITIVE_INFINITY) {\n const parentBytes = estimateEntryBytes(parent, parentValue)\n if (parentBytes > mergeSiblingMaxParentBytes) {\n continue\n }\n }\n if (mergeSiblingMaxInflationRatio !== Number.POSITIVE_INFINITY) {\n let childBytes = 0\n for (const child of existingChildren) {\n childBytes += estimateEntryBytes(child, out[child])\n }\n const parentBytes = estimateEntryBytes(parent, parentValue)\n if (parentBytes > childBytes * mergeSiblingMaxInflationRatio) {\n continue\n }\n }\n out[parent] = parentValue\n for (const child of existingChildren) {\n delete out[child]\n }\n merged += 1\n }\n\n return { out, merged }\n}\n"],"mappings":"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"}
|
|
@@ -62,7 +62,7 @@ function createSetDataScheduler(options) {
|
|
|
62
62
|
}
|
|
63
63
|
return left.raw === right.raw && left.version === right.version;
|
|
64
64
|
};
|
|
65
|
-
const shouldIncludeSnapshotKey = (key) => shouldIncludeKey(key) && !
|
|
65
|
+
const shouldIncludeSnapshotKey = (key) => shouldIncludeKey(key) && !snapshotOmitKeys?.has(key);
|
|
66
66
|
if (initialSnapshot) {
|
|
67
67
|
for (const [key, value] of Object.entries(initialSnapshot)) if (shouldIncludeSnapshotKey(key)) initialSnapshotBaseline[key] = value;
|
|
68
68
|
}
|
|
@@ -102,7 +102,7 @@ function createSetDataScheduler(options) {
|
|
|
102
102
|
if (info.reason !== "commitFailure" && debugSampleRate < 1 && Math.random() > debugSampleRate) return;
|
|
103
103
|
let debugInfo = info;
|
|
104
104
|
if (bindingManifest) {
|
|
105
|
-
const paths = typeof pathSource === "function" ? pathSource() : pathSource
|
|
105
|
+
const paths = typeof pathSource === "function" ? pathSource() : pathSource ?? [];
|
|
106
106
|
const wholeSnapshotFallback = info.reason === "needsFullSnapshot" || info.reason === "maxPatchKeys" || info.reason === "maxPayloadBytes";
|
|
107
107
|
debugInfo = {
|
|
108
108
|
...info,
|
|
@@ -111,7 +111,7 @@ function createSetDataScheduler(options) {
|
|
|
111
111
|
}
|
|
112
112
|
try {
|
|
113
113
|
debug(debugInfo);
|
|
114
|
-
} catch
|
|
114
|
+
} catch {}
|
|
115
115
|
};
|
|
116
116
|
const commitTracker = createSetDataCommitTracker({
|
|
117
117
|
initialSnapshot: initialSnapshotBaseline,
|
|
@@ -128,9 +128,8 @@ function createSetDataScheduler(options) {
|
|
|
128
128
|
message: failure.error.message
|
|
129
129
|
});
|
|
130
130
|
try {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
} catch (_unused2) {}
|
|
131
|
+
currentAdapter.__wevu_reportSetDataError?.(failure.error);
|
|
132
|
+
} catch {}
|
|
134
133
|
}
|
|
135
134
|
});
|
|
136
135
|
const recordFlushForLoopWarning = (pendingPatchKeys = 0, pathSource) => {
|
|
@@ -232,9 +231,8 @@ function createSetDataScheduler(options) {
|
|
|
232
231
|
};
|
|
233
232
|
};
|
|
234
233
|
const runDiffUpdate = (reason = "diff", pendingPatchKeys = 0, onSnapshotPrepared) => {
|
|
235
|
-
var _diffCollection$snaps;
|
|
236
234
|
const diffCollection = setDataStrategy === "diff" ? collectDiffSnapshot() : void 0;
|
|
237
|
-
const snapshot =
|
|
235
|
+
const snapshot = diffCollection?.snapshot ?? collect();
|
|
238
236
|
const dispatchedSnapshot = commitTracker.state.dispatchedSnapshot;
|
|
239
237
|
const needsRecovery = commitTracker.state.needsFullSnapshot;
|
|
240
238
|
const payload = needsRecovery ? commitTracker.createFullPayload(snapshot) : diffCollection ? (() => {
|
|
@@ -245,7 +243,7 @@ function createSetDataScheduler(options) {
|
|
|
245
243
|
...fastDiff
|
|
246
244
|
};
|
|
247
245
|
})() : diffSnapshots(dispatchedSnapshot, snapshot);
|
|
248
|
-
onSnapshotPrepared
|
|
246
|
+
onSnapshotPrepared?.(snapshot);
|
|
249
247
|
const payloadKeys = Object.keys(payload).length;
|
|
250
248
|
if (!payloadKeys && !needsRecovery) return;
|
|
251
249
|
const effectiveReason = needsRecovery ? "needsFullSnapshot" : reason;
|