mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-08-04 14:57:42 +00:00
* 📦 chore: Upgrade react-router-dom to v7.18.2 (security) Fixes GHSA-wrjc-x8rr-h8h6 (open redirect via backslash in Link/useNavigate, CVE-2025-68470 bypass) and GHSA-337j-9hxr-rhxg (deserializeErrors constructor injection). Neither has a 6.x patch; v7's react-router-dom is a shim re-exporting react-router, so all existing imports work unchanged. - vite manualChunks: match react-router so the routing chunk still captures the router (v7 moves all code out of the react-router-dom package) - jest: add test/polyfills.js (TextEncoder/TextDecoder + minimal Request); v7's CJS bundle constructs TextEncoder at module scope and builds a Request per navigation, neither exists in jsdom - auth specs: v7 types drop the synthetic default export; use a namespace import and mark the mock factory __esModule so the useOutletContext spy patches the object components actually read - isSafeRedirect: reject backslashes as defense in depth for the same open-redirect class the router patch addresses * 📦 chore: Regenerate stale bun.lock bun.lock predated months of package.json drift and still pinned react-router 6.30.3. Regenerated with bun install --lockfile-only so bun installs match current manifests, including react-router 7.18.2. * 🗂️ fix: Commit project-chip URL updates synchronously under router v7 v7 wraps router state updates in React.startTransition unconditionally, so the chip's paired updates tear: the conversation draft (Recoil) commits synchronously while the ?projectId removal defers. ChatRoute's draftProjectMismatch re-init sees draft != URL in that window and restores the removed project. The flushSync navigate option commits both in one pass, matching v6 ordering. Caught by the projects e2e specs. * 🧹 chore: Drop unused banner-query spy variable in Registration spec Pre-existing warning, but the changed-files eslint gate runs with --max-warnings=0 so it blocks this PR. The spy call stays; only the never-read variable goes.
51 lines
2.3 KiB
JavaScript
51 lines
2.3 KiB
JavaScript
/** v0.8.7 */
|
|
module.exports = {
|
|
roots: ['<rootDir>/src'],
|
|
testEnvironment: 'jsdom',
|
|
testEnvironmentOptions: {
|
|
url: 'http://localhost:3080',
|
|
},
|
|
collectCoverage: true,
|
|
collectCoverageFrom: [
|
|
'src/**/*.{js,jsx,ts,tsx}',
|
|
'!<rootDir>/node_modules/',
|
|
'!src/**/*.css.d.ts',
|
|
'!src/**/*.d.ts',
|
|
],
|
|
coveragePathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/test/setupTests.js'],
|
|
// Todo: Add coverageThreshold once we have enough coverage
|
|
// Note: eventually we want to have these values set to 80%
|
|
// coverageThreshold: {
|
|
// global: {
|
|
// functions: 9,
|
|
// lines: 40,
|
|
// statements: 40,
|
|
// branches: 12,
|
|
// },
|
|
// },
|
|
moduleNameMapper: {
|
|
'\\.(css)$': 'identity-obj-proxy',
|
|
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
|
|
'jest-file-loader',
|
|
'^test/(.*)$': '<rootDir>/test/$1',
|
|
'^~/(.*)$': '<rootDir>/src/$1',
|
|
'^librechat-data-provider/react-query$':
|
|
'<rootDir>/../node_modules/librechat-data-provider/src/react-query',
|
|
},
|
|
maxWorkers: '50%',
|
|
restoreMocks: true,
|
|
testResultsProcessor: 'jest-junit',
|
|
coverageReporters: ['text', 'cobertura', 'lcov'],
|
|
resolver: '<rootDir>/jest.resolver.cjs',
|
|
transform: {
|
|
'\\.[jt]sx?$': 'babel-jest',
|
|
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
|
|
'jest-file-loader',
|
|
},
|
|
transformIgnorePatterns: [
|
|
'/node_modules/(?!(@ariakit/react-components|@ariakit/react-utils|@ariakit/react-store|@ariakit/components|@ariakit/store|@ariakit/utils|@zattoo/use-double-click|@dicebear|@react-dnd|react-dnd.*|dnd-core|filenamify|filename-reserved-regex|heic-to|lowlight|highlight\\.js|fault|react-markdown|unified|bail|trough|devlop|is-.*|parse-entities|stringify-entities|character-.*|trim-lines|style-to-object|inline-style-parser|html-url-attributes|escape-string-regexp|longest-streak|zwitch|ccount|markdown-table|comma-separated-tokens|space-separated-tokens|web-namespaces|property-information|remark-.*|rehype-.*|recma-.*|hast.*|mdast-.*|unist-.*|vfile.*|micromark.*|estree-util-.*|decode-named-character-reference)/)/',
|
|
],
|
|
setupFiles: ['<rootDir>/test/polyfills.js'],
|
|
setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect', '<rootDir>/test/setupTests.js'],
|
|
clearMocks: true,
|
|
};
|