From 1c6adbd2fda7e874a2b60dcb944323f5a4e3f8a5 Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Sat, 12 Jul 2025 17:34:29 +0200 Subject: [PATCH] refactor: upgrade react and add compiler --- apps/client/package.json | 13 +- .../input/auto-textarea/AutoTextarea.tsx | 2 +- .../input/text-input/useReactiveTextInput.tsx | 2 +- apps/client/src/common/hooks/useLongPress.tsx | 64 ---- apps/client/src/common/hooks/useMemoisedFn.ts | 2 +- .../app-settings/panel-utils/PanelUtils.tsx | 6 +- .../operator/operator-event/OperatorEvent.tsx | 9 +- .../views/common/schedule/ScheduleContext.tsx | 4 +- .../cuesheet-table-elements/CuesheetBody.tsx | 2 +- apps/client/vite.config.js | 9 +- pnpm-lock.yaml | 313 ++++++++---------- 11 files changed, 176 insertions(+), 250 deletions(-) delete mode 100644 apps/client/src/common/hooks/useLongPress.tsx diff --git a/apps/client/package.json b/apps/client/package.json index 4ce3d5c62..73069cdfd 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -18,11 +18,12 @@ "@tanstack/react-table": "^8.21.3", "autosize": "^6.0.1", "axios": "^1.9.0", + "babel-plugin-react-compiler": "19.1.0-rc.2", "csv-stringify": "^6.4.5", "prismjs": "^1.29.0", - "react": "^18.3.1", + "react": "^19.1.0", "react-colorful": "^5.6.1", - "react-dom": "^18.3.1", + "react-dom": "^19.1.0", "react-fast-compare": "^3.2.2", "react-hook-form": "^7.53.1", "react-icons": "5.4.0", @@ -63,8 +64,8 @@ "@sentry/vite-plugin": "^2.16.1", "@tanstack/eslint-plugin-query": "^5.8.4", "@types/prismjs": "^1.26.5", - "@types/react": "^18.0.26", - "@types/react-dom": "^18.0.10", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", "@typescript-eslint/eslint-plugin": "catalog:", "@typescript-eslint/parser": "catalog:", "@vitejs/plugin-react": "4.5.1", @@ -74,7 +75,7 @@ "eslint-plugin-prettier": "catalog:", "eslint-plugin-react": "^7.32.0", "eslint-plugin-react-compiler": "19.1.0-rc.2", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-simple-import-sort": "^8.0.0", "ontime-types": "workspace:*", "ontime-utils": "workspace:*", @@ -82,7 +83,7 @@ "sass": "^1.57.1", "typescript": "catalog:", "vite": "6.3.1", - "vite-plugin-compression2": "1.4.0", + "vite-plugin-compression2": "2.2.0", "vite-plugin-svgr": "4.3.0", "vite-tsconfig-paths": "5.1.4", "vitest": "catalog:" diff --git a/apps/client/src/common/components/input/auto-textarea/AutoTextarea.tsx b/apps/client/src/common/components/input/auto-textarea/AutoTextarea.tsx index c7a5b3928..ba91fd1a3 100644 --- a/apps/client/src/common/components/input/auto-textarea/AutoTextarea.tsx +++ b/apps/client/src/common/components/input/auto-textarea/AutoTextarea.tsx @@ -5,7 +5,7 @@ import autosize from 'autosize/dist/autosize'; import Textarea, { type TextareaProps } from '../textarea/Textarea'; interface AutoTextAreaProps extends TextareaProps { - inputref: RefObject; + inputref: RefObject; } /** diff --git a/apps/client/src/common/components/input/text-input/useReactiveTextInput.tsx b/apps/client/src/common/components/input/text-input/useReactiveTextInput.tsx index 9a2de9f80..3185e40d5 100644 --- a/apps/client/src/common/components/input/text-input/useReactiveTextInput.tsx +++ b/apps/client/src/common/components/input/text-input/useReactiveTextInput.tsx @@ -11,7 +11,7 @@ interface UseReactiveTextInputReturn { export default function useReactiveTextInput( initialText: string, submitCallback: (newValue: string) => void, - ref: RefObject, + ref: RefObject, options?: { submitOnEnter?: boolean; submitOnCtrlEnter?: boolean; diff --git a/apps/client/src/common/hooks/useLongPress.tsx b/apps/client/src/common/hooks/useLongPress.tsx deleted file mode 100644 index 22f7c3782..000000000 --- a/apps/client/src/common/hooks/useLongPress.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { MouseEvent, SyntheticEvent, TouchEvent, useMemo, useRef } from 'react'; - -type LongPressOptions = { - threshold?: number; - onStart?: (e: SyntheticEvent) => void; - onFinish?: (e: SyntheticEvent) => void; - onCancel?: (e: SyntheticEvent) => void; -}; - -type LongPressFns = { - onMouseDown: (e: MouseEvent) => void; - onMouseUp: (e: MouseEvent) => void; - onMouseLeave: (e: MouseEvent) => void; - onTouchStart: (e: TouchEvent) => void; - onTouchEnd: (e: TouchEvent) => void; -}; - -export default function useLongPress(callback: () => void, options: LongPressOptions = {}): LongPressFns { - const { threshold = 400, onStart, onFinish, onCancel } = options; - const isLongPressActive = useRef(false); - const isPressed = useRef(false); - const timerId = useRef(); - - return useMemo(() => { - const start = (event: SyntheticEvent) => { - if (onStart) { - onStart(event); - } - - isPressed.current = true; - timerId.current = setTimeout(() => { - callback(); - isLongPressActive.current = true; - }, threshold); - }; - - const cancel = (event: SyntheticEvent) => { - if (isLongPressActive.current) { - if (onFinish) { - onFinish(event); - } - } else if (isPressed.current) { - if (onCancel) { - onCancel(event); - } - } - - isLongPressActive.current = false; - isPressed.current = false; - - if (timerId.current) { - clearTimeout(timerId.current); - } - }; - - return { - onMouseDown: start, - onMouseUp: cancel, - onMouseLeave: cancel, - onTouchStart: start, - onTouchEnd: cancel, - }; - }, [callback, threshold, onCancel, onFinish, onStart]); -} diff --git a/apps/client/src/common/hooks/useMemoisedFn.ts b/apps/client/src/common/hooks/useMemoisedFn.ts index b1a1545b5..c28058a31 100644 --- a/apps/client/src/common/hooks/useMemoisedFn.ts +++ b/apps/client/src/common/hooks/useMemoisedFn.ts @@ -27,7 +27,7 @@ export default function useMemoisedFn(fn: T) { // https://github.com/alibaba/hooks/issues/728 fnRef.current = useMemo(() => fn, [fn]); - const memoizedFn = useRef>(); + const memoizedFn = useRef>(undefined); if (!memoizedFn.current) { memoizedFn.current = function (this, ...args) { return fnRef.current.apply(this, args); diff --git a/apps/client/src/features/app-settings/panel-utils/PanelUtils.tsx b/apps/client/src/features/app-settings/panel-utils/PanelUtils.tsx index ceb3d0cad..98fbc4d74 100644 --- a/apps/client/src/features/app-settings/panel-utils/PanelUtils.tsx +++ b/apps/client/src/features/app-settings/panel-utils/PanelUtils.tsx @@ -22,7 +22,7 @@ type AllowedTags = 'div' | 'form'; type SectionProps = { as?: C; children: ReactNode; -} & JSX.IntrinsicElements[C]; +} & React.JSX.IntrinsicElements[C]; export function Section({ as, className, children, ...props }: SectionProps) { const Element = as ?? 'div'; @@ -46,7 +46,7 @@ export function Paragraph({ children }: { children: ReactNode }) { return

{children}

; } -export function Card({ children, className, ...props }: { children: ReactNode } & JSX.IntrinsicElements['div']) { +export function Card({ children, className, ...props }: { children: ReactNode } & React.JSX.IntrinsicElements['div']) { return (
{children} @@ -107,7 +107,7 @@ export function BlockQuote({ children }: { children: ReactNode }) { return
{children}
; } -export function Error({ children, className }: { children: ReactNode } & JSX.IntrinsicElements['div']) { +export function Error({ children, className }: { children: ReactNode } & React.JSX.IntrinsicElements['div']) { return
{children}
; } diff --git a/apps/client/src/features/operator/operator-event/OperatorEvent.tsx b/apps/client/src/features/operator/operator-event/OperatorEvent.tsx index 3a1724051..361a64ee3 100644 --- a/apps/client/src/features/operator/operator-event/OperatorEvent.tsx +++ b/apps/client/src/features/operator/operator-event/OperatorEvent.tsx @@ -1,8 +1,8 @@ import { memo, RefObject, SyntheticEvent } from 'react'; +import { useLongPress } from '@mantine/hooks'; import { MILLIS_PER_MINUTE, MILLIS_PER_SECOND } from 'ontime-utils'; import DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator'; -import useLongPress from '../../../common/hooks/useLongPress'; import { cx, getAccessibleColour } from '../../../common/utils/styleUtils'; import { formatDuration, useTimeUntilStart } from '../../../common/utils/time'; import RunningTime from '../../viewers/common/running-time/RunningTime'; @@ -23,7 +23,7 @@ interface OperatorEventProps { isLinkedToLoaded: boolean; isSelected: boolean; isPast: boolean; - selectedRef?: RefObject; + selectedRef?: RefObject; subscribed: Subscribed; totalGap: number; onLongPress: (event: EditEvent) => void; @@ -48,6 +48,9 @@ function OperatorEvent({ totalGap, onLongPress, }: OperatorEventProps) { + /** + * gather behaviour for long press and context menu + */ const handleLongPress = (event?: SyntheticEvent) => { // we dont have an event out of useLongPress event?.preventDefault(); @@ -56,7 +59,7 @@ function OperatorEvent({ } }; - const mouseHandlers = useLongPress(handleLongPress, { threshold: 800 }); + const mouseHandlers = useLongPress(handleLongPress); const cueColours = colour && getAccessibleColour(colour); const operatorClasses = cx([ diff --git a/apps/client/src/views/common/schedule/ScheduleContext.tsx b/apps/client/src/views/common/schedule/ScheduleContext.tsx index 550e1f8ba..968f19e28 100644 --- a/apps/client/src/views/common/schedule/ScheduleContext.tsx +++ b/apps/client/src/views/common/schedule/ScheduleContext.tsx @@ -19,7 +19,7 @@ interface ScheduleContextState { selectedEventId: string | null; numPages: number; visiblePage: number; - containerRef: RefObject; + containerRef: RefObject; } const ScheduleContext = createContext(undefined); @@ -39,7 +39,7 @@ export const ScheduleProvider = ({ children, selectedEventId }: PropsWithChildre const [visiblePage, setVisiblePage] = useState(0); const lastIndex = useRef(-1); - const paginator = useRef(); + const paginator = useRef(undefined); const containerRef = useRef(null); diff --git a/apps/client/src/views/cuesheet/cuesheet-table/cuesheet-table-elements/CuesheetBody.tsx b/apps/client/src/views/cuesheet/cuesheet-table/cuesheet-table-elements/CuesheetBody.tsx index 5826d5770..b61e05bfd 100644 --- a/apps/client/src/views/cuesheet/cuesheet-table/cuesheet-table-elements/CuesheetBody.tsx +++ b/apps/client/src/views/cuesheet/cuesheet-table/cuesheet-table-elements/CuesheetBody.tsx @@ -26,7 +26,7 @@ import { cleanup } from './rowObserver'; interface CuesheetBodyProps { rowModel: RowModel; - selectedRef: RefObject; + selectedRef: RefObject; table: Table; } diff --git a/apps/client/vite.config.js b/apps/client/vite.config.js index 73ae3980c..92a7e275b 100644 --- a/apps/client/vite.config.js +++ b/apps/client/vite.config.js @@ -9,11 +9,18 @@ import { ONTIME_VERSION } from './src/ONTIME_VERSION'; const sentryAuthToken = process.env.SENTRY_AUTH_TOKEN; const isDev = process.env.NODE_ENV === 'local' || process.env.NODE_ENV === 'development'; +const ReactCompilerConfig = { + runtimeModule: '@/mycache', +}; export default defineConfig({ base: './', // Ontime cloud: we use relative paths to allow them to reference a dynamic base set at runtime plugins: [ - react(), + react({ + babel: { + plugins: [['babel-plugin-react-compiler', ReactCompilerConfig]], + }, + }), svgrPlugin(), !isDev && sentryVitePlugin({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11db95f17..bb9cefe99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,16 +88,16 @@ importers: dependencies: '@base-ui-components/react': specifier: 1.0.0-beta.1 - version: 1.0.0-beta.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.0.0-beta.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@18.3.1) + version: 3.2.2(react@19.1.0) '@emotion/is-prop-valid': specifier: ^1.3.1 version: 1.3.1 @@ -106,28 +106,31 @@ importers: version: 5.2.6 '@mantine/hooks': specifier: ^8.1.2 - version: 8.1.2(react@18.3.1) + version: 8.1.2(react@19.1.0) '@sentry/react': specifier: ^8.43.0 - version: 8.55.0(react@18.3.1) + version: 8.55.0(react@19.1.0) '@table-nav/react': specifier: ^0.0.7 version: 0.0.7(@table-nav/core@0.0.7) '@tanstack/react-query': specifier: ^5.62.7 - version: 5.81.5(react@18.3.1) + version: 5.81.5(react@19.1.0) '@tanstack/react-query-devtools': specifier: ^5.62.7 - version: 5.81.5(@tanstack/react-query@5.81.5(react@18.3.1))(react@18.3.1) + version: 5.81.5(@tanstack/react-query@5.81.5(react@19.1.0))(react@19.1.0) '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) autosize: specifier: ^6.0.1 version: 6.0.1 axios: specifier: ^1.9.0 version: 1.10.0 + babel-plugin-react-compiler: + specifier: 19.1.0-rc.2 + version: 19.1.0-rc.2 csv-stringify: specifier: ^6.4.5 version: 6.5.2 @@ -135,38 +138,38 @@ importers: specifier: ^1.29.0 version: 1.30.0 react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.1.0 + version: 19.1.0 react-colorful: specifier: ^5.6.1 - version: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) react-fast-compare: specifier: ^3.2.2 version: 3.2.2 react-hook-form: specifier: ^7.53.1 - version: 7.59.0(react@18.3.1) + version: 7.59.0(react@19.1.0) react-icons: specifier: 5.4.0 - version: 5.4.0(react@18.3.1) + version: 5.4.0(react@19.1.0) react-qr-code: specifier: ^2.0.12 - version: 2.0.16(react@18.3.1) + version: 2.0.16(react@19.1.0) react-router-dom: specifier: ^6.3.0 - version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.30.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-simple-code-editor: specifier: ^0.14.1 - version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.14.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) web-vitals: specifier: ^3.1.1 version: 3.5.2 zustand: specifier: ^5.0.3 - version: 5.0.6(@types/react@18.3.23)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) + version: 5.0.6(@types/react@19.1.8)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) devDependencies: '@sentry/vite-plugin': specifier: ^2.16.1 @@ -178,11 +181,11 @@ importers: specifier: ^1.26.5 version: 1.26.5 '@types/react': - specifier: ^18.0.26 - version: 18.3.23 + specifier: ^19.1.8 + version: 19.1.8 '@types/react-dom': - specifier: ^18.0.10 - version: 18.3.7(@types/react@18.3.23) + specifier: ^19.1.6 + version: 19.1.6(@types/react@19.1.8) '@typescript-eslint/eslint-plugin': specifier: 'catalog:' version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.56.0)(typescript@5.5.3))(eslint@8.56.0)(typescript@5.5.3) @@ -211,8 +214,8 @@ importers: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2(eslint@8.56.0) eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.56.0) + specifier: ^5.2.0 + version: 5.2.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^8.0.0 version: 8.0.0(eslint@8.56.0) @@ -235,8 +238,8 @@ importers: specifier: 6.3.1 version: 6.3.1(@types/node@22.15.26)(jiti@2.4.2)(sass@1.89.2)(tsx@4.20.3) vite-plugin-compression2: - specifier: 1.4.0 - version: 1.4.0(rollup@4.41.1)(vite@6.3.1(@types/node@22.15.26)(jiti@2.4.2)(sass@1.89.2)(tsx@4.20.3)) + specifier: 2.2.0 + version: 2.2.0(rollup@4.41.1) vite-plugin-svgr: specifier: 4.3.0 version: 4.3.0(rollup@4.41.1)(typescript@5.5.3)(vite@6.3.1(@types/node@22.15.26)(jiti@2.4.2)(sass@1.89.2)(tsx@4.20.3)) @@ -1335,15 +1338,6 @@ packages: '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} @@ -1751,22 +1745,19 @@ packages: '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - '@types/prop-types@15.7.5': - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - '@types/qs@6.9.7': resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} '@types/range-parser@1.2.4': resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} peerDependencies: - '@types/react': ^18.0.0 + '@types/react': ^19.0.0 - '@types/react@18.3.23': - resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -2122,6 +2113,9 @@ packages: axios@1.10.0: resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + babel-plugin-react-compiler@19.1.0-rc.2: + resolution: {integrity: sha512-kSNA//p5fMO6ypG8EkEVPIqAjwIXm5tMjfD1XRPL/sRjYSbJ6UsvORfaeolNWnZ9n310aM0xJP7peW26BuCVzA==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2800,11 +2794,11 @@ packages: peerDependencies: eslint: '>=7' - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} @@ -4123,10 +4117,10 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: - react: ^18.3.1 + react: ^19.1.0 react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -4173,8 +4167,8 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} read-binary-file-arch@1.0.6: @@ -4323,8 +4317,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -4857,10 +4851,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-plugin-compression2@1.4.0: - resolution: {integrity: sha512-UEk0Bq1IkkwqbDLoLOHZ8WTmN1QbvR28fvNl2liB88/6SG1oLrTVkxfjqW3pdla/rKQ6QXn+pJpv3GBbl+k56g==} - peerDependencies: - vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0 + vite-plugin-compression2@2.2.0: + resolution: {integrity: sha512-7BZlU2mBHbqoBGy0ARkn3tv/7LC/2h8ewVDpG/cyH8iSzLw6E/yH6P4oBOEvchkQxNpl+B5W6rFR5fdSwfDhMA==} vite-plugin-svgr@4.3.0: resolution: {integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==} @@ -5167,7 +5159,7 @@ snapshots: '@babel/parser': 7.23.6 '@babel/template': 7.22.15 '@babel/traverse': 7.23.6 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -5218,7 +5210,7 @@ snapshots: '@babel/generator@7.23.6': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 @@ -5226,14 +5218,14 @@ snapshots: '@babel/generator@7.27.5': dependencies: '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helper-compilation-targets@7.23.6': dependencies: @@ -5269,16 +5261,16 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color @@ -5320,7 +5312,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helper-plugin-utils@7.27.1': {} @@ -5335,18 +5327,18 @@ snapshots: '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.27.4 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helper-string-parser@7.23.4': {} @@ -5364,14 +5356,14 @@ snapshots: dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.23.6 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 transitivePeerDependencies: - supports-color '@babel/helpers@7.27.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/helpers@7.27.6': dependencies: @@ -5387,7 +5379,7 @@ snapshots: '@babel/parser@7.23.6': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/parser@7.27.5': dependencies: @@ -5421,13 +5413,13 @@ snapshots: dependencies: '@babel/code-frame': 7.24.2 '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@babel/traverse@7.23.6': dependencies: @@ -5438,7 +5430,7 @@ snapshots: '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: @@ -5450,7 +5442,7 @@ snapshots: '@babel/generator': 7.27.5 '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: @@ -5484,47 +5476,47 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-ui-components/react@1.0.0-beta.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@base-ui-components/react@1.0.0-beta.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.27.6 - '@floating-ui/react-dom': 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@floating-ui/utils': 0.2.10 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) reselect: 5.1.1 tabbable: 6.2.0 - use-sync-external-store: 1.5.0(react@18.3.1) + use-sync-external-store: 1.5.0(react@19.1.0) optionalDependencies: - '@types/react': 18.3.23 + '@types/react': 19.1.8 '@develar/schema-utils@2.6.5': dependencies: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - '@dnd-kit/accessibility@3.1.1(react@18.3.1)': + '@dnd-kit/accessibility@3.1.1(react@19.1.0)': dependencies: - react: 18.3.1 + react: 19.1.0 tslib: 2.6.2 - '@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@dnd-kit/accessibility': 3.1.1(react@18.3.1) - '@dnd-kit/utilities': 3.2.2(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@dnd-kit/accessibility': 3.1.1(react@19.1.0) + '@dnd-kit/utilities': 3.2.2(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) tslib: 2.6.2 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@dnd-kit/utilities': 3.2.2(react@18.3.1) - react: 18.3.1 + '@dnd-kit/core': 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@dnd-kit/utilities': 3.2.2(react@19.1.0) + react: 19.1.0 tslib: 2.6.2 - '@dnd-kit/utilities@3.2.2(react@18.3.1)': + '@dnd-kit/utilities@3.2.2(react@19.1.0)': dependencies: - react: 18.3.1 + react: 19.1.0 tslib: 2.6.2 '@electron/asar@3.4.1': @@ -5844,11 +5836,11 @@ snapshots: '@floating-ui/core': 1.7.2 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/dom': 1.7.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) '@floating-ui/utils@0.2.10': {} @@ -5957,9 +5949,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@mantine/hooks@8.1.2(react@18.3.1)': + '@mantine/hooks@8.1.2(react@19.1.0)': dependencies: - react: 18.3.1 + react: 19.1.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6057,14 +6049,6 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.9': {} - '@rollup/pluginutils@5.1.0(rollup@4.41.1)': - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.41.1 - '@rollup/pluginutils@5.1.4(rollup@4.41.1)': dependencies: '@types/estree': 1.0.5 @@ -6217,12 +6201,12 @@ snapshots: '@sentry/core@8.55.0': {} - '@sentry/react@8.55.0(react@18.3.1)': + '@sentry/react@8.55.0(react@19.1.0)': dependencies: '@sentry/browser': 8.55.0 '@sentry/core': 8.55.0 hoist-non-react-statics: 3.3.2 - react: 18.3.1 + react: 19.1.0 '@sentry/vite-plugin@2.23.0(encoding@0.1.13)': dependencies: @@ -6299,7 +6283,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.5.3))': @@ -6334,22 +6318,22 @@ snapshots: '@tanstack/query-devtools@5.81.2': {} - '@tanstack/react-query-devtools@5.81.5(@tanstack/react-query@5.81.5(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.81.5(@tanstack/react-query@5.81.5(react@19.1.0))(react@19.1.0)': dependencies: '@tanstack/query-devtools': 5.81.2 - '@tanstack/react-query': 5.81.5(react@18.3.1) - react: 18.3.1 + '@tanstack/react-query': 5.81.5(react@19.1.0) + react: 19.1.0 - '@tanstack/react-query@5.81.5(react@18.3.1)': + '@tanstack/react-query@5.81.5(react@19.1.0)': dependencies: '@tanstack/query-core': 5.81.5 - react: 18.3.1 + react: 19.1.0 - '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@tanstack/table-core': 8.21.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) '@tanstack/table-core@8.21.3': {} @@ -6365,16 +6349,16 @@ snapshots: '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.27.5 - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@types/babel__traverse@7.20.4': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.27.7 '@types/body-parser@1.19.2': dependencies: @@ -6459,19 +6443,16 @@ snapshots: '@types/prismjs@1.26.5': {} - '@types/prop-types@15.7.5': {} - '@types/qs@6.9.7': {} '@types/range-parser@1.2.4': {} - '@types/react-dom@18.3.7(@types/react@18.3.23)': + '@types/react-dom@19.1.6(@types/react@19.1.8)': dependencies: - '@types/react': 18.3.23 + '@types/react': 19.1.8 - '@types/react@18.3.23': + '@types/react@19.1.8': dependencies: - '@types/prop-types': 15.7.5 csstype: 3.1.2 '@types/responselike@1.0.3': @@ -6983,6 +6964,10 @@ snapshots: transitivePeerDependencies: - debug + babel-plugin-react-compiler@19.1.0-rc.2: + dependencies: + '@babel/types': 7.27.7 + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -7877,7 +7862,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@4.6.2(eslint@8.56.0): + eslint-plugin-react-hooks@5.2.0(eslint@8.56.0): dependencies: eslint: 8.56.0 @@ -9330,57 +9315,54 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-colorful@5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - react-dom@18.3.1(react@18.3.1): + react-dom@19.1.0(react@19.1.0): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.1.0 + scheduler: 0.26.0 react-fast-compare@3.2.2: {} - react-hook-form@7.59.0(react@18.3.1): + react-hook-form@7.59.0(react@19.1.0): dependencies: - react: 18.3.1 + react: 19.1.0 - react-icons@5.4.0(react@18.3.1): + react-icons@5.4.0(react@19.1.0): dependencies: - react: 18.3.1 + react: 19.1.0 react-is@16.13.1: {} - react-qr-code@2.0.16(react@18.3.1): + react-qr-code@2.0.16(react@19.1.0): dependencies: prop-types: 15.8.1 qr.js: 0.0.0 - react: 18.3.1 + react: 19.1.0 react-refresh@0.17.0: {} - react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.30.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@remix-run/router': 1.23.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.30.1(react@18.3.1) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router: 6.30.1(react@19.1.0) - react-router@6.30.1(react@18.3.1): + react-router@6.30.1(react@19.1.0): dependencies: '@remix-run/router': 1.23.0 - react: 18.3.1 + react: 19.1.0 - react-simple-code-editor@0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-simple-code-editor@0.14.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.1.0: {} read-binary-file-arch@1.0.6: dependencies: @@ -9591,9 +9573,7 @@ snapshots: xmlchars: 2.2.0 optional: true - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.26.0: {} semver-compare@1.0.0: optional: true @@ -10137,9 +10117,9 @@ snapshots: url-template@2.0.8: {} - use-sync-external-store@1.5.0(react@18.3.1): + use-sync-external-store@1.5.0(react@19.1.0): dependencies: - react: 18.3.1 + react: 19.1.0 utf8-byte-length@1.0.4: {} @@ -10179,11 +10159,10 @@ snapshots: - tsx - yaml - vite-plugin-compression2@1.4.0(rollup@4.41.1)(vite@6.3.1(@types/node@22.15.26)(jiti@2.4.2)(sass@1.89.2)(tsx@4.20.3)): + vite-plugin-compression2@2.2.0(rollup@4.41.1): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.41.1) + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) tar-mini: 0.2.0 - vite: 6.3.1(@types/node@22.15.26)(jiti@2.4.2)(sass@1.89.2)(tsx@4.20.3) transitivePeerDependencies: - rollup @@ -10448,8 +10427,8 @@ snapshots: zod@3.25.67: {} - zustand@5.0.6(@types/react@18.3.23)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): + zustand@5.0.6(@types/react@19.1.8)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): optionalDependencies: - '@types/react': 18.3.23 - react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) + '@types/react': 19.1.8 + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0)