Files
lobehub__lobehub/apps/cli/tsdown.config.ts
Arvin Xu 9dfe9242ec 🐛 fix(cli): keep workspace packages inside the embedded CLI bundle (#19391)
The desktop app builds `apps/cli` from the workspace it installs at
`apps/desktop`. pnpm 12 writes those out-of-root member links with two extra
`../` segments, so `apps/cli/node_modules/@lobechat/device-control` and
`@lobechat/device-identity` dangle. Rolldown only warns, marks both imports
external and reports a successful build, so canary 2.2.17-canary.18 onwards
shipped a `lobe-cli.js` that dies at startup with
`ERR_MODULE_NOT_FOUND: @lobechat/device-control`, even for `--version`.

Repair the dangling links before bundling, and turn an unresolved import into
a build failure so a broken bundle can never ship silently again.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 18:21:46 +08:00

43 lines
1.6 KiB
TypeScript

import { defineConfig } from 'tsdown';
export default defineConfig({
banner: { js: '#!/usr/bin/env node' },
clean: true,
deps: {
// The desktop app executes this bundle directly from Resources/bin, where
// the published package's node_modules tree does not exist. Keep the only
// production dependency inside the bundle so the embedded CLI is truly
// self-contained instead of failing at startup with ERR_MODULE_NOT_FOUND.
alwaysBundle: ['ws'],
},
entry: ['src/index.ts'],
fixedExtension: false,
format: ['esm'],
inputOptions(options) {
// Rolldown downgrades an unresolvable import to an external dependency and
// still reports a successful build, so a workspace package that fails to
// resolve (a broken `node_modules` link, a renamed package) silently ships
// a bundle that dies at startup with ERR_MODULE_NOT_FOUND. Nothing the CLI
// imports is expected to be external, so treat it as a build failure.
options.onLog = (level, log, defaultHandler) => {
if (log.code === 'UNRESOLVED_IMPORT') {
throw new Error(
`Unresolved import in the CLI bundle: ${log.message}. The embedded CLI has no node_modules at runtime, so every import must be bundled.`,
);
}
defaultHandler(level, log);
};
return options;
},
minify: !!process.env.MINIFY,
outputOptions: {
codeSplitting: false,
},
platform: 'node',
// Matches the `engines.node` floor: reading a compressed trace snapshot needs
// `node:zlib` zstd, which lands in 22.15. Node 20 went EOL in April 2026.
target: 'node22',
});