wevu 7.2.2 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +22 -17
- 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/scrollRestoration/adapters.d.mts +8 -0
- package/dist/dev/router/scrollRestoration/adapters.mjs +86 -0
- package/dist/dev/router/scrollRestoration/adapters.mjs.map +1 -0
- package/dist/dev/router/scrollRestoration/controller.d.mts +8 -0
- package/dist/dev/router/scrollRestoration/controller.mjs +148 -0
- package/dist/dev/router/scrollRestoration/controller.mjs.map +1 -0
- package/dist/dev/router/scrollRestoration/host.d.mts +3 -0
- package/dist/dev/router/scrollRestoration/host.mjs +76 -0
- package/dist/dev/router/scrollRestoration/host.mjs.map +1 -0
- package/dist/dev/router/scrollRestoration/index.d.mts +9 -0
- package/dist/dev/router/scrollRestoration/index.mjs +156 -0
- package/dist/dev/router/scrollRestoration/index.mjs.map +1 -0
- package/dist/dev/router/scrollRestoration/types.d.mts +61 -0
- package/dist/dev/router/useRoute.mjs +12 -19
- package/dist/dev/router/useRoute.mjs.map +1 -1
- package/dist/dev/router.d.mts +5 -1
- package/dist/dev/router.mjs +4 -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 +20 -43
- package/dist/dev/runtime/hooks/base.mjs.map +1 -1
- package/dist/dev/runtime/hooks/pageScroll.mjs +41 -0
- package/dist/dev/runtime/hooks/pageScroll.mjs.map +1 -0
- package/dist/dev/runtime/hooks/register.mjs +2 -1
- package/dist/dev/runtime/hooks/register.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/optionalHooks.mjs +2 -5
- package/dist/dev/runtime/register/component/lifecycle/optionalHooks.mjs.map +1 -1
- package/dist/dev/runtime/register/component/lifecycle/platform.mjs +13 -26
- 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 +21 -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 +13 -15
- 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/scrollRestoration/adapters.d.mts +7 -0
- package/dist/router/scrollRestoration/adapters.mjs +1 -0
- package/dist/router/scrollRestoration/controller.d.mts +7 -0
- package/dist/router/scrollRestoration/controller.mjs +1 -0
- package/dist/router/scrollRestoration/host.d.mts +3 -0
- package/dist/router/scrollRestoration/host.mjs +1 -0
- package/dist/router/scrollRestoration/index.d.mts +8 -0
- package/dist/router/scrollRestoration/index.mjs +1 -0
- package/dist/router/scrollRestoration/types.d.mts +60 -0
- package/dist/router/useRoute.mjs +1 -1
- package/dist/router.d.mts +5 -1
- package/dist/router.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/hooks/pageScroll.mjs +1 -0
- package/dist/runtime/hooks/register.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/optionalHooks.mjs +1 -1
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.mjs","names":[],"sources":["../../../src/reactivity/reactive.ts"],"sourcesContent":["import type { MutationKind, MutationOp } from './reactive/mutation'\nimport { batch, track, trigger } from './core'\nimport { mutationRecorders } from './reactive/mutation'\nimport {\n adoptReactiveRoot,\n bumpAncestorVersions,\n bumpRawVersion,\n getRawVersion,\n rawMultiParentSet,\n rawParentsMap,\n rawPathMap,\n rawRootMap,\n rawVersionMap,\n recordParentLink,\n removeParentLink,\n resolvePathToTarget,\n} from './reactive/patchState'\nimport { getTargetType, hasOwn, isArrayIndexKey, isObject, ReactiveFlags, TargetType, toRaw, VERSION_KEY } from './reactive/shared'\nimport { rawMap, reactiveMap } from './reactive/state'\n\nexport { addMutationRecorder, removeMutationRecorder } from './reactive/mutation'\nexport type { MutationKind, MutationOp, MutationRecord } from './reactive/mutation'\nexport type { PrelinkReactiveTreeOptions } from './reactive/patch'\nexport { clearPatchIndices, prelinkReactiveTree, touchReactive } from './reactive/patch'\nexport { isShallowReactive, shallowReactive } from './reactive/shallow'\nexport { isObject, ReactiveFlags, toRaw } from './reactive/shared'\n\n/**\n * 读取响应式版本号(框架内部调试能力)。\n * @internal\n */\nexport function getReactiveVersion(target: object) {\n const raw = toRaw(target as any) as object\n return getRawVersion(raw)\n}\n\nfunction emitMutation(target: object, key: PropertyKey, op: MutationOp) {\n if (!mutationRecorders.size) {\n return\n }\n if (typeof key !== 'string') {\n return\n }\n if (key.startsWith('__r_')) {\n return\n }\n const root = rawRootMap.get(target) ?? target\n const isArray = Array.isArray(target)\n const kind: MutationKind = isArray && (key === 'length' || isArrayIndexKey(key)) ? 'array' : 'property'\n\n const baseSegments = resolvePathToTarget(root, target)\n if (!baseSegments) {\n // 路径不唯一/无法解析:尝试从父引用收集可能的顶层 key,供 patch 模式做“局部回退”。\n const fallback = new Set<string>()\n const parents = rawParentsMap.get(target)\n if (parents) {\n for (const [parent, keys] of parents) {\n const parentPath = rawPathMap.get(parent)\n const topFromParentPath = parentPath ? parentPath.split('.', 1)[0] : undefined\n const topFromResolve = !topFromParentPath\n ? (resolvePathToTarget(root, parent)?.[0] as string | undefined)\n : undefined\n for (const k of keys) {\n if (typeof k !== 'string') {\n continue\n }\n fallback.add(topFromParentPath ?? topFromResolve ?? k)\n }\n }\n }\n else {\n // 若目标就是 root 的直接子属性(未记录 parent link),仍可用 key 作为顶层回退\n fallback.add(key)\n }\n for (const recorder of mutationRecorders) {\n recorder({ root, kind, op, path: undefined, fallbackTopKeys: fallback.size ? [...fallback] : undefined })\n }\n return\n }\n\n // 若目标位于数组内部(例如 arr[0].x),直接回退到数组本身的路径,保持“数组整体替换”的策略。\n const arrayIndexPos = baseSegments.findIndex(seg => isArrayIndexKey(seg))\n if (arrayIndexPos !== -1) {\n const arrayPath = baseSegments.slice(0, arrayIndexPos).join('.')\n const path = arrayPath || undefined\n for (const recorder of mutationRecorders) {\n recorder({ root, kind: 'array', op, path })\n }\n return\n }\n\n const basePath = baseSegments.length ? baseSegments.join('.') : ''\n const path = kind === 'array' ? (basePath || undefined) : (basePath ? `${basePath}.${key}` : (key as string))\n\n for (const recorder of mutationRecorders) {\n recorder({\n root,\n kind,\n op,\n path,\n })\n }\n}\n\nconst mutableHandlers: ProxyHandler<any> = {\n get(target, key, receiver) {\n if (key === ReactiveFlags.IS_REACTIVE) {\n return true\n }\n if (key === ReactiveFlags.RAW) {\n return target\n }\n const res = Reflect.get(target, key, receiver)\n track(target, key)\n if (isObject(res)) {\n // 检查返回值是否被 markRaw 标记为跳过响应式\n if ((res as any)[ReactiveFlags.SKIP]) {\n return res\n }\n // 确保子对象的根引用与当前目标一致,便于版本号级联\n const childRaw = ((res as any)?.[ReactiveFlags.RAW] ?? res) as object\n adoptReactiveRoot(childRaw, target)\n recordParentLink(childRaw, target, key)\n const parentPath = rawPathMap.get(target)\n if (mutationRecorders.size && typeof key === 'string' && parentPath != null && !rawMultiParentSet.has(childRaw)) {\n const nextPath = parentPath ? `${parentPath}.${key}` : key\n rawPathMap.set(childRaw, nextPath)\n }\n // eslint-disable-next-line ts/no-use-before-define -- 避免递归调用的顺序警告\n return reactive(res)\n }\n return res\n },\n set(target, key, value, receiver) {\n const hadKey = hasOwn(target, key)\n const isArr = Array.isArray(target)\n const oldLength = isArr ? target.length : 0\n const oldValue = Reflect.get(target, key, receiver)\n const oldRawValue = isObject(oldValue) ? toRaw(oldValue) : oldValue\n const rawValue = isObject(value) ? toRaw(value) : value\n if (Object.is(oldRawValue, rawValue)) {\n return true\n }\n const result = Reflect.set(target, key, value, receiver)\n if (result) {\n const oldRaw = isObject(oldRawValue) ? oldRawValue as object : undefined\n if (oldRaw) {\n removeParentLink(oldRaw, target, key)\n }\n if (isObject(rawValue) && !(rawValue as any)[ReactiveFlags.SKIP]) {\n const childRaw = rawValue as object\n adoptReactiveRoot(childRaw, target)\n recordParentLink(childRaw, target, key)\n const parentPath = rawPathMap.get(target)\n if (mutationRecorders.size && typeof key === 'string' && parentPath != null && !rawMultiParentSet.has(childRaw)) {\n const nextPath = parentPath ? `${parentPath}.${key}` : key\n rawPathMap.set(childRaw, nextPath)\n }\n }\n batch(() => {\n trigger(target, key)\n if (isArr && typeof key === 'string' && isArrayIndexKey(key) && Number(key) >= oldLength) {\n trigger(target, 'length')\n }\n // 任意写操作都提升通用版本号\n trigger(target, VERSION_KEY)\n bumpRawVersion(target)\n bumpAncestorVersions(target)\n const root = rawRootMap.get(target)\n if (root && root !== target) {\n trigger(root, VERSION_KEY)\n bumpRawVersion(root)\n }\n if (!hadKey) {\n trigger(target, Symbol.iterator)\n }\n })\n emitMutation(target, key, 'set')\n }\n return result\n },\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key)\n const oldValue = hadKey ? (target as any)[key] : undefined\n const result = Reflect.deleteProperty(target, key)\n if (hadKey && result) {\n const oldRaw = isObject(oldValue) ? (((oldValue as any)?.[ReactiveFlags.RAW] ?? oldValue) as object) : undefined\n if (oldRaw) {\n removeParentLink(oldRaw, target, key)\n }\n batch(() => {\n trigger(target, key)\n // 删除同样提升通用版本号\n trigger(target, VERSION_KEY)\n bumpRawVersion(target)\n bumpAncestorVersions(target)\n const root = rawRootMap.get(target)\n if (root && root !== target) {\n trigger(root, VERSION_KEY)\n bumpRawVersion(root)\n }\n trigger(target, Symbol.iterator)\n })\n emitMutation(target, key, 'delete')\n }\n return result\n },\n ownKeys(target) {\n track(target, Symbol.iterator)\n // 遍历时也订阅通用版本号,确保新增/删除键可触发\n track(target, VERSION_KEY)\n return Reflect.ownKeys(target)\n },\n}\n\nexport function reactive<T extends object>(target: T): T {\n if (!isObject(target)) {\n return target\n }\n if ((target as any)[ReactiveFlags.IS_REACTIVE]) {\n return target\n }\n const existingProxy = reactiveMap.get(target)\n if (existingProxy) {\n return existingProxy\n }\n if (getTargetType(target) === TargetType.INVALID) {\n return target\n }\n const proxy = new Proxy(target, mutableHandlers)\n reactiveMap.set(target, proxy)\n rawMap.set(proxy, target)\n if (!rawVersionMap.has(target)) {\n rawVersionMap.set(target, 0)\n }\n // 新的原始对象在被观察时初始化根节点映射\n if (!rawRootMap.has(target)) {\n rawRootMap.set(target, target)\n }\n return proxy\n}\n\nexport function isReactive(value: unknown): boolean {\n return Boolean(value && (value as any)[ReactiveFlags.IS_REACTIVE])\n}\n\nexport function convertToReactive<T>(value: T): T {\n return isObject(value) ? reactive(value as any) : value\n}\n\n// ============================================================================\n// 标记对象跳过响应式转换(markRaw)\n// ============================================================================\n\n/**\n * 标记对象为“原始”状态,后续不会被转换为响应式,返回原对象本身。\n *\n * @param value 需要标记的对象\n * @returns 带有跳过标记的原对象\n *\n * @example\n * ```ts\n * const foo = markRaw({\n * nested: {}\n * })\n *\n * const state = reactive({\n * foo\n * })\n *\n * state.foo // 不是响应式对象\n * ```\n */\nexport function markRaw<T extends object>(value: T): T {\n if (!isObject(value)) {\n return value\n }\n Object.defineProperty(value, ReactiveFlags.SKIP, {\n value: true,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n return value\n}\n\n/**\n * 判断某个值是否被标记为原始(即不应转换为响应式)。\n *\n * @param value 待检测的值\n * @returns 若含有跳过标记则返回 true\n */\nexport function isRaw(value: unknown): boolean {\n return isObject(value) && ReactiveFlags.SKIP in (value as object)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactive.mjs","names":[],"sources":["../../../src/reactivity/reactive.ts"],"sourcesContent":["import type { MutationKind, MutationOp } from './reactive/mutation'\nimport { batch, track, trigger } from './core'\nimport { mutationRecorders } from './reactive/mutation'\nimport {\n adoptReactiveRoot,\n bumpAncestorVersions,\n bumpRawVersion,\n getRawVersion,\n rawMultiParentSet,\n rawParentsMap,\n rawPathMap,\n rawRootMap,\n rawVersionMap,\n recordParentLink,\n removeParentLink,\n resolvePathToTarget,\n} from './reactive/patchState'\nimport { getTargetType, hasOwn, isArrayIndexKey, isObject, ReactiveFlags, TargetType, toRaw, VERSION_KEY } from './reactive/shared'\nimport { rawMap, reactiveMap } from './reactive/state'\n\nexport { addMutationRecorder, removeMutationRecorder } from './reactive/mutation'\nexport type { MutationKind, MutationOp, MutationRecord } from './reactive/mutation'\nexport type { PrelinkReactiveTreeOptions } from './reactive/patch'\nexport { clearPatchIndices, prelinkReactiveTree, touchReactive } from './reactive/patch'\nexport { isShallowReactive, shallowReactive } from './reactive/shallow'\nexport { isObject, ReactiveFlags, toRaw } from './reactive/shared'\n\n/**\n * 读取响应式版本号(框架内部调试能力)。\n * @internal\n */\nexport function getReactiveVersion(target: object) {\n const raw = toRaw(target as any) as object\n return getRawVersion(raw)\n}\n\nfunction emitMutation(target: object, key: PropertyKey, op: MutationOp) {\n if (!mutationRecorders.size) {\n return\n }\n if (typeof key !== 'string') {\n return\n }\n if (key.startsWith('__r_')) {\n return\n }\n const root = rawRootMap.get(target) ?? target\n const isArray = Array.isArray(target)\n const kind: MutationKind = isArray && (key === 'length' || isArrayIndexKey(key)) ? 'array' : 'property'\n\n const baseSegments = resolvePathToTarget(root, target)\n if (!baseSegments) {\n // 路径不唯一/无法解析:尝试从父引用收集可能的顶层 key,供 patch 模式做“局部回退”。\n const fallback = new Set<string>()\n const parents = rawParentsMap.get(target)\n if (parents) {\n for (const [parent, keys] of parents) {\n const parentPath = rawPathMap.get(parent)\n const topFromParentPath = parentPath ? parentPath.split('.', 1)[0] : undefined\n const topFromResolve = !topFromParentPath\n ? (resolvePathToTarget(root, parent)?.[0] as string | undefined)\n : undefined\n for (const k of keys) {\n if (typeof k !== 'string') {\n continue\n }\n fallback.add(topFromParentPath ?? topFromResolve ?? k)\n }\n }\n }\n else {\n // 若目标就是 root 的直接子属性(未记录 parent link),仍可用 key 作为顶层回退\n fallback.add(key)\n }\n for (const recorder of mutationRecorders) {\n recorder({ root, kind, op, path: undefined, fallbackTopKeys: fallback.size ? [...fallback] : undefined })\n }\n return\n }\n\n // 若目标位于数组内部(例如 arr[0].x),直接回退到数组本身的路径,保持“数组整体替换”的策略。\n const arrayIndexPos = baseSegments.findIndex(seg => isArrayIndexKey(seg))\n if (arrayIndexPos !== -1) {\n const arrayPath = baseSegments.slice(0, arrayIndexPos).join('.')\n const path = arrayPath || undefined\n for (const recorder of mutationRecorders) {\n recorder({ root, kind: 'array', op, path })\n }\n return\n }\n\n const basePath = baseSegments.length ? baseSegments.join('.') : ''\n const path = kind === 'array' ? (basePath || undefined) : (basePath ? `${basePath}.${key}` : (key as string))\n\n for (const recorder of mutationRecorders) {\n recorder({\n root,\n kind,\n op,\n path,\n })\n }\n}\n\nconst mutableHandlers: ProxyHandler<any> = {\n get(target, key, receiver) {\n if (key === ReactiveFlags.IS_REACTIVE) {\n return true\n }\n if (key === ReactiveFlags.RAW) {\n return target\n }\n const res = Reflect.get(target, key, receiver)\n track(target, key)\n if (isObject(res)) {\n // 检查返回值是否被 markRaw 标记为跳过响应式\n if ((res as any)[ReactiveFlags.SKIP]) {\n return res\n }\n // 确保子对象的根引用与当前目标一致,便于版本号级联\n const childRaw = ((res as any)?.[ReactiveFlags.RAW] ?? res) as object\n adoptReactiveRoot(childRaw, target)\n recordParentLink(childRaw, target, key)\n const parentPath = rawPathMap.get(target)\n if (mutationRecorders.size && typeof key === 'string' && parentPath != null && !rawMultiParentSet.has(childRaw)) {\n const nextPath = parentPath ? `${parentPath}.${key}` : key\n rawPathMap.set(childRaw, nextPath)\n }\n // eslint-disable-next-line ts/no-use-before-define -- 避免递归调用的顺序警告\n return reactive(res)\n }\n return res\n },\n set(target, key, value, receiver) {\n const hadKey = hasOwn(target, key)\n const isArr = Array.isArray(target)\n const oldLength = isArr ? target.length : 0\n const oldValue = Reflect.get(target, key, receiver)\n const oldRawValue = isObject(oldValue) ? toRaw(oldValue) : oldValue\n const rawValue = isObject(value) ? toRaw(value) : value\n if (Object.is(oldRawValue, rawValue)) {\n return true\n }\n const result = Reflect.set(target, key, value, receiver)\n if (result) {\n const oldRaw = isObject(oldRawValue) ? oldRawValue as object : undefined\n if (oldRaw) {\n removeParentLink(oldRaw, target, key)\n }\n if (isObject(rawValue) && !(rawValue as any)[ReactiveFlags.SKIP]) {\n const childRaw = rawValue as object\n adoptReactiveRoot(childRaw, target)\n recordParentLink(childRaw, target, key)\n const parentPath = rawPathMap.get(target)\n if (mutationRecorders.size && typeof key === 'string' && parentPath != null && !rawMultiParentSet.has(childRaw)) {\n const nextPath = parentPath ? `${parentPath}.${key}` : key\n rawPathMap.set(childRaw, nextPath)\n }\n }\n batch(() => {\n trigger(target, key)\n if (isArr && typeof key === 'string' && isArrayIndexKey(key) && Number(key) >= oldLength) {\n trigger(target, 'length')\n }\n // 任意写操作都提升通用版本号\n trigger(target, VERSION_KEY)\n bumpRawVersion(target)\n bumpAncestorVersions(target)\n const root = rawRootMap.get(target)\n if (root && root !== target) {\n trigger(root, VERSION_KEY)\n bumpRawVersion(root)\n }\n if (!hadKey) {\n trigger(target, Symbol.iterator)\n }\n })\n emitMutation(target, key, 'set')\n }\n return result\n },\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key)\n const oldValue = hadKey ? (target as any)[key] : undefined\n const result = Reflect.deleteProperty(target, key)\n if (hadKey && result) {\n const oldRaw = isObject(oldValue) ? (((oldValue as any)?.[ReactiveFlags.RAW] ?? oldValue) as object) : undefined\n if (oldRaw) {\n removeParentLink(oldRaw, target, key)\n }\n batch(() => {\n trigger(target, key)\n // 删除同样提升通用版本号\n trigger(target, VERSION_KEY)\n bumpRawVersion(target)\n bumpAncestorVersions(target)\n const root = rawRootMap.get(target)\n if (root && root !== target) {\n trigger(root, VERSION_KEY)\n bumpRawVersion(root)\n }\n trigger(target, Symbol.iterator)\n })\n emitMutation(target, key, 'delete')\n }\n return result\n },\n ownKeys(target) {\n track(target, Symbol.iterator)\n // 遍历时也订阅通用版本号,确保新增/删除键可触发\n track(target, VERSION_KEY)\n return Reflect.ownKeys(target)\n },\n}\n\nexport function reactive<T extends object>(target: T): T {\n if (!isObject(target)) {\n return target\n }\n if ((target as any)[ReactiveFlags.IS_REACTIVE]) {\n return target\n }\n const existingProxy = reactiveMap.get(target)\n if (existingProxy) {\n return existingProxy\n }\n if (getTargetType(target) === TargetType.INVALID) {\n return target\n }\n const proxy = new Proxy(target, mutableHandlers)\n reactiveMap.set(target, proxy)\n rawMap.set(proxy, target)\n if (!rawVersionMap.has(target)) {\n rawVersionMap.set(target, 0)\n }\n // 新的原始对象在被观察时初始化根节点映射\n if (!rawRootMap.has(target)) {\n rawRootMap.set(target, target)\n }\n return proxy\n}\n\nexport function isReactive(value: unknown): boolean {\n return Boolean(value && (value as any)[ReactiveFlags.IS_REACTIVE])\n}\n\nexport function convertToReactive<T>(value: T): T {\n return isObject(value) ? reactive(value as any) : value\n}\n\n// ============================================================================\n// 标记对象跳过响应式转换(markRaw)\n// ============================================================================\n\n/**\n * 标记对象为“原始”状态,后续不会被转换为响应式,返回原对象本身。\n *\n * @param value 需要标记的对象\n * @returns 带有跳过标记的原对象\n *\n * @example\n * ```ts\n * const foo = markRaw({\n * nested: {}\n * })\n *\n * const state = reactive({\n * foo\n * })\n *\n * state.foo // 不是响应式对象\n * ```\n */\nexport function markRaw<T extends object>(value: T): T {\n if (!isObject(value)) {\n return value\n }\n Object.defineProperty(value, ReactiveFlags.SKIP, {\n value: true,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n return value\n}\n\n/**\n * 判断某个值是否被标记为原始(即不应转换为响应式)。\n *\n * @param value 待检测的值\n * @returns 若含有跳过标记则返回 true\n */\nexport function isRaw(value: unknown): boolean {\n return isObject(value) && ReactiveFlags.SKIP in (value as object)\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import _defineProperty from "../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import _defineProperty from "../_virtual/_@oxc-project_runtime@0.151.0/helpers/esm/defineProperty.mjs";
|
|
2
2
|
import { trackEffects, triggerEffects } from "./core.mjs";
|
|
3
3
|
import { convertToReactive, markRaw } from "./reactive.mjs";
|
|
4
4
|
|
|
@@ -10,7 +10,7 @@ function markAsRef(target) {
|
|
|
10
10
|
value: true,
|
|
11
11
|
configurable: true
|
|
12
12
|
});
|
|
13
|
-
} catch
|
|
13
|
+
} catch {
|
|
14
14
|
target[RefFlag] = true;
|
|
15
15
|
}
|
|
16
16
|
return target;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.mjs","names":[],"sources":["../../../src/reactivity/ref.ts"],"sourcesContent":["import type { Ref as VueRef, ShallowRef as VueShallowRef } from '../vue-types'\nimport type { ComputedRef, WritableComputedRef } from './computed'\nimport type { Dep } from './core'\nimport { trackEffects, triggerEffects } from './core'\nimport { convertToReactive, markRaw } from './reactive'\n\n// 类型对齐 @vue/reactivity.Ref:\n// - 用于 Volar 模板自动解包(UnwrapRef 依赖 RefSymbol 品牌标记)。\n// - 运行时仍使用 wevu 自己的 ref 实现,不依赖 Vue。\nexport type Ref<T = any, S = T> = VueRef<T, S>\nexport type ShallowRef<T = any> = VueShallowRef<T>\nexport type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>\nexport type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T)\n\nexport const RefFlag = '__v_isRef' as const\n\nexport function markAsRef<T extends object>(target: T): T {\n try {\n Object.defineProperty(target, RefFlag, {\n value: true,\n configurable: true,\n })\n }\n catch {\n ;(target as any)[RefFlag] = true\n }\n return target\n}\n\nexport function isRef(value: unknown): value is Ref<any> {\n return Boolean(value && typeof value === 'object' && (value as any)[RefFlag] === true)\n}\n\nclass RefImpl<T> {\n private _value: T\n private _rawValue: T\n public dep: Dep | undefined\n constructor(value: T) {\n markAsRef(this)\n this._rawValue = value\n this._value = convertToReactive(value)\n }\n\n get value(): T {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n return this._value\n }\n\n set value(newValue: T) {\n if (!Object.is(newValue, this._rawValue)) {\n this._rawValue = newValue\n this._value = convertToReactive(newValue)\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n }\n}\n\nexport function ref<T = any>(): Ref<T | undefined>\nexport function ref<T>(value: T): Ref<T>\nexport function ref<T>(value?: T): Ref<T | undefined> {\n if (isRef(value)) {\n return value\n }\n return markRaw(new RefImpl(value as T | undefined)) as any\n}\n\nexport function unref<T>(value: MaybeRef<T> | ComputedRef<T>): T {\n return isRef(value) ? value.value : value\n}\n\nexport function toValue<T>(source: MaybeRefOrGetter<T>): T {\n return typeof source === 'function' ? (source as () => T)() : unref(source)\n}\n\n/**\n * 自定义 ref 工厂:用于创建可显式控制 track/trigger 的自定义 ref\n */\nexport type CustomRefFactory<T> = (\n track: () => void,\n trigger: () => void,\n) => {\n get: () => T\n set: (value: T) => void\n}\n\nexport interface CustomRefOptions<T> {\n get: () => T\n set: (value: T) => void\n}\n\nexport type CustomRefSource<T> = CustomRefFactory<T> | CustomRefOptions<T>\n\nclass CustomRefImpl<T> {\n private _getValue: () => T\n private _setValue: (value: T) => void\n public dep: Dep | undefined\n\n constructor(factory: CustomRefSource<T>, defaultValue?: T) {\n markAsRef(this)\n const fallbackValue = defaultValue\n const track = () => {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n }\n const trigger = () => {\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n\n const withFallback = (value: T) => (value === undefined && fallbackValue !== undefined ? fallbackValue as T : value)\n\n if (typeof factory === 'function') {\n const handlers = factory(track, trigger)\n this._getValue = () => withFallback(handlers.get())\n this._setValue = value => handlers.set(value)\n return\n }\n\n const handlers = factory\n this._getValue = () => {\n track()\n return withFallback(handlers.get())\n }\n this._setValue = (value: T) => {\n handlers.set(value)\n trigger()\n }\n }\n\n get value(): T {\n return this._getValue()\n }\n\n set value(newValue: T) {\n this._setValue(newValue)\n }\n}\n\nexport function customRef<T>(factory: CustomRefSource<T>, defaultValue?: T): Ref<T> {\n return markRaw(new CustomRefImpl(factory, defaultValue)) as any\n}\n"],"mappings":";;;;;AAcA,MAAa,UAAU;AAEvB,SAAgB,UAA4B,QAAc;CACxD,IAAI;EACF,OAAO,eAAe,QAAQ,SAAS;GACrC,OAAO;GACP,cAAc;EAChB,CAAC;CACH,
|
|
1
|
+
{"version":3,"file":"ref.mjs","names":[],"sources":["../../../src/reactivity/ref.ts"],"sourcesContent":["import type { Ref as VueRef, ShallowRef as VueShallowRef } from '../vue-types'\nimport type { ComputedRef, WritableComputedRef } from './computed'\nimport type { Dep } from './core'\nimport { trackEffects, triggerEffects } from './core'\nimport { convertToReactive, markRaw } from './reactive'\n\n// 类型对齐 @vue/reactivity.Ref:\n// - 用于 Volar 模板自动解包(UnwrapRef 依赖 RefSymbol 品牌标记)。\n// - 运行时仍使用 wevu 自己的 ref 实现,不依赖 Vue。\nexport type Ref<T = any, S = T> = VueRef<T, S>\nexport type ShallowRef<T = any> = VueShallowRef<T>\nexport type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>\nexport type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T)\n\nexport const RefFlag = '__v_isRef' as const\n\nexport function markAsRef<T extends object>(target: T): T {\n try {\n Object.defineProperty(target, RefFlag, {\n value: true,\n configurable: true,\n })\n }\n catch {\n ;(target as any)[RefFlag] = true\n }\n return target\n}\n\nexport function isRef(value: unknown): value is Ref<any> {\n return Boolean(value && typeof value === 'object' && (value as any)[RefFlag] === true)\n}\n\nclass RefImpl<T> {\n private _value: T\n private _rawValue: T\n public dep: Dep | undefined\n constructor(value: T) {\n markAsRef(this)\n this._rawValue = value\n this._value = convertToReactive(value)\n }\n\n get value(): T {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n return this._value\n }\n\n set value(newValue: T) {\n if (!Object.is(newValue, this._rawValue)) {\n this._rawValue = newValue\n this._value = convertToReactive(newValue)\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n }\n}\n\nexport function ref<T = any>(): Ref<T | undefined>\nexport function ref<T>(value: T): Ref<T>\nexport function ref<T>(value?: T): Ref<T | undefined> {\n if (isRef(value)) {\n return value\n }\n return markRaw(new RefImpl(value as T | undefined)) as any\n}\n\nexport function unref<T>(value: MaybeRef<T> | ComputedRef<T>): T {\n return isRef(value) ? value.value : value\n}\n\nexport function toValue<T>(source: MaybeRefOrGetter<T>): T {\n return typeof source === 'function' ? (source as () => T)() : unref(source)\n}\n\n/**\n * 自定义 ref 工厂:用于创建可显式控制 track/trigger 的自定义 ref\n */\nexport type CustomRefFactory<T> = (\n track: () => void,\n trigger: () => void,\n) => {\n get: () => T\n set: (value: T) => void\n}\n\nexport interface CustomRefOptions<T> {\n get: () => T\n set: (value: T) => void\n}\n\nexport type CustomRefSource<T> = CustomRefFactory<T> | CustomRefOptions<T>\n\nclass CustomRefImpl<T> {\n private _getValue: () => T\n private _setValue: (value: T) => void\n public dep: Dep | undefined\n\n constructor(factory: CustomRefSource<T>, defaultValue?: T) {\n markAsRef(this)\n const fallbackValue = defaultValue\n const track = () => {\n if (!this.dep) {\n this.dep = new Set()\n }\n trackEffects(this.dep)\n }\n const trigger = () => {\n if (this.dep) {\n triggerEffects(this.dep)\n }\n }\n\n const withFallback = (value: T) => (value === undefined && fallbackValue !== undefined ? fallbackValue as T : value)\n\n if (typeof factory === 'function') {\n const handlers = factory(track, trigger)\n this._getValue = () => withFallback(handlers.get())\n this._setValue = value => handlers.set(value)\n return\n }\n\n const handlers = factory\n this._getValue = () => {\n track()\n return withFallback(handlers.get())\n }\n this._setValue = (value: T) => {\n handlers.set(value)\n trigger()\n }\n }\n\n get value(): T {\n return this._getValue()\n }\n\n set value(newValue: T) {\n this._setValue(newValue)\n }\n}\n\nexport function customRef<T>(factory: CustomRefSource<T>, defaultValue?: T): Ref<T> {\n return markRaw(new CustomRefImpl(factory, defaultValue)) as any\n}\n"],"mappings":";;;;;AAcA,MAAa,UAAU;AAEvB,SAAgB,UAA4B,QAAc;CACxD,IAAI;EACF,OAAO,eAAe,QAAQ,SAAS;GACrC,OAAO;GACP,cAAc;EAChB,CAAC;CACH,QACM;EACH,AAAC,OAAe,WAAW;CAC9B;CACA,OAAO;AACT;AAEA,SAAgB,MAAM,OAAmC;CACvD,OAAO,QAAQ,SAAS,OAAO,UAAU,YAAa,uBAA2B,IAAI;AACvF;AAEA,IAAM,UAAN,MAAiB;CAIf,YAAY,OAAU;wBAHd;wBACA;wBACD;EAEL,UAAU,IAAI;EACd,KAAK,YAAY;EACjB,KAAK,SAAS,kBAAkB,KAAK;CACvC;CAEA,IAAI,QAAW;EACb,IAAI,CAAC,KAAK,KACR,KAAK,sBAAM,IAAI,IAAI;EAErB,aAAa,KAAK,GAAG;EACrB,OAAO,KAAK;CACd;CAEA,IAAI,MAAM,UAAa;EACrB,IAAI,CAAC,OAAO,GAAG,UAAU,KAAK,SAAS,GAAG;GACxC,KAAK,YAAY;GACjB,KAAK,SAAS,kBAAkB,QAAQ;GACxC,IAAI,KAAK,KACP,eAAe,KAAK,GAAG;EAE3B;CACF;AACF;AAIA,SAAgB,IAAO,OAA+B;CACpD,IAAI,MAAM,KAAK,GACb,OAAO;CAET,OAAO,QAAQ,IAAI,QAAQ,KAAsB,CAAC;AACpD;AAEA,SAAgB,MAAS,OAAwC;CAC/D,OAAO,MAAM,KAAK,IAAI,MAAM,QAAQ;AACtC;AAEA,SAAgB,QAAW,QAAgC;CACzD,OAAO,OAAO,WAAW,aAAc,OAAmB,IAAI,MAAM,MAAM;AAC5E;AAoBA,IAAM,gBAAN,MAAuB;CAKrB,YAAY,SAA6B,cAAkB;wBAJnD;wBACA;wBACD;EAGL,UAAU,IAAI;EACd,MAAM,gBAAgB;EACtB,MAAM,cAAc;GAClB,IAAI,CAAC,KAAK,KACR,KAAK,sBAAM,IAAI,IAAI;GAErB,aAAa,KAAK,GAAG;EACvB;EACA,MAAM,gBAAgB;GACpB,IAAI,KAAK,KACP,eAAe,KAAK,GAAG;EAE3B;EAEA,MAAM,gBAAgB,UAAc,UAAU,UAAa,kBAAkB,SAAY,gBAAqB;EAE9G,IAAI,OAAO,YAAY,YAAY;GACjC,MAAM,WAAW,QAAQ,OAAO,OAAO;GACvC,KAAK,kBAAkB,aAAa,SAAS,IAAI,CAAC;GAClD,KAAK,aAAY,UAAS,SAAS,IAAI,KAAK;GAC5C;EACF;EAEA,MAAM,WAAW;EACjB,KAAK,kBAAkB;GACrB,MAAM;GACN,OAAO,aAAa,SAAS,IAAI,CAAC;EACpC;EACA,KAAK,aAAa,UAAa;GAC7B,SAAS,IAAI,KAAK;GAClB,QAAQ;EACV;CACF;CAEA,IAAI,QAAW;EACb,OAAO,KAAK,UAAU;CACxB;CAEA,IAAI,MAAM,UAAa;EACrB,KAAK,UAAU,QAAQ;CACzB;AACF;AAEA,SAAgB,UAAa,SAA6B,cAA0B;CAClF,OAAO,QAAQ,IAAI,cAAc,SAAS,YAAY,CAAC;AACzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shallowRef.mjs","names":[],"sources":["../../../src/reactivity/shallowRef.ts"],"sourcesContent":["import type { Ref } from './ref'\nimport { triggerEffects } from './core'\nimport { customRef, isRef } from './ref'\n\nconst ShallowRefFlag = '__v_isShallow' as const\n\nfunction markAsShallowRef<T extends object>(target: T): T {\n try {\n Object.defineProperty(target, ShallowRefFlag, {\n value: true,\n configurable: true,\n })\n }\n catch {\n ;(target as any)[ShallowRefFlag] = true\n }\n return target\n}\n\nexport function shallowRef<T>(value: T): Ref<T>\nexport function shallowRef<T>(value: T, defaultValue: T): Ref<T>\n/**\n * 创建一个“浅层” ref:它只在 .value 被整体替换时触发依赖,不会对内部对象做深层响应式处理。\n *\n * @param value 初始值\n * @param defaultValue 传递给 customRef 的默认值,可用于兜底\n * @returns 仅跟踪自身 .value 变更的浅层 ref\n *\n * @example\n * ```ts\n * const state = shallowRef({ count: 0 })\n * state.value = { count: 1 } // 会触发依赖\n * state.value.count++ // 不会触发依赖(内部属性未被深度代理)\n * ```\n */\nexport function shallowRef<T>(value: T, defaultValue?: T): Ref<T> {\n return markAsShallowRef(customRef<T>(\n (track, trigger) => ({\n get() {\n track()\n return value\n },\n set(newValue: T) {\n if (Object.is(value, newValue)) {\n return\n }\n value = newValue\n trigger()\n },\n }),\n defaultValue,\n )) as Ref<T>\n}\n\n/**\n * 判断传入值是否为浅层 ref。\n *\n * @param r 待判断的值\n * @returns 若为浅层 ref 则返回 true\n */\nexport function isShallowRef(r: any): r is Ref<any> {\n return isRef(r) && (r as unknown as Record<string, unknown>)[ShallowRefFlag] === true\n}\n\n/**\n * 主动触发一次浅层 ref 的更新(无需深度比较)。\n *\n * @param ref 需要触发的 ref\n */\nexport function triggerRef<T>(ref: Ref<T>) {\n // 若未来有专用 trigger 机制可替换,此处作为兼容 API 的占位实现\n if (isRef(ref)) {\n const dep = (ref as any).dep\n if (dep) {\n triggerEffects(dep)\n return\n }\n // 通过重新赋值自身触发依赖\n const value = ref.value\n ref.value = value\n }\n}\n"],"mappings":";;;;AAIA,MAAM,iBAAiB;AAEvB,SAAS,iBAAmC,QAAc;CACxD,IAAI;EACF,OAAO,eAAe,QAAQ,gBAAgB;GAC5C,OAAO;GACP,cAAc;EAChB,CAAC;CACH,
|
|
1
|
+
{"version":3,"file":"shallowRef.mjs","names":[],"sources":["../../../src/reactivity/shallowRef.ts"],"sourcesContent":["import type { Ref } from './ref'\nimport { triggerEffects } from './core'\nimport { customRef, isRef } from './ref'\n\nconst ShallowRefFlag = '__v_isShallow' as const\n\nfunction markAsShallowRef<T extends object>(target: T): T {\n try {\n Object.defineProperty(target, ShallowRefFlag, {\n value: true,\n configurable: true,\n })\n }\n catch {\n ;(target as any)[ShallowRefFlag] = true\n }\n return target\n}\n\nexport function shallowRef<T>(value: T): Ref<T>\nexport function shallowRef<T>(value: T, defaultValue: T): Ref<T>\n/**\n * 创建一个“浅层” ref:它只在 .value 被整体替换时触发依赖,不会对内部对象做深层响应式处理。\n *\n * @param value 初始值\n * @param defaultValue 传递给 customRef 的默认值,可用于兜底\n * @returns 仅跟踪自身 .value 变更的浅层 ref\n *\n * @example\n * ```ts\n * const state = shallowRef({ count: 0 })\n * state.value = { count: 1 } // 会触发依赖\n * state.value.count++ // 不会触发依赖(内部属性未被深度代理)\n * ```\n */\nexport function shallowRef<T>(value: T, defaultValue?: T): Ref<T> {\n return markAsShallowRef(customRef<T>(\n (track, trigger) => ({\n get() {\n track()\n return value\n },\n set(newValue: T) {\n if (Object.is(value, newValue)) {\n return\n }\n value = newValue\n trigger()\n },\n }),\n defaultValue,\n )) as Ref<T>\n}\n\n/**\n * 判断传入值是否为浅层 ref。\n *\n * @param r 待判断的值\n * @returns 若为浅层 ref 则返回 true\n */\nexport function isShallowRef(r: any): r is Ref<any> {\n return isRef(r) && (r as unknown as Record<string, unknown>)[ShallowRefFlag] === true\n}\n\n/**\n * 主动触发一次浅层 ref 的更新(无需深度比较)。\n *\n * @param ref 需要触发的 ref\n */\nexport function triggerRef<T>(ref: Ref<T>) {\n // 若未来有专用 trigger 机制可替换,此处作为兼容 API 的占位实现\n if (isRef(ref)) {\n const dep = (ref as any).dep\n if (dep) {\n triggerEffects(dep)\n return\n }\n // 通过重新赋值自身触发依赖\n const value = ref.value\n ref.value = value\n }\n}\n"],"mappings":";;;;AAIA,MAAM,iBAAiB;AAEvB,SAAS,iBAAmC,QAAc;CACxD,IAAI;EACF,OAAO,eAAe,QAAQ,gBAAgB;GAC5C,OAAO;GACP,cAAc;EAChB,CAAC;CACH,QACM;EACH,AAAC,OAAe,kBAAkB;CACrC;CACA,OAAO;AACT;;;;;;;;;;;;;;;AAkBA,SAAgB,WAAc,OAAU,cAA0B;CAChE,OAAO,iBAAiB,WACrB,OAAO,aAAa;EACnB,MAAM;GACJ,MAAM;GACN,OAAO;EACT;EACA,IAAI,UAAa;GACf,IAAI,OAAO,GAAG,OAAO,QAAQ,GAC3B;GAEF,QAAQ;GACR,QAAQ;EACV;CACF,IACA,YACF,CAAC;AACH;;;;;;;AAQA,SAAgB,aAAa,GAAuB;CAClD,OAAO,MAAM,CAAC,KAAM,EAAyC,oBAAoB;AACnF;;;;;;AAOA,SAAgB,WAAc,KAAa;CAEzC,IAAI,MAAM,GAAG,GAAG;EACd,MAAM,MAAO,IAAY;EACzB,IAAI,KAAK;GACP,eAAe,GAAG;GAClB;EACF;EAGA,IAAI,QADU,IAAI;CAEpB;AACF"}
|
|
@@ -36,7 +36,7 @@ function createWatchGetter(source) {
|
|
|
36
36
|
}
|
|
37
37
|
function applyDeepWatchGetter(getter, source, isMultiSource, isReactiveSource, deepOption) {
|
|
38
38
|
const deepDefault = isMultiSource ? source.some((item) => isReactive(item)) : isReactiveSource;
|
|
39
|
-
const deep = deepOption
|
|
39
|
+
const deep = deepOption ?? deepDefault;
|
|
40
40
|
if (!(deep === true || typeof deep === "number")) return getter;
|
|
41
41
|
const depth = typeof deep === "number" ? deep : deep ? Infinity : 0;
|
|
42
42
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/reactivity/watch/helpers.ts"],"sourcesContent":["import type { Ref } from '../ref'\nimport type { WatchScheduler, WatchSource, WatchSources } from './types'\nimport { nextTick } from '../../scheduler'\nimport { queueJob } from '../core'\nimport { isReactive, touchReactive } from '../reactive'\nimport { isRef } from '../ref'\nimport { isShallowRef } from '../shallowRef'\nimport { traverse } from '../traverse'\nimport { getDeepWatchStrategy } from './types'\n\ninterface WatchGetterContext {\n getter: () => any\n hasReactiveSource: boolean\n hasShallowSource: boolean\n isMultiSource: boolean\n isReactiveSource: boolean\n}\n\nfunction resolveWatchSource(item: WatchSource<any> | object) {\n if (typeof item === 'function') {\n return (item as () => any)()\n }\n if (isRef(item)) {\n return (item as Ref<any>).value\n }\n if (isReactive(item)) {\n return item\n }\n throw new Error('无效的 watch 源')\n}\n\nexport function createWatchGetter(source: WatchSources<any>): WatchGetterContext {\n const isMultiSource = Array.isArray(source)\n const isReactiveSource = !isMultiSource && isReactive(source)\n const hasReactiveSource = isMultiSource\n ? (source as ReadonlyArray<WatchSource<any> | object>).some(item => isReactive(item))\n : isReactiveSource\n const hasShallowSource = isMultiSource\n ? (source as ReadonlyArray<WatchSource<any> | object>).some(item => isShallowRef(item))\n : isShallowRef(source)\n let getter: () => any\n\n if (isMultiSource) {\n const sources = source as ReadonlyArray<WatchSource<any> | object>\n getter = () => sources.map(item => resolveWatchSource(item))\n }\n else if (typeof source === 'function') {\n getter = source as () => any\n }\n else if (isRef(source)) {\n getter = () => (source as Ref<any>).value\n }\n else if (isReactiveSource) {\n getter = () => source as any\n }\n else {\n throw new Error('无效的 watch 源')\n }\n\n return {\n getter,\n hasReactiveSource,\n hasShallowSource,\n isMultiSource,\n isReactiveSource,\n }\n}\n\nexport function applyDeepWatchGetter(\n getter: () => any,\n source: WatchSources<any>,\n isMultiSource: boolean,\n isReactiveSource: boolean,\n deepOption: boolean | number | undefined,\n) {\n const deepDefault = isMultiSource\n ? (source as ReadonlyArray<WatchSource<any> | object>).some(item => isReactive(item))\n : isReactiveSource\n const deep = deepOption ?? deepDefault\n const shouldDeep = deep === true || typeof deep === 'number'\n if (!shouldDeep) {\n return getter\n }\n const depth = typeof deep === 'number' ? deep : (deep ? Infinity : 0)\n return () => {\n const value = getter()\n const strategy = getDeepWatchStrategy()\n if (isMultiSource && Array.isArray(value)) {\n return value.map((item) => {\n if (strategy === 'version' && isReactive(item)) {\n touchReactive(item as any)\n return item\n }\n return traverse(item, depth)\n })\n }\n if (strategy === 'version' && isReactive(value)) {\n touchReactive(value as any)\n return value\n }\n return traverse(value, depth)\n }\n}\n\nexport function dispatchScheduledJob(\n job: () => void,\n flush: 'pre' | 'post' | 'sync',\n isFirstRun: boolean,\n scheduler?: WatchScheduler,\n) {\n if (scheduler) {\n scheduler(job, isFirstRun)\n return\n }\n if (flush === 'sync') {\n job()\n return\n }\n if (flush === 'post') {\n nextTick(() => queueJob(job))\n return\n }\n if (isFirstRun) {\n job()\n }\n else {\n queueJob(job)\n }\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAS,mBAAmB,MAAiC;CAC3D,IAAI,OAAO,SAAS,YAClB,OAAQ,KAAmB;CAE7B,IAAI,MAAM,IAAI,GACZ,OAAQ,KAAkB;CAE5B,IAAI,WAAW,IAAI,GACjB,OAAO;CAET,MAAM,IAAI,MAAM,aAAa;AAC/B;AAEA,SAAgB,kBAAkB,QAA+C;CAC/E,MAAM,gBAAgB,MAAM,QAAQ,MAAM;CAC1C,MAAM,mBAAmB,CAAC,iBAAiB,WAAW,MAAM;CAC5D,MAAM,oBAAoB,gBACrB,OAAoD,MAAK,SAAQ,WAAW,IAAI,CAAC,IAClF;CACJ,MAAM,mBAAmB,gBACpB,OAAoD,MAAK,SAAQ,aAAa,IAAI,CAAC,IACpF,aAAa,MAAM;CACvB,IAAI;CAEJ,IAAI,eAAe;EACjB,MAAM,UAAU;EAChB,eAAe,QAAQ,KAAI,SAAQ,mBAAmB,IAAI,CAAC;CAC7D,OACK,IAAI,OAAO,WAAW,YACzB,SAAS;MAEN,IAAI,MAAM,MAAM,GACnB,eAAgB,OAAoB;MAEjC,IAAI,kBACP,eAAe;MAGf,MAAM,IAAI,MAAM,aAAa;CAG/B,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,qBACd,QACA,QACA,eACA,kBACA,YACA;CACA,MAAM,cAAc,gBACf,OAAoD,MAAK,SAAQ,WAAW,IAAI,CAAC,IAClF;CACJ,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/reactivity/watch/helpers.ts"],"sourcesContent":["import type { Ref } from '../ref'\nimport type { WatchScheduler, WatchSource, WatchSources } from './types'\nimport { nextTick } from '../../scheduler'\nimport { queueJob } from '../core'\nimport { isReactive, touchReactive } from '../reactive'\nimport { isRef } from '../ref'\nimport { isShallowRef } from '../shallowRef'\nimport { traverse } from '../traverse'\nimport { getDeepWatchStrategy } from './types'\n\ninterface WatchGetterContext {\n getter: () => any\n hasReactiveSource: boolean\n hasShallowSource: boolean\n isMultiSource: boolean\n isReactiveSource: boolean\n}\n\nfunction resolveWatchSource(item: WatchSource<any> | object) {\n if (typeof item === 'function') {\n return (item as () => any)()\n }\n if (isRef(item)) {\n return (item as Ref<any>).value\n }\n if (isReactive(item)) {\n return item\n }\n throw new Error('无效的 watch 源')\n}\n\nexport function createWatchGetter(source: WatchSources<any>): WatchGetterContext {\n const isMultiSource = Array.isArray(source)\n const isReactiveSource = !isMultiSource && isReactive(source)\n const hasReactiveSource = isMultiSource\n ? (source as ReadonlyArray<WatchSource<any> | object>).some(item => isReactive(item))\n : isReactiveSource\n const hasShallowSource = isMultiSource\n ? (source as ReadonlyArray<WatchSource<any> | object>).some(item => isShallowRef(item))\n : isShallowRef(source)\n let getter: () => any\n\n if (isMultiSource) {\n const sources = source as ReadonlyArray<WatchSource<any> | object>\n getter = () => sources.map(item => resolveWatchSource(item))\n }\n else if (typeof source === 'function') {\n getter = source as () => any\n }\n else if (isRef(source)) {\n getter = () => (source as Ref<any>).value\n }\n else if (isReactiveSource) {\n getter = () => source as any\n }\n else {\n throw new Error('无效的 watch 源')\n }\n\n return {\n getter,\n hasReactiveSource,\n hasShallowSource,\n isMultiSource,\n isReactiveSource,\n }\n}\n\nexport function applyDeepWatchGetter(\n getter: () => any,\n source: WatchSources<any>,\n isMultiSource: boolean,\n isReactiveSource: boolean,\n deepOption: boolean | number | undefined,\n) {\n const deepDefault = isMultiSource\n ? (source as ReadonlyArray<WatchSource<any> | object>).some(item => isReactive(item))\n : isReactiveSource\n const deep = deepOption ?? deepDefault\n const shouldDeep = deep === true || typeof deep === 'number'\n if (!shouldDeep) {\n return getter\n }\n const depth = typeof deep === 'number' ? deep : (deep ? Infinity : 0)\n return () => {\n const value = getter()\n const strategy = getDeepWatchStrategy()\n if (isMultiSource && Array.isArray(value)) {\n return value.map((item) => {\n if (strategy === 'version' && isReactive(item)) {\n touchReactive(item as any)\n return item\n }\n return traverse(item, depth)\n })\n }\n if (strategy === 'version' && isReactive(value)) {\n touchReactive(value as any)\n return value\n }\n return traverse(value, depth)\n }\n}\n\nexport function dispatchScheduledJob(\n job: () => void,\n flush: 'pre' | 'post' | 'sync',\n isFirstRun: boolean,\n scheduler?: WatchScheduler,\n) {\n if (scheduler) {\n scheduler(job, isFirstRun)\n return\n }\n if (flush === 'sync') {\n job()\n return\n }\n if (flush === 'post') {\n nextTick(() => queueJob(job))\n return\n }\n if (isFirstRun) {\n job()\n }\n else {\n queueJob(job)\n }\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAS,mBAAmB,MAAiC;CAC3D,IAAI,OAAO,SAAS,YAClB,OAAQ,KAAmB;CAE7B,IAAI,MAAM,IAAI,GACZ,OAAQ,KAAkB;CAE5B,IAAI,WAAW,IAAI,GACjB,OAAO;CAET,MAAM,IAAI,MAAM,aAAa;AAC/B;AAEA,SAAgB,kBAAkB,QAA+C;CAC/E,MAAM,gBAAgB,MAAM,QAAQ,MAAM;CAC1C,MAAM,mBAAmB,CAAC,iBAAiB,WAAW,MAAM;CAC5D,MAAM,oBAAoB,gBACrB,OAAoD,MAAK,SAAQ,WAAW,IAAI,CAAC,IAClF;CACJ,MAAM,mBAAmB,gBACpB,OAAoD,MAAK,SAAQ,aAAa,IAAI,CAAC,IACpF,aAAa,MAAM;CACvB,IAAI;CAEJ,IAAI,eAAe;EACjB,MAAM,UAAU;EAChB,eAAe,QAAQ,KAAI,SAAQ,mBAAmB,IAAI,CAAC;CAC7D,OACK,IAAI,OAAO,WAAW,YACzB,SAAS;MAEN,IAAI,MAAM,MAAM,GACnB,eAAgB,OAAoB;MAEjC,IAAI,kBACP,eAAe;MAGf,MAAM,IAAI,MAAM,aAAa;CAG/B,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,qBACd,QACA,QACA,eACA,kBACA,YACA;CACA,MAAM,cAAc,gBACf,OAAoD,MAAK,SAAQ,WAAW,IAAI,CAAC,IAClF;CACJ,MAAM,OAAO,cAAc;CAE3B,IAAI,EADe,SAAS,QAAQ,OAAO,SAAS,WAElD,OAAO;CAET,MAAM,QAAQ,OAAO,SAAS,WAAW,OAAQ,OAAO,WAAW;CACnE,aAAa;EACX,MAAM,QAAQ,OAAO;EACrB,MAAM,WAAW,qBAAqB;EACtC,IAAI,iBAAiB,MAAM,QAAQ,KAAK,GACtC,OAAO,MAAM,KAAK,SAAS;GACzB,IAAI,aAAa,aAAa,WAAW,IAAI,GAAG;IAC9C,cAAc,IAAW;IACzB,OAAO;GACT;GACA,OAAO,SAAS,MAAM,KAAK;EAC7B,CAAC;EAEH,IAAI,aAAa,aAAa,WAAW,KAAK,GAAG;GAC/C,cAAc,KAAY;GAC1B,OAAO;EACT;EACA,OAAO,SAAS,OAAO,KAAK;CAC9B;AACF;AAEA,SAAgB,qBACd,KACA,OACA,YACA,WACA;CACA,IAAI,WAAW;EACb,UAAU,KAAK,UAAU;EACzB;CACF;CACA,IAAI,UAAU,QAAQ;EACpB,IAAI;EACJ;CACF;CACA,IAAI,UAAU,QAAQ;EACpB,eAAe,SAAS,GAAG,CAAC;EAC5B;CACF;CACA,IAAI,YACF,IAAI;MAGJ,SAAS,GAAG;AAEhB"}
|
|
@@ -5,7 +5,6 @@ import { applyDeepWatchGetter, createWatchGetter, dispatchScheduledJob } from ".
|
|
|
5
5
|
|
|
6
6
|
//#region src/reactivity/watch.ts
|
|
7
7
|
function watch(source, cb, options = {}) {
|
|
8
|
-
var _options$flush;
|
|
9
8
|
const ownerInstance = getCurrentInstance();
|
|
10
9
|
const watchGetterContext = createWatchGetter(source);
|
|
11
10
|
const getter = applyDeepWatchGetter(watchGetterContext.getter, source, watchGetterContext.isMultiSource, watchGetterContext.isReactiveSource, options.deep);
|
|
@@ -24,7 +23,7 @@ function watch(source, cb, options = {}) {
|
|
|
24
23
|
cb(value, oldVal, cleanupRegister);
|
|
25
24
|
stopHandle();
|
|
26
25
|
} : cb;
|
|
27
|
-
const flush =
|
|
26
|
+
const flush = options.flush ?? "pre";
|
|
28
27
|
const hasChanged = (newValue, previousValue) => {
|
|
29
28
|
if (!watchGetterContext.isMultiSource) return !Object.is(newValue, previousValue);
|
|
30
29
|
if (!Array.isArray(newValue) || !Array.isArray(previousValue)) return !Object.is(newValue, previousValue);
|
|
@@ -34,7 +33,7 @@ function watch(source, cb, options = {}) {
|
|
|
34
33
|
if (!runner.active || paused || token !== pauseToken) return;
|
|
35
34
|
const newValue = runner();
|
|
36
35
|
if (!force && !forceTrigger && !hasChanged(newValue, oldValue)) return;
|
|
37
|
-
cleanup
|
|
36
|
+
cleanup?.();
|
|
38
37
|
const previousInstance = getCurrentInstance();
|
|
39
38
|
setCurrentInstance(ownerInstance);
|
|
40
39
|
try {
|
|
@@ -57,7 +56,7 @@ function watch(source, cb, options = {}) {
|
|
|
57
56
|
lazy: true
|
|
58
57
|
});
|
|
59
58
|
const doStop = () => {
|
|
60
|
-
cleanup
|
|
59
|
+
cleanup?.();
|
|
61
60
|
cleanup = void 0;
|
|
62
61
|
stop(runner);
|
|
63
62
|
};
|
|
@@ -84,7 +83,6 @@ function watch(source, cb, options = {}) {
|
|
|
84
83
|
* 副作用会立即执行,并在依赖变化时重新运行。
|
|
85
84
|
*/
|
|
86
85
|
function watchEffect(effectFn, options = {}) {
|
|
87
|
-
var _options$flush2;
|
|
88
86
|
const ownerInstance = getCurrentInstance();
|
|
89
87
|
let cleanup;
|
|
90
88
|
const onCleanup = (fn) => {
|
|
@@ -94,7 +92,7 @@ function watchEffect(effectFn, options = {}) {
|
|
|
94
92
|
let paused = false;
|
|
95
93
|
let pauseToken = 0;
|
|
96
94
|
let scheduledToken = pauseToken;
|
|
97
|
-
const flush =
|
|
95
|
+
const flush = options.flush ?? "pre";
|
|
98
96
|
const runJob = (token) => {
|
|
99
97
|
if (!runner.active || paused || token !== pauseToken) return;
|
|
100
98
|
runner();
|
|
@@ -105,7 +103,7 @@ function watchEffect(effectFn, options = {}) {
|
|
|
105
103
|
dispatchScheduledJob(scheduledJob, flush, isFirstRun);
|
|
106
104
|
};
|
|
107
105
|
runner = effect(() => {
|
|
108
|
-
cleanup
|
|
106
|
+
cleanup?.();
|
|
109
107
|
cleanup = void 0;
|
|
110
108
|
const previousInstance = getCurrentInstance();
|
|
111
109
|
setCurrentInstance(ownerInstance);
|
|
@@ -123,7 +121,7 @@ function watchEffect(effectFn, options = {}) {
|
|
|
123
121
|
});
|
|
124
122
|
scheduleJob(true);
|
|
125
123
|
const doStop = () => {
|
|
126
|
-
cleanup
|
|
124
|
+
cleanup?.();
|
|
127
125
|
cleanup = void 0;
|
|
128
126
|
stop(runner);
|
|
129
127
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.mjs","names":[],"sources":["../../../src/reactivity/watch.ts"],"sourcesContent":["import type { ReactiveEffect } from './core'\nimport type {\n MapSources,\n MaybeUndefined,\n MultiWatchSources,\n OnCleanup,\n WatchCallback,\n WatchEffect,\n WatchEffectOptions,\n WatchOptions,\n WatchSource,\n WatchSources,\n WatchStopHandle,\n} from './watch/types'\nimport { getCurrentInstance, setCurrentInstance } from '../runtime/hooks'\nimport { effect, onScopeDispose, stop } from './core'\nimport { applyDeepWatchGetter, createWatchGetter, dispatchScheduledJob } from './watch/helpers'\n\nexport type {\n DeepWatchStrategy,\n MapSources,\n MaybeUndefined,\n MultiWatchSources,\n OnCleanup,\n WatchCallback,\n WatchEffect,\n WatchEffectOptions,\n WatchMultiSources,\n WatchOptions,\n WatchScheduler,\n WatchSource,\n WatchSources,\n WatchSourceValue,\n WatchStopHandle,\n} from './watch/types'\nexport { getDeepWatchStrategy, setDeepWatchStrategy } from './watch/types'\n\nexport function watch<T, Immediate extends Readonly<boolean> = false>(\n source: WatchSource<T>,\n cb: WatchCallback<T, MaybeUndefined<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch<T extends object, Immediate extends Readonly<boolean> = false>(\n source: T extends ReadonlyArray<any> ? never : T,\n cb: WatchCallback<T, MaybeUndefined<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch<T extends Readonly<MultiWatchSources>, Immediate extends Readonly<boolean> = false>(\n source: readonly [...T] | T,\n cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch<T extends MultiWatchSources, Immediate extends Readonly<boolean> = false>(\n source: [...T],\n cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch(\n source: WatchSources<any>,\n cb: WatchCallback,\n options: WatchOptions = {},\n): WatchStopHandle {\n const ownerInstance = getCurrentInstance()\n const watchGetterContext = createWatchGetter(source)\n const getter = applyDeepWatchGetter(\n watchGetterContext.getter,\n source,\n watchGetterContext.isMultiSource,\n watchGetterContext.isReactiveSource,\n options.deep,\n )\n const forceTrigger = options.deep === true\n || typeof options.deep === 'number'\n || (options.deep === undefined && watchGetterContext.hasReactiveSource)\n || watchGetterContext.hasShallowSource\n\n let cleanup: (() => void) | undefined\n const onCleanup: OnCleanup = (fn) => {\n cleanup = fn\n }\n\n let oldValue: any = watchGetterContext.isMultiSource ? [] : undefined\n let runner: ReactiveEffect<any>\n let paused = false\n let pauseToken = 0\n let scheduledToken = pauseToken\n let stopHandle: WatchStopHandle\n const cbWithOnce: WatchCallback = options.once\n ? (value, oldVal, cleanupRegister) => {\n cb(value, oldVal, cleanupRegister)\n stopHandle()\n }\n : cb\n const flush = options.flush ?? 'pre'\n\n const hasChanged = (newValue: any, previousValue: any) => {\n if (!watchGetterContext.isMultiSource) {\n return !Object.is(newValue, previousValue)\n }\n if (!Array.isArray(newValue) || !Array.isArray(previousValue)) {\n return !Object.is(newValue, previousValue)\n }\n return newValue.length !== previousValue.length\n || newValue.some((value, index) => !Object.is(value, previousValue[index]))\n }\n\n const runJob = (token: number, force = false) => {\n if (!runner.active || paused || token !== pauseToken) {\n return\n }\n const newValue = runner()\n if (!force && !forceTrigger && !hasChanged(newValue, oldValue)) {\n return\n }\n cleanup?.()\n const previousInstance = getCurrentInstance()\n setCurrentInstance(ownerInstance)\n try {\n cbWithOnce(newValue, oldValue, onCleanup)\n }\n finally {\n setCurrentInstance(previousInstance)\n }\n oldValue = newValue\n }\n const scheduledJob = () => runJob(scheduledToken)\n\n const scheduleJob = (isFirstRun: boolean) => {\n scheduledToken = pauseToken\n dispatchScheduledJob(scheduledJob, flush, isFirstRun, options.scheduler)\n }\n\n runner = effect(() => getter(), {\n scheduler: () => {\n if (paused) {\n return\n }\n scheduleJob(false)\n },\n lazy: true,\n })\n\n const doStop = () => {\n cleanup?.()\n cleanup = undefined\n stop(runner)\n }\n stopHandle = doStop as WatchStopHandle\n stopHandle.stop = doStop\n stopHandle.pause = () => {\n if (!paused) {\n paused = true\n pauseToken += 1\n }\n }\n stopHandle.resume = () => {\n if (!paused || !runner.active) {\n return\n }\n paused = false\n oldValue = runner()\n }\n\n if (options.immediate) {\n runJob(pauseToken, true)\n }\n else {\n oldValue = runner()\n }\n onScopeDispose(stopHandle)\n return stopHandle\n}\n\n/**\n * watchEffect 注册一个响应式副作用,可选清理函数。\n * 副作用会立即执行,并在依赖变化时重新运行。\n */\nexport function watchEffect(\n effectFn: WatchEffect,\n options: WatchEffectOptions = {},\n): WatchStopHandle {\n const ownerInstance = getCurrentInstance()\n let cleanup: (() => void) | undefined\n const onCleanup: OnCleanup = (fn) => {\n cleanup = fn\n }\n let runner: ReactiveEffect\n let paused = false\n let pauseToken = 0\n let scheduledToken = pauseToken\n const flush = options.flush ?? 'pre'\n\n const runJob = (token: number) => {\n if (!runner.active || paused || token !== pauseToken) {\n return\n }\n runner()\n }\n const scheduledJob = () => runJob(scheduledToken)\n\n const scheduleJob = (isFirstRun: boolean) => {\n scheduledToken = pauseToken\n dispatchScheduledJob(scheduledJob, flush, isFirstRun)\n }\n\n runner = effect(\n () => {\n cleanup?.()\n cleanup = undefined\n const previousInstance = getCurrentInstance()\n setCurrentInstance(ownerInstance)\n try {\n effectFn(onCleanup)\n }\n finally {\n setCurrentInstance(previousInstance)\n }\n },\n {\n lazy: true,\n scheduler: () => {\n if (paused) {\n return\n }\n scheduleJob(false)\n },\n },\n )\n scheduleJob(true)\n\n const doStop = () => {\n cleanup?.()\n cleanup = undefined\n stop(runner)\n }\n const stopHandle = doStop as WatchStopHandle\n stopHandle.stop = doStop\n stopHandle.pause = () => {\n if (!paused) {\n paused = true\n pauseToken += 1\n }\n }\n stopHandle.resume = () => {\n if (!paused || !runner.active) {\n return\n }\n paused = false\n scheduleJob(true)\n }\n onScopeDispose(stopHandle)\n return stopHandle\n}\n\n/**\n * 以后置刷新的方式运行副作用,与 Vue 的 `watchPostEffect()` 兼容。\n */\nexport function watchPostEffect(\n effectFn: WatchEffect,\n options: Omit<WatchEffectOptions, 'flush'> = {},\n): WatchStopHandle {\n return watchEffect(effectFn, {\n ...options,\n flush: 'post',\n })\n}\n\n/**\n * 以同步刷新的方式运行副作用,与 Vue 的 `watchSyncEffect()` 兼容。\n */\nexport function watchSyncEffect(\n effectFn: WatchEffect,\n options: Omit<WatchEffectOptions, 'flush'> = {},\n): WatchStopHandle {\n return watchEffect(effectFn, {\n ...options,\n flush: 'sync',\n })\n}\n"],"mappings":";;;;;;AAyDA,SAAgB,MACd,QACA,IACA,UAAwB,CAAC,GACR;;CACjB,MAAM,gBAAgB,mBAAmB;CACzC,MAAM,qBAAqB,kBAAkB,MAAM;CACnD,MAAM,SAAS,qBACb,mBAAmB,QACnB,QACA,mBAAmB,eACnB,mBAAmB,kBACnB,QAAQ,IACV;CACA,MAAM,eAAe,QAAQ,SAAS,QACjC,OAAO,QAAQ,SAAS,YACvB,QAAQ,SAAS,UAAa,mBAAmB,qBAClD,mBAAmB;CAExB,IAAI;CACJ,MAAM,aAAwB,OAAO;EACnC,UAAU;CACZ;CAEA,IAAI,WAAgB,mBAAmB,gBAAgB,CAAC,IAAI;CAC5D,IAAI;CACJ,IAAI,SAAS;CACb,IAAI,aAAa;CACjB,IAAI,iBAAiB;CACrB,IAAI;CACJ,MAAM,aAA4B,QAAQ,QACrC,OAAO,QAAQ,oBAAoB;EAClC,GAAG,OAAO,QAAQ,eAAe;EACjC,WAAW;CACb,IACA;CACJ,MAAM,0BAAQ,QAAQ,gEAAS;CAE/B,MAAM,cAAc,UAAe,kBAAuB;EACxD,IAAI,CAAC,mBAAmB,eACtB,OAAO,CAAC,OAAO,GAAG,UAAU,aAAa;EAE3C,IAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,QAAQ,aAAa,GAC1D,OAAO,CAAC,OAAO,GAAG,UAAU,aAAa;EAE3C,OAAO,SAAS,WAAW,cAAc,UACpC,SAAS,MAAM,OAAO,UAAU,CAAC,OAAO,GAAG,OAAO,cAAc,MAAM,CAAC;CAC9E;CAEA,MAAM,UAAU,OAAe,QAAQ,UAAU;EAC/C,IAAI,CAAC,OAAO,UAAU,UAAU,UAAU,YACxC;EAEF,MAAM,WAAW,OAAO;EACxB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,WAAW,UAAU,QAAQ,GAC3D;EAEF,kDAAU;EACV,MAAM,mBAAmB,mBAAmB;EAC5C,mBAAmB,aAAa;EAChC,IAAI;GACF,WAAW,UAAU,UAAU,SAAS;EAC1C,UACQ;GACN,mBAAmB,gBAAgB;EACrC;EACA,WAAW;CACb;CACA,MAAM,qBAAqB,OAAO,cAAc;CAEhD,MAAM,eAAe,eAAwB;EAC3C,iBAAiB;EACjB,qBAAqB,cAAc,OAAO,YAAY,QAAQ,SAAS;CACzE;CAEA,SAAS,aAAa,OAAO,GAAG;EAC9B,iBAAiB;GACf,IAAI,QACF;GAEF,YAAY,KAAK;EACnB;EACA,MAAM;CACR,CAAC;CAED,MAAM,eAAe;EACnB,kDAAU;EACV,UAAU;EACV,KAAK,MAAM;CACb;CACA,aAAa;CACb,WAAW,OAAO;CAClB,WAAW,cAAc;EACvB,IAAI,CAAC,QAAQ;GACX,SAAS;GACT,cAAc;EAChB;CACF;CACA,WAAW,eAAe;EACxB,IAAI,CAAC,UAAU,CAAC,OAAO,QACrB;EAEF,SAAS;EACT,WAAW,OAAO;CACpB;CAEA,IAAI,QAAQ,WACV,OAAO,YAAY,IAAI;MAGvB,WAAW,OAAO;CAEpB,eAAe,UAAU;CACzB,OAAO;AACT;;;;;AAMA,SAAgB,YACd,UACA,UAA8B,CAAC,GACd;;CACjB,MAAM,gBAAgB,mBAAmB;CACzC,IAAI;CACJ,MAAM,aAAwB,OAAO;EACnC,UAAU;CACZ;CACA,IAAI;CACJ,IAAI,SAAS;CACb,IAAI,aAAa;CACjB,IAAI,iBAAiB;CACrB,MAAM,2BAAQ,QAAQ,kEAAS;CAE/B,MAAM,UAAU,UAAkB;EAChC,IAAI,CAAC,OAAO,UAAU,UAAU,UAAU,YACxC;EAEF,OAAO;CACT;CACA,MAAM,qBAAqB,OAAO,cAAc;CAEhD,MAAM,eAAe,eAAwB;EAC3C,iBAAiB;EACjB,qBAAqB,cAAc,OAAO,UAAU;CACtD;CAEA,SAAS,aACD;EACJ,kDAAU;EACV,UAAU;EACV,MAAM,mBAAmB,mBAAmB;EAC5C,mBAAmB,aAAa;EAChC,IAAI;GACF,SAAS,SAAS;EACpB,UACQ;GACN,mBAAmB,gBAAgB;EACrC;CACF,GACA;EACE,MAAM;EACN,iBAAiB;GACf,IAAI,QACF;GAEF,YAAY,KAAK;EACnB;CACF,CACF;CACA,YAAY,IAAI;CAEhB,MAAM,eAAe;EACnB,kDAAU;EACV,UAAU;EACV,KAAK,MAAM;CACb;CACA,MAAM,aAAa;CACnB,WAAW,OAAO;CAClB,WAAW,cAAc;EACvB,IAAI,CAAC,QAAQ;GACX,SAAS;GACT,cAAc;EAChB;CACF;CACA,WAAW,eAAe;EACxB,IAAI,CAAC,UAAU,CAAC,OAAO,QACrB;EAEF,SAAS;EACT,YAAY,IAAI;CAClB;CACA,eAAe,UAAU;CACzB,OAAO;AACT;;;;AAKA,SAAgB,gBACd,UACA,UAA6C,CAAC,GAC7B;CACjB,OAAO,YAAY,UAAU;EAC3B,GAAG;EACH,OAAO;CACT,CAAC;AACH;;;;AAKA,SAAgB,gBACd,UACA,UAA6C,CAAC,GAC7B;CACjB,OAAO,YAAY,UAAU;EAC3B,GAAG;EACH,OAAO;CACT,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"watch.mjs","names":[],"sources":["../../../src/reactivity/watch.ts"],"sourcesContent":["import type { ReactiveEffect } from './core'\nimport type {\n MapSources,\n MaybeUndefined,\n MultiWatchSources,\n OnCleanup,\n WatchCallback,\n WatchEffect,\n WatchEffectOptions,\n WatchOptions,\n WatchSource,\n WatchSources,\n WatchStopHandle,\n} from './watch/types'\nimport { getCurrentInstance, setCurrentInstance } from '../runtime/hooks'\nimport { effect, onScopeDispose, stop } from './core'\nimport { applyDeepWatchGetter, createWatchGetter, dispatchScheduledJob } from './watch/helpers'\n\nexport type {\n DeepWatchStrategy,\n MapSources,\n MaybeUndefined,\n MultiWatchSources,\n OnCleanup,\n WatchCallback,\n WatchEffect,\n WatchEffectOptions,\n WatchMultiSources,\n WatchOptions,\n WatchScheduler,\n WatchSource,\n WatchSources,\n WatchSourceValue,\n WatchStopHandle,\n} from './watch/types'\nexport { getDeepWatchStrategy, setDeepWatchStrategy } from './watch/types'\n\nexport function watch<T, Immediate extends Readonly<boolean> = false>(\n source: WatchSource<T>,\n cb: WatchCallback<T, MaybeUndefined<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch<T extends object, Immediate extends Readonly<boolean> = false>(\n source: T extends ReadonlyArray<any> ? never : T,\n cb: WatchCallback<T, MaybeUndefined<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch<T extends Readonly<MultiWatchSources>, Immediate extends Readonly<boolean> = false>(\n source: readonly [...T] | T,\n cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch<T extends MultiWatchSources, Immediate extends Readonly<boolean> = false>(\n source: [...T],\n cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,\n options?: WatchOptions<Immediate>,\n): WatchStopHandle\nexport function watch(\n source: WatchSources<any>,\n cb: WatchCallback,\n options: WatchOptions = {},\n): WatchStopHandle {\n const ownerInstance = getCurrentInstance()\n const watchGetterContext = createWatchGetter(source)\n const getter = applyDeepWatchGetter(\n watchGetterContext.getter,\n source,\n watchGetterContext.isMultiSource,\n watchGetterContext.isReactiveSource,\n options.deep,\n )\n const forceTrigger = options.deep === true\n || typeof options.deep === 'number'\n || (options.deep === undefined && watchGetterContext.hasReactiveSource)\n || watchGetterContext.hasShallowSource\n\n let cleanup: (() => void) | undefined\n const onCleanup: OnCleanup = (fn) => {\n cleanup = fn\n }\n\n let oldValue: any = watchGetterContext.isMultiSource ? [] : undefined\n let runner: ReactiveEffect<any>\n let paused = false\n let pauseToken = 0\n let scheduledToken = pauseToken\n let stopHandle: WatchStopHandle\n const cbWithOnce: WatchCallback = options.once\n ? (value, oldVal, cleanupRegister) => {\n cb(value, oldVal, cleanupRegister)\n stopHandle()\n }\n : cb\n const flush = options.flush ?? 'pre'\n\n const hasChanged = (newValue: any, previousValue: any) => {\n if (!watchGetterContext.isMultiSource) {\n return !Object.is(newValue, previousValue)\n }\n if (!Array.isArray(newValue) || !Array.isArray(previousValue)) {\n return !Object.is(newValue, previousValue)\n }\n return newValue.length !== previousValue.length\n || newValue.some((value, index) => !Object.is(value, previousValue[index]))\n }\n\n const runJob = (token: number, force = false) => {\n if (!runner.active || paused || token !== pauseToken) {\n return\n }\n const newValue = runner()\n if (!force && !forceTrigger && !hasChanged(newValue, oldValue)) {\n return\n }\n cleanup?.()\n const previousInstance = getCurrentInstance()\n setCurrentInstance(ownerInstance)\n try {\n cbWithOnce(newValue, oldValue, onCleanup)\n }\n finally {\n setCurrentInstance(previousInstance)\n }\n oldValue = newValue\n }\n const scheduledJob = () => runJob(scheduledToken)\n\n const scheduleJob = (isFirstRun: boolean) => {\n scheduledToken = pauseToken\n dispatchScheduledJob(scheduledJob, flush, isFirstRun, options.scheduler)\n }\n\n runner = effect(() => getter(), {\n scheduler: () => {\n if (paused) {\n return\n }\n scheduleJob(false)\n },\n lazy: true,\n })\n\n const doStop = () => {\n cleanup?.()\n cleanup = undefined\n stop(runner)\n }\n stopHandle = doStop as WatchStopHandle\n stopHandle.stop = doStop\n stopHandle.pause = () => {\n if (!paused) {\n paused = true\n pauseToken += 1\n }\n }\n stopHandle.resume = () => {\n if (!paused || !runner.active) {\n return\n }\n paused = false\n oldValue = runner()\n }\n\n if (options.immediate) {\n runJob(pauseToken, true)\n }\n else {\n oldValue = runner()\n }\n onScopeDispose(stopHandle)\n return stopHandle\n}\n\n/**\n * watchEffect 注册一个响应式副作用,可选清理函数。\n * 副作用会立即执行,并在依赖变化时重新运行。\n */\nexport function watchEffect(\n effectFn: WatchEffect,\n options: WatchEffectOptions = {},\n): WatchStopHandle {\n const ownerInstance = getCurrentInstance()\n let cleanup: (() => void) | undefined\n const onCleanup: OnCleanup = (fn) => {\n cleanup = fn\n }\n let runner: ReactiveEffect\n let paused = false\n let pauseToken = 0\n let scheduledToken = pauseToken\n const flush = options.flush ?? 'pre'\n\n const runJob = (token: number) => {\n if (!runner.active || paused || token !== pauseToken) {\n return\n }\n runner()\n }\n const scheduledJob = () => runJob(scheduledToken)\n\n const scheduleJob = (isFirstRun: boolean) => {\n scheduledToken = pauseToken\n dispatchScheduledJob(scheduledJob, flush, isFirstRun)\n }\n\n runner = effect(\n () => {\n cleanup?.()\n cleanup = undefined\n const previousInstance = getCurrentInstance()\n setCurrentInstance(ownerInstance)\n try {\n effectFn(onCleanup)\n }\n finally {\n setCurrentInstance(previousInstance)\n }\n },\n {\n lazy: true,\n scheduler: () => {\n if (paused) {\n return\n }\n scheduleJob(false)\n },\n },\n )\n scheduleJob(true)\n\n const doStop = () => {\n cleanup?.()\n cleanup = undefined\n stop(runner)\n }\n const stopHandle = doStop as WatchStopHandle\n stopHandle.stop = doStop\n stopHandle.pause = () => {\n if (!paused) {\n paused = true\n pauseToken += 1\n }\n }\n stopHandle.resume = () => {\n if (!paused || !runner.active) {\n return\n }\n paused = false\n scheduleJob(true)\n }\n onScopeDispose(stopHandle)\n return stopHandle\n}\n\n/**\n * 以后置刷新的方式运行副作用,与 Vue 的 `watchPostEffect()` 兼容。\n */\nexport function watchPostEffect(\n effectFn: WatchEffect,\n options: Omit<WatchEffectOptions, 'flush'> = {},\n): WatchStopHandle {\n return watchEffect(effectFn, {\n ...options,\n flush: 'post',\n })\n}\n\n/**\n * 以同步刷新的方式运行副作用,与 Vue 的 `watchSyncEffect()` 兼容。\n */\nexport function watchSyncEffect(\n effectFn: WatchEffect,\n options: Omit<WatchEffectOptions, 'flush'> = {},\n): WatchStopHandle {\n return watchEffect(effectFn, {\n ...options,\n flush: 'sync',\n })\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, registerInitialNavigationRunner } from "./initialNavigation.mjs";
|
|
1
|
+
import { getCurrentMiniProgramGlobalObject } from "../runtime/platform/current.mjs";
|
|
2
|
+
import { getCurrentMiniProgramTabBarPagePaths } from "../runtime/platform.mjs";
|
|
4
3
|
import { installRouteStateSyncOnNativeRouter, notifyRouteStateSync } from "./routeSync.mjs";
|
|
5
4
|
import { resolvePath } from "../routerInternal/path.mjs";
|
|
6
5
|
import { parseQuery, stringifyQuery } from "../routerInternal/query.mjs";
|
|
@@ -14,6 +13,8 @@ import { NavigationFailureType } from "./types.mjs";
|
|
|
14
13
|
import { createNavigationFailure, executeNavigationMethod } from "./navigationCore.mjs";
|
|
15
14
|
import { createNavigationResultController } from "./navigationResult.mjs";
|
|
16
15
|
import { resolveBackNavigationTarget, runBackNavigationGuards } from "./backNavigation.mjs";
|
|
16
|
+
import { setActiveRouter } from "./instance.mjs";
|
|
17
|
+
import { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, registerInitialNavigationRunner } from "./initialNavigation.mjs";
|
|
17
18
|
import { navigateWithTarget } from "./navigationTarget.mjs";
|
|
18
19
|
import { createNavigationApi } from "./navigationApi.mjs";
|
|
19
20
|
import { resolveRouteLocation } from "./resolve.mjs";
|
|
@@ -25,28 +26,27 @@ import { createRouteStateController, useNativeRouter } from "./useRoute.mjs";
|
|
|
25
26
|
* @description 创建高阶路由导航器(对齐 Vue Router 的 createRouter 心智)
|
|
26
27
|
*/
|
|
27
28
|
function createRouter(optionsInput = {}) {
|
|
28
|
-
var _options$maxRedirects, _options$initialNavig, _options$paramsMode, _options$rejectOnErro, _options$parseQuery, _options$stringifyQue, _options$tabBarEntrie;
|
|
29
29
|
const options = optionsInput;
|
|
30
30
|
const nativeRouter = useNativeRouter();
|
|
31
|
-
installRouteStateSyncOnNativeRouter(
|
|
31
|
+
installRouteStateSyncOnNativeRouter(getCurrentMiniProgramGlobalObject());
|
|
32
32
|
const beforeEachGuards = /* @__PURE__ */ new Set();
|
|
33
33
|
const beforeResolveGuards = /* @__PURE__ */ new Set();
|
|
34
34
|
const afterEachHooks = /* @__PURE__ */ new Set();
|
|
35
35
|
const errorHandlers = /* @__PURE__ */ new Set();
|
|
36
|
-
const maxRedirects =
|
|
36
|
+
const maxRedirects = options.maxRedirects ?? 10;
|
|
37
37
|
const initialNavigationMode = options.initialNavigationMode === "blocking" ? "blocking" : "eager";
|
|
38
|
-
const initialNavigationTimeout = Number.isFinite(options.initialNavigationTimeout) && (
|
|
39
|
-
const paramsMode =
|
|
40
|
-
const rejectOnError =
|
|
38
|
+
const initialNavigationTimeout = Number.isFinite(options.initialNavigationTimeout) && (options.initialNavigationTimeout ?? 0) > 0 ? Math.max(1, Math.trunc(options.initialNavigationTimeout)) : DEFAULT_INITIAL_NAVIGATION_TIMEOUT;
|
|
39
|
+
const paramsMode = options.paramsMode ?? "loose";
|
|
40
|
+
const rejectOnError = options.rejectOnError ?? true;
|
|
41
41
|
const routeResolveCodec = {
|
|
42
|
-
parseQuery:
|
|
43
|
-
stringifyQuery:
|
|
42
|
+
parseQuery: options.parseQuery ?? parseQuery,
|
|
43
|
+
stringifyQuery: options.stringifyQuery ?? stringifyQuery
|
|
44
44
|
};
|
|
45
45
|
const readyPromise = Promise.resolve();
|
|
46
46
|
const routeEntries = resolveRouteOptionEntries(options);
|
|
47
47
|
warnDuplicateRouteEntries(routeEntries);
|
|
48
48
|
const namedRouteLookup = createNamedRouteLookup(routeEntries);
|
|
49
|
-
const normalizedTabBarEntries = (
|
|
49
|
+
const normalizedTabBarEntries = (options.tabBarEntries ?? getCurrentMiniProgramTabBarPagePaths()).map((path) => resolvePath(path, "")).filter(Boolean);
|
|
50
50
|
const tabBarPathSet = new Set(normalizedTabBarEntries);
|
|
51
51
|
const routeRegistry = createRouteRegistry(namedRouteLookup);
|
|
52
52
|
let managedNavigationCount = 0;
|
|
@@ -99,7 +99,7 @@ function createRouter(optionsInput = {}) {
|
|
|
99
99
|
beforeResolveGuards,
|
|
100
100
|
resolveWithCodec
|
|
101
101
|
}).then((result) => {
|
|
102
|
-
return emitObservedNavigationAfterEach
|
|
102
|
+
return emitObservedNavigationAfterEach?.(result);
|
|
103
103
|
}).finally(() => {
|
|
104
104
|
pendingExternalRouteSyncPath = void 0;
|
|
105
105
|
});
|
|
@@ -144,7 +144,7 @@ function createRouter(optionsInput = {}) {
|
|
|
144
144
|
function resolveManagedRoutePath(to) {
|
|
145
145
|
try {
|
|
146
146
|
return resolveWithCodec(to, route.path).fullPath;
|
|
147
|
-
} catch
|
|
147
|
+
} catch {
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
150
|
}
|
|
@@ -219,9 +219,8 @@ function createRouter(optionsInput = {}) {
|
|
|
219
219
|
options: routerOptions,
|
|
220
220
|
currentRoute: route,
|
|
221
221
|
install(app) {
|
|
222
|
-
var _config;
|
|
223
222
|
setActiveRouter(router);
|
|
224
|
-
const globalProperties = app
|
|
223
|
+
const globalProperties = app?.config?.globalProperties;
|
|
225
224
|
if (globalProperties) globalProperties.$router = router;
|
|
226
225
|
},
|
|
227
226
|
resolve,
|
|
@@ -230,14 +229,8 @@ function createRouter(optionsInput = {}) {
|
|
|
230
229
|
},
|
|
231
230
|
push: (to) => runManagedNavigation(() => navigationApi.push(to), resolveManagedRoutePath(to)),
|
|
232
231
|
replace: (to) => runManagedNavigation(() => navigationApi.replace(to), resolveManagedRoutePath(to)),
|
|
233
|
-
back: (delta) =>
|
|
234
|
-
|
|
235
|
-
return runManagedNavigation(() => navigationApi.back(delta), (_resolveBackNavigatio = resolveBackNavigationTarget(delta !== null && delta !== void 0 ? delta : 1, route, resolveWithCodec)) === null || _resolveBackNavigatio === void 0 ? void 0 : _resolveBackNavigatio.fullPath);
|
|
236
|
-
},
|
|
237
|
-
go: (delta) => {
|
|
238
|
-
var _resolveBackNavigatio2;
|
|
239
|
-
return runManagedNavigation(() => navigationApi.go(delta), delta < 0 ? (_resolveBackNavigatio2 = resolveBackNavigationTarget(Math.abs(delta), route, resolveWithCodec)) === null || _resolveBackNavigatio2 === void 0 ? void 0 : _resolveBackNavigatio2.fullPath : void 0);
|
|
240
|
-
},
|
|
232
|
+
back: (delta) => runManagedNavigation(() => navigationApi.back(delta), resolveBackNavigationTarget(delta ?? 1, route, resolveWithCodec)?.fullPath),
|
|
233
|
+
go: (delta) => runManagedNavigation(() => navigationApi.go(delta), delta < 0 ? resolveBackNavigationTarget(Math.abs(delta), route, resolveWithCodec)?.fullPath : void 0),
|
|
241
234
|
forward: () => runManagedNavigation(() => navigationApi.forward()),
|
|
242
235
|
hasRoute: routeRegistry.hasRoute,
|
|
243
236
|
getRoutes: routeRegistry.getRoutes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRouter.mjs","names":["typedRouter"],"sources":["../../../src/router/createRouter.ts"],"sourcesContent":["import type { WevuNamedRouteMap } from '../router'\nimport type { RouteResolveCodec } from '../routerInternal/shared'\nimport type { NavigationRunResult } from './navigationResult'\nimport type { RouteStateSyncPayload } from './routeSync'\nimport type {\n InitialNavigationMode,\n LocationQueryRaw,\n NavigationAfterEach,\n NavigationErrorHandler,\n NavigationGuard,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n RouterNavigation,\n UseRouterOptions,\n} from './types'\nimport {\n cloneRouteMeta,\n cloneRouteParams,\n createNamedRouteLookup,\n createNativeRouteUrl,\n createRouterOptionsSnapshot,\n mergeMatchedRouteMeta,\n normalizeRouteRecordMatched,\n parseQuery,\n resolveCurrentRoute,\n resolveMatchedRouteRecord,\n resolveNamedRouteLocation,\n resolvePath,\n resolveRouteOptionEntries,\n snapshotRouteLocation,\n stringifyQuery,\n warnDuplicateRouteEntries,\n} from '../routerInternal/shared'\nimport { getCurrentMiniProgramTabBarPagePaths, getMiniProgramGlobalObject } from '../runtime/platform'\nimport { resolveBackNavigationTarget, runBackNavigationGuards } from './backNavigation'\nimport { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, registerInitialNavigationRunner } from './initialNavigation'\nimport { setActiveRouter } from './instance'\nimport { createNavigationApi } from './navigationApi'\nimport { createNavigationFailure, executeNavigationMethod } from './navigationCore'\nimport { createNavigationResultController } from './navigationResult'\nimport { navigateWithTarget } from './navigationTarget'\nimport { resolveRouteLocation } from './resolve'\nimport { createRouteRegistry } from './routeRegistry'\nimport { installRouteStateSyncOnNativeRouter, notifyRouteStateSync } from './routeSync'\nimport { NavigationFailureType } from './types'\nimport { createRouteStateController, useNativeRouter } from './useRoute'\n\n/**\n * @description 创建高阶路由导航器(对齐 Vue Router 的 createRouter 心智)\n */\nexport function createRouter<TRouteMap extends object = WevuNamedRouteMap>(\n optionsInput: UseRouterOptions<NoInfer<TRouteMap>> = {},\n): RouterNavigation<TRouteMap> {\n // 路由表泛型只约束公开类型;运行时继续使用同一套名称无关的导航引擎。\n const options = optionsInput as unknown as UseRouterOptions\n const nativeRouter = useNativeRouter()\n installRouteStateSyncOnNativeRouter(getMiniProgramGlobalObject())\n const beforeEachGuards = new Set<NavigationGuard>()\n const beforeResolveGuards = new Set<NavigationGuard>()\n const afterEachHooks = new Set<NavigationAfterEach>()\n const errorHandlers = new Set<NavigationErrorHandler>()\n const maxRedirects = options.maxRedirects ?? 10\n const initialNavigationMode: InitialNavigationMode = options.initialNavigationMode === 'blocking' ? 'blocking' : 'eager'\n const initialNavigationTimeout = Number.isFinite(options.initialNavigationTimeout) && (options.initialNavigationTimeout ?? 0) > 0\n ? Math.max(1, Math.trunc(options.initialNavigationTimeout!))\n : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n const paramsMode = options.paramsMode ?? 'loose'\n const rejectOnError = options.rejectOnError ?? true\n const routeResolveCodec: RouteResolveCodec = {\n parseQuery: options.parseQuery ?? parseQuery,\n stringifyQuery: options.stringifyQuery ?? stringifyQuery,\n }\n const readyPromise = Promise.resolve()\n const routeEntries = resolveRouteOptionEntries(options)\n warnDuplicateRouteEntries(routeEntries)\n const namedRouteLookup = createNamedRouteLookup(routeEntries)\n const tabBarEntrySource = options.tabBarEntries ?? getCurrentMiniProgramTabBarPagePaths()\n const normalizedTabBarEntries = tabBarEntrySource\n .map(path => resolvePath(path, ''))\n .filter(Boolean)\n const tabBarPathSet = new Set(normalizedTabBarEntries)\n const routeRegistry = createRouteRegistry(namedRouteLookup)\n let managedNavigationCount = 0\n let activeManagedRoutePath: string | undefined\n let pendingManagedRouteSyncPath: string | undefined\n let pendingExternalRouteSyncPath: string | undefined\n const routerOptions = createRouterOptionsSnapshot(\n normalizedTabBarEntries,\n routeRegistry.getRoutes(),\n paramsMode,\n maxRedirects,\n initialNavigationMode,\n initialNavigationTimeout,\n routeResolveCodec,\n rejectOnError,\n )\n\n function enrichRouteRecordState(routeLocation: RouteLocationNormalizedLoaded): RouteLocationNormalizedLoaded {\n const resolved = { ...routeLocation }\n resolved.href = resolved.fullPath\n const matchedResult = resolveMatchedRouteRecord(resolved, namedRouteLookup)\n if (matchedResult) {\n const matchedRecord = matchedResult.record\n if (resolved.name === undefined) {\n resolved.name = matchedRecord.name\n }\n const mergedRouteMeta = mergeMatchedRouteMeta(matchedResult.matchedRecords)\n if (mergedRouteMeta !== undefined) {\n resolved.meta = cloneRouteMeta(mergedRouteMeta)\n }\n if (matchedResult.params && Object.keys(resolved.params).length === 0) {\n resolved.params = cloneRouteParams(matchedResult.params)\n }\n resolved.matched = matchedResult.matchedRecords.map((record, index, records) => {\n const leafMatchedPath = index === records.length - 1\n ? matchedResult.matchedPath\n : undefined\n return normalizeRouteRecordMatched(record, leafMatchedPath)\n })\n }\n else {\n resolved.matched = []\n }\n return resolved\n }\n\n function resolveWithCodec(to: RouteLocationRaw, currentPath: string): RouteLocationNormalizedLoaded {\n const rawTo = typeof to === 'string'\n ? to\n : resolveNamedRouteLocation(to, namedRouteLookup, paramsMode)\n return enrichRouteRecordState(resolveRouteLocation(rawTo, currentPath, routeResolveCodec))\n }\n\n let route: Readonly<RouteLocationNormalizedLoaded>\n let emitObservedNavigationAfterEach: ((result: NavigationRunResult) => Promise<void>) | undefined\n\n function isExternalBackSync(payload: RouteStateSyncPayload): boolean {\n return payload.source === 'page'\n || (payload.source === 'native' && payload.method === 'navigateBack')\n }\n\n function beforeRouteStateSync(\n nextRoute: RouteLocationNormalizedLoaded,\n payload: RouteStateSyncPayload,\n ) {\n if (managedNavigationCount > 0 || !isExternalBackSync(payload)) {\n return\n }\n\n if (pendingExternalRouteSyncPath !== undefined) {\n return\n }\n\n if (pendingManagedRouteSyncPath !== undefined) {\n const expectedPath = pendingManagedRouteSyncPath\n pendingManagedRouteSyncPath = undefined\n if (nextRoute.fullPath === expectedPath) {\n return\n }\n }\n\n if (nextRoute.fullPath === route.fullPath) {\n return\n }\n\n pendingExternalRouteSyncPath = nextRoute.fullPath\n const from = snapshotRouteLocation(route)\n void runBackNavigationGuards({\n target: nextRoute,\n from,\n nativeRouter,\n beforeEachGuards,\n beforeResolveGuards,\n resolveWithCodec,\n }).then((result) => {\n return emitObservedNavigationAfterEach?.(result)\n }).finally(() => {\n pendingExternalRouteSyncPath = undefined\n })\n }\n\n const routeController = createRouteStateController({\n beforeRouteStateSync,\n resolveRoute: enrichRouteRecordState,\n })\n route = routeController.route\n\n const resolve = (to: RouteLocationRaw): RouteLocationNormalizedLoaded =>\n resolveWithCodec(to, route.path)\n\n const navigationResultController = createNavigationResultController({\n afterEachHooks,\n errorHandlers,\n nativeRouter,\n rejectOnError,\n })\n emitObservedNavigationAfterEach = navigationResultController.emitNavigationAfterEach\n\n const navigationApi = createNavigationApi({\n nativeRouter,\n route,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n settleNavigationResult: navigationResultController.settleNavigationResult,\n })\n\n async function runManagedNavigation<T>(navigation: () => Promise<T>, targetPath?: string): Promise<T> {\n const previousRoutePath = route.fullPath\n if (targetPath) {\n activeManagedRoutePath = targetPath\n }\n managedNavigationCount += 1\n try {\n const result = await navigation()\n if (route.fullPath !== previousRoutePath) {\n pendingManagedRouteSyncPath = route.fullPath\n }\n return result\n }\n finally {\n managedNavigationCount -= 1\n if (managedNavigationCount <= 0) {\n activeManagedRoutePath = undefined\n }\n }\n }\n\n function resolveManagedRoutePath(to: RouteLocationRaw): string | undefined {\n try {\n return resolveWithCodec(to, route.path).fullPath\n }\n catch {\n return undefined\n }\n }\n\n async function runInitialNavigation(\n page: Parameters<typeof resolveCurrentRoute>[1],\n query?: LocationQueryRaw,\n isActive: () => boolean = () => true,\n ) {\n return runManagedNavigation(async () => {\n const from = snapshotRouteLocation(route)\n const target = enrichRouteRecordState(resolveCurrentRoute(query, page))\n if (!target.path) {\n return undefined\n }\n if (activeManagedRoutePath === target.fullPath) {\n notifyRouteStateSync({\n route: target,\n source: 'router',\n })\n return undefined\n }\n const result = await navigateWithTarget({\n mode: 'push',\n target,\n from,\n nativeRouter,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n executeNative: false,\n allowSameLocation: true,\n })\n if (!isActive()) {\n return undefined\n }\n if (initialNavigationMode === 'blocking' && result.to && result.to.fullPath !== target.fullPath) {\n const redirectedTarget = result.to\n const isTabBarTarget = tabBarPathSet.has(redirectedTarget.path)\n const method = isTabBarTarget ? nativeRouter.switchTab : nativeRouter.redirectTo\n const nativeResult = await executeNavigationMethod(\n method as (options: Record<string, any>) => unknown,\n { url: createNativeRouteUrl(redirectedTarget, routeResolveCodec.stringifyQuery) },\n redirectedTarget,\n from,\n )\n if (nativeResult) {\n return nativeResult\n }\n notifyRouteStateSync({\n route: redirectedTarget,\n source: 'router',\n })\n return createNavigationFailure(NavigationFailureType.cancelled, redirectedTarget, from)\n }\n return navigationResultController.settleNavigationResult(result)\n })\n }\n\n function beforeEach(guard: NavigationGuard): () => void {\n beforeEachGuards.add(guard)\n return () => {\n beforeEachGuards.delete(guard)\n }\n }\n\n function beforeResolve(guard: NavigationGuard): () => void {\n beforeResolveGuards.add(guard)\n return () => {\n beforeResolveGuards.delete(guard)\n }\n }\n\n function afterEach(hook: NavigationAfterEach): () => void {\n afterEachHooks.add(hook)\n return () => {\n afterEachHooks.delete(hook)\n }\n }\n\n function onError(handler: NavigationErrorHandler): () => void {\n errorHandlers.add(handler)\n return () => {\n errorHandlers.delete(handler)\n }\n }\n\n const router: RouterNavigation = {\n nativeRouter,\n options: routerOptions,\n currentRoute: route,\n install(app?: unknown): void {\n setActiveRouter(router)\n const globalProperties = (app as { config?: { globalProperties?: Record<string, unknown> } } | undefined)?.config?.globalProperties\n if (globalProperties) {\n globalProperties.$router = router\n }\n },\n resolve,\n isReady(): Promise<void> {\n return readyPromise\n },\n push: to => runManagedNavigation(() => navigationApi.push(to), resolveManagedRoutePath(to)),\n replace: to => runManagedNavigation(() => navigationApi.replace(to), resolveManagedRoutePath(to)),\n back: delta => runManagedNavigation(\n () => navigationApi.back(delta),\n resolveBackNavigationTarget(delta ?? 1, route, resolveWithCodec)?.fullPath,\n ),\n go: delta => runManagedNavigation(\n () => navigationApi.go(delta),\n delta < 0\n ? resolveBackNavigationTarget(Math.abs(delta), route, resolveWithCodec)?.fullPath\n : undefined,\n ),\n forward: () => runManagedNavigation(() => navigationApi.forward()),\n hasRoute: routeRegistry.hasRoute,\n getRoutes: routeRegistry.getRoutes,\n addRoute: routeRegistry.addRoute,\n removeRoute: routeRegistry.removeRoute,\n clearRoutes: routeRegistry.clearRoutes,\n beforeEach,\n beforeResolve,\n afterEach,\n onError,\n }\n\n setActiveRouter(router)\n registerInitialNavigationRunner(router, runInitialNavigation, initialNavigationTimeout, initialNavigationMode)\n const typedRouter = router as unknown as RouterNavigation<TRouteMap>\n return typedRouter\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createRouter.mjs","names":["typedRouter"],"sources":["../../../src/router/createRouter.ts"],"sourcesContent":["import type { WevuNamedRouteMap } from '../router'\nimport type { RouteResolveCodec } from '../routerInternal/shared'\nimport type { NavigationRunResult } from './navigationResult'\nimport type { RouteStateSyncPayload } from './routeSync'\nimport type {\n InitialNavigationMode,\n LocationQueryRaw,\n NavigationAfterEach,\n NavigationErrorHandler,\n NavigationGuard,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n RouterNavigation,\n UseRouterOptions,\n} from './types'\nimport {\n cloneRouteMeta,\n cloneRouteParams,\n createNamedRouteLookup,\n createNativeRouteUrl,\n createRouterOptionsSnapshot,\n mergeMatchedRouteMeta,\n normalizeRouteRecordMatched,\n parseQuery,\n resolveCurrentRoute,\n resolveMatchedRouteRecord,\n resolveNamedRouteLocation,\n resolvePath,\n resolveRouteOptionEntries,\n snapshotRouteLocation,\n stringifyQuery,\n warnDuplicateRouteEntries,\n} from '../routerInternal/shared'\nimport { getCurrentMiniProgramGlobalObject, getCurrentMiniProgramTabBarPagePaths } from '../runtime/platform'\nimport { resolveBackNavigationTarget, runBackNavigationGuards } from './backNavigation'\nimport { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, registerInitialNavigationRunner } from './initialNavigation'\nimport { setActiveRouter } from './instance'\nimport { createNavigationApi } from './navigationApi'\nimport { createNavigationFailure, executeNavigationMethod } from './navigationCore'\nimport { createNavigationResultController } from './navigationResult'\nimport { navigateWithTarget } from './navigationTarget'\nimport { resolveRouteLocation } from './resolve'\nimport { createRouteRegistry } from './routeRegistry'\nimport { installRouteStateSyncOnNativeRouter, notifyRouteStateSync } from './routeSync'\nimport { NavigationFailureType } from './types'\nimport { createRouteStateController, useNativeRouter } from './useRoute'\n\n/**\n * @description 创建高阶路由导航器(对齐 Vue Router 的 createRouter 心智)\n */\nexport function createRouter<TRouteMap extends object = WevuNamedRouteMap>(\n optionsInput: UseRouterOptions<NoInfer<TRouteMap>> = {},\n): RouterNavigation<TRouteMap> {\n // 路由表泛型只约束公开类型;运行时继续使用同一套名称无关的导航引擎。\n const options = optionsInput as unknown as UseRouterOptions\n const nativeRouter = useNativeRouter()\n installRouteStateSyncOnNativeRouter(getCurrentMiniProgramGlobalObject())\n const beforeEachGuards = new Set<NavigationGuard>()\n const beforeResolveGuards = new Set<NavigationGuard>()\n const afterEachHooks = new Set<NavigationAfterEach>()\n const errorHandlers = new Set<NavigationErrorHandler>()\n const maxRedirects = options.maxRedirects ?? 10\n const initialNavigationMode: InitialNavigationMode = options.initialNavigationMode === 'blocking' ? 'blocking' : 'eager'\n const initialNavigationTimeout = Number.isFinite(options.initialNavigationTimeout) && (options.initialNavigationTimeout ?? 0) > 0\n ? Math.max(1, Math.trunc(options.initialNavigationTimeout!))\n : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n const paramsMode = options.paramsMode ?? 'loose'\n const rejectOnError = options.rejectOnError ?? true\n const routeResolveCodec: RouteResolveCodec = {\n parseQuery: options.parseQuery ?? parseQuery,\n stringifyQuery: options.stringifyQuery ?? stringifyQuery,\n }\n const readyPromise = Promise.resolve()\n const routeEntries = resolveRouteOptionEntries(options)\n warnDuplicateRouteEntries(routeEntries)\n const namedRouteLookup = createNamedRouteLookup(routeEntries)\n const tabBarEntrySource = options.tabBarEntries ?? getCurrentMiniProgramTabBarPagePaths()\n const normalizedTabBarEntries = tabBarEntrySource\n .map(path => resolvePath(path, ''))\n .filter(Boolean)\n const tabBarPathSet = new Set(normalizedTabBarEntries)\n const routeRegistry = createRouteRegistry(namedRouteLookup)\n let managedNavigationCount = 0\n let activeManagedRoutePath: string | undefined\n let pendingManagedRouteSyncPath: string | undefined\n let pendingExternalRouteSyncPath: string | undefined\n const routerOptions = createRouterOptionsSnapshot(\n normalizedTabBarEntries,\n routeRegistry.getRoutes(),\n paramsMode,\n maxRedirects,\n initialNavigationMode,\n initialNavigationTimeout,\n routeResolveCodec,\n rejectOnError,\n )\n\n function enrichRouteRecordState(routeLocation: RouteLocationNormalizedLoaded): RouteLocationNormalizedLoaded {\n const resolved = { ...routeLocation }\n resolved.href = resolved.fullPath\n const matchedResult = resolveMatchedRouteRecord(resolved, namedRouteLookup)\n if (matchedResult) {\n const matchedRecord = matchedResult.record\n if (resolved.name === undefined) {\n resolved.name = matchedRecord.name\n }\n const mergedRouteMeta = mergeMatchedRouteMeta(matchedResult.matchedRecords)\n if (mergedRouteMeta !== undefined) {\n resolved.meta = cloneRouteMeta(mergedRouteMeta)\n }\n if (matchedResult.params && Object.keys(resolved.params).length === 0) {\n resolved.params = cloneRouteParams(matchedResult.params)\n }\n resolved.matched = matchedResult.matchedRecords.map((record, index, records) => {\n const leafMatchedPath = index === records.length - 1\n ? matchedResult.matchedPath\n : undefined\n return normalizeRouteRecordMatched(record, leafMatchedPath)\n })\n }\n else {\n resolved.matched = []\n }\n return resolved\n }\n\n function resolveWithCodec(to: RouteLocationRaw, currentPath: string): RouteLocationNormalizedLoaded {\n const rawTo = typeof to === 'string'\n ? to\n : resolveNamedRouteLocation(to, namedRouteLookup, paramsMode)\n return enrichRouteRecordState(resolveRouteLocation(rawTo, currentPath, routeResolveCodec))\n }\n\n let route: Readonly<RouteLocationNormalizedLoaded>\n let emitObservedNavigationAfterEach: ((result: NavigationRunResult) => Promise<void>) | undefined\n\n function isExternalBackSync(payload: RouteStateSyncPayload): boolean {\n return payload.source === 'page'\n || (payload.source === 'native' && payload.method === 'navigateBack')\n }\n\n function beforeRouteStateSync(\n nextRoute: RouteLocationNormalizedLoaded,\n payload: RouteStateSyncPayload,\n ) {\n if (managedNavigationCount > 0 || !isExternalBackSync(payload)) {\n return\n }\n\n if (pendingExternalRouteSyncPath !== undefined) {\n return\n }\n\n if (pendingManagedRouteSyncPath !== undefined) {\n const expectedPath = pendingManagedRouteSyncPath\n pendingManagedRouteSyncPath = undefined\n if (nextRoute.fullPath === expectedPath) {\n return\n }\n }\n\n if (nextRoute.fullPath === route.fullPath) {\n return\n }\n\n pendingExternalRouteSyncPath = nextRoute.fullPath\n const from = snapshotRouteLocation(route)\n void runBackNavigationGuards({\n target: nextRoute,\n from,\n nativeRouter,\n beforeEachGuards,\n beforeResolveGuards,\n resolveWithCodec,\n }).then((result) => {\n return emitObservedNavigationAfterEach?.(result)\n }).finally(() => {\n pendingExternalRouteSyncPath = undefined\n })\n }\n\n const routeController = createRouteStateController({\n beforeRouteStateSync,\n resolveRoute: enrichRouteRecordState,\n })\n route = routeController.route\n\n const resolve = (to: RouteLocationRaw): RouteLocationNormalizedLoaded =>\n resolveWithCodec(to, route.path)\n\n const navigationResultController = createNavigationResultController({\n afterEachHooks,\n errorHandlers,\n nativeRouter,\n rejectOnError,\n })\n emitObservedNavigationAfterEach = navigationResultController.emitNavigationAfterEach\n\n const navigationApi = createNavigationApi({\n nativeRouter,\n route,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n settleNavigationResult: navigationResultController.settleNavigationResult,\n })\n\n async function runManagedNavigation<T>(navigation: () => Promise<T>, targetPath?: string): Promise<T> {\n const previousRoutePath = route.fullPath\n if (targetPath) {\n activeManagedRoutePath = targetPath\n }\n managedNavigationCount += 1\n try {\n const result = await navigation()\n if (route.fullPath !== previousRoutePath) {\n pendingManagedRouteSyncPath = route.fullPath\n }\n return result\n }\n finally {\n managedNavigationCount -= 1\n if (managedNavigationCount <= 0) {\n activeManagedRoutePath = undefined\n }\n }\n }\n\n function resolveManagedRoutePath(to: RouteLocationRaw): string | undefined {\n try {\n return resolveWithCodec(to, route.path).fullPath\n }\n catch {\n return undefined\n }\n }\n\n async function runInitialNavigation(\n page: Parameters<typeof resolveCurrentRoute>[1],\n query?: LocationQueryRaw,\n isActive: () => boolean = () => true,\n ) {\n return runManagedNavigation(async () => {\n const from = snapshotRouteLocation(route)\n const target = enrichRouteRecordState(resolveCurrentRoute(query, page))\n if (!target.path) {\n return undefined\n }\n if (activeManagedRoutePath === target.fullPath) {\n notifyRouteStateSync({\n route: target,\n source: 'router',\n })\n return undefined\n }\n const result = await navigateWithTarget({\n mode: 'push',\n target,\n from,\n nativeRouter,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n executeNative: false,\n allowSameLocation: true,\n })\n if (!isActive()) {\n return undefined\n }\n if (initialNavigationMode === 'blocking' && result.to && result.to.fullPath !== target.fullPath) {\n const redirectedTarget = result.to\n const isTabBarTarget = tabBarPathSet.has(redirectedTarget.path)\n const method = isTabBarTarget ? nativeRouter.switchTab : nativeRouter.redirectTo\n const nativeResult = await executeNavigationMethod(\n method as (options: Record<string, any>) => unknown,\n { url: createNativeRouteUrl(redirectedTarget, routeResolveCodec.stringifyQuery) },\n redirectedTarget,\n from,\n )\n if (nativeResult) {\n return nativeResult\n }\n notifyRouteStateSync({\n route: redirectedTarget,\n source: 'router',\n })\n return createNavigationFailure(NavigationFailureType.cancelled, redirectedTarget, from)\n }\n return navigationResultController.settleNavigationResult(result)\n })\n }\n\n function beforeEach(guard: NavigationGuard): () => void {\n beforeEachGuards.add(guard)\n return () => {\n beforeEachGuards.delete(guard)\n }\n }\n\n function beforeResolve(guard: NavigationGuard): () => void {\n beforeResolveGuards.add(guard)\n return () => {\n beforeResolveGuards.delete(guard)\n }\n }\n\n function afterEach(hook: NavigationAfterEach): () => void {\n afterEachHooks.add(hook)\n return () => {\n afterEachHooks.delete(hook)\n }\n }\n\n function onError(handler: NavigationErrorHandler): () => void {\n errorHandlers.add(handler)\n return () => {\n errorHandlers.delete(handler)\n }\n }\n\n const router: RouterNavigation = {\n nativeRouter,\n options: routerOptions,\n currentRoute: route,\n install(app?: unknown): void {\n setActiveRouter(router)\n const globalProperties = (app as { config?: { globalProperties?: Record<string, unknown> } } | undefined)?.config?.globalProperties\n if (globalProperties) {\n globalProperties.$router = router\n }\n },\n resolve,\n isReady(): Promise<void> {\n return readyPromise\n },\n push: to => runManagedNavigation(() => navigationApi.push(to), resolveManagedRoutePath(to)),\n replace: to => runManagedNavigation(() => navigationApi.replace(to), resolveManagedRoutePath(to)),\n back: delta => runManagedNavigation(\n () => navigationApi.back(delta),\n resolveBackNavigationTarget(delta ?? 1, route, resolveWithCodec)?.fullPath,\n ),\n go: delta => runManagedNavigation(\n () => navigationApi.go(delta),\n delta < 0\n ? resolveBackNavigationTarget(Math.abs(delta), route, resolveWithCodec)?.fullPath\n : undefined,\n ),\n forward: () => runManagedNavigation(() => navigationApi.forward()),\n hasRoute: routeRegistry.hasRoute,\n getRoutes: routeRegistry.getRoutes,\n addRoute: routeRegistry.addRoute,\n removeRoute: routeRegistry.removeRoute,\n clearRoutes: routeRegistry.clearRoutes,\n beforeEach,\n beforeResolve,\n afterEach,\n onError,\n }\n\n setActiveRouter(router)\n registerInitialNavigationRunner(router, runInitialNavigation, initialNavigationTimeout, initialNavigationMode)\n const typedRouter = router as unknown as RouterNavigation<TRouteMap>\n return typedRouter\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAgB,aACd,eAAqD,CAAC,GACzB;CAE7B,MAAM,UAAU;CAChB,MAAM,eAAe,gBAAgB;CACrC,oCAAoC,kCAAkC,CAAC;CACvE,MAAM,mCAAmB,IAAI,IAAqB;CAClD,MAAM,sCAAsB,IAAI,IAAqB;CACrD,MAAM,iCAAiB,IAAI,IAAyB;CACpD,MAAM,gCAAgB,IAAI,IAA4B;CACtD,MAAM,eAAe,QAAQ,gBAAgB;CAC7C,MAAM,wBAA+C,QAAQ,0BAA0B,aAAa,aAAa;CACjH,MAAM,2BAA2B,OAAO,SAAS,QAAQ,wBAAwB,MAAM,QAAQ,4BAA4B,KAAK,IAC5H,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,wBAAyB,CAAC,IACzD;CACJ,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,gBAAgB,QAAQ,iBAAiB;CAC/C,MAAM,oBAAuC;EAC3C,YAAY,QAAQ,cAAc;EAClC,gBAAgB,QAAQ,kBAAkB;CAC5C;CACA,MAAM,eAAe,QAAQ,QAAQ;CACrC,MAAM,eAAe,0BAA0B,OAAO;CACtD,0BAA0B,YAAY;CACtC,MAAM,mBAAmB,uBAAuB,YAAY;CAE5D,MAAM,2BADoB,QAAQ,iBAAiB,qCAAqC,EACvC,CAC9C,KAAI,SAAQ,YAAY,MAAM,EAAE,CAAC,CAAC,CAClC,OAAO,OAAO;CACjB,MAAM,gBAAgB,IAAI,IAAI,uBAAuB;CACrD,MAAM,gBAAgB,oBAAoB,gBAAgB;CAC1D,IAAI,yBAAyB;CAC7B,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,gBAAgB,4BACpB,yBACA,cAAc,UAAU,GACxB,YACA,cACA,uBACA,0BACA,mBACA,aACF;CAEA,SAAS,uBAAuB,eAA6E;EAC3G,MAAM,WAAW,EAAE,GAAG,cAAc;EACpC,SAAS,OAAO,SAAS;EACzB,MAAM,gBAAgB,0BAA0B,UAAU,gBAAgB;EAC1E,IAAI,eAAe;GACjB,MAAM,gBAAgB,cAAc;GACpC,IAAI,SAAS,SAAS,QACpB,SAAS,OAAO,cAAc;GAEhC,MAAM,kBAAkB,sBAAsB,cAAc,cAAc;GAC1E,IAAI,oBAAoB,QACtB,SAAS,OAAO,eAAe,eAAe;GAEhD,IAAI,cAAc,UAAU,OAAO,KAAK,SAAS,MAAM,CAAC,CAAC,WAAW,GAClE,SAAS,SAAS,iBAAiB,cAAc,MAAM;GAEzD,SAAS,UAAU,cAAc,eAAe,KAAK,QAAQ,OAAO,YAAY;IAC9E,MAAM,kBAAkB,UAAU,QAAQ,SAAS,IAC/C,cAAc,cACd;IACJ,OAAO,4BAA4B,QAAQ,eAAe;GAC5D,CAAC;EACH,OAEE,SAAS,UAAU,CAAC;EAEtB,OAAO;CACT;CAEA,SAAS,iBAAiB,IAAsB,aAAoD;EAClG,MAAM,QAAQ,OAAO,OAAO,WACxB,KACA,0BAA0B,IAAI,kBAAkB,UAAU;EAC9D,OAAO,uBAAuB,qBAAqB,OAAO,aAAa,iBAAiB,CAAC;CAC3F;CAEA,IAAI;CACJ,IAAI;CAEJ,SAAS,mBAAmB,SAAyC;EACnE,OAAO,QAAQ,WAAW,UACpB,QAAQ,WAAW,YAAY,QAAQ,WAAW;CAC1D;CAEA,SAAS,qBACP,WACA,SACA;EACA,IAAI,yBAAyB,KAAK,CAAC,mBAAmB,OAAO,GAC3D;EAGF,IAAI,iCAAiC,QACnC;EAGF,IAAI,gCAAgC,QAAW;GAC7C,MAAM,eAAe;GACrB,8BAA8B;GAC9B,IAAI,UAAU,aAAa,cACzB;EAEJ;EAEA,IAAI,UAAU,aAAa,MAAM,UAC/B;EAGF,+BAA+B,UAAU;EACzC,MAAM,OAAO,sBAAsB,KAAK;EACxC,AAAK,wBAAwB;GAC3B,QAAQ;GACR;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,CAAC,MAAM,WAAW;GAClB,OAAO,kCAAkC,MAAM;EACjD,CAAC,CAAC,CAAC,cAAc;GACf,+BAA+B;EACjC,CAAC;CACH;CAMA,QAJwB,2BAA2B;EACjD;EACA,cAAc;CAChB,CACsB,CAAC,CAAC;CAExB,MAAM,WAAW,OACf,iBAAiB,IAAI,MAAM,IAAI;CAEjC,MAAM,6BAA6B,iCAAiC;EAClE;EACA;EACA;EACA;CACF,CAAC;CACD,kCAAkC,2BAA2B;CAE7D,MAAM,gBAAgB,oBAAoB;EACxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,wBAAwB,2BAA2B;CACrD,CAAC;CAED,eAAe,qBAAwB,YAA8B,YAAiC;EACpG,MAAM,oBAAoB,MAAM;EAChC,IAAI,YACF,yBAAyB;EAE3B,0BAA0B;EAC1B,IAAI;GACF,MAAM,SAAS,MAAM,WAAW;GAChC,IAAI,MAAM,aAAa,mBACrB,8BAA8B,MAAM;GAEtC,OAAO;EACT,UACQ;GACN,0BAA0B;GAC1B,IAAI,0BAA0B,GAC5B,yBAAyB;EAE7B;CACF;CAEA,SAAS,wBAAwB,IAA0C;EACzE,IAAI;GACF,OAAO,iBAAiB,IAAI,MAAM,IAAI,CAAC,CAAC;EAC1C,QACM;GACJ;EACF;CACF;CAEA,eAAe,qBACb,MACA,OACA,iBAAgC,MAChC;EACA,OAAO,qBAAqB,YAAY;GACtC,MAAM,OAAO,sBAAsB,KAAK;GACxC,MAAM,SAAS,uBAAuB,oBAAoB,OAAO,IAAI,CAAC;GACtE,IAAI,CAAC,OAAO,MACV;GAEF,IAAI,2BAA2B,OAAO,UAAU;IAC9C,qBAAqB;KACnB,OAAO;KACP,QAAQ;IACV,CAAC;IACD;GACF;GACA,MAAM,SAAS,MAAM,mBAAmB;IACtC,MAAM;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,eAAe;IACf,mBAAmB;GACrB,CAAC;GACD,IAAI,CAAC,SAAS,GACZ;GAEF,IAAI,0BAA0B,cAAc,OAAO,MAAM,OAAO,GAAG,aAAa,OAAO,UAAU;IAC/F,MAAM,mBAAmB,OAAO;IAEhC,MAAM,SADiB,cAAc,IAAI,iBAAiB,IAC9B,IAAI,aAAa,YAAY,aAAa;IACtE,MAAM,eAAe,MAAM,wBACzB,QACA,EAAE,KAAK,qBAAqB,kBAAkB,kBAAkB,cAAc,EAAE,GAChF,kBACA,IACF;IACA,IAAI,cACF,OAAO;IAET,qBAAqB;KACnB,OAAO;KACP,QAAQ;IACV,CAAC;IACD,OAAO,wBAAwB,sBAAsB,WAAW,kBAAkB,IAAI;GACxF;GACA,OAAO,2BAA2B,uBAAuB,MAAM;EACjE,CAAC;CACH;CAEA,SAAS,WAAW,OAAoC;EACtD,iBAAiB,IAAI,KAAK;EAC1B,aAAa;GACX,iBAAiB,OAAO,KAAK;EAC/B;CACF;CAEA,SAAS,cAAc,OAAoC;EACzD,oBAAoB,IAAI,KAAK;EAC7B,aAAa;GACX,oBAAoB,OAAO,KAAK;EAClC;CACF;CAEA,SAAS,UAAU,MAAuC;EACxD,eAAe,IAAI,IAAI;EACvB,aAAa;GACX,eAAe,OAAO,IAAI;EAC5B;CACF;CAEA,SAAS,QAAQ,SAA6C;EAC5D,cAAc,IAAI,OAAO;EACzB,aAAa;GACX,cAAc,OAAO,OAAO;EAC9B;CACF;CAEA,MAAM,SAA2B;EAC/B;EACA,SAAS;EACT,cAAc;EACd,QAAQ,KAAqB;GAC3B,gBAAgB,MAAM;GACtB,MAAM,mBAAoB,KAAiF,QAAQ;GACnH,IAAI,kBACF,iBAAiB,UAAU;EAE/B;EACA;EACA,UAAyB;GACvB,OAAO;EACT;EACA,OAAM,OAAM,2BAA2B,cAAc,KAAK,EAAE,GAAG,wBAAwB,EAAE,CAAC;EAC1F,UAAS,OAAM,2BAA2B,cAAc,QAAQ,EAAE,GAAG,wBAAwB,EAAE,CAAC;EAChG,OAAM,UAAS,2BACP,cAAc,KAAK,KAAK,GAC9B,4BAA4B,SAAS,GAAG,OAAO,gBAAgB,CAAC,EAAE,QACpE;EACA,KAAI,UAAS,2BACL,cAAc,GAAG,KAAK,GAC5B,QAAQ,IACJ,4BAA4B,KAAK,IAAI,KAAK,GAAG,OAAO,gBAAgB,CAAC,EAAE,WACvE,MACN;EACA,eAAe,2BAA2B,cAAc,QAAQ,CAAC;EACjE,UAAU,cAAc;EACxB,WAAW,cAAc;EACzB,UAAU,cAAc;EACxB,aAAa,cAAc;EAC3B,aAAa,cAAc;EAC3B;EACA;EACA;EACA;CACF;CAEA,gBAAgB,MAAM;CACtB,gCAAgC,QAAQ,sBAAsB,0BAA0B,qBAAqB;CAE7G,OAAOA;AACT"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { registerInitialNavigationLifecycle } from "../runtime/navigationLifecycle.mjs";
|
|
1
2
|
import { getActiveRouter } from "./instance.mjs";
|
|
2
3
|
import { WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER } from "@weapp-core/constants";
|
|
3
4
|
import { queueMicrotaskPolyfill } from "@wevu/web-apis";
|
|
@@ -22,21 +23,16 @@ function snapshotQuery(query) {
|
|
|
22
23
|
for (const [key, value] of Object.entries(query)) snapshot[key] = Array.isArray(value) ? [...value] : value;
|
|
23
24
|
return snapshot;
|
|
24
25
|
}
|
|
25
|
-
function registerInitialNavigationRunner(router, runner, timeoutMs = DEFAULT_INITIAL_NAVIGATION_TIMEOUT, mode = "blocking") {
|
|
26
|
-
initialNavigationRunners.set(router, {
|
|
27
|
-
runner,
|
|
28
|
-
mode,
|
|
29
|
-
timeoutMs: normalizeTimeout(timeoutMs)
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
26
|
function getInitialNavigationTimeout() {
|
|
33
|
-
var _initialNavigationRun2, _initialNavigationRun3;
|
|
34
27
|
const router = getActiveRouter();
|
|
35
|
-
return router ?
|
|
28
|
+
return router ? initialNavigationRunners.get(router)?.timeoutMs ?? 1e4 : DEFAULT_INITIAL_NAVIGATION_TIMEOUT;
|
|
36
29
|
}
|
|
37
30
|
function isNavigationFailureResult(result) {
|
|
38
31
|
return Boolean(result && typeof result === "object" && result.__wevuNavigationFailure);
|
|
39
32
|
}
|
|
33
|
+
function getInitialNavigationPromise(instance) {
|
|
34
|
+
return initialNavigationControllers.get(instance)?.promise;
|
|
35
|
+
}
|
|
40
36
|
function ensureInitialNavigation(instance, query, options = {}) {
|
|
41
37
|
const existing = initialNavigationControllers.get(instance);
|
|
42
38
|
if (existing) {
|
|
@@ -46,9 +42,9 @@ function ensureInitialNavigation(instance, query, options = {}) {
|
|
|
46
42
|
}
|
|
47
43
|
const router = getActiveRouter();
|
|
48
44
|
const registration = router ? initialNavigationRunners.get(router) : void 0;
|
|
49
|
-
let pendingRunner = registration
|
|
45
|
+
let pendingRunner = registration?.runner;
|
|
50
46
|
if (!pendingRunner) return;
|
|
51
|
-
const blocking =
|
|
47
|
+
const blocking = registration?.mode === "blocking";
|
|
52
48
|
let page = snapshotPage(instance);
|
|
53
49
|
let initialQuery = snapshotQuery(query);
|
|
54
50
|
let currentStatus = "idle";
|
|
@@ -105,13 +101,12 @@ function ensureInitialNavigation(instance, query, options = {}) {
|
|
|
105
101
|
if (currentStatus !== "idle") return;
|
|
106
102
|
currentStatus = "running";
|
|
107
103
|
if (blocking) timeoutHandle = setTimeout(() => {
|
|
108
|
-
var _ref, _page$route;
|
|
109
104
|
if (currentStatus !== "running") return;
|
|
110
|
-
console.warn(`${WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER} initial navigation exceeded ${timeoutMs}ms; mounting page`,
|
|
105
|
+
console.warn(`${WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER} initial navigation exceeded ${timeoutMs}ms; mounting page`, page?.route ?? page?.__route__ ?? "");
|
|
111
106
|
settle("timed-out", true);
|
|
112
107
|
}, timeoutMs);
|
|
113
108
|
const runnerPage = page;
|
|
114
|
-
const runnerQuery = snapshotQuery(startQuery
|
|
109
|
+
const runnerQuery = snapshotQuery(startQuery ?? initialQuery);
|
|
115
110
|
const runner = pendingRunner;
|
|
116
111
|
pendingRunner = void 0;
|
|
117
112
|
if (!runner || !runnerPage) {
|
|
@@ -135,10 +130,20 @@ function ensureInitialNavigation(instance, query, options = {}) {
|
|
|
135
130
|
return blocking ? promise : void 0;
|
|
136
131
|
}
|
|
137
132
|
function cancelInitialNavigation(instance) {
|
|
138
|
-
|
|
139
|
-
|
|
133
|
+
initialNavigationControllers.get(instance)?.cancel();
|
|
134
|
+
}
|
|
135
|
+
function registerInitialNavigationRunner(router, runner, timeoutMs = DEFAULT_INITIAL_NAVIGATION_TIMEOUT, mode = "blocking") {
|
|
136
|
+
registerInitialNavigationLifecycle({
|
|
137
|
+
ensure: ensureInitialNavigation,
|
|
138
|
+
cancel: cancelInitialNavigation
|
|
139
|
+
});
|
|
140
|
+
initialNavigationRunners.set(router, {
|
|
141
|
+
runner,
|
|
142
|
+
mode,
|
|
143
|
+
timeoutMs: normalizeTimeout(timeoutMs)
|
|
144
|
+
});
|
|
140
145
|
}
|
|
141
146
|
|
|
142
147
|
//#endregion
|
|
143
|
-
export { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, cancelInitialNavigation, ensureInitialNavigation, getInitialNavigationTimeout, registerInitialNavigationRunner };
|
|
148
|
+
export { DEFAULT_INITIAL_NAVIGATION_TIMEOUT, cancelInitialNavigation, ensureInitialNavigation, getInitialNavigationPromise, getInitialNavigationTimeout, registerInitialNavigationRunner };
|
|
144
149
|
//# sourceMappingURL=initialNavigation.mjs.map
|