@tanstack/start-plugin-core 1.167.0 → 1.167.2

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.
@@ -1,4 +1,4 @@
1
- import { bundlerOptionsKey, getBundlerOptions } from "./utils.js";
1
+ import { getBundlerOptions } from "./utils.js";
2
2
  import { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from "./constants.js";
3
3
  import { startManifestPlugin } from "./start-manifest-plugin/plugin.js";
4
4
  import { tanStackStartRouter } from "./start-router-plugin/plugin.js";
@@ -156,10 +156,14 @@ function TanStackStartVitePluginCore(corePluginOpts, startPluginOpts) {
156
156
  environments: {
157
157
  [VITE_ENVIRONMENT_NAMES.client]: {
158
158
  consumer: "client",
159
- build: {
160
- [bundlerOptionsKey]: { input: { main: ENTRY_POINTS.client } },
161
- outDir: getClientOutputDirectory(viteConfig)
162
- },
159
+ build: (() => {
160
+ const bundlerOptions = { input: { main: ENTRY_POINTS.client } };
161
+ return {
162
+ rollupOptions: bundlerOptions,
163
+ rolldownOptions: bundlerOptions,
164
+ outDir: getClientOutputDirectory(viteConfig)
165
+ };
166
+ })(),
163
167
  optimizeDeps: {
164
168
  exclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,
165
169
  entries: [clientAlias, routerAlias].map((entry) => escapePath(entry))
@@ -169,7 +173,13 @@ function TanStackStartVitePluginCore(corePluginOpts, startPluginOpts) {
169
173
  consumer: "server",
170
174
  build: {
171
175
  ssr: true,
172
- [bundlerOptionsKey]: { input: getBundlerOptions(viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]?.build)?.input ?? serverAlias },
176
+ ...(() => {
177
+ const bundlerOptions = { input: getBundlerOptions(viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]?.build)?.input ?? serverAlias };
178
+ return {
179
+ rollupOptions: bundlerOptions,
180
+ rolldownOptions: bundlerOptions
181
+ };
182
+ })(),
173
183
  outDir: getServerOutputDirectory(viteConfig),
174
184
  commonjsOptions: { include: [/node_modules/] },
175
185
  copyPublicDir: viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]?.build?.copyPublicDir ?? false
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../src/plugin.ts"],"sourcesContent":["import { joinPaths } from '@tanstack/router-core'\nimport * as vite from 'vite'\nimport { crawlFrameworkPkgs } from 'vitefu'\nimport { join } from 'pathe'\nimport { escapePath } from 'tinyglobby'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from './constants'\nimport { bundlerOptionsKey, getBundlerOptions } from './utils'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport { parseStartConfig } from './schema'\nimport { resolveEntry } from './resolve-entries'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { importProtectionPlugin } from './import-protection-plugin/plugin'\nimport type {\n GetConfigFn,\n ResolvedStartConfig,\n TanStackStartVitePluginCoreOptions,\n} from './types'\nimport type { ViteEnvironmentNames } from './constants'\nimport type {\n TanStackStartInputConfig,\n TanStackStartOutputConfig,\n} from './schema'\nimport type { PluginOption } from 'vite'\n\nfunction isFullUrl(str: string): boolean {\n try {\n new URL(str)\n return true\n } catch {\n return false\n }\n}\n\nexport function TanStackStartVitePluginCore(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartInputConfig,\n): Array<PluginOption> {\n // Determine the provider environment for server functions\n // If providerEnv is set, use that; otherwise default to SSR as the provider\n const serverFnProviderEnv =\n corePluginOpts.serverFn?.providerEnv || VITE_ENVIRONMENT_NAMES.server\n const ssrIsProvider = serverFnProviderEnv === VITE_ENVIRONMENT_NAMES.server\n\n const resolvedStartConfig: ResolvedStartConfig = {\n root: '',\n startFilePath: undefined,\n routerFilePath: '',\n srcDirectory: '',\n viteAppBase: '',\n serverFnProviderEnv,\n }\n\n let startConfig: TanStackStartOutputConfig | null\n const getConfig: GetConfigFn = () => {\n if (!resolvedStartConfig.root) {\n throw new Error(`Cannot get config before root is resolved`)\n }\n if (!startConfig) {\n startConfig = parseStartConfig(\n startPluginOpts,\n corePluginOpts,\n resolvedStartConfig.root,\n )\n }\n return { startConfig, resolvedStartConfig, corePluginOpts }\n }\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const capturedBundle: Partial<\n Record<ViteEnvironmentNames, vite.Rollup.OutputBundle>\n > = {}\n\n function getBundle(envName: ViteEnvironmentNames): vite.Rollup.OutputBundle {\n const bundle = capturedBundle[envName]\n if (!bundle) {\n throw new Error(`No bundle captured for environment: ${envName}`)\n }\n return bundle\n }\n\n const environments: Array<{ name: string; type: 'client' | 'server' }> = [\n { name: VITE_ENVIRONMENT_NAMES.client, type: 'client' },\n { name: VITE_ENVIRONMENT_NAMES.server, type: 'server' },\n ]\n if (\n corePluginOpts.serverFn?.providerEnv &&\n !environments.find((e) => e.name === corePluginOpts.serverFn?.providerEnv)\n ) {\n environments.push({\n name: corePluginOpts.serverFn.providerEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n resolvedStartConfig.viteAppBase = viteConfig.base ?? '/'\n if (!isFullUrl(resolvedStartConfig.viteAppBase)) {\n resolvedStartConfig.viteAppBase = joinPaths([\n '/',\n viteConfig.base,\n '/',\n ])\n }\n const root = viteConfig.root || process.cwd()\n resolvedStartConfig.root = root\n\n const { startConfig } = getConfig()\n if (startConfig.router.basepath === undefined) {\n if (!isFullUrl(resolvedStartConfig.viteAppBase)) {\n startConfig.router.basepath =\n resolvedStartConfig.viteAppBase.replace(/^\\/|\\/$/g, '')\n } else {\n startConfig.router.basepath = '/'\n }\n } else {\n if (command === 'serve' && !viteConfig.server?.middlewareMode) {\n // when serving, we must ensure that router basepath and viteAppBase are aligned\n if (\n !joinPaths(['/', startConfig.router.basepath, '/']).startsWith(\n joinPaths(['/', resolvedStartConfig.viteAppBase, '/']),\n )\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n }\n }\n\n const TSS_SERVER_FN_BASE = joinPaths([\n '/',\n startConfig.router.basepath,\n startConfig.serverFns.base,\n '/',\n ])\n const resolvedSrcDirectory = join(root, startConfig.srcDirectory)\n resolvedStartConfig.srcDirectory = resolvedSrcDirectory\n\n const startFilePath = resolveEntry({\n type: 'start entry',\n configuredEntry: startConfig.start.entry,\n defaultEntry: 'start',\n resolvedSrcDirectory,\n required: false,\n })\n resolvedStartConfig.startFilePath = startFilePath\n\n const routerFilePath = resolveEntry({\n type: 'router entry',\n configuredEntry: startConfig.router.entry,\n defaultEntry: 'router',\n resolvedSrcDirectory,\n required: true,\n })\n resolvedStartConfig.routerFilePath = routerFilePath\n\n const clientEntryPath = resolveEntry({\n type: 'client entry',\n configuredEntry: startConfig.client.entry,\n defaultEntry: 'client',\n resolvedSrcDirectory,\n required: false,\n })\n\n const serverEntryPath = resolveEntry({\n type: 'server entry',\n configuredEntry: startConfig.server.entry,\n defaultEntry: 'server',\n resolvedSrcDirectory,\n required: false,\n })\n\n const clientAlias = vite.normalizePath(\n clientEntryPath ?? corePluginOpts.defaultEntryPaths.client,\n )\n const serverAlias = vite.normalizePath(\n serverEntryPath ?? corePluginOpts.defaultEntryPaths.server,\n )\n const startAlias = vite.normalizePath(\n startFilePath ?? corePluginOpts.defaultEntryPaths.start,\n )\n const routerAlias = vite.normalizePath(routerFilePath)\n\n const entryAliasConfiguration: Record<\n (typeof ENTRY_POINTS)[keyof typeof ENTRY_POINTS],\n string\n > = {\n [ENTRY_POINTS.client]: clientAlias,\n [ENTRY_POINTS.server]: serverAlias,\n [ENTRY_POINTS.start]: startAlias,\n [ENTRY_POINTS.router]: routerAlias,\n }\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n [bundlerOptionsKey]: {\n input: {\n main: ENTRY_POINTS.client,\n },\n },\n outDir: getClientOutputDirectory(viteConfig),\n },\n optimizeDeps: {\n exclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n // Ensure user code can be crawled for dependencies\n entries: [clientAlias, routerAlias].map((entry) =>\n // Entries are treated as `tinyglobby` patterns so need to be escaped\n escapePath(entry),\n ),\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n [bundlerOptionsKey]: {\n input:\n getBundlerOptions(\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build,\n )?.input ?? serverAlias,\n },\n outDir: getServerOutputDirectory(viteConfig),\n commonjsOptions: {\n include: [/node_modules/],\n },\n copyPublicDir:\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build?.copyPublicDir ?? false,\n },\n optimizeDeps: {\n // Ensure user code can be crawled for dependencies\n entries: [serverAlias, startAlias, routerAlias].map((entry) =>\n // Entries are treated as `tinyglobby` patterns so need to be escaped\n escapePath(entry),\n ),\n },\n },\n },\n\n resolve: {\n noExternal: [\n // ENTRY_POINTS.start,\n '@tanstack/start**',\n `@tanstack/${corePluginOpts.framework}-start**`,\n ...crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n ],\n alias: {\n ...entryAliasConfiguration,\n },\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', TSS_SERVER_FN_BASE),\n ...defineReplaceEnv('TSS_ROUTER_BASEPATH', startConfig.router.basepath),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n ...defineReplaceEnv('TSS_DEV_SERVER', command === 'serve' ? 'true' : 'false'),\n // Dev SSR styles: enabled flag and basepath (defaults to vite base for asset URL alignment)\n ...defineReplaceEnv('TSS_DEV_SSR_STYLES_ENABLED', startConfig.dev.ssrStyles.enabled ? 'true' : 'false'),\n ...defineReplaceEnv('TSS_DEV_SSR_STYLES_BASEPATH', startConfig.dev.ssrStyles.basepath ?? resolvedStartConfig.viteAppBase),\n // Replace NODE_ENV during build (unless opted out) for dead code elimination in server bundles\n ...(command === 'build' && startConfig.server.build.staticNodeEnv ? {\n 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || viteConfig.mode || 'production'),\n } : {}),\n },\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const client = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const server = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!client) {\n throw new Error('Client environment not found')\n }\n\n if (!server) {\n throw new Error('SSR environment not found')\n }\n\n if (!client.isBuilt) {\n // Build the client bundle first\n await builder.build(client)\n }\n if (!server.isBuilt) {\n // Build the SSR bundle\n await builder.build(server)\n }\n\n // If a custom provider environment is configured (not SSR),\n // build it last so the manifest includes functions from all environments\n if (!ssrIsProvider) {\n const providerEnv = builder.environments[serverFnProviderEnv]\n if (!providerEnv) {\n throw new Error(\n `Provider environment \"${serverFnProviderEnv}\" not found`,\n )\n }\n if (!providerEnv.isBuilt) {\n // Build the provider environment last\n // This ensures all server functions are discovered from client/ssr builds\n await builder.build(providerEnv)\n }\n }\n },\n },\n }\n },\n },\n // Separate plugin for buildApp hook with enforce: 'post'\n // This ensures proper ordering with other plugins that also have\n // buildApp hooks with order: 'post'. The enforce: 'post' ensures this\n // runs after other plugins (like Nitro) complete their builds.\n {\n name: 'tanstack-start-core:post-build',\n enforce: 'post',\n buildApp: {\n order: 'post',\n async handler(builder) {\n const { startConfig } = getConfig()\n await postServerBuild({ builder, startConfig })\n },\n },\n },\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId: startPluginOpts?.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(startPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n startManifestPlugin({\n getClientBundle: () => getBundle(VITE_ENVIRONMENT_NAMES.client),\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n {\n name: 'tanstack-start-core:dev-base-rewrite',\n configureServer(server) {\n if (!needsDevBaseRewrite) {\n return\n }\n const basePrefix = resolvedStartConfig.viteAppBase.replace(/\\/$/, '')\n server.middlewares.use((req, _res, next) => {\n if (req.url && !req.url.startsWith(basePrefix)) {\n req.url = basePrefix + req.url\n }\n next()\n })\n },\n },\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled: startPluginOpts?.dev?.ssrStyles?.enabled ?? true,\n }),\n previewServerPlugin(),\n {\n name: 'tanstack-start:core:capture-bundle',\n applyToEnvironment(e) {\n return (\n e.name === VITE_ENVIRONMENT_NAMES.client ||\n e.name === VITE_ENVIRONMENT_NAMES.server\n )\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n const environment = this.environment.name as ViteEnvironmentNames\n if (!Object.values(VITE_ENVIRONMENT_NAMES).includes(environment)) {\n throw new Error(`Unknown environment: ${environment}`)\n }\n capturedBundle[environment] = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../src/plugin.ts"],"sourcesContent":["import { joinPaths } from '@tanstack/router-core'\nimport * as vite from 'vite'\nimport { crawlFrameworkPkgs } from 'vitefu'\nimport { join } from 'pathe'\nimport { escapePath } from 'tinyglobby'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from './constants'\nimport { getBundlerOptions } from './utils'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport { parseStartConfig } from './schema'\nimport { resolveEntry } from './resolve-entries'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { importProtectionPlugin } from './import-protection-plugin/plugin'\nimport type {\n GetConfigFn,\n ResolvedStartConfig,\n TanStackStartVitePluginCoreOptions,\n} from './types'\nimport type { ViteEnvironmentNames } from './constants'\nimport type {\n TanStackStartInputConfig,\n TanStackStartOutputConfig,\n} from './schema'\nimport type { PluginOption } from 'vite'\n\nfunction isFullUrl(str: string): boolean {\n try {\n new URL(str)\n return true\n } catch {\n return false\n }\n}\n\nexport function TanStackStartVitePluginCore(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartInputConfig,\n): Array<PluginOption> {\n // Determine the provider environment for server functions\n // If providerEnv is set, use that; otherwise default to SSR as the provider\n const serverFnProviderEnv =\n corePluginOpts.serverFn?.providerEnv || VITE_ENVIRONMENT_NAMES.server\n const ssrIsProvider = serverFnProviderEnv === VITE_ENVIRONMENT_NAMES.server\n\n const resolvedStartConfig: ResolvedStartConfig = {\n root: '',\n startFilePath: undefined,\n routerFilePath: '',\n srcDirectory: '',\n viteAppBase: '',\n serverFnProviderEnv,\n }\n\n let startConfig: TanStackStartOutputConfig | null\n const getConfig: GetConfigFn = () => {\n if (!resolvedStartConfig.root) {\n throw new Error(`Cannot get config before root is resolved`)\n }\n if (!startConfig) {\n startConfig = parseStartConfig(\n startPluginOpts,\n corePluginOpts,\n resolvedStartConfig.root,\n )\n }\n return { startConfig, resolvedStartConfig, corePluginOpts }\n }\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const capturedBundle: Partial<\n Record<ViteEnvironmentNames, vite.Rollup.OutputBundle>\n > = {}\n\n function getBundle(envName: ViteEnvironmentNames): vite.Rollup.OutputBundle {\n const bundle = capturedBundle[envName]\n if (!bundle) {\n throw new Error(`No bundle captured for environment: ${envName}`)\n }\n return bundle\n }\n\n const environments: Array<{ name: string; type: 'client' | 'server' }> = [\n { name: VITE_ENVIRONMENT_NAMES.client, type: 'client' },\n { name: VITE_ENVIRONMENT_NAMES.server, type: 'server' },\n ]\n if (\n corePluginOpts.serverFn?.providerEnv &&\n !environments.find((e) => e.name === corePluginOpts.serverFn?.providerEnv)\n ) {\n environments.push({\n name: corePluginOpts.serverFn.providerEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n resolvedStartConfig.viteAppBase = viteConfig.base ?? '/'\n if (!isFullUrl(resolvedStartConfig.viteAppBase)) {\n resolvedStartConfig.viteAppBase = joinPaths([\n '/',\n viteConfig.base,\n '/',\n ])\n }\n const root = viteConfig.root || process.cwd()\n resolvedStartConfig.root = root\n\n const { startConfig } = getConfig()\n if (startConfig.router.basepath === undefined) {\n if (!isFullUrl(resolvedStartConfig.viteAppBase)) {\n startConfig.router.basepath =\n resolvedStartConfig.viteAppBase.replace(/^\\/|\\/$/g, '')\n } else {\n startConfig.router.basepath = '/'\n }\n } else {\n if (command === 'serve' && !viteConfig.server?.middlewareMode) {\n // when serving, we must ensure that router basepath and viteAppBase are aligned\n if (\n !joinPaths(['/', startConfig.router.basepath, '/']).startsWith(\n joinPaths(['/', resolvedStartConfig.viteAppBase, '/']),\n )\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n }\n }\n\n const TSS_SERVER_FN_BASE = joinPaths([\n '/',\n startConfig.router.basepath,\n startConfig.serverFns.base,\n '/',\n ])\n const resolvedSrcDirectory = join(root, startConfig.srcDirectory)\n resolvedStartConfig.srcDirectory = resolvedSrcDirectory\n\n const startFilePath = resolveEntry({\n type: 'start entry',\n configuredEntry: startConfig.start.entry,\n defaultEntry: 'start',\n resolvedSrcDirectory,\n required: false,\n })\n resolvedStartConfig.startFilePath = startFilePath\n\n const routerFilePath = resolveEntry({\n type: 'router entry',\n configuredEntry: startConfig.router.entry,\n defaultEntry: 'router',\n resolvedSrcDirectory,\n required: true,\n })\n resolvedStartConfig.routerFilePath = routerFilePath\n\n const clientEntryPath = resolveEntry({\n type: 'client entry',\n configuredEntry: startConfig.client.entry,\n defaultEntry: 'client',\n resolvedSrcDirectory,\n required: false,\n })\n\n const serverEntryPath = resolveEntry({\n type: 'server entry',\n configuredEntry: startConfig.server.entry,\n defaultEntry: 'server',\n resolvedSrcDirectory,\n required: false,\n })\n\n const clientAlias = vite.normalizePath(\n clientEntryPath ?? corePluginOpts.defaultEntryPaths.client,\n )\n const serverAlias = vite.normalizePath(\n serverEntryPath ?? corePluginOpts.defaultEntryPaths.server,\n )\n const startAlias = vite.normalizePath(\n startFilePath ?? corePluginOpts.defaultEntryPaths.start,\n )\n const routerAlias = vite.normalizePath(routerFilePath)\n\n const entryAliasConfiguration: Record<\n (typeof ENTRY_POINTS)[keyof typeof ENTRY_POINTS],\n string\n > = {\n [ENTRY_POINTS.client]: clientAlias,\n [ENTRY_POINTS.server]: serverAlias,\n [ENTRY_POINTS.start]: startAlias,\n [ENTRY_POINTS.router]: routerAlias,\n }\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: (() => {\n // Use the same object reference for both keys to avoid\n // Vite 8's deprecation warning when both are present.\n // Vite 7 reads rollupOptions, Vite 8 reads rolldownOptions.\n const bundlerOptions = {\n input: {\n main: ENTRY_POINTS.client,\n },\n }\n return {\n rollupOptions: bundlerOptions,\n rolldownOptions: bundlerOptions,\n outDir: getClientOutputDirectory(viteConfig),\n }\n })(),\n optimizeDeps: {\n exclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n // Ensure user code can be crawled for dependencies\n entries: [clientAlias, routerAlias].map((entry) =>\n // Entries are treated as `tinyglobby` patterns so need to be escaped\n escapePath(entry),\n ),\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n ...(() => {\n const bundlerOptions = {\n input:\n getBundlerOptions(\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build,\n )?.input ?? serverAlias,\n }\n return {\n rollupOptions: bundlerOptions,\n rolldownOptions: bundlerOptions,\n }\n })(),\n outDir: getServerOutputDirectory(viteConfig),\n commonjsOptions: {\n include: [/node_modules/],\n },\n copyPublicDir:\n viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]\n ?.build?.copyPublicDir ?? false,\n },\n optimizeDeps: {\n // Ensure user code can be crawled for dependencies\n entries: [serverAlias, startAlias, routerAlias].map((entry) =>\n // Entries are treated as `tinyglobby` patterns so need to be escaped\n escapePath(entry),\n ),\n },\n },\n },\n\n resolve: {\n noExternal: [\n // ENTRY_POINTS.start,\n '@tanstack/start**',\n `@tanstack/${corePluginOpts.framework}-start**`,\n ...crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n ],\n alias: {\n ...entryAliasConfiguration,\n },\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', TSS_SERVER_FN_BASE),\n ...defineReplaceEnv('TSS_ROUTER_BASEPATH', startConfig.router.basepath),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n ...defineReplaceEnv('TSS_DEV_SERVER', command === 'serve' ? 'true' : 'false'),\n // Dev SSR styles: enabled flag and basepath (defaults to vite base for asset URL alignment)\n ...defineReplaceEnv('TSS_DEV_SSR_STYLES_ENABLED', startConfig.dev.ssrStyles.enabled ? 'true' : 'false'),\n ...defineReplaceEnv('TSS_DEV_SSR_STYLES_BASEPATH', startConfig.dev.ssrStyles.basepath ?? resolvedStartConfig.viteAppBase),\n // Replace NODE_ENV during build (unless opted out) for dead code elimination in server bundles\n ...(command === 'build' && startConfig.server.build.staticNodeEnv ? {\n 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || viteConfig.mode || 'production'),\n } : {}),\n },\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const client = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const server = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!client) {\n throw new Error('Client environment not found')\n }\n\n if (!server) {\n throw new Error('SSR environment not found')\n }\n\n if (!client.isBuilt) {\n // Build the client bundle first\n await builder.build(client)\n }\n if (!server.isBuilt) {\n // Build the SSR bundle\n await builder.build(server)\n }\n\n // If a custom provider environment is configured (not SSR),\n // build it last so the manifest includes functions from all environments\n if (!ssrIsProvider) {\n const providerEnv = builder.environments[serverFnProviderEnv]\n if (!providerEnv) {\n throw new Error(\n `Provider environment \"${serverFnProviderEnv}\" not found`,\n )\n }\n if (!providerEnv.isBuilt) {\n // Build the provider environment last\n // This ensures all server functions are discovered from client/ssr builds\n await builder.build(providerEnv)\n }\n }\n },\n },\n }\n },\n },\n // Separate plugin for buildApp hook with enforce: 'post'\n // This ensures proper ordering with other plugins that also have\n // buildApp hooks with order: 'post'. The enforce: 'post' ensures this\n // runs after other plugins (like Nitro) complete their builds.\n {\n name: 'tanstack-start-core:post-build',\n enforce: 'post',\n buildApp: {\n order: 'post',\n async handler(builder) {\n const { startConfig } = getConfig()\n await postServerBuild({ builder, startConfig })\n },\n },\n },\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId: startPluginOpts?.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(startPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n startManifestPlugin({\n getClientBundle: () => getBundle(VITE_ENVIRONMENT_NAMES.client),\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n {\n name: 'tanstack-start-core:dev-base-rewrite',\n configureServer(server) {\n if (!needsDevBaseRewrite) {\n return\n }\n const basePrefix = resolvedStartConfig.viteAppBase.replace(/\\/$/, '')\n server.middlewares.use((req, _res, next) => {\n if (req.url && !req.url.startsWith(basePrefix)) {\n req.url = basePrefix + req.url\n }\n next()\n })\n },\n },\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled: startPluginOpts?.dev?.ssrStyles?.enabled ?? true,\n }),\n previewServerPlugin(),\n {\n name: 'tanstack-start:core:capture-bundle',\n applyToEnvironment(e) {\n return (\n e.name === VITE_ENVIRONMENT_NAMES.client ||\n e.name === VITE_ENVIRONMENT_NAMES.server\n )\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n const environment = this.environment.name as ViteEnvironmentNames\n if (!Object.values(VITE_ENVIRONMENT_NAMES).includes(environment)) {\n throw new Error(`Unknown environment: ${environment}`)\n }\n capturedBundle[environment] = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n"],"mappings":"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"}
@@ -1,10 +1,3 @@
1
- /**
2
- * Vite 8+ uses Rolldown instead of Rollup, renaming `build.rollupOptions`
3
- * to `build.rolldownOptions`. Detect which bundler is in use.
4
- */
5
- export declare const isRolldown: boolean;
6
- /** Returns `'rolldownOptions'` when using Rolldown, `'rollupOptions'` otherwise. */
7
- export declare const bundlerOptionsKey: string;
8
1
  /** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */
9
2
  export declare function getBundlerOptions(build: any): any;
10
3
  export declare function resolveViteId(id: string): string;
package/dist/esm/utils.js CHANGED
@@ -1,6 +1,4 @@
1
- import * as vite from "vite";
2
- /** Returns `'rolldownOptions'` when using Rolldown, `'rollupOptions'` otherwise. */
3
- var bundlerOptionsKey = "rolldownVersion" in vite ? "rolldownOptions" : "rollupOptions";
1
+ //#region src/utils.ts
4
2
  /** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */
5
3
  function getBundlerOptions(build) {
6
4
  return build?.rolldownOptions ?? build?.rollupOptions;
@@ -19,6 +17,6 @@ function createLogger(prefix) {
19
17
  };
20
18
  }
21
19
  //#endregion
22
- export { bundlerOptionsKey, createLogger, getBundlerOptions, resolveViteId };
20
+ export { createLogger, getBundlerOptions, resolveViteId };
23
21
 
24
22
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import * as vite from 'vite'\n\n/**\n * Vite 8+ uses Rolldown instead of Rollup, renaming `build.rollupOptions`\n * to `build.rolldownOptions`. Detect which bundler is in use.\n */\nexport const isRolldown = 'rolldownVersion' in vite\n\n/** Returns `'rolldownOptions'` when using Rolldown, `'rollupOptions'` otherwise. */\nexport const bundlerOptionsKey = isRolldown\n ? 'rolldownOptions'\n : 'rollupOptions'\n\n/** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */\nexport function getBundlerOptions(build: any): any {\n return build?.rolldownOptions ?? build?.rollupOptions\n}\n\nexport function resolveViteId(id: string) {\n return `\\0${id}`\n}\n\nexport function createLogger(prefix: string) {\n const label = `[${prefix}]`\n return {\n log: (...args: any) => console.log(label, ...args),\n debug: (...args: any) => console.debug(label, ...args),\n info: (...args: any) => console.info(label, ...args),\n warn: (...args: any) => console.warn(label, ...args),\n error: (...args: any) => console.error(label, ...args),\n }\n}\n"],"mappings":";;AASA,IAAa,oBAHa,qBAAqB,OAI3C,oBACA;;AAGJ,SAAgB,kBAAkB,OAAiB;AACjD,QAAO,OAAO,mBAAmB,OAAO;;AAG1C,SAAgB,cAAc,IAAY;AACxC,QAAO,KAAK;;AAGd,SAAgB,aAAa,QAAgB;CAC3C,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAO;EACL,MAAM,GAAG,SAAc,QAAQ,IAAI,OAAO,GAAG,KAAK;EAClD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACtD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACvD"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["/** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */\nexport function getBundlerOptions(build: any): any {\n return build?.rolldownOptions ?? build?.rollupOptions\n}\n\nexport function resolveViteId(id: string) {\n return `\\0${id}`\n}\n\nexport function createLogger(prefix: string) {\n const label = `[${prefix}]`\n return {\n log: (...args: any) => console.log(label, ...args),\n debug: (...args: any) => console.debug(label, ...args),\n info: (...args: any) => console.info(label, ...args),\n warn: (...args: any) => console.warn(label, ...args),\n error: (...args: any) => console.error(label, ...args),\n }\n}\n"],"mappings":";;AACA,SAAgB,kBAAkB,OAAiB;AACjD,QAAO,OAAO,mBAAmB,OAAO;;AAG1C,SAAgB,cAAc,IAAY;AACxC,QAAO,KAAK;;AAGd,SAAgB,aAAa,QAAgB;CAC3C,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAO;EACL,MAAM,GAAG,SAAc,QAAQ,IAAI,OAAO,GAAG,KAAK;EAClD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACtD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACvD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/start-plugin-core",
3
- "version": "1.167.0",
3
+ "version": "1.167.2",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -60,12 +60,12 @@
60
60
  "vitefu": "^1.1.1",
61
61
  "xmlbuilder2": "^4.0.3",
62
62
  "zod": "^3.24.2",
63
- "@tanstack/router-core": "1.167.4",
64
- "@tanstack/router-generator": "1.166.12",
65
- "@tanstack/router-plugin": "1.166.13",
63
+ "@tanstack/router-core": "1.167.5",
64
+ "@tanstack/router-generator": "1.166.13",
65
+ "@tanstack/router-plugin": "1.166.14",
66
+ "@tanstack/start-client-core": "1.166.13",
66
67
  "@tanstack/router-utils": "1.161.6",
67
- "@tanstack/start-client-core": "1.166.12",
68
- "@tanstack/start-server-core": "1.166.12"
68
+ "@tanstack/start-server-core": "1.166.13"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@types/babel__code-frame": "^7.0.6",
package/src/plugin.ts CHANGED
@@ -5,7 +5,7 @@ import { join } from 'pathe'
5
5
  import { escapePath } from 'tinyglobby'
6
6
  import { startManifestPlugin } from './start-manifest-plugin/plugin'
7
7
  import { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from './constants'
8
- import { bundlerOptionsKey, getBundlerOptions } from './utils'
8
+ import { getBundlerOptions } from './utils'
9
9
  import { tanStackStartRouter } from './start-router-plugin/plugin'
10
10
  import { loadEnvPlugin } from './load-env-plugin/plugin'
11
11
  import { devServerPlugin } from './dev-server-plugin/plugin'
@@ -244,14 +244,21 @@ export function TanStackStartVitePluginCore(
244
244
  environments: {
245
245
  [VITE_ENVIRONMENT_NAMES.client]: {
246
246
  consumer: 'client',
247
- build: {
248
- [bundlerOptionsKey]: {
247
+ build: (() => {
248
+ // Use the same object reference for both keys to avoid
249
+ // Vite 8's deprecation warning when both are present.
250
+ // Vite 7 reads rollupOptions, Vite 8 reads rolldownOptions.
251
+ const bundlerOptions = {
249
252
  input: {
250
253
  main: ENTRY_POINTS.client,
251
254
  },
252
- },
253
- outDir: getClientOutputDirectory(viteConfig),
254
- },
255
+ }
256
+ return {
257
+ rollupOptions: bundlerOptions,
258
+ rolldownOptions: bundlerOptions,
259
+ outDir: getClientOutputDirectory(viteConfig),
260
+ }
261
+ })(),
255
262
  optimizeDeps: {
256
263
  exclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,
257
264
  // Ensure user code can be crawled for dependencies
@@ -265,13 +272,19 @@ export function TanStackStartVitePluginCore(
265
272
  consumer: 'server',
266
273
  build: {
267
274
  ssr: true,
268
- [bundlerOptionsKey]: {
269
- input:
270
- getBundlerOptions(
271
- viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]
272
- ?.build,
273
- )?.input ?? serverAlias,
274
- },
275
+ ...(() => {
276
+ const bundlerOptions = {
277
+ input:
278
+ getBundlerOptions(
279
+ viteConfig.environments?.[VITE_ENVIRONMENT_NAMES.server]
280
+ ?.build,
281
+ )?.input ?? serverAlias,
282
+ }
283
+ return {
284
+ rollupOptions: bundlerOptions,
285
+ rolldownOptions: bundlerOptions,
286
+ }
287
+ })(),
275
288
  outDir: getServerOutputDirectory(viteConfig),
276
289
  commonjsOptions: {
277
290
  include: [/node_modules/],
package/src/utils.ts CHANGED
@@ -1,16 +1,3 @@
1
- import * as vite from 'vite'
2
-
3
- /**
4
- * Vite 8+ uses Rolldown instead of Rollup, renaming `build.rollupOptions`
5
- * to `build.rolldownOptions`. Detect which bundler is in use.
6
- */
7
- export const isRolldown = 'rolldownVersion' in vite
8
-
9
- /** Returns `'rolldownOptions'` when using Rolldown, `'rollupOptions'` otherwise. */
10
- export const bundlerOptionsKey = isRolldown
11
- ? 'rolldownOptions'
12
- : 'rollupOptions'
13
-
14
1
  /** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */
15
2
  export function getBundlerOptions(build: any): any {
16
3
  return build?.rolldownOptions ?? build?.rollupOptions