From 7c1f883c229150d88034a5a7c1e28e43d2e4c2b2 Mon Sep 17 00:00:00 2001 From: technologeek Date: Wed, 9 Oct 2024 15:38:20 +0530 Subject: [PATCH 1/4] feat: move -> React -> Solid + other migrations --- bun.lockb | Bin 228037 -> 207536 bytes package.json | 13 ++----- src/app/Flash.jsx | 97 +++++++++++++++++++++------------------------- src/app/index.jsx | 19 ++++----- src/main.jsx | 17 ++++---- vite.config.js | 4 +- 6 files changed, 71 insertions(+), 79 deletions(-) diff --git a/bun.lockb b/bun.lockb index d81811e493112846c551e535e2099881facd6c2b..24f67d16bfc50f1acd6a05adc5bc3a23ea9775c8 100755 GIT binary patch delta 49419 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 delta 62098 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Ͱ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 diff --git a/package.json b/package.json index 7968bfd..460baca 100644 --- a/package.json +++ b/package.json @@ -19,26 +19,21 @@ "comlink": "^4.4.1", "crc-32": "^1.2.2", "jssha": "^3.3.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "solid-js": "^1.8.15", "xz-decompress": "^0.2.1" }, "devDependencies": { "@tailwindcss/typography": "^0.5.13", "@testing-library/jest-dom": "^6.4.5", - "@testing-library/react": "^15.0.7", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.0", "autoprefixer": "10.4.14", "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.2", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-react-refresh": "^0.4.7", + "eslint-plugin-solid": "^0.13.1", "jsdom": "^22.1.0", "postcss": "^8.4.38", + "solid-testing-library": "^0.5.1", "tailwindcss": "^3.4.3", "vite": "^5.2.12", + "vite-plugin-solid": "^2.10.1", "vite-svg-loader": "^5.1.0", "vitest": "^1.6.0" } diff --git a/src/app/Flash.jsx b/src/app/Flash.jsx index 1bff6d1..55f3754 100644 --- a/src/app/Flash.jsx +++ b/src/app/Flash.jsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react' +import { createSignal, onCleanup } from 'solid-js' import { Step, Error, useQdl } from '@/utils/flash' @@ -121,12 +121,13 @@ const detachScript = [ const isLinux = navigator.userAgent.toLowerCase().includes('linux'); -function LinearProgress({ value, barColor }) { +function LinearProgress(props) { + let value = props.value if (value === -1 || value > 100) value = 100 return ( -
+
@@ -135,11 +136,11 @@ function LinearProgress({ value, barColor }) { function USBIndicator() { - return
+ return
@@ -153,32 +154,31 @@ function USBIndicator() { } -function SerialIndicator({ serial }) { - return
+function SerialIndicator(props) { + return
Serial: - {serial || 'unknown'} + {props.serial || 'unknown'}
} -function DeviceState({ serial }) { +function DeviceState(props) { return (
- | - + | +
) } function beforeUnloadListener(event) { - // NOTE: not all browsers will show this message event.preventDefault() return (event.returnValue = "Flash in progress. Are you sure you want to leave?") } @@ -190,21 +190,24 @@ export default function Flash() { message, progress, error, - onContinue, onRetry, - connected, serial, } = useQdl() - const handleContinue = useCallback(() => { - onContinue?.() - }, [onContinue]) + const [copied, setCopied] = createSignal(false); + + const handleCopy = () => { + setCopied(true); + setTimeout(() => { + setCopied(false); + }, 1000); + }; - const handleRetry = useCallback(() => { - onRetry?.() - }, [onRetry]) + onCleanup(() => { + window.removeEventListener("beforeunload", beforeUnloadListener, { capture: true }) + }) const uiState = steps[step] if (error) { @@ -222,64 +225,54 @@ export default function Flash() { title = status } - // warn the user if they try to leave the page while flashing if (Step.DOWNLOADING <= step && step <= Step.ERASING) { window.addEventListener("beforeunload", beforeUnloadListener, { capture: true }) } else { window.removeEventListener("beforeunload", beforeUnloadListener, { capture: true }) } - const [copied, setCopied] = useState(false); - const handleCopy = () => { - setCopied(true); - setTimeout(() => { - setCopied(false); - }, 1000); - }; - - return ( -
+
cable
-
+
- {title} - {description} + {title} + {description} {(title === "Lost connection" || title === "Ready") && isLinux && ( <> - - It seems that you're on Linux, make sure to run the script below in your terminal after plugging in your device. + + It seems that you're on Linux, make sure to run the script below in your terminal after plugging in your device. -
-
-
-
+          
+
+
+
                   {detachScript.map((line, index) => (
-                    
+                    
                       {line}
                     
                   ))}
                 
-
+
@@ -291,13 +284,13 @@ export default function Flash() { )} {error && ( - ) || false} + )} {connected && }
) -} +} \ No newline at end of file diff --git a/src/app/index.jsx b/src/app/index.jsx index cd4369f..3282125 100644 --- a/src/app/index.jsx +++ b/src/app/index.jsx @@ -1,4 +1,4 @@ -import { Suspense, lazy } from 'react' +import { createResource } from 'solid-js' import comma from '../assets/comma.svg' import fastbootPorts from '../assets/fastboot-ports.svg' @@ -9,12 +9,13 @@ const Flash = lazy(() => import('./Flash')) export default function App() { const version = import.meta.env.VITE_PUBLIC_GIT_SHA || 'dev' - console.info(`flash.comma.ai version: ${version}`); + console.info(`flash.comma.ai version: ${version}`) + return ( -
-
+
+
- comma + comma

flash.comma.ai

This tool allows you to flash AGNOS onto your comma device.

@@ -140,19 +141,19 @@ export default function App() {

-
+
-
- Loading...

}> +
+ Loading...

}>
-
+
flash.comma.ai version: {version.substring(0, 7)}
diff --git a/src/main.jsx b/src/main.jsx index 40fea3e..d7361d5 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,5 +1,4 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' +import { render } from 'solid-js/web' import '@fontsource-variable/inter' import '@fontsource-variable/jetbrains-mono' @@ -7,8 +6,12 @@ import '@fontsource-variable/jetbrains-mono' import './index.css' import App from './app' -ReactDOM.createRoot(document.getElementById('root')).render( - - - , -) +const root = document.getElementById('root') + +if (import.meta.env.DEV && !(root instanceof HTMLElement)) { + throw new Error( + 'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?', + ) +} + +render(() => , root) diff --git a/vite.config.js b/vite.config.js index ba64cd9..1542842 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,10 +1,10 @@ import { fileURLToPath, URL } from 'node:url'; import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import solidPlugin from 'vite-plugin-solid' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [solidPlugin()], resolve: { alias: [ { find: '@', replacement: fileURLToPath(new URL('./src', import.meta.url)) }, From 0081b0c2b7d7e05198f0e7462b10fcf24039df2f Mon Sep 17 00:00:00 2001 From: technologeek Date: Wed, 9 Oct 2024 16:45:33 +0530 Subject: [PATCH 2/4] fix: working-state: migrated all React components -> Solid --- src/app/App.test.jsx | 12 +++-- src/app/Flash.jsx | 75 +++++++++++++++------------ src/app/index.jsx | 2 +- src/utils/flash.js | 117 ++++++++++++++++++------------------------- src/utils/image.js | 18 ++++--- 5 files changed, 113 insertions(+), 111 deletions(-) diff --git a/src/app/App.test.jsx b/src/app/App.test.jsx index 206de72..6d5ba99 100644 --- a/src/app/App.test.jsx +++ b/src/app/App.test.jsx @@ -1,10 +1,16 @@ -import { Suspense } from 'react' +import { Suspense } from 'solid-js' import { expect, test } from 'vitest' -import { render, screen } from '@testing-library/react' +import { render, screen } from 'solid-testing-library' import App from '.' test('renders without crashing', () => { - render() + const { unmount } = render(() => ( + + + + )) + expect(screen.getByText('flash.comma.ai')).toBeInTheDocument() + unmount() }) diff --git a/src/app/Flash.jsx b/src/app/Flash.jsx index 55f3754..856322f 100644 --- a/src/app/Flash.jsx +++ b/src/app/Flash.jsx @@ -1,4 +1,4 @@ -import { createSignal, onCleanup } from 'solid-js' +import { createSignal, createMemo, onCleanup, createEffect } from 'solid-js' import { Step, Error, useQdl } from '@/utils/flash' @@ -205,55 +205,64 @@ export default function Flash() { }, 1000); }; - onCleanup(() => { - window.removeEventListener("beforeunload", beforeUnloadListener, { capture: true }) + const uiState = createMemo(() => { + const currentStep = steps[step()] + if (error()) { + return { ...currentStep, ...errors[Error.UNKNOWN], ...errors[error()] } + } + return currentStep }) - const uiState = steps[step] - if (error) { - Object.assign(uiState, errors[Error.UNKNOWN], errors[error]) - } - const { status, description, bgColor, icon, iconStyle = 'invert' } = uiState + const title = createMemo(() => { + if (message() && !error()) { + let t = message() + '...' + if (progress() >= 0) { + t += ` (${(progress() * 100).toFixed(0)}%)` + } + return t + } + return uiState().status + }) - let title - if (message && !error) { - title = message + '...' - if (progress >= 0) { - title += ` (${(progress * 100).toFixed(0)}%)` + createEffect(() => { + if (Step.DOWNLOADING <= step() && step() <= Step.ERASING) { + window.addEventListener("beforeunload", beforeUnloadListener, { capture: true }) + } else { + window.removeEventListener("beforeunload", beforeUnloadListener, { capture: true }) } - } else { - title = status - } + }) - if (Step.DOWNLOADING <= step && step <= Step.ERASING) { - window.addEventListener("beforeunload", beforeUnloadListener, { capture: true }) - } else { + onCleanup(() => { window.removeEventListener("beforeunload", beforeUnloadListener, { capture: true }) - } + }) return (
+> cable
-
- +
progress() === -1 ? 0 : 1 }}> + progress() * 100} barColor={() => uiState().bgColor} />
- {title} - {description} - {(title === "Lost connection" || title === "Ready") && isLinux && ( + {title()} + {() => uiState().description} + {() => (title() === "Lost connection" || title() === "Ready") && isLinux && ( <> - + It seems that you're on Linux, make sure to run the script below in your terminal after plugging in your device.
@@ -272,7 +281,7 @@ export default function Flash() { navigator.clipboard.writeText(detachScript.join('\n')); handleCopy(); }} - class={`bg-${copied() ? 'green' : 'blue'}-500 text-white px-1 py-1 rounded-md ml-2 text-sm`} + class={() => `bg-${copied() ? 'green' : 'blue'}-500 text-white px-1 py-1 rounded-md ml-2 text-sm`} > Copy @@ -282,7 +291,7 @@ export default function Flash() {
)} - {error && ( + {error() && (
) } \ No newline at end of file diff --git a/src/app/index.jsx b/src/app/index.jsx index 3282125..235879c 100644 --- a/src/app/index.jsx +++ b/src/app/index.jsx @@ -1,4 +1,4 @@ -import { createResource } from 'solid-js' +import { createResource, lazy, Suspense } from 'solid-js' import comma from '../assets/comma.svg' import fastbootPorts from '../assets/fastboot-ports.svg' diff --git a/src/utils/flash.js b/src/utils/flash.js index 0fe2776..2edee36 100644 --- a/src/utils/flash.js +++ b/src/utils/flash.js @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { createSignal, createEffect, onCleanup } from 'solid-js' import { concatUint8Array } from '@/QDL/utils' import { qdlDevice } from '@/QDL/qdl' @@ -10,10 +10,6 @@ import { useImageWorker } from '@/utils/image' import { createManifest } from '@/utils/manifest' import { withProgress } from '@/utils/progress' -/** - * @typedef {import('./manifest.js').Image} Image - */ - export const Step = { INITIALIZING: 0, READY: 1, @@ -39,13 +35,11 @@ export const Error = { } function isRecognizedDevice(slotCount, partitions) { - if (slotCount !== 2) { console.error('[QDL] Unrecognised device (slotCount)') return false } - // check we have the expected partitions to make sure it's a comma three const expectedPartitions = [ "ALIGN_TO_128K_1", "ALIGN_TO_128K_2", "ImageFv", "abl", "aop", "apdp", "bluetooth", "boot", "cache", "cdt", "cmnlib", "cmnlib64", "ddr", "devcfg", "devinfo", "dip", "dsp", "fdemeta", "frp", "fsc", "fsg", @@ -61,82 +55,77 @@ function isRecognizedDevice(slotCount, partitions) { return true } - export function useQdl() { - const [step, _setStep] = useState(Step.INITIALIZING) - const [message, _setMessage] = useState('') - const [progress, setProgress] = useState(0) - const [error, _setError] = useState(Error.NONE) + const [step, _setStep] = createSignal(Step.INITIALIZING) + const [message, _setMessage] = createSignal('') + const [progress, setProgress] = createSignal(0) + const [error, _setError] = createSignal(Error.NONE) - const [connected, setConnected] = useState(false) - const [serial, setSerial] = useState(null) + const [connected, setConnected] = createSignal(false) + const [serial, setSerial] = createSignal(null) - const [onContinue, setOnContinue] = useState(null) - const [onRetry, setOnRetry] = useState(null) + const [onContinue, setOnContinue] = createSignal(null) + const [onRetry, setOnRetry] = createSignal(null) const imageWorker = useImageWorker() - const qdl = useRef(new qdlDevice()) + const [qdl] = createSignal(new qdlDevice()) - /** @type {React.RefObject} */ - const manifest = useRef(null) + const [manifest, setManifest] = createSignal(null) - function setStep(step) { - _setStep(step) + function setStep(newStep) { + _setStep(newStep) } - function setMessage(message = '') { - if (message) console.info('[QDL]', message) - _setMessage(message) + function setMessage(newMessage = '') { + if (newMessage) console.info('[QDL]', newMessage) + _setMessage(newMessage) } - function setError(error) { - _setError(error) + function setError(newError) { + _setError(newError) } - useEffect(() => { + + createEffect(() => { setProgress(-1) setMessage() - if (error) return - if (!imageWorker.current) { + if (error()) return + if (!imageWorker().current) { console.debug('[QDL] Waiting for image worker') return } - switch (step) { + switch (step()) { case Step.INITIALIZING: { - // Check that the browser supports WebUSB if (typeof navigator.usb === 'undefined') { console.error('[QDL] WebUSB not supported') setError(Error.REQUIREMENTS_NOT_MET) break } - // Check that the browser supports Web Workers if (typeof Worker === 'undefined') { console.error('[QDL] Web Workers not supported') setError(Error.REQUIREMENTS_NOT_MET) break } - // Check that the browser supports Storage API if (typeof Storage === 'undefined') { console.error('[QDL] Storage API not supported') setError(Error.REQUIREMENTS_NOT_MET) break } - imageWorker.current?.init() + imageWorker().current?.init() .then(() => download(config.manifests['release'])) .then(blob => blob.text()) .then(text => { - manifest.current = createManifest(text) + setManifest(createManifest(text)) - // sanity check - if (manifest.current.length === 0) { + if (manifest().length === 0) { throw 'Manifest is empty' } - console.debug('[QDL] Loaded manifest', manifest.current) + console.debug('[QDL] Loaded manifest', manifest()) setStep(Step.READY) }) .catch((err) => { @@ -147,7 +136,6 @@ export function useQdl() { } case Step.READY: { - // wait for user interaction (we can't use WebUSB without user event) setOnContinue(() => () => { setOnContinue(null) setStep(Step.CONNECTING) @@ -156,10 +144,10 @@ export function useQdl() { } case Step.CONNECTING: { - qdl.current.waitForConnect() + qdl().waitForConnect() .then(() => { console.info('[QDL] Connected') - return qdl.current.getDevicePartitionsInfo() + return qdl().getDevicePartitionsInfo() .then(([slotCount, partitions]) => { const recognized = isRecognizedDevice(slotCount, partitions) console.debug('[QDL] Device info', { recognized, partitions}) @@ -169,7 +157,7 @@ export function useQdl() { return } - setSerial(qdl.current.sahara.serial || 'unknown') + setSerial(qdl().sahara.serial || 'unknown') setConnected(true) setStep(Step.DOWNLOADING) }) @@ -183,7 +171,7 @@ export function useQdl() { setError(Error.LOST_CONNECTION) setConnected(false) }) - qdl.current.connect() + qdl().connect() .catch((err) => { console.error('[QDL] Connection error', err) setStep(Step.READY) @@ -195,9 +183,9 @@ export function useQdl() { setProgress(0) async function downloadImages() { - for await (const [image, onProgress] of withProgress(manifest.current, setProgress)) { + for await (const [image, onProgress] of withProgress(manifest(), setProgress)) { setMessage(`Downloading ${image.name}`) - await imageWorker.current.downloadImage(image, Comlink.proxy(onProgress)) + await imageWorker().current.downloadImage(image, Comlink.proxy(onProgress)) } } @@ -217,9 +205,9 @@ export function useQdl() { setProgress(0) async function unpackImages() { - for await (const [image, onProgress] of withProgress(manifest.current, setProgress)) { + for await (const [image, onProgress] of withProgress(manifest(), setProgress)) { setMessage(`Unpacking ${image.name}`) - await imageWorker.current.unpackImage(image, Comlink.proxy(onProgress)) + await imageWorker().current.unpackImage(image, Comlink.proxy(onProgress)) } } @@ -243,28 +231,26 @@ export function useQdl() { setProgress(0) async function flashDevice() { - const currentSlot = await qdl.current.getActiveSlot(); + const currentSlot = await qdl().getActiveSlot(); if (!['a', 'b'].includes(currentSlot)) { throw `Unknown current slot ${currentSlot}` } const otherSlot = currentSlot === 'a' ? 'b' : 'a' - // Erase current xbl partition so if users try to power up device - // with corrupted primary gpt header, it would not update the backup - await qdl.current.erase("xbl"+`_${currentSlot}`) + await qdl().erase("xbl"+`_${currentSlot}`) - for await (const [image, onProgress] of withProgress(manifest.current, setProgress)) { - const fileHandle = await imageWorker.current.getImage(image) + for await (const [image, onProgress] of withProgress(manifest(), setProgress)) { + const fileHandle = await imageWorker().current.getImage(image) const blob = await fileHandle.getFile() setMessage(`Flashing ${image.name}`) const partitionName = image.name + `_${otherSlot}` - await qdl.current.flashBlob(partitionName, blob, onProgress) + await qdl().flashBlob(partitionName, blob, onProgress) } console.debug('[QDL] Flashed all partitions') setMessage(`Changing slot to ${otherSlot}`) - await qdl.current.setActiveSlot(otherSlot) + await qdl().setActiveSlot(otherSlot) } flashDevice() @@ -284,8 +270,8 @@ export function useQdl() { async function resetUserdata() { let wData = new TextEncoder().encode("COMMA_RESET") - wData = new Blob([concatUint8Array([wData, new Uint8Array(28 - wData.length).fill(0)])]) // make equal sparseHeaderSize - await qdl.current.flashBlob("userdata", wData) + wData = new Blob([concatUint8Array([wData, new Uint8Array(28 - wData.length).fill(0)])]) + await qdl().flashBlob("userdata", wData) } async function eraseDevice() { @@ -294,7 +280,7 @@ export function useQdl() { setProgress(0.9) setMessage('Rebooting') - await qdl.current.reset() + await qdl().reset() setProgress(1) setConnected(false) } @@ -311,11 +297,11 @@ export function useQdl() { break } } - }, [error, imageWorker, step]) + }) - useEffect(() => { - if (error !== Error.NONE) { - console.debug('[QDL] error', error) + createEffect(() => { + if (error() !== Error.NONE) { + console.debug('[QDL] error', error()) setProgress(-1) setOnContinue(null) @@ -324,19 +310,16 @@ export function useQdl() { window.location.reload() }) } - }, [error]) + }) return { step, message, progress, error, - connected, serial, - onContinue, onRetry, } -} - +} \ No newline at end of file diff --git a/src/utils/image.js b/src/utils/image.js index ed27f09..f781b66 100644 --- a/src/utils/image.js +++ b/src/utils/image.js @@ -1,17 +1,21 @@ -import { useEffect, useRef } from 'react' - +import { createSignal, createEffect, onCleanup } from 'solid-js' import * as Comlink from 'comlink' export function useImageWorker() { - const apiRef = useRef() + const [apiRef, setApiRef] = createSignal({ current: null }) - useEffect(() => { + createEffect(() => { const worker = new Worker(new URL('../workers/image.worker', import.meta.url), { type: 'module', }) - apiRef.current = Comlink.wrap(worker) - return () => worker.terminate() - }, []) + const wrappedWorker = Comlink.wrap(worker) + setApiRef({ current: wrappedWorker }) + + onCleanup(() => { + worker.terminate() + setApiRef({ current: null }) + }) + }) return apiRef } From 171d6c9a366731ab077582166d79723559957b7f Mon Sep 17 00:00:00 2001 From: technologeek Date: Wed, 9 Oct 2024 16:58:15 +0530 Subject: [PATCH 3/4] test: broken tests but features working OK --- .eslintrc.json | 21 +++------------------ bun.lockb | Bin 207536 -> 207536 bytes package.json | 2 +- src/app/App.test.jsx | 25 ++++++++++++++----------- 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index dc9027b..ebfca5d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,9 +7,7 @@ }, "extends": [ "eslint:recommended", - "plugin:react/recommended", - "plugin:react/jsx-runtime", - "plugin:react-hooks/recommended" + "plugin:solid/recommended" ], "ignorePatterns": [ "node_modules", @@ -20,13 +18,8 @@ "ecmaVersion": "latest", "sourceType": "module" }, - "settings": { - "react": { - "version": "detect" - } - }, "plugins": [ - "react-refresh" + "solid" ], "rules": { "no-constant-condition": [ @@ -35,14 +28,6 @@ "checkLoops": false } ], - "no-inner-declarations": "off", - "react/jsx-no-target-blank": "off", - "react/prop-types": "off", - "react-refresh/only-export-components": [ - "warn", - { - "allowConstantExport": true - } - ] + "no-inner-declarations": "off" } } diff --git a/bun.lockb b/bun.lockb index 24f67d16bfc50f1acd6a05adc5bc3a23ea9775c8..b4d3165b1018f660ce8dc2fd615015bec5ae5610 100755 GIT binary patch delta 28030 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 HiYxyQ#n1;3 delta 27797 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%0A#>4I>e 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 { - const { unmount } = render(() => ( - - - - )) - - expect(screen.getByText('flash.comma.ai')).toBeInTheDocument() - unmount() +//todo-breaking test due to React -> SolidJS migration +describe('App', () => { + it('renders without crashing', () => { + const { unmount } = render(() => ( + + + + )) + + expect(screen.getByText('flash.comma.ai')).toBeInTheDocument() + unmount() + }) }) From 633688fcda5452c77da719d4b6a037eb034ce831 Mon Sep 17 00:00:00 2001 From: technologeek Date: Wed, 9 Oct 2024 17:31:07 +0530 Subject: [PATCH 4/4] chore: clean-up text --- src/main.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.jsx b/src/main.jsx index d7361d5..07c6732 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -10,7 +10,7 @@ const root = document.getElementById('root') if (import.meta.env.DEV && !(root instanceof HTMLElement)) { throw new Error( - 'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?', + 'Root element not found', ) }