From dea71c83968d03d3f892a2009d62823179a0ca57 Mon Sep 17 00:00:00 2001 From: Lacy <62432348+phoenixtekk@users.noreply.github.com> Date: Sat, 13 Jun 2026 08:04:46 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=AA=9F=20fix:=20Cross-Platform=20Absolute?= =?UTF-8?q?-Path=20Check=20in=20tsdown=20neverBundle=20Predicates=20(#1370?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deps.neverBundle predicates in the four package tsdown configs detect first-party (resolved) module ids with !id.startsWith('/'). On Windows, resolved ids are absolute paths like C:\..., which never match, so every project module is externalized. Builds still exit 0 but emit near-empty bundles — e.g. packages/client dist/index.mjs drops from ~276 kB to ~2.7 kB and dist/style.css is never produced, breaking the client dev server with "Failed to resolve import @librechat/client/style.css". Replace the startsWith('/') check with path.isAbsolute(id), which is behavior-identical on POSIX and correct on Windows. Co-authored-by: phoenixtekk Co-authored-by: Claude Fable 5 --- packages/api/tsdown.config.mjs | 3 ++- packages/client/tsdown.config.mjs | 3 ++- packages/data-provider/tsdown.config.mjs | 3 ++- packages/data-schemas/tsdown.config.mjs | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/api/tsdown.config.mjs b/packages/api/tsdown.config.mjs index 67a8c12136..3a4202e9ec 100644 --- a/packages/api/tsdown.config.mjs +++ b/packages/api/tsdown.config.mjs @@ -1,3 +1,4 @@ +import path from 'node:path'; import { defineConfig } from 'tsdown'; export default defineConfig({ @@ -15,6 +16,6 @@ export default defineConfig({ // only first-party code: relative imports and the `~/*` tsconfig alias (-> src). // `neverBundle` is the 0.22 replacement for the deprecated `external` option. deps: { - neverBundle: (id) => !id.startsWith('.') && !id.startsWith('~') && !id.startsWith('/'), + neverBundle: (id) => !id.startsWith('.') && !id.startsWith('~') && !path.isAbsolute(id), }, }); diff --git a/packages/client/tsdown.config.mjs b/packages/client/tsdown.config.mjs index cbb178a929..a027189ce6 100644 --- a/packages/client/tsdown.config.mjs +++ b/packages/client/tsdown.config.mjs @@ -1,3 +1,4 @@ +import path from 'node:path'; import { defineConfig } from 'tsdown'; // Mirror the prior Rollup `@rollup/plugin-replace` substitutions: only these three are @@ -26,7 +27,7 @@ export default defineConfig({ // Externalize every third-party import (consumers provide the peers + react/jsx-runtime); // bundle only relative, `~`-aliased, and absolute sources. deps: { - neverBundle: (id) => !id.startsWith('.') && !id.startsWith('~') && !id.startsWith('/'), + neverBundle: (id) => !id.startsWith('.') && !id.startsWith('~') && !path.isAbsolute(id), onlyBundle: false, }, }); diff --git a/packages/data-provider/tsdown.config.mjs b/packages/data-provider/tsdown.config.mjs index 91c1497a15..a870e0aa43 100644 --- a/packages/data-provider/tsdown.config.mjs +++ b/packages/data-provider/tsdown.config.mjs @@ -1,3 +1,4 @@ +import path from 'node:path'; import { createRequire } from 'node:module'; import replace from '@rollup/plugin-replace'; import { defineConfig } from 'tsdown'; @@ -20,7 +21,7 @@ export default defineConfig({ // Match the prior Rollup build: bundle nothing third-party. Externalize every // bare import (deps, peers, and node built-ins like `crypto`); bundle only the // package's own relative/aliased modules. - neverBundle: (id) => !id.startsWith('.') && !id.startsWith('/') && !id.startsWith('src/'), + neverBundle: (id) => !id.startsWith('.') && !path.isAbsolute(id) && !id.startsWith('src/'), onlyBundle: false, }, plugins: [ diff --git a/packages/data-schemas/tsdown.config.mjs b/packages/data-schemas/tsdown.config.mjs index 0159c4ab94..1b6923ce66 100644 --- a/packages/data-schemas/tsdown.config.mjs +++ b/packages/data-schemas/tsdown.config.mjs @@ -1,3 +1,4 @@ +import path from 'node:path'; import { defineConfig } from 'tsdown'; export default defineConfig({ @@ -16,7 +17,7 @@ export default defineConfig({ !id.startsWith('dotenv/') && !id.startsWith('.') && !id.startsWith('~') && - !id.startsWith('/'), + !path.isAbsolute(id), // dotenv is bundled on purpose, so silence the "detected dependencies in bundle" hint. onlyBundle: false, },