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( + + + + ); +} diff --git a/packages/bruno-app/src/pages/_app.js b/packages/bruno-app/src/pages/Main.js similarity index 62% rename from packages/bruno-app/src/pages/_app.js rename to packages/bruno-app/src/pages/Main.js index 08ebe6b0b..ba7b3289e 100644 --- a/packages/bruno-app/src/pages/_app.js +++ b/packages/bruno-app/src/pages/Main.js @@ -25,31 +25,7 @@ import '@fontsource/inter/900.css'; import { setupPolyfills } from 'utils/common/setupPolyfills'; setupPolyfills(); -function SafeHydrate({ children }) { - return
{typeof window === 'undefined' ? null : children}
; -} - -function NoSsr({ children }) { - const SERVER_RENDERED = typeof window === 'undefined'; - - if (SERVER_RENDERED) { - return null; - } - - return <>{children}; -} - -function MyApp({ Component, pageProps }) { - const [domLoaded, setDomLoaded] = useState(false); - - useEffect(() => { - setDomLoaded(true); - }, []); - - if (!domLoaded) { - return null; - } - +function Main({ children }) { if (!window.ipcRenderer) { return (