diff --git a/.changeset/unlucky-readers-nail.md b/.changeset/unlucky-readers-nail.md new file mode 100644 index 0000000000..d84e6d6b1c --- /dev/null +++ b/.changeset/unlucky-readers-nail.md @@ -0,0 +1,6 @@ +--- +"mobx-react-lite": minor +"mobx-react": minor +--- + +* Added React 19 support, fixes #3986 diff --git a/package.json b/package.json index 5f886c3f51..94123f577b 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,7 @@ "@changesets/cli": "^2.11.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^16.0.1", - "@testing-library/react-hooks": "7.0.2", + "@testing-library/react": "^16.1.0", "@types/jest": "^26.0.15", "@types/node": "18", "@types/prop-types": "^15.5.2", @@ -62,8 +61,8 @@ "prettier": "^2.8.4", "pretty-quick": "3.1.0", "prop-types": "15.6.2", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-test-renderer": "^18.0.0", "serializr": "^2.0.3", "tape": "^5.0.1", diff --git a/packages/mobx-react-lite/__tests__/observer.test.tsx b/packages/mobx-react-lite/__tests__/observer.test.tsx index 607e5d21df..f4f0a92b30 100644 --- a/packages/mobx-react-lite/__tests__/observer.test.tsx +++ b/packages/mobx-react-lite/__tests__/observer.test.tsx @@ -49,7 +49,7 @@ function runTestSuite(mode: "observer" | "useObserver") { list: 0 } - const TodoItem = obsComponent(({ todo }: { todo: typeof store.todos[0] }) => { + const TodoItem = obsComponent(({ todo }: { todo: (typeof store.todos)[0] }) => { renderings.item++ return
  • |{todo.title}
  • }, true) @@ -997,7 +997,7 @@ it("dependencies should not become temporarily unobserved", async () => { expect(doubleDisposed).toBeCalledTimes(1) }) -it("Legacy context support", () => { +it.skip("Legacy context support", () => { const contextKey = "key" const contextValue = "value" diff --git a/packages/mobx-react-lite/__tests__/useAsObservableSource.deprecated.test.tsx b/packages/mobx-react-lite/__tests__/useAsObservableSource.deprecated.test.tsx index bf14a8d58d..239a677f4d 100644 --- a/packages/mobx-react-lite/__tests__/useAsObservableSource.deprecated.test.tsx +++ b/packages/mobx-react-lite/__tests__/useAsObservableSource.deprecated.test.tsx @@ -1,5 +1,4 @@ -import { act, cleanup, render } from "@testing-library/react" -import { renderHook } from "@testing-library/react-hooks" +import { act, cleanup, render, renderHook } from "@testing-library/react" import { autorun, configure, observable } from "mobx" import * as React from "react" import { useEffect, useState } from "react" @@ -81,7 +80,7 @@ describe("base useAsObservableSource should work", () => { }) expect(container.querySelector("span")!.innerHTML).toBe("22") expect(counterRender).toBe(2) - expect(observerRender).toBe(3) + expect(observerRender).toBe(4) expect(consoleWarnMock).toMatchSnapshot() }) @@ -288,29 +287,62 @@ describe("combining observer with props and stores", () => { describe("enforcing actions", () => { it("'never' should work", () => { configure({ enforceActions: "never" }) - const { result } = renderHook(() => { - const [thing, setThing] = React.useState("world") - useAsObservableSource({ hello: thing }) - useEffect(() => setThing("react"), []) - }) - expect(result.error).not.toBeDefined() + const onError = jest.fn() + renderHook( + () => { + const [thing, setThing] = React.useState("world") + useAsObservableSource({ hello: thing }) + useEffect(() => setThing("react"), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } + } + } + ) + expect(onError).not.toBeCalled() }) it("only when 'observed' should work", () => { configure({ enforceActions: "observed" }) - const { result } = renderHook(() => { - const [thing, setThing] = React.useState("world") - useAsObservableSource({ hello: thing }) - useEffect(() => setThing("react"), []) - }) - expect(result.error).not.toBeDefined() + const onError = jest.fn() + renderHook( + () => { + const [thing, setThing] = React.useState("world") + useAsObservableSource({ hello: thing }) + useEffect(() => setThing("react"), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } + } + } + ) + expect(onError).not.toBeCalled() }) it("'always' should work", () => { configure({ enforceActions: "always" }) - const { result } = renderHook(() => { - const [thing, setThing] = React.useState("world") - useAsObservableSource({ hello: thing }) - useEffect(() => setThing("react"), []) - }) - expect(result.error).not.toBeDefined() + const onError = jest.fn() + renderHook( + () => { + const [thing, setThing] = React.useState("world") + useAsObservableSource({ hello: thing }) + useEffect(() => setThing("react"), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } + } + } + ) + expect(onError).not.toBeCalled() }) }) diff --git a/packages/mobx-react-lite/__tests__/useAsObservableSource.test.tsx b/packages/mobx-react-lite/__tests__/useAsObservableSource.test.tsx index 462bd9dc28..17a3d2319b 100644 --- a/packages/mobx-react-lite/__tests__/useAsObservableSource.test.tsx +++ b/packages/mobx-react-lite/__tests__/useAsObservableSource.test.tsx @@ -1,5 +1,4 @@ -import { act, cleanup, render } from "@testing-library/react" -import { renderHook } from "@testing-library/react-hooks" +import { act, cleanup, render, renderHook } from "@testing-library/react" import mockConsole from "jest-mock-console" import { autorun, configure, observable } from "mobx" import * as React from "react" @@ -351,30 +350,63 @@ describe("combining observer with props and stores", () => { describe("enforcing actions", () => { it("'never' should work", () => { configure({ enforceActions: "never" }) - const { result } = renderHook(() => { - const [thing, setThing] = React.useState("world") - useLocalObservable(() => ({ hello: thing })) - useEffect(() => setThing("react"), []) - }) - expect(result.error).not.toBeDefined() + const onError = jest.fn() + renderHook( + () => { + const [thing, setThing] = React.useState("world") + useLocalObservable(() => ({ hello: thing })) + useEffect(() => setThing("react"), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } + } + } + ) + expect(onError).not.toBeCalled() }) it("only when 'observed' should work", () => { configure({ enforceActions: "observed" }) - const { result } = renderHook(() => { - const [thing, setThing] = React.useState("world") - useLocalObservable(() => ({ hello: thing })) - useEffect(() => setThing("react"), []) - }) - expect(result.error).not.toBeDefined() + const onError = jest.fn() + renderHook( + () => { + const [thing, setThing] = React.useState("world") + useLocalObservable(() => ({ hello: thing })) + useEffect(() => setThing("react"), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } + } + } + ) + expect(onError).not.toBeCalled() }) it("'always' should work", () => { configure({ enforceActions: "always" }) - const { result } = renderHook(() => { - const [thing, setThing] = React.useState("world") - useLocalObservable(() => ({ hello: thing })) - useEffect(() => setThing("react"), []) - }) - expect(result.error).not.toBeDefined() + const onError = jest.fn() + renderHook( + () => { + const [thing, setThing] = React.useState("world") + useLocalObservable(() => ({ hello: thing })) + useEffect(() => setThing("react"), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } + } + } + ) + expect(onError).not.toBeCalled() }) }) diff --git a/packages/mobx-react-lite/__tests__/useLocalObservable.test.tsx b/packages/mobx-react-lite/__tests__/useLocalObservable.test.tsx index da2dc29657..6ee6a45f63 100644 --- a/packages/mobx-react-lite/__tests__/useLocalObservable.test.tsx +++ b/packages/mobx-react-lite/__tests__/useLocalObservable.test.tsx @@ -1,7 +1,6 @@ import * as mobx from "mobx" import * as React from "react" -import { renderHook } from "@testing-library/react-hooks" -import { act, cleanup, fireEvent, render } from "@testing-library/react" +import { act, cleanup, fireEvent, render, renderHook } from "@testing-library/react" import { Observer, observer, useLocalObservable } from "../src" import { useEffect, useState } from "react" @@ -440,75 +439,108 @@ describe("enforcing actions", () => { mobx.configure({ enforceActions: "never" }) consoleWarnMock = jest.spyOn(console, "warn").mockImplementation(() => {}) - const { result } = renderHook(() => { - const [multiplier, setMultiplier] = React.useState(2) - const store = useLocalObservable(() => ({ - multiplier, - count: 10, - get multiplied() { - return this.multiplier * this.count - }, - inc() { - this.count += 1 + const onError = jest.fn() + const { result } = renderHook( + () => { + const [multiplier, setMultiplier] = React.useState(2) + const store = useLocalObservable(() => ({ + multiplier, + count: 10, + get multiplied() { + return this.multiplier * this.count + }, + inc() { + this.count += 1 + } + })) + useEffect(() => { + store.multiplier = multiplier + }, [multiplier]) + useEffect(() => setMultiplier(3), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } } - })) - useEffect(() => { - store.multiplier = multiplier - }, [multiplier]) - useEffect(() => setMultiplier(3), []) - }) + } + ) - expect(result.error).not.toBeDefined() + expect(onError).not.toBeCalled() expect(consoleWarnMock).not.toBeCalled() }) it("only when 'observed' should work", () => { mobx.configure({ enforceActions: "observed" }) consoleWarnMock = jest.spyOn(console, "warn").mockImplementation(() => {}) - const { result } = renderHook(() => { - const [multiplier, setMultiplier] = React.useState(2) - const store = useLocalObservable(() => ({ - multiplier, - count: 10, - get multiplied() { - return this.multiplier * this.count - }, - inc() { - this.count += 1 + const onError = jest.fn() + renderHook( + () => { + const [multiplier, setMultiplier] = React.useState(2) + const store = useLocalObservable(() => ({ + multiplier, + count: 10, + get multiplied() { + return this.multiplier * this.count + }, + inc() { + this.count += 1 + } + })) + useEffect(() => { + store.multiplier = multiplier + }, [multiplier]) + useEffect(() => setMultiplier(3), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } } - })) - useEffect(() => { - store.multiplier = multiplier - }, [multiplier]) - useEffect(() => setMultiplier(3), []) - }) + } + ) - expect(result.error).not.toBeDefined() + expect(onError).not.toBeCalled() expect(consoleWarnMock).not.toBeCalled() }) it("'always' should work", () => { mobx.configure({ enforceActions: "always" }) consoleWarnMock = jest.spyOn(console, "warn").mockImplementation(() => {}) - const { result } = renderHook(() => { - const [multiplier, setMultiplier] = React.useState(2) - const store = useLocalObservable(() => ({ - multiplier, - count: 10, - get multiplied() { - return this.multiplier * this.count - }, - inc() { - this.count += 1 + const onError = jest.fn() + renderHook( + () => { + const [multiplier, setMultiplier] = React.useState(2) + const store = useLocalObservable(() => ({ + multiplier, + count: 10, + get multiplied() { + return this.multiplier * this.count + }, + inc() { + this.count += 1 + } + })) + useEffect(() => { + store.multiplier = multiplier + }, [multiplier]) + useEffect(() => setMultiplier(3), []) + }, + { + wrapper: class extends React.Component { + componentDidCatch = onError + render() { + return this.props.children + } } - })) - useEffect(() => { - store.multiplier = multiplier - }, [multiplier]) - useEffect(() => setMultiplier(3), []) - }) + } + ) - expect(result.error).not.toBeDefined() + expect(onError).not.toBeCalled() expect(consoleWarnMock).toBeCalledTimes(2) }) }) diff --git a/packages/mobx-react-lite/__tests__/useLocalStore.deprecated.test.tsx b/packages/mobx-react-lite/__tests__/useLocalStore.deprecated.test.tsx index 17fe956bf9..0971047848 100644 --- a/packages/mobx-react-lite/__tests__/useLocalStore.deprecated.test.tsx +++ b/packages/mobx-react-lite/__tests__/useLocalStore.deprecated.test.tsx @@ -307,7 +307,7 @@ describe("is used to keep observable within component body", () => { }) expect(container.querySelector("span")!.innerHTML).toBe("22") expect(counterRender).toBe(2) - expect(observerRender).toBe(3) + expect(observerRender).toBe(4) expect(consoleWarnMock).toMatchSnapshot() }) @@ -377,7 +377,7 @@ describe("is used to keep observable within component body", () => { }) expect(container.querySelector("span")!.innerHTML).toBe("22") expect(counterRender).toBe(2) - expect(observerRender).toBe(3) + expect(observerRender).toBe(4) }) it("with observer()", () => { diff --git a/packages/mobx-react-lite/package.json b/packages/mobx-react-lite/package.json index 4acde6eba1..5e85c40639 100644 --- a/packages/mobx-react-lite/package.json +++ b/packages/mobx-react-lite/package.json @@ -37,11 +37,11 @@ }, "homepage": "https://mobx.js.org", "dependencies": { - "use-sync-external-store": "^1.2.0" + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19" }, "peerDependenciesMeta": { "react-dom": { diff --git a/packages/mobx-react-lite/src/ObserverComponent.ts b/packages/mobx-react-lite/src/ObserverComponent.ts index 5b0dc599b1..59b9ff7105 100644 --- a/packages/mobx-react-lite/src/ObserverComponent.ts +++ b/packages/mobx-react-lite/src/ObserverComponent.ts @@ -1,11 +1,18 @@ import { useObserver } from "./useObserver" +// TODO: this type could be improved in the next major release: +// type IObserverProps = { children: () => React.ReactNode, render?: never } | { children?: never, render: () => React.ReactNode } interface IObserverProps { children?(): React.ReactElement | null render?(): React.ReactElement | null } function ObserverComponent({ children, render }: IObserverProps) { + if (children && render) { + console.error( + "MobX Observer: Do not use children and render in the same time in `Observer`" + ) + } const component = children || render if (typeof component !== "function") { return null diff --git a/packages/mobx-react-lite/src/observer.ts b/packages/mobx-react-lite/src/observer.ts index 9baf579ffb..2f4a799285 100644 --- a/packages/mobx-react-lite/src/observer.ts +++ b/packages/mobx-react-lite/src/observer.ts @@ -4,6 +4,7 @@ import { isUsingStaticRendering } from "./staticRendering" import { useObserver } from "./useObserver" let warnObserverOptionsDeprecated = true +let warnLegacyContextTypes = true const hasSymbol = typeof Symbol === "function" && Symbol.for const isFunctionNameConfigurable = @@ -137,6 +138,13 @@ export function observer

    ( ;(observerComponent as React.FunctionComponent).contextTypes = ( baseComponent as any ).contextTypes + + if (process.env.NODE_ENV !== "production" && warnLegacyContextTypes) { + warnLegacyContextTypes = false + console.warn( + `[mobx-react-lite] Support for Legacy Context in function components will be removed in the next major release.` + ) + } } if (useForwardRef) { diff --git a/packages/mobx-react/__tests__/hooks.test.tsx b/packages/mobx-react/__tests__/hooks.test.tsx index bc0a94cf87..a56ec15d53 100644 --- a/packages/mobx-react/__tests__/hooks.test.tsx +++ b/packages/mobx-react/__tests__/hooks.test.tsx @@ -49,7 +49,7 @@ test("computed properties react to props when using hooks", async () => { act(() => { jest.runAllTimers() }) - expect(seen).toEqual(["parent", 0, "parent", 2]) + expect(seen).toEqual(["parent", 0, "parent", 2, 2]) expect(container).toHaveTextContent("2") expect(consoleWarnMock).toMatchSnapshot() }) diff --git a/packages/mobx-react/__tests__/inject.test.tsx b/packages/mobx-react/__tests__/inject.test.tsx index c2fdeaf85b..6f97ac25e2 100644 --- a/packages/mobx-react/__tests__/inject.test.tsx +++ b/packages/mobx-react/__tests__/inject.test.tsx @@ -296,7 +296,8 @@ describe("inject based context", () => { expect(ref.current?.testField).toBe(1) }) - test("propTypes and defaultProps are forwarded", () => { + // skipping because `propTypes` and `defaultProps` are dropped in React 19 + test.skip("propTypes and defaultProps are forwarded", () => { const msg: Array = [] const baseError = console.error console.error = m => msg.push(m) diff --git a/packages/mobx-react/__tests__/observer.test.tsx b/packages/mobx-react/__tests__/observer.test.tsx index cf8d296f84..75c90ba0ec 100644 --- a/packages/mobx-react/__tests__/observer.test.tsx +++ b/packages/mobx-react/__tests__/observer.test.tsx @@ -469,8 +469,8 @@ test("should stop updating if error was thrown in render (#134)", () => { data.set(5) }) // MWE: not sure if these numbers make sense. Nor whether it really matters - expect(lastOwnRenderCount).toBe(6) - expect(renderingsCount).toBe(6) + expect(lastOwnRenderCount).toBe(4) + expect(renderingsCount).toBe(4) }) describe("should render component even if setState called with exactly the same props", () => { diff --git a/packages/mobx-react/__tests__/stateless.test.tsx b/packages/mobx-react/__tests__/stateless.test.tsx index 9d4ef934da..febffeece3 100644 --- a/packages/mobx-react/__tests__/stateless.test.tsx +++ b/packages/mobx-react/__tests__/stateless.test.tsx @@ -13,7 +13,8 @@ StatelessComp.defaultProps = { testProp: "default value for prop testProp" } -describe("stateless component with propTypes", () => { +// skipping because `propTypes` and `defaultProps` are dropped in React 19 +describe.skip("stateless component with propTypes", () => { const StatelessCompObserver: React.FunctionComponent = observer(StatelessComp) test("default property value should be propagated", () => { @@ -57,7 +58,8 @@ test("stateless component with context support", () => { expect(container.textContent).toBe("context: hello world") }) -test("component with observable propTypes", () => { +// propTypes validation seems to have been removed from class components in React 19: https://react.dev/reference/react/Component +test.skip("component with observable propTypes", () => { class Comp extends React.Component { render() { return null diff --git a/packages/mobx-react/package.json b/packages/mobx-react/package.json index a8458d1b43..ff5cd8fa77 100644 --- a/packages/mobx-react/package.json +++ b/packages/mobx-react/package.json @@ -40,7 +40,7 @@ }, "peerDependencies": { "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19" }, "peerDependenciesMeta": { "react-dom": { diff --git a/yarn.lock b/yarn.lock index eb7b7e5a43..f4cf053aec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1359,16 +1359,11 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.11.0": +"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.4.0": version "4.11.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== -"@eslint-community/regexpp@^4.4.0": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== - "@eslint/config-array@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" @@ -2821,21 +2816,10 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react-hooks@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz#3388d07f562d91e7f2431a4a21b5186062ecfee0" - integrity sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg== - dependencies: - "@babel/runtime" "^7.12.5" - "@types/react" ">=16.9.0" - "@types/react-dom" ">=16.9.0" - "@types/react-test-renderer" ">=16.9.0" - react-error-boundary "^3.1.0" - -"@testing-library/react@^16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.1.tgz#29c0ee878d672703f5e7579f239005e4e0faa875" - integrity sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg== +"@testing-library/react@^16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.1.0.tgz#aa0c61398bac82eaf89776967e97de41ac742d71" + integrity sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg== dependencies: "@babel/runtime" "^7.12.5" @@ -2887,16 +2871,16 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/estree@*", "@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/estree@^1.0.6": +"@types/estree@*", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -3019,21 +3003,14 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@>=16.9.0", "@types/react-dom@^18.0.0": +"@types/react-dom@^18.0.0": version "18.3.0" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react-test-renderer@>=16.9.0": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz#839502eae70058a4ae161f63385a8e7929cef4c0" - integrity sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@>=16.9.0", "@types/react@^18.0.0": +"@types/react@*", "@types/react@^18.0.0": version "18.3.3" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== @@ -3431,12 +3408,7 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0, acorn@^8.8.1: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -acorn@^8.12.0: +acorn@^8.1.0, acorn@^8.12.0, acorn@^8.8.1: version "8.13.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== @@ -5741,12 +5713,12 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" @@ -5762,13 +5734,6 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.2: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -6361,7 +6326,7 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -"eslint-7@npm:eslint@^7.0.0", eslint@^7.0.0: +"eslint-7@npm:eslint@^7.0.0": version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== @@ -6667,6 +6632,52 @@ eslint@^6.1.0, eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^7.0.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + espree@^10.0.1, espree@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" @@ -6704,14 +6715,7 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esquery@^1.5.0: +esquery@^1.0.1, esquery@^1.4.0, esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== @@ -10166,12 +10170,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -11721,20 +11720,12 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -react-dom@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== +react-dom@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" + integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-error-boundary@^3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" - integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== - dependencies: - "@babel/runtime" "^7.12.5" + scheduler "^0.25.0" react-is@^16.12.0, react-is@^16.13.1: version "16.13.1" @@ -11768,12 +11759,10 @@ react-test-renderer@^18.0.0: react-shallow-renderer "^16.15.0" scheduler "^0.23.2" -react@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" +react@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd" + integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== read-cmd-shim@^1.0.1: version "1.0.5" @@ -12414,6 +12403,11 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" +scheduler@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" + integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -13972,10 +13966,10 @@ url@^0.11.0: punycode "^1.4.1" qs "^6.11.2" -use-sync-external-store@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" - integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== +use-sync-external-store@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== use@^3.1.0: version "3.1.1"