diff --git a/packages/bruno-app/.gitignore b/packages/bruno-app/.gitignore
index 26d2023a3..691ec3051 100644
--- a/packages/bruno-app/.gitignore
+++ b/packages/bruno-app/.gitignore
@@ -31,6 +31,6 @@ yarn-error.log*
# next.js
.next/
-out/
+dist/
.env
\ No newline at end of file
diff --git a/packages/bruno-app/next.config.js b/packages/bruno-app/next.config.js
deleted file mode 100644
index 209858093..000000000
--- a/packages/bruno-app/next.config.js
+++ /dev/null
@@ -1,22 +0,0 @@
-module.exports = {
- output: 'export',
- reactStrictMode: false,
- publicRuntimeConfig: {
- CI: process.env.CI,
- PLAYWRIGHT: process.env.PLAYWRIGHT,
- ENV: process.env.ENV
- },
- webpack: (config, { isServer }) => {
- // Fixes npm packages that depend on `fs` module
- if (!isServer) {
- config.resolve.fallback.fs = false;
- }
- Object.defineProperty(config, 'devtool', {
- get() {
- return 'source-map';
- },
- set() {},
- });
- return config;
- },
-};
diff --git a/packages/bruno-app/package.json b/packages/bruno-app/package.json
index 52553b002..954e82b45 100644
--- a/packages/bruno-app/package.json
+++ b/packages/bruno-app/package.json
@@ -3,10 +3,9 @@
"version": "0.3.0",
"private": true,
"scripts": {
- "dev": "cross-env ENV=dev next dev -p 3000",
- "build": "next build",
- "start": "next start",
- "lint": "next lint",
+ "dev": "rsbuild dev --open",
+ "build": "rsbuild build -m production",
+ "preview": "rsbuild preview",
"test": "jest",
"test:prettier": "prettier --check \"./src/**/*.{js,jsx,json,ts,tsx}\"",
"prettier": "prettier --write \"./src/**/*.{js,jsx,json,ts,tsx}\""
@@ -49,7 +48,6 @@
"markdown-it-replace-link": "^1.2.0",
"mousetrap": "^1.6.5",
"nanoid": "3.3.4",
- "next": "14.2.16",
"path": "^0.12.7",
"pdfjs-dist": "4.4.168",
"platform": "^1.3.6",
@@ -57,17 +55,17 @@
"prettier": "^2.7.1",
"qs": "^6.11.0",
"query-string": "^7.0.1",
- "react": "18.2.0",
+ "react": "19.0.0",
"react-copy-to-clipboard": "^5.1.0",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
- "react-dom": "18.2.0",
+ "react-dom": "19.0.0",
"react-hot-toast": "^2.4.0",
"react-i18next": "^15.0.1",
"react-inspector": "^6.0.2",
"react-pdf": "9.1.1",
"react-player": "^2.16.0",
- "react-redux": "^7.2.6",
+ "react-redux": "^7.2.9",
"react-tooltip": "^5.5.2",
"sass": "^1.46.0",
"strip-json-comments": "^5.0.1",
@@ -79,13 +77,14 @@
"yup": "^0.32.11"
},
"devDependencies": {
- "@babel/core": "^7.16.0",
- "@babel/plugin-transform-spread": "^7.16.7",
- "@babel/preset-env": "^7.16.4",
- "@babel/preset-react": "^7.16.0",
- "@babel/runtime": "^7.16.3",
+ "@rsbuild/core": "^1.1.2",
+ "@rsbuild/plugin-babel": "^1.0.3",
+ "@rsbuild/plugin-node-polyfill": "^1.2.0",
+ "@rsbuild/plugin-react": "^1.0.7",
+ "@rsbuild/plugin-sass": "^1.1.0",
+ "@rsbuild/plugin-styled-components": "1.1.0",
"autoprefixer": "10.4.20",
- "babel-loader": "^8.2.3",
+ "babel-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110",
"cross-env": "^7.0.3",
"css-loader": "7.1.2",
"file-loader": "^6.2.0",
diff --git a/packages/bruno-app/rsbuild.config.mjs b/packages/bruno-app/rsbuild.config.mjs
new file mode 100644
index 000000000..704ea4d09
--- /dev/null
+++ b/packages/bruno-app/rsbuild.config.mjs
@@ -0,0 +1,27 @@
+import { defineConfig } from '@rsbuild/core';
+import { pluginReact } from '@rsbuild/plugin-react';
+import { pluginBabel } from '@rsbuild/plugin-babel';
+import { pluginStyledComponents } from '@rsbuild/plugin-styled-components';
+import { pluginSass } from '@rsbuild/plugin-sass';
+import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill'
+
+export default defineConfig({
+ plugins: [
+ pluginNodePolyfill(),
+ pluginReact(),
+ pluginStyledComponents(),
+ pluginSass(),
+ pluginBabel({
+ include: /\.(?:js|jsx|tsx)$/,
+ babelLoaderOptions(opts) {
+ opts.plugins?.unshift('babel-plugin-react-compiler');
+ }
+ })
+ ],
+ source: {
+ tsconfigPath: './jsconfig.json', // Specifies the path to the JavaScript/TypeScript configuration file
+ },
+ html: {
+ title: 'Bruno'
+ },
+});
diff --git a/packages/bruno-app/src/components/Portal/index.js b/packages/bruno-app/src/components/Portal/index.js
index 4d34c0a04..7007c4766 100644
--- a/packages/bruno-app/src/components/Portal/index.js
+++ b/packages/bruno-app/src/components/Portal/index.js
@@ -1,8 +1,6 @@
import { createPortal } from 'react-dom';
-function Portal({ children, wrapperId }) {
- wrapperId = wrapperId || 'bruno-app-body';
-
- return createPortal(children, document.getElementById(wrapperId));
+function Portal({ children }) {
+ return createPortal(children, document.body);
}
export default Portal;
diff --git a/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js b/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js
index f6d4ff308..9f3e600d0 100644
--- a/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js
+++ b/packages/bruno-app/src/components/RequestPane/QueryUrl/index.js
@@ -70,7 +70,7 @@ const QueryUrl = ({ item, collection, handleRun }) => {
const handleGenerateCode = (e) => {
e.stopPropagation();
- if (item.request.url !== '' || (item.draft?.request.url !== undefined && item.draft?.request.url !== '')) {
+ if (item?.request?.url !== '' || (item.draft?.request?.url !== undefined && item.draft?.request?.url !== '')) {
setGenerateCodeItemModalOpen(true);
} else {
toast.error('URL is required');
diff --git a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/index.js b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/index.js
index 09b9552b5..fb380c20e 100644
--- a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/index.js
+++ b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/index.js
@@ -183,7 +183,7 @@ const CollectionItem = ({ item, collection, searchText }) => {
const handleGenerateCode = (e) => {
e.stopPropagation();
dropdownTippyRef.current.hide();
- if (item.request.url !== '' || (item.draft?.request.url !== undefined && item.draft?.request.url !== '')) {
+ if (item?.request?.url !== '' || (item?.draft?.request?.url !== undefined && item?.draft?.request?.url !== '')) {
setGenerateCodeItemModalOpen(true);
} else {
toast.error('URL is required');
diff --git a/packages/bruno-app/src/components/Table/index.js b/packages/bruno-app/src/components/Table/index.js
index 80bfb19f3..7c9b48d7d 100644
--- a/packages/bruno-app/src/components/Table/index.js
+++ b/packages/bruno-app/src/components/Table/index.js
@@ -63,16 +63,16 @@ const Table = ({ minColumnWidth = 1, headers = [], children }) => {
[activeColumnIndex, columns, minColumnWidth]
);
- const handleMouseUp = useCallback(() => {
- setActiveColumnIndex(null);
- removeListeners();
- }, [removeListeners]);
-
const removeListeners = useCallback(() => {
window.removeEventListener('mousemove', handleMouseMove);
window.removeEventListener('mouseup', removeListeners);
}, [handleMouseMove]);
+ const handleMouseUp = useCallback(() => {
+ setActiveColumnIndex(null);
+ removeListeners?.();
+ }, [removeListeners]);
+
useEffect(() => {
if (activeColumnIndex !== null) {
window.addEventListener('mousemove', handleMouseMove);
diff --git a/packages/bruno-app/src/index.js b/packages/bruno-app/src/index.js
new file mode 100644
index 000000000..0e5187ebe
--- /dev/null
+++ b/packages/bruno-app/src/index.js
@@ -0,0 +1,14 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import App from './pages/index';
+
+const rootElement = document.getElementById('root');
+
+if (rootElement) {
+ const root = ReactDOM.createRoot(rootElement);
+ root.render(
+