From 32d4e87b1e9859bbc5fd7a481325138684a82ba4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 1 May 2024 10:47:57 -0500 Subject: [PATCH 1/4] experiment!: React 19 --- package.json | 18 +++--- src/reconciler.ts | 117 ++++++++++++++++++++++++-------------- src/types.ts | 6 ++ tests/native.test.tsx | 2 +- tests/utils/setupTests.ts | 8 +-- yarn.lock | 107 +++++++++++++++++++--------------- 6 files changed, 152 insertions(+), 106 deletions(-) diff --git a/package.json b/package.json index d5f6b93..4960341 100644 --- a/package.json +++ b/package.json @@ -46,29 +46,29 @@ "jest-environment-jsdom": "^28.1.3", "ogl": "^1.0.3", "prettier": "^2.7.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "19.0.0-beta-4508873393-20240430", + "react-dom": "19.0.0-beta-4508873393-20240430", "react-native": "^0.69.4", - "react-test-renderer": "^18.2.0", + "react-test-renderer": "19.0.0-beta-4508873393-20240430", "rimraf": "^3.0.2", "typescript": "^4.7.4", "vite": "^3.0.9" }, "dependencies": { - "@types/react-reconciler": "^0.26.7", + "@types/react-reconciler": "^0.28.8", "@types/webxr": "*", - "its-fine": "^1.1.1", - "react-reconciler": "^0.27.0", + "its-fine": "^1.2.5", + "react-reconciler": "0.31.0-beta-4508873393-20240430", "react-use-measure": "^2.1.1", - "scheduler": "^0.23.0", + "scheduler": "0.25.0-beta-4508873393-20240430", "suspend-react": "^0.1.3", "zustand": "^4.5.2" }, "peerDependencies": { "expo-gl": ">=11.4", "ogl": ">=1", - "react": ">=18.0", - "react-dom": ">=18.0", + "react": ">=19.0", + "react-dom": ">=19.0", "react-native": ">=0.69" }, "peerDependenciesMeta": { diff --git a/src/reconciler.ts b/src/reconciler.ts index ce88278..01dd602 100644 --- a/src/reconciler.ts +++ b/src/reconciler.ts @@ -1,5 +1,6 @@ import Reconciler from 'react-reconciler' -import { DefaultEventPriority } from 'react-reconciler/constants.js' +// @ts-ignore +import { NoEventPriority, DefaultEventPriority } from 'react-reconciler/constants.js' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import * as OGL from 'ogl' import * as React from 'react' @@ -202,6 +203,9 @@ function switchInstance( props: Instance['props'], fiber: Reconciler.Fiber, ) { + // React 19 regression from (un)hide hooks + oldInstance.object.visible = true + // Create a new instance const newInstance = createInstance(type, props, oldInstance.root) @@ -281,6 +285,10 @@ function diffProps( return changedProps } +const NO_CONTEXT = {} + +let currentUpdatePriority: number = NoEventPriority + /** * Centralizes and handles mutations through an OGL scene-graph. */ @@ -302,7 +310,7 @@ export const reconciler = Reconciler< // Public (ref) instance Instance['object'], // Host context - null, + {}, // applyProps diff sets null | [true] | [false, Instance['props']], // Hydration child set @@ -335,8 +343,8 @@ export const reconciler = Reconciler< getPublicInstance: (instance) => instance.object, // We can optionally access different host contexts on instance creation/update. // Instances' data structures are self-sufficient, so we don't make use of this - getRootHostContext: () => null, - getChildHostContext: (parentHostContext) => parentHostContext, + getRootHostContext: () => NO_CONTEXT, + getChildHostContext: () => NO_CONTEXT, // We can optionally mutate portal containers here, but we do that in createPortal instead from state preparePortalMount: (container) => prepare(container.getState().scene, container, '', {}), // This lets us store stuff at the container-level before/after React mutates our OGL elements. @@ -374,56 +382,50 @@ export const reconciler = Reconciler< removeChild(scene, child) }, - // Used to calculate updates in the render phase or commitUpdate. - // Greatly improves performance by reducing paint to rapid mutations. - prepareUpdate(instance, type, oldProps, newProps) { - // Element is a primitive. We must recreate it when its object prop is changed - if (instance.type === 'primitive' && oldProps.object !== newProps.object) return [true] + // This is where we mutate OGL elements in the render phase + // @ts-ignore + commitUpdate(instance: Instance, type: Type, oldProps: Instance['props'], newProps: Instance['props'], fiber: any) { + let reconstruct = false + // Element is a primitive. We must recreate it when its object prop is changed + if (instance.type === 'primitive' && oldProps.object !== newProps.object) reconstruct = true // Element is a program. Check whether its vertex or fragment props changed to recreate - if (type === 'program') { - if (oldProps.vertex !== newProps.vertex) return [true] - if (oldProps.fragment !== newProps.fragment) return [true] + else if (type === 'program') { + if (oldProps.vertex !== newProps.vertex) reconstruct = true + if (oldProps.fragment !== newProps.fragment) reconstruct = true } - // Element is a geometry. Check whether its attribute props changed to recreate. - if (type === 'geometry') { + else if (type === 'geometry') { for (const key in oldProps) { const isAttribute = (oldProps[key] as OGL.Attribute)?.data || (newProps[key] as OGL.Attribute)?.data - if (isAttribute && oldProps[key] !== newProps[key]) return [true] + if (isAttribute && oldProps[key] !== newProps[key]) { + reconstruct = true + break + } } } - // If the instance has new args, recreate it - if (newProps.args?.length !== oldProps.args?.length) return [true] - if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) return [true] + else if (newProps.args?.length !== oldProps.args?.length) reconstruct = true + else if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) reconstruct = true + + // If flagged for recreation, swap to a new instance. + if (reconstruct) return switchInstance(instance, type, newProps, fiber) // Diff through props and flag with changes const changedProps = diffProps(instance, newProps, oldProps) - if (Object.keys(changedProps).length) return [false, changedProps] - - // No changes, don't update the instance - return null - }, - // This is where we mutate OGL elements in the render phase - commitUpdate(instance, payload, type, oldProps, newProps, root) { - const [reconstruct, changedProps] = payload! - - // If flagged for recreation, swap to a new instance. - if (reconstruct) return switchInstance(instance, type, newProps, root) + if (Object.keys(changedProps).length) { + // Handle attach update + if (changedProps?.attach) { + if (oldProps.attach) detach(instance.parent!, instance) + instance.props.attach = newProps.attach + if (newProps.attach) attach(instance.parent!, instance) + } - // Handle attach update - if (changedProps?.attach) { - if (oldProps.attach) detach(instance.parent!, instance) - instance.props.attach = newProps.attach - if (newProps.attach) attach(instance.parent!, instance) + // Update instance props + Object.assign(instance.props, changedProps) + // Apply changed props + applyProps(instance.object, changedProps) } - - // Update instance props - Object.assign(instance.props, changedProps) - - // Apply changed props - applyProps(instance.object, changedProps) }, // Methods to toggle instance visibility on demand. // React uses this with React.Suspense to display fallback content @@ -444,17 +446,46 @@ export const reconciler = Reconciler< // Configures a callback once the tree is finalized after commit-effects are fired finalizeInitialChildren: () => false, commitMount() {}, - // @ts-ignore - getCurrentEventPriority: () => DefaultEventPriority, beforeActiveInstanceBlur: () => {}, afterActiveInstanceBlur: () => {}, detachDeletedInstance: () => {}, + prepareScopeUpdate() {}, + getInstanceFromScope: () => null, + // @ts-ignore untyped react-experimental options inspired by react-art + // TODO: add shell types for these and upstream to DefinitelyTyped + // https://github.com/facebook/react/blob/main/packages/react-art/src/ReactFiberConfigART.js + setCurrentUpdatePriority(newPriority) { + currentUpdatePriority = newPriority + }, + getCurrentUpdatePriority() { + return currentUpdatePriority + }, + resolveUpdatePriority() { + return currentUpdatePriority || DefaultEventPriority + }, + shouldAttemptEagerTransition() { + return false + }, + requestPostPaintCallback() {}, + maySuspendCommit() { + return false + }, + preloadInstance() { + return true // true indicates already loaded + }, + startSuspendingCommit() {}, + suspendInstance() {}, + waitForCommitToBeReady() { + return null + }, + NotPendingTransition: null, + resetFormInstance() {}, }) /** * Safely flush async effects when testing, simulating a legacy root. */ -export const act: Act = (React as any).unstable_act +export const act: Act = (React as any).act // Inject renderer meta into devtools const isProd = typeof process === 'undefined' || process.env?.['NODE_ENV'] === 'production' diff --git a/src/types.ts b/src/types.ts index 75b9425..0d544c2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -191,3 +191,9 @@ declare global { interface IntrinsicElements extends OGLElements {} } } + +declare module 'react' { + namespace JSX { + interface IntrinsicElements extends OGLElements {} + } +} diff --git a/tests/native.test.tsx b/tests/native.test.tsx index 7fc1c08..334949d 100644 --- a/tests/native.test.tsx +++ b/tests/native.test.tsx @@ -66,6 +66,6 @@ describe('Canvas', () => { ) }) - expect(() => renderer.unmount()).not.toThrow() + expect(async () => await act(async () => renderer.unmount())).not.toThrow() }) }) diff --git a/tests/utils/setupTests.ts b/tests/utils/setupTests.ts index c8a77f2..16299df 100644 --- a/tests/utils/setupTests.ts +++ b/tests/utils/setupTests.ts @@ -5,16 +5,12 @@ import WebGLRenderingContext from './WebGLRenderingContext' declare global { var IS_REACT_ACT_ENVIRONMENT: boolean + var IS_REACT_NATIVE_TEST_ENVIRONMENT: boolean // https://github.com/facebook/react/pull/28419 } // Let React know that we'll be testing effectful components global.IS_REACT_ACT_ENVIRONMENT = true - -// Mock scheduler to test React features -jest.mock('scheduler', () => ({ - ...jest.requireActual('scheduler/unstable_mock'), - unstable_scheduleCallback: (_: any, callback: () => void) => callback(), -})) +global.IS_REACT_NATIVE_TEST_ENVIRONMENT = true // hide react-test-renderer warnings // PointerEvent is not in JSDOM // https://github.com/jsdom/jsdom/pull/2666#issuecomment-691216178 diff --git a/yarn.lock b/yarn.lock index 7bb9627..0c8eb0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1597,13 +1597,20 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.6": +"@types/react-dom@^18.0.0": version "18.0.6" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== dependencies: "@types/react" "*" +"@types/react-dom@^18.0.6": + 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-native@^0.69.5": version "0.69.5" resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.69.5.tgz#7709fdbff031a5ecf1956705e6c4a07cdfe6867c" @@ -1611,13 +1618,6 @@ dependencies: "@types/react" "*" -"@types/react-reconciler@^0.26.7": - version "0.26.7" - resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.26.7.tgz#0c4643f30821ae057e401b0d9037e03e8e9b2a36" - integrity sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ== - dependencies: - "@types/react" "*" - "@types/react-reconciler@^0.28.0": version "0.28.0" resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.0.tgz#513acbed173140e958c909041ca14eb40412077f" @@ -1625,7 +1625,14 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.17": +"@types/react-reconciler@^0.28.8": + version "0.28.8" + resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.8.tgz#e51710572bcccf214306833c2438575d310b3e98" + integrity sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g== + dependencies: + "@types/react" "*" + +"@types/react@*": version "18.0.17" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== @@ -1634,6 +1641,14 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.0.17": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.1.tgz#fed43985caa834a2084d002e4771e15dfcbdbe8e" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -4185,10 +4200,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -its-fine@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.1.tgz#e74b93fddd487441f978a50f64f0f5af4d2fc38e" - integrity sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw== +its-fine@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.2.5.tgz#5466c287f86a0a73e772c8d8d515626c97195dc9" + integrity sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA== dependencies: "@types/react-reconciler" "^0.28.0" @@ -5912,15 +5927,19 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== +react-dom@19.0.0-beta-4508873393-20240430: + version "19.0.0-beta-4508873393-20240430" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-4508873393-20240430.tgz#d7dc059a4ff16351cc15e71bfd6ad052c9ed2403" + integrity sha512-/j97ai1qF3c6O3XV0nVzzExPV/0U2v8M75Sq6ThXYxePCi33kAnm+xRsCDpZOZOrIjz6nurLU/FzzPZIzXVvKQ== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "0.25.0-beta-4508873393-20240430" -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: +react-is@19.0.0-beta-4508873393-20240430: + version "19.0.0-beta-4508873393-20240430" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-4508873393-20240430.tgz#b37952b326d39ff4754a3d1d675735711d76cee8" + integrity sha512-DB++EnCyaX+He8vWuwSvOHvZQHWvFDNT4UlYfnSoG+dZAFLlZeLd2iF2I1G1vR/ahBsNJDWmyZOUXheqJRLT/w== + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== @@ -5989,13 +6008,12 @@ react-native@^0.69.4: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.27.0.tgz#360124fdf2d76447c7491ee5f0e04503ed9acf5b" - integrity sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA== +react-reconciler@0.31.0-beta-4508873393-20240430: + version "0.31.0-beta-4508873393-20240430" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-beta-4508873393-20240430.tgz#d2c352a4beaed4068e2054c28a96ac10df50ed77" + integrity sha512-uhCn1swgjf0QI0qUbedcvL0UROTmV4eguCAT4HfiOAsnElL7F7t1SV5p2cd0dQvVpgNZ8B4UhfGpCBsOMI4PIA== dependencies: - loose-envify "^1.1.0" - scheduler "^0.21.0" + scheduler "0.25.0-beta-4508873393-20240430" react-refresh@^0.14.0: version "0.14.0" @@ -6007,7 +6025,7 @@ react-refresh@^0.4.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== -react-shallow-renderer@16.15.0, react-shallow-renderer@^16.15.0: +react-shallow-renderer@16.15.0: version "16.15.0" resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== @@ -6015,14 +6033,13 @@ react-shallow-renderer@16.15.0, react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react-test-renderer@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" - integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== +react-test-renderer@19.0.0-beta-4508873393-20240430: + version "19.0.0-beta-4508873393-20240430" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-beta-4508873393-20240430.tgz#6771832741944c8faa91829c0bf48d4cef0c1619" + integrity sha512-iS4NQZ1/5SosvtoptNN01aLc3Kw3nj8nRJ3ivYRm8RZF9mkHy2DDjJmjZomt1W+rpIadZUTg9uXnkILEJ0Hc6g== dependencies: - react-is "^18.2.0" - react-shallow-renderer "^16.15.0" - scheduler "^0.23.0" + react-is "19.0.0-beta-4508873393-20240430" + scheduler "0.25.0-beta-4508873393-20240430" react-use-measure@^2.1.1: version "2.1.1" @@ -6031,12 +6048,10 @@ react-use-measure@^2.1.1: dependencies: debounce "^1.2.1" -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" +react@19.0.0-beta-4508873393-20240430: + version "19.0.0-beta-4508873393-20240430" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-4508873393-20240430.tgz#5de568fdc19fd49978816ef543376f899035df25" + integrity sha512-//89udV7fhVq5pEzpNH7vlpmS5D4wDbPn0oif+G7vwDsuSks5yJGdqrE1uzn2CyFNL73FjV3/R3Pjyaxs+xnvg== readable-stream@^3.4.0: version "3.6.0" @@ -6300,6 +6315,11 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +scheduler@0.25.0-beta-4508873393-20240430: + version "0.25.0-beta-4508873393-20240430" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-4508873393-20240430.tgz#4044bf1d129b3724706d9a784580ac64e86d744d" + integrity sha512-gk9vDoDOjTys0DpLgFll+hYk5gLhLnTipi81Pl+XSRtWkQnqQdjxLO2RF726t0g0jQ5tvwjLfBCgsvusgB6Luw== + scheduler@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" @@ -6307,13 +6327,6 @@ scheduler@^0.21.0: dependencies: loose-envify "^1.1.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" From 4662ad231691518b3f32b8e512106a0ee9013cdd Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 Jan 2025 02:05:55 -0600 Subject: [PATCH 2/4] refactor: update with React 19 stable --- README.md | 6 +- examples/src/cubes.tsx | 4 +- package.json | 24 +- src/Canvas.native.tsx | 11 +- src/Canvas.tsx | 2 + src/hooks.ts | 2 +- src/reconciler.ts | 237 +++++++++---- src/renderer.tsx | 29 +- src/types.ts | 18 +- src/utils.ts | 8 +- tests/hooks.test.tsx | 6 +- vite.config.js | 4 +- yarn.lock | 738 +++++++++++++++++++++++++++++------------ 13 files changed, 761 insertions(+), 328 deletions(-) diff --git a/README.md b/README.md index a8756f8..0b92514 100644 --- a/README.md +++ b/README.md @@ -544,9 +544,9 @@ interface RootState { xr: XRManager // Frameloop internals for custom render loops priority: number - subscribed: React.MutableRefObject[] - subscribe: (refCallback: React.MutableRefObject, renderPriority?: number) => void - unsubscribe: (refCallback: React.MutableRefObject, renderPriority?: number) => void + subscribed: React.RefObject[] + subscribe: (refCallback: React.RefObject, renderPriority?: number) => void + unsubscribe: (refCallback: React.RefObject, renderPriority?: number) => void // Optional canvas event manager and its state events?: EventManager mouse: OGL.Vec2 diff --git a/examples/src/cubes.tsx b/examples/src/cubes.tsx index fed2f9b..79e5991 100644 --- a/examples/src/cubes.tsx +++ b/examples/src/cubes.tsx @@ -1,11 +1,11 @@ import * as OGL from 'ogl' import * as React from 'react' -import { useFrame, Canvas } from 'react-ogl' +import { type OGLElements, useFrame, Canvas } from 'react-ogl' const hotpink = new OGL.Color(0xfba2d4) const orange = new OGL.Color(0xf5ce54) -const Box = (props: JSX.IntrinsicElements['mesh']) => { +const Box = (props: OGLElements['mesh']) => { const mesh = React.useRef(null!) const [hovered, setHover] = React.useState(false) const [active, setActive] = React.useState(false) diff --git a/package.json b/package.json index e6b8ab2..1e99f62 100644 --- a/package.json +++ b/package.json @@ -46,30 +46,30 @@ "jest-environment-jsdom": "^28.1.3", "ogl": "^1.0.3", "prettier": "^2.7.1", - "react": "19.0.0-beta-4508873393-20240430", - "react-dom": "19.0.0-beta-4508873393-20240430", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-native": "^0.69.4", - "react-test-renderer": "19.0.0-beta-4508873393-20240430", - "rimraf": "^3.0.2", - "typescript": "^4.7.4", - "vite": "^3.0.9" + "react-test-renderer": "^19.0.0", + "rimraf": "^5.0.0", + "typescript": "^5.7.3", + "vite": "^6.0.11" }, "dependencies": { - "@types/react-reconciler": "^0.28.8", + "@types/react-reconciler": "^0.28.9", "@types/webxr": "*", "its-fine": "^1.2.5", - "react-reconciler": "0.31.0-beta-4508873393-20240430", + "react-reconciler": "^0.31.0", "react-use-measure": "^2.1.1", - "scheduler": "0.25.0-beta-4508873393-20240430", + "scheduler": "^0.25.0", "suspend-react": "^0.1.3", "zustand": "^4.5.2" }, "peerDependencies": { "expo-gl": ">=11.4", "ogl": ">=1", - "react": ">=19.0", - "react-dom": ">=19.0", - "react-native": ">=0.69" + "react": "^19.0", + "react-dom": "^19.0", + "react-native": ">=0.78" }, "peerDependenciesMeta": { "react-dom": { diff --git a/src/Canvas.native.tsx b/src/Canvas.native.tsx index ecfc79b..f279259 100644 --- a/src/Canvas.native.tsx +++ b/src/Canvas.native.tsx @@ -7,7 +7,10 @@ import { events as createTouchEvents } from './events.native' // explicitly requ import { RenderProps } from './types' import { render, unmountComponentAtNode } from './renderer' -export interface CanvasProps extends Omit, ViewProps { +// TODO: React 19 needs support from react-native +const _View = View as any + +export interface CanvasProps extends Omit, Omit { children: React.ReactNode style?: ViewStyle } @@ -51,6 +54,7 @@ const CanvasImpl = React.forwardRef(function Canvas( // Render to screen if (canvas && width > 0 && height > 0) { render( + // @ts-expect-error }>{children} @@ -95,9 +99,9 @@ const CanvasImpl = React.forwardRef(function Canvas( }, [canvas]) return ( - + <_View {...props} ref={forwardedRef} onLayout={onLayout} style={{ flex: 1, ...style }} {...bind}> {width > 0 && } - + ) }) @@ -106,6 +110,7 @@ const CanvasImpl = React.forwardRef(function Canvas( */ export const Canvas = React.forwardRef(function CanvasWrapper(props, ref) { return ( + // @ts-expect-error diff --git a/src/Canvas.tsx b/src/Canvas.tsx index 348811a..58772df 100644 --- a/src/Canvas.tsx +++ b/src/Canvas.tsx @@ -49,6 +49,7 @@ const CanvasImpl = React.forwardRef(function Can // Render to screen if (canvas && width > 0 && height > 0) { render( + // @ts-expect-error }>{children} @@ -99,6 +100,7 @@ const CanvasImpl = React.forwardRef(function Can */ export const Canvas = React.forwardRef(function CanvasWrapper(props, ref) { return ( + // @ts-expect-error diff --git a/src/hooks.ts b/src/hooks.ts index a6bf7df..196fa68 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -23,7 +23,7 @@ export const useIsomorphicLayoutEffect = * * **Note**: this is an escape hatch to react-internal fields. Expect this to change significantly between versions. */ -export function useInstanceHandle(ref: React.MutableRefObject): React.MutableRefObject { +export function useInstanceHandle(ref: React.RefObject): React.RefObject { const instance = React.useRef(null!) useIsomorphicLayoutEffect( () => void (instance.current = (ref.current as unknown as Instance['object']).__ogl!), diff --git a/src/reconciler.ts b/src/reconciler.ts index 01dd602..1f23067 100644 --- a/src/reconciler.ts +++ b/src/reconciler.ts @@ -1,6 +1,10 @@ import Reconciler from 'react-reconciler' -// @ts-ignore -import { NoEventPriority, DefaultEventPriority } from 'react-reconciler/constants.js' +import { + // NoEventPriority, + ContinuousEventPriority, + DiscreteEventPriority, + DefaultEventPriority, +} from 'react-reconciler/constants.js' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import * as OGL from 'ogl' import * as React from 'react' @@ -8,6 +12,120 @@ import { toPascalCase, applyProps, attach, detach, classExtends, prepare } from import { RESERVED_PROPS } from './constants' import { Act, Catalogue, ConstructorRepresentation, Instance, OGLElements, RootStore } from './types' +// @ts-ignore +const __DEV__ = /* @__PURE__ */ (() => typeof process !== 'undefined' && process.env.NODE_ENV !== 'production')() + +// TODO: upstream to DefinitelyTyped for React 19 +// https://github.com/facebook/react/issues/28956 +type EventPriority = number + +function createReconciler< + Type, + Props, + Container, + Instance, + TextInstance, + SuspenseInstance, + HydratableInstance, + FormInstance, + PublicInstance, + HostContext, + ChildSet, + TimeoutHandle, + NoTimeout, + TransitionStatus, +>( + config: Omit< + Reconciler.HostConfig< + Type, + Props, + Container, + Instance, + TextInstance, + SuspenseInstance, + HydratableInstance, + PublicInstance, + HostContext, + null, // updatePayload + ChildSet, + TimeoutHandle, + NoTimeout + >, + 'getCurrentEventPriority' | 'prepareUpdate' | 'commitUpdate' + > & { + /** + * This method should mutate the `instance` and perform prop diffing if needed. + * + * The `internalHandle` data structure is meant to be opaque. If you bend the rules and rely on its internal fields, be aware that it may change significantly between versions. You're taking on additional maintenance risk by reading from it, and giving up all guarantees if you write something to it. + */ + commitUpdate?( + instance: Instance, + type: Type, + prevProps: Props, + nextProps: Props, + internalHandle: Reconciler.OpaqueHandle, + ): void + + // Undocumented + // https://github.com/facebook/react/pull/26722 + NotPendingTransition: TransitionStatus | null + HostTransitionContext: React.Context + // https://github.com/facebook/react/pull/28751 + setCurrentUpdatePriority(newPriority: EventPriority): void + getCurrentUpdatePriority(): EventPriority + resolveUpdatePriority(): EventPriority + // https://github.com/facebook/react/pull/28804 + resetFormInstance(form: FormInstance): void + // https://github.com/facebook/react/pull/25105 + requestPostPaintCallback(callback: (time: number) => void): void + // https://github.com/facebook/react/pull/26025 + shouldAttemptEagerTransition(): boolean + // https://github.com/facebook/react/pull/31528 + trackSchedulerEvent(): void + // https://github.com/facebook/react/pull/31008 + resolveEventType(): null | string + resolveEventTimeStamp(): number + + /** + * This method is called during render to determine if the Host Component type and props require some kind of loading process to complete before committing an update. + */ + maySuspendCommit(type: Type, props: Props): boolean + /** + * This method may be called during render if the Host Component type and props might suspend a commit. It can be used to initiate any work that might shorten the duration of a suspended commit. + */ + preloadInstance(type: Type, props: Props): boolean + /** + * This method is called just before the commit phase. Use it to set up any necessary state while any Host Components that might suspend this commit are evaluated to determine if the commit must be suspended. + */ + startSuspendingCommit(): void + /** + * This method is called after `startSuspendingCommit` for each Host Component that indicated it might suspend a commit. + */ + suspendInstance(type: Type, props: Props): void + /** + * This method is called after all `suspendInstance` calls are complete. + * + * Return `null` if the commit can happen immediately. + * + * Return `(initiateCommit: Function) => Function` if the commit must be suspended. The argument to this callback will initiate the commit when called. The return value is a cancellation function that the Reconciler can use to abort the commit. + * + */ + waitForCommitToBeReady(): ((initiateCommit: Function) => Function) | null + }, +): Reconciler.Reconciler { + const reconciler = Reconciler(config as any) + + reconciler.injectIntoDevTools({ + bundleType: __DEV__ ? 1 : 0, + rendererPackageName: 'react-ogl', + version: React.version, + }) + + return reconciler as any +} + +const NoEventPriority = 0 + // Custom objects that extend the OGL namespace const catalogue = { ...OGL } as unknown as Catalogue @@ -292,33 +410,21 @@ let currentUpdatePriority: number = NoEventPriority /** * Centralizes and handles mutations through an OGL scene-graph. */ -export const reconciler = Reconciler< - // Instance type - keyof OGLElements, - // Instance props - Instance['props'], - // Root Store - RootStore, - // Normal instance - Instance, - // Text instance - never, - // Suspense instance - Instance, - // Hydratable instance - never, - // Public (ref) instance - Instance['object'], - // Host context - {}, - // applyProps diff sets - null | [true] | [false, Instance['props']], - // Hydration child set - never, - // Timeout id handle - typeof setTimeout | undefined, - // NoTimeout - -1 +export const reconciler = /* @__PURE__ */ createReconciler< + keyof OGLElements, // type + Instance['props'], // props + RootStore, // container + Instance, // instance + never, // text instance + Instance, // suspense instance + never, // hydratable instance + never, // form instance + Instance['object'], // public instance + {}, // host context + never, // child set + typeof setTimeout | undefined, // timeout handle + -1, // no timeout + null // transition status >({ // Configure renderer for tree-like mutation and interop w/react-dom isPrimaryRenderer: false, @@ -446,52 +552,57 @@ export const reconciler = Reconciler< // Configures a callback once the tree is finalized after commit-effects are fired finalizeInitialChildren: () => false, commitMount() {}, - beforeActiveInstanceBlur: () => {}, - afterActiveInstanceBlur: () => {}, - detachDeletedInstance: () => {}, + // Undocumented + getInstanceFromNode: () => null, + beforeActiveInstanceBlur() {}, + afterActiveInstanceBlur() {}, + detachDeletedInstance() {}, prepareScopeUpdate() {}, getInstanceFromScope: () => null, - // @ts-ignore untyped react-experimental options inspired by react-art - // TODO: add shell types for these and upstream to DefinitelyTyped - // https://github.com/facebook/react/blob/main/packages/react-art/src/ReactFiberConfigART.js - setCurrentUpdatePriority(newPriority) { + shouldAttemptEagerTransition: () => false, + trackSchedulerEvent: () => {}, + resolveEventType: () => null, + resolveEventTimeStamp: () => -1.1, + requestPostPaintCallback() {}, + maySuspendCommit: () => false, + preloadInstance: () => true, // true indicates already loaded + startSuspendingCommit() {}, + suspendInstance() {}, + waitForCommitToBeReady: () => null, + NotPendingTransition: null, + HostTransitionContext: /* @__PURE__ */ React.createContext(null), + setCurrentUpdatePriority(newPriority: number) { currentUpdatePriority = newPriority }, getCurrentUpdatePriority() { return currentUpdatePriority }, resolveUpdatePriority() { - return currentUpdatePriority || DefaultEventPriority - }, - shouldAttemptEagerTransition() { - return false - }, - requestPostPaintCallback() {}, - maySuspendCommit() { - return false - }, - preloadInstance() { - return true // true indicates already loaded - }, - startSuspendingCommit() {}, - suspendInstance() {}, - waitForCommitToBeReady() { - return null + if (currentUpdatePriority !== NoEventPriority) return currentUpdatePriority + + switch (typeof window !== 'undefined' && window.event?.type) { + case 'click': + case 'contextmenu': + case 'dblclick': + case 'pointercancel': + case 'pointerdown': + case 'pointerup': + return DiscreteEventPriority + case 'pointermove': + case 'pointerout': + case 'pointerover': + case 'pointerenter': + case 'pointerleave': + case 'wheel': + return ContinuousEventPriority + default: + return DefaultEventPriority + } }, - NotPendingTransition: null, resetFormInstance() {}, }) /** * Safely flush async effects when testing, simulating a legacy root. */ -export const act: Act = (React as any).act - -// Inject renderer meta into devtools -const isProd = typeof process === 'undefined' || process.env?.['NODE_ENV'] === 'production' -reconciler.injectIntoDevTools({ - findFiberByHostInstance: () => null, - bundleType: isProd ? 0 : 1, - version: React.version, - rendererPackageName: 'react-ogl', -}) +export const act: Act = React.act diff --git a/src/renderer.tsx b/src/renderer.tsx index aac65eb..e1a045d 100644 --- a/src/renderer.tsx +++ b/src/renderer.tsx @@ -81,7 +81,7 @@ export function render( priority: 0, subscribed: [], // Subscribe/unsubscribe elements to the render loop - subscribe(refCallback: React.MutableRefObject, renderPriority = 0) { + subscribe(refCallback: React.RefObject, renderPriority = 0) { // Subscribe callback const { subscribed } = get() subscribed.push(refCallback) @@ -89,7 +89,7 @@ export function render( // Enable manual rendering if renderPriority is positive set((state) => ({ priority: state.priority + renderPriority })) }, - unsubscribe(refCallback: React.MutableRefObject, renderPriority = 0) { + unsubscribe(refCallback: React.RefObject, renderPriority = 0) { // Unsubscribe callback const { subscribed } = get() const index = subscribed.indexOf(refCallback) @@ -156,15 +156,17 @@ export function render( const logRecoverableError = typeof reportError === 'function' ? reportError : console.error // Create root container - const container = reconciler.createContainer( - store, - ConcurrentRoot, - null, - false, - null, - '', - logRecoverableError, - null, + const container = (reconciler as any).createContainer( + store, // containerInfo + ConcurrentRoot, // tag + null, // hydrationCallbacks + false, // isStrictMode + null, // concurrentUpdatesByDefaultOverride + '', // identifierPrefix + logRecoverableError, // onUncaughtError + logRecoverableError, // onCaughtError + logRecoverableError, // onRecoverableError + null, // transitionCallbacks ) // Set root @@ -224,7 +226,7 @@ interface PortalRootProps { target: OGL.Transform state?: Partial } -function PortalRoot({ children, target, state }: PortalRootProps): JSX.Element { +function PortalRoot({ children, target, state }: PortalRootProps): React.JSX.Element { const store = useStore() const container = React.useMemo( () => @@ -243,6 +245,7 @@ function PortalRoot({ children, target, state }: PortalRootProps): JSX.Element { }, [container, store, state]) return ( + // @ts-expect-error <> {reconciler.createPortal( {children}, @@ -261,7 +264,7 @@ export function createPortal( children: React.ReactElement, target: OGL.Transform, state?: Partial, -): JSX.Element { +): React.JSX.Element { return ( {children} diff --git a/src/types.ts b/src/types.ts index 0d544c2..edf00ad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,8 @@ /// import type * as OGL from 'ogl' import type * as React from 'react' +import type {} from 'react/jsx-runtime' +import type {} from 'react/jsx-dev-runtime' import type { UseBoundStore, StoreApi } from 'zustand' type Mutable

