lobehub/vitest.config.mts
Innei aaefe6c0d2
👷 chore(ci): unify CI package manager from bun to pnpm (#13464)
* 👷 chore(ci): unify CI package manager from bun to pnpm

Replace bun with pnpm across all GitHub Actions workflows to ensure
lockfile consistency with pnpm-lock.yaml as single source of truth.

* 👷 chore(ci): replace bun run with pnpm run in package.json scripts

Fix build failure in CI where bun is not installed. Replace bun run
references in root and e2e package.json scripts with pnpm run.

* 👷 chore(e2e): replace bunx with npx in e2e server startup

* 👷 chore(ci): create unified setup-env action, use pnpm install + bun run

- Add .github/actions/setup-env composite action (pnpm + bun + node)
- Refactor desktop-build-setup to use setup-env internally
- All workflows: pnpm install for deps, bun run for scripts
- Revert package.json/e2e scripts back to bun run
- Remove all direct pnpm/action-setup and oven-sh/setup-bun from workflows

* 🐛 fix(test): inline lexical ESM deps for vitest under pnpm

pnpm's strict node_modules layout causes vitest ESM resolution to fail
for lexical's named exports. Add lexical and @lexical/* to inline deps.
2026-04-01 14:08:37 +08:00

128 lines
4.2 KiB
TypeScript

import { dirname, join, resolve } from 'node:path';
import tsconfigPaths from 'vite-tsconfig-paths';
import { coverageConfigDefaults, defineConfig } from 'vitest/config';
const alias = {
'@emoji-mart/data': resolve(__dirname, './tests/mocks/emojiMartData.ts'),
'@emoji-mart/react': resolve(__dirname, './tests/mocks/emojiMartReact.tsx'),
'@/database/_deprecated': resolve(__dirname, './src/database/_deprecated'),
'@/utils/client/switchLang': resolve(__dirname, './src/utils/client/switchLang'),
'@/const/locale': resolve(__dirname, './src/const/locale'),
// TODO: after refactor the errorResponse, we can remove it
'@/utils/errorResponse': resolve(__dirname, './src/utils/errorResponse'),
'@/utils/unzipFile': resolve(__dirname, './src/utils/unzipFile'),
'@/utils/server': resolve(__dirname, './src/utils/server'),
'@/utils/identifier': resolve(__dirname, './src/utils/identifier'),
'@/utils/electron': resolve(__dirname, './src/utils/electron'),
'@/utils/markdownToTxt': resolve(__dirname, './src/utils/markdownToTxt'),
'@/utils/sanitizeFileName': resolve(__dirname, './src/utils/sanitizeFileName'),
'~test-utils': resolve(__dirname, './tests/utils.tsx'),
'lru_map': resolve(__dirname, './tests/mocks/lru_map'),
};
export default defineConfig({
optimizeDeps: {
exclude: ['crypto', 'util', 'tty'],
include: ['@lobehub/tts'],
},
plugins: [
tsconfigPaths({ projects: ['.'] }),
// Let `.md` imports resolve to their raw text content so Rollup/Vitest
// doesn't try to parse Markdown as JavaScript.
{
name: 'raw-md',
transform(_, id) {
if (id.endsWith('.md'))
return { code: 'export default ""', map: null };
},
},
/**
* @lobehub/fluent-emoji@4.0.0 ships `es/FluentEmoji/style.js` but its `es/FluentEmoji/index.js`
* imports `./style/index.js` which doesn't exist.
*
* In app bundlers this can be tolerated/rewritten, but Vite/Vitest resolves it strictly and
* fails the whole test run. Redirect it to the real file.
*/
{
enforce: 'pre',
name: 'fix-lobehub-fluent-emoji-style-import',
resolveId(id, importer) {
if (!importer) return null;
const isFluentEmojiEntry =
importer.endsWith('/@lobehub/fluent-emoji/es/FluentEmoji/index.js') ||
importer.includes('/@lobehub/fluent-emoji/es/FluentEmoji/index.js?');
const isMissingStyleIndex =
id === './style/index.js' ||
id.endsWith('/@lobehub/fluent-emoji/es/FluentEmoji/style/index.js') ||
id.endsWith('/@lobehub/fluent-emoji/es/FluentEmoji/style/index.js?') ||
id.endsWith('/FluentEmoji/style/index.js') ||
id.endsWith('/FluentEmoji/style/index.js?');
if (isFluentEmojiEntry && isMissingStyleIndex)
return resolve(dirname(importer), 'style.js');
return null;
},
},
],
resolve: {
alias,
},
test: {
alias,
coverage: {
all: false,
exclude: [
// https://github.com/lobehub/lobe-chat/pull/7265
...coverageConfigDefaults.exclude,
'__mocks__/**',
'**/packages/**',
// just ignore the migration code
// we will use pglite in the future
// so the coverage of this file is not important
'src/database/client/core/db.ts',
'src/utils/fetch/fetchEventSource/*.ts',
],
provider: 'v8',
reporter: ['text', 'json', 'lcov', 'text-summary'],
reportsDirectory: './coverage/app',
},
environment: 'happy-dom',
exclude: [
'**/node_modules/**',
'**/.*/**',
'**/dist/**',
'**/build/**',
'**/tmp/**',
'**/temp/**',
'**/docs/**',
'**/locales/**',
'**/public/**',
'**/apps/desktop/**',
'**/apps/mobile/**',
'**/apps/cli/**',
'**/packages/**',
'**/e2e/**',
],
globals: true,
server: {
deps: {
inline: [
'vitest-canvas-mock',
/@emoji-mart/,
'@lobehub/ui',
'@lobehub/fluent-emoji',
'@pierre/diffs',
'@pierre/diffs/react',
'lru_map',
'lexical',
/@lexical\//,
],
},
},
setupFiles: join(__dirname, './tests/setup.ts'),
},
});