diff --git a/.github/workflows/frontend-review.yml b/.github/workflows/frontend-review.yml index bb7526d248..130b659545 100644 --- a/.github/workflows/frontend-review.yml +++ b/.github/workflows/frontend-review.yml @@ -57,7 +57,7 @@ jobs: uses: actions/cache@v4 with: path: packages/client/dist - key: build-client-package-${{ runner.os }}-${{ hashFiles('packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/rollup.config.js', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/tsdown.config.mjs', 'packages/data-provider/package.json') }} + key: build-client-package-${{ runner.os }}-${{ hashFiles('packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/tsdown.config.mjs', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/tsdown.config.mjs', 'packages/data-provider/package.json') }} - name: Build client-package if: steps.cache-client-package.outputs.cache-hit != 'true' diff --git a/.github/workflows/playwright-mock.yml b/.github/workflows/playwright-mock.yml index 493d29ff40..fc94dc02d6 100644 --- a/.github/workflows/playwright-mock.yml +++ b/.github/workflows/playwright-mock.yml @@ -90,7 +90,7 @@ jobs: uses: actions/cache@v4 with: path: packages/client/dist - key: build-client-package-${{ runner.os }}-${{ hashFiles('package-lock.json', 'packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/rollup.config.js', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/tsdown.config.mjs', 'packages/data-provider/package.json') }} + key: build-client-package-${{ runner.os }}-${{ hashFiles('package-lock.json', 'packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/tsdown.config.mjs', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/tsdown.config.mjs', 'packages/data-provider/package.json') }} - name: Build client-package if: steps.cache-client-package.outputs.cache-hit != 'true' @@ -101,7 +101,7 @@ jobs: uses: actions/cache@v4 with: path: client/dist - key: build-client-app-e2e-${{ runner.os }}-${{ hashFiles('package-lock.json', 'client/src/**', 'client/public/**', 'client/scripts/post-build.cjs', 'client/index.html', 'client/package.json', 'client/vite.config.*', 'client/tsconfig*.json', 'client/tailwind.config.*', 'client/postcss.config.*', 'packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/rollup.config.js', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/tsdown.config.mjs', 'packages/data-provider/package.json') }} + key: build-client-app-e2e-${{ runner.os }}-${{ hashFiles('package-lock.json', 'client/src/**', 'client/public/**', 'client/scripts/post-build.cjs', 'client/index.html', 'client/package.json', 'client/vite.config.*', 'client/tsconfig*.json', 'client/tailwind.config.*', 'client/postcss.config.*', 'packages/client/src/**', 'packages/client/tsconfig*.json', 'packages/client/tsdown.config.mjs', 'packages/client/package.json', 'packages/data-provider/src/**', 'packages/data-provider/tsconfig*.json', 'packages/data-provider/tsdown.config.mjs', 'packages/data-provider/package.json') }} - name: Build client app if: steps.cache-client-app.outputs.cache-hit != 'true' diff --git a/client/src/main.jsx b/client/src/main.jsx index d7dd8e0f6e..491f13f634 100644 --- a/client/src/main.jsx +++ b/client/src/main.jsx @@ -2,6 +2,7 @@ import './polyfills/regeneratorRuntime'; import { createRoot } from 'react-dom/client'; import './locales/i18n'; import App from './App'; +import '@librechat/client/style.css'; import './style.css'; import './mobile.css'; import { ApiErrorBoundaryProvider } from './hooks/ApiErrorBoundaryContext'; diff --git a/package-lock.json b/package-lock.json index 6679534009..30fa3d2e3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44930,6 +44930,7 @@ "@tanstack/react-virtual": "^3.13.13", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^14.0.0", + "@tsdown/css": "^0.22.2", "@types/jest": "^29.5.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -44952,6 +44953,7 @@ "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-typescript2": "^0.37.0", "tailwindcss-radix": "^2.8.0", + "tsdown": "^0.22.2", "typescript": "^5.9.3" }, "peerDependencies": { @@ -45010,6 +45012,88 @@ "dev": true, "license": "MIT" }, + "packages/client/node_modules/@babel/generator": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.6.tgz", + "integrity": "sha512-6mIzgVK8DgEzvIapoQwhXTMnnkuE4STQmVv9H03i/tZ2ml8oev3TRvZJgTenK2Bsq0YWNtzOrFdTyNzCMFtjJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.0-rc.6", + "@babel/types": "^8.0.0-rc.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/client/node_modules/@babel/generator/node_modules/@babel/types": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.6.tgz", + "integrity": "sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0-rc.6", + "@babel/helper-validator-identifier": "^8.0.0-rc.6" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/client/node_modules/@babel/helper-string-parser": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.6.tgz", + "integrity": "sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/client/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.6.tgz", + "integrity": "sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/client/node_modules/@babel/parser": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.6.tgz", + "integrity": "sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.0-rc.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/client/node_modules/@babel/parser/node_modules/@babel/types": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.6.tgz", + "integrity": "sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0-rc.6", + "@babel/helper-validator-identifier": "^8.0.0-rc.6" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "packages/client/node_modules/@babel/plugin-transform-react-display-name": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", @@ -45100,6 +45184,310 @@ "@babel/core": "^7.0.0-0" } }, + "packages/client/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "packages/client/node_modules/@oxc-project/types": { + "version": "0.134.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.134.0.tgz", + "integrity": "sha512-T0xuRRKrQFmocH8y+jGfpmSkGcheaJExY9lEihmR1Gm2aH+75B8CzgU2rABRQSzzDxLjZ15Sc0bRVLj5lVeNXQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "packages/client/node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.0.tgz", + "integrity": "sha512-gCYzGOSkYY6Z034suzd20euvds7lPzMEEla62DJGE/ZAlR4OMBnNbvnBSsIGUCAr52gaWMsloGxP4tVGtN5aCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-JQBD77MNgu+4Z6RAyg69acugdrhhVoWesr3l47zohYZ2YV2fwkWMArkN/2p4l6Ei+Sno7W5q+UsKdVWq5Ens0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.0.tgz", + "integrity": "sha512-p/8cXUTK4Sob604e+xxPhVSbDFf29E6J0l/xESM9rdCfn3aDai3nEs6TnMHUsdD5aNlFz0+gDbiGlozLKGa2YA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.0.tgz", + "integrity": "sha512-KbtOSlVv6fElujiZWMcC3aQYhEwLVVf073RcwlSmpGQvIsKZFUqc0ef4sjUuurRwfbiI6JJXji9DQn+86hawmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.0.tgz", + "integrity": "sha512-9fZ9i0o0/MQaw7om6Z6TsT7tfCk0jtbEFtC+aPqZL5RNsGWNcHvn6EHgL3dAprjq+AZzPTAQjg2JtpJaMt+6pg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.0.tgz", + "integrity": "sha512-+tog7T66i+yFyIuuAnjL6xmW182W/qTBOUt6BtQ6lBIM1Eikh/fSMz4HGgvuCp5uU0zuIVWng7kDYthjCMOHcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.0.tgz", + "integrity": "sha512-4b7yruLIIj/oZ3GpcLOvxcLCLDMraohn3IhQfN2hBP4w9UekG0DTIajWguJosRGfySf/+h/NwRUiMKoCpxCrqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.0.tgz", + "integrity": "sha512-QRDOVZd0bhQ5jLsUsCC3dUxDWdTSVY9WMznowZgCGOrZfLLgctWpelhUASEiBwsXfat/JwYnVd1EaxMhqyT+UQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.0.tgz", + "integrity": "sha512-ypxT+Hq76NFG7woFbNbySnGEajFuYuIXeKz/jfCU+lXUoxfi3zLE6OG/ZQNeK3RpZSYJlAe2bokpsQ046CaieQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.0.tgz", + "integrity": "sha512-IdovCmfROFmpTLahdecTDFL74aLERVYN68F/mLZjfVh6LfoplPfI6deyHNMTcVujbokDV5k05XrFO22zfv+qjg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.0.tgz", + "integrity": "sha512-pcA8xlFp2tyk9T2R6Fi/rPe3bQ1MA+sSMDNUU5Ogu80GHOatkE4P8YCreGAvZErm5Ho2YRXnyvNrWiRncfVysQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.0.tgz", + "integrity": "sha512-4+fexHayrLCWpriPh4c6dNvL4an34DEZCG7zOM/FD5QNF6h8DT+bDXzyB/kfC8lDJbaFb7jKShtnjDQFXVQEjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.0.tgz", + "integrity": "sha512-SbL++MNmOw6QamrwIGDMSSfM4ceTzFr+RjbOExJSLLBinScU4WI5OdA413h1qwPw2yH7lVF1+H4svQ+6mSXKTQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.0.tgz", + "integrity": "sha512-+xTE6XC7wBgk0VKRXGG+QAnyW5S9b8vfsFpiMjf0waQTmSQSU8onsH/beyZ8X4aXVveJnotiy7VDjLOaW8bTrg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "packages/client/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.0.tgz", + "integrity": "sha512-Ogji1TQNqH3ACLnYr+1Ns1nyrJ0CO2P585u9Hsh02pXvtFiFpgtgT2b3P4PnCOU86VVCvqtAeCN4OftMT8KU4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "packages/client/node_modules/@tanstack/react-table": { "version": "8.21.3", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", @@ -45240,6 +45628,49 @@ } } }, + "packages/client/node_modules/@tsdown/css": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@tsdown/css/-/css-0.22.2.tgz", + "integrity": "sha512-Go3Im9TaQnoX68vfU8Jv0OVzlxAkbKcAhTHBSkO0oC3ULClKcKETFqF4GN3P5Tcsu43NlyzOnob5po5zKSFNCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "postcss-load-config": "^6.0.1", + "rolldown": "~1.1.0" + }, + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "postcss": "^8.4.0", + "postcss-import": "^16.0.0", + "postcss-modules": "^6.0.0", + "sass": "*", + "sass-embedded": "*", + "tsdown": "0.22.2" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "postcss-import": { + "optional": true + }, + "postcss-modules": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, "packages/client/node_modules/@types/jest": { "version": "29.5.14", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", @@ -45296,6 +45727,22 @@ "dequal": "^2.0.3" } }, + "packages/client/node_modules/get-tsconfig": { + "version": "5.0.0-beta.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.5.tgz", + "integrity": "sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "packages/client/node_modules/i18next": { "version": "24.2.3", "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz", @@ -45328,6 +45775,75 @@ } } }, + "packages/client/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "packages/client/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "packages/client/node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "packages/client/node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -45389,6 +45905,157 @@ "url": "https://github.com/sponsors/isaacs" } }, + "packages/client/node_modules/rolldown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.0.tgz", + "integrity": "sha512-zpMvlJhs5PkXRTtKc0CaLBVI9AR/VDiJFpM+kx//hgToEca7FgMlGjaRIisXBcb19T76LswgmKECSQ96hjWr5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.134.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.0", + "@rolldown/binding-darwin-arm64": "1.1.0", + "@rolldown/binding-darwin-x64": "1.1.0", + "@rolldown/binding-freebsd-x64": "1.1.0", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.0", + "@rolldown/binding-linux-arm64-gnu": "1.1.0", + "@rolldown/binding-linux-arm64-musl": "1.1.0", + "@rolldown/binding-linux-ppc64-gnu": "1.1.0", + "@rolldown/binding-linux-s390x-gnu": "1.1.0", + "@rolldown/binding-linux-x64-gnu": "1.1.0", + "@rolldown/binding-linux-x64-musl": "1.1.0", + "@rolldown/binding-openharmony-arm64": "1.1.0", + "@rolldown/binding-wasm32-wasi": "1.1.0", + "@rolldown/binding-win32-arm64-msvc": "1.1.0", + "@rolldown/binding-win32-x64-msvc": "1.1.0" + } + }, + "packages/client/node_modules/tsdown": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.22.2.tgz", + "integrity": "sha512-VX9gsyKXsTnBZjnIM4jsHl9aRv+GfgkE/k1hQslilaBfZMlaw3JuGR+6yhiU0QxWBtOCDnTjwOSoXzgB7Rr50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.3.1", + "cac": "^7.0.0", + "defu": "^6.1.7", + "empathic": "^2.0.1", + "hookable": "^6.1.1", + "import-without-cache": "^0.4.0", + "obug": "^2.1.1", + "picomatch": "^4.0.4", + "rolldown": "~1.1.0", + "rolldown-plugin-dts": "^0.25.2", + "semver": "^7.8.1", + "tinyexec": "^1.2.4", + "tinyglobby": "^0.2.17", + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0" + }, + "bin": { + "tsdown": "dist/run.mjs" + }, + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.22.2", + "@tsdown/exe": "0.22.2", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0", + "unplugin-unused": "^0.5.0", + "unrun": "*" + }, + "peerDependenciesMeta": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { + "optional": true + }, + "@tsdown/exe": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "publint": { + "optional": true + }, + "tsx": { + "optional": true + }, + "typescript": { + "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true + } + } + }, + "packages/client/node_modules/tsdown/node_modules/rolldown-plugin-dts": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.25.2.tgz", + "integrity": "sha512-nMhN/R+vmR8GM45ZW1FWMSjRTSDDn/6w4GTf8RNrEFCBdl8B1kySWrU1ixPtbwzXoRlcO+R/S88VgXuJQwfdDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "8.0.0-rc.6", + "@babel/helper-validator-identifier": "8.0.0-rc.6", + "@babel/parser": "8.0.0-rc.6", + "ast-kit": "^3.0.0-beta.1", + "birpc": "^4.0.0", + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.5", + "obug": "^2.1.1" + }, + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@ts-macro/tsc": "^0.3.6", + "@typescript/native-preview": ">=7.0.0-dev.20260325.1", + "rolldown": "^1.0.0", + "typescript": "^5.0.0 || ^6.0.0", + "vue-tsc": "~3.2.0" + }, + "peerDependenciesMeta": { + "@ts-macro/tsc": { + "optional": true + }, + "@typescript/native-preview": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, "packages/data-provider": { "name": "librechat-data-provider", "version": "0.8.503", diff --git a/packages/client/package.json b/packages/client/package.json index dede35b41f..d3e744fc32 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -6,15 +6,22 @@ "type": "git", "url": "https://github.com/danny-avila/LibreChat" }, - "main": "dist/index.js", - "module": "dist/index.es.js", - "types": "dist/types/index.d.ts", + "main": "dist/index.cjs", + "module": "dist/index.mjs", + "types": "./dist/index.d.cts", "exports": { ".": { - "import": "./dist/index.es.js", - "require": "./dist/index.js", - "types": "./dist/types/index.d.ts" - } + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "./style.css": "./dist/style.css", + "./package.json": "./package.json" }, "files": [ "dist" @@ -22,11 +29,11 @@ "scripts": { "clean": "rimraf dist", "b:clean": "bun run rimraf dist", - "build": "npm run clean && rollup -c --bundleConfigAsCjs", - "build:dev": "npm run clean && NODE_ENV=development rollup -c --bundleConfigAsCjs", - "b:build": "bun run b:clean && bun run rollup -c --silent --bundleConfigAsCjs", - "build:watch": "rollup -c -w --bundleConfigAsCjs", - "dev": "rollup -c -w --bundleConfigAsCjs" + "build": "npm run clean && tsdown", + "build:dev": "npm run clean && NODE_ENV=development tsdown", + "b:build": "bun run b:clean && bun run tsdown", + "build:watch": "tsdown --watch", + "dev": "tsdown --watch" }, "peerDependencies": { "@ariakit/react": "^0.4.16", @@ -90,6 +97,7 @@ "@tanstack/react-virtual": "^3.13.13", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^14.0.0", + "@tsdown/css": "^0.22.2", "@types/jest": "^29.5.14", "@types/react": "^18.2.11", "@types/react-dom": "^18.2.4", @@ -112,6 +120,7 @@ "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-typescript2": "^0.37.0", "tailwindcss-radix": "^2.8.0", + "tsdown": "^0.22.2", "typescript": "^5.9.3" } } diff --git a/packages/client/rollup.config.js b/packages/client/rollup.config.js deleted file mode 100644 index 149545f626..0000000000 --- a/packages/client/rollup.config.js +++ /dev/null @@ -1,82 +0,0 @@ -// ESM bundler config for React components -import { fileURLToPath } from 'url'; -import alias from '@rollup/plugin-alias'; -import postcss from 'rollup-plugin-postcss'; -import replace from '@rollup/plugin-replace'; -import commonjs from '@rollup/plugin-commonjs'; -import resolve from '@rollup/plugin-node-resolve'; -import typescript from 'rollup-plugin-typescript2'; -import { dirname, resolve as pathResolve } from 'path'; -import peerDepsExternal from 'rollup-plugin-peer-deps-external'; -import pkg from './package.json'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -const plugins = [ - peerDepsExternal(), - alias({ - entries: [{ find: '~', replacement: pathResolve(__dirname, 'src') }], - }), - resolve({ - extensions: ['.js', '.jsx', '.ts', '.tsx'], - browser: true, - preferBuiltins: false, - }), - replace({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production'), - 'process.env.VITE_ENABLE_LOGGER': JSON.stringify(process.env.VITE_ENABLE_LOGGER || 'false'), - 'process.env.VITE_LOGGER_FILTER': JSON.stringify(process.env.VITE_LOGGER_FILTER || ''), - preventAssignment: true, - }), - commonjs(), - postcss({ - extract: false, - inject: true, - minimize: process.env.NODE_ENV === 'production', - modules: false, - config: { - path: './postcss.config.js', - }, - }), - typescript({ - tsconfig: './tsconfig.json', - useTsconfigDeclarationDir: true, - clean: true, - check: false, - }), -]; - -const isDev = process.env.NODE_ENV !== 'production'; - -export default { - input: 'src/index.ts', - output: [ - { - file: pkg.main, - format: 'cjs', - sourcemap: isDev ? 'inline' : true, - exports: 'named', - }, - { - file: pkg.module, - format: 'esm', - sourcemap: isDev ? 'inline' : true, - exports: 'named', - }, - ], - external: [ - ...Object.keys(pkg.peerDependencies || {}), - 'react/jsx-runtime', - 'react/jsx-dev-runtime', - ], - preserveSymlinks: true, - plugins, - onwarn(warning, warn) { - // Ignore "use client" directive warnings - if (warning.code === 'MODULE_LEVEL_DIRECTIVE') { - return; - } - warn(warning); - }, -}; diff --git a/packages/client/src/Providers/ToastContext.tsx b/packages/client/src/Providers/ToastContext.tsx index afe24995d2..6a34228588 100644 --- a/packages/client/src/Providers/ToastContext.tsx +++ b/packages/client/src/Providers/ToastContext.tsx @@ -1,4 +1,5 @@ -import { createContext, useContext, ReactNode } from 'react'; +import { createContext, useContext, ReactNode, Context } from 'react'; +import { JSX } from 'react/jsx-runtime'; import type { TShowToast } from '~/common'; import useToast from '~/hooks/useToast'; @@ -6,15 +7,15 @@ type ToastContextType = { showToast: ({ message, severity, showIcon, duration }: TShowToast) => void; }; -export const ToastContext = createContext({ +export const ToastContext: Context = createContext({ showToast: () => ({}), }); -export function useToastContext() { +export function useToastContext(): ToastContextType { return useContext(ToastContext); } -export default function ToastProvider({ children }: { children: ReactNode }) { +export default function ToastProvider({ children }: { children: ReactNode }): JSX.Element { const { showToast } = useToast(); return {children}; diff --git a/packages/client/src/components/Accordion.tsx b/packages/client/src/components/Accordion.tsx index 813cf4fa02..b013d0378f 100644 --- a/packages/client/src/components/Accordion.tsx +++ b/packages/client/src/components/Accordion.tsx @@ -1,11 +1,17 @@ import * as React from 'react'; -import * as AccordionPrimitive from '@radix-ui/react-accordion'; import { ChevronDownIcon } from '@radix-ui/react-icons'; +import * as AccordionPrimitive from '@radix-ui/react-accordion'; import { cn } from '~/utils'; -const Accordion = AccordionPrimitive.Root; +const Accordion: React.ForwardRefExoticComponent< + (AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & + React.RefAttributes +> = AccordionPrimitive.Root; -const AccordionItem = React.forwardRef< +const AccordionItem: React.ForwardRefExoticComponent< + Omit, 'ref'> & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', ...props }, ref) => ( @@ -13,7 +19,10 @@ const AccordionItem = React.forwardRef< )); AccordionItem.displayName = 'AccordionItem'; -const AccordionTrigger = React.forwardRef< +const AccordionTrigger: React.ForwardRefExoticComponent< + Omit, 'ref'> & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', children, ...props }, ref) => ( @@ -33,7 +42,10 @@ const AccordionTrigger = React.forwardRef< )); AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; -const AccordionContent = React.forwardRef< +const AccordionContent: React.ForwardRefExoticComponent< + Omit, 'ref'> & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', children, ...props }, ref) => ( diff --git a/packages/client/src/components/AlertDialog.tsx b/packages/client/src/components/AlertDialog.tsx index 4e78fda211..3de8f59242 100644 --- a/packages/client/src/components/AlertDialog.tsx +++ b/packages/client/src/components/AlertDialog.tsx @@ -1,10 +1,13 @@ import * as React from 'react'; +import { JSX } from 'react/jsx-runtime'; import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; import { cn } from '~/utils'; -const AlertDialog = AlertDialogPrimitive.Root; +const AlertDialog: React.FC = AlertDialogPrimitive.Root; -const AlertDialogTrigger = AlertDialogPrimitive.Trigger; +const AlertDialogTrigger: React.ForwardRefExoticComponent< + AlertDialogPrimitive.AlertDialogTriggerProps & React.RefAttributes +> = AlertDialogPrimitive.Trigger; type AlertPortalProps = AlertDialogPrimitive.AlertDialogPortalProps & { className?: string }; @@ -32,7 +35,10 @@ const AlertDialogOverlay = React.forwardRef< )); AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; -const AlertDialogContent = React.forwardRef< +const AlertDialogContent: React.ForwardRefExoticComponent< + Omit, 'ref'> & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', ...props }, ref) => ( @@ -51,12 +57,18 @@ const AlertDialogContent = React.forwardRef< )); AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; -const AlertDialogHeader = ({ className = '', ...props }: React.HTMLAttributes) => ( +const AlertDialogHeader: { + ({ className, ...props }: React.HTMLAttributes): JSX.Element; + displayName: string; +} = ({ className = '', ...props }: React.HTMLAttributes): JSX.Element => (
); AlertDialogHeader.displayName = 'AlertDialogHeader'; -const AlertDialogFooter = ({ className = '', ...props }: React.HTMLAttributes) => ( +const AlertDialogFooter: { + ({ className, ...props }: React.HTMLAttributes): JSX.Element; + displayName: string; +} = ({ className = '', ...props }: React.HTMLAttributes): JSX.Element => (
, + 'ref' + > & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', ...props }, ref) => ( @@ -76,7 +94,13 @@ const AlertDialogTitle = React.forwardRef< )); AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; -const AlertDialogDescription = React.forwardRef< +const AlertDialogDescription: React.ForwardRefExoticComponent< + Omit< + AlertDialogPrimitive.AlertDialogDescriptionProps & React.RefAttributes, + 'ref' + > & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', ...props }, ref) => ( @@ -88,7 +112,13 @@ const AlertDialogDescription = React.forwardRef< )); AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName; -const AlertDialogAction = React.forwardRef< +const AlertDialogAction: React.ForwardRefExoticComponent< + Omit< + AlertDialogPrimitive.AlertDialogActionProps & React.RefAttributes, + 'ref' + > & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', ...props }, ref) => ( @@ -103,7 +133,13 @@ const AlertDialogAction = React.forwardRef< )); AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; -const AlertDialogCancel = React.forwardRef< +const AlertDialogCancel: React.ForwardRefExoticComponent< + Omit< + AlertDialogPrimitive.AlertDialogCancelProps & React.RefAttributes, + 'ref' + > & + React.RefAttributes +> = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className = '', ...props }, ref) => ( diff --git a/packages/client/src/components/AnimatedSearchInput.tsx b/packages/client/src/components/AnimatedSearchInput.tsx index 9e3411d1d7..1a07d72854 100644 --- a/packages/client/src/components/AnimatedSearchInput.tsx +++ b/packages/client/src/components/AnimatedSearchInput.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { Search } from 'lucide-react'; -import { TranslationKeys, useLocalize } from '~/hooks'; +import { JSX } from 'react/jsx-runtime'; +import { useLocalize } from '~/hooks'; import { cn } from '~/utils'; const AnimatedSearchInput = ({ @@ -13,7 +14,7 @@ const AnimatedSearchInput = ({ onChange: (e: React.ChangeEvent) => void; isSearching?: boolean; placeholder: string; -}) => { +}): JSX.Element => { const isSearching = searching === true; const hasValue = value != null && value.length > 0; const localize = useLocalize(); diff --git a/packages/client/src/components/AnimatedTabs.tsx b/packages/client/src/components/AnimatedTabs.tsx index 131d871aaf..3d5eab05de 100644 --- a/packages/client/src/components/AnimatedTabs.tsx +++ b/packages/client/src/components/AnimatedTabs.tsx @@ -1,8 +1,9 @@ -import * as Ariakit from '@ariakit/react'; import { forwardRef, useEffect, useRef } from 'react'; +import * as Ariakit from '@ariakit/react'; import type { ElementRef } from 'react'; import { cn } from '~/utils'; import './AnimatedTabs.css'; +import { JSX } from 'react/jsx-runtime'; export interface TabItem { id?: string; @@ -89,7 +90,7 @@ export function AnimatedTabs({ containerClassName = '', tabListProps = {}, defaultSelectedId, -}: AnimatedTabsProps) { +}: AnimatedTabsProps): JSX.Element { const tabIds = tabs.map((tab, index) => tab.id || `tab-${index}`); const firstTabId = defaultSelectedId || tabIds[0]; const tabListRef = useRef(null); diff --git a/packages/client/src/components/Badge.tsx b/packages/client/src/components/Badge.tsx index 0a92d16c69..8a645fc1a3 100644 --- a/packages/client/src/components/Badge.tsx +++ b/packages/client/src/components/Badge.tsx @@ -1,8 +1,9 @@ -import type React from 'react'; import { X, Plus } from 'lucide-react'; import { motion } from 'framer-motion'; +import { JSX } from 'react/jsx-runtime'; import type { ButtonHTMLAttributes } from 'react'; import type { LucideIcon } from 'lucide-react'; +import type React from 'react'; import { cn } from '~/utils'; interface BadgeProps @@ -35,7 +36,7 @@ export default function Badge({ onToggle, className, ...props -}: BadgeProps) { +}: BadgeProps): JSX.Element { const isMoveable = isEditing && isAvailable; const isDisabled = id === '1' && isInChat; diff --git a/packages/client/src/components/Breadcrumb.tsx b/packages/client/src/components/Breadcrumb.tsx index f1026a8305..09e0e5e9af 100644 --- a/packages/client/src/components/Breadcrumb.tsx +++ b/packages/client/src/components/Breadcrumb.tsx @@ -1,9 +1,14 @@ import * as React from 'react'; +import { JSX } from 'react/jsx-runtime'; import { Slot } from '@radix-ui/react-slot'; import { ChevronRight, MoreHorizontal } from 'lucide-react'; import { cn } from '~/utils'; -const Breadcrumb = React.forwardRef< +const Breadcrumb: React.ForwardRefExoticComponent< + Omit, HTMLElement>, 'ref'> & { + separator?: React.ReactNode; + } & React.RefAttributes +> = React.forwardRef< HTMLElement, React.ComponentPropsWithoutRef<'nav'> & { separator?: React.ReactNode; @@ -11,7 +16,10 @@ const Breadcrumb = React.forwardRef< >(({ ...props }, ref) =>