= { [K in keyof P]: P[K] | Readonly } @@ -68,9 +70,9 @@ export interface RootState { scene: OGL.Transform camera: OGL.Camera priority: number - subscribed: React.MutableRefObject[] - subscribe: (refCallback: React.MutableRefObject, renderPriority?: number) => void - unsubscribe: (refCallback: React.MutableRefObject, renderPriority?: number) => void + subscribed: React.RefObject[] + subscribe: (refCallback: React.RefObject, renderPriority?: number) => void + unsubscribe: (refCallback: React.RefObject, renderPriority?: number) => void events?: EventManager mouse?: OGL.Vec2 raycaster?: OGL.Raycast @@ -186,13 +188,19 @@ export interface OGLElements extends OGLElementsImpl { } } -declare global { +declare module 'react' { namespace JSX { interface IntrinsicElements extends OGLElements {} } } -declare module 'react' { +declare module 'react/jsx-runtime' { + namespace JSX { + interface IntrinsicElements extends OGLElements {} + } +} + +declare module 'react/jsx-dev-runtime' { namespace JSX { interface IntrinsicElements extends OGLElements {} } diff --git a/src/utils.ts b/src/utils.ts index 86a5d0b..237fcb4 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -122,11 +122,9 @@ export function detach(parent: Instance, child: Instance) { /** * Safely mutates an OGL element, respecting special JSX syntax. */ -export function applyProps( - object: Instance['object'], - newProps: Instance['props'], - oldProps?: Instance['props'], -): void { +export function applyProps(target: T, newProps: Instance['props'], oldProps?: Instance['props']): void { + const object = target as Instance['object'] + // Mutate our OGL element for (const prop in newProps) { // Don't mutate reserved keys diff --git a/tests/hooks.test.tsx b/tests/hooks.test.tsx index 19c91de..adf0dbe 100644 --- a/tests/hooks.test.tsx +++ b/tests/hooks.test.tsx @@ -42,7 +42,7 @@ describe('useFrame', () => { let state: RootState = null! let time: number = null! - const subscribe = (callback: React.MutableRefObject) => { + const subscribe = (callback: React.RefObject) => { callback.current('test' as any, 1) } @@ -69,7 +69,7 @@ describe('useFrame', () => { it('should accept render priority', async () => { let priority = 0 - const subscribe = (_: React.MutableRefObject, renderPriority: number) => { + const subscribe = (_: React.RefObject, renderPriority: number) => { if (renderPriority) priority += renderPriority } @@ -93,7 +93,7 @@ describe('useFrame', () => { describe('useInstanceHandle', () => { it('should return Instance state', async () => { const ref = React.createRef() - let instance!: React.MutableRefObject + let instance!: React.RefObject const Component = () => { instance = useInstanceHandle(ref) diff --git a/vite.config.js b/vite.config.js index c3ca7ca..325abbd 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,5 +1,5 @@ -import path from 'path' -import fs from 'fs' +import * as path from 'node:path' +import * as fs from 'node:fs' import { defineConfig } from 'vite' const entry = fs.existsSync(path.resolve(process.cwd(), 'dist')) ? 'index.native' : 'index' diff --git a/yarn.lock b/yarn.lock index 0c8eb0c..8a356f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -764,10 +764,130 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== +"@esbuild/aix-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" + integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== + +"@esbuild/android-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" + integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== + +"@esbuild/android-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" + integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== + +"@esbuild/android-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" + integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== + +"@esbuild/darwin-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" + integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== + +"@esbuild/darwin-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" + integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== + +"@esbuild/freebsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" + integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== + +"@esbuild/freebsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" + integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== + +"@esbuild/linux-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" + integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== + +"@esbuild/linux-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" + integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== + +"@esbuild/linux-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" + integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== + +"@esbuild/linux-loong64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" + integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== + +"@esbuild/linux-mips64el@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" + integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== + +"@esbuild/linux-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" + integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== + +"@esbuild/linux-riscv64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" + integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== + +"@esbuild/linux-s390x@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" + integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== + +"@esbuild/linux-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== + +"@esbuild/netbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" + integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== + +"@esbuild/netbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" + integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== + +"@esbuild/openbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" + integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== + +"@esbuild/openbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" + integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + +"@esbuild/sunos-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" + integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + +"@esbuild/win32-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" + integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + +"@esbuild/win32-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" + integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + +"@esbuild/win32-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" + integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== "@eslint/eslintrc@^1.3.0": version "1.3.0" @@ -815,6 +935,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1114,6 +1246,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@react-native-community/cli-clean@^8.0.4": version "8.0.4" resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-8.0.4.tgz#97e16a20e207b95de12e29b03816e8f2b2c80cc7" @@ -1299,6 +1436,101 @@ resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== +"@rollup/rollup-android-arm-eabi@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz#42a8e897c7b656adb4edebda3a8b83a57526452f" + integrity sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg== + +"@rollup/rollup-android-arm64@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz#846a73eef25b18ff94bac1e52acab6a7c7ac22fa" + integrity sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A== + +"@rollup/rollup-darwin-arm64@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz#014ed37f1f7809fdf3442a6b689d3a074a844058" + integrity sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ== + +"@rollup/rollup-darwin-x64@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz#dde6ed3e56d0b34477fa56c4a199abe5d4b9846b" + integrity sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ== + +"@rollup/rollup-freebsd-arm64@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz#8ad634f462a6b7e338257cf64c7baff99618a08e" + integrity sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA== + +"@rollup/rollup-freebsd-x64@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz#9d4d1dbbafcb0354d52ba6515a43c7511dba8052" + integrity sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz#3bd5fcbab92a66e032faef1078915d1dbf27de7a" + integrity sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A== + +"@rollup/rollup-linux-arm-musleabihf@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz#a77838b9779931ce4fa01326b585eee130f51e60" + integrity sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ== + +"@rollup/rollup-linux-arm64-gnu@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz#ec1b1901b82d57a20184adb61c725dd8991a0bf0" + integrity sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w== + +"@rollup/rollup-linux-arm64-musl@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz#7aa23b45bf489b7204b5a542e857e134742141de" + integrity sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw== + +"@rollup/rollup-linux-loongarch64-gnu@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz#7bf0ebd8c5ad08719c3b4786be561d67f95654a7" + integrity sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz#e687dfcaf08124aafaaebecef0cc3986675cb9b6" + integrity sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ== + +"@rollup/rollup-linux-riscv64-gnu@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz#19fce2594f9ce73d1cb0748baf8cd90a7bedc237" + integrity sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw== + +"@rollup/rollup-linux-s390x-gnu@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz#fd99b335bb65c59beb7d15ae82be0aafa9883c19" + integrity sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw== + +"@rollup/rollup-linux-x64-gnu@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz#4e8c697bbaa2e2d7212bd42086746c8275721166" + integrity sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A== + +"@rollup/rollup-linux-x64-musl@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz#0d2f74bd9cfe0553f20f056760a95b293e849ab2" + integrity sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg== + +"@rollup/rollup-win32-arm64-msvc@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz#6534a09fcdd43103645155cedb5bfa65fbf2c23f" + integrity sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg== + +"@rollup/rollup-win32-ia32-msvc@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz#8222ccfecffd63a6b0ddbe417d8d959e4f2b11b3" + integrity sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw== + +"@rollup/rollup-win32-x64-msvc@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz#1a40b4792c08094b6479c48c90fe7f4b10ec2f54" + integrity sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA== + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -1524,6 +1756,11 @@ dependencies: "@babel/types" "^7.3.0" +"@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/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -1625,12 +1862,10 @@ dependencies: "@types/react" "*" -"@types/react-reconciler@^0.28.8": - version "0.28.8" - resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.8.tgz#e51710572bcccf214306833c2438575d310b3e98" - integrity sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g== - dependencies: - "@types/react" "*" +"@types/react-reconciler@^0.28.9": + version "0.28.9" + resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.9.tgz#d24b4864c384e770c83275b3fe73fba00269c83b" + integrity sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg== "@types/react@*": version "18.0.17" @@ -1889,6 +2124,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1908,6 +2148,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2210,6 +2455,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2591,6 +2843,15 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2797,6 +3058,11 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2817,6 +3083,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2901,132 +3172,36 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild@^0.14.47: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" - integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== +esbuild@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== optionalDependencies: - "@esbuild/linux-loong64" "0.14.54" - esbuild-android-64 "0.14.54" - esbuild-android-arm64 "0.14.54" - esbuild-darwin-64 "0.14.54" - esbuild-darwin-arm64 "0.14.54" - esbuild-freebsd-64 "0.14.54" - esbuild-freebsd-arm64 "0.14.54" - esbuild-linux-32 "0.14.54" - esbuild-linux-64 "0.14.54" - esbuild-linux-arm "0.14.54" - esbuild-linux-arm64 "0.14.54" - esbuild-linux-mips64le "0.14.54" - esbuild-linux-ppc64le "0.14.54" - esbuild-linux-riscv64 "0.14.54" - esbuild-linux-s390x "0.14.54" - esbuild-netbsd-64 "0.14.54" - esbuild-openbsd-64 "0.14.54" - esbuild-sunos-64 "0.14.54" - esbuild-windows-32 "0.14.54" - esbuild-windows-64 "0.14.54" - esbuild-windows-arm64 "0.14.54" + "@esbuild/aix-ppc64" "0.24.2" + "@esbuild/android-arm" "0.24.2" + "@esbuild/android-arm64" "0.24.2" + "@esbuild/android-x64" "0.24.2" + "@esbuild/darwin-arm64" "0.24.2" + "@esbuild/darwin-x64" "0.24.2" + "@esbuild/freebsd-arm64" "0.24.2" + "@esbuild/freebsd-x64" "0.24.2" + "@esbuild/linux-arm" "0.24.2" + "@esbuild/linux-arm64" "0.24.2" + "@esbuild/linux-ia32" "0.24.2" + "@esbuild/linux-loong64" "0.24.2" + "@esbuild/linux-mips64el" "0.24.2" + "@esbuild/linux-ppc64" "0.24.2" + "@esbuild/linux-riscv64" "0.24.2" + "@esbuild/linux-s390x" "0.24.2" + "@esbuild/linux-x64" "0.24.2" + "@esbuild/netbsd-arm64" "0.24.2" + "@esbuild/netbsd-x64" "0.24.2" + "@esbuild/openbsd-arm64" "0.24.2" + "@esbuild/openbsd-x64" "0.24.2" + "@esbuild/sunos-x64" "0.24.2" + "@esbuild/win32-arm64" "0.24.2" + "@esbuild/win32-ia32" "0.24.2" + "@esbuild/win32-x64" "0.24.2" escalade@^3.1.1: version "3.1.1" @@ -3491,6 +3666,14 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3540,6 +3723,11 @@ fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3628,6 +3816,18 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" +glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -4207,6 +4407,15 @@ its-fine@^1.2.5: dependencies: "@types/react-reconciler" "^0.28.0" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-changed-files@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" @@ -4941,6 +5150,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -5320,11 +5534,23 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -5355,10 +5581,10 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== nanomatch@^1.2.9: version "1.2.13" @@ -5682,6 +5908,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -5752,6 +5983,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -5762,6 +6001,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -5804,14 +6048,14 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== -postcss@^8.4.16: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== +postcss@^8.4.49: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@^1.2.1: version "1.2.1" @@ -5927,17 +6171,12 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@19.0.0-beta-4508873393-20240430: - version "19.0.0-beta-4508873393-20240430" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-4508873393-20240430.tgz#d7dc059a4ff16351cc15e71bfd6ad052c9ed2403" - integrity sha512-/j97ai1qF3c6O3XV0nVzzExPV/0U2v8M75Sq6ThXYxePCi33kAnm+xRsCDpZOZOrIjz6nurLU/FzzPZIzXVvKQ== +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: - scheduler "0.25.0-beta-4508873393-20240430" - -react-is@19.0.0-beta-4508873393-20240430: - version "19.0.0-beta-4508873393-20240430" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-4508873393-20240430.tgz#b37952b326d39ff4754a3d1d675735711d76cee8" - integrity sha512-DB++EnCyaX+He8vWuwSvOHvZQHWvFDNT4UlYfnSoG+dZAFLlZeLd2iF2I1G1vR/ahBsNJDWmyZOUXheqJRLT/w== + scheduler "^0.25.0" "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" @@ -5954,6 +6193,11 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0.tgz#d6669fd389ff022a9684f708cf6fa4962d1fea7a" + integrity sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g== + react-native-codegen@^0.69.1: version "0.69.1" resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.69.1.tgz#3632be2f24464e6fad8dd11a25d1b6f3bc2c7d0b" @@ -6008,12 +6252,12 @@ react-native@^0.69.4: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@0.31.0-beta-4508873393-20240430: - version "0.31.0-beta-4508873393-20240430" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-beta-4508873393-20240430.tgz#d2c352a4beaed4068e2054c28a96ac10df50ed77" - integrity sha512-uhCn1swgjf0QI0qUbedcvL0UROTmV4eguCAT4HfiOAsnElL7F7t1SV5p2cd0dQvVpgNZ8B4UhfGpCBsOMI4PIA== +react-reconciler@^0.31.0: + version "0.31.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0.tgz#6b7390fe8fab59210daf523d7400943973de1458" + integrity sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ== dependencies: - scheduler "0.25.0-beta-4508873393-20240430" + scheduler "^0.25.0" react-refresh@^0.14.0: version "0.14.0" @@ -6033,13 +6277,13 @@ react-shallow-renderer@16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react-test-renderer@19.0.0-beta-4508873393-20240430: - version "19.0.0-beta-4508873393-20240430" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-beta-4508873393-20240430.tgz#6771832741944c8faa91829c0bf48d4cef0c1619" - integrity sha512-iS4NQZ1/5SosvtoptNN01aLc3Kw3nj8nRJ3ivYRm8RZF9mkHy2DDjJmjZomt1W+rpIadZUTg9uXnkILEJ0Hc6g== +react-test-renderer@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0.tgz#ca6fa322c58d4bfa34635788fe242a8c3daa4c7d" + integrity sha512-oX5u9rOQlHzqrE/64CNr0HB0uWxkCQmZNSfozlYvwE71TLVgeZxVf0IjouGEr1v7r1kcDifdAJBeOhdhxsG/DA== dependencies: - react-is "19.0.0-beta-4508873393-20240430" - scheduler "0.25.0-beta-4508873393-20240430" + react-is "^19.0.0" + scheduler "^0.25.0" react-use-measure@^2.1.1: version "2.1.1" @@ -6048,10 +6292,10 @@ react-use-measure@^2.1.1: dependencies: debounce "^1.2.1" -react@19.0.0-beta-4508873393-20240430: - version "19.0.0-beta-4508873393-20240430" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-4508873393-20240430.tgz#5de568fdc19fd49978816ef543376f899035df25" - integrity sha512-//89udV7fhVq5pEzpNH7vlpmS5D4wDbPn0oif+G7vwDsuSks5yJGdqrE1uzn2CyFNL73FjV3/R3Pjyaxs+xnvg== +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== readable-stream@^3.4.0: version "3.6.0" @@ -6210,7 +6454,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -6260,6 +6504,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^5.0.0: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -6272,11 +6523,32 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" -"rollup@>=2.75.6 <2.77.0 || ~2.77.0": - version "2.77.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" - integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== +rollup@^4.23.0: + version "4.32.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.32.0.tgz#c405bf6fca494d1999d9088f7736d7f03e5cac5a" + integrity sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg== + dependencies: + "@types/estree" "1.0.6" optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.32.0" + "@rollup/rollup-android-arm64" "4.32.0" + "@rollup/rollup-darwin-arm64" "4.32.0" + "@rollup/rollup-darwin-x64" "4.32.0" + "@rollup/rollup-freebsd-arm64" "4.32.0" + "@rollup/rollup-freebsd-x64" "4.32.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.32.0" + "@rollup/rollup-linux-arm-musleabihf" "4.32.0" + "@rollup/rollup-linux-arm64-gnu" "4.32.0" + "@rollup/rollup-linux-arm64-musl" "4.32.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.32.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.32.0" + "@rollup/rollup-linux-riscv64-gnu" "4.32.0" + "@rollup/rollup-linux-s390x-gnu" "4.32.0" + "@rollup/rollup-linux-x64-gnu" "4.32.0" + "@rollup/rollup-linux-x64-musl" "4.32.0" + "@rollup/rollup-win32-arm64-msvc" "4.32.0" + "@rollup/rollup-win32-ia32-msvc" "4.32.0" + "@rollup/rollup-win32-x64-msvc" "4.32.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -6315,11 +6587,6 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@0.25.0-beta-4508873393-20240430: - version "0.25.0-beta-4508873393-20240430" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-4508873393-20240430.tgz#4044bf1d129b3724706d9a784580ac64e86d744d" - integrity sha512-gk9vDoDOjTys0DpLgFll+hYk5gLhLnTipi81Pl+XSRtWkQnqQdjxLO2RF726t0g0jQ5tvwjLfBCgsvusgB6Luw== - scheduler@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" @@ -6327,6 +6594,11 @@ scheduler@^0.21.0: 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== + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -6453,6 +6725,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -6502,10 +6779,10 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-resolve@^0.5.0: version "0.5.3" @@ -6616,7 +6893,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6625,6 +6902,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" @@ -6671,6 +6957,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -6678,12 +6971,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -6939,10 +7232,10 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typescript@^4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== uglify-es@^3.1.9: version "3.3.9" @@ -7046,11 +7339,16 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0: +use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@^1.2.2: + 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" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -7085,17 +7383,16 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30" - integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== +vite@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.11.tgz#224497e93e940b34c3357c9ebf2ec20803091ed8" + integrity sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg== dependencies: - esbuild "^0.14.47" - postcss "^8.4.16" - resolve "^1.22.1" - rollup ">=2.75.6 <2.77.0 || ~2.77.0" + esbuild "^0.24.2" + postcss "^8.4.49" + rollup "^4.23.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.3" vlq@^1.0.0: version "1.0.1" @@ -7216,6 +7513,15 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -7225,14 +7531,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -7357,8 +7663,8 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zustand@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" - integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== + version "4.5.6" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.6.tgz#6857d52af44874a79fb3408c9473f78367255c96" + integrity sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ== dependencies: - use-sync-external-store "1.2.0" + use-sync-external-store "^1.2.2" From f74acca45b08407fb7b9a7c3e47d248fb5756dbe Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 Jan 2025 02:08:28 -0600 Subject: [PATCH 3/4] feat: flushSync --- src/renderer.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/renderer.tsx b/src/renderer.tsx index e1a045d..7e573e6 100644 --- a/src/renderer.tsx +++ b/src/renderer.tsx @@ -271,3 +271,10 @@ export function createPortal( ) } + +/** + * Force React to flush any updates inside the provided callback synchronously and immediately. + */ +export function flushSync(fn: () => R): R { + return reconciler.flushSync(fn) +} From 91b103ee85f58303b51d3d34ee7b9e1edb84d223 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 Jan 2025 02:08:37 -0600 Subject: [PATCH 4/4] chore!: remove self act --- README.md | 4 ++-- src/reconciler.ts | 5 ----- tests/events.test.tsx | 16 ++++++++-------- tests/hooks.test.tsx | 10 +++++----- tests/index.test.tsx | 40 ++++++++++++++++++++-------------------- tests/native.test.tsx | 11 +++++------ tests/web.test.tsx | 10 +++++----- 7 files changed, 45 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 0b92514..4f8f118 100644 --- a/README.md +++ b/README.md @@ -796,13 +796,13 @@ In addition to `createRoot` (see [custom canvas](#custom-canvas)), react-ogl exp ```tsx import * as React from 'react' import * as OGL from 'ogl' -import { type Root, type RootStore, type RootState, createRoot, act } from 'react-ogl' +import { type Root, type RootStore, type RootState, createRoot } from 'react-ogl' it('tests against a react-ogl component or scene', async () => { const transform = React.createRef() const root: Root = createRoot(document.createElement('canvas')) - const store: RootStore = await act(async () => root.render()) + const store: RootStore = await React.act(async () => root.render()) const state: RootState = store.getState() expect(transform.current).toBeInstanceOf(OGL.Transform) diff --git a/src/reconciler.ts b/src/reconciler.ts index 1f23067..f95b060 100644 --- a/src/reconciler.ts +++ b/src/reconciler.ts @@ -601,8 +601,3 @@ export const reconciler = /* @__PURE__ */ createReconciler< }, resetFormInstance() {}, }) - -/** - * Safely flush async effects when testing, simulating a legacy root. - */ -export const act: Act = React.act diff --git a/tests/events.test.tsx b/tests/events.test.tsx index 6305826..7d44b1b 100644 --- a/tests/events.test.tsx +++ b/tests/events.test.tsx @@ -1,12 +1,12 @@ import * as React from 'react' import { render, fireEvent } from '@testing-library/react' -import { act, Canvas } from '../src' +import { Canvas } from '../src' it('handles all interactive meshes', async () => { const canvas = React.createRef() const handleOnClick = jest.fn() - await act(async () => { + await React.act(async () => { render( @@ -32,7 +32,7 @@ it('handles onClick', async () => { const canvas = React.createRef() const handleOnClick = jest.fn() - await act(async () => { + await React.act(async () => { render( @@ -56,7 +56,7 @@ it('handles onPointerUp', async () => { const canvas = React.createRef() const handlePointerUp = jest.fn() - await act(async () => { + await React.act(async () => { render( @@ -80,7 +80,7 @@ it('handles onPointerDown', async () => { const canvas = React.createRef() const handlePointerDown = jest.fn() - await act(async () => { + await React.act(async () => { render( @@ -104,7 +104,7 @@ it('handles onPointerMove', async () => { const canvas = React.createRef() const handlePointerMove = jest.fn() - await act(async () => { + await React.act(async () => { render( @@ -128,7 +128,7 @@ it('handles onPointerOver', async () => { const canvas = React.createRef() const handleOnPointerOver = jest.fn() - await act(async () => { + await React.act(async () => { render( @@ -152,7 +152,7 @@ it('handles onPointerOut', async () => { const canvas = React.createRef() const handlePointerOut = jest.fn() - await act(async () => { + await React.act(async () => { render( diff --git a/tests/hooks.test.tsx b/tests/hooks.test.tsx index adf0dbe..4082abf 100644 --- a/tests/hooks.test.tsx +++ b/tests/hooks.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as OGL from 'ogl' import { create } from 'zustand' import { render } from './utils' -import { act, OGLContext, useOGL, useFrame, RootState, Subscription, Instance, useInstanceHandle } from '../src' +import { OGLContext, useOGL, useFrame, RootState, Subscription, Instance, useInstanceHandle } from '../src' describe('useOGL', () => { it('should return OGL state', async () => { @@ -13,7 +13,7 @@ describe('useOGL', () => { return null } - await act(async () => { + await React.act(async () => { render( ({ test: 'test' })) as any}> @@ -54,7 +54,7 @@ describe('useFrame', () => { return null } - await act(async () => { + await React.act(async () => { render( ({ subscribe })) as any}> @@ -78,7 +78,7 @@ describe('useFrame', () => { return null } - await act(async () => { + await React.act(async () => { render( ({ subscribe })) as any}> @@ -99,7 +99,7 @@ describe('useInstanceHandle', () => { instance = useInstanceHandle(ref) return } - await act(async () => render()) + await React.act(async () => render()) expect(instance.current).toBe((ref.current as unknown as any).__ogl) }) diff --git a/tests/index.test.tsx b/tests/index.test.tsx index d169cdd..5f1a928 100644 --- a/tests/index.test.tsx +++ b/tests/index.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import * as OGL from 'ogl' import { render } from './utils' -import { OGLElement, extend, act, createPortal } from '../src' +import { OGLElement, extend, createPortal } from '../src' class CustomElement extends OGL.Transform {} @@ -13,13 +13,13 @@ declare module '../src' { describe('renderer', () => { it('should render JSX', async () => { - const state = await act(async () => render()) + const state = await React.act(async () => render()) expect(state.scene.children.length).not.toBe(0) }) it('should render extended elements', async () => { extend({ CustomElement }) - const state = await act(async () => render()) + const state = await React.act(async () => render()) expect(state.scene.children[0]).toBeInstanceOf(CustomElement) }) @@ -39,7 +39,7 @@ describe('renderer', () => { /> ) } - await act(async () => render()) + await React.act(async () => render()) expect(lifecycle).toStrictEqual([ 'render', @@ -55,7 +55,7 @@ describe('renderer', () => { it('should set pierced props', async () => { const mesh = React.createRef() - await act(async () => { + await React.act(async () => { render( @@ -68,7 +68,7 @@ describe('renderer', () => { }) it('should handle attach', async () => { - const state = await act(async () => + const state = await React.act(async () => render( <> @@ -98,7 +98,7 @@ describe('renderer', () => { let crashed = false try { - await act(async () => render()) + await React.act(async () => render()) } catch (_) { crashed = true } @@ -110,7 +110,7 @@ describe('renderer', () => { const vertex = 'vertex' const fragment = 'fragment' - const state = await act(async () => + const state = await React.act(async () => render( @@ -135,10 +135,10 @@ describe('renderer', () => { ) - await act(async () => render()) + await React.act(async () => render()) expect(mesh.current!.program.uniforms.uniform.value).toBe(false) - await act(async () => render()) + await React.act(async () => render()) expect(mesh.current!.program.uniforms.uniform.value).toBe(true) }) @@ -148,7 +148,7 @@ describe('renderer', () => { const renderer = new OGL.Renderer({ canvas: document.createElement('canvas') }) const texture = new OGL.Texture(renderer.gl) - await act(async () => { + await React.act(async () => { render( @@ -172,7 +172,7 @@ describe('renderer', () => { const position = { size: 2, data: new Float32Array([-1, -1, 3, -1, -1, 3]) } const uv = { size: 2, data: new Float32Array([0, 0, 2, 0, 0, 2]) } - await act(async () => { + await React.act(async () => { render( @@ -189,7 +189,7 @@ describe('renderer', () => { let bind = false let unbind = false - await act(async () => { + await React.act(async () => { const state = render(, { events: { connected: false, @@ -218,12 +218,12 @@ describe('renderer', () => { ) - let state = await act(async () => render()) + let state = await React.act(async () => render()) const [oldInstance] = state.scene.children as any[] expect(oldInstance).toBe(object1) - state = await act(async () => render()) + state = await React.act(async () => render()) const [newInstance] = state.scene.children as any[] expect(newInstance).toBe(object2) // Swapped to new instance @@ -235,7 +235,7 @@ describe('renderer', () => { const object = new OGL.Transform() const mesh = React.createRef() - const state = await act(async () => + const state = await React.act(async () => render( createPortal( @@ -265,16 +265,16 @@ describe('renderer', () => { ) - await act(async () => render()) + await React.act(async () => render()) expect(mesh.current!.program).toBe(program1.current) - await act(async () => render(, { frameloop: 'never' })) + await React.act(async () => render(, { frameloop: 'never' })) expect(mesh.current!.program).toBe(undefined) - await act(async () => render()) + await React.act(async () => render()) expect(mesh.current!.program).toBe(program1.current) - await act(async () => render()) + await React.act(async () => render()) expect(mesh.current!.program).toBe(program2.current) }) }) diff --git a/tests/native.test.tsx b/tests/native.test.tsx index 334949d..ce0a73c 100644 --- a/tests/native.test.tsx +++ b/tests/native.test.tsx @@ -1,14 +1,13 @@ import * as React from 'react' import { View } from 'react-native' import { create, ReactTestRenderer } from 'react-test-renderer' -import { act } from '../src' import { Canvas } from '../src/Canvas.native' // explicitly require native module describe('Canvas', () => { it('should correctly mount', async () => { let renderer: ReactTestRenderer = null! - await act(async () => { + await React.act(async () => { renderer = create( @@ -22,7 +21,7 @@ describe('Canvas', () => { it('should forward ref', async () => { const ref = React.createRef() - await act(async () => { + await React.act(async () => { create( @@ -42,7 +41,7 @@ describe('Canvas', () => { return null } - await act(async () => { + await React.act(async () => { create( @@ -58,7 +57,7 @@ describe('Canvas', () => { it('should correctly unmount', async () => { let renderer: ReactTestRenderer - await act(async () => { + await React.act(async () => { renderer = create( @@ -66,6 +65,6 @@ describe('Canvas', () => { ) }) - expect(async () => await act(async () => renderer.unmount())).not.toThrow() + expect(async () => await React.act(async () => renderer.unmount())).not.toThrow() }) }) diff --git a/tests/web.test.tsx b/tests/web.test.tsx index 9f15876..1fb6794 100644 --- a/tests/web.test.tsx +++ b/tests/web.test.tsx @@ -1,12 +1,12 @@ import * as React from 'react' import { render, RenderResult } from '@testing-library/react' -import { act, Canvas } from '../src' +import { Canvas } from '../src' describe('Canvas', () => { it('should correctly mount', async () => { let renderer: RenderResult = null! - await act(async () => { + await React.act(async () => { renderer = render( @@ -20,7 +20,7 @@ describe('Canvas', () => { it('should forward ref', async () => { const ref = React.createRef() - await act(async () => { + await React.act(async () => { render( @@ -40,7 +40,7 @@ describe('Canvas', () => { return null } - await act(async () => { + await React.act(async () => { render( @@ -56,7 +56,7 @@ describe('Canvas', () => { it('should correctly unmount', async () => { let renderer: RenderResult - await act(async () => { + await React.act(async () => { renderer = render(