one 1.17.10 → 1.17.11
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/dist/cjs/Root.native.js.map +1 -1
- package/dist/cjs/__mocks__/@react-navigation/native-stack.cjs +3 -1
- package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js +4 -0
- package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js.map +1 -1
- package/dist/cjs/__mocks__/expo-linking.native.js.map +1 -1
- package/dist/cjs/__mocks__/expo-modules-core.native.js.map +1 -1
- package/dist/cjs/__mocks__/react-native-screens.native.js.map +1 -1
- package/dist/cjs/babel-plugins/environment-guard.native.js.map +1 -1
- package/dist/cjs/babel-plugins/inline-one-server-url.native.js.map +1 -1
- package/dist/cjs/babel-plugins/one-router-metro.native.js.map +1 -1
- package/dist/cjs/babel-plugins/one-router-metro.test.native.js.map +1 -1
- package/dist/cjs/babel-plugins/remove-server-code.native.js.map +1 -1
- package/dist/cjs/babel-preset/index.native.js.map +1 -1
- package/dist/cjs/babel-preset/index.test.native.js.map +1 -1
- package/dist/cjs/babel-preset/integration.test.native.js.map +1 -1
- package/dist/cjs/cli/build.native.js.map +1 -1
- package/dist/cjs/cli/buildPage.native.js.map +1 -1
- package/dist/cjs/cli/buildPageWorker.native.js.map +1 -1
- package/dist/cjs/cli/checkNodeVersion.native.js.map +1 -1
- package/dist/cjs/cli/daemon.native.js.map +1 -1
- package/dist/cjs/cli/dev.native.js.map +1 -1
- package/dist/cjs/cli/generateBundlerConfig.native.js.map +1 -1
- package/dist/cjs/cli/generateBundlerConfig.test.native.js.map +1 -1
- package/dist/cjs/cli/generateRoutes.native.js.map +1 -1
- package/dist/cjs/cli/generateSitemap.native.js.map +1 -1
- package/dist/cjs/cli/generateSitemap.test.native.js.map +1 -1
- package/dist/cjs/cli/install-error-handlers.native.js.map +1 -1
- package/dist/cjs/cli/label-process.native.js.map +1 -1
- package/dist/cjs/cli/main.native.js.map +1 -1
- package/dist/cjs/cli/patch.native.js.map +1 -1
- package/dist/cjs/cli/patch.test.native.js.map +1 -1
- package/dist/cjs/cli/prebuild.native.js.map +1 -1
- package/dist/cjs/cli/runAndroid.native.js.map +1 -1
- package/dist/cjs/cli/runIos.native.js.map +1 -1
- package/dist/cjs/cli/securityScan.native.js.map +1 -1
- package/dist/cjs/cli/workerPool.native.js.map +1 -1
- package/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/clientLoaderResolver.native.js.map +1 -1
- package/dist/cjs/config.native.js.map +1 -1
- package/dist/cjs/constants.native.js.map +1 -1
- package/dist/cjs/constants.test.native.js.map +1 -1
- package/dist/cjs/createAPIRoute.native.js.map +1 -1
- package/dist/cjs/createHandleRequest.cjs +21 -12
- package/dist/cjs/createHandleRequest.native.js +22 -12
- package/dist/cjs/createHandleRequest.native.js.map +1 -1
- package/dist/cjs/createHandleRequest.test.cjs +51 -6
- package/dist/cjs/createHandleRequest.test.native.js +53 -6
- package/dist/cjs/createHandleRequest.test.native.js.map +1 -1
- package/dist/cjs/createMiddleware.native.js.map +1 -1
- package/dist/cjs/daemon/index.native.js.map +1 -1
- package/dist/cjs/daemon/ipc.native.js.map +1 -1
- package/dist/cjs/daemon/picker.native.js.map +1 -1
- package/dist/cjs/daemon/proxy.native.js.map +1 -1
- package/dist/cjs/daemon/registry.native.js.map +1 -1
- package/dist/cjs/daemon/server.native.js.map +1 -1
- package/dist/cjs/daemon/tui.native.js.map +1 -1
- package/dist/cjs/daemon/types.native.js.map +1 -1
- package/dist/cjs/daemon/utils.native.js.map +1 -1
- package/dist/cjs/devtools/registry.native.js.map +1 -1
- package/dist/cjs/drawer.native.js.map +1 -1
- package/dist/cjs/fallbackViews/Sitemap.native.js.map +1 -1
- package/dist/cjs/fallbackViews/Unmatched.native.js.map +1 -1
- package/dist/cjs/fork/NavigationContainer.native.js.map +1 -1
- package/dist/cjs/fork/SSRNavigationContainer.native.js.map +1 -1
- package/dist/cjs/fork/__tests__/getPathFromState.test.native.js.map +1 -1
- package/dist/cjs/fork/__tests__/getStateFromPath.test.native.js.map +1 -1
- package/dist/cjs/fork/_shared.native.js.map +1 -1
- package/dist/cjs/fork/createMemoryHistory.native.js.map +1 -1
- package/dist/cjs/fork/createMemoryHistory.test.native.js.map +1 -1
- package/dist/cjs/fork/extractPathFromURL.native.js.map +1 -1
- package/dist/cjs/fork/extractPathFromURL.test.native.js.map +1 -1
- package/dist/cjs/fork/findFocusedRoute.native.js.map +1 -1
- package/dist/cjs/fork/getPathFromState-mods.native.js.map +1 -1
- package/dist/cjs/fork/getPathFromState.native.js.map +1 -1
- package/dist/cjs/fork/getPathFromState.test.native.js.map +1 -1
- package/dist/cjs/fork/getStateFromPath-mods.native.js.map +1 -1
- package/dist/cjs/fork/getStateFromPath.native.js.map +1 -1
- package/dist/cjs/fork/getStateFromPath.test.native.js.map +1 -1
- package/dist/cjs/fork/useThenable.native.js.map +1 -1
- package/dist/cjs/fork/validatePathConfig.native.js.map +1 -1
- package/dist/cjs/getReactNavigationConfig.native.js.map +1 -1
- package/dist/cjs/head/Head.native.js.map +1 -1
- package/dist/cjs/head/HeadModule.native.js.map +1 -1
- package/dist/cjs/head/index.native.js.map +1 -1
- package/dist/cjs/head/types.native.js.map +1 -1
- package/dist/cjs/head/url.native.js.map +1 -1
- package/dist/cjs/headless-server.native.js.map +1 -1
- package/dist/cjs/headless.cjs +1 -0
- package/dist/cjs/headless.native.js +1 -0
- package/dist/cjs/headless.native.js.map +1 -1
- package/dist/cjs/hooks.native.js.map +1 -1
- package/dist/cjs/hooks.test.native.js.map +1 -1
- package/dist/cjs/href.native.js.map +1 -1
- package/dist/cjs/image/getImageData.native.js.map +1 -1
- package/dist/cjs/image.native.js.map +1 -1
- package/dist/cjs/index.cjs +3 -0
- package/dist/cjs/index.native.js +4 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/interfaces/router.native.js.map +1 -1
- package/dist/cjs/layouts/Drawer.cjs +46 -1
- package/dist/cjs/layouts/Drawer.native.js +47 -1
- package/dist/cjs/layouts/Drawer.native.js.map +1 -1
- package/dist/cjs/layouts/NativeTabs.native.js.map +1 -1
- package/dist/cjs/layouts/Stack.cjs +12 -3
- package/dist/cjs/layouts/Stack.native.js +13 -4
- package/dist/cjs/layouts/Stack.native.js.map +1 -1
- package/dist/cjs/layouts/Tabs.cjs +42 -8
- package/dist/cjs/layouts/Tabs.native.js +43 -8
- package/dist/cjs/layouts/Tabs.native.js.map +1 -1
- package/dist/cjs/layouts/stack-navigator.cjs +29 -0
- package/dist/cjs/layouts/stack-navigator.native.js +32 -0
- package/dist/cjs/layouts/stack-navigator.native.js.map +1 -0
- package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/index.native.js.map +1 -1
- package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
- package/dist/cjs/lazyWithRetry.native.js.map +1 -1
- package/dist/cjs/link/Link.native.js.map +1 -1
- package/dist/cjs/link/Redirect.native.js.map +1 -1
- package/dist/cjs/link/getLinking.native.js.map +1 -1
- package/dist/cjs/link/href.native.js.map +1 -1
- package/dist/cjs/link/path.native.js.map +1 -1
- package/dist/cjs/link/prefetchIntent.native.js.map +1 -1
- package/dist/cjs/link/prefetchIntent.test.native.js.map +1 -1
- package/dist/cjs/link/prefetchViewport.native.js.map +1 -1
- package/dist/cjs/link/prefetchViewport.test.native.js.map +1 -1
- package/dist/cjs/link/useLinkTo.native.js.map +1 -1
- package/dist/cjs/link/useLoadedNavigation.native.js.map +1 -1
- package/dist/cjs/metro-config/buildOneMetroResolverOverrides.native.js.map +1 -1
- package/dist/cjs/metro-config/getViteMetroPluginOptions.integration.test.native.js.map +1 -1
- package/dist/cjs/metro-config/getViteMetroPluginOptions.native.js +1 -1
- package/dist/cjs/metro-config/getViteMetroPluginOptions.native.js.map +1 -1
- package/dist/cjs/metro-config/withOne.native.js.map +1 -1
- package/dist/cjs/metro-config/withOne.test.native.js.map +1 -1
- package/dist/cjs/native-tabs.native.js.map +1 -1
- package/dist/cjs/notFoundState.native.js.map +1 -1
- package/dist/cjs/polyfills-mobile.native.js.map +1 -1
- package/dist/cjs/polyfills-server.native.js.map +1 -1
- package/dist/cjs/router/FlagsContext.native.js.map +1 -1
- package/dist/cjs/router/Route.native.js.map +1 -1
- package/dist/cjs/router/RouteInfoContext.native.js.map +1 -1
- package/dist/cjs/router/RouterStore.native.js.map +1 -1
- package/dist/cjs/router/SpaShellContext.native.js.map +1 -1
- package/dist/cjs/router/createRoute.native.js.map +1 -1
- package/dist/cjs/router/filterRootHTML.native.js.map +1 -1
- package/dist/cjs/router/findRouteNode.native.js.map +1 -1
- package/dist/cjs/router/getLinkingConfig.native.js.map +1 -1
- package/dist/cjs/router/getLinkingConfig.test.native.js.map +1 -1
- package/dist/cjs/router/getNormalizedStatePath.native.js.map +1 -1
- package/dist/cjs/router/getRouteInfo.native.js.map +1 -1
- package/dist/cjs/router/getRoutes.native.js.map +1 -1
- package/dist/cjs/router/getRoutes.test.native.js.map +1 -1
- package/dist/cjs/router/glob-patterns.native.js.map +1 -1
- package/dist/cjs/router/imperative-api.native.js.map +1 -1
- package/dist/cjs/router/interceptRoutes.native.js.map +1 -1
- package/dist/cjs/router/isIndexPath.native.js.map +1 -1
- package/dist/cjs/router/lastAction.native.js.map +1 -1
- package/dist/cjs/router/linkingConfig.native.js.map +1 -1
- package/dist/cjs/router/matchers.native.js.map +1 -1
- package/dist/cjs/router/matchers.test.native.js.map +1 -1
- package/dist/cjs/router/params.native.js.map +1 -1
- package/dist/cjs/router/renderingRegistry.cjs +53 -0
- package/dist/cjs/router/renderingRegistry.native.js +56 -0
- package/dist/cjs/router/renderingRegistry.native.js.map +1 -0
- package/dist/cjs/router/router.cjs +2 -0
- package/dist/cjs/router/router.native.js.map +1 -1
- package/dist/cjs/router/serverLocationContext.native.js.map +1 -1
- package/dist/cjs/router/sitemap.native.js.map +1 -1
- package/dist/cjs/router/sitemap.test.native.js.map +1 -1
- package/dist/cjs/router/sortRoutes.native.js.map +1 -1
- package/dist/cjs/router/useInitializeOneRouter.native.js.map +1 -1
- package/dist/cjs/router/useNavigation.native.js.map +1 -1
- package/dist/cjs/router/useScreens.native.js.map +1 -1
- package/dist/cjs/router/useViteRoutes.native.js.map +1 -1
- package/dist/cjs/router/utils/getNavigateAction.native.js.map +1 -1
- package/dist/cjs/router/utils/getNavigateAction.test.native.js.map +1 -1
- package/dist/cjs/router/web/ScreenRenderContext.cjs +36 -0
- package/dist/cjs/router/web/ScreenRenderContext.native.js +38 -0
- package/dist/cjs/router/web/ScreenRenderContext.native.js.map +1 -0
- package/dist/cjs/router/web/WebStackNavigator.cjs +74 -0
- package/dist/cjs/router/web/WebStackNavigator.native.js +78 -0
- package/dist/cjs/router/web/WebStackNavigator.native.js.map +1 -0
- package/dist/cjs/router/web/WebStackView.cjs +182 -0
- package/dist/cjs/router/web/WebStackView.native.js +235 -0
- package/dist/cjs/router/web/WebStackView.native.js.map +1 -0
- package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.cjs +295 -0
- package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js +335 -0
- package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js.map +1 -0
- package/dist/cjs/router/web/__tests__/WebStackView.test.cjs +464 -0
- package/dist/cjs/router/web/__tests__/WebStackView.test.native.js +515 -0
- package/dist/cjs/router/web/__tests__/WebStackView.test.native.js.map +1 -0
- package/dist/cjs/router/web/__tests__/stackStateUtils.test.cjs +134 -0
- package/dist/cjs/router/web/__tests__/stackStateUtils.test.native.js +163 -0
- package/dist/cjs/router/web/__tests__/stackStateUtils.test.native.js.map +1 -0
- package/dist/cjs/router/web/stackStateUtils.cjs +60 -0
- package/dist/cjs/router/web/stackStateUtils.native.js +66 -0
- package/dist/cjs/router/web/stackStateUtils.native.js.map +1 -0
- package/dist/cjs/screensFeatureFlags.native.js.map +1 -1
- package/dist/cjs/serve-worker.native.js.map +1 -1
- package/dist/cjs/serve.native.js.map +1 -1
- package/dist/cjs/server/ServerContextScript.cjs +2 -1
- package/dist/cjs/server/ServerContextScript.native.js +2 -1
- package/dist/cjs/server/ServerContextScript.native.js.map +1 -1
- package/dist/cjs/server/createRoutesManifest.native.js.map +1 -1
- package/dist/cjs/server/getServerManifest.native.js.map +1 -1
- package/dist/cjs/server/getServerManifest.test.native.js.map +1 -1
- package/dist/cjs/server/oneServe.native.js.map +1 -1
- package/dist/cjs/server/setServerGlobals.native.js.map +1 -1
- package/dist/cjs/server/setupBuildOptions.native.js.map +1 -1
- package/dist/cjs/server/setupServerGlobals.native.js.map +1 -1
- package/dist/cjs/server/ssrLoaderData.native.js.map +1 -1
- package/dist/cjs/server/staticHtmlFetcher.native.js.map +1 -1
- package/dist/cjs/server/workerHandler.native.js.map +1 -1
- package/dist/cjs/server-render.native.js.map +1 -1
- package/dist/cjs/skewProtection.native.js.map +1 -1
- package/dist/cjs/testing-utils.native.js.map +1 -1
- package/dist/cjs/typed-routes/generateRouteTypes.native.js.map +1 -1
- package/dist/cjs/typed-routes/generateRouteTypes.test.native.js.map +1 -1
- package/dist/cjs/typed-routes/getTypedRoutesDeclarationFile.native.js.map +1 -1
- package/dist/cjs/typed-routes/getTypedRoutesDeclarationFile.test.native.js.map +1 -1
- package/dist/cjs/typed-routes/injectRouteHelpers.native.js.map +1 -1
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/ui/Slot.native.js.map +1 -1
- package/dist/cjs/ui/TabContext.native.js.map +1 -1
- package/dist/cjs/ui/TabList.native.js.map +1 -1
- package/dist/cjs/ui/TabRouter.native.js.map +1 -1
- package/dist/cjs/ui/TabSlot.native.js.map +1 -1
- package/dist/cjs/ui/TabTrigger.native.js.map +1 -1
- package/dist/cjs/ui/Tabs.native.js.map +1 -1
- package/dist/cjs/ui/common.native.js.map +1 -1
- package/dist/cjs/ui/index.native.js.map +1 -1
- package/dist/cjs/ui/useComponent.native.js.map +1 -1
- package/dist/cjs/useFocusEffect.native.js.map +1 -1
- package/dist/cjs/useLoader.native.js.map +1 -1
- package/dist/cjs/useMatches.native.js.map +1 -1
- package/dist/cjs/useMatches.test.native.js.map +1 -1
- package/dist/cjs/useServerHeadInsertion.native.js.map +1 -1
- package/dist/cjs/utils/assertIsReady.native.js.map +1 -1
- package/dist/cjs/utils/buildOutputPointer.native.js.map +1 -1
- package/dist/cjs/utils/buildOutputPointer.test.native.js.map +1 -1
- package/dist/cjs/utils/children.native.js.map +1 -1
- package/dist/cjs/utils/cleanUrl.native.js.map +1 -1
- package/dist/cjs/utils/cleanUrl.test.native.js.map +1 -1
- package/dist/cjs/utils/dynamicImport.native.js.map +1 -1
- package/dist/cjs/utils/dynamicImport.test.native.js.map +1 -1
- package/dist/cjs/utils/ensureExists.native.js.map +1 -1
- package/dist/cjs/utils/evictOldest.native.js.map +1 -1
- package/dist/cjs/utils/existsAsync.native.js.map +1 -1
- package/dist/cjs/utils/findRootLayout.native.js.map +1 -1
- package/dist/cjs/utils/getPageExport.native.js.map +1 -1
- package/dist/cjs/utils/getPathnameFromFilePath.native.js.map +1 -1
- package/dist/cjs/utils/getPathnameFromFilePath.test.native.js.map +1 -1
- package/dist/cjs/utils/getRouterRootFromOneOptions.native.js.map +1 -1
- package/dist/cjs/utils/globDir.native.js.map +1 -1
- package/dist/cjs/utils/hashString.native.js.map +1 -1
- package/dist/cjs/utils/htmlEscape.native.js.map +1 -1
- package/dist/cjs/utils/isResponse.native.js.map +1 -1
- package/dist/cjs/utils/isRolldown.native.js.map +1 -1
- package/dist/cjs/utils/isStatus.native.js.map +1 -1
- package/dist/cjs/utils/pLimit.native.js.map +1 -1
- package/dist/cjs/utils/posixPathContract.test.native.js.map +1 -1
- package/dist/cjs/utils/promiseWithResolvers.native.js.map +1 -1
- package/dist/cjs/utils/rand.native.js.map +1 -1
- package/dist/cjs/utils/redirect.native.js.map +1 -1
- package/dist/cjs/utils/removeParams.native.js.map +1 -1
- package/dist/cjs/utils/removeSearch.native.js.map +1 -1
- package/dist/cjs/utils/removeUndefined.native.js.map +1 -1
- package/dist/cjs/utils/routeFileWatch.native.js.map +1 -1
- package/dist/cjs/utils/routeFileWatch.test.native.js.map +1 -1
- package/dist/cjs/utils/style.native.js.map +1 -1
- package/dist/cjs/utils/toAbsolute.native.js.map +1 -1
- package/dist/cjs/utils/toServerOutputPath.native.js.map +1 -1
- package/dist/cjs/utils/toServerOutputPath.test.native.js.map +1 -1
- package/dist/cjs/utils/trackLoaderDependencies.native.js.map +1 -1
- package/dist/cjs/utils/url.native.js.map +1 -1
- package/dist/cjs/utils/useConstant.native.js.map +1 -1
- package/dist/cjs/utils/watchFile.native.js.map +1 -1
- package/dist/cjs/utils/weakKey.native.js.map +1 -1
- package/dist/cjs/utils/weakMemo.native.js.map +1 -1
- package/dist/cjs/utils/withStaticProperties.native.js.map +1 -1
- package/dist/cjs/utils/workerImport.native.js.map +1 -1
- package/dist/cjs/validateParams.native.js.map +1 -1
- package/dist/cjs/validateSearch.native.js.map +1 -1
- package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
- package/dist/cjs/vercel/build/config/vc-build-output-config-base.native.js.map +1 -1
- package/dist/cjs/vercel/build/config/vc-config-base.native.js.map +1 -1
- package/dist/cjs/vercel/build/config/vc-package-base.native.js.map +1 -1
- package/dist/cjs/vercel/build/generate/createApiServerlessFunction.native.js.map +1 -1
- package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.native.js.map +1 -1
- package/dist/cjs/vercel/build/getPathFromRoute.native.js.map +1 -1
- package/dist/cjs/views/EmptyRoute.native.js.map +1 -1
- package/dist/cjs/views/ErrorBoundary.native.js.map +1 -1
- package/dist/cjs/views/LoadProgressBar.native.js.map +1 -1
- package/dist/cjs/views/Navigator.native.js.map +1 -1
- package/dist/cjs/views/OneStackRouter.native.js.map +1 -1
- package/dist/cjs/views/Protected.native.js.map +1 -1
- package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
- package/dist/cjs/views/Screen.native.js.map +1 -1
- package/dist/cjs/views/ScrollBehavior.native.js.map +1 -1
- package/dist/cjs/views/SourceInspector.native.js.map +1 -1
- package/dist/cjs/views/Try.native.js.map +1 -1
- package/dist/cjs/vite/DevHead.native.js.map +1 -1
- package/dist/cjs/vite/constants.native.js.map +1 -1
- package/dist/cjs/vite/customNodeExternals.native.js.map +1 -1
- package/dist/cjs/vite/ensureTsConfig.native.js.map +1 -1
- package/dist/cjs/vite/findDepsToOptimize.native.js.map +1 -1
- package/dist/cjs/vite/getManifest.native.js.map +1 -1
- package/dist/cjs/vite/getManifest.test.native.js.map +1 -1
- package/dist/cjs/vite/loadConfig.native.js.map +1 -1
- package/dist/cjs/vite/makePluginWebOnly.native.js.map +1 -1
- package/dist/cjs/vite/one-server-only.test.native.js.map +1 -1
- package/dist/cjs/vite/one.native.js.map +1 -1
- package/dist/cjs/vite/plugins/SSRCSSPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/clientTreeShakePlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/criticalCSSPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/criticalCSSPlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/devtoolsPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/environmentGuardPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/environmentGuardPlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/fixDependenciesPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/imageDataPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/imageDataPlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/removeReactNativeWebAnimatedPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/useDomPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/virtualEntryConstants.native.js.map +1 -1
- package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
- package/dist/cjs/vite/plugins/warmRoutesPlugin.native.js.map +1 -1
- package/dist/cjs/vite/replaceLoader.native.js.map +1 -1
- package/dist/cjs/vite/resolveResponse.native.js.map +1 -1
- package/dist/cjs/vite/types.native.js.map +1 -1
- package/dist/cjs/vite-auto-warm.native.js.map +1 -1
- package/dist/cjs/vite.native.js.map +1 -1
- package/dist/cjs/zero/getQueryKey.native.js.map +1 -1
- package/dist/cjs/zero/isZeroQuery.native.js.map +1 -1
- package/dist/cjs/zero/resolveQuery.native.js.map +1 -1
- package/dist/cjs/zero/subscribeToQuery.native.js.map +1 -1
- package/dist/cjs/zero/types.native.js.map +1 -1
- package/dist/cjs/zero/useQuery.native.js.map +1 -1
- package/dist/cjs/zero/useQueryZero.native.js.map +1 -1
- package/dist/cjs/zero.native.js.map +1 -1
- package/dist/esm/__mocks__/@react-navigation/native-stack.mjs +2 -1
- package/dist/esm/__mocks__/@react-navigation/native-stack.mjs.map +1 -1
- package/dist/esm/__mocks__/@react-navigation/native-stack.native.js +4 -1
- package/dist/esm/__mocks__/@react-navigation/native-stack.native.js.map +1 -1
- package/dist/esm/constants.test.mjs.map +1 -1
- package/dist/esm/constants.test.native.js.map +1 -1
- package/dist/esm/createHandleRequest.mjs +21 -12
- package/dist/esm/createHandleRequest.mjs.map +1 -1
- package/dist/esm/createHandleRequest.native.js +22 -12
- package/dist/esm/createHandleRequest.native.js.map +1 -1
- package/dist/esm/createHandleRequest.test.mjs +51 -6
- package/dist/esm/createHandleRequest.test.mjs.map +1 -1
- package/dist/esm/createHandleRequest.test.native.js +53 -6
- package/dist/esm/createHandleRequest.test.native.js.map +1 -1
- package/dist/esm/headless.mjs +1 -0
- package/dist/esm/headless.mjs.map +1 -1
- package/dist/esm/headless.native.js +1 -0
- package/dist/esm/headless.native.js.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/layouts/Drawer.mjs +35 -1
- package/dist/esm/layouts/Drawer.mjs.map +1 -1
- package/dist/esm/layouts/Drawer.native.js +36 -1
- package/dist/esm/layouts/Drawer.native.js.map +1 -1
- package/dist/esm/layouts/Stack.mjs +12 -3
- package/dist/esm/layouts/Stack.mjs.map +1 -1
- package/dist/esm/layouts/Stack.native.js +12 -3
- package/dist/esm/layouts/Stack.native.js.map +1 -1
- package/dist/esm/layouts/Tabs.mjs +31 -8
- package/dist/esm/layouts/Tabs.mjs.map +1 -1
- package/dist/esm/layouts/Tabs.native.js +32 -8
- package/dist/esm/layouts/Tabs.native.js.map +1 -1
- package/dist/esm/layouts/stack-navigator.mjs +4 -0
- package/dist/esm/layouts/stack-navigator.mjs.map +1 -0
- package/dist/esm/layouts/stack-navigator.native.js +4 -0
- package/dist/esm/layouts/stack-navigator.native.js.map +1 -0
- package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +1 -1
- package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +1 -1
- package/dist/esm/layouts/stack-utils/index.mjs.map +1 -1
- package/dist/esm/router/renderingRegistry.mjs +26 -0
- package/dist/esm/router/renderingRegistry.mjs.map +1 -0
- package/dist/esm/router/renderingRegistry.native.js +26 -0
- package/dist/esm/router/renderingRegistry.native.js.map +1 -0
- package/dist/esm/router/router.mjs +2 -0
- package/dist/esm/router/router.mjs.map +1 -1
- package/dist/esm/router/router.native.js.map +1 -1
- package/dist/esm/router/web/ScreenRenderContext.mjs +10 -0
- package/dist/esm/router/web/ScreenRenderContext.mjs.map +1 -0
- package/dist/esm/router/web/ScreenRenderContext.native.js +10 -0
- package/dist/esm/router/web/ScreenRenderContext.native.js.map +1 -0
- package/dist/esm/router/web/WebStackNavigator.mjs +49 -0
- package/dist/esm/router/web/WebStackNavigator.mjs.map +1 -0
- package/dist/esm/router/web/WebStackNavigator.native.js +51 -0
- package/dist/esm/router/web/WebStackNavigator.native.js.map +1 -0
- package/dist/esm/router/web/WebStackView.mjs +155 -0
- package/dist/esm/router/web/WebStackView.mjs.map +1 -0
- package/dist/esm/router/web/WebStackView.native.js +206 -0
- package/dist/esm/router/web/WebStackView.native.js.map +1 -0
- package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs +272 -0
- package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs.map +1 -0
- package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js +309 -0
- package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js.map +1 -0
- package/dist/esm/router/web/__tests__/WebStackView.test.mjs +465 -0
- package/dist/esm/router/web/__tests__/WebStackView.test.mjs.map +1 -0
- package/dist/esm/router/web/__tests__/WebStackView.test.native.js +513 -0
- package/dist/esm/router/web/__tests__/WebStackView.test.native.js.map +1 -0
- package/dist/esm/router/web/__tests__/stackStateUtils.test.mjs +135 -0
- package/dist/esm/router/web/__tests__/stackStateUtils.test.mjs.map +1 -0
- package/dist/esm/router/web/__tests__/stackStateUtils.test.native.js +161 -0
- package/dist/esm/router/web/__tests__/stackStateUtils.test.native.js.map +1 -0
- package/dist/esm/router/web/stackStateUtils.mjs +32 -0
- package/dist/esm/router/web/stackStateUtils.mjs.map +1 -0
- package/dist/esm/router/web/stackStateUtils.native.js +35 -0
- package/dist/esm/router/web/stackStateUtils.native.js.map +1 -0
- package/dist/esm/server/ServerContextScript.mjs +2 -1
- package/dist/esm/server/ServerContextScript.mjs.map +1 -1
- package/dist/esm/server/ServerContextScript.native.js +2 -1
- package/dist/esm/server/ServerContextScript.native.js.map +1 -1
- package/dist/esm/utils/dynamicImport.test.mjs.map +1 -1
- package/dist/esm/utils/dynamicImport.test.native.js.map +1 -1
- package/package.json +10 -9
- package/src/__mocks__/@react-navigation/native-stack.ts +22 -0
- package/src/constants.test.ts +12 -8
- package/src/createHandleRequest.test.ts +50 -6
- package/src/createHandleRequest.ts +26 -24
- package/src/headless.tsx +6 -0
- package/src/index.ts +20 -5
- package/src/layouts/Drawer.tsx +43 -1
- package/src/layouts/Stack.tsx +51 -33
- package/src/layouts/Tabs.tsx +89 -57
- package/src/layouts/stack-navigator.ts +9 -0
- package/src/layouts/stack-navigator.web.ts +3 -0
- package/src/layouts/stack-utils/StackScreen.tsx +30 -9
- package/src/layouts/stack-utils/index.tsx +1 -0
- package/src/router/renderingRegistry.ts +109 -0
- package/src/router/router.ts +33 -9
- package/src/router/web/ScreenRenderContext.tsx +61 -0
- package/src/router/web/WebStackNavigator.tsx +87 -0
- package/src/router/web/WebStackView.tsx +264 -0
- package/src/router/web/__tests__/WebStackView.runtime.test.tsx +309 -0
- package/src/router/web/__tests__/WebStackView.test.tsx +444 -0
- package/src/router/web/__tests__/stackStateUtils.test.ts +153 -0
- package/src/router/web/stackStateUtils.ts +89 -0
- package/src/server/ServerContextScript.tsx +8 -7
- package/src/utils/dynamicImport.test.ts +9 -7
- package/types/__mocks__/@react-navigation/native-stack.d.ts +9 -0
- package/types/__mocks__/@react-navigation/native-stack.d.ts.map +1 -1
- package/types/createHandleRequest.d.ts.map +1 -1
- package/types/headless.d.ts.map +1 -1
- package/types/index.d.ts +4 -2
- package/types/index.d.ts.map +1 -1
- package/types/layouts/Drawer.d.ts +13 -2
- package/types/layouts/Drawer.d.ts.map +1 -1
- package/types/layouts/Stack.d.ts +11 -1
- package/types/layouts/Stack.d.ts.map +1 -1
- package/types/layouts/Tabs.d.ts +14 -4
- package/types/layouts/Tabs.d.ts.map +1 -1
- package/types/layouts/stack-navigator.d.ts +9 -0
- package/types/layouts/stack-navigator.d.ts.map +1 -0
- package/types/layouts/stack-navigator.web.d.ts +2 -0
- package/types/layouts/stack-navigator.web.d.ts.map +1 -0
- package/types/layouts/stack-utils/StackScreen.d.ts +24 -2
- package/types/layouts/stack-utils/StackScreen.d.ts.map +1 -1
- package/types/layouts/stack-utils/index.d.ts +1 -1
- package/types/layouts/stack-utils/index.d.ts.map +1 -1
- package/types/router/renderingRegistry.d.ts +90 -0
- package/types/router/renderingRegistry.d.ts.map +1 -0
- package/types/router/router.d.ts.map +1 -1
- package/types/router/web/ScreenRenderContext.d.ts +46 -0
- package/types/router/web/ScreenRenderContext.d.ts.map +1 -0
- package/types/router/web/WebStackNavigator.d.ts +2 -0
- package/types/router/web/WebStackNavigator.d.ts.map +1 -0
- package/types/router/web/WebStackView.d.ts +42 -0
- package/types/router/web/WebStackView.d.ts.map +1 -0
- package/types/router/web/stackStateUtils.d.ts +35 -0
- package/types/router/web/stackStateUtils.d.ts.map +1 -0
- package/types/server/ServerContextScript.d.ts.map +1 -1
package/src/headless.tsx
CHANGED
|
@@ -21,6 +21,12 @@ export type CreateHeadlessAppProps = {
|
|
|
21
21
|
export function createApp(options: CreateHeadlessAppProps) {
|
|
22
22
|
// always spa mode — render() checks this to use createRoot instead of hydrateRoot
|
|
23
23
|
globalThis['__vxrnIsSPA'] = true
|
|
24
|
+
// headless mode has no dev server serving /_one/assets/*_vxrn_loader.js;
|
|
25
|
+
// routes (and their loader exports) are statically bundled and accessed
|
|
26
|
+
// through `options.routes`. doPreloadDev/doPreload short-circuit on this
|
|
27
|
+
// flag so they don't round-trip through an iframe-host URL that can return
|
|
28
|
+
// a spurious __oneError 404 for paths overlapping the host's route tree.
|
|
29
|
+
globalThis['__vxrnHeadless'] = true
|
|
24
30
|
|
|
25
31
|
const setupComplete = options.getSetupPromise
|
|
26
32
|
? options.getSetupPromise()
|
package/src/index.ts
CHANGED
|
@@ -94,7 +94,26 @@ export type {
|
|
|
94
94
|
StackHeaderRightProps,
|
|
95
95
|
StackHeaderSearchBarProps,
|
|
96
96
|
StackScreenProps,
|
|
97
|
+
StackScreenOptions,
|
|
97
98
|
} from './layouts/stack-utils'
|
|
99
|
+
// Stack render API (for custom web overlay rendering)
|
|
100
|
+
export type {
|
|
101
|
+
StackRender,
|
|
102
|
+
StackRenderProps,
|
|
103
|
+
StackRenderComponent,
|
|
104
|
+
} from './router/web/ScreenRenderContext'
|
|
105
|
+
// Tabs / Drawer render API + global setup
|
|
106
|
+
export {
|
|
107
|
+
setupRendering,
|
|
108
|
+
getRenderingConfig,
|
|
109
|
+
type RenderingConfig,
|
|
110
|
+
type TabsRender,
|
|
111
|
+
type TabsRenderProps,
|
|
112
|
+
type TabsRenderComponent,
|
|
113
|
+
type DrawerRender,
|
|
114
|
+
type DrawerRenderProps,
|
|
115
|
+
type DrawerRenderComponent,
|
|
116
|
+
} from './router/renderingRegistry'
|
|
98
117
|
// utilities
|
|
99
118
|
export { withLayoutContext } from './layouts/withLayoutContext'
|
|
100
119
|
export { Link } from './link/Link'
|
|
@@ -162,11 +181,7 @@ export { watchFile } from './utils/watchFile'
|
|
|
162
181
|
// resilient dynamic-import recovery: retry a transient chunk-fetch failure in
|
|
163
182
|
// place (so it never poisons a React.lazy memo), then fall back to one's
|
|
164
183
|
// debounced reload. lazyWithRetry is a drop-in for React.lazy.
|
|
165
|
-
export {
|
|
166
|
-
loadWithRetry,
|
|
167
|
-
isChunkLoadError,
|
|
168
|
-
handleSkewError,
|
|
169
|
-
} from './utils/dynamicImport'
|
|
184
|
+
export { loadWithRetry, isChunkLoadError, handleSkewError } from './utils/dynamicImport'
|
|
170
185
|
export { lazyWithRetry } from './lazyWithRetry'
|
|
171
186
|
export { ErrorBoundary } from './views/ErrorBoundary'
|
|
172
187
|
export type { ErrorBoundaryProps, ErrorRouteInfo } from './views/Try'
|
package/src/layouts/Drawer.tsx
CHANGED
|
@@ -4,16 +4,58 @@ import {
|
|
|
4
4
|
type DrawerNavigationOptions,
|
|
5
5
|
} from '@react-navigation/drawer'
|
|
6
6
|
import type { DrawerNavigationState, ParamListBase } from '@react-navigation/native'
|
|
7
|
+
import React, { useMemo, type ComponentProps } from 'react'
|
|
8
|
+
import { Platform } from 'react-native'
|
|
7
9
|
|
|
10
|
+
import { getRenderingConfig, type DrawerRender } from '../router/renderingRegistry'
|
|
8
11
|
import { withLayoutContext } from './withLayoutContext'
|
|
9
12
|
|
|
10
13
|
const DrawerNavigator = createDrawerNavigator().Navigator
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
const RNDrawer = withLayoutContext<
|
|
13
16
|
DrawerNavigationOptions,
|
|
14
17
|
typeof DrawerNavigator,
|
|
15
18
|
DrawerNavigationState<ParamListBase>,
|
|
16
19
|
DrawerNavigationEventMap
|
|
17
20
|
>(DrawerNavigator)
|
|
18
21
|
|
|
22
|
+
type DrawerExtraProps = {
|
|
23
|
+
/**
|
|
24
|
+
* Platform-keyed sidebar component. Replaces the default drawer content.
|
|
25
|
+
* Dispatches on `Platform.OS` - `render.ios` works on iOS, `render.web`
|
|
26
|
+
* on web, etc. Falls back to `setupRendering({ Drawer: { ... } })` global
|
|
27
|
+
* if no prop is set, then to the built-in drawer content.
|
|
28
|
+
*/
|
|
29
|
+
render?: DrawerRender
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const DrawerWithRender = React.forwardRef<
|
|
33
|
+
unknown,
|
|
34
|
+
ComponentProps<typeof RNDrawer> & DrawerExtraProps
|
|
35
|
+
>((props, ref) => {
|
|
36
|
+
const { render, drawerContent, ...rest } = props as any
|
|
37
|
+
|
|
38
|
+
// Resolution: prop drawerContent > prop render[platform] > setupRendering[platform] > default
|
|
39
|
+
const effectiveDrawerContent = useMemo(() => {
|
|
40
|
+
if (drawerContent) return drawerContent
|
|
41
|
+
const platform = Platform.OS as 'web' | 'ios' | 'android'
|
|
42
|
+
const fromProp = render?.[platform]
|
|
43
|
+
if (fromProp) return fromProp
|
|
44
|
+
const fromGlobal = getRenderingConfig().Drawer?.[platform]
|
|
45
|
+
if (fromGlobal) return fromGlobal
|
|
46
|
+
return undefined
|
|
47
|
+
}, [drawerContent, render])
|
|
48
|
+
|
|
49
|
+
if (effectiveDrawerContent) {
|
|
50
|
+
return <RNDrawer {...rest} ref={ref} drawerContent={effectiveDrawerContent} />
|
|
51
|
+
}
|
|
52
|
+
return <RNDrawer {...rest} ref={ref} />
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// Preserve withLayoutContext's static Screen so user code like
|
|
56
|
+
// `<Drawer.Screen ... />` keeps working through the render wrapper.
|
|
57
|
+
export const Drawer = Object.assign(DrawerWithRender, {
|
|
58
|
+
Screen: RNDrawer.Screen,
|
|
59
|
+
})
|
|
60
|
+
|
|
19
61
|
export default Drawer
|
package/src/layouts/Stack.tsx
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ParamListBase, StackNavigationState } from '@react-navigation/native'
|
|
2
2
|
import {
|
|
3
|
-
createNativeStackNavigator,
|
|
4
3
|
type NativeStackNavigationEventMap,
|
|
5
4
|
type NativeStackNavigationOptions,
|
|
6
5
|
} from '@react-navigation/native-stack'
|
|
@@ -18,8 +17,11 @@ import { withLayoutContext } from './withLayoutContext'
|
|
|
18
17
|
import { isChildOfType } from '../utils/children'
|
|
19
18
|
import { Protected } from '../views/Protected'
|
|
20
19
|
import { Screen } from '../views/Screen'
|
|
20
|
+
import { createStackNavigator } from './stack-navigator'
|
|
21
|
+
import { StackRenderProvider, type StackRender } from '../router/web/ScreenRenderContext'
|
|
22
|
+
import { getRenderingConfig } from '../router/renderingRegistry'
|
|
21
23
|
|
|
22
|
-
const NativeStackNavigator =
|
|
24
|
+
const NativeStackNavigator = createStackNavigator().Navigator
|
|
23
25
|
|
|
24
26
|
const RNStack = withLayoutContext<
|
|
25
27
|
NativeStackNavigationOptions,
|
|
@@ -62,47 +64,63 @@ function mapChildren(children: React.ReactNode): React.ReactNode {
|
|
|
62
64
|
.filter(Boolean)
|
|
63
65
|
}
|
|
64
66
|
|
|
67
|
+
type StackExtraProps = {
|
|
68
|
+
/**
|
|
69
|
+
* Platform-keyed render component for overlay routes (modal / formSheet /
|
|
70
|
+
* pageSheet / transparentModal / fullScreenModal). v1 consumes `web` only;
|
|
71
|
+
* `ios` / `android` are reserved for future use. Per-route overrides go on
|
|
72
|
+
* `<Stack.Screen options={{ render }} />`.
|
|
73
|
+
*/
|
|
74
|
+
render?: StackRender
|
|
75
|
+
}
|
|
76
|
+
|
|
65
77
|
/**
|
|
66
78
|
* Stack navigator with support for Header Composition API.
|
|
67
79
|
* Wraps the base Stack to pre-process StackScreen children.
|
|
68
80
|
*/
|
|
69
|
-
const StackWithComposition = React.forwardRef<
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
const StackWithComposition = React.forwardRef<
|
|
82
|
+
unknown,
|
|
83
|
+
ComponentProps<typeof RNStack> & StackExtraProps
|
|
84
|
+
>((props, ref) => {
|
|
85
|
+
const { children, screenOptions, render, ...rest } = props
|
|
86
|
+
|
|
87
|
+
// extract Stack.Header from children for screenOptions
|
|
88
|
+
const screenOptionsWithHeader = useMemo(() => {
|
|
89
|
+
const stackHeader = Children.toArray(children).find((child) =>
|
|
90
|
+
isChildOfType(child, StackHeaderComponent)
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
if (stackHeader && isChildOfType(stackHeader, StackHeaderComponent)) {
|
|
94
|
+
const headerProps: StackScreenProps = { children: stackHeader }
|
|
95
|
+
if (screenOptions) {
|
|
96
|
+
if (typeof screenOptions === 'function') {
|
|
97
|
+
return (...args: Parameters<typeof screenOptions>) => {
|
|
98
|
+
const opts = screenOptions(...args)
|
|
99
|
+
return appendScreenStackPropsToOptions(opts, headerProps)
|
|
87
100
|
}
|
|
88
|
-
return appendScreenStackPropsToOptions(screenOptions, headerProps)
|
|
89
101
|
}
|
|
90
|
-
return appendScreenStackPropsToOptions(
|
|
102
|
+
return appendScreenStackPropsToOptions(screenOptions, headerProps)
|
|
91
103
|
}
|
|
104
|
+
return appendScreenStackPropsToOptions({}, headerProps)
|
|
105
|
+
}
|
|
92
106
|
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
return screenOptions
|
|
108
|
+
}, [children, screenOptions])
|
|
95
109
|
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
// pre-process children to convert StackScreen to Screen
|
|
111
|
+
const processedChildren = useMemo(() => mapChildren(children), [children])
|
|
98
112
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
113
|
+
const navigator = (
|
|
114
|
+
<RNStack {...rest} ref={ref} screenOptions={screenOptionsWithHeader}>
|
|
115
|
+
{processedChildren}
|
|
116
|
+
</RNStack>
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
// Per-instance prop wins; otherwise fall back to setupRendering global.
|
|
120
|
+
const effectiveRender = render ?? getRenderingConfig().Stack
|
|
121
|
+
if (!effectiveRender) return navigator
|
|
122
|
+
return <StackRenderProvider value={effectiveRender}>{navigator}</StackRenderProvider>
|
|
123
|
+
})
|
|
106
124
|
|
|
107
125
|
export const Stack = Object.assign(StackWithComposition, {
|
|
108
126
|
Screen: StackScreen,
|
package/src/layouts/Tabs.tsx
CHANGED
|
@@ -6,20 +6,21 @@ import {
|
|
|
6
6
|
createBottomTabNavigator,
|
|
7
7
|
} from '@react-navigation/bottom-tabs'
|
|
8
8
|
import type { ParamListBase, TabNavigationState } from '@react-navigation/native'
|
|
9
|
+
import React, { useMemo, type ComponentProps } from 'react'
|
|
9
10
|
import { Platform, Pressable } from 'react-native'
|
|
10
11
|
|
|
11
12
|
import type { OneRouter } from '../interfaces/router'
|
|
12
13
|
import { Link } from '../link/Link'
|
|
13
14
|
import { Protected } from '../views/Protected'
|
|
15
|
+
import { getRenderingConfig, type TabsRender } from '../router/renderingRegistry'
|
|
14
16
|
import { withLayoutContext } from './withLayoutContext'
|
|
15
17
|
|
|
16
|
-
const
|
|
18
|
+
const DefaultTabBar = ({ state, ...restProps }: BottomTabBarProps) => {
|
|
17
19
|
/**
|
|
18
|
-
* With React Navigation v7,
|
|
20
|
+
* With React Navigation v7, special routes such as +not-found and _sitemap
|
|
21
|
+
* are being added to `state.routes`, but we don't want them to be shown in
|
|
22
|
+
* the tab bar.
|
|
19
23
|
*/
|
|
20
|
-
|
|
21
|
-
// TODO due to adding onlyMatching, we can remove this now i think (need to make sure)
|
|
22
|
-
|
|
23
24
|
const filteredRoutes = state.routes.filter(
|
|
24
25
|
(r) => r.name !== '+not-found' && !r.name.startsWith('_sitemap')
|
|
25
26
|
)
|
|
@@ -35,63 +36,94 @@ const TabBar = ({ state, ...restProps }: BottomTabBarProps) => {
|
|
|
35
36
|
)
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
// This is the only way to access the navigator.
|
|
39
39
|
const BottomTabNavigator = createBottomTabNavigator().Navigator
|
|
40
40
|
|
|
41
41
|
type BottomTabNavigationOptionsWithHref = BottomTabNavigationOptions & {
|
|
42
42
|
href?: OneRouter.Href | null
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
45
|
+
const RNTabs = withLayoutContext<
|
|
46
|
+
BottomTabNavigationOptionsWithHref,
|
|
47
|
+
typeof BottomTabNavigator,
|
|
48
|
+
TabNavigationState<ParamListBase>,
|
|
49
|
+
BottomTabNavigationEventMap
|
|
50
|
+
>(BottomTabNavigator, (screens) => {
|
|
51
|
+
// Support the `href` shortcut prop.
|
|
52
|
+
return screens.map((screen) => {
|
|
53
|
+
if (typeof screen.options !== 'function' && screen.options?.href !== undefined) {
|
|
54
|
+
const { href, ...options } = screen.options
|
|
55
|
+
if (options.tabBarButton) {
|
|
56
|
+
throw new Error('Cannot use `href` and `tabBarButton` together.')
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
...screen,
|
|
60
|
+
options: {
|
|
61
|
+
...options,
|
|
62
|
+
tabBarButton: (props) => {
|
|
63
|
+
if (href == null) {
|
|
64
|
+
return null
|
|
65
|
+
}
|
|
66
|
+
const children =
|
|
67
|
+
Platform.OS === 'web' ? (
|
|
68
|
+
props.children
|
|
69
|
+
) : (
|
|
70
|
+
<Pressable>{props.children}</Pressable>
|
|
71
|
+
)
|
|
72
|
+
return (
|
|
73
|
+
<Link
|
|
74
|
+
{...(props as any)}
|
|
75
|
+
style={[{ display: 'flex' }, props.style]}
|
|
76
|
+
href={href}
|
|
77
|
+
asChild={Platform.OS !== 'web'}
|
|
78
|
+
// biome-ignore lint/correctness/noChildrenProp: children prop needed for asChild pattern
|
|
79
|
+
children={children}
|
|
80
|
+
/>
|
|
81
|
+
)
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return screen
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
type TabsExtraProps = {
|
|
91
|
+
/**
|
|
92
|
+
* Platform-keyed tab bar component. Replaces the default bottom-tabs bar.
|
|
93
|
+
* v1 consumes `web` only; `ios` / `android` accepted for future use.
|
|
94
|
+
* Falls back to `setupRendering({ Tabs: { web } })` global registry if
|
|
95
|
+
* no prop is set, then to the built-in `BottomTabBar`.
|
|
96
|
+
*/
|
|
97
|
+
render?: TabsRender
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const TabsWithRender = React.forwardRef<
|
|
101
|
+
unknown,
|
|
102
|
+
ComponentProps<typeof RNTabs> & TabsExtraProps
|
|
103
|
+
>((props, ref) => {
|
|
104
|
+
const { render, tabBar, ...rest } = props as any
|
|
105
|
+
|
|
106
|
+
// Resolution: prop tabBar > prop render[platform] > setupRendering[platform] > default.
|
|
107
|
+
// Tabs runs on web AND native so we dispatch on Platform.OS - unlike Stack,
|
|
108
|
+
// where the web navigator only consumes the `web` slot.
|
|
109
|
+
const effectiveTabBar = useMemo(() => {
|
|
110
|
+
if (tabBar) return tabBar
|
|
111
|
+
const platform = Platform.OS as 'web' | 'ios' | 'android'
|
|
112
|
+
const fromProp = render?.[platform]
|
|
113
|
+
if (fromProp) return fromProp
|
|
114
|
+
const fromGlobal = getRenderingConfig().Tabs?.[platform]
|
|
115
|
+
if (fromGlobal) return fromGlobal
|
|
116
|
+
return DefaultTabBar
|
|
117
|
+
}, [tabBar, render])
|
|
118
|
+
|
|
119
|
+
return <RNTabs {...rest} ref={ref} tabBar={effectiveTabBar} />
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
export const Tabs = Object.assign(TabsWithRender, {
|
|
123
|
+
Protected,
|
|
124
|
+
// Preserve withLayoutContext's static Screen so user code like
|
|
125
|
+
// `<Tabs.Screen ... />` keeps working through the render wrapper.
|
|
126
|
+
Screen: RNTabs.Screen,
|
|
127
|
+
})
|
|
96
128
|
|
|
97
129
|
export default Tabs
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns a Stack navigator factory. On native this is the stock
|
|
5
|
+
* `@react-navigation/native-stack`; on web this is replaced via the
|
|
6
|
+
* `.web.ts` sibling with a custom navigator that supports the `render`
|
|
7
|
+
* prop for overlay presentations.
|
|
8
|
+
*/
|
|
9
|
+
export const createStackNavigator = createNativeStackNavigator
|
|
@@ -9,10 +9,34 @@ import {
|
|
|
9
9
|
type StackHeaderProps,
|
|
10
10
|
} from './StackHeaderComponent'
|
|
11
11
|
import { Screen } from '../../views/Screen'
|
|
12
|
+
import type { StackRender } from '../../router/web/ScreenRenderContext'
|
|
13
|
+
|
|
14
|
+
export type StackScreenOptions = NativeStackNavigationOptions & {
|
|
15
|
+
/**
|
|
16
|
+
* Per-route override of the Stack-level `render` prop. Same platform-keyed
|
|
17
|
+
* shape (`{ web?, ios?, android? }`); v1 consumes `web` only. When set, it
|
|
18
|
+
* takes precedence over the Stack-level render for this route.
|
|
19
|
+
*/
|
|
20
|
+
render?: StackRender
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Web-only. When `true`, the route's React subtree stays mounted across
|
|
24
|
+
* dismissal and re-navigation - `useState`, `useId`, `useReducer`, refs,
|
|
25
|
+
* and anything stored in the route component all survive. The render
|
|
26
|
+
* component receives `open: false` while the route is "closed".
|
|
27
|
+
*
|
|
28
|
+
* Caveat: route params are captured at first mount. If the same route is
|
|
29
|
+
* navigated to with different params later, the captured subtree keeps
|
|
30
|
+
* the original params. Best for stable, parameter-free overlays
|
|
31
|
+
* (settings, persistent filters, command palettes). For routes with
|
|
32
|
+
* dynamic params, leave `keepMounted` off.
|
|
33
|
+
*/
|
|
34
|
+
keepMounted?: boolean
|
|
35
|
+
}
|
|
12
36
|
|
|
13
37
|
export interface StackScreenProps extends PropsWithChildren {
|
|
14
38
|
name?: string
|
|
15
|
-
options?:
|
|
39
|
+
options?: StackScreenOptions
|
|
16
40
|
}
|
|
17
41
|
|
|
18
42
|
/**
|
|
@@ -36,7 +60,7 @@ export function StackScreen({ children, options, ...rest }: StackScreenProps) {
|
|
|
36
60
|
}),
|
|
37
61
|
[options, children]
|
|
38
62
|
)
|
|
39
|
-
return <Screen {...rest} options={updatedOptions} />
|
|
63
|
+
return <Screen {...rest} options={updatedOptions as NativeStackNavigationOptions} />
|
|
40
64
|
}
|
|
41
65
|
|
|
42
66
|
const VALID_PRESENTATIONS = [
|
|
@@ -85,17 +109,14 @@ export function validateStackPresentation(
|
|
|
85
109
|
}
|
|
86
110
|
|
|
87
111
|
export function appendScreenStackPropsToOptions(
|
|
88
|
-
options:
|
|
112
|
+
options: StackScreenOptions,
|
|
89
113
|
props: StackScreenProps
|
|
90
|
-
):
|
|
91
|
-
let updatedOptions = { ...options, ...props.options }
|
|
114
|
+
): StackScreenOptions {
|
|
115
|
+
let updatedOptions: StackScreenOptions = { ...options, ...props.options }
|
|
92
116
|
|
|
93
117
|
validateStackPresentation(updatedOptions)
|
|
94
118
|
|
|
95
|
-
function appendChildOptions(
|
|
96
|
-
child: React.ReactElement,
|
|
97
|
-
options: NativeStackNavigationOptions
|
|
98
|
-
) {
|
|
119
|
+
function appendChildOptions(child: React.ReactElement, options: StackScreenOptions) {
|
|
99
120
|
if (child.type === StackHeaderComponent) {
|
|
100
121
|
return appendStackHeaderPropsToOptions(options, child.props as StackHeaderProps)
|
|
101
122
|
} else {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { ComponentType } from 'react'
|
|
2
|
+
|
|
3
|
+
import type { StackRender, StackRenderProps } from './web/ScreenRenderContext'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Tab bar render component receives bottom-tabs' standard tabBar props plus
|
|
7
|
+
* the children prop is omitted (tab bar replaces only the bar UI, not the
|
|
8
|
+
* screens). The actual prop type from `@react-navigation/bottom-tabs` is
|
|
9
|
+
* `BottomTabBarProps`; we re-export a structural-compatible type so the
|
|
10
|
+
* registry can be typed without a hard dep on bottom-tabs.
|
|
11
|
+
*/
|
|
12
|
+
export type TabsRenderProps = {
|
|
13
|
+
state: any
|
|
14
|
+
navigation: any
|
|
15
|
+
descriptors: any
|
|
16
|
+
insets: { top: number; right: number; bottom: number; left: number }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type TabsRenderComponent = ComponentType<TabsRenderProps>
|
|
20
|
+
|
|
21
|
+
export type TabsRender = {
|
|
22
|
+
web?: TabsRenderComponent
|
|
23
|
+
ios?: TabsRenderComponent
|
|
24
|
+
android?: TabsRenderComponent
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Drawer sidebar render component. Receives the standard
|
|
29
|
+
* `DrawerContentComponentProps` from `@react-navigation/drawer`. Replaces
|
|
30
|
+
* the drawer's sidebar content (the list of items / nav UI) but not the
|
|
31
|
+
* drawer chrome itself (overlay, gestures, animation).
|
|
32
|
+
*/
|
|
33
|
+
export type DrawerRenderProps = {
|
|
34
|
+
state: any
|
|
35
|
+
navigation: any
|
|
36
|
+
descriptors: any
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type DrawerRenderComponent = ComponentType<DrawerRenderProps>
|
|
40
|
+
|
|
41
|
+
export type DrawerRender = {
|
|
42
|
+
web?: DrawerRenderComponent
|
|
43
|
+
ios?: DrawerRenderComponent
|
|
44
|
+
android?: DrawerRenderComponent
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Global render configuration. Populated by `setupRendering()`, typically
|
|
49
|
+
* called from One's setup file. Each navigator (Stack, Tabs) reads from
|
|
50
|
+
* this registry as a fallback when no per-instance `render` prop is set.
|
|
51
|
+
*
|
|
52
|
+
* Per-instance render prop > per-route options.render > setupRendering global.
|
|
53
|
+
*/
|
|
54
|
+
export type RenderingConfig = {
|
|
55
|
+
Stack?: StackRender
|
|
56
|
+
Tabs?: TabsRender
|
|
57
|
+
Drawer?: DrawerRender
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let renderingConfig: RenderingConfig = {}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Register default render components for One's navigators. Call from your
|
|
64
|
+
* setup file before the app renders. Settings are global - every `<Stack>`
|
|
65
|
+
* and `<Tabs>` instance picks them up unless overridden via prop or
|
|
66
|
+
* per-route options.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* // app/setup.ts
|
|
71
|
+
* import { setupRendering } from 'one'
|
|
72
|
+
* import { Sheet } from 'tamagui'
|
|
73
|
+
*
|
|
74
|
+
* setupRendering({
|
|
75
|
+
* Stack: {
|
|
76
|
+
* web: ({ children, open, dismiss, sheetAllowedDetents }) => (
|
|
77
|
+
* <Sheet modal open={open} onOpenChange={(o) => !o && dismiss()}
|
|
78
|
+
* snapPoints={sheetAllowedDetents}>
|
|
79
|
+
* <Sheet.Overlay />
|
|
80
|
+
* <Sheet.Frame>{children}</Sheet.Frame>
|
|
81
|
+
* </Sheet>
|
|
82
|
+
* ),
|
|
83
|
+
* },
|
|
84
|
+
* Tabs: { web: MyCustomTabBar },
|
|
85
|
+
* })
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function setupRendering(config: RenderingConfig): void {
|
|
89
|
+
renderingConfig = {
|
|
90
|
+
...renderingConfig,
|
|
91
|
+
Stack: { ...renderingConfig.Stack, ...config.Stack },
|
|
92
|
+
Tabs: { ...renderingConfig.Tabs, ...config.Tabs },
|
|
93
|
+
Drawer: { ...renderingConfig.Drawer, ...config.Drawer },
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function getRenderingConfig(): RenderingConfig {
|
|
98
|
+
return renderingConfig
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* For tests - clears the global registry.
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
105
|
+
export function resetRenderingConfig(): void {
|
|
106
|
+
renderingConfig = {}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export type { StackRender, StackRenderProps }
|
package/src/router/router.ts
CHANGED
|
@@ -728,6 +728,17 @@ async function doPreloadDev(href: string): Promise<any> {
|
|
|
728
728
|
const startTime = performance.now()
|
|
729
729
|
const normalizedPath = normalizeLoaderPath(href)
|
|
730
730
|
|
|
731
|
+
// one/headless ships with routes statically bundled (createApp's `routes`
|
|
732
|
+
// option). there's no dev server to fetch /_one/assets/*_vxrn_loader.js
|
|
733
|
+
// from — when the iframe is same-origin with a real one app, that fetch
|
|
734
|
+
// resolves against the host's routes and can spuriously return an
|
|
735
|
+
// __oneError 404 marker for paths the host considers a 404 (e.g. /docs/*
|
|
736
|
+
// when the host has its own /docs route without that slug). bail before
|
|
737
|
+
// the fetch so linkTo doesn't misread the host's response as our 404.
|
|
738
|
+
if (globalThis['__vxrnHeadless']) {
|
|
739
|
+
return null
|
|
740
|
+
}
|
|
741
|
+
|
|
731
742
|
try {
|
|
732
743
|
const loaderJSUrl = getLoaderPath(href, true)
|
|
733
744
|
|
|
@@ -786,6 +797,11 @@ async function doPreloadDev(href: string): Promise<any> {
|
|
|
786
797
|
}
|
|
787
798
|
|
|
788
799
|
async function doPreload(href: string) {
|
|
800
|
+
// see doPreloadDev — same rationale.
|
|
801
|
+
if (globalThis['__vxrnHeadless']) {
|
|
802
|
+
return null
|
|
803
|
+
}
|
|
804
|
+
|
|
789
805
|
const preloadPath = getPreloadPath(href)
|
|
790
806
|
const loaderPath = getLoaderPath(href)
|
|
791
807
|
const cssPreloadPath = getPreloadCSSPath(href)
|
|
@@ -931,20 +947,28 @@ export function preloadRoute(href: string, injectCSS = false): Promise<any> | un
|
|
|
931
947
|
// normalize the path to match what useLoader uses for cache keys
|
|
932
948
|
const normalizedHref = normalizeLoaderPath(href)
|
|
933
949
|
if (!preloadingLoader[normalizedHref]) {
|
|
934
|
-
setBoundedPreloadRecord(
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
950
|
+
setBoundedPreloadRecord(
|
|
951
|
+
preloadingLoader,
|
|
952
|
+
normalizedHref,
|
|
953
|
+
doPreloadDev(href).then((data) => {
|
|
954
|
+
setBoundedPreloadRecord(preloadedLoaderData, normalizedHref, data)
|
|
955
|
+
return data
|
|
956
|
+
})
|
|
957
|
+
)
|
|
938
958
|
}
|
|
939
959
|
return preloadingLoader[normalizedHref]
|
|
940
960
|
}
|
|
941
961
|
|
|
942
962
|
if (!preloadingLoader[href]) {
|
|
943
|
-
setBoundedPreloadRecord(
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
963
|
+
setBoundedPreloadRecord(
|
|
964
|
+
preloadingLoader,
|
|
965
|
+
href,
|
|
966
|
+
doPreload(href).then((data) => {
|
|
967
|
+
// Store the resolved data for synchronous access
|
|
968
|
+
setBoundedPreloadRecord(preloadedLoaderData, href, data)
|
|
969
|
+
return data
|
|
970
|
+
})
|
|
971
|
+
)
|
|
948
972
|
}
|
|
949
973
|
|
|
950
974
|
if (injectCSS) {
|