one 1.27.0 → 1.27.1
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.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/__tests__/polyfills-mobile.test.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/prebuild.test.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/serverRouteModules.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/createDevHandleRequest.native.js.map +1 -1
- package/dist/cjs/createHandleRequest.native.js.map +1 -1
- 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/__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/useLinking.native.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/getURL.native.test.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/Presentations.native.js.map +1 -1
- package/dist/cjs/headless/__tests__/useStack.test.native.js.map +1 -1
- package/dist/cjs/headless/children.native.js.map +1 -1
- package/dist/cjs/headless/keepMounted.native.js.map +1 -1
- package/dist/cjs/headless/types.native.js.map +1 -1
- package/dist/cjs/headless/useDrawer.native.js.map +1 -1
- package/dist/cjs/headless/useStack.native.js.map +1 -1
- package/dist/cjs/headless/useTabs.native.js.map +1 -1
- package/dist/cjs/headless-server.native.js.map +1 -1
- 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.native.js +1 -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.native.js.map +1 -1
- package/dist/cjs/layouts/NativeTabs.native.js.map +1 -1
- package/dist/cjs/layouts/NativeTabs.test.native.js.map +1 -1
- package/dist/cjs/layouts/Stack.native.js +1 -1
- package/dist/cjs/layouts/Stack.native.js.map +1 -1
- package/dist/cjs/layouts/Tabs.native.js.map +1 -1
- package/dist/cjs/layouts/stack-navigator.native.js.map +1 -1
- 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/StackToolbar.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackToolbar.shared.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackToolbar.types.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackToolbarImplementation.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/__tests__/StackToolbar.test.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/layouts/withLayoutContext.test.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/Redirect.test.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/buildOneMetroResolverOverrides.test.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/native-transforms.native.js.map +1 -1
- package/dist/cjs/notFoundState.native.js.map +1 -1
- package/dist/cjs/package-exports.test.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/conditionalSlotPathname.test.native.js.map +1 -1
- package/dist/cjs/router/createRoute.native.js.map +1 -1
- package/dist/cjs/router/diagnoseRouteLoadFailure.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/getRouteArtifactPath.native.js.map +1 -1
- package/dist/cjs/router/getRouteArtifactPath.test.native.js.map +1 -1
- package/dist/cjs/router/getRouteInfo.native.js.map +1 -1
- package/dist/cjs/router/getRouteInfo.test.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/hmrImport.native.test.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/isStateAwaitingNavigatorMount.native.js.map +1 -1
- package/dist/cjs/router/lastAction.native.js.map +1 -1
- package/dist/cjs/router/linkToOrphaned.test.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/path.native.js.map +1 -1
- package/dist/cjs/router/path.test.native.js.map +1 -1
- package/dist/cjs/router/protectedRoutes.test.native.js.map +1 -1
- package/dist/cjs/router/routeHmr.native.test.native.js.map +1 -1
- package/dist/cjs/router/router.cjs +5 -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/useInitializeOneRouter.preview-lifecycle.test.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/useScreens.test.native.js.map +1 -1
- package/dist/cjs/router/useViteRoutes.native.js.map +1 -1
- package/dist/cjs/router/useViteRoutes.test.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/WebStackNavigator.native.js.map +1 -1
- package/dist/cjs/router/web/WebStackView.native.js.map +1 -1
- package/dist/cjs/router/web/__tests__/stackStateUtils.test.native.js.map +1 -1
- package/dist/cjs/router/web/stackStateUtils.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.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/routeExportsFromEntry.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/workerHandler.test.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/stack-toolbar-implementation.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/Tabs.shared.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/ui/useTabTrigger.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/platform.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/routeIndex.native.js.map +1 -1
- package/dist/cjs/utils/routeIndex.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.cjs +22 -1
- package/dist/cjs/utils/url.native.js +22 -1
- package/dist/cjs/utils/url.native.js.map +1 -1
- package/dist/cjs/utils/url.test.cjs +59 -0
- package/dist/cjs/utils/url.test.native.js +62 -0
- package/dist/cjs/utils/url.test.native.js.map +1 -0
- 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/PreloadLinks.cjs +20 -10
- package/dist/cjs/views/PreloadLinks.test.cjs +73 -0
- package/dist/cjs/views/PreloadLinks.test.native.js +78 -0
- package/dist/cjs/views/PreloadLinks.test.native.js.map +1 -0
- package/dist/cjs/views/Protected.native.js.map +1 -1
- package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
- package/dist/cjs/views/RouteErrorView.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/ScrollBehavior.test.native.js.map +1 -1
- package/dist/cjs/views/SourceInspector.native.js.map +1 -1
- package/dist/cjs/views/SuspenseFallback.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/cloudflareWranglerConfig.native.js.map +1 -1
- package/dist/cjs/vite/cloudflareWranglerConfig.test.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/bundledDevPlugin.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/routeModuleHmrPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.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/plugins/workerdDevPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/workerdDevPlugin.test.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/router/router.mjs +6 -1
- package/dist/esm/router/router.mjs.map +1 -1
- package/dist/esm/utils/url.mjs +20 -1
- package/dist/esm/utils/url.mjs.map +1 -1
- package/dist/esm/utils/url.native.js +20 -1
- package/dist/esm/utils/url.native.js.map +1 -1
- package/dist/esm/utils/url.test.mjs +60 -0
- package/dist/esm/utils/url.test.mjs.map +1 -0
- package/dist/esm/utils/url.test.native.js +60 -0
- package/dist/esm/utils/url.test.native.js.map +1 -0
- package/dist/esm/views/PreloadLinks.mjs +19 -10
- package/dist/esm/views/PreloadLinks.mjs.map +1 -1
- package/dist/esm/views/PreloadLinks.test.mjs +74 -0
- package/dist/esm/views/PreloadLinks.test.mjs.map +1 -0
- package/dist/esm/views/PreloadLinks.test.native.js +76 -0
- package/dist/esm/views/PreloadLinks.test.native.js.map +1 -0
- package/package.json +9 -9
- package/src/router/router.ts +10 -1
- package/src/utils/url.test.ts +67 -0
- package/src/utils/url.ts +22 -0
- package/src/views/PreloadLinks.test.ts +78 -0
- package/src/views/PreloadLinks.tsx +22 -11
- package/types/router/router.d.ts.map +1 -1
- package/types/utils/url.d.ts +2 -0
- package/types/utils/url.d.ts.map +1 -1
- package/types/utils/url.test.d.ts +2 -0
- package/types/utils/url.test.d.ts.map +1 -0
- package/types/views/PreloadLinks.d.ts +10 -0
- package/types/views/PreloadLinks.d.ts.map +1 -1
- package/types/views/PreloadLinks.test.d.ts +2 -0
- package/types/views/PreloadLinks.test.d.ts.map +1 -0
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
import { useEffect, useRef } from "react";
|
|
2
2
|
import { getURL } from "../getURL.mjs";
|
|
3
3
|
import { preloadRoute } from "../router/router.mjs";
|
|
4
|
+
import { shouldPreloadRoute } from "../utils/url.mjs";
|
|
4
5
|
const PREFETCH_MODE = process.env.ONE_LINK_PREFETCH || "intent";
|
|
5
|
-
function
|
|
6
|
-
if (
|
|
7
|
-
|
|
8
|
-
if (
|
|
6
|
+
function getPrefetchableHref(anchor, url) {
|
|
7
|
+
if (anchor.target && anchor.target !== "_self") return null;
|
|
8
|
+
if (anchor.hasAttribute("download")) return null;
|
|
9
|
+
if (anchor.getAttribute("rel")?.includes("external")) return null;
|
|
9
10
|
const href = anchor.getAttribute("href");
|
|
10
11
|
if (!href) return null;
|
|
11
12
|
if (href[0] === "/" || href.startsWith(url)) {
|
|
12
|
-
|
|
13
|
+
const cleanHref = href.replace(url, "");
|
|
14
|
+
if (!shouldPreloadRoute(cleanHref)) return null;
|
|
15
|
+
return cleanHref;
|
|
13
16
|
}
|
|
14
17
|
return null;
|
|
15
18
|
}
|
|
19
|
+
function getHrefFromTarget(url, target) {
|
|
20
|
+
if (!(target instanceof HTMLElement)) return null;
|
|
21
|
+
const anchor = target instanceof HTMLAnchorElement ? target : target.closest("a");
|
|
22
|
+
if (!(anchor instanceof HTMLAnchorElement)) return null;
|
|
23
|
+
return getPrefetchableHref(anchor, url);
|
|
24
|
+
}
|
|
16
25
|
function PreloadLinks() {
|
|
17
26
|
if (typeof window === "undefined") {
|
|
18
27
|
return null;
|
|
@@ -62,9 +71,9 @@ function PreloadLinks() {
|
|
|
62
71
|
links.forEach(link => {
|
|
63
72
|
if (seen.has(link)) return;
|
|
64
73
|
seen.add(link);
|
|
65
|
-
const href = link
|
|
74
|
+
const href = getPrefetchableHref(link, url);
|
|
66
75
|
if (href) {
|
|
67
|
-
cleanups.push(observePrefetchViewport(link, href
|
|
76
|
+
cleanups.push(observePrefetchViewport(link, href));
|
|
68
77
|
}
|
|
69
78
|
});
|
|
70
79
|
};
|
|
@@ -100,9 +109,9 @@ function PreloadLinks() {
|
|
|
100
109
|
links.forEach(link => {
|
|
101
110
|
if (seen.has(link)) return;
|
|
102
111
|
seen.add(link);
|
|
103
|
-
const href = link
|
|
112
|
+
const href = getPrefetchableHref(link, url);
|
|
104
113
|
if (href) {
|
|
105
|
-
cleanups.push(observePrefetchIntent(link, href
|
|
114
|
+
cleanups.push(observePrefetchIntent(link, href));
|
|
106
115
|
}
|
|
107
116
|
});
|
|
108
117
|
};
|
|
@@ -137,5 +146,5 @@ function PreloadLinks() {
|
|
|
137
146
|
}, []);
|
|
138
147
|
return null;
|
|
139
148
|
}
|
|
140
|
-
export { PreloadLinks };
|
|
149
|
+
export { PreloadLinks, getPrefetchableHref };
|
|
141
150
|
//# sourceMappingURL=PreloadLinks.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","getURL","preloadRoute","PREFETCH_MODE","process","env","ONE_LINK_PREFETCH","
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","getURL","preloadRoute","shouldPreloadRoute","PREFETCH_MODE","process","env","ONE_LINK_PREFETCH","getPrefetchableHref","anchor","url","target","hasAttribute","getAttribute","includes","href","startsWith","cleanHref","replace","getHrefFromTarget","HTMLElement","HTMLAnchorElement","closest","PreloadLinks","window","import","meta","PROD","controller","AbortController","document","addEventListener","e","passive","signal","abort","cleanupRef","then","startPrefetchViewport","observePrefetchViewport","cleanups","seen","WeakSet","observeLinks","links","querySelectorAll","forEach","link","has","add","push","timeout","observer","MutationObserver","clearTimeout","setTimeout","observe","body","childList","subtree","current","c","disconnect","startPrefetchIntent","observePrefetchIntent"],"sources":["../../../src/views/PreloadLinks.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getPrefetchableHref } from "./PreloadLinks.mjs";
|
|
3
|
+
function createMockAnchor(attrs) {
|
|
4
|
+
const el = {
|
|
5
|
+
getAttribute(name) {
|
|
6
|
+
if (name === "href") return attrs.href ?? null;
|
|
7
|
+
if (name === "rel") return attrs.rel ?? null;
|
|
8
|
+
return null;
|
|
9
|
+
},
|
|
10
|
+
hasAttribute(name) {
|
|
11
|
+
if (name === "download") return !!attrs.download;
|
|
12
|
+
return false;
|
|
13
|
+
},
|
|
14
|
+
target: attrs.target ?? ""
|
|
15
|
+
};
|
|
16
|
+
return el;
|
|
17
|
+
}
|
|
18
|
+
describe("getPrefetchableHref", () => {
|
|
19
|
+
const baseUrl = "https://tamagui.dev";
|
|
20
|
+
it("returns clean href for valid internal routes", () => {
|
|
21
|
+
const anchor = createMockAnchor({
|
|
22
|
+
href: "/ui/button"
|
|
23
|
+
});
|
|
24
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBe("/ui/button");
|
|
25
|
+
});
|
|
26
|
+
it("returns clean href for absolute urls matching baseUrl", () => {
|
|
27
|
+
const anchor = createMockAnchor({
|
|
28
|
+
href: "https://tamagui.dev/docs/intro"
|
|
29
|
+
});
|
|
30
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBe("/docs/intro");
|
|
31
|
+
});
|
|
32
|
+
it('returns null for target="_blank"', () => {
|
|
33
|
+
const anchor = createMockAnchor({
|
|
34
|
+
href: "/docs/intro",
|
|
35
|
+
target: "_blank"
|
|
36
|
+
});
|
|
37
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
it("returns null for download attribute", () => {
|
|
40
|
+
const anchor = createMockAnchor({
|
|
41
|
+
href: "/archive.zip",
|
|
42
|
+
download: true
|
|
43
|
+
});
|
|
44
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
it('returns null for rel="external"', () => {
|
|
47
|
+
const anchor = createMockAnchor({
|
|
48
|
+
href: "/docs",
|
|
49
|
+
rel: "external"
|
|
50
|
+
});
|
|
51
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
it("returns null for file extensions (.md, .txt, .png, etc.)", () => {
|
|
54
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
55
|
+
href: "/ui/button.md"
|
|
56
|
+
}), baseUrl)).toBeNull();
|
|
57
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
58
|
+
href: "/llms.txt"
|
|
59
|
+
}), baseUrl)).toBeNull();
|
|
60
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
61
|
+
href: "https://tamagui.dev/ui/button.md"
|
|
62
|
+
}), baseUrl)).toBeNull();
|
|
63
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
64
|
+
href: "https://tamagui.dev/llms.txt"
|
|
65
|
+
}), baseUrl)).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
it("returns null for external urls", () => {
|
|
68
|
+
const anchor = createMockAnchor({
|
|
69
|
+
href: "https://google.com/about"
|
|
70
|
+
});
|
|
71
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=PreloadLinks.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","getPrefetchableHref","createMockAnchor","attrs","el","getAttribute","name","href","rel","hasAttribute","download","target","baseUrl","anchor","toBe","toBeNull"],"sources":["../../../src/views/PreloadLinks.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getPrefetchableHref } from "./PreloadLinks.native.js";
|
|
3
|
+
function createMockAnchor(attrs) {
|
|
4
|
+
var _attrs_target;
|
|
5
|
+
var el = {
|
|
6
|
+
getAttribute(name) {
|
|
7
|
+
var _attrs_href, _attrs_rel;
|
|
8
|
+
if (name === "href") return (_attrs_href = attrs.href) !== null && _attrs_href !== void 0 ? _attrs_href : null;
|
|
9
|
+
if (name === "rel") return (_attrs_rel = attrs.rel) !== null && _attrs_rel !== void 0 ? _attrs_rel : null;
|
|
10
|
+
return null;
|
|
11
|
+
},
|
|
12
|
+
hasAttribute(name) {
|
|
13
|
+
if (name === "download") return !!attrs.download;
|
|
14
|
+
return false;
|
|
15
|
+
},
|
|
16
|
+
target: (_attrs_target = attrs.target) !== null && _attrs_target !== void 0 ? _attrs_target : ""
|
|
17
|
+
};
|
|
18
|
+
return el;
|
|
19
|
+
}
|
|
20
|
+
describe("getPrefetchableHref", function () {
|
|
21
|
+
var baseUrl = "https://tamagui.dev";
|
|
22
|
+
it("returns clean href for valid internal routes", function () {
|
|
23
|
+
var anchor = createMockAnchor({
|
|
24
|
+
href: "/ui/button"
|
|
25
|
+
});
|
|
26
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBe("/ui/button");
|
|
27
|
+
});
|
|
28
|
+
it("returns clean href for absolute urls matching baseUrl", function () {
|
|
29
|
+
var anchor = createMockAnchor({
|
|
30
|
+
href: "https://tamagui.dev/docs/intro"
|
|
31
|
+
});
|
|
32
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBe("/docs/intro");
|
|
33
|
+
});
|
|
34
|
+
it('returns null for target="_blank"', function () {
|
|
35
|
+
var anchor = createMockAnchor({
|
|
36
|
+
href: "/docs/intro",
|
|
37
|
+
target: "_blank"
|
|
38
|
+
});
|
|
39
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
40
|
+
});
|
|
41
|
+
it("returns null for download attribute", function () {
|
|
42
|
+
var anchor = createMockAnchor({
|
|
43
|
+
href: "/archive.zip",
|
|
44
|
+
download: true
|
|
45
|
+
});
|
|
46
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
47
|
+
});
|
|
48
|
+
it('returns null for rel="external"', function () {
|
|
49
|
+
var anchor = createMockAnchor({
|
|
50
|
+
href: "/docs",
|
|
51
|
+
rel: "external"
|
|
52
|
+
});
|
|
53
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it("returns null for file extensions (.md, .txt, .png, etc.)", function () {
|
|
56
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
57
|
+
href: "/ui/button.md"
|
|
58
|
+
}), baseUrl)).toBeNull();
|
|
59
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
60
|
+
href: "/llms.txt"
|
|
61
|
+
}), baseUrl)).toBeNull();
|
|
62
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
63
|
+
href: "https://tamagui.dev/ui/button.md"
|
|
64
|
+
}), baseUrl)).toBeNull();
|
|
65
|
+
expect(getPrefetchableHref(createMockAnchor({
|
|
66
|
+
href: "https://tamagui.dev/llms.txt"
|
|
67
|
+
}), baseUrl)).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
it("returns null for external urls", function () {
|
|
70
|
+
var anchor = createMockAnchor({
|
|
71
|
+
href: "https://google.com/about"
|
|
72
|
+
});
|
|
73
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=PreloadLinks.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","getPrefetchableHref","createMockAnchor","attrs","_attrs_target","el","getAttribute","name","_attrs_href","_attrs_rel","href","rel","hasAttribute","download","target","baseUrl","anchor","toBe","toBeNull"],"sources":["../../../src/views/PreloadLinks.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AACrC,SAASC,mBAAA,QAA2B;AAEpC,SAASC,iBAAiBC,KAAA,EAKJ;EACpB,IAAAC,aAAW;EAAA,IACTC,EAAA;IACEC,YAAIA,CAAAC,IAAS;MACb,IAAIC,WAAS,EAAAC,UAAc;MAC3B,IAAAF,IAAO,qBAAAC,WAAA,GAAAL,KAAA,CAAAO,IAAA,cAAAF,WAAA,cAAAA,WAAA;MACT,IAAAD,IAAA,oBAAAE,UAAA,GAAAN,KAAA,CAAAQ,GAAA,cAAAF,UAAA,cAAAA,UAAA;MACA,WAAa;IACX;IACAG,YAAOA,CAAAL,IAAA;MACT,IAAAA,IAAA,0BAAAJ,KAAA,CAAAU,QAAA;MACA,OAAQ,KAAM;IAChB;IACAC,MAAO,GAAAV,aAAA,GAAAD,KAAA,CAAAW,MAAA,cAAAV,aAAA,cAAAA,aAAA;EACT;EAEA,OAASC,EAAA;AACP;AAEAP,QAAG;EACD,IAAAiB,OAAM,wBAA0B;EAChCf,EAAA,+CAA6C,cAAK;IACnD,IAAAgB,MAAA,GAAAd,gBAAA;MAEEQ,IAAA;IACD;IACAX,MAAA,CAAOE,mBAAA,CAAoBe,MAAA,EAAQD,OAAO,CAAC,EAAEE,IAAA,CAAK,aAAa;EACjE,CAAC;EAEDjB,EAAA,CAAG,uDAA0C;IAC3C,IAAAgB,MAAM,GAAAd,gBAAS;MACfQ,IAAA,EAAO;IACR;IAEDX,MAAG,CAAAE,mBAAA,CAAAe,MAAA,EAAAD,OAAuC,GAAAE,IAAM;EAC9C;EACAjB,EAAA,mCAAmC,cAAU;IAC9C,IAAAgB,MAAA,GAAAd,gBAAA;MAEEQ,IAAA;MACDI,MAAM;IACN;IACDf,MAAA,CAAAE,mBAAA,CAAAe,MAAA,EAAAD,OAAA,GAAAG,QAAA;EAED;EACElB,EAAA;IAAA,IACEgB,MAAA,GAAAd,gBAAoB;MACpBQ,IAAA,gBAAS;MACXG,QAAA;IAAA,EACE;IACFd,MAAE,CAAAE,mBAAS,CAAAe,MAAA,EAAAD,OAAA,GAAAG,QAAA;EACX;EAAAlB,EAAA,kCACE;IAAA,IACEgB,MAAA,GAAAd,gBAAyB;MAAoCQ,IAC7D;MACFC,GAAA;IACF,EAAE;IACFZ,MAAA,CAAAE,mBAAA,CAAAe,MAAA,EAAAD,OAAA,GAAAG,QAAA;EAAA;EACElB,EAAA,2DAC2B,EAAgC;IAAAD,MACzD,CAAAE,mBAAA,CAAAC,gBAAA;MACFQ,IAAA;IACF,EAAE,EAAAK,OAAS,GAAAG,QAAA;IACZnB,MAAA,CAAAE,mBAAA,CAAAC,gBAAA;MAEEQ,IAAA;IACD,IAAAK,OAAM,GAAAG,QAAS;IACfnB,MAAA,CAAOE,mBAAA,CAAoBC,gBAAgB;MAC5CQ,IAAA;IACF,IAAAK,OAAA,GAAAG,QAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "one",
|
|
3
|
-
"version": "1.27.
|
|
3
|
+
"version": "1.27.1",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"setup.mjs",
|
|
@@ -197,18 +197,18 @@
|
|
|
197
197
|
"@react-navigation/routers": "~7.6.4",
|
|
198
198
|
"@cloudflare/vite-plugin": "^1.33.1",
|
|
199
199
|
"@ungap/structured-clone": "^1.2.0",
|
|
200
|
-
"@vxrn/color-scheme": "1.27.
|
|
201
|
-
"@vxrn/compiler": "1.27.
|
|
202
|
-
"@vxrn/resolve": "1.27.
|
|
203
|
-
"@vxrn/tslib-lite": "1.27.
|
|
204
|
-
"@vxrn/use-isomorphic-layout-effect": "1.27.
|
|
205
|
-
"@vxrn/vite-plugin-metro": "1.27.
|
|
200
|
+
"@vxrn/color-scheme": "1.27.1",
|
|
201
|
+
"@vxrn/compiler": "1.27.1",
|
|
202
|
+
"@vxrn/resolve": "1.27.1",
|
|
203
|
+
"@vxrn/tslib-lite": "1.27.1",
|
|
204
|
+
"@vxrn/use-isomorphic-layout-effect": "1.27.1",
|
|
205
|
+
"@vxrn/vite-plugin-metro": "1.27.1",
|
|
206
206
|
"babel-dead-code-elimination": "1.0.10",
|
|
207
207
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
208
208
|
"babel-preset-expo": "~57.0.5",
|
|
209
209
|
"citty": "^0.1.6",
|
|
210
210
|
"core-js": "^3.38.1",
|
|
211
|
-
"create-vxrn": "1.27.
|
|
211
|
+
"create-vxrn": "1.27.1",
|
|
212
212
|
"escape-string-regexp": "^5.0.0",
|
|
213
213
|
"expo-linking": "~57.0.5",
|
|
214
214
|
"expo-modules-core": "~57.0.10",
|
|
@@ -229,7 +229,7 @@
|
|
|
229
229
|
"tsconfig-paths": "^4",
|
|
230
230
|
"use-latest-callback": "^0.2.3",
|
|
231
231
|
"vite": "^8.2.2",
|
|
232
|
-
"vxrn": "1.27.
|
|
232
|
+
"vxrn": "1.27.1",
|
|
233
233
|
"web-streams-polyfill": "^4.3.0",
|
|
234
234
|
"ws": "^8.21.0",
|
|
235
235
|
"xxhashjs": "^0.2.2"
|
package/src/router/router.ts
CHANGED
|
@@ -28,7 +28,7 @@ import { getLoaderPath, getPreloadCSSPath, getPreloadPath } from '../utils/clean
|
|
|
28
28
|
import { dynamicImport } from '../utils/dynamicImport'
|
|
29
29
|
import { PLATFORM } from '../utils/platform'
|
|
30
30
|
import { isVersionStale } from '../skewProtection'
|
|
31
|
-
import { shouldLinkExternally } from '../utils/url'
|
|
31
|
+
import { hasFileExtension, shouldLinkExternally, shouldPreloadRoute } from '../utils/url'
|
|
32
32
|
import {
|
|
33
33
|
ParamValidationError,
|
|
34
34
|
RouteValidationError,
|
|
@@ -965,6 +965,10 @@ export function getPreloadHistory(): PreloadEntry[] {
|
|
|
965
965
|
|
|
966
966
|
export function preloadRoute(href: string, injectCSS = false): Promise<any> | undefined {
|
|
967
967
|
if (process.env.TAMAGUI_TARGET !== 'native') {
|
|
968
|
+
if (!shouldPreloadRoute(href)) {
|
|
969
|
+
return
|
|
970
|
+
}
|
|
971
|
+
|
|
968
972
|
// in dev mode, use a simpler preload that just fetches the loader directly
|
|
969
973
|
// this avoids issues with production-only preload paths while still ensuring
|
|
970
974
|
// loader data is available before navigation completes
|
|
@@ -1104,6 +1108,11 @@ export async function linkTo(
|
|
|
1104
1108
|
return
|
|
1105
1109
|
}
|
|
1106
1110
|
|
|
1111
|
+
if (process.env.TAMAGUI_TARGET !== 'native' && hasFileExtension(href)) {
|
|
1112
|
+
window.location.href = href
|
|
1113
|
+
return
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1107
1116
|
// if a new version was detected via polling, force full page navigation
|
|
1108
1117
|
if (isVersionStale()) {
|
|
1109
1118
|
window.location.href = href
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { hasFileExtension, shouldLinkExternally, shouldPreloadRoute } from './url'
|
|
3
|
+
|
|
4
|
+
describe('url utils', () => {
|
|
5
|
+
describe('hasFileExtension', () => {
|
|
6
|
+
it('returns true for common file extensions', () => {
|
|
7
|
+
expect(hasFileExtension('/ui/button.md')).toBe(true)
|
|
8
|
+
expect(hasFileExtension('/llms.txt')).toBe(true)
|
|
9
|
+
expect(hasFileExtension('/favicon.ico')).toBe(true)
|
|
10
|
+
expect(hasFileExtension('/assets/image.png')).toBe(true)
|
|
11
|
+
expect(hasFileExtension('/doc.pdf')).toBe(true)
|
|
12
|
+
expect(hasFileExtension('/data.json')).toBe(true)
|
|
13
|
+
expect(hasFileExtension('/archive.zip')).toBe(true)
|
|
14
|
+
expect(hasFileExtension('/styles.css')).toBe(true)
|
|
15
|
+
expect(hasFileExtension('/script.js')).toBe(true)
|
|
16
|
+
expect(hasFileExtension('/manifest.webmanifest')).toBe(true)
|
|
17
|
+
expect(hasFileExtension('/font.woff2')).toBe(true)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('returns true with query params or hashes', () => {
|
|
21
|
+
expect(hasFileExtension('/ui/button.md?download=1')).toBe(true)
|
|
22
|
+
expect(hasFileExtension('/llms.txt#section')).toBe(true)
|
|
23
|
+
expect(hasFileExtension('https://tamagui.dev/ui/button.md?foo=bar#baz')).toBe(true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('returns false for route paths without extensions', () => {
|
|
27
|
+
expect(hasFileExtension('/')).toBe(false)
|
|
28
|
+
expect(hasFileExtension('/about')).toBe(false)
|
|
29
|
+
expect(hasFileExtension('/ui/button')).toBe(false)
|
|
30
|
+
expect(hasFileExtension('/docs/components/button')).toBe(false)
|
|
31
|
+
expect(hasFileExtension('/v1.0')).toBe(false)
|
|
32
|
+
expect(hasFileExtension('/version-2.1.0')).toBe(false)
|
|
33
|
+
expect(hasFileExtension('/docs/1.0/intro')).toBe(false)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('returns false for empty or invalid inputs', () => {
|
|
37
|
+
expect(hasFileExtension('')).toBe(false)
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
describe('shouldPreloadRoute', () => {
|
|
42
|
+
it('returns true for valid internal routes', () => {
|
|
43
|
+
expect(shouldPreloadRoute('/')).toBe(true)
|
|
44
|
+
expect(shouldPreloadRoute('/about')).toBe(true)
|
|
45
|
+
expect(shouldPreloadRoute('/ui/button')).toBe(true)
|
|
46
|
+
expect(shouldPreloadRoute('/docs/components/button')).toBe(true)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('returns false for file extensions', () => {
|
|
50
|
+
expect(shouldPreloadRoute('/ui/button.md')).toBe(false)
|
|
51
|
+
expect(shouldPreloadRoute('/llms.txt')).toBe(false)
|
|
52
|
+
expect(shouldPreloadRoute('/favicon.ico')).toBe(false)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('returns false for external urls or schemes', () => {
|
|
56
|
+
expect(shouldPreloadRoute('https://example.com/about')).toBe(false)
|
|
57
|
+
expect(shouldPreloadRoute('http://example.com')).toBe(false)
|
|
58
|
+
expect(shouldPreloadRoute('mailto:test@example.com')).toBe(false)
|
|
59
|
+
expect(shouldPreloadRoute('tel:123456')).toBe(false)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('returns false for hash links or empty hrefs', () => {
|
|
63
|
+
expect(shouldPreloadRoute('#section')).toBe(false)
|
|
64
|
+
expect(shouldPreloadRoute('')).toBe(false)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
})
|
package/src/utils/url.ts
CHANGED
|
@@ -19,3 +19,25 @@ export function shouldLinkExternally(href: string): boolean {
|
|
|
19
19
|
// Cheap check first to avoid regex if the href is not a path fragment.
|
|
20
20
|
return !/^[./]/.test(href) && (hasUrlProtocolPrefix(href) || isWellKnownUri(href))
|
|
21
21
|
}
|
|
22
|
+
|
|
23
|
+
const staticFileExtensionRegex = /\.(?:[a-z0-9]{2,5}|webmanifest|wasm|woff2)$/i
|
|
24
|
+
|
|
25
|
+
export function hasFileExtension(href: string): boolean {
|
|
26
|
+
if (!href) return false
|
|
27
|
+
try {
|
|
28
|
+
const url = new URL(href, 'http://localhost')
|
|
29
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
32
|
+
return staticFileExtensionRegex.test(url.pathname)
|
|
33
|
+
} catch {
|
|
34
|
+
return false
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function shouldPreloadRoute(href: string): boolean {
|
|
39
|
+
if (!href || href[0] === '#') return false
|
|
40
|
+
if (shouldLinkExternally(href)) return false
|
|
41
|
+
if (hasFileExtension(href)) return false
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { getPrefetchableHref } from './PreloadLinks'
|
|
3
|
+
|
|
4
|
+
function createMockAnchor(attrs: {
|
|
5
|
+
href?: string
|
|
6
|
+
target?: string
|
|
7
|
+
download?: boolean
|
|
8
|
+
rel?: string
|
|
9
|
+
}): HTMLAnchorElement {
|
|
10
|
+
const el = {
|
|
11
|
+
getAttribute(name: string) {
|
|
12
|
+
if (name === 'href') return attrs.href ?? null
|
|
13
|
+
if (name === 'rel') return attrs.rel ?? null
|
|
14
|
+
return null
|
|
15
|
+
},
|
|
16
|
+
hasAttribute(name: string) {
|
|
17
|
+
if (name === 'download') return !!attrs.download
|
|
18
|
+
return false
|
|
19
|
+
},
|
|
20
|
+
target: attrs.target ?? '',
|
|
21
|
+
} as unknown as HTMLAnchorElement
|
|
22
|
+
return el
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
describe('getPrefetchableHref', () => {
|
|
26
|
+
const baseUrl = 'https://tamagui.dev'
|
|
27
|
+
|
|
28
|
+
it('returns clean href for valid internal routes', () => {
|
|
29
|
+
const anchor = createMockAnchor({ href: '/ui/button' })
|
|
30
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBe('/ui/button')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('returns clean href for absolute urls matching baseUrl', () => {
|
|
34
|
+
const anchor = createMockAnchor({ href: 'https://tamagui.dev/docs/intro' })
|
|
35
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBe('/docs/intro')
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('returns null for target="_blank"', () => {
|
|
39
|
+
const anchor = createMockAnchor({ href: '/docs/intro', target: '_blank' })
|
|
40
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('returns null for download attribute', () => {
|
|
44
|
+
const anchor = createMockAnchor({ href: '/archive.zip', download: true })
|
|
45
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('returns null for rel="external"', () => {
|
|
49
|
+
const anchor = createMockAnchor({ href: '/docs', rel: 'external' })
|
|
50
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull()
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('returns null for file extensions (.md, .txt, .png, etc.)', () => {
|
|
54
|
+
expect(
|
|
55
|
+
getPrefetchableHref(createMockAnchor({ href: '/ui/button.md' }), baseUrl)
|
|
56
|
+
).toBeNull()
|
|
57
|
+
expect(
|
|
58
|
+
getPrefetchableHref(createMockAnchor({ href: '/llms.txt' }), baseUrl)
|
|
59
|
+
).toBeNull()
|
|
60
|
+
expect(
|
|
61
|
+
getPrefetchableHref(
|
|
62
|
+
createMockAnchor({ href: 'https://tamagui.dev/ui/button.md' }),
|
|
63
|
+
baseUrl
|
|
64
|
+
)
|
|
65
|
+
).toBeNull()
|
|
66
|
+
expect(
|
|
67
|
+
getPrefetchableHref(
|
|
68
|
+
createMockAnchor({ href: 'https://tamagui.dev/llms.txt' }),
|
|
69
|
+
baseUrl
|
|
70
|
+
)
|
|
71
|
+
).toBeNull()
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('returns null for external urls', () => {
|
|
75
|
+
const anchor = createMockAnchor({ href: 'https://google.com/about' })
|
|
76
|
+
expect(getPrefetchableHref(anchor, baseUrl)).toBeNull()
|
|
77
|
+
})
|
|
78
|
+
})
|
|
@@ -2,6 +2,8 @@ import { useEffect, useRef } from 'react'
|
|
|
2
2
|
import { getURL } from '../getURL'
|
|
3
3
|
import { preloadRoute } from '../router/router'
|
|
4
4
|
|
|
5
|
+
import { shouldPreloadRoute } from '../utils/url'
|
|
6
|
+
|
|
5
7
|
/**
|
|
6
8
|
* Resolved at build time via vite define - enables tree-shaking of unused modes.
|
|
7
9
|
* Defaults to 'intent' for smart trajectory-based prefetching.
|
|
@@ -21,18 +23,27 @@ const PREFETCH_MODE = (process.env.ONE_LINK_PREFETCH || 'intent') as
|
|
|
21
23
|
* - 'hover': Prefetches on mouseover
|
|
22
24
|
* - 'false': Disabled
|
|
23
25
|
*/
|
|
24
|
-
function
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
if (
|
|
26
|
+
export function getPrefetchableHref(anchor: HTMLAnchorElement, url: string): string | null {
|
|
27
|
+
if (anchor.target && anchor.target !== '_self') return null
|
|
28
|
+
if (anchor.hasAttribute('download')) return null
|
|
29
|
+
if (anchor.getAttribute('rel')?.includes('external')) return null
|
|
28
30
|
const href = anchor.getAttribute('href')
|
|
29
31
|
if (!href) return null
|
|
30
32
|
if (href[0] === '/' || href.startsWith(url)) {
|
|
31
|
-
|
|
33
|
+
const cleanHref = href.replace(url, '')
|
|
34
|
+
if (!shouldPreloadRoute(cleanHref)) return null
|
|
35
|
+
return cleanHref
|
|
32
36
|
}
|
|
33
37
|
return null
|
|
34
38
|
}
|
|
35
39
|
|
|
40
|
+
function getHrefFromTarget(url: string, target: EventTarget | null): string | null {
|
|
41
|
+
if (!(target instanceof HTMLElement)) return null
|
|
42
|
+
const anchor = target instanceof HTMLAnchorElement ? target : target.closest('a')
|
|
43
|
+
if (!(anchor instanceof HTMLAnchorElement)) return null
|
|
44
|
+
return getPrefetchableHref(anchor, url)
|
|
45
|
+
}
|
|
46
|
+
|
|
36
47
|
export function PreloadLinks() {
|
|
37
48
|
if (typeof window === 'undefined') {
|
|
38
49
|
return null
|
|
@@ -92,16 +103,16 @@ export function PreloadLinks() {
|
|
|
92
103
|
const seen = new WeakSet<Element>()
|
|
93
104
|
|
|
94
105
|
const observeLinks = () => {
|
|
95
|
-
const links = document.querySelectorAll(
|
|
106
|
+
const links = document.querySelectorAll<HTMLAnchorElement>(
|
|
96
107
|
'a[href^="/"], a[href^="' + url + '"]'
|
|
97
108
|
)
|
|
98
109
|
links.forEach((link) => {
|
|
99
110
|
if (seen.has(link)) return
|
|
100
111
|
seen.add(link)
|
|
101
|
-
const href = link
|
|
112
|
+
const href = getPrefetchableHref(link, url)
|
|
102
113
|
if (href) {
|
|
103
114
|
cleanups.push(
|
|
104
|
-
observePrefetchViewport(link
|
|
115
|
+
observePrefetchViewport(link, href)
|
|
105
116
|
)
|
|
106
117
|
}
|
|
107
118
|
})
|
|
@@ -139,16 +150,16 @@ export function PreloadLinks() {
|
|
|
139
150
|
const seen = new WeakSet<Element>()
|
|
140
151
|
|
|
141
152
|
const observeLinks = () => {
|
|
142
|
-
const links = document.querySelectorAll(
|
|
153
|
+
const links = document.querySelectorAll<HTMLAnchorElement>(
|
|
143
154
|
'a[href^="/"], a[href^="' + url + '"]'
|
|
144
155
|
)
|
|
145
156
|
links.forEach((link) => {
|
|
146
157
|
if (seen.has(link)) return
|
|
147
158
|
seen.add(link)
|
|
148
|
-
const href = link
|
|
159
|
+
const href = getPrefetchableHref(link, url)
|
|
149
160
|
if (href) {
|
|
150
161
|
cleanups.push(
|
|
151
|
-
observePrefetchIntent(link
|
|
162
|
+
observePrefetchIntent(link, href)
|
|
152
163
|
)
|
|
153
164
|
}
|
|
154
165
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
|
package/types/utils/url.d.ts
CHANGED
|
@@ -5,4 +5,6 @@
|
|
|
5
5
|
export declare function hasUrlProtocolPrefix(href: string): boolean;
|
|
6
6
|
export declare function isWellKnownUri(href: string): boolean;
|
|
7
7
|
export declare function shouldLinkExternally(href: string): boolean;
|
|
8
|
+
export declare function hasFileExtension(href: string): boolean;
|
|
9
|
+
export declare function shouldPreloadRoute(href: string): boolean;
|
|
8
10
|
//# sourceMappingURL=url.d.ts.map
|
package/types/utils/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D"}
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.test.d.ts","sourceRoot":"","sources":["../../src/utils/url.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles link prefetching in production builds.
|
|
3
|
+
*
|
|
4
|
+
* Modes:
|
|
5
|
+
* - 'intent': Predicts navigation based on mouse trajectory (default)
|
|
6
|
+
* - 'viewport': Prefetches links when they enter the viewport
|
|
7
|
+
* - 'hover': Prefetches on mouseover
|
|
8
|
+
* - 'false': Disabled
|
|
9
|
+
*/
|
|
10
|
+
export declare function getPrefetchableHref(anchor: HTMLAnchorElement, url: string): string | null;
|
|
1
11
|
export declare function PreloadLinks(): null;
|
|
2
12
|
//# sourceMappingURL=PreloadLinks.d.ts.map
|