diff --git a/packages/react-router/src/Asset.tsx b/packages/react-router/src/Asset.tsx index ef82d6637a..7a81b87f17 100644 --- a/packages/react-router/src/Asset.tsx +++ b/packages/react-router/src/Asset.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import type { RouterManagedTag } from '@tanstack/router-core' diff --git a/packages/react-router/src/Match.tsx b/packages/react-router/src/Match.tsx index e50f9b7b7d..c5faa866fc 100644 --- a/packages/react-router/src/Match.tsx +++ b/packages/react-router/src/Match.tsx @@ -6,9 +6,9 @@ import { getLocationChangeInfo, isNotFound, isRedirect, - isServer, rootRouteId, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { CatchBoundary, ErrorComponent } from './CatchBoundary' import { useRouterState } from './useRouterState' import { useRouter } from './useRouter' diff --git a/packages/react-router/src/Matches.tsx b/packages/react-router/src/Matches.tsx index 8c1b661b86..de8a2ea73e 100644 --- a/packages/react-router/src/Matches.tsx +++ b/packages/react-router/src/Matches.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import warning from 'tiny-warning' -import { isServer, rootRouteId } from '@tanstack/router-core' +import { rootRouteId } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { CatchBoundary, ErrorComponent } from './CatchBoundary' import { useRouterState } from './useRouterState' import { useRouter } from './useRouter' diff --git a/packages/react-router/src/ScriptOnce.tsx b/packages/react-router/src/ScriptOnce.tsx index c37bb51a30..f552becb9f 100644 --- a/packages/react-router/src/ScriptOnce.tsx +++ b/packages/react-router/src/ScriptOnce.tsx @@ -1,4 +1,4 @@ -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' /** diff --git a/packages/react-router/src/link.tsx b/packages/react-router/src/link.tsx index 1a8eda4eb5..2fb69f8b52 100644 --- a/packages/react-router/src/link.tsx +++ b/packages/react-router/src/link.tsx @@ -5,10 +5,10 @@ import { exactPathTest, functionalUpdate, isDangerousProtocol, - isServer, preloadWarning, removeTrailingSlash, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouterState } from './useRouterState' import { useRouter } from './useRouter' diff --git a/packages/react-router/src/scroll-restoration.tsx b/packages/react-router/src/scroll-restoration.tsx index 8a88e9a671..f8c3c4559a 100644 --- a/packages/react-router/src/scroll-restoration.tsx +++ b/packages/react-router/src/scroll-restoration.tsx @@ -1,10 +1,10 @@ import { defaultGetScrollRestorationKey, escapeHtml, - isServer, restoreScroll, storageKey, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import { ScriptOnce } from './ScriptOnce' diff --git a/packages/router-core/src/index.ts b/packages/router-core/src/index.ts index 5fe3a1af74..1897f07880 100644 --- a/packages/router-core/src/index.ts +++ b/packages/router-core/src/index.ts @@ -105,7 +105,6 @@ export { export { encode, decode } from './qss' export { rootRouteId } from './root' export type { RootRouteId } from './root' -export { isServer } from './isServer' export { BaseRoute, BaseRouteApi, BaseRootRoute } from './route' export type { diff --git a/packages/router-core/src/isServer.ts b/packages/router-core/src/isServer.ts deleted file mode 100644 index 98f73e1261..0000000000 --- a/packages/router-core/src/isServer.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Static server/client detection for tree-shaking support. - * - * This re-exports `isServer` from the `isServer/` directory which uses - * conditional exports to provide different values based on the environment: - * - * - `browser` condition → `false` (client) - * - `node`/`worker`/`deno`/`bun` → `true` (server) - * - `development` condition → `undefined` (for tests, falls back to router.isServer) - * - * The bundler resolves the correct file at build time based on export conditions, - * and since the value is a literal constant, dead code can be eliminated. - * - * @example - * ```typescript - * import { isServer } from '@tanstack/router-core' - * - * // The ?? operator provides fallback for development/test mode - * if (isServer ?? router.isServer) { - * // Server-only code - eliminated in client bundles - * } - * ``` - */ -export { isServer } from './isServer/development' diff --git a/packages/router-core/src/load-matches.ts b/packages/router-core/src/load-matches.ts index e524032878..1cca25ed05 100644 --- a/packages/router-core/src/load-matches.ts +++ b/packages/router-core/src/load-matches.ts @@ -1,10 +1,10 @@ import { batch } from '@tanstack/store' import invariant from 'tiny-invariant' +import { isServer } from '@tanstack/router-core/isServer' import { createControlledPromise, isPromise } from './utils' import { isNotFound } from './not-found' import { rootRouteId } from './root' import { isRedirect } from './redirect' -import { isServer } from './isServer' import type { NotFoundError } from './not-found' import type { ParsedLocation } from './location' import type { diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts index 852e8d324f..6ffbd0b493 100644 --- a/packages/router-core/src/router.ts +++ b/packages/router-core/src/router.ts @@ -1,5 +1,6 @@ import { Store, batch } from '@tanstack/store' import { createBrowserHistory, parseHref } from '@tanstack/history' +import { isServer } from '@tanstack/router-core/isServer' import { createControlledPromise, decodePath, @@ -26,7 +27,6 @@ import { trimPath, trimPathRight, } from './path' -import { isServer } from './isServer' import { createLRUCache } from './lru-cache' import { isNotFound } from './not-found' import { setupScrollRestoration } from './scroll-restoration' diff --git a/packages/router-core/src/scroll-restoration.ts b/packages/router-core/src/scroll-restoration.ts index fbc5eb9c58..ec1925c137 100644 --- a/packages/router-core/src/scroll-restoration.ts +++ b/packages/router-core/src/scroll-restoration.ts @@ -1,5 +1,5 @@ +import { isServer } from '@tanstack/router-core/isServer' import { functionalUpdate } from './utils' -import { isServer } from './isServer' import type { AnyRouter } from './router' import type { ParsedLocation } from './location' import type { NonNullableUpdater } from './utils' diff --git a/packages/router-core/tsconfig.json b/packages/router-core/tsconfig.json index e99dc8130a..2685821ee8 100644 --- a/packages/router-core/tsconfig.json +++ b/packages/router-core/tsconfig.json @@ -1,4 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/router-core/isServer": ["./src/isServer/development.ts"] + } + }, "include": ["src", "vite.config.ts", "tests", "vite-minify-plugin.ts"] } diff --git a/packages/router-core/vite.config.ts b/packages/router-core/vite.config.ts index c6f7fc9220..a1a2f56562 100644 --- a/packages/router-core/vite.config.ts +++ b/packages/router-core/vite.config.ts @@ -1,3 +1,4 @@ +import path from 'node:path' import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' import minifyScriptPlugin from './vite-minify-plugin' @@ -12,6 +13,14 @@ const config = defineConfig({ watch: false, environment: 'jsdom', typecheck: { enabled: true }, + alias: { + // For tests only, resolve to development.ts which returns undefined + // so that router.isServer fallback is used + '@tanstack/router-core/isServer': path.resolve( + __dirname, + 'src/isServer/development.ts', + ), + }, }, }) @@ -27,5 +36,6 @@ export default mergeConfig( './src/isServer/development.ts', ], srcDir: './src', + externalDeps: ['@tanstack/router-core/isServer'], }), ) diff --git a/packages/router-ssr-query-core/src/index.ts b/packages/router-ssr-query-core/src/index.ts index 768fbaab6d..1ef00b1a7a 100644 --- a/packages/router-ssr-query-core/src/index.ts +++ b/packages/router-ssr-query-core/src/index.ts @@ -2,7 +2,8 @@ import { dehydrate as queryDehydrate, hydrate as queryHydrate, } from '@tanstack/query-core' -import { isRedirect, isServer } from '@tanstack/router-core' +import { isRedirect } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import type { AnyRouter } from '@tanstack/router-core' import type { QueryClient, diff --git a/packages/solid-router/src/Asset.tsx b/packages/solid-router/src/Asset.tsx index 13d30918e0..3d89c2e1d3 100644 --- a/packages/solid-router/src/Asset.tsx +++ b/packages/solid-router/src/Asset.tsx @@ -1,6 +1,6 @@ import { Link, Meta, Style, Title } from '@solidjs/meta' import { onCleanup, onMount } from 'solid-js' -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import type { RouterManagedTag } from '@tanstack/router-core' import type { JSX } from 'solid-js' diff --git a/packages/solid-router/src/Match.tsx b/packages/solid-router/src/Match.tsx index 3b2660c4c2..98d185513f 100644 --- a/packages/solid-router/src/Match.tsx +++ b/packages/solid-router/src/Match.tsx @@ -6,9 +6,9 @@ import { getLocationChangeInfo, isNotFound, isRedirect, - isServer, rootRouteId, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { Dynamic } from 'solid-js/web' import { CatchBoundary, ErrorComponent } from './CatchBoundary' import { useRouterState } from './useRouterState' diff --git a/packages/solid-router/src/Matches.tsx b/packages/solid-router/src/Matches.tsx index 8848421082..a39f09a4db 100644 --- a/packages/solid-router/src/Matches.tsx +++ b/packages/solid-router/src/Matches.tsx @@ -1,6 +1,7 @@ import * as Solid from 'solid-js' import warning from 'tiny-warning' -import { isServer, rootRouteId } from '@tanstack/router-core' +import { rootRouteId } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { CatchBoundary, ErrorComponent } from './CatchBoundary' import { useRouterState } from './useRouterState' import { useRouter } from './useRouter' diff --git a/packages/solid-router/src/ScriptOnce.tsx b/packages/solid-router/src/ScriptOnce.tsx index 703acf4015..a0981a26ba 100644 --- a/packages/solid-router/src/ScriptOnce.tsx +++ b/packages/solid-router/src/ScriptOnce.tsx @@ -1,4 +1,4 @@ -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' export function ScriptOnce({ diff --git a/packages/solid-router/src/Transitioner.tsx b/packages/solid-router/src/Transitioner.tsx index e6ed2937de..c061d769d4 100644 --- a/packages/solid-router/src/Transitioner.tsx +++ b/packages/solid-router/src/Transitioner.tsx @@ -2,9 +2,9 @@ import * as Solid from 'solid-js' import { getLocationChangeInfo, handleHashScroll, - isServer, trimPathRight, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import { useRouterState } from './useRouterState' import { usePrevious } from './utils' diff --git a/packages/solid-router/src/scroll-restoration.tsx b/packages/solid-router/src/scroll-restoration.tsx index 8a88e9a671..f8c3c4559a 100644 --- a/packages/solid-router/src/scroll-restoration.tsx +++ b/packages/solid-router/src/scroll-restoration.tsx @@ -1,10 +1,10 @@ import { defaultGetScrollRestorationKey, escapeHtml, - isServer, restoreScroll, storageKey, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import { ScriptOnce } from './ScriptOnce' diff --git a/packages/vue-router/src/Asset.tsx b/packages/vue-router/src/Asset.tsx index d30ec2cf6d..80f61398f9 100644 --- a/packages/vue-router/src/Asset.tsx +++ b/packages/vue-router/src/Asset.tsx @@ -1,5 +1,5 @@ import * as Vue from 'vue' -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import type { RouterManagedTag } from '@tanstack/router-core' diff --git a/packages/vue-router/src/Match.tsx b/packages/vue-router/src/Match.tsx index 1933c0b5ee..4156611a59 100644 --- a/packages/vue-router/src/Match.tsx +++ b/packages/vue-router/src/Match.tsx @@ -6,9 +6,9 @@ import { getLocationChangeInfo, isNotFound, isRedirect, - isServer, rootRouteId, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { CatchBoundary, ErrorComponent } from './CatchBoundary' import { ClientOnly } from './ClientOnly' import { useRouterState } from './useRouterState' diff --git a/packages/vue-router/src/Matches.tsx b/packages/vue-router/src/Matches.tsx index 9fefac59a7..1335447621 100644 --- a/packages/vue-router/src/Matches.tsx +++ b/packages/vue-router/src/Matches.tsx @@ -1,6 +1,6 @@ import * as Vue from 'vue' import warning from 'tiny-warning' -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { CatchBoundary } from './CatchBoundary' import { useRouterState } from './useRouterState' import { useRouter } from './useRouter' diff --git a/packages/vue-router/src/ScriptOnce.tsx b/packages/vue-router/src/ScriptOnce.tsx index 1d63983b65..2d8e0cfa2c 100644 --- a/packages/vue-router/src/ScriptOnce.tsx +++ b/packages/vue-router/src/ScriptOnce.tsx @@ -1,5 +1,5 @@ import * as Vue from 'vue' -import { isServer } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' export const ScriptOnce = Vue.defineComponent({ diff --git a/packages/vue-router/src/Transitioner.tsx b/packages/vue-router/src/Transitioner.tsx index 88c8ac28a5..90f807ca75 100644 --- a/packages/vue-router/src/Transitioner.tsx +++ b/packages/vue-router/src/Transitioner.tsx @@ -2,9 +2,9 @@ import * as Vue from 'vue' import { getLocationChangeInfo, handleHashScroll, - isServer, trimPathRight, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import { useRouterState } from './useRouterState' import { usePrevious } from './utils' diff --git a/packages/vue-router/src/scroll-restoration.tsx b/packages/vue-router/src/scroll-restoration.tsx index 8a4570f2c6..156bc0a93e 100644 --- a/packages/vue-router/src/scroll-restoration.tsx +++ b/packages/vue-router/src/scroll-restoration.tsx @@ -2,10 +2,10 @@ import * as Vue from 'vue' import { defaultGetScrollRestorationKey, escapeHtml, - isServer, restoreScroll, storageKey, } from '@tanstack/router-core' +import { isServer } from '@tanstack/router-core/isServer' import { useRouter } from './useRouter' import { ScriptOnce } from './ScriptOnce'