diff --git a/.changeset/fix-6982-duck-type-runnable-dev-env.md b/.changeset/fix-6982-duck-type-runnable-dev-env.md new file mode 100644 index 00000000000..488ba253b43 --- /dev/null +++ b/.changeset/fix-6982-duck-type-runnable-dev-env.md @@ -0,0 +1,5 @@ +--- +'@tanstack/start-plugin-core': patch +--- + +fix(start-plugin-core): replace isRunnableDevEnvironment instanceof check with duck-typing to avoid dual-package hazard when vite is aliased (e.g. vite-plus pnpm override) diff --git a/packages/start-plugin-core/src/dev-server-plugin/plugin.ts b/packages/start-plugin-core/src/dev-server-plugin/plugin.ts index d507998109c..0189b03e6b4 100644 --- a/packages/start-plugin-core/src/dev-server-plugin/plugin.ts +++ b/packages/start-plugin-core/src/dev-server-plugin/plugin.ts @@ -1,4 +1,3 @@ -import { isRunnableDevEnvironment } from 'vite' import { VIRTUAL_MODULES } from '@tanstack/start-server-core' import { NodeRequest, sendNodeResponse } from 'srvx/node' import { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from '../constants' @@ -9,7 +8,12 @@ import { collectDevStyles, normalizeCssModuleCacheKey, } from './dev-styles' -import type { Connect, DevEnvironment, PluginOption } from 'vite' +import type { + Connect, + DevEnvironment, + PluginOption, + RunnableDevEnvironment, +} from 'vite' import type { GetConfigFn } from '../types' export function devServerPlugin({ @@ -145,7 +149,9 @@ export function devServerPlugin({ // do not install middleware if SSR env in case another plugin already did if ( - !isRunnableDevEnvironment(serverEnv) || + // Use duck-type check instead of instanceof/isRunnableDevEnvironment to avoid + // dual-package hazard when vite is aliased (e.g. vite-plus pnpm override) + !('runner' in serverEnv) || // do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks) 'dispatchFetch' in serverEnv ) { @@ -153,7 +159,7 @@ export function devServerPlugin({ } } - if (!isRunnableDevEnvironment(serverEnv)) { + if (!('runner' in serverEnv)) { throw new Error( 'cannot install vite dev server middleware for TanStack Start since the SSR environment is not a RunnableDevEnvironment', ) @@ -175,9 +181,9 @@ export function devServerPlugin({ * fetch(req: Request): Promise * } */ - const serverEntry = await serverEnv.runner.import( - ENTRY_POINTS.server, - ) + const serverEntry = await ( + serverEnv as RunnableDevEnvironment + ).runner.import(ENTRY_POINTS.server) const webRes = await serverEntry['default'].fetch(webReq) return sendNodeResponse(res, webRes)