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":"initialNavigation.mjs","names":[],"sources":["../../../src/router/initialNavigation.ts"],"sourcesContent":["import type { MiniProgramPageLike } from '../routerInternal/shared'\nimport type { InitialNavigationMode, LocationQueryRaw, NavigationFailure } from './types'\nimport { WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER } from '@weapp-core/constants'\nimport { queueMicrotaskPolyfill } from '@wevu/web-apis'\nimport { getActiveRouter } from './instance'\n\nexport const DEFAULT_INITIAL_NAVIGATION_TIMEOUT = 10_000\n\nexport type InitialNavigationStatus = 'idle' | 'running' | 'allowed' | 'aborted' | 'timed-out' | 'cancelled'\n\ninterface InitialNavigationRunnerRegistration {\n runner: InitialNavigationRunner\n mode: InitialNavigationMode\n timeoutMs: number\n}\n\nexport type InitialNavigationRunner = (\n page: MiniProgramPageLike,\n query?: LocationQueryRaw,\n isActive?: () => boolean,\n) => Promise<void | NavigationFailure>\n\ninterface InitialNavigationController {\n readonly promise: Promise<boolean>\n readonly blocking: boolean\n readonly status: () => InitialNavigationStatus\n subscribe: (callback: (shouldMount: boolean) => void) => () => void\n start: (query?: LocationQueryRaw) => void\n cancel: () => void\n}\n\nconst initialNavigationRunners = new WeakMap<object, InitialNavigationRunnerRegistration>()\nconst initialNavigationControllers = new WeakMap<object, InitialNavigationController>()\n\nfunction normalizeTimeout(timeoutMs: number) {\n return Number.isFinite(timeoutMs) && timeoutMs > 0\n ? Math.max(1, Math.trunc(timeoutMs))\n : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n}\n\nfunction snapshotPage(instance: MiniProgramPageLike): MiniProgramPageLike {\n return {\n route: typeof instance.route === 'string' ? instance.route : undefined,\n __route__: typeof instance.__route__ === 'string' ? instance.__route__ : undefined,\n options: instance.options && typeof instance.options === 'object'\n ? { ...instance.options }\n : undefined,\n }\n}\n\nfunction snapshotQuery(query: LocationQueryRaw | undefined): LocationQueryRaw | undefined {\n if (!query || typeof query !== 'object') {\n return undefined\n }\n const snapshot: LocationQueryRaw = {}\n for (const [key, value] of Object.entries(query)) {\n snapshot[key] = Array.isArray(value) ? [...value] : value\n }\n return snapshot\n}\n\nexport function registerInitialNavigationRunner(\n router: object,\n runner: InitialNavigationRunner,\n timeoutMs = DEFAULT_INITIAL_NAVIGATION_TIMEOUT,\n mode: InitialNavigationMode = 'blocking',\n) {\n initialNavigationRunners.set(router, {\n runner,\n mode,\n timeoutMs: normalizeTimeout(timeoutMs),\n })\n}\n\nexport function getInitialNavigationRunner(): InitialNavigationRunner | undefined {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.runner : undefined\n}\n\nexport function getInitialNavigationTimeout() {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.timeoutMs ?? DEFAULT_INITIAL_NAVIGATION_TIMEOUT : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n}\n\nexport function getInitialNavigationMode(): InitialNavigationMode {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.mode ?? 'eager' : 'eager'\n}\n\nfunction isNavigationFailureResult(result: void | NavigationFailure): result is NavigationFailure {\n return Boolean(result && typeof result === 'object' && (result as NavigationFailure).__wevuNavigationFailure)\n}\n\nexport function getInitialNavigationPromise(instance: MiniProgramPageLike) {\n return initialNavigationControllers.get(instance as object)?.promise\n}\n\nexport function getInitialNavigationStatus(instance: MiniProgramPageLike) {\n return initialNavigationControllers.get(instance as object)?.status()\n}\n\nexport function ensureInitialNavigation(\n instance: MiniProgramPageLike,\n query?: LocationQueryRaw,\n options: { start?: boolean, onComplete?: (shouldMount: boolean) => void } = {},\n) {\n const existing = initialNavigationControllers.get(instance as object)\n if (existing) {\n if (options.onComplete && existing.blocking) {\n existing.subscribe(options.onComplete)\n }\n if (options.start !== false) {\n existing.start(query)\n }\n return existing.blocking ? existing.promise : undefined\n }\n\n const router = getActiveRouter()\n const registration = router ? initialNavigationRunners.get(router) : undefined\n let pendingRunner = registration?.runner\n if (!pendingRunner) {\n return undefined\n }\n const blocking = registration?.mode === 'blocking'\n\n let page: MiniProgramPageLike | undefined = snapshotPage(instance)\n let initialQuery = snapshotQuery(query)\n let currentStatus: InitialNavigationStatus = 'idle'\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n const timeoutMs = getInitialNavigationTimeout()\n let resolveNavigation!: (shouldMount: boolean) => void\n const completionCallbacks = new Set<{ callback: (shouldMount: boolean) => void, active: boolean }>()\n const promise = new Promise<boolean>((resolve) => {\n resolveNavigation = resolve\n })\n\n const settle = (status: Exclude<InitialNavigationStatus, 'idle' | 'running'>, shouldMount: boolean) => {\n if (currentStatus !== 'idle' && currentStatus !== 'running') {\n return\n }\n currentStatus = status\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n timeoutHandle = undefined\n }\n const callbacks = [...completionCallbacks]\n completionCallbacks.clear()\n pendingRunner = undefined\n page = undefined\n initialQuery = undefined\n resolveNavigation(shouldMount)\n queueMicrotaskPolyfill(() => {\n if (currentStatus !== 'allowed' && currentStatus !== 'timed-out') {\n return\n }\n for (const entry of callbacks) {\n if (entry.active) {\n entry.callback(shouldMount)\n entry.active = false\n }\n }\n })\n }\n\n const controller: InitialNavigationController = {\n promise,\n blocking,\n status: () => currentStatus,\n subscribe(callback) {\n const entry = { callback, active: true }\n if (currentStatus !== 'idle' && currentStatus !== 'running') {\n queueMicrotaskPolyfill(() => {\n if (entry.active && (currentStatus === 'allowed' || currentStatus === 'timed-out')) {\n callback(currentStatus === 'allowed' || currentStatus === 'timed-out')\n entry.active = false\n }\n })\n }\n else {\n completionCallbacks.add(entry)\n }\n return () => {\n entry.active = false\n completionCallbacks.delete(entry)\n }\n },\n start(startQuery?: LocationQueryRaw) {\n if (currentStatus !== 'idle') {\n return\n }\n currentStatus = 'running'\n if (blocking) {\n timeoutHandle = setTimeout(() => {\n if (currentStatus !== 'running') {\n return\n }\n // 超时是可恢复的运行时诊断,保留稳定 marker 供宿主和 E2E 观测。\n // eslint-disable-next-line no-console\n console.warn(`${WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER} initial navigation exceeded ${timeoutMs}ms; mounting page`, page?.route ?? page?.__route__ ?? '')\n settle('timed-out', true)\n }, timeoutMs)\n }\n const runnerPage = page\n const runnerQuery = snapshotQuery(startQuery ?? initialQuery)\n const runner = pendingRunner\n pendingRunner = undefined\n if (!runner || !runnerPage) {\n settle('aborted', false)\n return\n }\n void runner(runnerPage, runnerQuery, () => currentStatus === 'running').then((result) => {\n const failed = isNavigationFailureResult(result)\n settle(failed ? 'aborted' : 'allowed', !failed)\n }, () => {\n settle('aborted', false)\n })\n },\n cancel() {\n settle('cancelled', false)\n },\n }\n\n initialNavigationControllers.set(instance as object, controller)\n if (options.onComplete && blocking) {\n controller.subscribe(options.onComplete)\n }\n if (options.start !== false) {\n controller.start(query)\n }\n return blocking ? promise : undefined\n}\n\nexport function cancelInitialNavigation(instance: MiniProgramPageLike) {\n initialNavigationControllers.get(instance as object)?.cancel()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"initialNavigation.mjs","names":[],"sources":["../../../src/router/initialNavigation.ts"],"sourcesContent":["import type { MiniProgramPageLike } from '../routerInternal/shared'\nimport type { InitialNavigationMode, LocationQueryRaw, NavigationFailure } from './types'\nimport { WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER } from '@weapp-core/constants'\nimport { queueMicrotaskPolyfill } from '@wevu/web-apis'\nimport { registerInitialNavigationLifecycle } from '../runtime/navigationLifecycle'\nimport { getActiveRouter } from './instance'\n\nexport const DEFAULT_INITIAL_NAVIGATION_TIMEOUT = 10_000\n\nexport type InitialNavigationStatus = 'idle' | 'running' | 'allowed' | 'aborted' | 'timed-out' | 'cancelled'\n\ninterface InitialNavigationRunnerRegistration {\n runner: InitialNavigationRunner\n mode: InitialNavigationMode\n timeoutMs: number\n}\n\nexport type InitialNavigationRunner = (\n page: MiniProgramPageLike,\n query?: LocationQueryRaw,\n isActive?: () => boolean,\n) => Promise<void | NavigationFailure>\n\ninterface InitialNavigationController {\n readonly promise: Promise<boolean>\n readonly blocking: boolean\n readonly status: () => InitialNavigationStatus\n subscribe: (callback: (shouldMount: boolean) => void) => () => void\n start: (query?: LocationQueryRaw) => void\n cancel: () => void\n}\n\nconst initialNavigationRunners = new WeakMap<object, InitialNavigationRunnerRegistration>()\nconst initialNavigationControllers = new WeakMap<object, InitialNavigationController>()\n\nfunction normalizeTimeout(timeoutMs: number) {\n return Number.isFinite(timeoutMs) && timeoutMs > 0\n ? Math.max(1, Math.trunc(timeoutMs))\n : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n}\n\nfunction snapshotPage(instance: MiniProgramPageLike): MiniProgramPageLike {\n return {\n route: typeof instance.route === 'string' ? instance.route : undefined,\n __route__: typeof instance.__route__ === 'string' ? instance.__route__ : undefined,\n options: instance.options && typeof instance.options === 'object'\n ? { ...instance.options }\n : undefined,\n }\n}\n\nfunction snapshotQuery(query: LocationQueryRaw | undefined): LocationQueryRaw | undefined {\n if (!query || typeof query !== 'object') {\n return undefined\n }\n const snapshot: LocationQueryRaw = {}\n for (const [key, value] of Object.entries(query)) {\n snapshot[key] = Array.isArray(value) ? [...value] : value\n }\n return snapshot\n}\n\nexport function getInitialNavigationRunner(): InitialNavigationRunner | undefined {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.runner : undefined\n}\n\nexport function getInitialNavigationTimeout() {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.timeoutMs ?? DEFAULT_INITIAL_NAVIGATION_TIMEOUT : DEFAULT_INITIAL_NAVIGATION_TIMEOUT\n}\n\nexport function getInitialNavigationMode(): InitialNavigationMode {\n const router = getActiveRouter()\n return router ? initialNavigationRunners.get(router)?.mode ?? 'eager' : 'eager'\n}\n\nfunction isNavigationFailureResult(result: void | NavigationFailure): result is NavigationFailure {\n return Boolean(result && typeof result === 'object' && (result as NavigationFailure).__wevuNavigationFailure)\n}\n\nexport function getInitialNavigationPromise(instance: MiniProgramPageLike) {\n return initialNavigationControllers.get(instance as object)?.promise\n}\n\nexport function getInitialNavigationStatus(instance: MiniProgramPageLike) {\n return initialNavigationControllers.get(instance as object)?.status()\n}\n\nexport function ensureInitialNavigation(\n instance: MiniProgramPageLike,\n query?: LocationQueryRaw,\n options: { start?: boolean, onComplete?: (shouldMount: boolean) => void } = {},\n) {\n const existing = initialNavigationControllers.get(instance as object)\n if (existing) {\n if (options.onComplete && existing.blocking) {\n existing.subscribe(options.onComplete)\n }\n if (options.start !== false) {\n existing.start(query)\n }\n return existing.blocking ? existing.promise : undefined\n }\n\n const router = getActiveRouter()\n const registration = router ? initialNavigationRunners.get(router) : undefined\n let pendingRunner = registration?.runner\n if (!pendingRunner) {\n return undefined\n }\n const blocking = registration?.mode === 'blocking'\n\n let page: MiniProgramPageLike | undefined = snapshotPage(instance)\n let initialQuery = snapshotQuery(query)\n let currentStatus: InitialNavigationStatus = 'idle'\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n const timeoutMs = getInitialNavigationTimeout()\n let resolveNavigation!: (shouldMount: boolean) => void\n const completionCallbacks = new Set<{ callback: (shouldMount: boolean) => void, active: boolean }>()\n const promise = new Promise<boolean>((resolve) => {\n resolveNavigation = resolve\n })\n\n const settle = (status: Exclude<InitialNavigationStatus, 'idle' | 'running'>, shouldMount: boolean) => {\n if (currentStatus !== 'idle' && currentStatus !== 'running') {\n return\n }\n currentStatus = status\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n timeoutHandle = undefined\n }\n const callbacks = [...completionCallbacks]\n completionCallbacks.clear()\n pendingRunner = undefined\n page = undefined\n initialQuery = undefined\n resolveNavigation(shouldMount)\n queueMicrotaskPolyfill(() => {\n if (currentStatus !== 'allowed' && currentStatus !== 'timed-out') {\n return\n }\n for (const entry of callbacks) {\n if (entry.active) {\n entry.callback(shouldMount)\n entry.active = false\n }\n }\n })\n }\n\n const controller: InitialNavigationController = {\n promise,\n blocking,\n status: () => currentStatus,\n subscribe(callback) {\n const entry = { callback, active: true }\n if (currentStatus !== 'idle' && currentStatus !== 'running') {\n queueMicrotaskPolyfill(() => {\n if (entry.active && (currentStatus === 'allowed' || currentStatus === 'timed-out')) {\n callback(currentStatus === 'allowed' || currentStatus === 'timed-out')\n entry.active = false\n }\n })\n }\n else {\n completionCallbacks.add(entry)\n }\n return () => {\n entry.active = false\n completionCallbacks.delete(entry)\n }\n },\n start(startQuery?: LocationQueryRaw) {\n if (currentStatus !== 'idle') {\n return\n }\n currentStatus = 'running'\n if (blocking) {\n timeoutHandle = setTimeout(() => {\n if (currentStatus !== 'running') {\n return\n }\n // 超时是可恢复的运行时诊断,保留稳定 marker 供宿主和 E2E 观测。\n // eslint-disable-next-line no-console\n console.warn(`${WEVU_INITIAL_NAVIGATION_TIMEOUT_MARKER} initial navigation exceeded ${timeoutMs}ms; mounting page`, page?.route ?? page?.__route__ ?? '')\n settle('timed-out', true)\n }, timeoutMs)\n }\n const runnerPage = page\n const runnerQuery = snapshotQuery(startQuery ?? initialQuery)\n const runner = pendingRunner\n pendingRunner = undefined\n if (!runner || !runnerPage) {\n settle('aborted', false)\n return\n }\n void runner(runnerPage, runnerQuery, () => currentStatus === 'running').then((result) => {\n const failed = isNavigationFailureResult(result)\n settle(failed ? 'aborted' : 'allowed', !failed)\n }, () => {\n settle('aborted', false)\n })\n },\n cancel() {\n settle('cancelled', false)\n },\n }\n\n initialNavigationControllers.set(instance as object, controller)\n if (options.onComplete && blocking) {\n controller.subscribe(options.onComplete)\n }\n if (options.start !== false) {\n controller.start(query)\n }\n return blocking ? promise : undefined\n}\n\nexport function cancelInitialNavigation(instance: MiniProgramPageLike) {\n initialNavigationControllers.get(instance as object)?.cancel()\n}\n\nexport function registerInitialNavigationRunner(\n router: object,\n runner: InitialNavigationRunner,\n timeoutMs = DEFAULT_INITIAL_NAVIGATION_TIMEOUT,\n mode: InitialNavigationMode = 'blocking',\n) {\n registerInitialNavigationLifecycle({ ensure: ensureInitialNavigation, cancel: cancelInitialNavigation })\n initialNavigationRunners.set(router, {\n runner,\n mode,\n timeoutMs: normalizeTimeout(timeoutMs),\n })\n}\n"],"mappings":"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"}
|
|
@@ -8,8 +8,7 @@ function setActiveRouter(router) {
|
|
|
8
8
|
provideGlobal(ROUTER_INSTANCE_KEY, router);
|
|
9
9
|
}
|
|
10
10
|
function getActiveRouter() {
|
|
11
|
-
|
|
12
|
-
return (_activeRouter = activeRouter) !== null && _activeRouter !== void 0 ? _activeRouter : injectGlobal(ROUTER_INSTANCE_KEY, void 0);
|
|
11
|
+
return activeRouter ?? injectGlobal(ROUTER_INSTANCE_KEY, void 0);
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.mjs","names":[],"sources":["../../../src/router/instance.ts"],"sourcesContent":["import type { RouterNavigation } from './types'\nimport { injectGlobal, provideGlobal } from '../runtime/provide'\n\nconst ROUTER_INSTANCE_KEY = Symbol('wevu.router.instance')\n\nlet activeRouter: RouterNavigation | undefined\n\nexport function setActiveRouter(router: RouterNavigation) {\n activeRouter = router\n provideGlobal(ROUTER_INSTANCE_KEY, router)\n}\n\nexport function clearActiveRouter() {\n activeRouter = undefined\n provideGlobal(ROUTER_INSTANCE_KEY, undefined)\n}\n\nexport function getActiveRouter() {\n return activeRouter ?? injectGlobal<RouterNavigation | undefined>(ROUTER_INSTANCE_KEY, undefined)\n}\n"],"mappings":";;;AAGA,MAAM,sBAAsB,OAAO,sBAAsB;AAEzD,IAAI;AAEJ,SAAgB,gBAAgB,QAA0B;CACxD,eAAe;CACf,cAAc,qBAAqB,MAAM;AAC3C;AAOA,SAAgB,kBAAkB
|
|
1
|
+
{"version":3,"file":"instance.mjs","names":[],"sources":["../../../src/router/instance.ts"],"sourcesContent":["import type { RouterNavigation } from './types'\nimport { injectGlobal, provideGlobal } from '../runtime/provide'\n\nconst ROUTER_INSTANCE_KEY = Symbol('wevu.router.instance')\n\nlet activeRouter: RouterNavigation | undefined\n\nexport function setActiveRouter(router: RouterNavigation) {\n activeRouter = router\n provideGlobal(ROUTER_INSTANCE_KEY, router)\n}\n\nexport function clearActiveRouter() {\n activeRouter = undefined\n provideGlobal(ROUTER_INSTANCE_KEY, undefined)\n}\n\nexport function getActiveRouter() {\n return activeRouter ?? injectGlobal<RouterNavigation | undefined>(ROUTER_INSTANCE_KEY, undefined)\n}\n"],"mappings":";;;AAGA,MAAM,sBAAsB,OAAO,sBAAsB;AAEzD,IAAI;AAEJ,SAAgB,gBAAgB,QAA0B;CACxD,eAAe;CACf,cAAc,qBAAqB,MAAM;AAC3C;AAOA,SAAgB,kBAAkB;CAChC,OAAO,gBAAgB,aAA2C,qBAAqB,MAAS;AAClG"}
|
|
@@ -112,12 +112,12 @@ function executeNavigationMethod(method, options, to, from) {
|
|
|
112
112
|
async function runAfterEachHooks(hooks, context) {
|
|
113
113
|
for (const hook of hooks) try {
|
|
114
114
|
await hook(context.to, context.from, context.failure, context);
|
|
115
|
-
} catch
|
|
115
|
+
} catch {}
|
|
116
116
|
}
|
|
117
117
|
async function runNavigationErrorHooks(handlers, error, context) {
|
|
118
118
|
for (const handler of handlers) try {
|
|
119
119
|
await handler(error, context);
|
|
120
|
-
} catch
|
|
120
|
+
} catch {}
|
|
121
121
|
}
|
|
122
122
|
function isNativeFailureLikeError(value) {
|
|
123
123
|
if (!value || typeof value !== "object") return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigationCore.mjs","names":[],"sources":["../../../src/router/navigationCore.ts"],"sourcesContent":["import type { WevuNamedRouteMap } from '../router'\nimport type {\n NavigationAfterEach,\n NavigationAfterEachContext,\n NavigationErrorContext,\n NavigationErrorHandler,\n NavigationFailure,\n NavigationFailureTypeValue,\n NavigationGuard,\n NavigationGuardContext,\n NavigationRedirect,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n} from './types'\nimport { NavigationFailureType } from './types'\n\nconst DUPLICATED_RE = /already|same|duplicat|重复/\nconst CANCELLED_RE = /cancel|取消/\nconst ABORTED_RE = /abort|interrupt|中断/\n\nfunction normalizeNavigationErrorMessage(error: unknown): string {\n if (typeof error === 'string') {\n return error\n }\n if (error && typeof error === 'object') {\n const message = (error as Record<string, unknown>).errMsg\n if (typeof message === 'string') {\n return message\n }\n if (error instanceof Error) {\n return error.message\n }\n }\n return ''\n}\n\nfunction resolveNavigationFailureType(error: unknown): NavigationFailureTypeValue {\n const normalizedMessage = normalizeNavigationErrorMessage(error).toLowerCase()\n if (DUPLICATED_RE.test(normalizedMessage)) {\n return NavigationFailureType.duplicated\n }\n if (CANCELLED_RE.test(normalizedMessage)) {\n return NavigationFailureType.cancelled\n }\n if (ABORTED_RE.test(normalizedMessage)) {\n return NavigationFailureType.aborted\n }\n return NavigationFailureType.unknown\n}\n\nexport function createNavigationFailure<TRouteMap extends object = WevuNamedRouteMap>(\n type: NavigationFailureTypeValue,\n to?: RouteLocationNormalizedLoaded<NoInfer<TRouteMap>>,\n from?: RouteLocationNormalizedLoaded<NoInfer<TRouteMap>>,\n cause?: unknown,\n): NavigationFailure<TRouteMap> {\n const message = normalizeNavigationErrorMessage(cause) || 'Navigation failed'\n return Object.assign(new Error(message), {\n __wevuNavigationFailure: true as const,\n type,\n to,\n from,\n cause,\n })\n}\n\nexport function isNavigationFailure<TRouteMap extends object = WevuNamedRouteMap>(\n error: unknown,\n type?: NavigationFailureTypeValue,\n): error is NavigationFailure<TRouteMap> {\n if (!error || typeof error !== 'object') {\n return false\n }\n const navigationError = error as Partial<NavigationFailure>\n if (navigationError.__wevuNavigationFailure !== true) {\n return false\n }\n if (type === undefined) {\n return true\n }\n return navigationError.type === type\n}\n\ninterface GuardPipelineContinue {\n status: 'continue'\n}\n\ninterface GuardPipelineFailure {\n status: 'failure'\n failure: NavigationFailure\n}\n\ninterface GuardPipelineRedirect {\n status: 'redirect'\n target: RouteLocationNormalizedLoaded\n replace?: boolean\n}\n\nexport type GuardPipelineResult = GuardPipelineContinue | GuardPipelineFailure | GuardPipelineRedirect\n\nexport function isNavigationRedirectCandidate(value: unknown): value is NavigationRedirect {\n if (!value || typeof value !== 'object') {\n return false\n }\n return 'to' in (value as Record<string, unknown>)\n}\n\nfunction isRouteLocationRawCandidate(value: unknown): value is RouteLocationRaw {\n if (typeof value === 'string') {\n return true\n }\n if (!value || typeof value !== 'object') {\n return false\n }\n const candidate = value as Record<string, unknown>\n return 'path' in candidate\n || 'fullPath' in candidate\n || 'query' in candidate\n || 'hash' in candidate\n || 'name' in candidate\n || 'params' in candidate\n}\n\nexport async function runNavigationGuards(\n guards: ReadonlySet<NavigationGuard>,\n context: NavigationGuardContext,\n resolveRoute: (to: RouteLocationRaw, currentPath: string) => RouteLocationNormalizedLoaded,\n): Promise<GuardPipelineResult> {\n for (const guard of guards) {\n try {\n const result = await guard(context.to, context.from, context)\n if (isNavigationFailure(result)) {\n return {\n status: 'failure',\n failure: result,\n }\n }\n if (result === false) {\n return {\n status: 'failure',\n failure: createNavigationFailure(\n NavigationFailureType.aborted,\n context.to,\n context.from,\n 'Navigation aborted by guard',\n ),\n }\n }\n if (isNavigationRedirectCandidate(result)) {\n if (!context.to) {\n return {\n status: 'failure',\n failure: createNavigationFailure(\n NavigationFailureType.aborted,\n context.to,\n context.from,\n 'Redirect is not supported in back navigation guards',\n ),\n }\n }\n return {\n status: 'redirect',\n target: resolveRoute(result.to, context.to.path),\n replace: result.replace,\n }\n }\n if (isRouteLocationRawCandidate(result)) {\n if (!context.to) {\n return {\n status: 'failure',\n failure: createNavigationFailure(\n NavigationFailureType.aborted,\n context.to,\n context.from,\n 'Redirect is not supported in back navigation guards',\n ),\n }\n }\n return {\n status: 'redirect',\n target: resolveRoute(result, context.to.path),\n }\n }\n }\n catch (error) {\n return {\n status: 'failure',\n failure: createNavigationFailure(NavigationFailureType.aborted, context.to, context.from, error),\n }\n }\n }\n return { status: 'continue' }\n}\n\nexport function executeNavigationMethod(\n method: (options: Record<string, any>) => unknown,\n options: Record<string, any>,\n to?: RouteLocationNormalizedLoaded,\n from?: RouteLocationNormalizedLoaded,\n): Promise<void | NavigationFailure> {\n return new Promise((resolve) => {\n let settled = false\n const finalize = (result?: void | NavigationFailure) => {\n if (settled) {\n return\n }\n settled = true\n resolve(result)\n }\n\n try {\n const maybePromise = method({\n ...options,\n success: () => finalize(),\n fail: (error: unknown) => {\n finalize(createNavigationFailure(resolveNavigationFailureType(error), to, from, error))\n },\n })\n\n if (maybePromise && typeof (maybePromise as PromiseLike<unknown>).then === 'function') {\n ;(maybePromise as PromiseLike<unknown>).then(\n () => finalize(),\n error => finalize(createNavigationFailure(resolveNavigationFailureType(error), to, from, error)),\n )\n }\n }\n catch (error) {\n finalize(createNavigationFailure(resolveNavigationFailureType(error), to, from, error))\n }\n })\n}\n\nexport async function runAfterEachHooks(\n hooks: ReadonlySet<NavigationAfterEach>,\n context: NavigationAfterEachContext,\n) {\n for (const hook of hooks) {\n try {\n await hook(context.to, context.from, context.failure, context)\n }\n catch {\n // 忽略 afterEach hook 的异常,避免影响导航主流程。\n }\n }\n}\n\nexport async function runNavigationErrorHooks(\n handlers: ReadonlySet<NavigationErrorHandler>,\n error: unknown,\n context: NavigationErrorContext,\n) {\n for (const handler of handlers) {\n try {\n await handler(error, context)\n }\n catch {\n // 忽略 onError 回调中的异常,避免影响导航主流程。\n }\n }\n}\n\nfunction isNativeFailureLikeError(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false\n }\n const errMsg = (value as Record<string, unknown>).errMsg\n return typeof errMsg === 'string'\n}\n\nexport function shouldEmitNavigationError(failure: NavigationFailure): boolean {\n if (failure.type === NavigationFailureType.unknown) {\n return true\n }\n if (failure.cause instanceof Error) {\n return true\n }\n if (failure.type === NavigationFailureType.aborted && failure.cause !== undefined) {\n if (typeof failure.cause === 'string') {\n return false\n }\n if (isNativeFailureLikeError(failure.cause)) {\n return false\n }\n return true\n }\n return false\n}\n"],"mappings":";;;AAgBA,MAAM,gBAAgB;AACtB,MAAM,eAAe;AACrB,MAAM,aAAa;AAEnB,SAAS,gCAAgC,OAAwB;CAC/D,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,UAAW,MAAkC;EACnD,IAAI,OAAO,YAAY,UACrB,OAAO;EAET,IAAI,iBAAiB,OACnB,OAAO,MAAM;CAEjB;CACA,OAAO;AACT;AAEA,SAAS,6BAA6B,OAA4C;CAChF,MAAM,oBAAoB,gCAAgC,KAAK,CAAC,CAAC,YAAY;CAC7E,IAAI,cAAc,KAAK,iBAAiB,GACtC,OAAO,sBAAsB;CAE/B,IAAI,aAAa,KAAK,iBAAiB,GACrC,OAAO,sBAAsB;CAE/B,IAAI,WAAW,KAAK,iBAAiB,GACnC,OAAO,sBAAsB;CAE/B,OAAO,sBAAsB;AAC/B;AAEA,SAAgB,wBACd,MACA,IACA,MACA,OAC8B;CAC9B,MAAM,UAAU,gCAAgC,KAAK,KAAK;CAC1D,OAAO,OAAO,OAAO,IAAI,MAAM,OAAO,GAAG;EACvC,yBAAyB;EACzB;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,SAAgB,oBACd,OACA,MACuC;CACvC,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAET,MAAM,kBAAkB;CACxB,IAAI,gBAAgB,4BAA4B,MAC9C,OAAO;CAET,IAAI,SAAS,QACX,OAAO;CAET,OAAO,gBAAgB,SAAS;AAClC;AAmBA,SAAgB,8BAA8B,OAA6C;CACzF,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAET,OAAO,QAAS;AAClB;AAEA,SAAS,4BAA4B,OAA2C;CAC9E,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAET,MAAM,YAAY;CAClB,OAAO,UAAU,aACZ,cAAc,aACd,WAAW,aACX,UAAU,aACV,UAAU,aACV,YAAY;AACnB;AAEA,eAAsB,oBACpB,QACA,SACA,cAC8B;CAC9B,KAAK,MAAM,SAAS,QAClB,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,QAAQ,MAAM,OAAO;EAC5D,IAAI,oBAAoB,MAAM,GAC5B,OAAO;GACL,QAAQ;GACR,SAAS;EACX;EAEF,IAAI,WAAW,OACb,OAAO;GACL,QAAQ;GACR,SAAS,wBACP,sBAAsB,SACtB,QAAQ,IACR,QAAQ,MACR,6BACF;EACF;EAEF,IAAI,8BAA8B,MAAM,GAAG;GACzC,IAAI,CAAC,QAAQ,IACX,OAAO;IACL,QAAQ;IACR,SAAS,wBACP,sBAAsB,SACtB,QAAQ,IACR,QAAQ,MACR,qDACF;GACF;GAEF,OAAO;IACL,QAAQ;IACR,QAAQ,aAAa,OAAO,IAAI,QAAQ,GAAG,IAAI;IAC/C,SAAS,OAAO;GAClB;EACF;EACA,IAAI,4BAA4B,MAAM,GAAG;GACvC,IAAI,CAAC,QAAQ,IACX,OAAO;IACL,QAAQ;IACR,SAAS,wBACP,sBAAsB,SACtB,QAAQ,IACR,QAAQ,MACR,qDACF;GACF;GAEF,OAAO;IACL,QAAQ;IACR,QAAQ,aAAa,QAAQ,QAAQ,GAAG,IAAI;GAC9C;EACF;CACF,SACO,OAAO;EACZ,OAAO;GACL,QAAQ;GACR,SAAS,wBAAwB,sBAAsB,SAAS,QAAQ,IAAI,QAAQ,MAAM,KAAK;EACjG;CACF;CAEF,OAAO,EAAE,QAAQ,WAAW;AAC9B;AAEA,SAAgB,wBACd,QACA,SACA,IACA,MACmC;CACnC,OAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,UAAU;EACd,MAAM,YAAY,WAAsC;GACtD,IAAI,SACF;GAEF,UAAU;GACV,QAAQ,MAAM;EAChB;EAEA,IAAI;GACF,MAAM,eAAe,OAAO;IAC1B,GAAG;IACH,eAAe,SAAS;IACxB,OAAO,UAAmB;KACxB,SAAS,wBAAwB,6BAA6B,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC;IACxF;GACF,CAAC;GAED,IAAI,gBAAgB,OAAQ,aAAsC,SAAS,YACxE,AAAC,aAAsC,WAChC,SAAS,IACf,UAAS,SAAS,wBAAwB,6BAA6B,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC,CACjG;EAEJ,SACO,OAAO;GACZ,SAAS,wBAAwB,6BAA6B,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC;EACxF;CACF,CAAC;AACH;AAEA,eAAsB,kBACpB,OACA,SACA;CACA,KAAK,MAAM,QAAQ,OACjB,IAAI;EACF,MAAM,KAAK,QAAQ,IAAI,QAAQ,MAAM,QAAQ,SAAS,OAAO;CAC/D,kBACM,CAEN;AAEJ;AAEA,eAAsB,wBACpB,UACA,OACA,SACA;CACA,KAAK,MAAM,WAAW,UACpB,IAAI;EACF,MAAM,QAAQ,OAAO,OAAO;CAC9B,mBACM,CAEN;AAEJ;AAEA,SAAS,yBAAyB,OAAyB;CACzD,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAGT,OAAO,OADS,MAAkC,WACzB;AAC3B;AAEA,SAAgB,0BAA0B,SAAqC;CAC7E,IAAI,QAAQ,SAAS,sBAAsB,SACzC,OAAO;CAET,IAAI,QAAQ,iBAAiB,OAC3B,OAAO;CAET,IAAI,QAAQ,SAAS,sBAAsB,WAAW,QAAQ,UAAU,QAAW;EACjF,IAAI,OAAO,QAAQ,UAAU,UAC3B,OAAO;EAET,IAAI,yBAAyB,QAAQ,KAAK,GACxC,OAAO;EAET,OAAO;CACT;CACA,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"navigationCore.mjs","names":[],"sources":["../../../src/router/navigationCore.ts"],"sourcesContent":["import type { WevuNamedRouteMap } from '../router'\nimport type {\n NavigationAfterEach,\n NavigationAfterEachContext,\n NavigationErrorContext,\n NavigationErrorHandler,\n NavigationFailure,\n NavigationFailureTypeValue,\n NavigationGuard,\n NavigationGuardContext,\n NavigationRedirect,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n} from './types'\nimport { NavigationFailureType } from './types'\n\nconst DUPLICATED_RE = /already|same|duplicat|重复/\nconst CANCELLED_RE = /cancel|取消/\nconst ABORTED_RE = /abort|interrupt|中断/\n\nfunction normalizeNavigationErrorMessage(error: unknown): string {\n if (typeof error === 'string') {\n return error\n }\n if (error && typeof error === 'object') {\n const message = (error as Record<string, unknown>).errMsg\n if (typeof message === 'string') {\n return message\n }\n if (error instanceof Error) {\n return error.message\n }\n }\n return ''\n}\n\nfunction resolveNavigationFailureType(error: unknown): NavigationFailureTypeValue {\n const normalizedMessage = normalizeNavigationErrorMessage(error).toLowerCase()\n if (DUPLICATED_RE.test(normalizedMessage)) {\n return NavigationFailureType.duplicated\n }\n if (CANCELLED_RE.test(normalizedMessage)) {\n return NavigationFailureType.cancelled\n }\n if (ABORTED_RE.test(normalizedMessage)) {\n return NavigationFailureType.aborted\n }\n return NavigationFailureType.unknown\n}\n\nexport function createNavigationFailure<TRouteMap extends object = WevuNamedRouteMap>(\n type: NavigationFailureTypeValue,\n to?: RouteLocationNormalizedLoaded<NoInfer<TRouteMap>>,\n from?: RouteLocationNormalizedLoaded<NoInfer<TRouteMap>>,\n cause?: unknown,\n): NavigationFailure<TRouteMap> {\n const message = normalizeNavigationErrorMessage(cause) || 'Navigation failed'\n return Object.assign(new Error(message), {\n __wevuNavigationFailure: true as const,\n type,\n to,\n from,\n cause,\n })\n}\n\nexport function isNavigationFailure<TRouteMap extends object = WevuNamedRouteMap>(\n error: unknown,\n type?: NavigationFailureTypeValue,\n): error is NavigationFailure<TRouteMap> {\n if (!error || typeof error !== 'object') {\n return false\n }\n const navigationError = error as Partial<NavigationFailure>\n if (navigationError.__wevuNavigationFailure !== true) {\n return false\n }\n if (type === undefined) {\n return true\n }\n return navigationError.type === type\n}\n\ninterface GuardPipelineContinue {\n status: 'continue'\n}\n\ninterface GuardPipelineFailure {\n status: 'failure'\n failure: NavigationFailure\n}\n\ninterface GuardPipelineRedirect {\n status: 'redirect'\n target: RouteLocationNormalizedLoaded\n replace?: boolean\n}\n\nexport type GuardPipelineResult = GuardPipelineContinue | GuardPipelineFailure | GuardPipelineRedirect\n\nexport function isNavigationRedirectCandidate(value: unknown): value is NavigationRedirect {\n if (!value || typeof value !== 'object') {\n return false\n }\n return 'to' in (value as Record<string, unknown>)\n}\n\nfunction isRouteLocationRawCandidate(value: unknown): value is RouteLocationRaw {\n if (typeof value === 'string') {\n return true\n }\n if (!value || typeof value !== 'object') {\n return false\n }\n const candidate = value as Record<string, unknown>\n return 'path' in candidate\n || 'fullPath' in candidate\n || 'query' in candidate\n || 'hash' in candidate\n || 'name' in candidate\n || 'params' in candidate\n}\n\nexport async function runNavigationGuards(\n guards: ReadonlySet<NavigationGuard>,\n context: NavigationGuardContext,\n resolveRoute: (to: RouteLocationRaw, currentPath: string) => RouteLocationNormalizedLoaded,\n): Promise<GuardPipelineResult> {\n for (const guard of guards) {\n try {\n const result = await guard(context.to, context.from, context)\n if (isNavigationFailure(result)) {\n return {\n status: 'failure',\n failure: result,\n }\n }\n if (result === false) {\n return {\n status: 'failure',\n failure: createNavigationFailure(\n NavigationFailureType.aborted,\n context.to,\n context.from,\n 'Navigation aborted by guard',\n ),\n }\n }\n if (isNavigationRedirectCandidate(result)) {\n if (!context.to) {\n return {\n status: 'failure',\n failure: createNavigationFailure(\n NavigationFailureType.aborted,\n context.to,\n context.from,\n 'Redirect is not supported in back navigation guards',\n ),\n }\n }\n return {\n status: 'redirect',\n target: resolveRoute(result.to, context.to.path),\n replace: result.replace,\n }\n }\n if (isRouteLocationRawCandidate(result)) {\n if (!context.to) {\n return {\n status: 'failure',\n failure: createNavigationFailure(\n NavigationFailureType.aborted,\n context.to,\n context.from,\n 'Redirect is not supported in back navigation guards',\n ),\n }\n }\n return {\n status: 'redirect',\n target: resolveRoute(result, context.to.path),\n }\n }\n }\n catch (error) {\n return {\n status: 'failure',\n failure: createNavigationFailure(NavigationFailureType.aborted, context.to, context.from, error),\n }\n }\n }\n return { status: 'continue' }\n}\n\nexport function executeNavigationMethod(\n method: (options: Record<string, any>) => unknown,\n options: Record<string, any>,\n to?: RouteLocationNormalizedLoaded,\n from?: RouteLocationNormalizedLoaded,\n): Promise<void | NavigationFailure> {\n return new Promise((resolve) => {\n let settled = false\n const finalize = (result?: void | NavigationFailure) => {\n if (settled) {\n return\n }\n settled = true\n resolve(result)\n }\n\n try {\n const maybePromise = method({\n ...options,\n success: () => finalize(),\n fail: (error: unknown) => {\n finalize(createNavigationFailure(resolveNavigationFailureType(error), to, from, error))\n },\n })\n\n if (maybePromise && typeof (maybePromise as PromiseLike<unknown>).then === 'function') {\n ;(maybePromise as PromiseLike<unknown>).then(\n () => finalize(),\n error => finalize(createNavigationFailure(resolveNavigationFailureType(error), to, from, error)),\n )\n }\n }\n catch (error) {\n finalize(createNavigationFailure(resolveNavigationFailureType(error), to, from, error))\n }\n })\n}\n\nexport async function runAfterEachHooks(\n hooks: ReadonlySet<NavigationAfterEach>,\n context: NavigationAfterEachContext,\n) {\n for (const hook of hooks) {\n try {\n await hook(context.to, context.from, context.failure, context)\n }\n catch {\n // 忽略 afterEach hook 的异常,避免影响导航主流程。\n }\n }\n}\n\nexport async function runNavigationErrorHooks(\n handlers: ReadonlySet<NavigationErrorHandler>,\n error: unknown,\n context: NavigationErrorContext,\n) {\n for (const handler of handlers) {\n try {\n await handler(error, context)\n }\n catch {\n // 忽略 onError 回调中的异常,避免影响导航主流程。\n }\n }\n}\n\nfunction isNativeFailureLikeError(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false\n }\n const errMsg = (value as Record<string, unknown>).errMsg\n return typeof errMsg === 'string'\n}\n\nexport function shouldEmitNavigationError(failure: NavigationFailure): boolean {\n if (failure.type === NavigationFailureType.unknown) {\n return true\n }\n if (failure.cause instanceof Error) {\n return true\n }\n if (failure.type === NavigationFailureType.aborted && failure.cause !== undefined) {\n if (typeof failure.cause === 'string') {\n return false\n }\n if (isNativeFailureLikeError(failure.cause)) {\n return false\n }\n return true\n }\n return false\n}\n"],"mappings":";;;AAgBA,MAAM,gBAAgB;AACtB,MAAM,eAAe;AACrB,MAAM,aAAa;AAEnB,SAAS,gCAAgC,OAAwB;CAC/D,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,UAAW,MAAkC;EACnD,IAAI,OAAO,YAAY,UACrB,OAAO;EAET,IAAI,iBAAiB,OACnB,OAAO,MAAM;CAEjB;CACA,OAAO;AACT;AAEA,SAAS,6BAA6B,OAA4C;CAChF,MAAM,oBAAoB,gCAAgC,KAAK,CAAC,CAAC,YAAY;CAC7E,IAAI,cAAc,KAAK,iBAAiB,GACtC,OAAO,sBAAsB;CAE/B,IAAI,aAAa,KAAK,iBAAiB,GACrC,OAAO,sBAAsB;CAE/B,IAAI,WAAW,KAAK,iBAAiB,GACnC,OAAO,sBAAsB;CAE/B,OAAO,sBAAsB;AAC/B;AAEA,SAAgB,wBACd,MACA,IACA,MACA,OAC8B;CAC9B,MAAM,UAAU,gCAAgC,KAAK,KAAK;CAC1D,OAAO,OAAO,OAAO,IAAI,MAAM,OAAO,GAAG;EACvC,yBAAyB;EACzB;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,SAAgB,oBACd,OACA,MACuC;CACvC,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAET,MAAM,kBAAkB;CACxB,IAAI,gBAAgB,4BAA4B,MAC9C,OAAO;CAET,IAAI,SAAS,QACX,OAAO;CAET,OAAO,gBAAgB,SAAS;AAClC;AAmBA,SAAgB,8BAA8B,OAA6C;CACzF,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAET,OAAO,QAAS;AAClB;AAEA,SAAS,4BAA4B,OAA2C;CAC9E,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAET,MAAM,YAAY;CAClB,OAAO,UAAU,aACZ,cAAc,aACd,WAAW,aACX,UAAU,aACV,UAAU,aACV,YAAY;AACnB;AAEA,eAAsB,oBACpB,QACA,SACA,cAC8B;CAC9B,KAAK,MAAM,SAAS,QAClB,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,QAAQ,MAAM,OAAO;EAC5D,IAAI,oBAAoB,MAAM,GAC5B,OAAO;GACL,QAAQ;GACR,SAAS;EACX;EAEF,IAAI,WAAW,OACb,OAAO;GACL,QAAQ;GACR,SAAS,wBACP,sBAAsB,SACtB,QAAQ,IACR,QAAQ,MACR,6BACF;EACF;EAEF,IAAI,8BAA8B,MAAM,GAAG;GACzC,IAAI,CAAC,QAAQ,IACX,OAAO;IACL,QAAQ;IACR,SAAS,wBACP,sBAAsB,SACtB,QAAQ,IACR,QAAQ,MACR,qDACF;GACF;GAEF,OAAO;IACL,QAAQ;IACR,QAAQ,aAAa,OAAO,IAAI,QAAQ,GAAG,IAAI;IAC/C,SAAS,OAAO;GAClB;EACF;EACA,IAAI,4BAA4B,MAAM,GAAG;GACvC,IAAI,CAAC,QAAQ,IACX,OAAO;IACL,QAAQ;IACR,SAAS,wBACP,sBAAsB,SACtB,QAAQ,IACR,QAAQ,MACR,qDACF;GACF;GAEF,OAAO;IACL,QAAQ;IACR,QAAQ,aAAa,QAAQ,QAAQ,GAAG,IAAI;GAC9C;EACF;CACF,SACO,OAAO;EACZ,OAAO;GACL,QAAQ;GACR,SAAS,wBAAwB,sBAAsB,SAAS,QAAQ,IAAI,QAAQ,MAAM,KAAK;EACjG;CACF;CAEF,OAAO,EAAE,QAAQ,WAAW;AAC9B;AAEA,SAAgB,wBACd,QACA,SACA,IACA,MACmC;CACnC,OAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,UAAU;EACd,MAAM,YAAY,WAAsC;GACtD,IAAI,SACF;GAEF,UAAU;GACV,QAAQ,MAAM;EAChB;EAEA,IAAI;GACF,MAAM,eAAe,OAAO;IAC1B,GAAG;IACH,eAAe,SAAS;IACxB,OAAO,UAAmB;KACxB,SAAS,wBAAwB,6BAA6B,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC;IACxF;GACF,CAAC;GAED,IAAI,gBAAgB,OAAQ,aAAsC,SAAS,YACxE,AAAC,aAAsC,WAChC,SAAS,IACf,UAAS,SAAS,wBAAwB,6BAA6B,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC,CACjG;EAEJ,SACO,OAAO;GACZ,SAAS,wBAAwB,6BAA6B,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC;EACxF;CACF,CAAC;AACH;AAEA,eAAsB,kBACpB,OACA,SACA;CACA,KAAK,MAAM,QAAQ,OACjB,IAAI;EACF,MAAM,KAAK,QAAQ,IAAI,QAAQ,MAAM,QAAQ,SAAS,OAAO;CAC/D,QACM,CAEN;AAEJ;AAEA,eAAsB,wBACpB,UACA,OACA,SACA;CACA,KAAK,MAAM,WAAW,UACpB,IAAI;EACF,MAAM,QAAQ,OAAO,OAAO;CAC9B,QACM,CAEN;AAEJ;AAEA,SAAS,yBAAyB,OAAyB;CACzD,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAGT,OAAO,OADS,MAAkC,WACzB;AAC3B;AAEA,SAAgB,0BAA0B,SAAqC;CAC7E,IAAI,QAAQ,SAAS,sBAAsB,SACzC,OAAO;CAET,IAAI,QAAQ,iBAAiB,OAC3B,OAAO;CAET,IAAI,QAAQ,SAAS,sBAAsB,WAAW,QAAQ,UAAU,QAAW;EACjF,IAAI,OAAO,QAAQ,UAAU,UAC3B,OAAO;EAET,IAAI,yBAAyB,QAAQ,KAAK,GACxC,OAAO;EAET,OAAO;CACT;CACA,OAAO;AACT"}
|
|
@@ -20,16 +20,13 @@ function createNavigationResultController(options) {
|
|
|
20
20
|
nativeRouter,
|
|
21
21
|
failure: result.failure
|
|
22
22
|
});
|
|
23
|
-
if (result.failure && shouldEmitNavigationError(result.failure)) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
failure: result.failure
|
|
31
|
-
});
|
|
32
|
-
}
|
|
23
|
+
if (result.failure && shouldEmitNavigationError(result.failure)) await runNavigationErrorHooks(errorHandlers, result.failure.cause ?? result.failure, {
|
|
24
|
+
mode: result.mode,
|
|
25
|
+
to: result.to,
|
|
26
|
+
from: result.from,
|
|
27
|
+
nativeRouter,
|
|
28
|
+
failure: result.failure
|
|
29
|
+
});
|
|
33
30
|
}
|
|
34
31
|
function shouldRejectNavigationFailure(failure) {
|
|
35
32
|
return rejectOnError && shouldEmitNavigationError(failure);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigationResult.mjs","names":[],"sources":["../../../src/router/navigationResult.ts"],"sourcesContent":["import type { SetupContextRouter } from '../runtime/types/props'\nimport type {\n NavigationAfterEach,\n NavigationErrorHandler,\n NavigationFailure,\n NavigationMode,\n RouteLocationNormalizedLoaded,\n} from './types'\nimport { runAfterEachHooks, runNavigationErrorHooks, shouldEmitNavigationError } from './navigationCore'\nimport { notifyRouteStateSync } from './routeSync'\n\nexport interface NavigationRunResult {\n mode: NavigationMode\n from: RouteLocationNormalizedLoaded\n to?: RouteLocationNormalizedLoaded\n failure?: NavigationFailure\n}\n\nexport function createNavigationRunResult(\n mode: NavigationMode,\n from: RouteLocationNormalizedLoaded,\n to?: RouteLocationNormalizedLoaded,\n failure?: NavigationFailure,\n): NavigationRunResult {\n return {\n mode,\n from,\n to,\n failure,\n }\n}\n\nexport function createNavigationResultController(options: {\n afterEachHooks: ReadonlySet<NavigationAfterEach>\n errorHandlers: ReadonlySet<NavigationErrorHandler>\n nativeRouter: SetupContextRouter\n rejectOnError: boolean\n}) {\n const {\n afterEachHooks,\n errorHandlers,\n nativeRouter,\n rejectOnError,\n } = options\n\n async function emitNavigationAfterEach(result: NavigationRunResult): Promise<void> {\n await runAfterEachHooks(afterEachHooks, {\n mode: result.mode,\n to: result.to,\n from: result.from,\n nativeRouter,\n failure: result.failure,\n })\n\n if (result.failure && shouldEmitNavigationError(result.failure)) {\n await runNavigationErrorHooks(\n errorHandlers,\n result.failure.cause ?? result.failure,\n {\n mode: result.mode,\n to: result.to,\n from: result.from,\n nativeRouter,\n failure: result.failure,\n },\n )\n }\n }\n\n function shouldRejectNavigationFailure(failure: NavigationFailure): boolean {\n return rejectOnError && shouldEmitNavigationError(failure)\n }\n\n async function settleNavigationResult(result: NavigationRunResult): Promise<void | NavigationFailure> {\n if (!result.failure) {\n notifyRouteStateSync(result.to\n ? {\n route: result.to,\n source: 'router',\n }\n : undefined)\n }\n await emitNavigationAfterEach(result)\n if (result.failure && shouldRejectNavigationFailure(result.failure)) {\n throw result.failure\n }\n return result.failure\n }\n\n return {\n emitNavigationAfterEach,\n settleNavigationResult,\n }\n}\n"],"mappings":";;;;AAkBA,SAAgB,0BACd,MACA,MACA,IACA,SACqB;CACrB,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,iCAAiC,SAK9C;CACD,MAAM,EACJ,gBACA,eACA,cACA,kBACE;CAEJ,eAAe,wBAAwB,QAA4C;EACjF,MAAM,kBAAkB,gBAAgB;GACtC,MAAM,OAAO;GACb,IAAI,OAAO;GACX,MAAM,OAAO;GACb;GACA,SAAS,OAAO;EAClB,CAAC;EAED,IAAI,OAAO,WAAW,0BAA0B,OAAO,OAAO,
|
|
1
|
+
{"version":3,"file":"navigationResult.mjs","names":[],"sources":["../../../src/router/navigationResult.ts"],"sourcesContent":["import type { SetupContextRouter } from '../runtime/types/props'\nimport type {\n NavigationAfterEach,\n NavigationErrorHandler,\n NavigationFailure,\n NavigationMode,\n RouteLocationNormalizedLoaded,\n} from './types'\nimport { runAfterEachHooks, runNavigationErrorHooks, shouldEmitNavigationError } from './navigationCore'\nimport { notifyRouteStateSync } from './routeSync'\n\nexport interface NavigationRunResult {\n mode: NavigationMode\n from: RouteLocationNormalizedLoaded\n to?: RouteLocationNormalizedLoaded\n failure?: NavigationFailure\n}\n\nexport function createNavigationRunResult(\n mode: NavigationMode,\n from: RouteLocationNormalizedLoaded,\n to?: RouteLocationNormalizedLoaded,\n failure?: NavigationFailure,\n): NavigationRunResult {\n return {\n mode,\n from,\n to,\n failure,\n }\n}\n\nexport function createNavigationResultController(options: {\n afterEachHooks: ReadonlySet<NavigationAfterEach>\n errorHandlers: ReadonlySet<NavigationErrorHandler>\n nativeRouter: SetupContextRouter\n rejectOnError: boolean\n}) {\n const {\n afterEachHooks,\n errorHandlers,\n nativeRouter,\n rejectOnError,\n } = options\n\n async function emitNavigationAfterEach(result: NavigationRunResult): Promise<void> {\n await runAfterEachHooks(afterEachHooks, {\n mode: result.mode,\n to: result.to,\n from: result.from,\n nativeRouter,\n failure: result.failure,\n })\n\n if (result.failure && shouldEmitNavigationError(result.failure)) {\n await runNavigationErrorHooks(\n errorHandlers,\n result.failure.cause ?? result.failure,\n {\n mode: result.mode,\n to: result.to,\n from: result.from,\n nativeRouter,\n failure: result.failure,\n },\n )\n }\n }\n\n function shouldRejectNavigationFailure(failure: NavigationFailure): boolean {\n return rejectOnError && shouldEmitNavigationError(failure)\n }\n\n async function settleNavigationResult(result: NavigationRunResult): Promise<void | NavigationFailure> {\n if (!result.failure) {\n notifyRouteStateSync(result.to\n ? {\n route: result.to,\n source: 'router',\n }\n : undefined)\n }\n await emitNavigationAfterEach(result)\n if (result.failure && shouldRejectNavigationFailure(result.failure)) {\n throw result.failure\n }\n return result.failure\n }\n\n return {\n emitNavigationAfterEach,\n settleNavigationResult,\n }\n}\n"],"mappings":";;;;AAkBA,SAAgB,0BACd,MACA,MACA,IACA,SACqB;CACrB,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,iCAAiC,SAK9C;CACD,MAAM,EACJ,gBACA,eACA,cACA,kBACE;CAEJ,eAAe,wBAAwB,QAA4C;EACjF,MAAM,kBAAkB,gBAAgB;GACtC,MAAM,OAAO;GACb,IAAI,OAAO;GACX,MAAM,OAAO;GACb;GACA,SAAS,OAAO;EAClB,CAAC;EAED,IAAI,OAAO,WAAW,0BAA0B,OAAO,OAAO,GAC5D,MAAM,wBACJ,eACA,OAAO,QAAQ,SAAS,OAAO,SAC/B;GACE,MAAM,OAAO;GACb,IAAI,OAAO;GACX,MAAM,OAAO;GACb;GACA,SAAS,OAAO;EAClB,CACF;CAEJ;CAEA,SAAS,8BAA8B,SAAqC;EAC1E,OAAO,iBAAiB,0BAA0B,OAAO;CAC3D;CAEA,eAAe,uBAAuB,QAAgE;EACpG,IAAI,CAAC,OAAO,SACV,qBAAqB,OAAO,KACxB;GACE,OAAO,OAAO;GACd,QAAQ;EACV,IACA,MAAS;EAEf,MAAM,wBAAwB,MAAM;EACpC,IAAI,OAAO,WAAW,8BAA8B,OAAO,OAAO,GAChE,MAAM,OAAO;EAEf,OAAO,OAAO;CAChB;CAEA,OAAO;EACL;EACA;CACF;AACF"}
|
|
@@ -13,7 +13,6 @@ async function navigateWithTarget(options) {
|
|
|
13
13
|
let currentMode = mode;
|
|
14
14
|
let redirectCount = 0;
|
|
15
15
|
while (true) {
|
|
16
|
-
var _matchedRouteResult$m;
|
|
17
16
|
const tabBarTarget = tabBarPathSet.has(currentTarget.path);
|
|
18
17
|
if (createNativeRouteUrl(currentTarget, routeResolveCodec.stringifyQuery) === createNativeRouteUrl(from, routeResolveCodec.stringifyQuery) && currentTarget.hash !== from.hash) return createNavigationRunResult(currentMode, from, currentTarget, createHashOnlyNavigationFailure(currentTarget, from));
|
|
19
18
|
if (!allowSameLocation && (tabBarTarget ? currentTarget.path === from.path : currentTarget.fullPath === from.fullPath)) return createNavigationRunResult(currentMode, from, currentTarget, createDuplicatedFailure(currentTarget, from));
|
|
@@ -37,8 +36,7 @@ async function navigateWithTarget(options) {
|
|
|
37
36
|
continue;
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
|
-
const
|
|
41
|
-
const matchedRouteRecords = (_matchedRouteResult$m = matchedRouteResult === null || matchedRouteResult === void 0 ? void 0 : matchedRouteResult.matchedRecords) !== null && _matchedRouteResult$m !== void 0 ? _matchedRouteResult$m : [];
|
|
39
|
+
const matchedRouteRecords = resolveMatchedRouteRecord(currentTarget, namedRouteLookup)?.matchedRecords ?? [];
|
|
42
40
|
let redirectedByRouteRecord = false;
|
|
43
41
|
for (const matchedRouteRecord of matchedRouteRecords) {
|
|
44
42
|
if (matchedRouteRecord.redirect === void 0) continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigationTarget.mjs","names":[],"sources":["../../../src/router/navigationTarget.ts"],"sourcesContent":["import type {\n NamedRouteLookup,\n RouteResolveCodec,\n} from '../routerInternal/shared'\nimport type { NavigationRunResult } from './navigationResult'\nimport type {\n NavigationGuard,\n NavigationMode,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n} from './types'\nimport {\n createAbsoluteRoutePath,\n createNativeRouteUrl,\n hasLocationQuery,\n resolveMatchedRouteRecord,\n} from '../routerInternal/shared'\nimport {\n createNavigationFailure,\n executeNavigationMethod,\n isNavigationFailure,\n runNavigationGuards,\n} from './navigationCore'\nimport { createNavigationRunResult } from './navigationResult'\nimport {\n applyRedirectedFrom,\n createDuplicatedFailure,\n createHashOnlyNavigationFailure,\n createTabBarQueryFailure,\n createTooManyRedirectsFailure,\n resolveRouteRecordRedirect,\n} from './navigationTargetHelpers'\nimport { NavigationFailureType } from './types'\n\ninterface NavigateWithTargetOptions {\n mode: Exclude<NavigationMode, 'back'>\n target: RouteLocationNormalizedLoaded\n from: RouteLocationNormalizedLoaded\n nativeRouter: Record<string, any>\n routeResolveCodec: RouteResolveCodec\n namedRouteLookup: NamedRouteLookup\n beforeEachGuards: ReadonlySet<NavigationGuard>\n beforeResolveGuards: ReadonlySet<NavigationGuard>\n maxRedirects: number\n tabBarPathSet: ReadonlySet<string>\n resolveWithCodec: (to: RouteLocationRaw, currentPath: string) => RouteLocationNormalizedLoaded\n executeNative?: boolean\n allowSameLocation?: boolean\n}\n\nexport async function navigateWithTarget(options: NavigateWithTargetOptions): Promise<NavigationRunResult> {\n const {\n mode,\n target,\n from,\n nativeRouter,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n executeNative = true,\n allowSameLocation = false,\n } = options\n let currentTarget = target\n let currentMode: Exclude<NavigationMode, 'back'> = mode\n let redirectCount = 0\n\n while (true) {\n const tabBarTarget = tabBarPathSet.has(currentTarget.path)\n const sameNativeLocation = createNativeRouteUrl(currentTarget, routeResolveCodec.stringifyQuery)\n === createNativeRouteUrl(from, routeResolveCodec.stringifyQuery)\n if (sameNativeLocation && currentTarget.hash !== from.hash) {\n return createNavigationRunResult(currentMode, from, currentTarget, createHashOnlyNavigationFailure(currentTarget, from))\n }\n\n const duplicated = !allowSameLocation && (tabBarTarget\n ? currentTarget.path === from.path\n : currentTarget.fullPath === from.fullPath)\n if (duplicated) {\n return createNavigationRunResult(currentMode, from, currentTarget, createDuplicatedFailure(currentTarget, from))\n }\n\n if (tabBarTarget && hasLocationQuery(currentTarget.query)) {\n return createNavigationRunResult(currentMode, from, currentTarget, createTabBarQueryFailure(currentTarget, from))\n }\n\n const beforeEachResult = await runNavigationGuards(beforeEachGuards, {\n mode: currentMode,\n to: currentTarget,\n from,\n nativeRouter: nativeRouter as any,\n }, resolveWithCodec)\n\n if (beforeEachResult.status === 'failure') {\n return createNavigationRunResult(currentMode, from, currentTarget, beforeEachResult.failure)\n }\n if (beforeEachResult.status === 'redirect') {\n const redirectedTarget = beforeEachResult.target\n const redirectedMode = beforeEachResult.replace === true\n ? 'replace'\n : beforeEachResult.replace === false\n ? 'push'\n : currentMode\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n continue\n }\n }\n\n const matchedRouteResult = resolveMatchedRouteRecord(currentTarget, namedRouteLookup)\n const matchedRouteRecords = matchedRouteResult?.matchedRecords ?? []\n let redirectedByRouteRecord = false\n for (const matchedRouteRecord of matchedRouteRecords) {\n if (matchedRouteRecord.redirect === undefined) {\n continue\n }\n let redirectedByRecord: { target: RouteLocationNormalizedLoaded, replace?: boolean }\n try {\n redirectedByRecord = await resolveRouteRecordRedirect(\n matchedRouteRecord.redirect,\n currentTarget,\n from,\n resolveWithCodec,\n )\n }\n catch (error) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createNavigationFailure(NavigationFailureType.aborted, currentTarget, from, error),\n )\n }\n\n const redirectedMode = redirectedByRecord.replace === false ? 'push' : 'replace'\n const redirectedTarget = redirectedByRecord.target\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n redirectedByRouteRecord = true\n break\n }\n }\n if (redirectedByRouteRecord) {\n continue\n }\n\n let redirectedByBeforeEnter = false\n for (const matchedRouteRecord of matchedRouteRecords) {\n if (matchedRouteRecord.beforeEnterGuards.length === 0) {\n continue\n }\n const beforeEnterResult = await runNavigationGuards(new Set(matchedRouteRecord.beforeEnterGuards), {\n mode: currentMode,\n to: currentTarget,\n from,\n nativeRouter: nativeRouter as any,\n }, resolveWithCodec)\n\n if (beforeEnterResult.status === 'failure') {\n return createNavigationRunResult(currentMode, from, currentTarget, beforeEnterResult.failure)\n }\n if (beforeEnterResult.status === 'redirect') {\n const redirectedTarget = beforeEnterResult.target\n const redirectedMode = beforeEnterResult.replace === true\n ? 'replace'\n : beforeEnterResult.replace === false\n ? 'push'\n : currentMode\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n redirectedByBeforeEnter = true\n break\n }\n }\n }\n if (redirectedByBeforeEnter) {\n continue\n }\n\n const beforeResolveResult = await runNavigationGuards(beforeResolveGuards, {\n mode: currentMode,\n to: currentTarget,\n from,\n nativeRouter: nativeRouter as any,\n }, resolveWithCodec)\n\n if (beforeResolveResult.status === 'failure') {\n return createNavigationRunResult(currentMode, from, currentTarget, beforeResolveResult.failure)\n }\n if (beforeResolveResult.status === 'redirect') {\n const redirectedTarget = beforeResolveResult.target\n const redirectedMode = beforeResolveResult.replace === true\n ? 'replace'\n : beforeResolveResult.replace === false\n ? 'push'\n : currentMode\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n continue\n }\n }\n\n if (!executeNative) {\n return createNavigationRunResult(currentMode, from, currentTarget)\n }\n\n if (tabBarTarget) {\n const result = await executeNavigationMethod(\n nativeRouter.switchTab as (options: Record<string, any>) => unknown,\n { url: createAbsoluteRoutePath(currentTarget.path) },\n currentTarget,\n from,\n )\n if (isNavigationFailure(result)) {\n return createNavigationRunResult(currentMode, from, currentTarget, result)\n }\n return createNavigationRunResult(currentMode, from, currentTarget)\n }\n\n const nativeMethod = currentMode === 'push'\n ? nativeRouter.navigateTo\n : nativeRouter.redirectTo\n const result = await executeNavigationMethod(\n nativeMethod as (options: Record<string, any>) => unknown,\n { url: createNativeRouteUrl(currentTarget, routeResolveCodec.stringifyQuery) },\n currentTarget,\n from,\n )\n if (isNavigationFailure(result)) {\n return createNavigationRunResult(currentMode, from, currentTarget, result)\n }\n return createNavigationRunResult(currentMode, from, currentTarget)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navigationTarget.mjs","names":[],"sources":["../../../src/router/navigationTarget.ts"],"sourcesContent":["import type {\n NamedRouteLookup,\n RouteResolveCodec,\n} from '../routerInternal/shared'\nimport type { NavigationRunResult } from './navigationResult'\nimport type {\n NavigationGuard,\n NavigationMode,\n RouteLocationNormalizedLoaded,\n RouteLocationRaw,\n} from './types'\nimport {\n createAbsoluteRoutePath,\n createNativeRouteUrl,\n hasLocationQuery,\n resolveMatchedRouteRecord,\n} from '../routerInternal/shared'\nimport {\n createNavigationFailure,\n executeNavigationMethod,\n isNavigationFailure,\n runNavigationGuards,\n} from './navigationCore'\nimport { createNavigationRunResult } from './navigationResult'\nimport {\n applyRedirectedFrom,\n createDuplicatedFailure,\n createHashOnlyNavigationFailure,\n createTabBarQueryFailure,\n createTooManyRedirectsFailure,\n resolveRouteRecordRedirect,\n} from './navigationTargetHelpers'\nimport { NavigationFailureType } from './types'\n\ninterface NavigateWithTargetOptions {\n mode: Exclude<NavigationMode, 'back'>\n target: RouteLocationNormalizedLoaded\n from: RouteLocationNormalizedLoaded\n nativeRouter: Record<string, any>\n routeResolveCodec: RouteResolveCodec\n namedRouteLookup: NamedRouteLookup\n beforeEachGuards: ReadonlySet<NavigationGuard>\n beforeResolveGuards: ReadonlySet<NavigationGuard>\n maxRedirects: number\n tabBarPathSet: ReadonlySet<string>\n resolveWithCodec: (to: RouteLocationRaw, currentPath: string) => RouteLocationNormalizedLoaded\n executeNative?: boolean\n allowSameLocation?: boolean\n}\n\nexport async function navigateWithTarget(options: NavigateWithTargetOptions): Promise<NavigationRunResult> {\n const {\n mode,\n target,\n from,\n nativeRouter,\n routeResolveCodec,\n namedRouteLookup,\n beforeEachGuards,\n beforeResolveGuards,\n maxRedirects,\n tabBarPathSet,\n resolveWithCodec,\n executeNative = true,\n allowSameLocation = false,\n } = options\n let currentTarget = target\n let currentMode: Exclude<NavigationMode, 'back'> = mode\n let redirectCount = 0\n\n while (true) {\n const tabBarTarget = tabBarPathSet.has(currentTarget.path)\n const sameNativeLocation = createNativeRouteUrl(currentTarget, routeResolveCodec.stringifyQuery)\n === createNativeRouteUrl(from, routeResolveCodec.stringifyQuery)\n if (sameNativeLocation && currentTarget.hash !== from.hash) {\n return createNavigationRunResult(currentMode, from, currentTarget, createHashOnlyNavigationFailure(currentTarget, from))\n }\n\n const duplicated = !allowSameLocation && (tabBarTarget\n ? currentTarget.path === from.path\n : currentTarget.fullPath === from.fullPath)\n if (duplicated) {\n return createNavigationRunResult(currentMode, from, currentTarget, createDuplicatedFailure(currentTarget, from))\n }\n\n if (tabBarTarget && hasLocationQuery(currentTarget.query)) {\n return createNavigationRunResult(currentMode, from, currentTarget, createTabBarQueryFailure(currentTarget, from))\n }\n\n const beforeEachResult = await runNavigationGuards(beforeEachGuards, {\n mode: currentMode,\n to: currentTarget,\n from,\n nativeRouter: nativeRouter as any,\n }, resolveWithCodec)\n\n if (beforeEachResult.status === 'failure') {\n return createNavigationRunResult(currentMode, from, currentTarget, beforeEachResult.failure)\n }\n if (beforeEachResult.status === 'redirect') {\n const redirectedTarget = beforeEachResult.target\n const redirectedMode = beforeEachResult.replace === true\n ? 'replace'\n : beforeEachResult.replace === false\n ? 'push'\n : currentMode\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n continue\n }\n }\n\n const matchedRouteResult = resolveMatchedRouteRecord(currentTarget, namedRouteLookup)\n const matchedRouteRecords = matchedRouteResult?.matchedRecords ?? []\n let redirectedByRouteRecord = false\n for (const matchedRouteRecord of matchedRouteRecords) {\n if (matchedRouteRecord.redirect === undefined) {\n continue\n }\n let redirectedByRecord: { target: RouteLocationNormalizedLoaded, replace?: boolean }\n try {\n redirectedByRecord = await resolveRouteRecordRedirect(\n matchedRouteRecord.redirect,\n currentTarget,\n from,\n resolveWithCodec,\n )\n }\n catch (error) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createNavigationFailure(NavigationFailureType.aborted, currentTarget, from, error),\n )\n }\n\n const redirectedMode = redirectedByRecord.replace === false ? 'push' : 'replace'\n const redirectedTarget = redirectedByRecord.target\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n redirectedByRouteRecord = true\n break\n }\n }\n if (redirectedByRouteRecord) {\n continue\n }\n\n let redirectedByBeforeEnter = false\n for (const matchedRouteRecord of matchedRouteRecords) {\n if (matchedRouteRecord.beforeEnterGuards.length === 0) {\n continue\n }\n const beforeEnterResult = await runNavigationGuards(new Set(matchedRouteRecord.beforeEnterGuards), {\n mode: currentMode,\n to: currentTarget,\n from,\n nativeRouter: nativeRouter as any,\n }, resolveWithCodec)\n\n if (beforeEnterResult.status === 'failure') {\n return createNavigationRunResult(currentMode, from, currentTarget, beforeEnterResult.failure)\n }\n if (beforeEnterResult.status === 'redirect') {\n const redirectedTarget = beforeEnterResult.target\n const redirectedMode = beforeEnterResult.replace === true\n ? 'replace'\n : beforeEnterResult.replace === false\n ? 'push'\n : currentMode\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n redirectedByBeforeEnter = true\n break\n }\n }\n }\n if (redirectedByBeforeEnter) {\n continue\n }\n\n const beforeResolveResult = await runNavigationGuards(beforeResolveGuards, {\n mode: currentMode,\n to: currentTarget,\n from,\n nativeRouter: nativeRouter as any,\n }, resolveWithCodec)\n\n if (beforeResolveResult.status === 'failure') {\n return createNavigationRunResult(currentMode, from, currentTarget, beforeResolveResult.failure)\n }\n if (beforeResolveResult.status === 'redirect') {\n const redirectedTarget = beforeResolveResult.target\n const redirectedMode = beforeResolveResult.replace === true\n ? 'replace'\n : beforeResolveResult.replace === false\n ? 'push'\n : currentMode\n if (redirectedTarget.fullPath !== currentTarget.fullPath || redirectedMode !== currentMode) {\n applyRedirectedFrom(redirectedTarget, currentTarget)\n currentTarget = redirectedTarget\n currentMode = redirectedMode\n redirectCount += 1\n if (redirectCount > maxRedirects) {\n return createNavigationRunResult(\n currentMode,\n from,\n currentTarget,\n createTooManyRedirectsFailure(currentTarget, from, maxRedirects),\n )\n }\n continue\n }\n }\n\n if (!executeNative) {\n return createNavigationRunResult(currentMode, from, currentTarget)\n }\n\n if (tabBarTarget) {\n const result = await executeNavigationMethod(\n nativeRouter.switchTab as (options: Record<string, any>) => unknown,\n { url: createAbsoluteRoutePath(currentTarget.path) },\n currentTarget,\n from,\n )\n if (isNavigationFailure(result)) {\n return createNavigationRunResult(currentMode, from, currentTarget, result)\n }\n return createNavigationRunResult(currentMode, from, currentTarget)\n }\n\n const nativeMethod = currentMode === 'push'\n ? nativeRouter.navigateTo\n : nativeRouter.redirectTo\n const result = await executeNavigationMethod(\n nativeMethod as (options: Record<string, any>) => unknown,\n { url: createNativeRouteUrl(currentTarget, routeResolveCodec.stringifyQuery) },\n currentTarget,\n from,\n )\n if (isNavigationFailure(result)) {\n return createNavigationRunResult(currentMode, from, currentTarget, result)\n }\n return createNavigationRunResult(currentMode, from, currentTarget)\n }\n}\n"],"mappings":";;;;;;;;;AAkDA,eAAsB,mBAAmB,SAAkE;CACzG,MAAM,EACJ,MACA,QACA,MACA,cACA,mBACA,kBACA,kBACA,qBACA,cACA,eACA,kBACA,gBAAgB,MAChB,oBAAoB,UAClB;CACJ,IAAI,gBAAgB;CACpB,IAAI,cAA+C;CACnD,IAAI,gBAAgB;CAEpB,OAAO,MAAM;EACX,MAAM,eAAe,cAAc,IAAI,cAAc,IAAI;EAGzD,IAF2B,qBAAqB,eAAe,kBAAkB,cAAc,MACzF,qBAAqB,MAAM,kBAAkB,cAAc,KACvC,cAAc,SAAS,KAAK,MACpD,OAAO,0BAA0B,aAAa,MAAM,eAAe,gCAAgC,eAAe,IAAI,CAAC;EAMzH,IAHmB,CAAC,sBAAsB,eACtC,cAAc,SAAS,KAAK,OAC5B,cAAc,aAAa,KAAK,WAElC,OAAO,0BAA0B,aAAa,MAAM,eAAe,wBAAwB,eAAe,IAAI,CAAC;EAGjH,IAAI,gBAAgB,iBAAiB,cAAc,KAAK,GACtD,OAAO,0BAA0B,aAAa,MAAM,eAAe,yBAAyB,eAAe,IAAI,CAAC;EAGlH,MAAM,mBAAmB,MAAM,oBAAoB,kBAAkB;GACnE,MAAM;GACN,IAAI;GACJ;GACc;EAChB,GAAG,gBAAgB;EAEnB,IAAI,iBAAiB,WAAW,WAC9B,OAAO,0BAA0B,aAAa,MAAM,eAAe,iBAAiB,OAAO;EAE7F,IAAI,iBAAiB,WAAW,YAAY;GAC1C,MAAM,mBAAmB,iBAAiB;GAC1C,MAAM,iBAAiB,iBAAiB,YAAY,OAChD,YACA,iBAAiB,YAAY,QAC3B,SACA;GACN,IAAI,iBAAiB,aAAa,cAAc,YAAY,mBAAmB,aAAa;IAC1F,oBAAoB,kBAAkB,aAAa;IACnD,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,IAAI,gBAAgB,cAClB,OAAO,0BACL,aACA,MACA,eACA,8BAA8B,eAAe,MAAM,YAAY,CACjE;IAEF;GACF;EACF;EAGA,MAAM,sBADqB,0BAA0B,eAAe,gBACvB,CAAC,EAAE,kBAAkB,CAAC;EACnE,IAAI,0BAA0B;EAC9B,KAAK,MAAM,sBAAsB,qBAAqB;GACpD,IAAI,mBAAmB,aAAa,QAClC;GAEF,IAAI;GACJ,IAAI;IACF,qBAAqB,MAAM,2BACzB,mBAAmB,UACnB,eACA,MACA,gBACF;GACF,SACO,OAAO;IACZ,OAAO,0BACL,aACA,MACA,eACA,wBAAwB,sBAAsB,SAAS,eAAe,MAAM,KAAK,CACnF;GACF;GAEA,MAAM,iBAAiB,mBAAmB,YAAY,QAAQ,SAAS;GACvE,MAAM,mBAAmB,mBAAmB;GAC5C,IAAI,iBAAiB,aAAa,cAAc,YAAY,mBAAmB,aAAa;IAC1F,oBAAoB,kBAAkB,aAAa;IACnD,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,IAAI,gBAAgB,cAClB,OAAO,0BACL,aACA,MACA,eACA,8BAA8B,eAAe,MAAM,YAAY,CACjE;IAEF,0BAA0B;IAC1B;GACF;EACF;EACA,IAAI,yBACF;EAGF,IAAI,0BAA0B;EAC9B,KAAK,MAAM,sBAAsB,qBAAqB;GACpD,IAAI,mBAAmB,kBAAkB,WAAW,GAClD;GAEF,MAAM,oBAAoB,MAAM,oBAAoB,IAAI,IAAI,mBAAmB,iBAAiB,GAAG;IACjG,MAAM;IACN,IAAI;IACJ;IACc;GAChB,GAAG,gBAAgB;GAEnB,IAAI,kBAAkB,WAAW,WAC/B,OAAO,0BAA0B,aAAa,MAAM,eAAe,kBAAkB,OAAO;GAE9F,IAAI,kBAAkB,WAAW,YAAY;IAC3C,MAAM,mBAAmB,kBAAkB;IAC3C,MAAM,iBAAiB,kBAAkB,YAAY,OACjD,YACA,kBAAkB,YAAY,QAC5B,SACA;IACN,IAAI,iBAAiB,aAAa,cAAc,YAAY,mBAAmB,aAAa;KAC1F,oBAAoB,kBAAkB,aAAa;KACnD,gBAAgB;KAChB,cAAc;KACd,iBAAiB;KACjB,IAAI,gBAAgB,cAClB,OAAO,0BACL,aACA,MACA,eACA,8BAA8B,eAAe,MAAM,YAAY,CACjE;KAEF,0BAA0B;KAC1B;IACF;GACF;EACF;EACA,IAAI,yBACF;EAGF,MAAM,sBAAsB,MAAM,oBAAoB,qBAAqB;GACzE,MAAM;GACN,IAAI;GACJ;GACc;EAChB,GAAG,gBAAgB;EAEnB,IAAI,oBAAoB,WAAW,WACjC,OAAO,0BAA0B,aAAa,MAAM,eAAe,oBAAoB,OAAO;EAEhG,IAAI,oBAAoB,WAAW,YAAY;GAC7C,MAAM,mBAAmB,oBAAoB;GAC7C,MAAM,iBAAiB,oBAAoB,YAAY,OACnD,YACA,oBAAoB,YAAY,QAC9B,SACA;GACN,IAAI,iBAAiB,aAAa,cAAc,YAAY,mBAAmB,aAAa;IAC1F,oBAAoB,kBAAkB,aAAa;IACnD,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,IAAI,gBAAgB,cAClB,OAAO,0BACL,aACA,MACA,eACA,8BAA8B,eAAe,MAAM,YAAY,CACjE;IAEF;GACF;EACF;EAEA,IAAI,CAAC,eACH,OAAO,0BAA0B,aAAa,MAAM,aAAa;EAGnE,IAAI,cAAc;GAChB,MAAM,SAAS,MAAM,wBACnB,aAAa,WACb,EAAE,KAAK,wBAAwB,cAAc,IAAI,EAAE,GACnD,eACA,IACF;GACA,IAAI,oBAAoB,MAAM,GAC5B,OAAO,0BAA0B,aAAa,MAAM,eAAe,MAAM;GAE3E,OAAO,0BAA0B,aAAa,MAAM,aAAa;EACnE;EAEA,MAAM,eAAe,gBAAgB,SACjC,aAAa,aACb,aAAa;EACjB,MAAM,SAAS,MAAM,wBACnB,cACA,EAAE,KAAK,qBAAqB,eAAe,kBAAkB,cAAc,EAAE,GAC7E,eACA,IACF;EACA,IAAI,oBAAoB,MAAM,GAC5B,OAAO,0BAA0B,aAAa,MAAM,eAAe,MAAM;EAE3E,OAAO,0BAA0B,aAAa,MAAM,aAAa;CACnE;AACF"}
|
|
@@ -8,17 +8,16 @@ const DEFAULT_ROUTE_RESOLVE_CODEC = {
|
|
|
8
8
|
stringifyQuery
|
|
9
9
|
};
|
|
10
10
|
function resolveRouteLocation(to, currentPath = "", codec = DEFAULT_ROUTE_RESOLVE_CODEC) {
|
|
11
|
-
var _ref, _to$path, _parsedFromFullPath$q, _to$hash;
|
|
12
11
|
if (typeof to === "string") {
|
|
13
12
|
const parsed = parsePathInput(to, codec);
|
|
14
13
|
const path = resolvePath(parsed.path, currentPath);
|
|
15
14
|
return createRouteLocation(path, parsed.query, parsed.hash, void 0, {}, codec.stringifyQuery);
|
|
16
15
|
}
|
|
17
16
|
const parsedFromFullPath = typeof to.fullPath === "string" ? parsePathInput(to.fullPath, codec) : void 0;
|
|
18
|
-
const rawPath =
|
|
17
|
+
const rawPath = to.path ?? parsedFromFullPath?.path ?? currentPath;
|
|
19
18
|
const path = resolvePath(rawPath, currentPath);
|
|
20
|
-
const query = to.query ? normalizeQuery(to.query) :
|
|
21
|
-
const hash = normalizeHash(
|
|
19
|
+
const query = to.query ? normalizeQuery(to.query) : parsedFromFullPath?.query ?? {};
|
|
20
|
+
const hash = normalizeHash(to.hash ?? parsedFromFullPath?.hash);
|
|
22
21
|
const name = typeof to.name === "string" ? to.name : void 0;
|
|
23
22
|
const params = to.params ? normalizeRouteParams(to.params) : {};
|
|
24
23
|
return createRouteLocation(path, query, hash, name, params, codec.stringifyQuery);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.mjs","names":[],"sources":["../../../src/router/resolve.ts"],"sourcesContent":["import type { RouteResolveCodec } from '../routerInternal/shared'\nimport type { RouteLocationNormalizedLoaded, RouteLocationRaw, WevuBroadRouteMap } from './types'\nimport {\n createRouteLocation,\n normalizeHash,\n normalizeQuery,\n normalizeRouteParams,\n parsePathInput,\n parseQuery,\n resolvePath,\n stringifyQuery,\n} from '../routerInternal/shared'\n\nexport const DEFAULT_ROUTE_RESOLVE_CODEC: RouteResolveCodec = {\n parseQuery,\n stringifyQuery,\n}\n\nexport function resolveRouteLocation(\n to: RouteLocationRaw<WevuBroadRouteMap>,\n currentPath = '',\n codec: RouteResolveCodec = DEFAULT_ROUTE_RESOLVE_CODEC,\n): RouteLocationNormalizedLoaded<WevuBroadRouteMap> {\n if (typeof to === 'string') {\n const parsed = parsePathInput(to, codec)\n const path = resolvePath(parsed.path, currentPath)\n return createRouteLocation(path, parsed.query, parsed.hash, undefined, {}, codec.stringifyQuery)\n }\n\n const parsedFromFullPath = typeof to.fullPath === 'string'\n ? parsePathInput(to.fullPath, codec)\n : undefined\n\n const rawPath = to.path ?? parsedFromFullPath?.path ?? currentPath\n const path = resolvePath(rawPath, currentPath)\n const query = to.query\n ? normalizeQuery(to.query)\n : parsedFromFullPath?.query ?? {}\n const hash = normalizeHash(to.hash ?? parsedFromFullPath?.hash)\n const name = typeof to.name === 'string' ? to.name : undefined\n const params = to.params\n ? normalizeRouteParams(to.params)\n : {}\n\n return createRouteLocation(path, query, hash, name, params, codec.stringifyQuery)\n}\n"],"mappings":";;;;;AAaA,MAAa,8BAAiD;CAC5D;CACA;AACF;AAEA,SAAgB,qBACd,IACA,cAAc,IACd,QAA2B,6BACuB
|
|
1
|
+
{"version":3,"file":"resolve.mjs","names":[],"sources":["../../../src/router/resolve.ts"],"sourcesContent":["import type { RouteResolveCodec } from '../routerInternal/shared'\nimport type { RouteLocationNormalizedLoaded, RouteLocationRaw, WevuBroadRouteMap } from './types'\nimport {\n createRouteLocation,\n normalizeHash,\n normalizeQuery,\n normalizeRouteParams,\n parsePathInput,\n parseQuery,\n resolvePath,\n stringifyQuery,\n} from '../routerInternal/shared'\n\nexport const DEFAULT_ROUTE_RESOLVE_CODEC: RouteResolveCodec = {\n parseQuery,\n stringifyQuery,\n}\n\nexport function resolveRouteLocation(\n to: RouteLocationRaw<WevuBroadRouteMap>,\n currentPath = '',\n codec: RouteResolveCodec = DEFAULT_ROUTE_RESOLVE_CODEC,\n): RouteLocationNormalizedLoaded<WevuBroadRouteMap> {\n if (typeof to === 'string') {\n const parsed = parsePathInput(to, codec)\n const path = resolvePath(parsed.path, currentPath)\n return createRouteLocation(path, parsed.query, parsed.hash, undefined, {}, codec.stringifyQuery)\n }\n\n const parsedFromFullPath = typeof to.fullPath === 'string'\n ? parsePathInput(to.fullPath, codec)\n : undefined\n\n const rawPath = to.path ?? parsedFromFullPath?.path ?? currentPath\n const path = resolvePath(rawPath, currentPath)\n const query = to.query\n ? normalizeQuery(to.query)\n : parsedFromFullPath?.query ?? {}\n const hash = normalizeHash(to.hash ?? parsedFromFullPath?.hash)\n const name = typeof to.name === 'string' ? to.name : undefined\n const params = to.params\n ? normalizeRouteParams(to.params)\n : {}\n\n return createRouteLocation(path, query, hash, name, params, codec.stringifyQuery)\n}\n"],"mappings":";;;;;AAaA,MAAa,8BAAiD;CAC5D;CACA;AACF;AAEA,SAAgB,qBACd,IACA,cAAc,IACd,QAA2B,6BACuB;CAClD,IAAI,OAAO,OAAO,UAAU;EAC1B,MAAM,SAAS,eAAe,IAAI,KAAK;EACvC,MAAM,OAAO,YAAY,OAAO,MAAM,WAAW;EACjD,OAAO,oBAAoB,MAAM,OAAO,OAAO,OAAO,MAAM,QAAW,CAAC,GAAG,MAAM,cAAc;CACjG;CAEA,MAAM,qBAAqB,OAAO,GAAG,aAAa,WAC9C,eAAe,GAAG,UAAU,KAAK,IACjC;CAEJ,MAAM,UAAU,GAAG,QAAQ,oBAAoB,QAAQ;CACvD,MAAM,OAAO,YAAY,SAAS,WAAW;CAC7C,MAAM,QAAQ,GAAG,QACb,eAAe,GAAG,KAAK,IACvB,oBAAoB,SAAS,CAAC;CAClC,MAAM,OAAO,cAAc,GAAG,QAAQ,oBAAoB,IAAI;CAC9D,MAAM,OAAO,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO;CACrD,MAAM,SAAS,GAAG,SACd,qBAAqB,GAAG,MAAM,IAC9B,CAAC;CAEL,OAAO,oBAAoB,MAAM,OAAO,MAAM,MAAM,QAAQ,MAAM,cAAc;AAClF"}
|
|
@@ -28,7 +28,7 @@ function createRouteRegistry(namedRouteLookup) {
|
|
|
28
28
|
const parentRouteName = typeof parentNameOrRoute === "string" ? parentNameOrRoute : void 0;
|
|
29
29
|
const parentRouteRecord = parentRouteName ? namedRouteLookup.recordByName.get(parentRouteName) : void 0;
|
|
30
30
|
if (parentRouteName && !parentRouteRecord) throw new Error(`Parent route "${parentRouteName}" is not defined in createRouter({ routes | namedRoutes })`);
|
|
31
|
-
const routeRecords = flattenNamedRouteRecords([route], parentRouteRecord
|
|
31
|
+
const routeRecords = flattenNamedRouteRecords([route], parentRouteRecord?.path, parentRouteName, parentRouteRecord?.aliasPaths, void 0, "addRoute");
|
|
32
32
|
if (routeRecords.length === 0) throw new Error("Route name and path are required when adding a named route");
|
|
33
33
|
const addedRoutes = [];
|
|
34
34
|
for (const routeRecord of routeRecords) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeRegistry.mjs","names":[],"sources":["../../../src/router/routeRegistry.ts"],"sourcesContent":["import type {\n NamedRouteLookup,\n RouteRecordNormalized,\n} from '../routerInternal/shared'\nimport type { AddRoute, RouteRecordRaw } from './types'\nimport {\n assertValidAddRouteInput,\n cloneRouteMeta,\n collectRouteNamesForRemoval,\n createAbsoluteRoutePath,\n createNamedRouteNameByStaticPath,\n flattenNamedRouteRecords,\n normalizeRouteRecordRaw,\n warnRouteConfig,\n} from '../routerInternal/shared'\n\nfunction normalizeRouteRecordForOutput(record: RouteRecordNormalized): RouteRecordRaw {\n const normalizedRoute: RouteRecordRaw = {\n name: record.name,\n path: record.path ? `/${record.path}` : '/',\n }\n if (record.meta !== undefined) {\n normalizedRoute.meta = cloneRouteMeta(record.meta)\n }\n if (record.aliasPaths.length === 1) {\n normalizedRoute.alias = createAbsoluteRoutePath(record.aliasPaths[0])\n }\n else if (record.aliasPaths.length > 1) {\n normalizedRoute.alias = record.aliasPaths.map(aliasPath => createAbsoluteRoutePath(aliasPath))\n }\n if (record.beforeEnterGuards.length === 1) {\n normalizedRoute.beforeEnter = record.beforeEnterGuards[0]\n }\n else if (record.beforeEnterGuards.length > 1) {\n normalizedRoute.beforeEnter = record.beforeEnterGuards.slice()\n }\n if (record.redirect !== undefined) {\n normalizedRoute.redirect = record.redirect\n }\n return normalizedRoute\n}\n\nexport function createRouteRegistry(namedRouteLookup: NamedRouteLookup) {\n const hasRoute = (name: string) => namedRouteLookup.recordByName.has(name)\n const getRoutes = (): readonly RouteRecordRaw[] =>\n Array.from(namedRouteLookup.recordByName.values(), normalizeRouteRecordForOutput)\n\n const addRoute: AddRoute = ((parentNameOrRoute: string | RouteRecordRaw, maybeRoute?: RouteRecordRaw) => {\n const route = typeof parentNameOrRoute === 'string'\n ? maybeRoute\n : parentNameOrRoute\n if (!route) {\n throw new Error('Route record is required when adding a child route')\n }\n assertValidAddRouteInput(route)\n\n const parentRouteName = typeof parentNameOrRoute === 'string'\n ? parentNameOrRoute\n : undefined\n const parentRouteRecord = parentRouteName\n ? namedRouteLookup.recordByName.get(parentRouteName)\n : undefined\n if (parentRouteName && !parentRouteRecord) {\n throw new Error(`Parent route \"${parentRouteName}\" is not defined in createRouter({ routes | namedRoutes })`)\n }\n\n const routeRecords = flattenNamedRouteRecords(\n [route],\n parentRouteRecord?.path,\n parentRouteName,\n parentRouteRecord?.aliasPaths,\n undefined,\n 'addRoute',\n )\n if (routeRecords.length === 0) {\n throw new Error('Route name and path are required when adding a named route')\n }\n const addedRoutes: RouteRecordNormalized[] = []\n for (const routeRecord of routeRecords) {\n const normalizedRoute = normalizeRouteRecordRaw(routeRecord.route, routeRecord.parentName)\n if (!normalizedRoute) {\n continue\n }\n const existingRoute = namedRouteLookup.recordByName.get(normalizedRoute.name)\n if (existingRoute) {\n const namesToRemove = collectRouteNamesForRemoval(existingRoute.name, namedRouteLookup.recordByName)\n for (const routeName of namesToRemove) {\n namedRouteLookup.recordByName.delete(routeName)\n }\n warnRouteConfig(\n `addRoute() replaced existing route \"${normalizedRoute.name}\" (${createAbsoluteRoutePath(existingRoute.path)} -> ${createAbsoluteRoutePath(normalizedRoute.path)}) and removed ${namesToRemove.size - 1} nested route(s)`,\n )\n }\n namedRouteLookup.recordByName.set(normalizedRoute.name, normalizedRoute)\n addedRoutes.push(normalizedRoute)\n }\n namedRouteLookup.nameByStaticPath = createNamedRouteNameByStaticPath(namedRouteLookup.recordByName)\n\n return () => {\n let changed = false\n for (const addedRoute of addedRoutes) {\n const currentRoute = namedRouteLookup.recordByName.get(addedRoute.name)\n if (currentRoute === addedRoute) {\n namedRouteLookup.recordByName.delete(addedRoute.name)\n changed = true\n }\n }\n if (changed) {\n namedRouteLookup.nameByStaticPath = createNamedRouteNameByStaticPath(namedRouteLookup.recordByName)\n }\n }\n }) as AddRoute\n\n function removeRoute(name: string): void {\n const namesToRemove = collectRouteNamesForRemoval(name, namedRouteLookup.recordByName)\n if (namesToRemove.size === 0) {\n return\n }\n\n let changed = false\n for (const routeName of namesToRemove) {\n changed = namedRouteLookup.recordByName.delete(routeName) || changed\n }\n if (changed) {\n namedRouteLookup.nameByStaticPath = createNamedRouteNameByStaticPath(namedRouteLookup.recordByName)\n }\n }\n\n function clearRoutes(): void {\n namedRouteLookup.recordByName.clear()\n namedRouteLookup.nameByStaticPath.clear()\n }\n\n return {\n hasRoute,\n getRoutes,\n addRoute,\n removeRoute,\n clearRoutes,\n }\n}\n"],"mappings":";;;;;;;AAgBA,SAAS,8BAA8B,QAA+C;CACpF,MAAM,kBAAkC;EACtC,MAAM,OAAO;EACb,MAAM,OAAO,OAAO,IAAI,OAAO,SAAS;CAC1C;CACA,IAAI,OAAO,SAAS,QAClB,gBAAgB,OAAO,eAAe,OAAO,IAAI;CAEnD,IAAI,OAAO,WAAW,WAAW,GAC/B,gBAAgB,QAAQ,wBAAwB,OAAO,WAAW,EAAE;MAEjE,IAAI,OAAO,WAAW,SAAS,GAClC,gBAAgB,QAAQ,OAAO,WAAW,KAAI,cAAa,wBAAwB,SAAS,CAAC;CAE/F,IAAI,OAAO,kBAAkB,WAAW,GACtC,gBAAgB,cAAc,OAAO,kBAAkB;MAEpD,IAAI,OAAO,kBAAkB,SAAS,GACzC,gBAAgB,cAAc,OAAO,kBAAkB,MAAM;CAE/D,IAAI,OAAO,aAAa,QACtB,gBAAgB,WAAW,OAAO;CAEpC,OAAO;AACT;AAEA,SAAgB,oBAAoB,kBAAoC;CACtE,MAAM,YAAY,SAAiB,iBAAiB,aAAa,IAAI,IAAI;CACzE,MAAM,kBACJ,MAAM,KAAK,iBAAiB,aAAa,OAAO,GAAG,6BAA6B;CAElF,MAAM,aAAuB,mBAA4C,eAAgC;EACvG,MAAM,QAAQ,OAAO,sBAAsB,WACvC,aACA;EACJ,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,oDAAoD;EAEtE,yBAAyB,KAAK;EAE9B,MAAM,kBAAkB,OAAO,sBAAsB,WACjD,oBACA;EACJ,MAAM,oBAAoB,kBACtB,iBAAiB,aAAa,IAAI,eAAe,IACjD;EACJ,IAAI,mBAAmB,CAAC,mBACtB,MAAM,IAAI,MAAM,iBAAiB,gBAAgB,2DAA2D;EAG9G,MAAM,eAAe,yBACnB,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"routeRegistry.mjs","names":[],"sources":["../../../src/router/routeRegistry.ts"],"sourcesContent":["import type {\n NamedRouteLookup,\n RouteRecordNormalized,\n} from '../routerInternal/shared'\nimport type { AddRoute, RouteRecordRaw } from './types'\nimport {\n assertValidAddRouteInput,\n cloneRouteMeta,\n collectRouteNamesForRemoval,\n createAbsoluteRoutePath,\n createNamedRouteNameByStaticPath,\n flattenNamedRouteRecords,\n normalizeRouteRecordRaw,\n warnRouteConfig,\n} from '../routerInternal/shared'\n\nfunction normalizeRouteRecordForOutput(record: RouteRecordNormalized): RouteRecordRaw {\n const normalizedRoute: RouteRecordRaw = {\n name: record.name,\n path: record.path ? `/${record.path}` : '/',\n }\n if (record.meta !== undefined) {\n normalizedRoute.meta = cloneRouteMeta(record.meta)\n }\n if (record.aliasPaths.length === 1) {\n normalizedRoute.alias = createAbsoluteRoutePath(record.aliasPaths[0])\n }\n else if (record.aliasPaths.length > 1) {\n normalizedRoute.alias = record.aliasPaths.map(aliasPath => createAbsoluteRoutePath(aliasPath))\n }\n if (record.beforeEnterGuards.length === 1) {\n normalizedRoute.beforeEnter = record.beforeEnterGuards[0]\n }\n else if (record.beforeEnterGuards.length > 1) {\n normalizedRoute.beforeEnter = record.beforeEnterGuards.slice()\n }\n if (record.redirect !== undefined) {\n normalizedRoute.redirect = record.redirect\n }\n return normalizedRoute\n}\n\nexport function createRouteRegistry(namedRouteLookup: NamedRouteLookup) {\n const hasRoute = (name: string) => namedRouteLookup.recordByName.has(name)\n const getRoutes = (): readonly RouteRecordRaw[] =>\n Array.from(namedRouteLookup.recordByName.values(), normalizeRouteRecordForOutput)\n\n const addRoute: AddRoute = ((parentNameOrRoute: string | RouteRecordRaw, maybeRoute?: RouteRecordRaw) => {\n const route = typeof parentNameOrRoute === 'string'\n ? maybeRoute\n : parentNameOrRoute\n if (!route) {\n throw new Error('Route record is required when adding a child route')\n }\n assertValidAddRouteInput(route)\n\n const parentRouteName = typeof parentNameOrRoute === 'string'\n ? parentNameOrRoute\n : undefined\n const parentRouteRecord = parentRouteName\n ? namedRouteLookup.recordByName.get(parentRouteName)\n : undefined\n if (parentRouteName && !parentRouteRecord) {\n throw new Error(`Parent route \"${parentRouteName}\" is not defined in createRouter({ routes | namedRoutes })`)\n }\n\n const routeRecords = flattenNamedRouteRecords(\n [route],\n parentRouteRecord?.path,\n parentRouteName,\n parentRouteRecord?.aliasPaths,\n undefined,\n 'addRoute',\n )\n if (routeRecords.length === 0) {\n throw new Error('Route name and path are required when adding a named route')\n }\n const addedRoutes: RouteRecordNormalized[] = []\n for (const routeRecord of routeRecords) {\n const normalizedRoute = normalizeRouteRecordRaw(routeRecord.route, routeRecord.parentName)\n if (!normalizedRoute) {\n continue\n }\n const existingRoute = namedRouteLookup.recordByName.get(normalizedRoute.name)\n if (existingRoute) {\n const namesToRemove = collectRouteNamesForRemoval(existingRoute.name, namedRouteLookup.recordByName)\n for (const routeName of namesToRemove) {\n namedRouteLookup.recordByName.delete(routeName)\n }\n warnRouteConfig(\n `addRoute() replaced existing route \"${normalizedRoute.name}\" (${createAbsoluteRoutePath(existingRoute.path)} -> ${createAbsoluteRoutePath(normalizedRoute.path)}) and removed ${namesToRemove.size - 1} nested route(s)`,\n )\n }\n namedRouteLookup.recordByName.set(normalizedRoute.name, normalizedRoute)\n addedRoutes.push(normalizedRoute)\n }\n namedRouteLookup.nameByStaticPath = createNamedRouteNameByStaticPath(namedRouteLookup.recordByName)\n\n return () => {\n let changed = false\n for (const addedRoute of addedRoutes) {\n const currentRoute = namedRouteLookup.recordByName.get(addedRoute.name)\n if (currentRoute === addedRoute) {\n namedRouteLookup.recordByName.delete(addedRoute.name)\n changed = true\n }\n }\n if (changed) {\n namedRouteLookup.nameByStaticPath = createNamedRouteNameByStaticPath(namedRouteLookup.recordByName)\n }\n }\n }) as AddRoute\n\n function removeRoute(name: string): void {\n const namesToRemove = collectRouteNamesForRemoval(name, namedRouteLookup.recordByName)\n if (namesToRemove.size === 0) {\n return\n }\n\n let changed = false\n for (const routeName of namesToRemove) {\n changed = namedRouteLookup.recordByName.delete(routeName) || changed\n }\n if (changed) {\n namedRouteLookup.nameByStaticPath = createNamedRouteNameByStaticPath(namedRouteLookup.recordByName)\n }\n }\n\n function clearRoutes(): void {\n namedRouteLookup.recordByName.clear()\n namedRouteLookup.nameByStaticPath.clear()\n }\n\n return {\n hasRoute,\n getRoutes,\n addRoute,\n removeRoute,\n clearRoutes,\n }\n}\n"],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ function registerRouteStateSyncHandler(handler) {
|
|
|
19
19
|
function notifyRouteStateSync(payload) {
|
|
20
20
|
for (const handler of routeStateSyncHandlers) try {
|
|
21
21
|
handler(payload);
|
|
22
|
-
} catch
|
|
22
|
+
} catch {}
|
|
23
23
|
}
|
|
24
24
|
function createNativeRouteStateSyncPayload(methodName, option, sourcePage) {
|
|
25
25
|
if (methodName === "navigateBack") return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeSync.mjs","names":[],"sources":["../../../src/router/routeSync.ts"],"sourcesContent":["import type { MiniProgramPageLike } from '../routerInternal/shared'\nimport type { RouteLocationNormalizedLoaded } from './types'\nimport { getCurrentMiniProgramPages } from '../runtime/platform'\n\nexport interface RouteStateSyncPayload {\n page?: MiniProgramPageLike\n route?: RouteLocationNormalizedLoaded\n url?: string\n source?: 'native' | 'page' | 'router'\n method?: NativeRouterMethodName\n}\n\ntype RouteStateSyncHandler = (payload?: RouteStateSyncPayload) => void\ntype NativeRouterMethodName = 'switchTab' | 'reLaunch' | 'redirectTo' | 'navigateTo' | 'navigateBack'\n\nconst ROUTE_SYNC_NATIVE_METHODS: readonly NativeRouterMethodName[] = ['switchTab', 'reLaunch', 'redirectTo', 'navigateTo', 'navigateBack']\nconst routeStateSyncHandlers = new Set<RouteStateSyncHandler>()\nconst patchedNativeRouters = new WeakSet<Record<string, any>>()\n\nexport function registerRouteStateSyncHandler(handler: RouteStateSyncHandler): () => void {\n routeStateSyncHandlers.add(handler)\n return () => {\n routeStateSyncHandlers.delete(handler)\n }\n}\n\nexport function notifyRouteStateSync(payload?: RouteStateSyncPayload) {\n for (const handler of routeStateSyncHandlers) {\n try {\n handler(payload)\n }\n catch {\n // 忽略单个 route 订阅者异常,避免阻塞原生导航成功回调。\n }\n }\n}\n\nfunction createNativeRouteStateSyncPayload(\n methodName: NativeRouterMethodName,\n option: unknown,\n sourcePage: MiniProgramPageLike | undefined,\n): RouteStateSyncPayload | undefined {\n if (methodName === 'navigateBack') {\n return {\n method: methodName,\n source: 'native',\n }\n }\n if (option && typeof option === 'object') {\n const url = (option as Record<string, unknown>).url\n if (typeof url === 'string') {\n return {\n method: methodName,\n page: sourcePage,\n source: 'native',\n url,\n }\n }\n }\n return {\n method: methodName,\n page: sourcePage,\n source: 'native',\n }\n}\n\nexport function installRouteStateSyncOnNativeRouter(nativeRouter: unknown) {\n if (!nativeRouter || typeof nativeRouter !== 'object') {\n return\n }\n const router = nativeRouter as Record<string, any>\n if (patchedNativeRouters.has(router)) {\n return\n }\n patchedNativeRouters.add(router)\n\n for (const methodName of ROUTE_SYNC_NATIVE_METHODS) {\n const original = router[methodName]\n if (typeof original !== 'function') {\n continue\n }\n\n router[methodName] = function routeStateSyncNativeRouterMethod(this: unknown, option?: unknown, ...args: any[]) {\n const pages = getCurrentMiniProgramPages() as MiniProgramPageLike[]\n const sourcePage = pages[pages.length - 1]\n let synced = false\n const syncRouteState = () => {\n if (synced) {\n return\n }\n synced = true\n notifyRouteStateSync(createNativeRouteStateSyncPayload(methodName, option, sourcePage))\n }\n\n const nextOption = option && typeof option === 'object'\n ? {\n ...(option as Record<string, any>),\n success: (...successArgs: any[]) => {\n syncRouteState()\n const originalSuccess = (option as Record<string, any>).success\n return typeof originalSuccess === 'function'\n ? originalSuccess(...successArgs)\n : undefined\n },\n }\n : option\n\n const result = original.call(this, nextOption, ...args)\n if (result && typeof (result as PromiseLike<unknown>).then === 'function') {\n ;(result as PromiseLike<unknown>).then(syncRouteState, () => {})\n }\n return result\n }\n }\n}\n"],"mappings":";;;AAeA,MAAM,4BAA+D;CAAC;CAAa;CAAY;CAAc;CAAc;AAAc;AACzI,MAAM,yCAAyB,IAAI,IAA2B;AAC9D,MAAM,uCAAuB,IAAI,QAA6B;AAE9D,SAAgB,8BAA8B,SAA4C;CACxF,uBAAuB,IAAI,OAAO;CAClC,aAAa;EACX,uBAAuB,OAAO,OAAO;CACvC;AACF;AAEA,SAAgB,qBAAqB,SAAiC;CACpE,KAAK,MAAM,WAAW,wBACpB,IAAI;EACF,QAAQ,OAAO;CACjB,
|
|
1
|
+
{"version":3,"file":"routeSync.mjs","names":[],"sources":["../../../src/router/routeSync.ts"],"sourcesContent":["import type { MiniProgramPageLike } from '../routerInternal/shared'\nimport type { RouteLocationNormalizedLoaded } from './types'\nimport { getCurrentMiniProgramPages } from '../runtime/platform'\n\nexport interface RouteStateSyncPayload {\n page?: MiniProgramPageLike\n route?: RouteLocationNormalizedLoaded\n url?: string\n source?: 'native' | 'page' | 'router'\n method?: NativeRouterMethodName\n}\n\ntype RouteStateSyncHandler = (payload?: RouteStateSyncPayload) => void\ntype NativeRouterMethodName = 'switchTab' | 'reLaunch' | 'redirectTo' | 'navigateTo' | 'navigateBack'\n\nconst ROUTE_SYNC_NATIVE_METHODS: readonly NativeRouterMethodName[] = ['switchTab', 'reLaunch', 'redirectTo', 'navigateTo', 'navigateBack']\nconst routeStateSyncHandlers = new Set<RouteStateSyncHandler>()\nconst patchedNativeRouters = new WeakSet<Record<string, any>>()\n\nexport function registerRouteStateSyncHandler(handler: RouteStateSyncHandler): () => void {\n routeStateSyncHandlers.add(handler)\n return () => {\n routeStateSyncHandlers.delete(handler)\n }\n}\n\nexport function notifyRouteStateSync(payload?: RouteStateSyncPayload) {\n for (const handler of routeStateSyncHandlers) {\n try {\n handler(payload)\n }\n catch {\n // 忽略单个 route 订阅者异常,避免阻塞原生导航成功回调。\n }\n }\n}\n\nfunction createNativeRouteStateSyncPayload(\n methodName: NativeRouterMethodName,\n option: unknown,\n sourcePage: MiniProgramPageLike | undefined,\n): RouteStateSyncPayload | undefined {\n if (methodName === 'navigateBack') {\n return {\n method: methodName,\n source: 'native',\n }\n }\n if (option && typeof option === 'object') {\n const url = (option as Record<string, unknown>).url\n if (typeof url === 'string') {\n return {\n method: methodName,\n page: sourcePage,\n source: 'native',\n url,\n }\n }\n }\n return {\n method: methodName,\n page: sourcePage,\n source: 'native',\n }\n}\n\nexport function installRouteStateSyncOnNativeRouter(nativeRouter: unknown) {\n if (!nativeRouter || typeof nativeRouter !== 'object') {\n return\n }\n const router = nativeRouter as Record<string, any>\n if (patchedNativeRouters.has(router)) {\n return\n }\n patchedNativeRouters.add(router)\n\n for (const methodName of ROUTE_SYNC_NATIVE_METHODS) {\n const original = router[methodName]\n if (typeof original !== 'function') {\n continue\n }\n\n router[methodName] = function routeStateSyncNativeRouterMethod(this: unknown, option?: unknown, ...args: any[]) {\n const pages = getCurrentMiniProgramPages() as MiniProgramPageLike[]\n const sourcePage = pages[pages.length - 1]\n let synced = false\n const syncRouteState = () => {\n if (synced) {\n return\n }\n synced = true\n notifyRouteStateSync(createNativeRouteStateSyncPayload(methodName, option, sourcePage))\n }\n\n const nextOption = option && typeof option === 'object'\n ? {\n ...(option as Record<string, any>),\n success: (...successArgs: any[]) => {\n syncRouteState()\n const originalSuccess = (option as Record<string, any>).success\n return typeof originalSuccess === 'function'\n ? originalSuccess(...successArgs)\n : undefined\n },\n }\n : option\n\n const result = original.call(this, nextOption, ...args)\n if (result && typeof (result as PromiseLike<unknown>).then === 'function') {\n ;(result as PromiseLike<unknown>).then(syncRouteState, () => {})\n }\n return result\n }\n }\n}\n"],"mappings":";;;AAeA,MAAM,4BAA+D;CAAC;CAAa;CAAY;CAAc;CAAc;AAAc;AACzI,MAAM,yCAAyB,IAAI,IAA2B;AAC9D,MAAM,uCAAuB,IAAI,QAA6B;AAE9D,SAAgB,8BAA8B,SAA4C;CACxF,uBAAuB,IAAI,OAAO;CAClC,aAAa;EACX,uBAAuB,OAAO,OAAO;CACvC;AACF;AAEA,SAAgB,qBAAqB,SAAiC;CACpE,KAAK,MAAM,WAAW,wBACpB,IAAI;EACF,QAAQ,OAAO;CACjB,QACM,CAEN;AAEJ;AAEA,SAAS,kCACP,YACA,QACA,YACmC;CACnC,IAAI,eAAe,gBACjB,OAAO;EACL,QAAQ;EACR,QAAQ;CACV;CAEF,IAAI,UAAU,OAAO,WAAW,UAAU;EACxC,MAAM,MAAO,OAAmC;EAChD,IAAI,OAAO,QAAQ,UACjB,OAAO;GACL,QAAQ;GACR,MAAM;GACN,QAAQ;GACR;EACF;CAEJ;CACA,OAAO;EACL,QAAQ;EACR,MAAM;EACN,QAAQ;CACV;AACF;AAEA,SAAgB,oCAAoC,cAAuB;CACzE,IAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAC3C;CAEF,MAAM,SAAS;CACf,IAAI,qBAAqB,IAAI,MAAM,GACjC;CAEF,qBAAqB,IAAI,MAAM;CAE/B,KAAK,MAAM,cAAc,2BAA2B;EAClD,MAAM,WAAW,OAAO;EACxB,IAAI,OAAO,aAAa,YACtB;EAGF,OAAO,cAAc,SAAS,iCAAgD,QAAkB,GAAG,MAAa;GAC9G,MAAM,QAAQ,2BAA2B;GACzC,MAAM,aAAa,MAAM,MAAM,SAAS;GACxC,IAAI,SAAS;GACb,MAAM,uBAAuB;IAC3B,IAAI,QACF;IAEF,SAAS;IACT,qBAAqB,kCAAkC,YAAY,QAAQ,UAAU,CAAC;GACxF;GAEA,MAAM,aAAa,UAAU,OAAO,WAAW,WAC3C;IACE,GAAI;IACJ,UAAU,GAAG,gBAAuB;KAClC,eAAe;KACf,MAAM,kBAAmB,OAA+B;KACxD,OAAO,OAAO,oBAAoB,aAC9B,gBAAgB,GAAG,WAAW,IAC9B;IACN;GACF,IACA;GAEJ,MAAM,SAAS,SAAS,KAAK,MAAM,YAAY,GAAG,IAAI;GACtD,IAAI,UAAU,OAAQ,OAAgC,SAAS,YAC5D,AAAC,OAAgC,KAAK,sBAAsB,CAAC,CAAC;GAEjE,OAAO;EACT;CACF;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ScrollRestorationHandle, ScrollRestorationRegistrationOptions, ScrollViewRestorationHandle } from "./types.mjs";
|
|
2
|
+
//#region src/router/scrollRestoration/adapters.d.ts
|
|
3
|
+
/** WebView 页面适配器;Skyline 没有隐式页面滚动容器。 */
|
|
4
|
+
export declare function usePageScrollRestoration(options?: ScrollRestorationRegistrationOptions): ScrollRestorationHandle;
|
|
5
|
+
/** 用属性控制 WebView/Skyline scroll-view,scroll 事件不产生 setData。 */
|
|
6
|
+
export declare function useScrollViewRestoration(options?: ScrollRestorationRegistrationOptions): ScrollViewRestorationHandle;
|
|
7
|
+
//#endregion
|
|
8
|
+
//# sourceMappingURL=adapters.d.mts.map
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ref } from "../../reactivity/ref.mjs";
|
|
2
|
+
import { getCurrentMiniProgramGlobalObject } from "../../runtime/platform/current.mjs";
|
|
3
|
+
import { ensurePageHookOnInstance } from "../../runtime/hooks/pageScroll.mjs";
|
|
4
|
+
import { addScrollHook } from "./host.mjs";
|
|
5
|
+
import { resolveScrollController } from "./controller.mjs";
|
|
6
|
+
import { getScrollSetupScope, registerScrollRestoration } from "./index.mjs";
|
|
7
|
+
import { WEVU_PAGE_SCROLL_OBSERVERS_KEY, WEVU_PAGE_SCROLL_RESTORATION_OWNER_KEY } from "@weapp-core/constants";
|
|
8
|
+
|
|
9
|
+
//#region src/router/scrollRestoration/adapters.ts
|
|
10
|
+
/** WebView 页面适配器;Skyline 没有隐式页面滚动容器。 */
|
|
11
|
+
function usePageScrollRestoration(options = {}) {
|
|
12
|
+
const state = resolveScrollController(options.controller);
|
|
13
|
+
const host = getCurrentMiniProgramGlobalObject();
|
|
14
|
+
if (typeof host?.pageScrollTo !== "function") throw new TypeError("当前宿主不支持 pageScrollTo,请使用显式 scroll-view 适配器。");
|
|
15
|
+
let top = 0;
|
|
16
|
+
let page;
|
|
17
|
+
const cleanups = [];
|
|
18
|
+
return registerScrollRestoration({
|
|
19
|
+
...options,
|
|
20
|
+
capture: () => ({ top }),
|
|
21
|
+
async restore(snapshot, context) {
|
|
22
|
+
const transition = state.transition;
|
|
23
|
+
if (transition && transition.page === page && transition.event.renderer === "skyline") throw new Error("Skyline 不支持页面级滚动,请使用 useScrollViewRestoration()。");
|
|
24
|
+
if (!context.isActive()) return;
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
host.pageScrollTo({
|
|
27
|
+
scrollTop: snapshot?.top ?? 0,
|
|
28
|
+
duration: 0,
|
|
29
|
+
success: () => resolve(),
|
|
30
|
+
fail: reject
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}, {
|
|
35
|
+
onBindPage(owner) {
|
|
36
|
+
page = owner;
|
|
37
|
+
const releaseOwner = host[WEVU_PAGE_SCROLL_RESTORATION_OWNER_KEY]?.(page);
|
|
38
|
+
if (typeof releaseOwner === "function") cleanups.push(releaseOwner);
|
|
39
|
+
cleanups.push(addScrollHook(page, WEVU_PAGE_SCROLL_OBSERVERS_KEY, (event) => {
|
|
40
|
+
if (event && typeof event === "object" && "scrollTop" in event && typeof event.scrollTop === "number") top = event.scrollTop;
|
|
41
|
+
}));
|
|
42
|
+
ensurePageHookOnInstance(page, "onPageScroll");
|
|
43
|
+
},
|
|
44
|
+
onStop() {
|
|
45
|
+
for (const cleanup of cleanups) cleanup();
|
|
46
|
+
cleanups.length = 0;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** 用属性控制 WebView/Skyline scroll-view,scroll 事件不产生 setData。 */
|
|
51
|
+
function useScrollViewRestoration(options = {}) {
|
|
52
|
+
const { commit } = getScrollSetupScope();
|
|
53
|
+
const scrollTop = ref(0);
|
|
54
|
+
const scrollLeft = ref(0);
|
|
55
|
+
let top = 0;
|
|
56
|
+
let left = 0;
|
|
57
|
+
return {
|
|
58
|
+
...registerScrollRestoration({
|
|
59
|
+
...options,
|
|
60
|
+
capture: () => ({
|
|
61
|
+
top,
|
|
62
|
+
left
|
|
63
|
+
}),
|
|
64
|
+
async restore(snapshot, context) {
|
|
65
|
+
if (!context.isActive()) return;
|
|
66
|
+
scrollTop.value = top;
|
|
67
|
+
scrollLeft.value = left;
|
|
68
|
+
await commit();
|
|
69
|
+
if (!context.isActive()) return;
|
|
70
|
+
scrollTop.value = snapshot?.top ?? 0;
|
|
71
|
+
scrollLeft.value = snapshot?.left ?? 0;
|
|
72
|
+
await commit();
|
|
73
|
+
}
|
|
74
|
+
}),
|
|
75
|
+
scrollTop,
|
|
76
|
+
scrollLeft,
|
|
77
|
+
onScroll(event) {
|
|
78
|
+
top = event.detail.scrollTop;
|
|
79
|
+
left = event.detail.scrollLeft;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
export { usePageScrollRestoration, useScrollViewRestoration };
|
|
86
|
+
//# sourceMappingURL=adapters.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.mjs","names":[],"sources":["../../../../src/router/scrollRestoration/adapters.ts"],"sourcesContent":["import type { InternalRuntimeState } from '../../runtime/types'\nimport type { ScrollPage } from './host'\nimport type { ScrollRestorationHandle, ScrollRestorationRegistrationOptions, ScrollViewRestorationHandle } from './types'\nimport { WEVU_PAGE_SCROLL_OBSERVERS_KEY, WEVU_PAGE_SCROLL_RESTORATION_OWNER_KEY } from '@weapp-core/constants'\nimport { ref } from '../../reactivity'\nimport { ensurePageHookOnInstance } from '../../runtime/hooks/pageScroll'\nimport { getCurrentMiniProgramGlobalObject } from '../../runtime/platform'\nimport { resolveScrollController } from './controller'\nimport { addScrollHook } from './host'\nimport { getScrollSetupScope, registerScrollRestoration } from './index'\n\n/** WebView 页面适配器;Skyline 没有隐式页面滚动容器。 */\nexport function usePageScrollRestoration(options: ScrollRestorationRegistrationOptions = {}): ScrollRestorationHandle {\n const state = resolveScrollController(options.controller)\n const host = getCurrentMiniProgramGlobalObject()\n if (typeof host?.pageScrollTo !== 'function') {\n throw new TypeError('当前宿主不支持 pageScrollTo,请使用显式 scroll-view 适配器。')\n }\n let top = 0\n let page: ScrollPage | undefined\n const cleanups: Array<() => void> = []\n\n return registerScrollRestoration({\n ...options,\n capture: () => ({ top }),\n async restore(snapshot, context) {\n const transition = state.transition\n if (transition && transition.page === page && transition.event.renderer === 'skyline') {\n throw new Error('Skyline 不支持页面级滚动,请使用 useScrollViewRestoration()。')\n }\n if (!context.isActive()) {\n return\n }\n await new Promise<void>((resolve, reject) => {\n host.pageScrollTo({ scrollTop: snapshot?.top ?? 0, duration: 0, success: () => resolve(), fail: reject })\n })\n },\n }, {\n onBindPage(owner) {\n page = owner\n const releaseOwner = host[WEVU_PAGE_SCROLL_RESTORATION_OWNER_KEY]?.(page)\n if (typeof releaseOwner === 'function') {\n cleanups.push(releaseOwner)\n }\n cleanups.push(addScrollHook(page, WEVU_PAGE_SCROLL_OBSERVERS_KEY, (event) => {\n if (event && typeof event === 'object' && 'scrollTop' in event && typeof event.scrollTop === 'number') {\n top = event.scrollTop\n }\n }))\n ensurePageHookOnInstance(page as InternalRuntimeState, 'onPageScroll')\n },\n onStop() {\n for (const cleanup of cleanups) {\n cleanup()\n }\n cleanups.length = 0\n },\n })\n}\n\n/** 用属性控制 WebView/Skyline scroll-view,scroll 事件不产生 setData。 */\nexport function useScrollViewRestoration(options: ScrollRestorationRegistrationOptions = {}): ScrollViewRestorationHandle {\n const { commit } = getScrollSetupScope()\n const scrollTop = ref(0)\n const scrollLeft = ref(0)\n let top = 0\n let left = 0\n const handle = registerScrollRestoration({\n ...options,\n capture: () => ({ top, left }),\n async restore(snapshot, context) {\n if (!context.isActive()) {\n return\n }\n // 先同步实际位置,确保重复恢复相同目标也会产生有效的属性变化。\n // 内容和目标滚动位置分次提交,避免原生 scroll-view 使用更新前的尺寸。\n scrollTop.value = top\n scrollLeft.value = left\n await commit()\n if (!context.isActive()) {\n return\n }\n scrollTop.value = snapshot?.top ?? 0\n scrollLeft.value = snapshot?.left ?? 0\n await commit()\n },\n })\n return {\n ...handle,\n scrollTop,\n scrollLeft,\n onScroll(event) {\n top = event.detail.scrollTop\n left = event.detail.scrollLeft\n },\n }\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,yBAAyB,UAAgD,CAAC,GAA4B;CACpH,MAAM,QAAQ,wBAAwB,QAAQ,UAAU;CACxD,MAAM,OAAO,kCAAkC;CAC/C,IAAI,OAAO,MAAM,iBAAiB,YAChC,MAAM,IAAI,UAAU,6CAA6C;CAEnE,IAAI,MAAM;CACV,IAAI;CACJ,MAAM,WAA8B,CAAC;CAErC,OAAO,0BAA0B;EAC/B,GAAG;EACH,gBAAgB,EAAE,IAAI;EACtB,MAAM,QAAQ,UAAU,SAAS;GAC/B,MAAM,aAAa,MAAM;GACzB,IAAI,cAAc,WAAW,SAAS,QAAQ,WAAW,MAAM,aAAa,WAC1E,MAAM,IAAI,MAAM,kDAAkD;GAEpE,IAAI,CAAC,QAAQ,SAAS,GACpB;GAEF,MAAM,IAAI,SAAe,SAAS,WAAW;IAC3C,KAAK,aAAa;KAAE,WAAW,UAAU,OAAO;KAAG,UAAU;KAAG,eAAe,QAAQ;KAAG,MAAM;IAAO,CAAC;GAC1G,CAAC;EACH;CACF,GAAG;EACD,WAAW,OAAO;GAChB,OAAO;GACP,MAAM,eAAe,KAAK,uCAAuC,GAAG,IAAI;GACxE,IAAI,OAAO,iBAAiB,YAC1B,SAAS,KAAK,YAAY;GAE5B,SAAS,KAAK,cAAc,MAAM,iCAAiC,UAAU;IAC3E,IAAI,SAAS,OAAO,UAAU,YAAY,eAAe,SAAS,OAAO,MAAM,cAAc,UAC3F,MAAM,MAAM;GAEhB,CAAC,CAAC;GACF,yBAAyB,MAA8B,cAAc;EACvE;EACA,SAAS;GACP,KAAK,MAAM,WAAW,UACpB,QAAQ;GAEV,SAAS,SAAS;EACpB;CACF,CAAC;AACH;;AAGA,SAAgB,yBAAyB,UAAgD,CAAC,GAAgC;CACxH,MAAM,EAAE,WAAW,oBAAoB;CACvC,MAAM,YAAY,IAAI,CAAC;CACvB,MAAM,aAAa,IAAI,CAAC;CACxB,IAAI,MAAM;CACV,IAAI,OAAO;CAqBX,OAAO;EACL,GArBa,0BAA0B;GACvC,GAAG;GACH,gBAAgB;IAAE;IAAK;GAAK;GAC5B,MAAM,QAAQ,UAAU,SAAS;IAC/B,IAAI,CAAC,QAAQ,SAAS,GACpB;IAIF,UAAU,QAAQ;IAClB,WAAW,QAAQ;IACnB,MAAM,OAAO;IACb,IAAI,CAAC,QAAQ,SAAS,GACpB;IAEF,UAAU,QAAQ,UAAU,OAAO;IACnC,WAAW,QAAQ,UAAU,QAAQ;IACrC,MAAM,OAAO;GACf;EACF,CAEU;EACR;EACA;EACA,SAAS,OAAO;GACd,MAAM,MAAM,OAAO;GACnB,OAAO,MAAM,OAAO;EACtB;CACF;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "../types.mjs";
|
|
2
|
+
import { ScrollRestorationController, ScrollRestorationOptions } from "./types.mjs";
|
|
3
|
+
import "./host.mjs";
|
|
4
|
+
//#region src/router/scrollRestoration/controller.d.ts
|
|
5
|
+
/** 创建显式启用的路由会话;不会安装全局默认滚动行为。 */
|
|
6
|
+
export declare function createScrollRestoration<TRouteMap extends object>(options: ScrollRestorationOptions<TRouteMap>): ScrollRestorationController;
|
|
7
|
+
//#endregion
|
|
8
|
+
//# sourceMappingURL=controller.d.mts.map
|